When driver fails to acquire device semaphore lock, device usually
freezes soon afterwards. So failing to acquire lock indicates us that
not everything is going right in device/fw. So reset device when
this happens.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
                                dev_err(zd_mac_dev(mac),
                                                "Giving up beacon config.\n");
                                r = -ETIMEDOUT;
-                               goto release_sema;
+                               goto reset_device;
                        }
                }
                msleep(20);
        mutex_unlock(&mac->chip.mutex);
        kfree(ioreqs);
        return r;
+
+reset_device:
+       mutex_unlock(&mac->chip.mutex);
+       kfree(ioreqs);
+
+       /* semaphore stuck, reset device to avoid fw freeze later */
+       dev_warn(zd_mac_dev(mac), "CR_BCN_FIFO_SEMAPHORE stuck, "
+                                 "reseting device...");
+       usb_queue_reset_device(mac->chip.usb.intf);
+
+       return r;
 }
 
 static int fill_ctrlset(struct zd_mac *mac,