aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath9k
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath9k')
-rw-r--r--drivers/net/wireless/ath9k/eeprom.c16
-rw-r--r--drivers/net/wireless/ath9k/hw.c37
-rw-r--r--drivers/net/wireless/ath9k/hw.h12
-rw-r--r--drivers/net/wireless/ath9k/main.c2
-rw-r--r--drivers/net/wireless/ath9k/regd.c48
-rw-r--r--drivers/net/wireless/ath9k/regd.h12
6 files changed, 66 insertions, 61 deletions
diff --git a/drivers/net/wireless/ath9k/eeprom.c b/drivers/net/wireless/ath9k/eeprom.c
index 420a060e32ae..d58d8a330b64 100644
--- a/drivers/net/wireless/ath9k/eeprom.c
+++ b/drivers/net/wireless/ath9k/eeprom.c
@@ -1232,9 +1232,9 @@ static bool ath9k_hw_set_def_power_per_rate_table(struct ath_hal *ah,
1232 1232
1233 maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna; 1233 maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
1234 1234
1235 if (ah->ah_tpScale != ATH9K_TP_SCALE_MAX) { 1235 if (ah->regulatory.tp_scale != ATH9K_TP_SCALE_MAX) {
1236 maxRegAllowedPower -= 1236 maxRegAllowedPower -=
1237 (tpScaleReductionTable[(ah->ah_tpScale)] * 2); 1237 (tpScaleReductionTable[(ah->regulatory.tp_scale)] * 2);
1238 } 1238 }
1239 1239
1240 scaledPower = min(powerLimit, maxRegAllowedPower); 1240 scaledPower = min(powerLimit, maxRegAllowedPower);
@@ -1510,9 +1510,9 @@ static bool ath9k_hw_set_4k_power_per_rate_table(struct ath_hal *ah,
1510 1510
1511 maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna; 1511 maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
1512 1512
1513 if (ah->ah_tpScale != ATH9K_TP_SCALE_MAX) { 1513 if (ah->regulatory.tp_scale != ATH9K_TP_SCALE_MAX) {
1514 maxRegAllowedPower -= 1514 maxRegAllowedPower -=
1515 (tpScaleReductionTable[(ah->ah_tpScale)] * 2); 1515 (tpScaleReductionTable[(ah->regulatory.tp_scale)] * 2);
1516 } 1516 }
1517 1517
1518 scaledPower = min(powerLimit, maxRegAllowedPower); 1518 scaledPower = min(powerLimit, maxRegAllowedPower);
@@ -1823,10 +1823,10 @@ static int ath9k_hw_def_set_txpower(struct ath_hal *ah,
1823 i = rateHt20_0; 1823 i = rateHt20_0;
1824 1824
1825 if (AR_SREV_9280_10_OR_LATER(ah)) 1825 if (AR_SREV_9280_10_OR_LATER(ah))
1826 ah->ah_maxPowerLevel = 1826 ah->regulatory.max_power_level =
1827 ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2; 1827 ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2;
1828 else 1828 else
1829 ah->ah_maxPowerLevel = ratesArray[i]; 1829 ah->regulatory.max_power_level = ratesArray[i];
1830 1830
1831 return 0; 1831 return 0;
1832} 1832}
@@ -1951,10 +1951,10 @@ static int ath9k_hw_4k_set_txpower(struct ath_hal *ah,
1951 i = rateHt20_0; 1951 i = rateHt20_0;
1952 1952
1953 if (AR_SREV_9280_10_OR_LATER(ah)) 1953 if (AR_SREV_9280_10_OR_LATER(ah))
1954 ah->ah_maxPowerLevel = 1954 ah->regulatory.max_power_level =
1955 ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2; 1955 ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2;
1956 else 1956 else
1957 ah->ah_maxPowerLevel = ratesArray[i]; 1957 ah->regulatory.max_power_level = ratesArray[i];
1958 1958
1959 return 0; 1959 return 0;
1960} 1960}
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c
index 164a543248d3..9eafada743d4 100644
--- a/drivers/net/wireless/ath9k/hw.c
+++ b/drivers/net/wireless/ath9k/hw.c
@@ -409,7 +409,7 @@ static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid,
409 ah->ah_sc = sc; 409 ah->ah_sc = sc;
410 ah->ah_sh = mem; 410 ah->ah_sh = mem;
411 ah->hw_version.magic = AR5416_MAGIC; 411 ah->hw_version.magic = AR5416_MAGIC;
412 ah->ah_countryCode = CTRY_DEFAULT; 412 ah->regulatory.country_code = CTRY_DEFAULT;
413 ah->hw_version.devid = devid; 413 ah->hw_version.devid = devid;
414 ah->hw_version.subvendorid = 0; 414 ah->hw_version.subvendorid = 0;
415 415
@@ -419,8 +419,8 @@ static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid,
419 if (!AR_SREV_9100(ah)) 419 if (!AR_SREV_9100(ah))
420 ah->ah_flags = AH_USE_EEPROM; 420 ah->ah_flags = AH_USE_EEPROM;
421 421
422 ah->ah_powerLimit = MAX_RATE_POWER; 422 ah->regulatory.power_limit = MAX_RATE_POWER;
423 ah->ah_tpScale = ATH9K_TP_SCALE_MAX; 423 ah->regulatory.tp_scale = ATH9K_TP_SCALE_MAX;
424 ahp->ah_atimWindow = 0; 424 ahp->ah_atimWindow = 0;
425 ahp->ah_diversityControl = ah->ah_config.diversity_control; 425 ahp->ah_diversityControl = ah->ah_config.diversity_control;
426 ahp->ah_antennaSwitchSwap = 426 ahp->ah_antennaSwitchSwap =
@@ -1337,7 +1337,7 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
1337 channel->max_antenna_gain * 2, 1337 channel->max_antenna_gain * 2,
1338 channel->max_power * 2, 1338 channel->max_power * 2,
1339 min((u32) MAX_RATE_POWER, 1339 min((u32) MAX_RATE_POWER,
1340 (u32) ah->ah_powerLimit)); 1340 (u32) ah->regulatory.power_limit));
1341 if (status != 0) { 1341 if (status != 0) {
1342 DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, 1342 DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT,
1343 "error init'ing transmit power\n"); 1343 "error init'ing transmit power\n");
@@ -1668,7 +1668,7 @@ static bool ath9k_hw_channel_change(struct ath_hal *ah,
1668 channel->max_antenna_gain * 2, 1668 channel->max_antenna_gain * 2,
1669 channel->max_power * 2, 1669 channel->max_power * 2,
1670 min((u32) MAX_RATE_POWER, 1670 min((u32) MAX_RATE_POWER,
1671 (u32) ah->ah_powerLimit)) != 0) { 1671 (u32) ah->regulatory.power_limit)) != 0) {
1672 DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, 1672 DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
1673 "error init'ing transmit power\n"); 1673 "error init'ing transmit power\n");
1674 return false; 1674 return false;
@@ -3136,21 +3136,22 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
3136 3136
3137 eeval = ath9k_hw_get_eeprom(ah, EEP_REG_0); 3137 eeval = ath9k_hw_get_eeprom(ah, EEP_REG_0);
3138 3138
3139 ah->ah_currentRD = eeval; 3139 ah->regulatory.current_rd = eeval;
3140 3140
3141 eeval = ath9k_hw_get_eeprom(ah, EEP_REG_1); 3141 eeval = ath9k_hw_get_eeprom(ah, EEP_REG_1);
3142 ah->ah_currentRDExt = eeval; 3142 ah->regulatory.current_rd_ext = eeval;
3143 3143
3144 capField = ath9k_hw_get_eeprom(ah, EEP_OP_CAP); 3144 capField = ath9k_hw_get_eeprom(ah, EEP_OP_CAP);
3145 3145
3146 if (ah->ah_opmode != NL80211_IFTYPE_AP && 3146 if (ah->ah_opmode != NL80211_IFTYPE_AP &&
3147 ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) { 3147 ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
3148 if (ah->ah_currentRD == 0x64 || ah->ah_currentRD == 0x65) 3148 if (ah->regulatory.current_rd == 0x64 ||
3149 ah->ah_currentRD += 5; 3149 ah->regulatory.current_rd == 0x65)
3150 else if (ah->ah_currentRD == 0x41) 3150 ah->regulatory.current_rd += 5;
3151 ah->ah_currentRD = 0x43; 3151 else if (ah->regulatory.current_rd == 0x41)
3152 ah->regulatory.current_rd = 0x43;
3152 DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY, 3153 DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY,
3153 "regdomain mapped to 0x%x\n", ah->ah_currentRD); 3154 "regdomain mapped to 0x%x\n", ah->regulatory.current_rd);
3154 } 3155 }
3155 3156
3156 eeval = ath9k_hw_get_eeprom(ah, EEP_OP_MODE); 3157 eeval = ath9k_hw_get_eeprom(ah, EEP_OP_MODE);
@@ -3292,7 +3293,7 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
3292 else 3293 else
3293 pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS; 3294 pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
3294 3295
3295 if (ah->ah_currentRDExt & (1 << REG_EXT_JAPAN_MIDBAND)) { 3296 if (ah->regulatory.current_rd_ext & (1 << REG_EXT_JAPAN_MIDBAND)) {
3296 pCap->reg_cap = 3297 pCap->reg_cap =
3297 AR_EEPROM_EEREGCAP_EN_KK_NEW_11A | 3298 AR_EEPROM_EEREGCAP_EN_KK_NEW_11A |
3298 AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN | 3299 AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN |
@@ -3392,13 +3393,13 @@ bool ath9k_hw_getcapability(struct ath_hal *ah, enum ath9k_capability_type type,
3392 case 0: 3393 case 0:
3393 return 0; 3394 return 0;
3394 case 1: 3395 case 1:
3395 *result = ah->ah_powerLimit; 3396 *result = ah->regulatory.power_limit;
3396 return 0; 3397 return 0;
3397 case 2: 3398 case 2:
3398 *result = ah->ah_maxPowerLevel; 3399 *result = ah->regulatory.max_power_level;
3399 return 0; 3400 return 0;
3400 case 3: 3401 case 3:
3401 *result = ah->ah_tpScale; 3402 *result = ah->regulatory.tp_scale;
3402 return 0; 3403 return 0;
3403 } 3404 }
3404 return false; 3405 return false;
@@ -3655,14 +3656,14 @@ bool ath9k_hw_set_txpowerlimit(struct ath_hal *ah, u32 limit)
3655 struct ath9k_channel *chan = ah->ah_curchan; 3656 struct ath9k_channel *chan = ah->ah_curchan;
3656 struct ieee80211_channel *channel = chan->chan; 3657 struct ieee80211_channel *channel = chan->chan;
3657 3658
3658 ah->ah_powerLimit = min(limit, (u32) MAX_RATE_POWER); 3659 ah->regulatory.power_limit = min(limit, (u32) MAX_RATE_POWER);
3659 3660
3660 if (ath9k_hw_set_txpower(ah, chan, 3661 if (ath9k_hw_set_txpower(ah, chan,
3661 ath9k_regd_get_ctl(ah, chan), 3662 ath9k_regd_get_ctl(ah, chan),
3662 channel->max_antenna_gain * 2, 3663 channel->max_antenna_gain * 2,
3663 channel->max_power * 2, 3664 channel->max_power * 2,
3664 min((u32) MAX_RATE_POWER, 3665 min((u32) MAX_RATE_POWER,
3665 (u32) ah->ah_powerLimit)) != 0) 3666 (u32) ah->regulatory.power_limit)) != 0)
3666 return false; 3667 return false;
3667 3668
3668 return true; 3669 return true;
diff --git a/drivers/net/wireless/ath9k/hw.h b/drivers/net/wireless/ath9k/hw.h
index afa64bde301d..3fdf9626a766 100644
--- a/drivers/net/wireless/ath9k/hw.h
+++ b/drivers/net/wireless/ath9k/hw.h
@@ -425,17 +425,9 @@ struct ath_hal {
425 enum nl80211_iftype ah_opmode; 425 enum nl80211_iftype ah_opmode;
426 struct ath9k_ops_config ah_config; 426 struct ath9k_ops_config ah_config;
427 struct ath9k_hw_capabilities ah_caps; 427 struct ath9k_hw_capabilities ah_caps;
428 428 struct ath9k_regulatory regulatory;
429 u16 ah_countryCode;
430 u32 ah_flags; 429 u32 ah_flags;
431 int16_t ah_powerLimit; 430
432 u16 ah_maxPowerLevel;
433 u32 ah_tpScale;
434 u16 ah_currentRD;
435 u16 ah_currentRDExt;
436 u16 ah_currentRDInUse;
437 char alpha2[2];
438 struct reg_dmn_pair_mapping *regpair;
439 enum ath9k_power_mode ah_power_mode; 431 enum ath9k_power_mode ah_power_mode;
440 enum ath9k_power_mode ah_restore_mode; 432 enum ath9k_power_mode ah_restore_mode;
441 433
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
index dacf97afe763..a1c76ec09b3a 100644
--- a/drivers/net/wireless/ath9k/main.c
+++ b/drivers/net/wireless/ath9k/main.c
@@ -1659,7 +1659,7 @@ int ath_attach(u16 devid, struct ath_softc *sc)
1659 error = ieee80211_register_hw(hw); 1659 error = ieee80211_register_hw(hw);
1660 1660
1661 if (!ath9k_is_world_regd(sc->sc_ah)) 1661 if (!ath9k_is_world_regd(sc->sc_ah))
1662 regulatory_hint(hw->wiphy, sc->sc_ah->alpha2); 1662 regulatory_hint(hw->wiphy, sc->sc_ah->regulatory.alpha2);
1663 1663
1664 /* Initialize LED control */ 1664 /* Initialize LED control */
1665 ath_init_leds(sc); 1665 ath_init_leds(sc);
diff --git a/drivers/net/wireless/ath9k/regd.c b/drivers/net/wireless/ath9k/regd.c
index 819feb963821..32dd0cb34490 100644
--- a/drivers/net/wireless/ath9k/regd.c
+++ b/drivers/net/wireless/ath9k/regd.c
@@ -108,7 +108,7 @@ static const struct ieee80211_regdomain ath9k_world_regdom_67_68_6A = {
108 108
109static u16 ath9k_regd_get_eepromRD(struct ath_hal *ah) 109static u16 ath9k_regd_get_eepromRD(struct ath_hal *ah)
110{ 110{
111 return ah->ah_currentRD & ~WORLDWIDE_ROAMING_FLAG; 111 return ah->regulatory.current_rd & ~WORLDWIDE_ROAMING_FLAG;
112} 112}
113 113
114u16 ath9k_regd_get_rd(struct ath_hal *ah) 114u16 ath9k_regd_get_rd(struct ath_hal *ah)
@@ -129,7 +129,7 @@ const struct ieee80211_regdomain *ath9k_default_world_regdomain(void)
129 129
130const struct ieee80211_regdomain *ath9k_world_regdomain(struct ath_hal *ah) 130const struct ieee80211_regdomain *ath9k_world_regdomain(struct ath_hal *ah)
131{ 131{
132 switch (ah->regpair->regDmnEnum) { 132 switch (ah->regulatory.regpair->regDmnEnum) {
133 case 0x60: 133 case 0x60:
134 case 0x61: 134 case 0x61:
135 case 0x62: 135 case 0x62:
@@ -284,7 +284,7 @@ void ath9k_reg_apply_world_flags(struct wiphy *wiphy, enum reg_set_by setby)
284 struct ath_softc *sc = hw->priv; 284 struct ath_softc *sc = hw->priv;
285 struct ath_hal *ah = sc->sc_ah; 285 struct ath_hal *ah = sc->sc_ah;
286 286
287 switch (ah->regpair->regDmnEnum) { 287 switch (ah->regulatory.regpair->regDmnEnum) {
288 case 0x60: 288 case 0x60:
289 case 0x63: 289 case 0x63:
290 case 0x66: 290 case 0x66:
@@ -413,30 +413,30 @@ int ath9k_regd_init(struct ath_hal *ah)
413 return -EINVAL; 413 return -EINVAL;
414 } 414 }
415 415
416 ah->ah_countryCode = ath9k_regd_get_default_country(ah); 416 ah->regulatory.country_code = ath9k_regd_get_default_country(ah);
417 417
418 if (ah->ah_countryCode == CTRY_DEFAULT && 418 if (ah->regulatory.country_code == CTRY_DEFAULT &&
419 ath9k_regd_get_eepromRD(ah) == CTRY_DEFAULT) 419 ath9k_regd_get_eepromRD(ah) == CTRY_DEFAULT)
420 ah->ah_countryCode = CTRY_UNITED_STATES; 420 ah->regulatory.country_code = CTRY_UNITED_STATES;
421 421
422 if (ah->ah_countryCode == CTRY_DEFAULT) { 422 if (ah->regulatory.country_code == CTRY_DEFAULT) {
423 regdmn = ath9k_regd_get_eepromRD(ah); 423 regdmn = ath9k_regd_get_eepromRD(ah);
424 country = NULL; 424 country = NULL;
425 } else { 425 } else {
426 country = ath9k_regd_find_country(ah->ah_countryCode); 426 country = ath9k_regd_find_country(ah->regulatory.country_code);
427 if (country == NULL) { 427 if (country == NULL) {
428 DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY, 428 DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY,
429 "Country is NULL!!!!, cc= %d\n", 429 "Country is NULL!!!!, cc= %d\n",
430 ah->ah_countryCode); 430 ah->regulatory.country_code);
431 return -EINVAL; 431 return -EINVAL;
432 } else 432 } else
433 regdmn = country->regDmnEnum; 433 regdmn = country->regDmnEnum;
434 } 434 }
435 435
436 ah->ah_currentRDInUse = regdmn; 436 ah->regulatory.current_rd_inuse = regdmn;
437 ah->regpair = ath9k_get_regpair(regdmn); 437 ah->regulatory.regpair = ath9k_get_regpair(regdmn);
438 438
439 if (!ah->regpair) { 439 if (!ah->regulatory.regpair) {
440 DPRINTF(ah->ah_sc, ATH_DBG_FATAL, 440 DPRINTF(ah->ah_sc, ATH_DBG_FATAL,
441 "No regulatory domain pair found, cannot continue\n"); 441 "No regulatory domain pair found, cannot continue\n");
442 return -EINVAL; 442 return -EINVAL;
@@ -446,18 +446,18 @@ int ath9k_regd_init(struct ath_hal *ah)
446 country = ath9k_regd_find_country_by_rd(regdmn); 446 country = ath9k_regd_find_country_by_rd(regdmn);
447 447
448 if (country) { 448 if (country) {
449 ah->alpha2[0] = country->isoName[0]; 449 ah->regulatory.alpha2[0] = country->isoName[0];
450 ah->alpha2[1] = country->isoName[1]; 450 ah->regulatory.alpha2[1] = country->isoName[1];
451 } else { 451 } else {
452 ah->alpha2[0] = '0'; 452 ah->regulatory.alpha2[0] = '0';
453 ah->alpha2[1] = '0'; 453 ah->regulatory.alpha2[1] = '0';
454 } 454 }
455 455
456 DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY, 456 DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY,
457 "Country alpha2 being used: %c%c\n" 457 "Country alpha2 being used: %c%c\n"
458 "Regpair detected: 0x%0x\n", 458 "Regulatory.Regpair detected: 0x%0x\n",
459 ah->alpha2[0], ah->alpha2[1], 459 ah->regulatory.alpha2[0], ah->regulatory.alpha2[1],
460 ah->regpair->regDmnEnum); 460 ah->regulatory.regpair->regDmnEnum);
461 461
462 return 0; 462 return 0;
463} 463}
@@ -466,8 +466,8 @@ u32 ath9k_regd_get_ctl(struct ath_hal *ah, struct ath9k_channel *chan)
466{ 466{
467 u32 ctl = NO_CTL; 467 u32 ctl = NO_CTL;
468 468
469 if (!ah->regpair || 469 if (!ah->regulatory.regpair ||
470 (ah->ah_countryCode == CTRY_DEFAULT && isWwrSKU(ah))) { 470 (ah->regulatory.country_code == CTRY_DEFAULT && isWwrSKU(ah))) {
471 if (IS_CHAN_B(chan)) 471 if (IS_CHAN_B(chan))
472 ctl = SD_NO_CTL | CTL_11B; 472 ctl = SD_NO_CTL | CTL_11B;
473 else if (IS_CHAN_G(chan)) 473 else if (IS_CHAN_G(chan))
@@ -478,11 +478,11 @@ u32 ath9k_regd_get_ctl(struct ath_hal *ah, struct ath9k_channel *chan)
478 } 478 }
479 479
480 if (IS_CHAN_B(chan)) 480 if (IS_CHAN_B(chan))
481 ctl = ah->regpair->reg_2ghz_ctl | CTL_11B; 481 ctl = ah->regulatory.regpair->reg_2ghz_ctl | CTL_11B;
482 else if (IS_CHAN_G(chan)) 482 else if (IS_CHAN_G(chan))
483 ctl = ah->regpair->reg_5ghz_ctl | CTL_11G; 483 ctl = ah->regulatory.regpair->reg_5ghz_ctl | CTL_11G;
484 else 484 else
485 ctl = ah->regpair->reg_5ghz_ctl | CTL_11A; 485 ctl = ah->regulatory.regpair->reg_5ghz_ctl | CTL_11A;
486 486
487 return ctl; 487 return ctl;
488} 488}
diff --git a/drivers/net/wireless/ath9k/regd.h b/drivers/net/wireless/ath9k/regd.h
index d1c4457de436..65abdf46115d 100644
--- a/drivers/net/wireless/ath9k/regd.h
+++ b/drivers/net/wireless/ath9k/regd.h
@@ -45,6 +45,18 @@ struct country_code_to_enum_rd {
45 const char *isoName; 45 const char *isoName;
46}; 46};
47 47
48struct ath9k_regulatory {
49 char alpha2[2];
50 u16 country_code;
51 u16 max_power_level;
52 u32 tp_scale;
53 u16 current_rd;
54 u16 current_rd_ext;
55 u16 current_rd_inuse;
56 int16_t power_limit;
57 struct reg_dmn_pair_mapping *regpair;
58};
59
48enum CountryCode { 60enum CountryCode {
49 CTRY_ALBANIA = 8, 61 CTRY_ALBANIA = 8,
50 CTRY_ALGERIA = 12, 62 CTRY_ALGERIA = 12,