From 928e7a877db21a1ecc903d6394d5ffd3fd053d5e Mon Sep 17 00:00:00 2001 From: Kyle McMartin Date: Thu, 3 Feb 2011 09:31:44 -0500 Subject: [PATCH] snapshot 2.6.38-rc3-git2 and an ath5k fix from sgruszka@/nick. --- ath5k-fix-fast-channel-change.patch | 213 ++++++++++++++++++++++++++++ kernel.spec | 11 +- sources | 2 +- 3 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 ath5k-fix-fast-channel-change.patch diff --git a/ath5k-fix-fast-channel-change.patch b/ath5k-fix-fast-channel-change.patch new file mode 100644 index 000000000..cb1cbf392 --- /dev/null +++ b/ath5k-fix-fast-channel-change.patch @@ -0,0 +1,213 @@ +From sgruszka@redhat.com Thu Feb 3 07:58:52 2011 +Date: Thu, 3 Feb 2011 13:58:51 +0100 +From: Stanislaw Gruszka +To: kernel@lists.fedoraproject.org +Cc: Kyle McMartin +Subject: [PATCH F-15] ath5k: fix fast channel change +Message-ID: <20110203125134.GA4515@redhat.com> + +From: Nick Kossifidis + + Fast channel change fixes: + + a) Always set OFDM timings + b) Don't re-activate PHY + c) Enable only NF calibration, not AGC + +Resolves: +https://bugzilla.redhat.com/show_bug.cgi?id=672778 + +--- + drivers/net/wireless/ath/ath5k/phy.c | 142 +++++++++++++++++++++------------- + 1 files changed, 87 insertions(+), 55 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c +index 78c26fd..d673ab2 100644 +--- a/drivers/net/wireless/ath/ath5k/phy.c ++++ b/drivers/net/wireless/ath/ath5k/phy.c +@@ -282,6 +282,34 @@ int ath5k_hw_phy_disable(struct ath5k_hw *ah) + return 0; + } + ++/* ++ * Wait for synth to settle ++ */ ++static void ath5k_hw_wait_for_synth(struct ath5k_hw *ah, ++ struct ieee80211_channel *channel) ++{ ++ /* ++ * On 5211+ read activation -> rx delay ++ * and use it (100ns steps). ++ */ ++ if (ah->ah_version != AR5K_AR5210) { ++ u32 delay; ++ delay = ath5k_hw_reg_read(ah, AR5K_PHY_RX_DELAY) & ++ AR5K_PHY_RX_DELAY_M; ++ delay = (channel->hw_value & CHANNEL_CCK) ? ++ ((delay << 2) / 22) : (delay / 10); ++ if (ah->ah_bwmode == AR5K_BWMODE_10MHZ) ++ delay = delay << 1; ++ if (ah->ah_bwmode == AR5K_BWMODE_5MHZ) ++ delay = delay << 2; ++ /* XXX: /2 on turbo ? Let's be safe ++ * for now */ ++ udelay(100 + delay); ++ } else { ++ mdelay(1); ++ } ++} ++ + + /**********************\ + * RF Gain optimization * +@@ -3237,6 +3265,13 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, + /* Failed */ + if (i >= 100) + return -EIO; ++ ++ /* Set channel and wait for synth */ ++ ret = ath5k_hw_channel(ah, channel); ++ if (ret) ++ return ret; ++ ++ ath5k_hw_wait_for_synth(ah, channel); + } + + /* +@@ -3251,13 +3286,53 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, + if (ret) + return ret; + ++ /* Write OFDM timings on 5212*/ ++ if (ah->ah_version == AR5K_AR5212 && ++ channel->hw_value & CHANNEL_OFDM) { ++ ++ ret = ath5k_hw_write_ofdm_timings(ah, channel); ++ if (ret) ++ return ret; ++ ++ /* Spur info is available only from EEPROM versions ++ * greater than 5.3, but the EEPROM routines will use ++ * static values for older versions */ ++ if (ah->ah_mac_srev >= AR5K_SREV_AR5424) ++ ath5k_hw_set_spur_mitigation_filter(ah, ++ channel); ++ } ++ ++ /* If we used fast channel switching ++ * we are done, release RF bus and ++ * fire up NF calibration. ++ * ++ * Note: Only NF calibration due to ++ * channel change, not AGC calibration ++ * since AGC is still running ! ++ */ ++ if (fast) { ++ /* ++ * Release RF Bus grant ++ */ ++ AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_RFBUS_REQ, ++ AR5K_PHY_RFBUS_REQ_REQUEST); ++ ++ /* ++ * Start NF calibration ++ */ ++ AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL, ++ AR5K_PHY_AGCCTL_NF); ++ ++ return ret; ++ } ++ + /* + * For 5210 we do all initialization using + * initvals, so we don't have to modify + * any settings (5210 also only supports + * a/aturbo modes) + */ +- if ((ah->ah_version != AR5K_AR5210) && !fast) { ++ if (ah->ah_version != AR5K_AR5210) { + + /* + * Write initial RF gain settings +@@ -3276,22 +3351,6 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, + if (ret) + return ret; + +- /* Write OFDM timings on 5212*/ +- if (ah->ah_version == AR5K_AR5212 && +- channel->hw_value & CHANNEL_OFDM) { +- +- ret = ath5k_hw_write_ofdm_timings(ah, channel); +- if (ret) +- return ret; +- +- /* Spur info is available only from EEPROM versions +- * greater than 5.3, but the EEPROM routines will use +- * static values for older versions */ +- if (ah->ah_mac_srev >= AR5K_SREV_AR5424) +- ath5k_hw_set_spur_mitigation_filter(ah, +- channel); +- } +- + /*Enable/disable 802.11b mode on 5111 + (enable 2111 frequency converter + CCK)*/ + if (ah->ah_radio == AR5K_RF5111) { +@@ -3322,47 +3381,20 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, + */ + ath5k_hw_reg_write(ah, AR5K_PHY_ACT_ENABLE, AR5K_PHY_ACT); + ++ ath5k_hw_wait_for_synth(ah, channel); ++ + /* +- * On 5211+ read activation -> rx delay +- * and use it. ++ * Perform ADC test to see if baseband is ready ++ * Set tx hold and check adc test register + */ +- if (ah->ah_version != AR5K_AR5210) { +- u32 delay; +- delay = ath5k_hw_reg_read(ah, AR5K_PHY_RX_DELAY) & +- AR5K_PHY_RX_DELAY_M; +- delay = (channel->hw_value & CHANNEL_CCK) ? +- ((delay << 2) / 22) : (delay / 10); +- if (ah->ah_bwmode == AR5K_BWMODE_10MHZ) +- delay = delay << 1; +- if (ah->ah_bwmode == AR5K_BWMODE_5MHZ) +- delay = delay << 2; +- /* XXX: /2 on turbo ? Let's be safe +- * for now */ +- udelay(100 + delay); +- } else { +- mdelay(1); +- } +- +- if (fast) +- /* +- * Release RF Bus grant +- */ +- AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_RFBUS_REQ, +- AR5K_PHY_RFBUS_REQ_REQUEST); +- else { +- /* +- * Perform ADC test to see if baseband is ready +- * Set tx hold and check adc test register +- */ +- phy_tst1 = ath5k_hw_reg_read(ah, AR5K_PHY_TST1); +- ath5k_hw_reg_write(ah, AR5K_PHY_TST1_TXHOLD, AR5K_PHY_TST1); +- for (i = 0; i <= 20; i++) { +- if (!(ath5k_hw_reg_read(ah, AR5K_PHY_ADC_TEST) & 0x10)) +- break; +- udelay(200); +- } +- ath5k_hw_reg_write(ah, phy_tst1, AR5K_PHY_TST1); ++ phy_tst1 = ath5k_hw_reg_read(ah, AR5K_PHY_TST1); ++ ath5k_hw_reg_write(ah, AR5K_PHY_TST1_TXHOLD, AR5K_PHY_TST1); ++ for (i = 0; i <= 20; i++) { ++ if (!(ath5k_hw_reg_read(ah, AR5K_PHY_ADC_TEST) & 0x10)) ++ break; ++ udelay(200); + } ++ ath5k_hw_reg_write(ah, phy_tst1, AR5K_PHY_TST1); + + /* + * Start automatic gain control calibration diff --git a/kernel.spec b/kernel.spec index 0f2de1455..a3f702802 100644 --- a/kernel.spec +++ b/kernel.spec @@ -84,7 +84,7 @@ Summary: The Linux kernel # The rc snapshot level %define rcrev 3 # The git snapshot level -%define gitrev 1 +%define gitrev 2 # Set rpm version accordingly %define rpmversion 2.6.%{upstream_sublevel} %endif @@ -741,6 +741,8 @@ Patch12436: hfsplus-05-fix-failed-mount.patch # rhbz#607499 Patch12437: atl1c-add-missing-pci-id.patch +Patch12438: ath5k-fix-fast-channel-change.patch + %endif BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root @@ -1365,6 +1367,9 @@ ApplyPatch hfsplus-05-fix-failed-mount.patch # rhbz#607499 ApplyPatch atl1c-add-missing-pci-id.patch +# rhbz#672778 +ApplyPatch ath5k-fix-fast-channel-change.patch + # END OF PATCH APPLICATIONS %endif @@ -1977,6 +1982,10 @@ fi # ||----w | # || || %changelog +* Thu Feb 03 2011 Kyle McMartin 2.6.38-0.rc3.git2.1 +- Linux 2.6.38-rc3-git2 snapshot +- [sgruszka] ath5k: fix fast channel change (#672778) + * Wed Feb 02 2011 Kyle McMartin 2.6.38-0.rc3.git1.1 - Linux 2.6.38-rc3-git1 snapshot. diff --git a/sources b/sources index be417587b..88c295b3a 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ c8ee37b4fdccdb651e0603d35350b434 linux-2.6.37.tar.bz2 5d036903b2be555ee94078e5ef594c1d patch-2.6.38-rc3.bz2 -8e8f474b26d54ab3ce15f460e28cc8e8 patch-2.6.38-rc3-git1.bz2 +505f325319e386793740971d0fe27d2c patch-2.6.38-rc3-git2.bz2