From: Greg Kroah-Hartman Date: Mon, 22 Apr 2013 16:23:52 +0000 (-0700) Subject: 3.8-stable patches X-Git-Tag: v3.8.9~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9b395ec346487c21f23026cd4ab4141b9fcac5c0;p=thirdparty%2Fkernel%2Fstable-queue.git 3.8-stable patches added patches: mac80211-fix-cfg80211-interaction-on-auth-assoc-request.patch ssb-implement-spurious-tone-avoidance.patch --- diff --git a/queue-3.8/mac80211-fix-cfg80211-interaction-on-auth-assoc-request.patch b/queue-3.8/mac80211-fix-cfg80211-interaction-on-auth-assoc-request.patch new file mode 100644 index 00000000000..ac16a427981 --- /dev/null +++ b/queue-3.8/mac80211-fix-cfg80211-interaction-on-auth-assoc-request.patch @@ -0,0 +1,80 @@ +From 7b119dc06d871405fc7c3e9a73a6c987409ba639 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Wed, 10 Apr 2013 21:38:36 +0200 +Subject: mac80211: fix cfg80211 interaction on auth/assoc request + +From: Johannes Berg + +commit 7b119dc06d871405fc7c3e9a73a6c987409ba639 upstream. + +If authentication (or association with FT) is requested by +userspace, mac80211 currently doesn't tell cfg80211 that it +disconnected from the AP. That leaves inconsistent state: +cfg80211 thinks it's connected while mac80211 thinks it's +not. Typically this won't last long, as soon as mac80211 +reports the new association to cfg80211 the old one goes +away. If, however, the new authentication or association +doesn't succeed, then cfg80211 will forever think the old +one still exists and will refuse attempts to authenticate +or associate with the AP it thinks it's connected to. + +Anders reported that this leads to it taking a very long +time to reconnect to a network, or never even succeeding. +I tested this with an AP hacked to never respond to auth +frames, and one that works, and with just those two the +system never recovers because one won't work and cfg80211 +thinks it's connected to the other so refuses connections +to it. + +To fix this, simply make mac80211 tell cfg80211 when it is +no longer connected to the old AP, while authenticating or +associating to a new one. + +Reported-by: Anders Kaseorg +Signed-off-by: Johannes Berg +Signed-off-by: Greg Kroah-Hartman + +--- + net/mac80211/mlme.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +--- a/net/mac80211/mlme.c ++++ b/net/mac80211/mlme.c +@@ -3723,8 +3723,16 @@ int ieee80211_mgd_auth(struct ieee80211_ + /* prep auth_data so we don't go into idle on disassoc */ + ifmgd->auth_data = auth_data; + +- if (ifmgd->associated) +- ieee80211_set_disassoc(sdata, 0, 0, false, NULL); ++ if (ifmgd->associated) { ++ u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; ++ ++ ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, ++ WLAN_REASON_UNSPECIFIED, ++ false, frame_buf); ++ ++ __cfg80211_send_deauth(sdata->dev, frame_buf, ++ sizeof(frame_buf)); ++ } + + sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); + +@@ -3783,8 +3791,16 @@ int ieee80211_mgd_assoc(struct ieee80211 + + mutex_lock(&ifmgd->mtx); + +- if (ifmgd->associated) +- ieee80211_set_disassoc(sdata, 0, 0, false, NULL); ++ if (ifmgd->associated) { ++ u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; ++ ++ ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, ++ WLAN_REASON_UNSPECIFIED, ++ false, frame_buf); ++ ++ __cfg80211_send_deauth(sdata->dev, frame_buf, ++ sizeof(frame_buf)); ++ } + + if (ifmgd->auth_data && !ifmgd->auth_data->done) { + err = -EBUSY; diff --git a/queue-3.8/series b/queue-3.8/series index a57c8882f04..09d6c0973a8 100644 --- a/queue-3.8/series +++ b/queue-3.8/series @@ -24,3 +24,5 @@ arm-7696-1-fix-kexec-by-setting-outer_cache.inv_all-for-feroceon.patch arm-7698-1-perf-fix-group-validation-when-using-enable_on_exec.patch ath9k_htc-accept-1.x-firmware-newer-than-1.3.patch ath9k_hw-change-ar9580-initvals-to-fix-a-stability-issue.patch +mac80211-fix-cfg80211-interaction-on-auth-assoc-request.patch +ssb-implement-spurious-tone-avoidance.patch diff --git a/queue-3.8/ssb-implement-spurious-tone-avoidance.patch b/queue-3.8/ssb-implement-spurious-tone-avoidance.patch new file mode 100644 index 00000000000..ea1dd4e5b13 --- /dev/null +++ b/queue-3.8/ssb-implement-spurious-tone-avoidance.patch @@ -0,0 +1,90 @@ +From 46fc4c909339f5a84d1679045297d9d2fb596987 Mon Sep 17 00:00:00 2001 +From: Rafał Miłecki +Date: Tue, 2 Apr 2013 15:57:26 +0200 +Subject: ssb: implement spurious tone avoidance + +From: Rafał Miłecki + +commit 46fc4c909339f5a84d1679045297d9d2fb596987 upstream. + +And make use of it in b43. This fixes a regression introduced with +49d55cef5b1925a5c1efb6aaddaa40fc7c693335 +b43: N-PHY: implement spurious tone avoidance +This commit made BCM4322 use only MCS 0 on channel 13, which of course +resulted in performance drop (down to 0.7Mb/s). + +Reported-by: Stefan Brüns +Signed-off-by: Rafał Miłecki +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/b43/phy_n.c | 3 ++- + drivers/ssb/driver_chipcommon_pmu.c | 29 +++++++++++++++++++++++++++++ + include/linux/ssb/ssb_driver_chipcommon.h | 2 ++ + 3 files changed, 33 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/b43/phy_n.c ++++ b/drivers/net/wireless/b43/phy_n.c +@@ -5165,7 +5165,8 @@ static void b43_nphy_pmu_spur_avoid(stru + #endif + #ifdef CONFIG_B43_SSB + case B43_BUS_SSB: +- /* FIXME */ ++ ssb_pmu_spuravoid_pllupdate(&dev->dev->sdev->bus->chipco, ++ avoid); + break; + #endif + } +--- a/drivers/ssb/driver_chipcommon_pmu.c ++++ b/drivers/ssb/driver_chipcommon_pmu.c +@@ -675,3 +675,32 @@ u32 ssb_pmu_get_controlclock(struct ssb_ + return 0; + } + } ++ ++void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid) ++{ ++ u32 pmu_ctl = 0; ++ ++ switch (cc->dev->bus->chip_id) { ++ case 0x4322: ++ ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11100070); ++ ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x1014140a); ++ ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888854); ++ if (spuravoid == 1) ++ ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05201828); ++ else ++ ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05001828); ++ pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD; ++ break; ++ case 43222: ++ /* TODO: BCM43222 requires updating PLLs too */ ++ return; ++ default: ++ ssb_printk(KERN_ERR PFX ++ "Unknown spuravoidance settings for chip 0x%04X, not changing PLL\n", ++ cc->dev->bus->chip_id); ++ return; ++ } ++ ++ chipco_set32(cc, SSB_CHIPCO_PMU_CTL, pmu_ctl); ++} ++EXPORT_SYMBOL_GPL(ssb_pmu_spuravoid_pllupdate); +--- a/include/linux/ssb/ssb_driver_chipcommon.h ++++ b/include/linux/ssb/ssb_driver_chipcommon.h +@@ -219,6 +219,7 @@ + #define SSB_CHIPCO_PMU_CTL 0x0600 /* PMU control */ + #define SSB_CHIPCO_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */ + #define SSB_CHIPCO_PMU_CTL_ILP_DIV_SHIFT 16 ++#define SSB_CHIPCO_PMU_CTL_PLL_UPD 0x00000400 + #define SSB_CHIPCO_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */ + #define SSB_CHIPCO_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */ + #define SSB_CHIPCO_PMU_CTL_ALPREQEN 0x00000080 /* ALP req enable */ +@@ -667,5 +668,6 @@ enum ssb_pmu_ldo_volt_id { + void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc, + enum ssb_pmu_ldo_volt_id id, u32 voltage); + void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); ++void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid); + + #endif /* LINUX_SSB_CHIPCO_H_ */