Skip to content

Commit

Permalink
staging: brcm80211: added locks in wl_mac80211.c
Browse files Browse the repository at this point in the history
Increasing robustness of the code, although no problem has been reported
in the field. Several code paths were unshielded for multi thread access.
Several lock acquisitions have been added to wl_mac80211.c

Signed-off-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by:   Arend van Spriel <arend@broadcom.com>
Reviewed-by:   Brett Rudley <brudley@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Roland Vossen authored and Greg Kroah-Hartman committed Feb 23, 2011
1 parent e34870f commit 2d57aa7
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions drivers/staging/brcm80211/brcmsmac/wl_mac80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,9 @@ static int wl_ops_start(struct ieee80211_hw *hw)
*/

ieee80211_wake_queues(hw);
WL_LOCK(wl);
blocked = wl_rfkill_set_hw_state(wl);
WL_UNLOCK(wl);
if (!blocked)
wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy);

Expand Down Expand Up @@ -351,7 +353,9 @@ wl_ops_bss_info_changed(struct ieee80211_hw *hw,
val = 1;
else
val = 0;
WL_LOCK(wl);
wlc_set(wl->wlc, WLC_SET_SHORTSLOT_OVERRIDE, val);
WL_UNLOCK(wl);
}

if (changed & BSS_CHANGED_HT) {
Expand Down Expand Up @@ -380,8 +384,10 @@ wl_ops_bss_info_changed(struct ieee80211_hw *hw,
/* BSSID changed, for whatever reason (IBSS and managed mode) */
WL_NONE("%s: new BSSID: aid %d bss:%pM\n", __func__,
info->aid, info->bssid);
WL_LOCK(wl);
wlc_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET,
info->bssid);
WL_UNLOCK(wl);
}
if (changed & BSS_CHANGED_BEACON) {
/* Beacon data changed, retrieve new beacon (beaconing modes) */
Expand Down Expand Up @@ -609,6 +615,7 @@ wl_ops_ampdu_action(struct ieee80211_hw *hw,
struct scb *scb = (struct scb *)sta->drv_priv;
#endif
struct wl_info *wl = hw->priv;
int status;

ASSERT(scb->magic == SCB_MAGIC);
switch (action) {
Expand All @@ -619,7 +626,10 @@ wl_ops_ampdu_action(struct ieee80211_hw *hw,
WL_NONE("%s: action = IEEE80211_AMPDU_RX_STOP\n", __func__);
break;
case IEEE80211_AMPDU_TX_START:
if (!wlc_aggregatable(wl->wlc, tid)) {
WL_LOCK(wl);
status = wlc_aggregatable(wl->wlc, tid);
WL_UNLOCK(wl);
if (!status) {
/* WL_ERROR("START: tid %d is not agg' able, return FAILURE to stack\n", tid); */
return -1;
}
Expand Down Expand Up @@ -1215,6 +1225,7 @@ static void wl_remove(struct pci_dev *pdev)
{
struct wl_info *wl;
struct ieee80211_hw *hw;
int status;

hw = pci_get_drvdata(pdev);
wl = HW_TO_WL(hw);
Expand All @@ -1223,7 +1234,10 @@ static void wl_remove(struct pci_dev *pdev)
return;
}

if (!wlc_chipmatch(pdev->vendor, pdev->device)) {
WL_LOCK(wl);
status = wlc_chipmatch(pdev->vendor, pdev->device);
WL_UNLOCK(wl);
if (!status) {
WL_ERROR("wl: wl_remove: wlc_chipmatch failed\n");
return;
}
Expand Down

0 comments on commit 2d57aa7

Please sign in to comment.