at76c50x-usb: avoid mutex deadlock in at76_dwork_hw_scan

http://bugzilla.kernel.org/show_bug.cgi?id=13312

at76_dwork_hw_scan holds a mutex while calling ieee80211_scan_completed,
which then calls at76_config which needs the same mutex.  This reworks
the ordering to not hold the lock while calling ieee80211_scan_completed.

Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
John W. Linville 2009-05-28 11:39:02 +02:00
parent 4d3383d0ad
commit 21a4cc00e8

View File

@ -1873,18 +1873,18 @@ static void at76_dwork_hw_scan(struct work_struct *work)
if (ret != CMD_STATUS_COMPLETE) { if (ret != CMD_STATUS_COMPLETE) {
queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan, queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
SCAN_POLL_INTERVAL); SCAN_POLL_INTERVAL);
goto exit; mutex_unlock(&priv->mtx);
return;
} }
ieee80211_scan_completed(priv->hw, false);
if (is_valid_ether_addr(priv->bssid)) if (is_valid_ether_addr(priv->bssid))
at76_join(priv); at76_join(priv);
ieee80211_wake_queues(priv->hw);
exit:
mutex_unlock(&priv->mtx); mutex_unlock(&priv->mtx);
ieee80211_scan_completed(priv->hw, false);
ieee80211_wake_queues(priv->hw);
} }
static int at76_hw_scan(struct ieee80211_hw *hw, static int at76_hw_scan(struct ieee80211_hw *hw,