pull request: wireless 2012-01-18
Subsystems (4)
commit 4f3d09de38d234ce7ffba5ec5a7e6704f983d375
Dave,
Here is another small group of fixes intended for 3.3. Included is a fix from Javier Cardona to make the mesh code always use the right headroom size for mesh management frames, a fix from Johannes Berg to point a debugfs link to the right place, another fix from Johannes that properly cleans-up some state in mac80211 after a deauth request, and a fix from Stanislaw Gruszka to avoid a potential infinite loop in brcmsmac. Also included is a small Kconfig fix from me to discourage configurations with overlapping hardware support between b43 and brcmsmac.
Please let me know if there are problems!
Thanks,
John
---
The following changes since commit ccb19d263fd1c9e34948e2158c53eacbff369344:
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net (2012-01-17 22:26:41 -0800)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless.git master
Javier Cardona (1):
mac80211: Use the right headroom size for mesh mgmt frames
Johannes Berg (2):
mac80211: fix debugfs key->station symlink
mac80211: fix work removal on deauth request
John W. Linville (1):
b43: add option to avoid duplicating device support with brcmsmac
Stanislaw Gruszka (1):
brcmsmac: fix tx queue flush infinite loop
drivers/net/wireless/b43/Kconfig | 6 ++++ drivers/net/wireless/b43/main.c | 2 + drivers/net/wireless/brcm80211/brcmsmac/main.c | 10 +++++- net/mac80211/debugfs_key.c | 7 ++-- net/mac80211/mesh_hwmp.c | 8 ++-- net/mac80211/mesh_plink.c | 4 +- net/mac80211/mlme.c | 38 +++++++++++++++++------- 7 files changed, 54 insertions(+), 21 deletions(-)
drivers/net/wireless/b43/Kconfig +6 -0
@@ -31,6 +31,12 @@ config B43_BCMA depends on B43 && BCMA default y +config B43_BCMA_EXTRA + bool "Hardware support that overlaps with the brcmsmac driver" + depends on B43_BCMA + default n if BRCMSMAC || BRCMSMAC_MODULE + default y + config B43_SSB bool depends on B43 && SSB
drivers/net/wireless/b43/main.c +2 -0
@@ -116,8 +116,10 @@ MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");#ifdef CONFIG_B43_BCMA static const struct bcma_device_id b43_bcma_tbl[] = {BCMA_CORE (BCMA_MANUF_BCM ,BCMA_CORE_80211 ,0x11 ,BCMA_ANY_CLASS ), +#ifdef CONFIG_B43_BCMA_EXTRABCMA_CORE (BCMA_MANUF_BCM ,BCMA_CORE_80211 ,0x17 ,BCMA_ANY_CLASS ),BCMA_CORE (BCMA_MANUF_BCM ,BCMA_CORE_80211 ,0x18 ,BCMA_ANY_CLASS ), +#endifBCMA_CORE (BCMA_MANUF_BCM ,BCMA_CORE_80211 ,0x1D ,BCMA_ANY_CLASS ),BCMA_CORETABLE_END };
drivers/net/wireless/brcm80211/brcmsmac/main.c +9 -1
@@ -7981,13 +7981,21 @@ int brcms_c_get_curband(struct brcms_c_info *wlc)void brcms_c_wait_for_tx_completion (struct brcms_c_info *wlc,bool drop) { +int timeout =20 ; +/* flush packet queue when requested */ if (drop)brcmu_pktq_flush (&wlc->pkt_queue->q, false,NULL ,NULL );/* wait for queue and DMA fifos to run dry */ -while (!pktq_empty (&wlc->pkt_queue->q) ||brcms_txpktpendtot (wlc) >0 ) +while (!pktq_empty (&wlc->pkt_queue->q) ||brcms_txpktpendtot (wlc) >0 ) {brcms_msleep (wlc->wl,1 ); + +if (--timeout ==0 ) +break ; + } + +WARN_ON_ONCE (timeout ==0 ); }void brcms_c_set_beacon_listen_interval (struct brcms_c_info *wlc,u8 interval)
net/mac80211/debugfs_key.c +4 -3
@@ -225,9 +225,9 @@ KEY_OPS(key); key, &key_##name##_ops);void ieee80211_debugfs_key_add (struct ieee80211_key *key) - { +{static int keycount; -char buf[50 ]; +char buf[100 ];struct sta_info *sta;if (!key->local->debugfs.keys)
@@ -244,7 +244,8 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key) sta = key->sta;if (sta) { -sprintf (buf,"../../stations/%pM" , sta->sta.addr); +sprintf (buf,"../../netdev:%s/stations/%pM" , + sta->sdata->name, sta->sta.addr); key->debugfs.stalink =debugfs_create_symlink ("station" , key->debugfs.dir, buf); }
net/mac80211/mesh_hwmp.c +4 -4
@@ -119,12 +119,12 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags, int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) +sizeof (mgmt->u.action.u.mesh_action); - skb =dev_alloc_skb (local->hw.extra_tx_headroom + + skb =dev_alloc_skb (local->tx_headroom + hdr_len +2 +37 );/* max HWMP IE */ if (!skb)return -1 ; -skb_reserve (skb, local->hw.extra_tx_headroom); +skb_reserve (skb, local->tx_headroom); mgmt = (struct ieee80211_mgmt *)skb_put (skb, hdr_len);memset (mgmt,0 , hdr_len); mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
@@ -250,12 +250,12 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,if (time_before (jiffies, ifmsh->next_perr))return -EAGAIN ; - skb =dev_alloc_skb (local->hw.extra_tx_headroom + + skb =dev_alloc_skb (local->tx_headroom + hdr_len +2 +15 /* PERR IE */ );if (!skb)return -1 ; -skb_reserve (skb, local->tx_headroom + local->hw.extra_tx_headroom); +skb_reserve (skb, local->tx_headroom); mgmt = (struct ieee80211_mgmt *)skb_put (skb, hdr_len);memset (mgmt,0 , hdr_len); mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
net/mac80211/mesh_plink.c +2 -2
@@ -172,7 +172,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) +sizeof (mgmt->u.action.u.self_prot); - skb = dev_alloc_skb(local->hw.extra_tx_headroom + + skb = dev_alloc_skb(local->tx_headroom + hdr_len + 2 + /* capability info */ 2 + /* AID */
@@ -186,7 +186,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, sdata->u.mesh.ie_len);if (!skb)return -1 ; -skb_reserve (skb, local->hw.extra_tx_headroom); +skb_reserve (skb, local->tx_headroom); mgmt = (struct ieee80211_mgmt *)skb_put (skb, hdr_len);memset (mgmt,0 , hdr_len); mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
net/mac80211/mlme.c +27 -11
@@ -2750,7 +2750,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, {struct ieee80211_local *local = sdata->local;struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; -struct ieee80211_work *wk;u8 bssid[ETH_ALEN ];bool assoc_bss = false;
@@ -2763,30 +2762,47 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, assoc_bss = true; }else {bool not_auth_yet = false; +struct ieee80211_work *tmp, *wk =NULL ;mutex_unlock (&ifmgd->mtx);mutex_lock (&local->mtx); -list_for_each_entry (wk, &local->work_list, list) { -if (wk->sdata != sdata) +list_for_each_entry (tmp, &local->work_list, list) { +if (tmp->sdata != sdata)continue ; -if (wk->type !=IEEE80211_WORK_DIRECT_PROBE && - wk->type !=IEEE80211_WORK_AUTH && - wk->type !=IEEE80211_WORK_ASSOC && - wk->type !=IEEE80211_WORK_ASSOC_BEACON_WAIT ) +if (tmp->type !=IEEE80211_WORK_DIRECT_PROBE && + tmp->type !=IEEE80211_WORK_AUTH && + tmp->type !=IEEE80211_WORK_ASSOC && + tmp->type !=IEEE80211_WORK_ASSOC_BEACON_WAIT )continue ; -if (memcmp (req->bss->bssid, wk->filter_ta,ETH_ALEN )) +if (memcmp (req->bss->bssid, tmp->filter_ta,ETH_ALEN ))continue ; - not_auth_yet = wk->type ==IEEE80211_WORK_DIRECT_PROBE ; -list_del_rcu (&wk->list); -free_work (wk); + not_auth_yet = tmp->type ==IEEE80211_WORK_DIRECT_PROBE ; +list_del_rcu (&tmp->list); +synchronize_rcu (); + wk = tmp;break ; }mutex_unlock (&local->mtx); +if (wk && wk->type ==IEEE80211_WORK_ASSOC ) { +/* clean up dummy sta & TX sync */ +sta_info_destroy_addr (wk->sdata, wk->filter_ta); +if (wk->assoc.synced) +drv_finish_tx_sync (local, wk->sdata, + wk->filter_ta, +IEEE80211_TX_SYNC_ASSOC ); + }else if (wk && wk->type ==IEEE80211_WORK_AUTH ) { +if (wk->probe_auth.synced) +drv_finish_tx_sync (local, wk->sdata, + wk->filter_ta, +IEEE80211_TX_SYNC_AUTH ); + } +kfree (wk); +/* * If somebody requests authentication and we haven't * sent out an auth frame yet there's no need to send
Signature · 2 lines
John W. Linville Someday the world will need a hero, and you [email protected] might be all we have. Be ready.
David Miller
maintainerFrom: "John W. Linville" <[email protected]>
Date: Wed, 18 Jan 2012 15:12:12 -0500
Quoted 11 lines
Here is another small group of fixes intended for 3.3. Included is a fix from Javier Cardona to make the mesh code always use the right headroom size for mesh management frames, a fix from Johannes Berg to point a debugfs link to the right place, another fix from Johannes that properly cleans-up some state in mac80211 after a deauth request, and a fix from Stanislaw Gruszka to avoid a potential infinite loop in brcmsmac. Also included is a small
Kconfigfix from me to discourage configurations with overlapping hardware support between b43 and brcmsmac.Please let me know if there are problems!
Pulled, thanks John.