The commit 'ath9k_hw: fix calibration issues on chainmask that don't
include chain 0' changed the hardware chainmask to the chip chainmask
for the duration of the calibration, but the revert to user
configuration in the reset path runs too early.
That causes some issues with limiting the number of antennas (including
spurious failure in hardware-generated packets).
Fix this by reverting the chainmask after the essential parts of the
calibration that need the workaround, and before NF calibration is run.
Signed-off-by: Felix Fietkau <[email protected]>
Reported-by: Wojciech Dubowik <[email protected]>
Tested-by: Wojciech Dubowik <[email protected]>
Cc: [email protected]
---
drivers/net/wireless/ath/ath9k/ar9003_calib.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
index 4cc1394..f76c3ca 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
@@ -1023,6 +1023,7 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
AR_PHY_AGC_CONTROL_FLTR_CAL |
AR_PHY_AGC_CONTROL_PKDET_CAL;
+ /* Use chip chainmask only for calibration */
ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
if (rtt) {
@@ -1150,6 +1151,9 @@ skip_tx_iqcal:
ar9003_hw_rtt_disable(ah);
}
+ /* Revert chainmask to runtime parameters */
+ ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
+
/* Initialize list pointers */
ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
--
1.8.0.2
On 2013-03-15 7:34 PM, Luis R. Rodriguez wrote:
> On Fri, Mar 15, 2013 at 02:53:31PM +0100, Felix Fietkau wrote:
>> The commit 'ath9k_hw: fix calibration issues on chainmask that don't
>> include chain 0' changed the hardware chainmask to the chip chainmask
>> for the duration of the calibration, but the revert to user
>> configuration in the reset path runs too early.
>>
>> That causes some issues with limiting the number of antennas (including
>> spurious failure in hardware-generated packets).
>>
>> Fix this by reverting the chainmask after the essential parts of the
>> calibration that need the workaround, and before NF calibration is run.
>>
>> Signed-off-by: Felix Fietkau <[email protected]>
>> Reported-by: Wojciech Dubowik <[email protected]>
>> Tested-by: Wojciech Dubowik <[email protected]>
>> Cc: [email protected]
>
> This applies to v3.8 as well with the following changes, do you want
> it there as well?
Yes
On Fri, Mar 15, 2013 at 02:53:31PM +0100, Felix Fietkau wrote:
> The commit 'ath9k_hw: fix calibration issues on chainmask that don't
> include chain 0' changed the hardware chainmask to the chip chainmask
> for the duration of the calibration, but the revert to user
> configuration in the reset path runs too early.
>
> That causes some issues with limiting the number of antennas (including
> spurious failure in hardware-generated packets).
>
> Fix this by reverting the chainmask after the essential parts of the
> calibration that need the workaround, and before NF calibration is run.
>
> Signed-off-by: Felix Fietkau <[email protected]>
> Reported-by: Wojciech Dubowik <[email protected]>
> Tested-by: Wojciech Dubowik <[email protected]>
> Cc: [email protected]
This applies to v3.8 as well with the following changes, do you want
it there as well?
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
index 56317b0..e99f481 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
@@ -976,6 +976,7 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
AR_PHY_CL_TAB_1,
AR_PHY_CL_TAB_2 };
+ /* Use chip chainmask only for calibration */
ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
if (rtt) {
@@ -1131,6 +1132,9 @@ skip_tx_iqcal:
ar9003_hw_rtt_disable(ah);
}
+ /* Revert chainmask to runtime parameters */
+ ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
+
/* Initialize list pointers */
ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
ah->supp_cals = IQ_MISMATCH_CAL;