zd1211rw: reset device when CR_BCN_FIFO_SEMAPHORE freezes in beacon setup
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>
Mon, 31 Jan 2011 18:50:02 +0000 (20:50 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 4 Feb 2011 21:29:51 +0000 (16:29 -0500)
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>
drivers/net/wireless/zd1211rw/zd_mac.c

index a590a94cb6fa7341a518d20f6fe19ceb9255df86..beaa969f74260da3e6a67f7d2604627a2ed66ca7 100644 (file)
@@ -703,7 +703,7 @@ static int zd_mac_config_beacon(struct ieee80211_hw *hw, struct sk_buff *beacon)
                                dev_err(zd_mac_dev(mac),
                                                "Giving up beacon config.\n");
                                r = -ETIMEDOUT;
-                               goto release_sema;
+                               goto reset_device;
                        }
                }
                msleep(20);
@@ -770,6 +770,17 @@ out:
        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,