From a43c59fbeeac2aea17ad7f750db331c325605322 Mon Sep 17 00:00:00 2001 From: John W. Linville Date: Jan 30 2012 15:41:26 +0000 Subject: mac80211: fix debugfs key->station symlink brcmsmac: fix tx queue flush infinite loop mac80211: Use the right headroom size for mesh mgmt frames mac80211: fix work removal on deauth request b43: add option to avoid duplicating device support with brcmsmac mac80211: update oper_channel on ibss join mac80211: set bss_conf.idle when vif is connected iwlwifi: fix PCI-E transport "inta" race --- diff --git a/b43-add-option-to-avoid-duplicating-device-support-w.patch b/b43-add-option-to-avoid-duplicating-device-support-w.patch index 63d28cd..ca820df 100644 --- a/b43-add-option-to-avoid-duplicating-device-support-w.patch +++ b/b43-add-option-to-avoid-duplicating-device-support-w.patch @@ -1,7 +1,7 @@ From 4f3d09de38d234ce7ffba5ec5a7e6704f983d375 Mon Sep 17 00:00:00 2001 From: John W. Linville Date: Wed, 11 Jan 2012 15:50:15 -0500 -Subject: [PATCH] b43: add option to avoid duplicating device support with +Subject: [PATCH 5/8] b43: add option to avoid duplicating device support with brcmsmac Signed-off-by: John W. Linville diff --git a/brcmsmac-fix-tx-queue-flush-infinite-loop.patch b/brcmsmac-fix-tx-queue-flush-infinite-loop.patch new file mode 100644 index 0000000..c5d69d4 --- /dev/null +++ b/brcmsmac-fix-tx-queue-flush-infinite-loop.patch @@ -0,0 +1,51 @@ +From f96b08a7e6f69c0f0a576554df3df5b1b519c479 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Tue, 17 Jan 2012 12:38:50 +0100 +Subject: [PATCH 2/8] brcmsmac: fix tx queue flush infinite loop + +This patch workaround live deadlock problem caused by infinite loop +in brcms_c_wait_for_tx_completion(). I do not consider the patch as +the proper fix, which should fix the real reason of tx queue flush +failure, but patch helps with system lockup. + +Reference: +https://bugzilla.kernel.org/show_bug.cgi?id=42576 + +Reported-and-tested-by: Patrick +Cc: stable@vger.kernel.org # 3.2+ +Signed-off-by: Stanislaw Gruszka +Signed-off-by: John W. Linville +--- + drivers/net/wireless/brcm80211/brcmsmac/main.c | 10 +++++++++- + 1 files changed, 9 insertions(+), 1 deletions(-) + +diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c +index f7ed340..f6affc6 100644 +--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c ++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c +@@ -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) +-- +1.7.4.4 + diff --git a/iwlwifi-fix-PCI-E-transport-inta-race.patch b/iwlwifi-fix-PCI-E-transport-inta-race.patch new file mode 100644 index 0000000..b17e5ec --- /dev/null +++ b/iwlwifi-fix-PCI-E-transport-inta-race.patch @@ -0,0 +1,51 @@ +From b49ba04a3a0382e7314d990707c21094c410425a Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Thu, 19 Jan 2012 08:20:57 -0800 +Subject: [PATCH 8/8] iwlwifi: fix PCI-E transport "inta" race + +When an interrupt comes in, we read the reason +bits and collect them into "trans_pcie->inta". +This happens with the spinlock held. However, +there's a bug resetting this variable -- that +happens after the spinlock has been released. +This means that it is possible for interrupts +to be missed if the reset happens after some +other interrupt reasons were already added to +the variable. + +I found this by code inspection, looking for a +reason that we sometimes see random commands +time out. It seems possible that this causes +such behaviour, but I can't say for sure right +now since it happens extremely infrequently on +my test systems. + +Cc: stable@vger.kernel.org [3.2] +Signed-off-by: Johannes Berg +Signed-off-by: Wey-Yi Guy +Signed-off-by: John W. Linville +--- + drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c +index 752493f..65d1f05 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c ++++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c +@@ -972,11 +972,11 @@ void iwl_irq_tasklet(struct iwl_trans *trans) + } + #endif + +- spin_unlock_irqrestore(&trans->shrd->lock, flags); +- + /* saved interrupt in inta variable now we can reset trans_pcie->inta */ + trans_pcie->inta = 0; + ++ spin_unlock_irqrestore(&trans->shrd->lock, flags); ++ + /* Now service all interrupt bits discovered above. */ + if (inta & CSR_INT_BIT_HW_ERR) { + IWL_ERR(trans, "Hardware error detected. Restarting.\n"); +-- +1.7.4.4 + diff --git a/kernel.spec b/kernel.spec index 88d4100..bd6703c 100644 --- a/kernel.spec +++ b/kernel.spec @@ -820,9 +820,15 @@ Patch50002: compat-wireless-integrated-build.patch Patch50100: compat-wireless-rtl8192cu-Fix-WARNING-on-suspend-resume.patch -# Remove overlapping hardware support between b43 and brcmsmac -Patch50101: b43-add-option-to-avoid-duplicating-device-support-w.patch - +# Pending upstream fixes +Patch50101: mac80211-fix-debugfs-key-station-symlink.patch +Patch50102: brcmsmac-fix-tx-queue-flush-infinite-loop.patch +Patch50103: mac80211-Use-the-right-headroom-size-for-mesh-mgmt-f.patch +Patch50104: mac80211-fix-work-removal-on-deauth-request.patch +Patch50105: b43-add-option-to-avoid-duplicating-device-support-w.patch +Patch50106: mac80211-update-oper_channel-on-ibss-join.patch +Patch50107: mac80211-set-bss_conf.idle-when-vif-is-connected.patch +Patch50108: iwlwifi-fix-PCI-E-transport-inta-race.patch %endif @@ -1579,10 +1585,16 @@ cd compat-wireless-%{cwversion} ApplyPatch compat-wireless-config-fixups.patch ApplyPatch compat-wireless-pr_fmt-warning-avoidance.patch ApplyPatch compat-wireless-rtl8192cu-Fix-WARNING-on-suspend-resume.patch -ApplyPatch mac80211-fix-work-removal-on-deauth-request.patch -# Remove overlapping hardware support between b43 and brcmsmac +# Pending upstream fixes +ApplyPatch mac80211-fix-debugfs-key-station-symlink.patch +ApplyPatch brcmsmac-fix-tx-queue-flush-infinite-loop.patch +ApplyPatch mac80211-Use-the-right-headroom-size-for-mesh-mgmt-f.patch +ApplyPatch mac80211-fix-work-removal-on-deauth-request.patch ApplyPatch b43-add-option-to-avoid-duplicating-device-support-w.patch +ApplyPatch mac80211-update-oper_channel-on-ibss-join.patch +ApplyPatch mac80211-set-bss_conf.idle-when-vif-is-connected.patch +ApplyPatch iwlwifi-fix-PCI-E-transport-inta-race.patch cd .. @@ -2291,6 +2303,14 @@ fi %changelog * Mon Jan 30 2012 John W. Linville - Use the eeprom_93cx6 driver from the compat-wireless package +- mac80211: fix debugfs key->station symlink +- brcmsmac: fix tx queue flush infinite loop +- mac80211: Use the right headroom size for mesh mgmt frames +- mac80211: fix work removal on deauth request +- b43: add option to avoid duplicating device support with brcmsmac +- mac80211: update oper_channel on ibss join +- mac80211: set bss_conf.idle when vif is connected +- iwlwifi: fix PCI-E transport "inta" race * Fri Jan 27 2012 John W. Linville - Include config.mk from compat-wireless build in files for installation diff --git a/mac80211-Use-the-right-headroom-size-for-mesh-mgmt-f.patch b/mac80211-Use-the-right-headroom-size-for-mesh-mgmt-f.patch new file mode 100644 index 0000000..9096eff --- /dev/null +++ b/mac80211-Use-the-right-headroom-size-for-mesh-mgmt-f.patch @@ -0,0 +1,83 @@ +From 65e8b0ccb6cf176f8eddb1b05534be46580da9dd Mon Sep 17 00:00:00 2001 +From: Javier Cardona +Date: Tue, 17 Jan 2012 18:17:46 -0800 +Subject: [PATCH 3/8] mac80211: Use the right headroom size for mesh mgmt + frames + +Use local->tx_headroom instad of local->hw.extra_tx_headroom. +local->tx_headroom is the max of hw.extra_tx_headroom required by the +driver and the headroom required by mac80211 for status reporting. On +drivers where hw.extra_tx_headroom is smaller than what mac80211 +requires (e.g. ath5k), we would not reserve sufficient buffer space to +report tx status. + +Also, don't reserve local->tx_headroom + local->hw.extra_tx_headroom. + +Reported-by: Simon Morgenthaler +Reported-by: Kai Scharwies +Signed-off-by: Javier Cardona +Signed-off-by: John W. Linville +--- + net/mac80211/mesh_hwmp.c | 8 ++++---- + net/mac80211/mesh_plink.c | 4 ++-- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c +index 73abb75..54df1b2 100644 +--- a/net/mac80211/mesh_hwmp.c ++++ b/net/mac80211/mesh_hwmp.c +@@ -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 | +diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c +index 41ef1b4..a172517 100644 +--- a/net/mac80211/mesh_plink.c ++++ b/net/mac80211/mesh_plink.c +@@ -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 | +-- +1.7.4.4 + diff --git a/mac80211-fix-debugfs-key-station-symlink.patch b/mac80211-fix-debugfs-key-station-symlink.patch new file mode 100644 index 0000000..d98f2c9 --- /dev/null +++ b/mac80211-fix-debugfs-key-station-symlink.patch @@ -0,0 +1,43 @@ +From 9446f3efc53512e5ad9e0966539021a2a41fe5a0 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Tue, 17 Jan 2012 10:32:01 +0100 +Subject: [PATCH 1/8] mac80211: fix debugfs key->station symlink + +Since stations moved into a virtual interface +subdirectory, this link has been broken. Fix it. + +Signed-off-by: Johannes Berg +Signed-off-by: John W. Linville +--- + net/mac80211/debugfs_key.c | 7 ++++--- + 1 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c +index 38e6101..59edcd9 100644 +--- a/net/mac80211/debugfs_key.c ++++ b/net/mac80211/debugfs_key.c +@@ -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); + } +-- +1.7.4.4 + diff --git a/mac80211-fix-work-removal-on-deauth-request.patch b/mac80211-fix-work-removal-on-deauth-request.patch index 60b91d3..941b518 100644 --- a/mac80211-fix-work-removal-on-deauth-request.patch +++ b/mac80211-fix-work-removal-on-deauth-request.patch @@ -1,51 +1,7 @@ -Path: news.gmane.org!not-for-mail -From: Johannes Berg -Newsgroups: gmane.linux.kernel.wireless.general -Subject: [PATCH 3.3] mac80211: fix work removal on deauth request +From bc4934bc61d0a11fd62c5187ff83645628f8be8b Mon Sep 17 00:00:00 2001 +From: Johannes Berg Date: Wed, 18 Jan 2012 14:10:25 +0100 -Lines: 107 -Approved: news@gmane.org -Message-ID: <1326892225.4778.5.camel@jlt3.sipsolutions.net> -NNTP-Posting-Host: lo.gmane.org -Mime-Version: 1.0 -Content-Type: text/plain; charset="UTF-8" -Content-Transfer-Encoding: 7bit -X-Trace: dough.gmane.org 1326892249 18013 80.91.229.12 (18 Jan 2012 13:10:49 GMT) -X-Complaints-To: usenet@dough.gmane.org -NNTP-Posting-Date: Wed, 18 Jan 2012 13:10:49 +0000 (UTC) -Cc: linux-wireless , - Pontus Fuchs -To: John Linville -Original-X-From: linux-wireless-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Wed Jan 18 14:10:44 2012 -Return-path: -Envelope-to: glkwg-linux-wireless-1dZseelyfdZg9hUCZPvPmw@public.gmane.org -Original-Received: from vger.kernel.org ([209.132.180.67]) - by lo.gmane.org with esmtp (Exim 4.69) - (envelope-from ) - id 1RnVHo-00044l-Aq - for glkwg-linux-wireless-1dZseelyfdZg9hUCZPvPmw@public.gmane.org; Wed, 18 Jan 2012 14:10:44 +0100 -Original-Received: (majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org) by vger.kernel.org via listexpand - id S1757410Ab2ARNK3 (ORCPT - ); - Wed, 18 Jan 2012 08:10:29 -0500 -Original-Received: from he.sipsolutions.net ([78.46.109.217]:45023 "EHLO - sipsolutions.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S1754365Ab2ARNK2 (ORCPT - ); - Wed, 18 Jan 2012 08:10:28 -0500 -Original-Received: by sipsolutions.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.77) - (envelope-from ) - id 1RnVHW-0004hf-Lx; Wed, 18 Jan 2012 14:10:26 +0100 -X-Mailer: Evolution 2.30.3 -Original-Sender: linux-wireless-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org -Xref: news.gmane.org gmane.linux.kernel.wireless.general:84095 -Archived-At: - -From: Johannes Berg +Subject: [PATCH 4/8] mac80211: fix work removal on deauth request When deauth is requested while an auth or assoc work item is in progress, we currently delete it @@ -69,17 +25,20 @@ in cfg80211. This fix isn't very clean, but that seems acceptable since I have patches pending to remove this code completely. -Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org -Reported-by: Pontus Fuchs -Tested-by: Pontus Fuchs -Signed-off-by: Johannes Berg +Cc: stable@vger.kernel.org +Reported-by: Pontus Fuchs +Tested-by: Pontus Fuchs +Signed-off-by: Johannes Berg +Signed-off-by: John W. Linville --- net/mac80211/mlme.c | 38 +++++++++++++++++++++++++++----------- - 1 file changed, 27 insertions(+), 11 deletions(-) + 1 files changed, 27 insertions(+), 11 deletions(-) ---- a/net/mac80211/mlme.c 2012-01-18 14:04:33.000000000 +0100 -+++ b/net/mac80211/mlme.c 2012-01-18 14:04:34.000000000 +0100 -@@ -2750,7 +2750,6 @@ int ieee80211_mgd_deauth(struct ieee8021 +diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c +index ecb4c84..295be92 100644 +--- a/net/mac80211/mlme.c ++++ b/net/mac80211/mlme.c +@@ -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; @@ -87,7 +46,7 @@ Signed-off-by: Johannes Berg +Date: Wed, 11 Jan 2012 13:11:50 +0200 +Subject: [PATCH 7/8] mac80211: set bss_conf.idle when vif is connected + +__ieee80211_recalc_idle() iterates through the vifs, +sets bss_conf.idle = true if they are disconnected, +and increases "count" if they are not (which later +gets evaluated in order to determine whether the +device is idle). + +However, the loop doesn't set bss_conf.idle = false +(along with increasing "count"), causing the device +idle state and the vif idle state to get out of sync +in some cases. + +Signed-off-by: Eliad Peller +Signed-off-by: John W. Linville +--- + net/mac80211/iface.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c +index e47768c..01a21c2 100644 +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -1314,6 +1314,7 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local) + continue; + } + /* count everything else */ ++ sdata->vif.bss_conf.idle = false; + count++; + } + +-- +1.7.4.4 + diff --git a/mac80211-update-oper_channel-on-ibss-join.patch b/mac80211-update-oper_channel-on-ibss-join.patch new file mode 100644 index 0000000..1a0d932 --- /dev/null +++ b/mac80211-update-oper_channel-on-ibss-join.patch @@ -0,0 +1,31 @@ +From ba1960257c5980f9b58057995ce3394bd8e48ca3 Mon Sep 17 00:00:00 2001 +From: Eliad Peller +Date: Tue, 10 Jan 2012 15:19:54 +0200 +Subject: [PATCH 6/8] mac80211: update oper_channel on ibss join + +Commit 13c40c5 ("mac80211: Add HT operation modes for IBSS") broke +ibss operation by mistakenly removing the local->oper_channel +update (causing ibss to start on the wrong channel). fix it. + +Signed-off-by: Eliad Peller +Acked-by: Simon Wunderlich +Signed-off-by: John W. Linville +--- + net/mac80211/ibss.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c +index b3d76b7..a464396 100644 +--- a/net/mac80211/ibss.c ++++ b/net/mac80211/ibss.c +@@ -106,6 +106,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, + + sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; + ++ local->oper_channel = chan; + channel_type = ifibss->channel_type; + if (channel_type > NL80211_CHAN_HT20 && + !cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type)) +-- +1.7.4.4 +