aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/hw.c
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>2011-10-13 01:30:42 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-10-14 14:48:23 -0400
commita126ff511b12bd0e7b6ca9c16ab3f6f325ba6356 (patch)
tree934315709161521ed845cc32cfd2df2d1fff6897 /drivers/net/wireless/ath/ath9k/hw.c
parent324c74ad64c7528a9cf243455723d5ed57238e15 (diff)
ath9k_hw: Do fast channel change based on reusable calibration results
Support the fast channel change across band switch only when there are available of reusable cabliration results. And also observed that doing agc control calibration on fastcc, sometimes causing calibration timeout. Hence changing agc control to be run only on full chip reset. Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/hw.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 0eb0b3bcb74e..67831a3fca6b 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1445,6 +1445,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
1445 ath9k_hw_spur_mitigate_freq(ah, chan); 1445 ath9k_hw_spur_mitigate_freq(ah, chan);
1446 1446
1447 if (edma && (band_switch || mode_diff)) { 1447 if (edma && (band_switch || mode_diff)) {
1448 ah->ah_flags |= AH_FASTCC;
1448 if (band_switch || ini_reloaded) 1449 if (band_switch || ini_reloaded)
1449 ah->eep_ops->set_board_values(ah, chan); 1450 ah->eep_ops->set_board_values(ah, chan);
1450 1451
@@ -1452,6 +1453,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
1452 1453
1453 if (band_switch || ini_reloaded) 1454 if (band_switch || ini_reloaded)
1454 ath9k_hw_init_cal(ah, chan); 1455 ath9k_hw_init_cal(ah, chan);
1456 ah->ah_flags &= ~AH_FASTCC;
1455 } 1457 }
1456 1458
1457 return true; 1459 return true;
@@ -1509,6 +1511,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1509 u32 macStaId1; 1511 u32 macStaId1;
1510 u64 tsf = 0; 1512 u64 tsf = 0;
1511 int i, r; 1513 int i, r;
1514 bool allow_fbs = false;
1512 1515
1513 if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) 1516 if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1514 return -EIO; 1517 return -EIO;
@@ -1530,12 +1533,19 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1530 if (AR_SREV_9280(ah) && common->bus_ops->ath_bus_type == ATH_PCI) 1533 if (AR_SREV_9280(ah) && common->bus_ops->ath_bus_type == ATH_PCI)
1531 bChannelChange = false; 1534 bChannelChange = false;
1532 1535
1536 if (caldata &&
1537 caldata->done_txiqcal_once &&
1538 caldata->done_txclcal_once &&
1539 caldata->rtt_hist.num_readings)
1540 allow_fbs = true;
1541
1533 if (bChannelChange && 1542 if (bChannelChange &&
1534 (ah->chip_fullsleep != true) && 1543 (ah->chip_fullsleep != true) &&
1535 (ah->curchan != NULL) && 1544 (ah->curchan != NULL) &&
1536 (chan->channel != ah->curchan->channel) && 1545 (chan->channel != ah->curchan->channel) &&
1537 ((chan->channelFlags & CHANNEL_ALL) == 1546 (allow_fbs ||
1538 (ah->curchan->channelFlags & CHANNEL_ALL))) { 1547 ((chan->channelFlags & CHANNEL_ALL) ==
1548 (ah->curchan->channelFlags & CHANNEL_ALL)))) {
1539 if (ath9k_hw_channel_change(ah, chan)) { 1549 if (ath9k_hw_channel_change(ah, chan)) {
1540 ath9k_hw_loadnf(ah, ah->curchan); 1550 ath9k_hw_loadnf(ah, ah->curchan);
1541 ath9k_hw_start_nfcal(ah, true); 1551 ath9k_hw_start_nfcal(ah, true);