diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_mac.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_phy.c | 44 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 78 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mac.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.c | 46 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.h | 22 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/beacon.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.c | 21 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw-ops.h | 16 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 47 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 215 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 11 |
17 files changed, 428 insertions, 152 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c index c338efbccf40..7a332f16b79a 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c | |||
@@ -415,15 +415,6 @@ static void ar9002_hw_clr11n_aggr(struct ath_hw *ah, void *ds) | |||
415 | ads->ds_ctl1 &= (~AR_IsAggr & ~AR_MoreAggr); | 415 | ads->ds_ctl1 &= (~AR_IsAggr & ~AR_MoreAggr); |
416 | } | 416 | } |
417 | 417 | ||
418 | static void ar9002_hw_set11n_burstduration(struct ath_hw *ah, void *ds, | ||
419 | u32 burstDuration) | ||
420 | { | ||
421 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
422 | |||
423 | ads->ds_ctl2 &= ~AR_BurstDur; | ||
424 | ads->ds_ctl2 |= SM(burstDuration, AR_BurstDur); | ||
425 | } | ||
426 | |||
427 | void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, | 418 | void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, |
428 | u32 size, u32 flags) | 419 | u32 size, u32 flags) |
429 | { | 420 | { |
@@ -456,6 +447,5 @@ void ar9002_hw_attach_mac_ops(struct ath_hw *ah) | |||
456 | ops->set11n_aggr_middle = ar9002_hw_set11n_aggr_middle; | 447 | ops->set11n_aggr_middle = ar9002_hw_set11n_aggr_middle; |
457 | ops->set11n_aggr_last = ar9002_hw_set11n_aggr_last; | 448 | ops->set11n_aggr_last = ar9002_hw_set11n_aggr_last; |
458 | ops->clr11n_aggr = ar9002_hw_clr11n_aggr; | 449 | ops->clr11n_aggr = ar9002_hw_clr11n_aggr; |
459 | ops->set11n_burstduration = ar9002_hw_set11n_burstduration; | ||
460 | ops->set_clrdmask = ar9002_hw_set_clrdmask; | 450 | ops->set_clrdmask = ar9002_hw_set_clrdmask; |
461 | } | 451 | } |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_phy.c b/drivers/net/wireless/ath/ath9k/ar9002_phy.c index 7d68d61e406b..a57e963cf0dc 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c | |||
@@ -517,23 +517,7 @@ static void ar9002_hw_set_nf_limits(struct ath_hw *ah) | |||
517 | } | 517 | } |
518 | } | 518 | } |
519 | 519 | ||
520 | void ar9002_hw_attach_phy_ops(struct ath_hw *ah) | 520 | static void ar9002_hw_antdiv_comb_conf_get(struct ath_hw *ah, |
521 | { | ||
522 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
523 | |||
524 | priv_ops->set_rf_regs = NULL; | ||
525 | priv_ops->rf_alloc_ext_banks = NULL; | ||
526 | priv_ops->rf_free_ext_banks = NULL; | ||
527 | priv_ops->rf_set_freq = ar9002_hw_set_channel; | ||
528 | priv_ops->spur_mitigate_freq = ar9002_hw_spur_mitigate; | ||
529 | priv_ops->olc_init = ar9002_olc_init; | ||
530 | priv_ops->compute_pll_control = ar9002_hw_compute_pll_control; | ||
531 | priv_ops->do_getnf = ar9002_hw_do_getnf; | ||
532 | |||
533 | ar9002_hw_set_nf_limits(ah); | ||
534 | } | ||
535 | |||
536 | void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, | ||
537 | struct ath_hw_antcomb_conf *antconf) | 521 | struct ath_hw_antcomb_conf *antconf) |
538 | { | 522 | { |
539 | u32 regval; | 523 | u32 regval; |
@@ -545,10 +529,11 @@ void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, | |||
545 | AR_PHY_9285_ANT_DIV_ALT_LNACONF_S; | 529 | AR_PHY_9285_ANT_DIV_ALT_LNACONF_S; |
546 | antconf->fast_div_bias = (regval & AR_PHY_9285_FAST_DIV_BIAS) >> | 530 | antconf->fast_div_bias = (regval & AR_PHY_9285_FAST_DIV_BIAS) >> |
547 | AR_PHY_9285_FAST_DIV_BIAS_S; | 531 | AR_PHY_9285_FAST_DIV_BIAS_S; |
532 | antconf->lna1_lna2_delta = -3; | ||
533 | antconf->div_group = 0; | ||
548 | } | 534 | } |
549 | EXPORT_SYMBOL(ath9k_hw_antdiv_comb_conf_get); | ||
550 | 535 | ||
551 | void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah, | 536 | static void ar9002_hw_antdiv_comb_conf_set(struct ath_hw *ah, |
552 | struct ath_hw_antcomb_conf *antconf) | 537 | struct ath_hw_antcomb_conf *antconf) |
553 | { | 538 | { |
554 | u32 regval; | 539 | u32 regval; |
@@ -566,4 +551,23 @@ void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah, | |||
566 | 551 | ||
567 | REG_WRITE(ah, AR_PHY_MULTICHAIN_GAIN_CTL, regval); | 552 | REG_WRITE(ah, AR_PHY_MULTICHAIN_GAIN_CTL, regval); |
568 | } | 553 | } |
569 | EXPORT_SYMBOL(ath9k_hw_antdiv_comb_conf_set); | 554 | |
555 | void ar9002_hw_attach_phy_ops(struct ath_hw *ah) | ||
556 | { | ||
557 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
558 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
559 | |||
560 | priv_ops->set_rf_regs = NULL; | ||
561 | priv_ops->rf_alloc_ext_banks = NULL; | ||
562 | priv_ops->rf_free_ext_banks = NULL; | ||
563 | priv_ops->rf_set_freq = ar9002_hw_set_channel; | ||
564 | priv_ops->spur_mitigate_freq = ar9002_hw_spur_mitigate; | ||
565 | priv_ops->olc_init = ar9002_olc_init; | ||
566 | priv_ops->compute_pll_control = ar9002_hw_compute_pll_control; | ||
567 | priv_ops->do_getnf = ar9002_hw_do_getnf; | ||
568 | |||
569 | ops->antdiv_comb_conf_get = ar9002_hw_antdiv_comb_conf_get; | ||
570 | ops->antdiv_comb_conf_set = ar9002_hw_antdiv_comb_conf_set; | ||
571 | |||
572 | ar9002_hw_set_nf_limits(ah); | ||
573 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c index fb892e5d141a..1e220354e4be 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | |||
@@ -652,7 +652,7 @@ static const struct ar9300_eeprom ar9300_x113 = { | |||
652 | .regDmn = { LE16(0), LE16(0x1f) }, | 652 | .regDmn = { LE16(0), LE16(0x1f) }, |
653 | .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */ | 653 | .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */ |
654 | .opCapFlags = { | 654 | .opCapFlags = { |
655 | .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A, | 655 | .opFlags = AR5416_OPFLAGS_11A, |
656 | .eepMisc = 0, | 656 | .eepMisc = 0, |
657 | }, | 657 | }, |
658 | .rfSilent = 0, | 658 | .rfSilent = 0, |
@@ -922,7 +922,7 @@ static const struct ar9300_eeprom ar9300_x113 = { | |||
922 | .db_stage2 = {3, 3, 3}, /* 3 chain */ | 922 | .db_stage2 = {3, 3, 3}, /* 3 chain */ |
923 | .db_stage3 = {3, 3, 3}, /* doesn't exist for 2G */ | 923 | .db_stage3 = {3, 3, 3}, /* doesn't exist for 2G */ |
924 | .db_stage4 = {3, 3, 3}, /* don't exist for 2G */ | 924 | .db_stage4 = {3, 3, 3}, /* don't exist for 2G */ |
925 | .xpaBiasLvl = 0, | 925 | .xpaBiasLvl = 0xf, |
926 | .txFrameToDataStart = 0x0e, | 926 | .txFrameToDataStart = 0x0e, |
927 | .txFrameToPaOn = 0x0e, | 927 | .txFrameToPaOn = 0x0e, |
928 | .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */ | 928 | .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */ |
@@ -3442,17 +3442,15 @@ static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz) | |||
3442 | { | 3442 | { |
3443 | int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz); | 3443 | int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz); |
3444 | 3444 | ||
3445 | if (AR_SREV_9485(ah)) | 3445 | if (AR_SREV_9485(ah) || AR_SREV_9340(ah)) |
3446 | REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias); | 3446 | REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias); |
3447 | else { | 3447 | else { |
3448 | REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias); | 3448 | REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias); |
3449 | if (!AR_SREV_9340(ah)) { | 3449 | REG_RMW_FIELD(ah, AR_CH0_THERM, |
3450 | REG_RMW_FIELD(ah, AR_CH0_THERM, | 3450 | AR_CH0_THERM_XPABIASLVL_MSB, |
3451 | AR_CH0_THERM_XPABIASLVL_MSB, | 3451 | bias >> 2); |
3452 | bias >> 2); | 3452 | REG_RMW_FIELD(ah, AR_CH0_THERM, |
3453 | REG_RMW_FIELD(ah, AR_CH0_THERM, | 3453 | AR_CH0_THERM_XPASHORT2GND, 1); |
3454 | AR_CH0_THERM_XPASHORT2GND, 1); | ||
3455 | } | ||
3456 | } | 3454 | } |
3457 | } | 3455 | } |
3458 | 3456 | ||
@@ -3500,6 +3498,8 @@ static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, | |||
3500 | static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | 3498 | static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) |
3501 | { | 3499 | { |
3502 | int chain; | 3500 | int chain; |
3501 | u32 regval; | ||
3502 | u32 ant_div_ctl1; | ||
3503 | static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = { | 3503 | static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = { |
3504 | AR_PHY_SWITCH_CHAIN_0, | 3504 | AR_PHY_SWITCH_CHAIN_0, |
3505 | AR_PHY_SWITCH_CHAIN_1, | 3505 | AR_PHY_SWITCH_CHAIN_1, |
@@ -3525,13 +3525,49 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | |||
3525 | 3525 | ||
3526 | if (AR_SREV_9485(ah)) { | 3526 | if (AR_SREV_9485(ah)) { |
3527 | value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1); | 3527 | value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1); |
3528 | REG_RMW_FIELD(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_CTRL_ALL, | 3528 | /* |
3529 | value); | 3529 | * main_lnaconf, alt_lnaconf, main_tb, alt_tb |
3530 | REG_RMW_FIELD(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_ENABLE, | 3530 | * are the fields present |
3531 | value >> 6); | 3531 | */ |
3532 | REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, AR_FAST_DIV_ENABLE, | 3532 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); |
3533 | value >> 7); | 3533 | regval &= (~AR_ANT_DIV_CTRL_ALL); |
3534 | regval |= (value & 0x3f) << AR_ANT_DIV_CTRL_ALL_S; | ||
3535 | /* enable_lnadiv */ | ||
3536 | regval &= (~AR_PHY_9485_ANT_DIV_LNADIV); | ||
3537 | regval |= ((value >> 6) & 0x1) << | ||
3538 | AR_PHY_9485_ANT_DIV_LNADIV_S; | ||
3539 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | ||
3540 | |||
3541 | /*enable fast_div */ | ||
3542 | regval = REG_READ(ah, AR_PHY_CCK_DETECT); | ||
3543 | regval &= (~AR_FAST_DIV_ENABLE); | ||
3544 | regval |= ((value >> 7) & 0x1) << | ||
3545 | AR_FAST_DIV_ENABLE_S; | ||
3546 | REG_WRITE(ah, AR_PHY_CCK_DETECT, regval); | ||
3547 | ant_div_ctl1 = | ||
3548 | ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); | ||
3549 | /* check whether antenna diversity is enabled */ | ||
3550 | if ((ant_div_ctl1 >> 0x6) == 0x3) { | ||
3551 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); | ||
3552 | /* | ||
3553 | * clear bits 25-30 main_lnaconf, alt_lnaconf, | ||
3554 | * main_tb, alt_tb | ||
3555 | */ | ||
3556 | regval &= (~(AR_PHY_9485_ANT_DIV_MAIN_LNACONF | | ||
3557 | AR_PHY_9485_ANT_DIV_ALT_LNACONF | | ||
3558 | AR_PHY_9485_ANT_DIV_ALT_GAINTB | | ||
3559 | AR_PHY_9485_ANT_DIV_MAIN_GAINTB)); | ||
3560 | /* by default use LNA1 for the main antenna */ | ||
3561 | regval |= (AR_PHY_9485_ANT_DIV_LNA1 << | ||
3562 | AR_PHY_9485_ANT_DIV_MAIN_LNACONF_S); | ||
3563 | regval |= (AR_PHY_9485_ANT_DIV_LNA2 << | ||
3564 | AR_PHY_9485_ANT_DIV_ALT_LNACONF_S); | ||
3565 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | ||
3566 | } | ||
3567 | |||
3568 | |||
3534 | } | 3569 | } |
3570 | |||
3535 | } | 3571 | } |
3536 | 3572 | ||
3537 | static void ar9003_hw_drive_strength_apply(struct ath_hw *ah) | 3573 | static void ar9003_hw_drive_strength_apply(struct ath_hw *ah) |
@@ -4005,6 +4041,16 @@ static int ar9003_hw_tx_power_regwrite(struct ath_hw *ah, u8 * pPwrArray) | |||
4005 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0) | 4041 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0) |
4006 | ); | 4042 | ); |
4007 | 4043 | ||
4044 | /* Write the power for duplicated frames - HT40 */ | ||
4045 | |||
4046 | /* dup40_cck (LSB), dup40_ofdm, ext20_cck, ext20_ofdm (MSB) */ | ||
4047 | REG_WRITE(ah, 0xa3e0, | ||
4048 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) | | ||
4049 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) | | ||
4050 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 8) | | ||
4051 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0) | ||
4052 | ); | ||
4053 | |||
4008 | /* Write the HT20 power per rate set */ | 4054 | /* Write the HT20 power per rate set */ |
4009 | 4055 | ||
4010 | /* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */ | 4056 | /* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */ |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index c1264d60c499..be6adec33ddb 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | |||
@@ -484,16 +484,6 @@ static void ar9003_hw_clr11n_aggr(struct ath_hw *ah, void *ds) | |||
484 | ads->ctl12 &= (~AR_IsAggr & ~AR_MoreAggr); | 484 | ads->ctl12 &= (~AR_IsAggr & ~AR_MoreAggr); |
485 | } | 485 | } |
486 | 486 | ||
487 | static void ar9003_hw_set11n_burstduration(struct ath_hw *ah, void *ds, | ||
488 | u32 burstDuration) | ||
489 | { | ||
490 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
491 | |||
492 | ads->ctl13 &= ~AR_BurstDur; | ||
493 | ads->ctl13 |= SM(burstDuration, AR_BurstDur); | ||
494 | |||
495 | } | ||
496 | |||
497 | void ar9003_hw_set_paprd_txdesc(struct ath_hw *ah, void *ds, u8 chains) | 487 | void ar9003_hw_set_paprd_txdesc(struct ath_hw *ah, void *ds, u8 chains) |
498 | { | 488 | { |
499 | struct ar9003_txc *ads = ds; | 489 | struct ar9003_txc *ads = ds; |
@@ -518,7 +508,6 @@ void ar9003_hw_attach_mac_ops(struct ath_hw *hw) | |||
518 | ops->set11n_aggr_middle = ar9003_hw_set11n_aggr_middle; | 508 | ops->set11n_aggr_middle = ar9003_hw_set11n_aggr_middle; |
519 | ops->set11n_aggr_last = ar9003_hw_set11n_aggr_last; | 509 | ops->set11n_aggr_last = ar9003_hw_set11n_aggr_last; |
520 | ops->clr11n_aggr = ar9003_hw_clr11n_aggr; | 510 | ops->clr11n_aggr = ar9003_hw_clr11n_aggr; |
521 | ops->set11n_burstduration = ar9003_hw_set11n_burstduration; | ||
522 | ops->set_clrdmask = ar9003_hw_set_clrdmask; | 511 | ops->set_clrdmask = ar9003_hw_set_clrdmask; |
523 | } | 512 | } |
524 | 513 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index c83be2dd5718..25f3c2fdf2bc 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
@@ -1184,9 +1184,52 @@ static void ar9003_hw_set_radar_conf(struct ath_hw *ah) | |||
1184 | conf->radar_inband = 8; | 1184 | conf->radar_inband = 8; |
1185 | } | 1185 | } |
1186 | 1186 | ||
1187 | static void ar9003_hw_antdiv_comb_conf_get(struct ath_hw *ah, | ||
1188 | struct ath_hw_antcomb_conf *antconf) | ||
1189 | { | ||
1190 | u32 regval; | ||
1191 | |||
1192 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); | ||
1193 | antconf->main_lna_conf = (regval & AR_PHY_9485_ANT_DIV_MAIN_LNACONF) >> | ||
1194 | AR_PHY_9485_ANT_DIV_MAIN_LNACONF_S; | ||
1195 | antconf->alt_lna_conf = (regval & AR_PHY_9485_ANT_DIV_ALT_LNACONF) >> | ||
1196 | AR_PHY_9485_ANT_DIV_ALT_LNACONF_S; | ||
1197 | antconf->fast_div_bias = (regval & AR_PHY_9485_ANT_FAST_DIV_BIAS) >> | ||
1198 | AR_PHY_9485_ANT_FAST_DIV_BIAS_S; | ||
1199 | antconf->lna1_lna2_delta = -9; | ||
1200 | antconf->div_group = 2; | ||
1201 | } | ||
1202 | |||
1203 | static void ar9003_hw_antdiv_comb_conf_set(struct ath_hw *ah, | ||
1204 | struct ath_hw_antcomb_conf *antconf) | ||
1205 | { | ||
1206 | u32 regval; | ||
1207 | |||
1208 | regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); | ||
1209 | regval &= ~(AR_PHY_9485_ANT_DIV_MAIN_LNACONF | | ||
1210 | AR_PHY_9485_ANT_DIV_ALT_LNACONF | | ||
1211 | AR_PHY_9485_ANT_FAST_DIV_BIAS | | ||
1212 | AR_PHY_9485_ANT_DIV_MAIN_GAINTB | | ||
1213 | AR_PHY_9485_ANT_DIV_ALT_GAINTB); | ||
1214 | regval |= ((antconf->main_lna_conf << | ||
1215 | AR_PHY_9485_ANT_DIV_MAIN_LNACONF_S) | ||
1216 | & AR_PHY_9485_ANT_DIV_MAIN_LNACONF); | ||
1217 | regval |= ((antconf->alt_lna_conf << AR_PHY_9485_ANT_DIV_ALT_LNACONF_S) | ||
1218 | & AR_PHY_9485_ANT_DIV_ALT_LNACONF); | ||
1219 | regval |= ((antconf->fast_div_bias << AR_PHY_9485_ANT_FAST_DIV_BIAS_S) | ||
1220 | & AR_PHY_9485_ANT_FAST_DIV_BIAS); | ||
1221 | regval |= ((antconf->main_gaintb << AR_PHY_9485_ANT_DIV_MAIN_GAINTB_S) | ||
1222 | & AR_PHY_9485_ANT_DIV_MAIN_GAINTB); | ||
1223 | regval |= ((antconf->alt_gaintb << AR_PHY_9485_ANT_DIV_ALT_GAINTB_S) | ||
1224 | & AR_PHY_9485_ANT_DIV_ALT_GAINTB); | ||
1225 | |||
1226 | REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); | ||
1227 | } | ||
1228 | |||
1187 | void ar9003_hw_attach_phy_ops(struct ath_hw *ah) | 1229 | void ar9003_hw_attach_phy_ops(struct ath_hw *ah) |
1188 | { | 1230 | { |
1189 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | 1231 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); |
1232 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
1190 | static const u32 ar9300_cca_regs[6] = { | 1233 | static const u32 ar9300_cca_regs[6] = { |
1191 | AR_PHY_CCA_0, | 1234 | AR_PHY_CCA_0, |
1192 | AR_PHY_CCA_1, | 1235 | AR_PHY_CCA_1, |
@@ -1213,6 +1256,9 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) | |||
1213 | priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; | 1256 | priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; |
1214 | priv_ops->set_radar_params = ar9003_hw_set_radar_params; | 1257 | priv_ops->set_radar_params = ar9003_hw_set_radar_params; |
1215 | 1258 | ||
1259 | ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get; | ||
1260 | ops->antdiv_comb_conf_set = ar9003_hw_antdiv_comb_conf_set; | ||
1261 | |||
1216 | ar9003_hw_set_nf_limits(ah); | 1262 | ar9003_hw_set_nf_limits(ah); |
1217 | ar9003_hw_set_radar_conf(ah); | 1263 | ar9003_hw_set_radar_conf(ah); |
1218 | memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs)); | 1264 | memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs)); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h index 2a0d5cbb7e76..c7505b48e5c0 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | |||
@@ -261,12 +261,34 @@ | |||
261 | #define AR_PHY_EXT_CCA0 (AR_AGC_BASE + 0x20) | 261 | #define AR_PHY_EXT_CCA0 (AR_AGC_BASE + 0x20) |
262 | #define AR_PHY_RESTART (AR_AGC_BASE + 0x24) | 262 | #define AR_PHY_RESTART (AR_AGC_BASE + 0x24) |
263 | 263 | ||
264 | /* | ||
265 | * Antenna Diversity settings | ||
266 | */ | ||
264 | #define AR_PHY_MC_GAIN_CTRL (AR_AGC_BASE + 0x28) | 267 | #define AR_PHY_MC_GAIN_CTRL (AR_AGC_BASE + 0x28) |
265 | #define AR_ANT_DIV_CTRL_ALL 0x7e000000 | 268 | #define AR_ANT_DIV_CTRL_ALL 0x7e000000 |
266 | #define AR_ANT_DIV_CTRL_ALL_S 25 | 269 | #define AR_ANT_DIV_CTRL_ALL_S 25 |
267 | #define AR_ANT_DIV_ENABLE 0x1000000 | 270 | #define AR_ANT_DIV_ENABLE 0x1000000 |
268 | #define AR_ANT_DIV_ENABLE_S 24 | 271 | #define AR_ANT_DIV_ENABLE_S 24 |
269 | 272 | ||
273 | |||
274 | #define AR_PHY_9485_ANT_FAST_DIV_BIAS 0x00007e00 | ||
275 | #define AR_PHY_9485_ANT_FAST_DIV_BIAS_S 9 | ||
276 | #define AR_PHY_9485_ANT_DIV_LNADIV 0x01000000 | ||
277 | #define AR_PHY_9485_ANT_DIV_LNADIV_S 24 | ||
278 | #define AR_PHY_9485_ANT_DIV_ALT_LNACONF 0x06000000 | ||
279 | #define AR_PHY_9485_ANT_DIV_ALT_LNACONF_S 25 | ||
280 | #define AR_PHY_9485_ANT_DIV_MAIN_LNACONF 0x18000000 | ||
281 | #define AR_PHY_9485_ANT_DIV_MAIN_LNACONF_S 27 | ||
282 | #define AR_PHY_9485_ANT_DIV_ALT_GAINTB 0x20000000 | ||
283 | #define AR_PHY_9485_ANT_DIV_ALT_GAINTB_S 29 | ||
284 | #define AR_PHY_9485_ANT_DIV_MAIN_GAINTB 0x40000000 | ||
285 | #define AR_PHY_9485_ANT_DIV_MAIN_GAINTB_S 30 | ||
286 | |||
287 | #define AR_PHY_9485_ANT_DIV_LNA1_MINUS_LNA2 0x0 | ||
288 | #define AR_PHY_9485_ANT_DIV_LNA2 0x1 | ||
289 | #define AR_PHY_9485_ANT_DIV_LNA1 0x2 | ||
290 | #define AR_PHY_9485_ANT_DIV_LNA1_PLUS_LNA2 0x3 | ||
291 | |||
270 | #define AR_PHY_EXTCHN_PWRTHR1 (AR_AGC_BASE + 0x2c) | 292 | #define AR_PHY_EXTCHN_PWRTHR1 (AR_AGC_BASE + 0x2c) |
271 | #define AR_PHY_EXT_CHN_WIN (AR_AGC_BASE + 0x30) | 293 | #define AR_PHY_EXT_CHN_WIN (AR_AGC_BASE + 0x30) |
272 | #define AR_PHY_20_40_DET_THR (AR_AGC_BASE + 0x34) | 294 | #define AR_PHY_20_40_DET_THR (AR_AGC_BASE + 0x34) |
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 0312aa091807..03b37d7be1c3 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -62,7 +62,6 @@ struct ath_node; | |||
62 | #define ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i)) | 62 | #define ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i)) |
63 | 63 | ||
64 | struct ath_config { | 64 | struct ath_config { |
65 | u32 ath_aggr_prot; | ||
66 | u16 txpowlimit; | 65 | u16 txpowlimit; |
67 | u8 cabqReadytime; | 66 | u8 cabqReadytime; |
68 | }; | 67 | }; |
@@ -484,7 +483,6 @@ static inline void ath_deinit_leds(struct ath_softc *sc) | |||
484 | #define ATH_ANT_DIV_COMB_ALT_ANT_RATIO 30 | 483 | #define ATH_ANT_DIV_COMB_ALT_ANT_RATIO 30 |
485 | #define ATH_ANT_DIV_COMB_ALT_ANT_RATIO2 20 | 484 | #define ATH_ANT_DIV_COMB_ALT_ANT_RATIO2 20 |
486 | 485 | ||
487 | #define ATH_ANT_DIV_COMB_LNA1_LNA2_DELTA -3 | ||
488 | #define ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA -1 | 486 | #define ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA -1 |
489 | #define ATH_ANT_DIV_COMB_LNA1_DELTA_HI -4 | 487 | #define ATH_ANT_DIV_COMB_LNA1_DELTA_HI -4 |
490 | #define ATH_ANT_DIV_COMB_LNA1_DELTA_MID -2 | 488 | #define ATH_ANT_DIV_COMB_LNA1_DELTA_MID -2 |
@@ -565,6 +563,7 @@ struct ath_ant_comb { | |||
565 | #define PS_WAIT_FOR_PSPOLL_DATA BIT(2) | 563 | #define PS_WAIT_FOR_PSPOLL_DATA BIT(2) |
566 | #define PS_WAIT_FOR_TX_ACK BIT(3) | 564 | #define PS_WAIT_FOR_TX_ACK BIT(3) |
567 | #define PS_BEACON_SYNC BIT(4) | 565 | #define PS_BEACON_SYNC BIT(4) |
566 | #define PS_TSFOOR_SYNC BIT(5) | ||
568 | 567 | ||
569 | struct ath_rate_table; | 568 | struct ath_rate_table; |
570 | 569 | ||
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 22cd241a098b..637dbc5f7b67 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -620,7 +620,13 @@ static void ath_beacon_config_sta(struct ath_softc *sc, | |||
620 | ath9k_hw_disable_interrupts(ah); | 620 | ath9k_hw_disable_interrupts(ah); |
621 | ath9k_hw_set_sta_beacon_timers(ah, &bs); | 621 | ath9k_hw_set_sta_beacon_timers(ah, &bs); |
622 | ah->imask |= ATH9K_INT_BMISS; | 622 | ah->imask |= ATH9K_INT_BMISS; |
623 | ath9k_hw_set_interrupts(ah, ah->imask); | 623 | |
624 | /* | ||
625 | * If the beacon config is called beacause of TSFOOR, | ||
626 | * Interrupts will be enabled back at the end of ath9k_tasklet | ||
627 | */ | ||
628 | if (!(sc->ps_flags & PS_TSFOOR_SYNC)) | ||
629 | ath9k_hw_set_interrupts(ah, ah->imask); | ||
624 | } | 630 | } |
625 | 631 | ||
626 | static void ath_beacon_config_adhoc(struct ath_softc *sc, | 632 | static void ath_beacon_config_adhoc(struct ath_softc *sc, |
@@ -661,7 +667,12 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc, | |||
661 | ath9k_hw_disable_interrupts(ah); | 667 | ath9k_hw_disable_interrupts(ah); |
662 | ath9k_beacon_init(sc, nexttbtt, intval); | 668 | ath9k_beacon_init(sc, nexttbtt, intval); |
663 | sc->beacon.bmisscnt = 0; | 669 | sc->beacon.bmisscnt = 0; |
664 | ath9k_hw_set_interrupts(ah, ah->imask); | 670 | /* |
671 | * If the beacon config is called beacause of TSFOOR, | ||
672 | * Interrupts will be enabled back at the end of ath9k_tasklet | ||
673 | */ | ||
674 | if (!(sc->ps_flags & PS_TSFOOR_SYNC)) | ||
675 | ath9k_hw_set_interrupts(ah, ah->imask); | ||
665 | } | 676 | } |
666 | 677 | ||
667 | static bool ath9k_allow_beacon_config(struct ath_softc *sc, | 678 | static bool ath9k_allow_beacon_config(struct ath_softc *sc, |
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c index 8649581fa4dd..558b228a717f 100644 --- a/drivers/net/wireless/ath/ath9k/calib.c +++ b/drivers/net/wireless/ath/ath9k/calib.c | |||
@@ -69,15 +69,21 @@ static void ath9k_hw_update_nfcal_hist_buffer(struct ath_hw *ah, | |||
69 | int16_t *nfarray) | 69 | int16_t *nfarray) |
70 | { | 70 | { |
71 | struct ath_common *common = ath9k_hw_common(ah); | 71 | struct ath_common *common = ath9k_hw_common(ah); |
72 | struct ieee80211_conf *conf = &common->hw->conf; | ||
72 | struct ath_nf_limits *limit; | 73 | struct ath_nf_limits *limit; |
73 | struct ath9k_nfcal_hist *h; | 74 | struct ath9k_nfcal_hist *h; |
74 | bool high_nf_mid = false; | 75 | bool high_nf_mid = false; |
76 | u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; | ||
75 | int i; | 77 | int i; |
76 | 78 | ||
77 | h = cal->nfCalHist; | 79 | h = cal->nfCalHist; |
78 | limit = ath9k_hw_get_nf_limits(ah, ah->curchan); | 80 | limit = ath9k_hw_get_nf_limits(ah, ah->curchan); |
79 | 81 | ||
80 | for (i = 0; i < NUM_NF_READINGS; i++) { | 82 | for (i = 0; i < NUM_NF_READINGS; i++) { |
83 | if (!(chainmask & (1 << i)) || | ||
84 | ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf))) | ||
85 | continue; | ||
86 | |||
81 | h[i].nfCalBuffer[h[i].currIndex] = nfarray[i]; | 87 | h[i].nfCalBuffer[h[i].currIndex] = nfarray[i]; |
82 | 88 | ||
83 | if (++h[i].currIndex >= ATH9K_NF_CAL_HIST_MAX) | 89 | if (++h[i].currIndex >= ATH9K_NF_CAL_HIST_MAX) |
@@ -225,6 +231,7 @@ void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) | |||
225 | int32_t val; | 231 | int32_t val; |
226 | u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; | 232 | u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; |
227 | struct ath_common *common = ath9k_hw_common(ah); | 233 | struct ath_common *common = ath9k_hw_common(ah); |
234 | struct ieee80211_conf *conf = &common->hw->conf; | ||
228 | s16 default_nf = ath9k_hw_get_default_nf(ah, chan); | 235 | s16 default_nf = ath9k_hw_get_default_nf(ah, chan); |
229 | 236 | ||
230 | if (ah->caldata) | 237 | if (ah->caldata) |
@@ -234,6 +241,9 @@ void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) | |||
234 | if (chainmask & (1 << i)) { | 241 | if (chainmask & (1 << i)) { |
235 | s16 nfval; | 242 | s16 nfval; |
236 | 243 | ||
244 | if ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf)) | ||
245 | continue; | ||
246 | |||
237 | if (h) | 247 | if (h) |
238 | nfval = h[i].privNF; | 248 | nfval = h[i].privNF; |
239 | else | 249 | else |
@@ -293,6 +303,9 @@ void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) | |||
293 | ENABLE_REGWRITE_BUFFER(ah); | 303 | ENABLE_REGWRITE_BUFFER(ah); |
294 | for (i = 0; i < NUM_NF_READINGS; i++) { | 304 | for (i = 0; i < NUM_NF_READINGS; i++) { |
295 | if (chainmask & (1 << i)) { | 305 | if (chainmask & (1 << i)) { |
306 | if ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf)) | ||
307 | continue; | ||
308 | |||
296 | val = REG_READ(ah, ah->nf_regs[i]); | 309 | val = REG_READ(ah, ah->nf_regs[i]); |
297 | val &= 0xFFFFFE00; | 310 | val &= 0xFFFFFE00; |
298 | val |= (((u32) (-50) << 1) & 0x1ff); | 311 | val |= (((u32) (-50) << 1) & 0x1ff); |
@@ -396,14 +409,6 @@ void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, | |||
396 | } | 409 | } |
397 | } | 410 | } |
398 | 411 | ||
399 | s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan) | ||
400 | { | ||
401 | if (!ah->curchan || !ah->curchan->noisefloor) | ||
402 | return ath9k_hw_get_default_nf(ah, chan); | ||
403 | |||
404 | return ah->curchan->noisefloor; | ||
405 | } | ||
406 | EXPORT_SYMBOL(ath9k_hw_getchan_noise); | ||
407 | 412 | ||
408 | void ath9k_hw_bstuck_nfcal(struct ath_hw *ah) | 413 | void ath9k_hw_bstuck_nfcal(struct ath_hw *ah) |
409 | { | 414 | { |
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h index b8973eb8d858..4420780fa3b8 100644 --- a/drivers/net/wireless/ath/ath9k/calib.h +++ b/drivers/net/wireless/ath/ath9k/calib.h | |||
@@ -106,7 +106,6 @@ bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan); | |||
106 | void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, | 106 | void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, |
107 | struct ath9k_channel *chan); | 107 | struct ath9k_channel *chan); |
108 | void ath9k_hw_bstuck_nfcal(struct ath_hw *ah); | 108 | void ath9k_hw_bstuck_nfcal(struct ath_hw *ah); |
109 | s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan); | ||
110 | void ath9k_hw_reset_calibration(struct ath_hw *ah, | 109 | void ath9k_hw_reset_calibration(struct ath_hw *ah, |
111 | struct ath9k_cal_list *currCal); | 110 | struct ath9k_cal_list *currCal); |
112 | 111 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h index 9dd90a85ad63..8b8f0445aef8 100644 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h | |||
@@ -116,15 +116,21 @@ static inline void ath9k_hw_clr11n_aggr(struct ath_hw *ah, void *ds) | |||
116 | ath9k_hw_ops(ah)->clr11n_aggr(ah, ds); | 116 | ath9k_hw_ops(ah)->clr11n_aggr(ah, ds); |
117 | } | 117 | } |
118 | 118 | ||
119 | static inline void ath9k_hw_set11n_burstduration(struct ath_hw *ah, void *ds, | 119 | static inline void ath9k_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val) |
120 | u32 burstDuration) | ||
121 | { | 120 | { |
122 | ath9k_hw_ops(ah)->set11n_burstduration(ah, ds, burstDuration); | 121 | ath9k_hw_ops(ah)->set_clrdmask(ah, ds, val); |
123 | } | 122 | } |
124 | 123 | ||
125 | static inline void ath9k_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val) | 124 | static inline void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, |
125 | struct ath_hw_antcomb_conf *antconf) | ||
126 | { | 126 | { |
127 | ath9k_hw_ops(ah)->set_clrdmask(ah, ds, val); | 127 | ath9k_hw_ops(ah)->antdiv_comb_conf_get(ah, antconf); |
128 | } | ||
129 | |||
130 | static inline void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah, | ||
131 | struct ath_hw_antcomb_conf *antconf) | ||
132 | { | ||
133 | ath9k_hw_ops(ah)->antdiv_comb_conf_set(ah, antconf); | ||
128 | } | 134 | } |
129 | 135 | ||
130 | /* Private hardware call ops */ | 136 | /* Private hardware call ops */ |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 58f3d4210338..b75b5dca4e29 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -2022,6 +2022,22 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) | |||
2022 | } | 2022 | } |
2023 | 2023 | ||
2024 | 2024 | ||
2025 | if (AR_SREV_9485(ah)) { | ||
2026 | ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); | ||
2027 | /* | ||
2028 | * enable the diversity-combining algorithm only when | ||
2029 | * both enable_lna_div and enable_fast_div are set | ||
2030 | * Table for Diversity | ||
2031 | * ant_div_alt_lnaconf bit 0-1 | ||
2032 | * ant_div_main_lnaconf bit 2-3 | ||
2033 | * ant_div_alt_gaintb bit 4 | ||
2034 | * ant_div_main_gaintb bit 5 | ||
2035 | * enable_ant_div_lnadiv bit 6 | ||
2036 | * enable_ant_fast_div bit 7 | ||
2037 | */ | ||
2038 | if ((ant_div_ctl1 >> 0x6) == 0x3) | ||
2039 | pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB; | ||
2040 | } | ||
2025 | 2041 | ||
2026 | if (AR_SREV_9485_10(ah)) { | 2042 | if (AR_SREV_9485_10(ah)) { |
2027 | pCap->pcie_lcr_extsync_en = true; | 2043 | pCap->pcie_lcr_extsync_en = true; |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 34ed1bd0e855..7af2773d2bfc 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -479,6 +479,10 @@ struct ath_hw_antcomb_conf { | |||
479 | u8 main_lna_conf; | 479 | u8 main_lna_conf; |
480 | u8 alt_lna_conf; | 480 | u8 alt_lna_conf; |
481 | u8 fast_div_bias; | 481 | u8 fast_div_bias; |
482 | u8 main_gaintb; | ||
483 | u8 alt_gaintb; | ||
484 | int lna1_lna2_delta; | ||
485 | u8 div_group; | ||
482 | }; | 486 | }; |
483 | 487 | ||
484 | /** | 488 | /** |
@@ -628,9 +632,12 @@ struct ath_hw_ops { | |||
628 | u32 numDelims); | 632 | u32 numDelims); |
629 | void (*set11n_aggr_last)(struct ath_hw *ah, void *ds); | 633 | void (*set11n_aggr_last)(struct ath_hw *ah, void *ds); |
630 | void (*clr11n_aggr)(struct ath_hw *ah, void *ds); | 634 | void (*clr11n_aggr)(struct ath_hw *ah, void *ds); |
631 | void (*set11n_burstduration)(struct ath_hw *ah, void *ds, | ||
632 | u32 burstDuration); | ||
633 | void (*set_clrdmask)(struct ath_hw *ah, void *ds, bool val); | 635 | void (*set_clrdmask)(struct ath_hw *ah, void *ds, bool val); |
636 | void (*antdiv_comb_conf_get)(struct ath_hw *ah, | ||
637 | struct ath_hw_antcomb_conf *antconf); | ||
638 | void (*antdiv_comb_conf_set)(struct ath_hw *ah, | ||
639 | struct ath_hw_antcomb_conf *antconf); | ||
640 | |||
634 | }; | 641 | }; |
635 | 642 | ||
636 | struct ath_nf_limits { | 643 | struct ath_nf_limits { |
@@ -906,10 +913,6 @@ void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio, | |||
906 | void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val); | 913 | void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val); |
907 | u32 ath9k_hw_getdefantenna(struct ath_hw *ah); | 914 | u32 ath9k_hw_getdefantenna(struct ath_hw *ah); |
908 | void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna); | 915 | void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna); |
909 | void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, | ||
910 | struct ath_hw_antcomb_conf *antconf); | ||
911 | void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah, | ||
912 | struct ath_hw_antcomb_conf *antconf); | ||
913 | 916 | ||
914 | /* General Operation */ | 917 | /* General Operation */ |
915 | bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout); | 918 | bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout); |
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 9cf7a7d0e118..bd6d2b9d736f 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c | |||
@@ -430,8 +430,13 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
430 | SM(qi->tqi_shretry, AR_D_RETRY_LIMIT_FR_SH)); | 430 | SM(qi->tqi_shretry, AR_D_RETRY_LIMIT_FR_SH)); |
431 | 431 | ||
432 | REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); | 432 | REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); |
433 | REG_WRITE(ah, AR_DMISC(q), | 433 | |
434 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2); | 434 | if (AR_SREV_9340(ah)) |
435 | REG_WRITE(ah, AR_DMISC(q), | ||
436 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1); | ||
437 | else | ||
438 | REG_WRITE(ah, AR_DMISC(q), | ||
439 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2); | ||
435 | 440 | ||
436 | if (qi->tqi_cbrPeriod) { | 441 | if (qi->tqi_cbrPeriod) { |
437 | REG_WRITE(ah, AR_QCBRCFG(q), | 442 | REG_WRITE(ah, AR_QCBRCFG(q), |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index c3dbf2661a3f..45303bdbc465 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -689,6 +689,17 @@ void ath9k_tasklet(unsigned long data) | |||
689 | !ath9k_hw_check_alive(ah)) | 689 | !ath9k_hw_check_alive(ah)) |
690 | ieee80211_queue_work(sc->hw, &sc->hw_check_work); | 690 | ieee80211_queue_work(sc->hw, &sc->hw_check_work); |
691 | 691 | ||
692 | if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) { | ||
693 | /* | ||
694 | * TSF sync does not look correct; remain awake to sync with | ||
695 | * the next Beacon. | ||
696 | */ | ||
697 | ath_dbg(common, ATH_DBG_PS, | ||
698 | "TSFOOR - Sync with next Beacon\n"); | ||
699 | sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC | | ||
700 | PS_TSFOOR_SYNC; | ||
701 | } | ||
702 | |||
692 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | 703 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) |
693 | rxmask = (ATH9K_INT_RXHP | ATH9K_INT_RXLP | ATH9K_INT_RXEOL | | 704 | rxmask = (ATH9K_INT_RXHP | ATH9K_INT_RXLP | ATH9K_INT_RXEOL | |
694 | ATH9K_INT_RXORN); | 705 | ATH9K_INT_RXORN); |
@@ -711,16 +722,6 @@ void ath9k_tasklet(unsigned long data) | |||
711 | ath_tx_tasklet(sc); | 722 | ath_tx_tasklet(sc); |
712 | } | 723 | } |
713 | 724 | ||
714 | if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) { | ||
715 | /* | ||
716 | * TSF sync does not look correct; remain awake to sync with | ||
717 | * the next Beacon. | ||
718 | */ | ||
719 | ath_dbg(common, ATH_DBG_PS, | ||
720 | "TSFOOR - Sync with next Beacon\n"); | ||
721 | sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC; | ||
722 | } | ||
723 | |||
724 | if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) | 725 | if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) |
725 | if (status & ATH9K_INT_GENTIMER) | 726 | if (status & ATH9K_INT_GENTIMER) |
726 | ath_gen_timer_isr(sc->sc_ah); | 727 | ath_gen_timer_isr(sc->sc_ah); |
@@ -1384,7 +1385,9 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw, | |||
1384 | ath9k_hw_set_tsfadjust(ah, 0); | 1385 | ath9k_hw_set_tsfadjust(ah, 0); |
1385 | sc->sc_flags &= ~SC_OP_TSF_RESET; | 1386 | sc->sc_flags &= ~SC_OP_TSF_RESET; |
1386 | 1387 | ||
1387 | if (iter_data.nwds + iter_data.nmeshes) | 1388 | if (iter_data.nmeshes) |
1389 | ah->opmode = NL80211_IFTYPE_MESH_POINT; | ||
1390 | else if (iter_data.nwds) | ||
1388 | ah->opmode = NL80211_IFTYPE_AP; | 1391 | ah->opmode = NL80211_IFTYPE_AP; |
1389 | else if (iter_data.nadhocs) | 1392 | else if (iter_data.nadhocs) |
1390 | ah->opmode = NL80211_IFTYPE_ADHOC; | 1393 | ah->opmode = NL80211_IFTYPE_ADHOC; |
@@ -1408,6 +1411,7 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw, | |||
1408 | 1411 | ||
1409 | /* Set up ANI */ | 1412 | /* Set up ANI */ |
1410 | if ((iter_data.naps + iter_data.nadhocs) > 0) { | 1413 | if ((iter_data.naps + iter_data.nadhocs) > 0) { |
1414 | sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; | ||
1411 | sc->sc_flags |= SC_OP_ANI_RUN; | 1415 | sc->sc_flags |= SC_OP_ANI_RUN; |
1412 | ath_start_ani(common); | 1416 | ath_start_ani(common); |
1413 | } else { | 1417 | } else { |
@@ -1778,6 +1782,11 @@ static int ath9k_sta_add(struct ieee80211_hw *hw, | |||
1778 | struct ieee80211_key_conf ps_key = { }; | 1782 | struct ieee80211_key_conf ps_key = { }; |
1779 | 1783 | ||
1780 | ath_node_attach(sc, sta); | 1784 | ath_node_attach(sc, sta); |
1785 | |||
1786 | if (vif->type != NL80211_IFTYPE_AP && | ||
1787 | vif->type != NL80211_IFTYPE_AP_VLAN) | ||
1788 | return 0; | ||
1789 | |||
1781 | an->ps_key = ath_key_config(common, vif, sta, &ps_key); | 1790 | an->ps_key = ath_key_config(common, vif, sta, &ps_key); |
1782 | 1791 | ||
1783 | return 0; | 1792 | return 0; |
@@ -2039,9 +2048,6 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, | |||
2039 | if (changed & BSS_CHANGED_BSSID) { | 2048 | if (changed & BSS_CHANGED_BSSID) { |
2040 | ath9k_config_bss(sc, vif); | 2049 | ath9k_config_bss(sc, vif); |
2041 | 2050 | ||
2042 | /* Set aggregation protection mode parameters */ | ||
2043 | sc->config.ath_aggr_prot = 0; | ||
2044 | |||
2045 | ath_dbg(common, ATH_DBG_CONFIG, "BSSID: %pM aid: 0x%x\n", | 2051 | ath_dbg(common, ATH_DBG_CONFIG, "BSSID: %pM aid: 0x%x\n", |
2046 | common->curbssid, common->curaid); | 2052 | common->curbssid, common->curaid); |
2047 | } | 2053 | } |
@@ -2261,6 +2267,7 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop) | |||
2261 | struct ath_softc *sc = hw->priv; | 2267 | struct ath_softc *sc = hw->priv; |
2262 | int timeout = 200; /* ms */ | 2268 | int timeout = 200; /* ms */ |
2263 | int i, j; | 2269 | int i, j; |
2270 | bool drain_txq; | ||
2264 | 2271 | ||
2265 | mutex_lock(&sc->mutex); | 2272 | mutex_lock(&sc->mutex); |
2266 | cancel_delayed_work_sync(&sc->tx_complete_work); | 2273 | cancel_delayed_work_sync(&sc->tx_complete_work); |
@@ -2269,7 +2276,7 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop) | |||
2269 | timeout = 1; | 2276 | timeout = 1; |
2270 | 2277 | ||
2271 | for (j = 0; j < timeout; j++) { | 2278 | for (j = 0; j < timeout; j++) { |
2272 | int npend = 0; | 2279 | bool npend = false; |
2273 | 2280 | ||
2274 | if (j) | 2281 | if (j) |
2275 | usleep_range(1000, 2000); | 2282 | usleep_range(1000, 2000); |
@@ -2278,7 +2285,10 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop) | |||
2278 | if (!ATH_TXQ_SETUP(sc, i)) | 2285 | if (!ATH_TXQ_SETUP(sc, i)) |
2279 | continue; | 2286 | continue; |
2280 | 2287 | ||
2281 | npend += ath9k_has_pending_frames(sc, &sc->tx.txq[i]); | 2288 | npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]); |
2289 | |||
2290 | if (npend) | ||
2291 | break; | ||
2282 | } | 2292 | } |
2283 | 2293 | ||
2284 | if (!npend) | 2294 | if (!npend) |
@@ -2286,7 +2296,10 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop) | |||
2286 | } | 2296 | } |
2287 | 2297 | ||
2288 | ath9k_ps_wakeup(sc); | 2298 | ath9k_ps_wakeup(sc); |
2289 | if (!ath_drain_all_txq(sc, false)) | 2299 | spin_lock_bh(&sc->sc_pcu_lock); |
2300 | drain_txq = ath_drain_all_txq(sc, false); | ||
2301 | spin_unlock_bh(&sc->sc_pcu_lock); | ||
2302 | if (!drain_txq) | ||
2290 | ath_reset(sc, false); | 2303 | ath_reset(sc, false); |
2291 | ath9k_ps_restore(sc); | 2304 | ath9k_ps_restore(sc); |
2292 | ieee80211_wake_queues(hw); | 2305 | ieee80211_wake_queues(hw); |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index c5b7cbe59bfa..4f52e0429f99 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -28,6 +28,33 @@ static inline bool ath_is_alt_ant_ratio_better(int alt_ratio, int maxdelta, | |||
28 | (alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50); | 28 | (alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50); |
29 | } | 29 | } |
30 | 30 | ||
31 | static inline bool ath_ant_div_comb_alt_check(u8 div_group, int alt_ratio, | ||
32 | int curr_main_set, int curr_alt_set, | ||
33 | int alt_rssi_avg, int main_rssi_avg) | ||
34 | { | ||
35 | bool result = false; | ||
36 | switch (div_group) { | ||
37 | case 0: | ||
38 | if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) | ||
39 | result = true; | ||
40 | break; | ||
41 | case 1: | ||
42 | if ((((curr_main_set == ATH_ANT_DIV_COMB_LNA2) && | ||
43 | (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) && | ||
44 | (alt_rssi_avg >= (main_rssi_avg - 5))) || | ||
45 | ((curr_main_set == ATH_ANT_DIV_COMB_LNA1) && | ||
46 | (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) && | ||
47 | (alt_rssi_avg >= (main_rssi_avg - 2)))) && | ||
48 | (alt_rssi_avg >= 4)) | ||
49 | result = true; | ||
50 | else | ||
51 | result = false; | ||
52 | break; | ||
53 | } | ||
54 | |||
55 | return result; | ||
56 | } | ||
57 | |||
31 | static inline bool ath9k_check_auto_sleep(struct ath_softc *sc) | 58 | static inline bool ath9k_check_auto_sleep(struct ath_softc *sc) |
32 | { | 59 | { |
33 | return sc->ps_enabled && | 60 | return sc->ps_enabled && |
@@ -572,6 +599,7 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb) | |||
572 | ath_dbg(common, ATH_DBG_PS, | 599 | ath_dbg(common, ATH_DBG_PS, |
573 | "Reconfigure Beacon timers based on timestamp from the AP\n"); | 600 | "Reconfigure Beacon timers based on timestamp from the AP\n"); |
574 | ath_set_beacon(sc); | 601 | ath_set_beacon(sc); |
602 | sc->ps_flags &= ~PS_TSFOOR_SYNC; | ||
575 | } | 603 | } |
576 | 604 | ||
577 | if (ath_beacon_dtim_pending_cab(skb)) { | 605 | if (ath_beacon_dtim_pending_cab(skb)) { |
@@ -916,7 +944,8 @@ static void ath9k_process_rssi(struct ath_common *common, | |||
916 | int last_rssi; | 944 | int last_rssi; |
917 | __le16 fc; | 945 | __le16 fc; |
918 | 946 | ||
919 | if (ah->opmode != NL80211_IFTYPE_STATION) | 947 | if ((ah->opmode != NL80211_IFTYPE_STATION) && |
948 | (ah->opmode != NL80211_IFTYPE_ADHOC)) | ||
920 | return; | 949 | return; |
921 | 950 | ||
922 | fc = hdr->frame_control; | 951 | fc = hdr->frame_control; |
@@ -1288,49 +1317,138 @@ static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb, | |||
1288 | } | 1317 | } |
1289 | } | 1318 | } |
1290 | 1319 | ||
1291 | static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf) | 1320 | static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, |
1321 | struct ath_ant_comb *antcomb, int alt_ratio) | ||
1292 | { | 1322 | { |
1293 | /* Adjust the fast_div_bias based on main and alt lna conf */ | 1323 | if (ant_conf->div_group == 0) { |
1294 | switch ((ant_conf->main_lna_conf << 4) | ant_conf->alt_lna_conf) { | 1324 | /* Adjust the fast_div_bias based on main and alt lna conf */ |
1295 | case (0x01): /* A-B LNA2 */ | 1325 | switch ((ant_conf->main_lna_conf << 4) | |
1296 | ant_conf->fast_div_bias = 0x3b; | 1326 | ant_conf->alt_lna_conf) { |
1297 | break; | 1327 | case (0x01): /* A-B LNA2 */ |
1298 | case (0x02): /* A-B LNA1 */ | 1328 | ant_conf->fast_div_bias = 0x3b; |
1299 | ant_conf->fast_div_bias = 0x3d; | 1329 | break; |
1300 | break; | 1330 | case (0x02): /* A-B LNA1 */ |
1301 | case (0x03): /* A-B A+B */ | 1331 | ant_conf->fast_div_bias = 0x3d; |
1302 | ant_conf->fast_div_bias = 0x1; | 1332 | break; |
1303 | break; | 1333 | case (0x03): /* A-B A+B */ |
1304 | case (0x10): /* LNA2 A-B */ | 1334 | ant_conf->fast_div_bias = 0x1; |
1305 | ant_conf->fast_div_bias = 0x7; | 1335 | break; |
1306 | break; | 1336 | case (0x10): /* LNA2 A-B */ |
1307 | case (0x12): /* LNA2 LNA1 */ | 1337 | ant_conf->fast_div_bias = 0x7; |
1308 | ant_conf->fast_div_bias = 0x2; | 1338 | break; |
1309 | break; | 1339 | case (0x12): /* LNA2 LNA1 */ |
1310 | case (0x13): /* LNA2 A+B */ | 1340 | ant_conf->fast_div_bias = 0x2; |
1311 | ant_conf->fast_div_bias = 0x7; | 1341 | break; |
1312 | break; | 1342 | case (0x13): /* LNA2 A+B */ |
1313 | case (0x20): /* LNA1 A-B */ | 1343 | ant_conf->fast_div_bias = 0x7; |
1314 | ant_conf->fast_div_bias = 0x6; | 1344 | break; |
1315 | break; | 1345 | case (0x20): /* LNA1 A-B */ |
1316 | case (0x21): /* LNA1 LNA2 */ | 1346 | ant_conf->fast_div_bias = 0x6; |
1317 | ant_conf->fast_div_bias = 0x0; | 1347 | break; |
1318 | break; | 1348 | case (0x21): /* LNA1 LNA2 */ |
1319 | case (0x23): /* LNA1 A+B */ | 1349 | ant_conf->fast_div_bias = 0x0; |
1320 | ant_conf->fast_div_bias = 0x6; | 1350 | break; |
1321 | break; | 1351 | case (0x23): /* LNA1 A+B */ |
1322 | case (0x30): /* A+B A-B */ | 1352 | ant_conf->fast_div_bias = 0x6; |
1323 | ant_conf->fast_div_bias = 0x1; | 1353 | break; |
1324 | break; | 1354 | case (0x30): /* A+B A-B */ |
1325 | case (0x31): /* A+B LNA2 */ | 1355 | ant_conf->fast_div_bias = 0x1; |
1326 | ant_conf->fast_div_bias = 0x3b; | 1356 | break; |
1327 | break; | 1357 | case (0x31): /* A+B LNA2 */ |
1328 | case (0x32): /* A+B LNA1 */ | 1358 | ant_conf->fast_div_bias = 0x3b; |
1329 | ant_conf->fast_div_bias = 0x3d; | 1359 | break; |
1330 | break; | 1360 | case (0x32): /* A+B LNA1 */ |
1331 | default: | 1361 | ant_conf->fast_div_bias = 0x3d; |
1332 | break; | 1362 | break; |
1363 | default: | ||
1364 | break; | ||
1365 | } | ||
1366 | } else if (ant_conf->div_group == 2) { | ||
1367 | /* Adjust the fast_div_bias based on main and alt_lna_conf */ | ||
1368 | switch ((ant_conf->main_lna_conf << 4) | | ||
1369 | ant_conf->alt_lna_conf) { | ||
1370 | case (0x01): /* A-B LNA2 */ | ||
1371 | ant_conf->fast_div_bias = 0x1; | ||
1372 | ant_conf->main_gaintb = 0; | ||
1373 | ant_conf->alt_gaintb = 0; | ||
1374 | break; | ||
1375 | case (0x02): /* A-B LNA1 */ | ||
1376 | ant_conf->fast_div_bias = 0x1; | ||
1377 | ant_conf->main_gaintb = 0; | ||
1378 | ant_conf->alt_gaintb = 0; | ||
1379 | break; | ||
1380 | case (0x03): /* A-B A+B */ | ||
1381 | ant_conf->fast_div_bias = 0x1; | ||
1382 | ant_conf->main_gaintb = 0; | ||
1383 | ant_conf->alt_gaintb = 0; | ||
1384 | break; | ||
1385 | case (0x10): /* LNA2 A-B */ | ||
1386 | if (!(antcomb->scan) && | ||
1387 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) | ||
1388 | ant_conf->fast_div_bias = 0x1; | ||
1389 | else | ||
1390 | ant_conf->fast_div_bias = 0x2; | ||
1391 | ant_conf->main_gaintb = 0; | ||
1392 | ant_conf->alt_gaintb = 0; | ||
1393 | break; | ||
1394 | case (0x12): /* LNA2 LNA1 */ | ||
1395 | ant_conf->fast_div_bias = 0x1; | ||
1396 | ant_conf->main_gaintb = 0; | ||
1397 | ant_conf->alt_gaintb = 0; | ||
1398 | break; | ||
1399 | case (0x13): /* LNA2 A+B */ | ||
1400 | if (!(antcomb->scan) && | ||
1401 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) | ||
1402 | ant_conf->fast_div_bias = 0x1; | ||
1403 | else | ||
1404 | ant_conf->fast_div_bias = 0x2; | ||
1405 | ant_conf->main_gaintb = 0; | ||
1406 | ant_conf->alt_gaintb = 0; | ||
1407 | break; | ||
1408 | case (0x20): /* LNA1 A-B */ | ||
1409 | if (!(antcomb->scan) && | ||
1410 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) | ||
1411 | ant_conf->fast_div_bias = 0x1; | ||
1412 | else | ||
1413 | ant_conf->fast_div_bias = 0x2; | ||
1414 | ant_conf->main_gaintb = 0; | ||
1415 | ant_conf->alt_gaintb = 0; | ||
1416 | break; | ||
1417 | case (0x21): /* LNA1 LNA2 */ | ||
1418 | ant_conf->fast_div_bias = 0x1; | ||
1419 | ant_conf->main_gaintb = 0; | ||
1420 | ant_conf->alt_gaintb = 0; | ||
1421 | break; | ||
1422 | case (0x23): /* LNA1 A+B */ | ||
1423 | if (!(antcomb->scan) && | ||
1424 | (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) | ||
1425 | ant_conf->fast_div_bias = 0x1; | ||
1426 | else | ||
1427 | ant_conf->fast_div_bias = 0x2; | ||
1428 | ant_conf->main_gaintb = 0; | ||
1429 | ant_conf->alt_gaintb = 0; | ||
1430 | break; | ||
1431 | case (0x30): /* A+B A-B */ | ||
1432 | ant_conf->fast_div_bias = 0x1; | ||
1433 | ant_conf->main_gaintb = 0; | ||
1434 | ant_conf->alt_gaintb = 0; | ||
1435 | break; | ||
1436 | case (0x31): /* A+B LNA2 */ | ||
1437 | ant_conf->fast_div_bias = 0x1; | ||
1438 | ant_conf->main_gaintb = 0; | ||
1439 | ant_conf->alt_gaintb = 0; | ||
1440 | break; | ||
1441 | case (0x32): /* A+B LNA1 */ | ||
1442 | ant_conf->fast_div_bias = 0x1; | ||
1443 | ant_conf->main_gaintb = 0; | ||
1444 | ant_conf->alt_gaintb = 0; | ||
1445 | break; | ||
1446 | default: | ||
1447 | break; | ||
1448 | } | ||
1449 | |||
1333 | } | 1450 | } |
1451 | |||
1334 | } | 1452 | } |
1335 | 1453 | ||
1336 | /* Antenna diversity and combining */ | 1454 | /* Antenna diversity and combining */ |
@@ -1350,8 +1468,8 @@ static void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs) | |||
1350 | main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & | 1468 | main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & |
1351 | ATH_ANT_RX_MASK; | 1469 | ATH_ANT_RX_MASK; |
1352 | 1470 | ||
1353 | /* Record packet only when alt_rssi is positive */ | 1471 | /* Record packet only when both main_rssi and alt_rssi is positive */ |
1354 | if (alt_rssi > 0) { | 1472 | if (main_rssi > 0 && alt_rssi > 0) { |
1355 | antcomb->total_pkt_count++; | 1473 | antcomb->total_pkt_count++; |
1356 | antcomb->main_total_rssi += main_rssi; | 1474 | antcomb->main_total_rssi += main_rssi; |
1357 | antcomb->alt_total_rssi += alt_rssi; | 1475 | antcomb->alt_total_rssi += alt_rssi; |
@@ -1411,7 +1529,9 @@ static void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs) | |||
1411 | } | 1529 | } |
1412 | 1530 | ||
1413 | if (!antcomb->scan) { | 1531 | if (!antcomb->scan) { |
1414 | if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) { | 1532 | if (ath_ant_div_comb_alt_check(div_ant_conf.div_group, |
1533 | alt_ratio, curr_main_set, curr_alt_set, | ||
1534 | alt_rssi_avg, main_rssi_avg)) { | ||
1415 | if (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) { | 1535 | if (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) { |
1416 | /* Switch main and alt LNA */ | 1536 | /* Switch main and alt LNA */ |
1417 | div_ant_conf.main_lna_conf = | 1537 | div_ant_conf.main_lna_conf = |
@@ -1440,7 +1560,7 @@ static void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs) | |||
1440 | } | 1560 | } |
1441 | 1561 | ||
1442 | if ((alt_rssi_avg < (main_rssi_avg + | 1562 | if ((alt_rssi_avg < (main_rssi_avg + |
1443 | ATH_ANT_DIV_COMB_LNA1_LNA2_DELTA))) | 1563 | div_ant_conf.lna1_lna2_delta))) |
1444 | goto div_comb_done; | 1564 | goto div_comb_done; |
1445 | } | 1565 | } |
1446 | 1566 | ||
@@ -1554,8 +1674,7 @@ static void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs) | |||
1554 | antcomb->quick_scan_cnt++; | 1674 | antcomb->quick_scan_cnt++; |
1555 | 1675 | ||
1556 | div_comb_done: | 1676 | div_comb_done: |
1557 | ath_ant_div_conf_fast_divbias(&div_ant_conf); | 1677 | ath_ant_div_conf_fast_divbias(&div_ant_conf, antcomb, alt_ratio); |
1558 | |||
1559 | ath9k_hw_antdiv_comb_conf_set(sc->sc_ah, &div_ant_conf); | 1678 | ath9k_hw_antdiv_comb_conf_set(sc->sc_ah, &div_ant_conf); |
1560 | 1679 | ||
1561 | antcomb->scan_start_time = jiffies; | 1680 | antcomb->scan_start_time = jiffies; |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 7b91b2aa6240..97dd1fac98b6 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -1663,8 +1663,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, int len) | |||
1663 | rix = rates[i].idx; | 1663 | rix = rates[i].idx; |
1664 | series[i].Tries = rates[i].count; | 1664 | series[i].Tries = rates[i].count; |
1665 | 1665 | ||
1666 | if ((sc->config.ath_aggr_prot && bf_isaggr(bf)) || | 1666 | if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) { |
1667 | (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS)) { | ||
1668 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; | 1667 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; |
1669 | flags |= ATH9K_TXDESC_RTSENA; | 1668 | flags |= ATH9K_TXDESC_RTSENA; |
1670 | } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { | 1669 | } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { |
@@ -1733,8 +1732,6 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, int len) | |||
1733 | !is_pspoll, ctsrate, | 1732 | !is_pspoll, ctsrate, |
1734 | 0, series, 4, flags); | 1733 | 0, series, 4, flags); |
1735 | 1734 | ||
1736 | if (sc->config.ath_aggr_prot && flags) | ||
1737 | ath9k_hw_set11n_burstduration(sc->sc_ah, bf->bf_desc, 8192); | ||
1738 | } | 1735 | } |
1739 | 1736 | ||
1740 | static struct ath_buf *ath_tx_setup_buffer(struct ieee80211_hw *hw, | 1737 | static struct ath_buf *ath_tx_setup_buffer(struct ieee80211_hw *hw, |
@@ -1848,6 +1845,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1848 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1845 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
1849 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1846 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1850 | struct ieee80211_sta *sta = info->control.sta; | 1847 | struct ieee80211_sta *sta = info->control.sta; |
1848 | struct ieee80211_vif *vif = info->control.vif; | ||
1851 | struct ath_softc *sc = hw->priv; | 1849 | struct ath_softc *sc = hw->priv; |
1852 | struct ath_txq *txq = txctl->txq; | 1850 | struct ath_txq *txq = txctl->txq; |
1853 | struct ath_buf *bf; | 1851 | struct ath_buf *bf; |
@@ -1885,6 +1883,11 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1885 | memmove(skb->data, skb->data + padsize, padpos); | 1883 | memmove(skb->data, skb->data + padsize, padpos); |
1886 | } | 1884 | } |
1887 | 1885 | ||
1886 | if ((vif && vif->type != NL80211_IFTYPE_AP && | ||
1887 | vif->type != NL80211_IFTYPE_AP_VLAN) || | ||
1888 | !ieee80211_is_data(hdr->frame_control)) | ||
1889 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; | ||
1890 | |||
1888 | setup_frame_info(hw, skb, frmlen); | 1891 | setup_frame_info(hw, skb, frmlen); |
1889 | 1892 | ||
1890 | /* | 1893 | /* |