|
@@ -22,11 +22,13 @@
|
|
#define COMP_HDR_LEN 4
|
|
#define COMP_HDR_LEN 4
|
|
#define COMP_CKSUM_LEN 2
|
|
#define COMP_CKSUM_LEN 2
|
|
|
|
|
|
-#define AR_CH0_TOP (0x00016288)
|
|
|
|
|
|
+#define AR_CH0_TOP (AR_SREV_9300(ah) ? 0x16288 : \
|
|
|
|
+ ((AR_SREV_9480(ah) ? 0x1628c : 0x16280)))
|
|
#define AR_CH0_TOP_XPABIASLVL (0x300)
|
|
#define AR_CH0_TOP_XPABIASLVL (0x300)
|
|
#define AR_CH0_TOP_XPABIASLVL_S (8)
|
|
#define AR_CH0_TOP_XPABIASLVL_S (8)
|
|
|
|
|
|
-#define AR_CH0_THERM (0x00016290)
|
|
|
|
|
|
+#define AR_CH0_THERM (AR_SREV_9300(ah) ? 0x16290 : \
|
|
|
|
+ ((AR_SREV_9485(ah) ? 0x1628c : 0x16294)))
|
|
#define AR_CH0_THERM_XPABIASLVL_MSB 0x3
|
|
#define AR_CH0_THERM_XPABIASLVL_MSB 0x3
|
|
#define AR_CH0_THERM_XPABIASLVL_MSB_S 0
|
|
#define AR_CH0_THERM_XPABIASLVL_MSB_S 0
|
|
#define AR_CH0_THERM_XPASHORT2GND 0x4
|
|
#define AR_CH0_THERM_XPASHORT2GND 0x4
|
|
@@ -34,6 +36,11 @@
|
|
|
|
|
|
#define AR_SWITCH_TABLE_COM_ALL (0xffff)
|
|
#define AR_SWITCH_TABLE_COM_ALL (0xffff)
|
|
#define AR_SWITCH_TABLE_COM_ALL_S (0)
|
|
#define AR_SWITCH_TABLE_COM_ALL_S (0)
|
|
|
|
+#define AR_SWITCH_TABLE_COM_AR9480_ALL (0xffffff)
|
|
|
|
+#define AR_SWITCH_TABLE_COM_AR9480_ALL_S (0)
|
|
|
|
+#define AR_SWITCH_TABLE_COM_SPDT (0x00f00000)
|
|
|
|
+#define AR_SWITCH_TABLE_COM_SPDT_ALL (0x0000fff0)
|
|
|
|
+#define AR_SWITCH_TABLE_COM_SPDT_ALL_S (4)
|
|
|
|
|
|
#define AR_SWITCH_TABLE_COM2_ALL (0xffffff)
|
|
#define AR_SWITCH_TABLE_COM2_ALL (0xffffff)
|
|
#define AR_SWITCH_TABLE_COM2_ALL_S (0)
|
|
#define AR_SWITCH_TABLE_COM2_ALL_S (0)
|
|
@@ -158,7 +165,7 @@ static const struct ar9300_eeprom ar9300_default = {
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext1 = {
|
|
.base_ext1 = {
|
|
@@ -360,7 +367,7 @@ static const struct ar9300_eeprom ar9300_default = {
|
|
.papdRateMaskHt20 = LE32(0x0c80c080),
|
|
.papdRateMaskHt20 = LE32(0x0c80c080),
|
|
.papdRateMaskHt40 = LE32(0x0080c080),
|
|
.papdRateMaskHt40 = LE32(0x0080c080),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext2 = {
|
|
.base_ext2 = {
|
|
@@ -735,7 +742,7 @@ static const struct ar9300_eeprom ar9300_x113 = {
|
|
.papdRateMaskHt20 = LE32(0x0c80c080),
|
|
.papdRateMaskHt20 = LE32(0x0c80c080),
|
|
.papdRateMaskHt40 = LE32(0x0080c080),
|
|
.papdRateMaskHt40 = LE32(0x0080c080),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext1 = {
|
|
.base_ext1 = {
|
|
@@ -937,7 +944,7 @@ static const struct ar9300_eeprom ar9300_x113 = {
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext2 = {
|
|
.base_ext2 = {
|
|
@@ -1313,7 +1320,7 @@ static const struct ar9300_eeprom ar9300_h112 = {
|
|
.papdRateMaskHt20 = LE32(0x80c080),
|
|
.papdRateMaskHt20 = LE32(0x80c080),
|
|
.papdRateMaskHt40 = LE32(0x80c080),
|
|
.papdRateMaskHt40 = LE32(0x80c080),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext1 = {
|
|
.base_ext1 = {
|
|
@@ -1515,7 +1522,7 @@ static const struct ar9300_eeprom ar9300_h112 = {
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext2 = {
|
|
.base_ext2 = {
|
|
@@ -1891,7 +1898,7 @@ static const struct ar9300_eeprom ar9300_x112 = {
|
|
.papdRateMaskHt20 = LE32(0x0c80c080),
|
|
.papdRateMaskHt20 = LE32(0x0c80c080),
|
|
.papdRateMaskHt40 = LE32(0x0080c080),
|
|
.papdRateMaskHt40 = LE32(0x0080c080),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext1 = {
|
|
.base_ext1 = {
|
|
@@ -2093,7 +2100,7 @@ static const struct ar9300_eeprom ar9300_x112 = {
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext2 = {
|
|
.base_ext2 = {
|
|
@@ -2468,7 +2475,7 @@ static const struct ar9300_eeprom ar9300_h116 = {
|
|
.papdRateMaskHt20 = LE32(0x0c80C080),
|
|
.papdRateMaskHt20 = LE32(0x0c80C080),
|
|
.papdRateMaskHt40 = LE32(0x0080C080),
|
|
.papdRateMaskHt40 = LE32(0x0080C080),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext1 = {
|
|
.base_ext1 = {
|
|
@@ -2670,7 +2677,7 @@ static const struct ar9300_eeprom ar9300_h116 = {
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt20 = LE32(0x0cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.papdRateMaskHt40 = LE32(0x6cf0e0e0),
|
|
.futureModal = {
|
|
.futureModal = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
.base_ext2 = {
|
|
.base_ext2 = {
|
|
@@ -3573,6 +3580,8 @@ static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)
|
|
|
|
|
|
if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
|
if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
|
REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias);
|
|
REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias);
|
|
|
|
+ else if (AR_SREV_9480(ah))
|
|
|
|
+ REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
|
|
else {
|
|
else {
|
|
REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
|
|
REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
|
|
REG_RMW_FIELD(ah, AR_CH0_THERM,
|
|
REG_RMW_FIELD(ah, AR_CH0_THERM,
|
|
@@ -3583,6 +3592,19 @@ static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is_2ghz)
|
|
|
|
+{
|
|
|
|
+ struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
|
|
|
+ __le32 val;
|
|
|
|
+
|
|
|
|
+ if (is_2ghz)
|
|
|
|
+ val = eep->modalHeader2G.switchcomspdt;
|
|
|
|
+ else
|
|
|
|
+ val = eep->modalHeader5G.switchcomspdt;
|
|
|
|
+ return le32_to_cpu(val);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
static u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
|
|
static u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
|
|
{
|
|
{
|
|
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
|
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
|
@@ -3637,7 +3659,36 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
|
|
|
|
|
|
u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
|
|
u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
|
|
|
|
|
|
- REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, AR_SWITCH_TABLE_COM_ALL, value);
|
|
|
|
|
|
+ if (AR_SREV_9480(ah)) {
|
|
|
|
+ if (AR_SREV_9480_10(ah)) {
|
|
|
|
+ value &= ~AR_SWITCH_TABLE_COM_SPDT;
|
|
|
|
+ value |= 0x00100000;
|
|
|
|
+ }
|
|
|
|
+ REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
|
|
|
|
+ AR_SWITCH_TABLE_COM_AR9480_ALL, value);
|
|
|
|
+ } else
|
|
|
|
+ REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
|
|
|
|
+ AR_SWITCH_TABLE_COM_ALL, value);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * AR9480 defines new switch table for BT/WLAN,
|
|
|
|
+ * here's new field name in XXX.ref for both 2G and 5G.
|
|
|
|
+ * Register: [GLB_CONTROL] GLB_CONTROL (@0x20044)
|
|
|
|
+ * 15:12 R/W SWITCH_TABLE_COM_SPDT_WLAN_RX
|
|
|
|
+ * SWITCH_TABLE_COM_SPDT_WLAN_RX
|
|
|
|
+ *
|
|
|
|
+ * 11:8 R/W SWITCH_TABLE_COM_SPDT_WLAN_TX
|
|
|
|
+ * SWITCH_TABLE_COM_SPDT_WLAN_TX
|
|
|
|
+ *
|
|
|
|
+ * 7:4 R/W SWITCH_TABLE_COM_SPDT_WLAN_IDLE
|
|
|
|
+ * SWITCH_TABLE_COM_SPDT_WLAN_IDLE
|
|
|
|
+ */
|
|
|
|
+ if (AR_SREV_9480_20_OR_LATER(ah)) {
|
|
|
|
+ value = ar9003_switch_com_spdt_get(ah, is2ghz);
|
|
|
|
+ REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,
|
|
|
|
+ AR_SWITCH_TABLE_COM_SPDT_ALL, value);
|
|
|
|
+ }
|
|
|
|
|
|
value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
|
|
value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
|
|
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
|
|
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
|
|
@@ -3837,6 +3888,7 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
|
|
{
|
|
{
|
|
int internal_regulator =
|
|
int internal_regulator =
|
|
ath9k_hw_ar9300_get_eeprom(ah, EEP_INTERNAL_REGULATOR);
|
|
ath9k_hw_ar9300_get_eeprom(ah, EEP_INTERNAL_REGULATOR);
|
|
|
|
+ u32 reg_val;
|
|
|
|
|
|
if (internal_regulator) {
|
|
if (internal_regulator) {
|
|
if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
|
if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
|
@@ -3881,13 +3933,16 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
|
|
REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
|
|
REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
|
|
if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
|
|
if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
|
|
return;
|
|
return;
|
|
|
|
+ } else if (AR_SREV_9480(ah)) {
|
|
|
|
+ reg_val = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG);
|
|
|
|
+ REG_WRITE(ah, AR_PHY_PMU1, reg_val);
|
|
} else {
|
|
} else {
|
|
/* Internal regulator is ON. Write swreg register. */
|
|
/* Internal regulator is ON. Write swreg register. */
|
|
- int swreg = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG);
|
|
|
|
|
|
+ reg_val = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG);
|
|
REG_WRITE(ah, AR_RTC_REG_CONTROL1,
|
|
REG_WRITE(ah, AR_RTC_REG_CONTROL1,
|
|
REG_READ(ah, AR_RTC_REG_CONTROL1) &
|
|
REG_READ(ah, AR_RTC_REG_CONTROL1) &
|
|
(~AR_RTC_REG_CONTROL1_SWREG_PROGRAM));
|
|
(~AR_RTC_REG_CONTROL1_SWREG_PROGRAM));
|
|
- REG_WRITE(ah, AR_RTC_REG_CONTROL0, swreg);
|
|
|
|
|
|
+ REG_WRITE(ah, AR_RTC_REG_CONTROL0, reg_val);
|
|
/* Set REG_CONTROL1.SWREG_PROGRAM */
|
|
/* Set REG_CONTROL1.SWREG_PROGRAM */
|
|
REG_WRITE(ah, AR_RTC_REG_CONTROL1,
|
|
REG_WRITE(ah, AR_RTC_REG_CONTROL1,
|
|
REG_READ(ah,
|
|
REG_READ(ah,
|
|
@@ -3898,22 +3953,24 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
|
|
if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
|
if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
|
REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0);
|
|
REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0);
|
|
while (REG_READ_FIELD(ah, AR_PHY_PMU2,
|
|
while (REG_READ_FIELD(ah, AR_PHY_PMU2,
|
|
- AR_PHY_PMU2_PGM))
|
|
|
|
|
|
+ AR_PHY_PMU2_PGM))
|
|
udelay(10);
|
|
udelay(10);
|
|
|
|
|
|
REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
|
|
REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
|
|
while (!REG_READ_FIELD(ah, AR_PHY_PMU1,
|
|
while (!REG_READ_FIELD(ah, AR_PHY_PMU1,
|
|
- AR_PHY_PMU1_PWD))
|
|
|
|
|
|
+ AR_PHY_PMU1_PWD))
|
|
udelay(10);
|
|
udelay(10);
|
|
REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0x1);
|
|
REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0x1);
|
|
while (!REG_READ_FIELD(ah, AR_PHY_PMU2,
|
|
while (!REG_READ_FIELD(ah, AR_PHY_PMU2,
|
|
- AR_PHY_PMU2_PGM))
|
|
|
|
|
|
+ AR_PHY_PMU2_PGM))
|
|
udelay(10);
|
|
udelay(10);
|
|
- } else
|
|
|
|
- REG_WRITE(ah, AR_RTC_SLEEP_CLK,
|
|
|
|
- (REG_READ(ah,
|
|
|
|
- AR_RTC_SLEEP_CLK) |
|
|
|
|
- AR_RTC_FORCE_SWREG_PRD));
|
|
|
|
|
|
+ } else if (AR_SREV_9480(ah))
|
|
|
|
+ REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
|
|
|
|
+ else {
|
|
|
|
+ reg_val = REG_READ(ah, AR_RTC_SLEEP_CLK) |
|
|
|
|
+ AR_RTC_FORCE_SWREG_PRD;
|
|
|
|
+ REG_WRITE(ah, AR_RTC_SLEEP_CLK, reg_val);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -4493,6 +4550,12 @@ static int ar9003_hw_power_control_override(struct ath_hw *ah,
|
|
tempSlope = eep->modalHeader5G.tempSlope;
|
|
tempSlope = eep->modalHeader5G.tempSlope;
|
|
|
|
|
|
REG_RMW_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM, tempSlope);
|
|
REG_RMW_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM, tempSlope);
|
|
|
|
+
|
|
|
|
+ if (AR_SREV_9480_20(ah))
|
|
|
|
+ REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
|
|
|
|
+ AR_PHY_TPC_19_B1_ALPHA_THERM, tempSlope);
|
|
|
|
+
|
|
|
|
+
|
|
REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE,
|
|
REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE,
|
|
temperature[0]);
|
|
temperature[0]);
|
|
|
|
|