Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 277631
b: refs/heads/master
c: 2646c46
h: refs/heads/master
i:
  277629: 1ef01de
  277627: fc07798
  277623: e3310e1
  277615: 512f684
  277599: df088e8
  277567: 214ca8e
  277503: 3d6add5
v: v3
  • Loading branch information
Roland Vossen authored and John W. Linville committed Nov 8, 2011
1 parent e143ac3 commit b209814
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 48 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c6c44893c864429a7c6a4f7942dfb3ee182b4ad1
refs/heads/master: 2646c46d56792bdb370784d1cd6e696a7b3bbf67
84 changes: 37 additions & 47 deletions trunk/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ static int brcms_ops_start(struct ieee80211_hw *hw)
{
struct brcms_info *wl = hw->priv;
bool blocked;
int err;

ieee80211_wake_queues(hw);
spin_lock_bh(&wl->lock);
Expand All @@ -292,20 +293,48 @@ static int brcms_ops_start(struct ieee80211_hw *hw)
if (!blocked)
wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy);

return 0;
spin_lock_bh(&wl->lock);
if (!wl->pub->up)
err = brcms_up(wl);
else
err = -ENODEV;
spin_unlock_bh(&wl->lock);

if (err != 0)
wiphy_err(hw->wiphy, "%s: brcms_up() returned %d\n", __func__,
err);
return err;
}

static void brcms_ops_stop(struct ieee80211_hw *hw)
{
struct brcms_info *wl = hw->priv;
int status;

ieee80211_stop_queues(hw);

if (wl->wlc == NULL)
return;

spin_lock_bh(&wl->lock);
status = brcms_c_chipmatch(wl->wlc->hw->vendorid,
wl->wlc->hw->deviceid);
spin_unlock_bh(&wl->lock);
if (!status) {
wiphy_err(wl->wiphy,
"wl: brcms_ops_stop: chipmatch failed\n");
return;
}

/* put driver in down state */
spin_lock_bh(&wl->lock);
brcms_down(wl);
spin_unlock_bh(&wl->lock);
}

static int
brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
{
struct brcms_info *wl;
int err;

/* Just STA for now */
if (vif->type != NL80211_IFTYPE_AP &&
vif->type != NL80211_IFTYPE_MESH_POINT &&
Expand All @@ -317,32 +346,12 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
return -EOPNOTSUPP;
}

wl = hw->priv;
spin_lock_bh(&wl->lock);
if (!wl->pub->up)
err = brcms_up(wl);
else
err = -ENODEV;
spin_unlock_bh(&wl->lock);

if (err != 0)
wiphy_err(hw->wiphy, "%s: brcms_up() returned %d\n", __func__,
err);

return err;
return 0;
}

static void
brcms_ops_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
{
struct brcms_info *wl;

wl = hw->priv;

/* put driver in down state */
spin_lock_bh(&wl->lock);
brcms_down(wl);
spin_unlock_bh(&wl->lock);
}

static int brcms_ops_config(struct ieee80211_hw *hw, u32 changed)
Expand Down Expand Up @@ -874,37 +883,18 @@ static void brcms_free(struct brcms_info *wl)
}

/*
* called from both kernel as from this kernel module.
* called from both kernel as from this kernel module (error flow on attach)
* precondition: perimeter lock is not acquired.
*/
static void brcms_remove(struct pci_dev *pdev)
{
struct brcms_info *wl;
struct ieee80211_hw *hw;
int status;

hw = pci_get_drvdata(pdev);
wl = hw->priv;
if (!wl) {
pr_err("wl: brcms_remove: pci_get_drvdata failed\n");
return;
}
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
struct brcms_info *wl = hw->priv;

spin_lock_bh(&wl->lock);
status = brcms_c_chipmatch(pdev->vendor, pdev->device);
spin_unlock_bh(&wl->lock);
if (!status) {
wiphy_err(wl->wiphy, "wl: brcms_remove: chipmatch "
"failed\n");
return;
}
if (wl->wlc) {
wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, false);
wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy);
ieee80211_unregister_hw(hw);
spin_lock_bh(&wl->lock);
brcms_down(wl);
spin_unlock_bh(&wl->lock);
}
pci_disable_device(pdev);

Expand Down

0 comments on commit b209814

Please sign in to comment.