When a device reboot happens when we are under probe, with init_mutex
taken, make sure we can recover. Have dev_reset_handle set boot mode
and i2400m_msg_to_dev() will see it and fail gracefully instead of
timing out.
Found and diagnosed by Cindy H. Kao.
Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
        d_fnstart(3, dev, "(i2400m %p buf %p len %zu)\n",
                  i2400m, buf, buf_len);
 
+       rmb();          /* Make sure we see what i2400m_dev_reset_handle() */
        if (i2400m->boot_mode)
                return ERR_PTR(-ENODEV);
 
 
  */
 int i2400m_dev_reset_handle(struct i2400m *i2400m)
 {
+       i2400m->boot_mode = 1;
+       wmb();          /* Make sure i2400m_msg_to_dev() sees boot_mode */
        return i2400m_schedule_work(i2400m, __i2400m_dev_reset_handle,
                                    GFP_ATOMIC);
 }
 
        d_fnstart(5, dev, "(i2400m %p bcf %p size %zu)\n",
                  i2400m, bcf, bcf_size);
        i2400m->boot_mode = 1;
+       wmb();          /* Make sure other readers see it */
 hw_reboot:
        if (count-- == 0) {
                ret = -ERESTARTSYS;
        d_printf(2, dev, "fw %s successfully uploaded\n",
                 i2400m->fw_name);
        i2400m->boot_mode = 0;
+       wmb();          /* Make sure i2400m_msg_to_dev() sees boot_mode */
 error_dnload_finalize:
 error_dnload_bcf:
 error_dnload_init: