aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>2011-01-31 13:50:02 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-02-04 16:29:51 -0500
commit3985a46543d47a50b94e839e0a16e67d959ab092 (patch)
tree07bfa1b8a9556fabf302b837df8763d9391005d4 /drivers
parenta0fd751f0924e0eefa36592f1d358c4ab18b44c5 (diff)
zd1211rw: reset device when CR_BCN_FIFO_SEMAPHORE freezes in beacon setup
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/zd1211rw/zd_mac.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c
index a590a94cb6fa..beaa969f7426 100644
--- a/drivers/net/wireless/zd1211rw/zd_mac.c
+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -703,7 +703,7 @@ static int zd_mac_config_beacon(struct ieee80211_hw *hw, struct sk_buff *beacon)
703 dev_err(zd_mac_dev(mac), 703 dev_err(zd_mac_dev(mac),
704 "Giving up beacon config.\n"); 704 "Giving up beacon config.\n");
705 r = -ETIMEDOUT; 705 r = -ETIMEDOUT;
706 goto release_sema; 706 goto reset_device;
707 } 707 }
708 } 708 }
709 msleep(20); 709 msleep(20);
@@ -770,6 +770,17 @@ out:
770 mutex_unlock(&mac->chip.mutex); 770 mutex_unlock(&mac->chip.mutex);
771 kfree(ioreqs); 771 kfree(ioreqs);
772 return r; 772 return r;
773
774reset_device:
775 mutex_unlock(&mac->chip.mutex);
776 kfree(ioreqs);
777
778 /* semaphore stuck, reset device to avoid fw freeze later */
779 dev_warn(zd_mac_dev(mac), "CR_BCN_FIFO_SEMAPHORE stuck, "
780 "reseting device...");
781 usb_queue_reset_device(mac->chip.usb.intf);
782
783 return r;
773} 784}
774 785
775static int fill_ctrlset(struct zd_mac *mac, 786static int fill_ctrlset(struct zd_mac *mac,