diff options
author | Jason Andryuk <jandryuk@gmail.com> | 2009-02-21 02:53:29 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-02-27 14:53:01 -0500 |
commit | 1cc198fee9eb60d9dddbdcb6f32a6e36e5136769 (patch) | |
tree | 5266bcb80d8ed0f8c1668a23c00bf6f0ebff62f9 /drivers | |
parent | 5a2137ddcc4b4d0d9227db433eabaefa3c3bd924 (diff) |
at76c50x-usb: additional disconnect fixes
Additional attempts to fix Oops on disconnect, that appear to be successful.
However, some may be extraneous.
The cancel_delayed_work call is probably the most necessary. The
device_unplugged check may not be necessary. del_timer_sync may not
be necessary either, but the Oops I was receiving was related to
timers. Hence the addition.
Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
Signed-off-by: Kalle Valo <kalle.valo@iki.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/at76c50x-usb.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c index 46ac9e278035..64d4192b5d52 100644 --- a/drivers/net/wireless/at76c50x-usb.c +++ b/drivers/net/wireless/at76c50x-usb.c | |||
@@ -1497,6 +1497,9 @@ static void at76_work_set_promisc(struct work_struct *work) | |||
1497 | work_set_promisc); | 1497 | work_set_promisc); |
1498 | int ret = 0; | 1498 | int ret = 0; |
1499 | 1499 | ||
1500 | if (priv->device_unplugged) | ||
1501 | return; | ||
1502 | |||
1500 | mutex_lock(&priv->mtx); | 1503 | mutex_lock(&priv->mtx); |
1501 | 1504 | ||
1502 | priv->mib_buf.type = MIB_LOCAL; | 1505 | priv->mib_buf.type = MIB_LOCAL; |
@@ -2290,6 +2293,7 @@ static void at76_delete_device(struct at76_priv *priv) | |||
2290 | tasklet_kill(&priv->rx_tasklet); | 2293 | tasklet_kill(&priv->rx_tasklet); |
2291 | 2294 | ||
2292 | if (priv->mac80211_registered) { | 2295 | if (priv->mac80211_registered) { |
2296 | cancel_delayed_work(&priv->dwork_hw_scan); | ||
2293 | flush_workqueue(priv->hw->workqueue); | 2297 | flush_workqueue(priv->hw->workqueue); |
2294 | ieee80211_unregister_hw(priv->hw); | 2298 | ieee80211_unregister_hw(priv->hw); |
2295 | } | 2299 | } |
@@ -2307,6 +2311,8 @@ static void at76_delete_device(struct at76_priv *priv) | |||
2307 | 2311 | ||
2308 | kfree(priv->bulk_out_buffer); | 2312 | kfree(priv->bulk_out_buffer); |
2309 | 2313 | ||
2314 | del_timer_sync(&ledtrig_tx_timer); | ||
2315 | |||
2310 | if (priv->rx_skb) | 2316 | if (priv->rx_skb) |
2311 | kfree_skb(priv->rx_skb); | 2317 | kfree_skb(priv->rx_skb); |
2312 | 2318 | ||