mac80211: add initial support for AR9330
SVN-Revision: 27084
This commit is contained in:
parent
750af1522b
commit
9769854aae
33 changed files with 3758 additions and 1 deletions
|
@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2011-05-27
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_MD5SUM:=3a382b03333aff304dbe8ee94fce6b5a
|
||||
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index 1be7c8b..05c2ba2 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -551,6 +551,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||
case AR_SREV_VERSION_9287:
|
||||
case AR_SREV_VERSION_9271:
|
||||
case AR_SREV_VERSION_9300:
|
||||
+ case AR_SREV_VERSION_9330:
|
||||
case AR_SREV_VERSION_9485:
|
||||
case AR_SREV_VERSION_9340:
|
||||
break;
|
||||
@@ -561,7 +562,8 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
- if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
|
||||
+ AR_SREV_9330(ah))
|
||||
ah->is_pciexpress = false;
|
||||
|
||||
ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
|
||||
@@ -2574,6 +2576,7 @@ static struct {
|
||||
{ AR_SREV_VERSION_9287, "9287" },
|
||||
{ AR_SREV_VERSION_9271, "9271" },
|
||||
{ AR_SREV_VERSION_9300, "9300" },
|
||||
+ { AR_SREV_VERSION_9330, "9330" },
|
||||
{ AR_SREV_VERSION_9485, "9485" },
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
|
||||
index c18ee99..a483388 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/reg.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/reg.h
|
||||
@@ -788,6 +788,10 @@
|
||||
#define AR_SREV_REVISION_9271_11 1
|
||||
#define AR_SREV_VERSION_9300 0x1c0
|
||||
#define AR_SREV_REVISION_9300_20 2 /* 2.0 and 2.1 */
|
||||
+#define AR_SREV_VERSION_9330 0x200
|
||||
+#define AR_SREV_REVISION_9330_10 0
|
||||
+#define AR_SREV_REVISION_9330_11 1
|
||||
+#define AR_SREV_REVISION_9330_12 2
|
||||
#define AR_SREV_VERSION_9485 0x240
|
||||
#define AR_SREV_REVISION_9485_10 0
|
||||
#define AR_SREV_REVISION_9485_11 1
|
||||
@@ -862,6 +866,18 @@
|
||||
#define AR_SREV_9300_20_OR_LATER(_ah) \
|
||||
((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9300)
|
||||
|
||||
+#define AR_SREV_9330(_ah) \
|
||||
+ (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9330))
|
||||
+#define AR_SREV_9330_10(_ah) \
|
||||
+ (AR_SREV_9330((_ah)) && \
|
||||
+ ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_10))
|
||||
+#define AR_SREV_9330_11(_ah) \
|
||||
+ (AR_SREV_9330((_ah)) && \
|
||||
+ ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_11))
|
||||
+#define AR_SREV_9330_12(_ah) \
|
||||
+ (AR_SREV_9330((_ah)) && \
|
||||
+ ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_12))
|
||||
+
|
||||
#define AR_SREV_9485(_ah) \
|
||||
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9485))
|
||||
#define AR_SREV_9485_10(_ah) \
|
|
@ -0,0 +1,12 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
index 4b157c5..9f23451 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -45,6 +45,7 @@
|
||||
#define AR9300_DEVID_PCIE 0x0030
|
||||
#define AR9300_DEVID_AR9340 0x0031
|
||||
#define AR9300_DEVID_AR9485_PCIE 0x0032
|
||||
+#define AR9300_DEVID_AR9330 0x0035
|
||||
|
||||
#define AR5416_AR9100_DEVID 0x000b
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index 05c2ba2..ade8655 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -251,6 +251,15 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
|
||||
case AR5416_AR9100_DEVID:
|
||||
ah->hw_version.macVersion = AR_SREV_VERSION_9100;
|
||||
break;
|
||||
+ case AR9300_DEVID_AR9330:
|
||||
+ ah->hw_version.macVersion = AR_SREV_VERSION_9330;
|
||||
+ if (ah->get_mac_revision) {
|
||||
+ ah->hw_version.macRev = ah->get_mac_revision();
|
||||
+ } else {
|
||||
+ val = REG_READ(ah, AR_SREV);
|
||||
+ ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
|
||||
+ }
|
||||
+ return;
|
||||
case AR9300_DEVID_AR9340:
|
||||
ah->hw_version.macVersion = AR_SREV_VERSION_9340;
|
||||
val = REG_READ(ah, AR_SREV);
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
index 9f23451..8d9ac49 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -863,6 +863,7 @@ struct ath_hw {
|
||||
u32 ent_mode;
|
||||
|
||||
bool is_clk_25mhz;
|
||||
+ int (*get_mac_revision)(void);
|
||||
};
|
||||
|
||||
struct ath_bus_ops {
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
|
||||
index 45c585a..c2defa2 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -575,6 +575,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
|
||||
sc->sc_ah->gpio_val = pdata->gpio_val;
|
||||
sc->sc_ah->led_pin = pdata->led_pin;
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
+ ah->get_mac_revision = pdata->get_mac_revision;
|
||||
}
|
||||
|
||||
common = ath9k_hw_common(ah);
|
||||
diff --git a/include/linux/ath9k_platform.h b/include/linux/ath9k_platform.h
|
||||
index 60a7c49..c207607 100644
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -30,6 +30,7 @@ struct ath9k_platform_data {
|
||||
u32 gpio_val;
|
||||
|
||||
bool is_clk_25mhz;
|
||||
+ int (*get_mac_revision)(void);
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
index 5b49cd0..0b36fcf 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
@@ -27,6 +27,10 @@ static const struct platform_device_id ath9k_platform_id_table[] = {
|
||||
.driver_data = AR5416_AR9100_DEVID,
|
||||
},
|
||||
{
|
||||
+ .name = "ar933x_wmac",
|
||||
+ .driver_data = AR9300_DEVID_AR9330,
|
||||
+ },
|
||||
+ {
|
||||
.name = "ar934x_wmac",
|
||||
.driver_data = AR9300_DEVID_AR9340,
|
||||
},
|
2551
package/mac80211/patches/544-ath9k-add-AR9330-initvals.patch
Normal file
2551
package/mac80211/patches/544-ath9k-add-AR9330-initvals.patch
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,142 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
index 392bf0f..dc0ad4a 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
@@ -19,6 +19,8 @@
|
||||
#include "ar9003_2p2_initvals.h"
|
||||
#include "ar9485_initvals.h"
|
||||
#include "ar9340_initvals.h"
|
||||
+#include "ar9330_1p1_initvals.h"
|
||||
+#include "ar9330_1p2_initvals.h"
|
||||
|
||||
/* General hardware code for the AR9003 hadware family */
|
||||
|
||||
@@ -29,7 +31,113 @@
|
||||
*/
|
||||
static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
|
||||
{
|
||||
- if (AR_SREV_9340(ah)) {
|
||||
+ if (AR_SREV_9330_11(ah)) {
|
||||
+ /* mac */
|
||||
+ INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
|
||||
+ ar9331_1p1_mac_core,
|
||||
+ ARRAY_SIZE(ar9331_1p1_mac_core), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
|
||||
+ ar9331_1p1_mac_postamble,
|
||||
+ ARRAY_SIZE(ar9331_1p1_mac_postamble), 5);
|
||||
+
|
||||
+ /* bb */
|
||||
+ INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
|
||||
+ ar9331_1p1_baseband_core,
|
||||
+ ARRAY_SIZE(ar9331_1p1_baseband_core), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
|
||||
+ ar9331_1p1_baseband_postamble,
|
||||
+ ARRAY_SIZE(ar9331_1p1_baseband_postamble), 5);
|
||||
+
|
||||
+ /* radio */
|
||||
+ INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
|
||||
+ ar9331_1p1_radio_core,
|
||||
+ ARRAY_SIZE(ar9331_1p1_radio_core), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], NULL, 0, 0);
|
||||
+
|
||||
+ /* soc */
|
||||
+ INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
|
||||
+ ar9331_1p1_soc_preamble,
|
||||
+ ARRAY_SIZE(ar9331_1p1_soc_preamble), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
|
||||
+ ar9331_1p1_soc_postamble,
|
||||
+ ARRAY_SIZE(ar9331_1p1_soc_postamble), 2);
|
||||
+
|
||||
+ /* rx/tx gain */
|
||||
+ INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
+ ar9331_common_rx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_common_rx_gain_1p1), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_lowest_ob_db_tx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p1),
|
||||
+ 5);
|
||||
+
|
||||
+ /* additional clock settings */
|
||||
+ if (ah->is_clk_25mhz)
|
||||
+ INIT_INI_ARRAY(&ah->iniModesAdditional,
|
||||
+ ar9331_1p1_xtal_25M,
|
||||
+ ARRAY_SIZE(ar9331_1p1_xtal_25M), 2);
|
||||
+ else
|
||||
+ INIT_INI_ARRAY(&ah->iniModesAdditional,
|
||||
+ ar9331_1p1_xtal_40M,
|
||||
+ ARRAY_SIZE(ar9331_1p1_xtal_40M), 2);
|
||||
+ } else if (AR_SREV_9330_12(ah)) {
|
||||
+ /* mac */
|
||||
+ INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
|
||||
+ ar9331_1p2_mac_core,
|
||||
+ ARRAY_SIZE(ar9331_1p2_mac_core), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
|
||||
+ ar9331_1p2_mac_postamble,
|
||||
+ ARRAY_SIZE(ar9331_1p2_mac_postamble), 5);
|
||||
+
|
||||
+ /* bb */
|
||||
+ INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
|
||||
+ ar9331_1p2_baseband_core,
|
||||
+ ARRAY_SIZE(ar9331_1p2_baseband_core), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
|
||||
+ ar9331_1p2_baseband_postamble,
|
||||
+ ARRAY_SIZE(ar9331_1p2_baseband_postamble), 5);
|
||||
+
|
||||
+ /* radio */
|
||||
+ INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
|
||||
+ ar9331_1p2_radio_core,
|
||||
+ ARRAY_SIZE(ar9331_1p2_radio_core), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], NULL, 0, 0);
|
||||
+
|
||||
+ /* soc */
|
||||
+ INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
|
||||
+ ar9331_1p2_soc_preamble,
|
||||
+ ARRAY_SIZE(ar9331_1p2_soc_preamble), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
|
||||
+ INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
|
||||
+ ar9331_1p2_soc_postamble,
|
||||
+ ARRAY_SIZE(ar9331_1p2_soc_postamble), 2);
|
||||
+
|
||||
+ /* rx/tx gain */
|
||||
+ INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
+ ar9331_common_rx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_common_rx_gain_1p2), 2);
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_lowest_ob_db_tx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p2),
|
||||
+ 5);
|
||||
+
|
||||
+ /* additional clock settings */
|
||||
+ if (ah->is_clk_25mhz)
|
||||
+ INIT_INI_ARRAY(&ah->iniModesAdditional,
|
||||
+ ar9331_1p2_xtal_25M,
|
||||
+ ARRAY_SIZE(ar9331_1p2_xtal_25M), 2);
|
||||
+ else
|
||||
+ INIT_INI_ARRAY(&ah->iniModesAdditional,
|
||||
+ ar9331_1p2_xtal_40M,
|
||||
+ ARRAY_SIZE(ar9331_1p2_xtal_40M), 2);
|
||||
+ } else if (AR_SREV_9340(ah)) {
|
||||
/* mac */
|
||||
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
|
||||
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index 892c48b..48893f1 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -659,6 +659,9 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,
|
||||
REG_WRITE_ARRAY(&ah->iniModesAdditional,
|
||||
modesIndex, regWrites);
|
||||
|
||||
+ if (AR_SREV_9300(ah))
|
||||
+ REG_WRITE_ARRAY(&ah->iniModesAdditional, 1, regWrites);
|
||||
+
|
||||
if (AR_SREV_9340(ah) && !ah->is_clk_25mhz)
|
||||
REG_WRITE_ARRAY(&ah->iniModesAdditional_40M, 1, regWrites);
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
index dc0ad4a..264a7ea 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
@@ -328,7 +328,17 @@ static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
|
||||
switch (ar9003_hw_get_tx_gain_idx(ah)) {
|
||||
case 0:
|
||||
default:
|
||||
- if (AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9330_12(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_lowest_ob_db_tx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p2),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9330_11(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_lowest_ob_db_tx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p1),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9340(ah))
|
||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
|
||||
ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
|
||||
@@ -345,7 +355,17 @@ static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
|
||||
5);
|
||||
break;
|
||||
case 1:
|
||||
- if (AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9330_12(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_high_ob_db_tx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_modes_high_ob_db_tx_gain_1p2),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9330_11(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_high_ob_db_tx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_modes_high_ob_db_tx_gain_1p1),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9340(ah))
|
||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
|
||||
ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
|
||||
@@ -362,7 +382,17 @@ static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
|
||||
5);
|
||||
break;
|
||||
case 2:
|
||||
- if (AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9330_12(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_low_ob_db_tx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_modes_low_ob_db_tx_gain_1p2),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9330_11(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_low_ob_db_tx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_modes_low_ob_db_tx_gain_1p1),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9340(ah))
|
||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
|
||||
ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
|
||||
@@ -379,7 +409,17 @@ static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
|
||||
5);
|
||||
break;
|
||||
case 3:
|
||||
- if (AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9330_12(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_high_power_tx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_modes_high_power_tx_gain_1p2),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9330_11(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
+ ar9331_modes_high_power_tx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_modes_high_power_tx_gain_1p1),
|
||||
+ 5);
|
||||
+ else if (AR_SREV_9340(ah))
|
||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||
ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
|
||||
ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
index 264a7ea..8efdec2 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
|
||||
@@ -443,7 +443,17 @@ static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
|
||||
switch (ar9003_hw_get_rx_gain_idx(ah)) {
|
||||
case 0:
|
||||
default:
|
||||
- if (AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9330_12(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
+ ar9331_common_rx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_common_rx_gain_1p2),
|
||||
+ 2);
|
||||
+ else if (AR_SREV_9330_11(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
+ ar9331_common_rx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_common_rx_gain_1p1),
|
||||
+ 2);
|
||||
+ else if (AR_SREV_9340(ah))
|
||||
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
ar9340Common_rx_gain_table_1p0,
|
||||
ARRAY_SIZE(ar9340Common_rx_gain_table_1p0),
|
||||
@@ -460,7 +470,17 @@ static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
|
||||
2);
|
||||
break;
|
||||
case 1:
|
||||
- if (AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9330_12(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
+ ar9331_common_wo_xlna_rx_gain_1p2,
|
||||
+ ARRAY_SIZE(ar9331_common_wo_xlna_rx_gain_1p2),
|
||||
+ 2);
|
||||
+ else if (AR_SREV_9330_11(ah))
|
||||
+ INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
+ ar9331_common_wo_xlna_rx_gain_1p1,
|
||||
+ ARRAY_SIZE(ar9331_common_wo_xlna_rx_gain_1p1),
|
||||
+ 2);
|
||||
+ else if (AR_SREV_9340(ah))
|
||||
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||
ar9340Common_wo_xlna_rx_gain_table_1p0,
|
||||
ARRAY_SIZE(ar9340Common_wo_xlna_rx_gain_table_1p0),
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index ade8655..826ed5d 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -733,6 +733,39 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
|
||||
REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
|
||||
AR_CH0_BB_DPLL2_PLL_PWD, 0x0);
|
||||
udelay(1000);
|
||||
+ } else if (AR_SREV_9330(ah)) {
|
||||
+ u32 ddr_dpll2, pll_control2, kd;
|
||||
+
|
||||
+ if (ah->is_clk_25mhz) {
|
||||
+ ddr_dpll2 = 0x18e82f01;
|
||||
+ pll_control2 = 0xe04a3d;
|
||||
+ kd = 0x1d;
|
||||
+ } else {
|
||||
+ ddr_dpll2 = 0x19e82f01;
|
||||
+ pll_control2 = 0x886666;
|
||||
+ kd = 0x3d;
|
||||
+ }
|
||||
+
|
||||
+ /* program DDR PLL ki and kd value */
|
||||
+ REG_WRITE(ah, AR_CH0_DDR_DPLL2, ddr_dpll2);
|
||||
+
|
||||
+ /* program DDR PLL phase_shift */
|
||||
+ REG_RMW_FIELD(ah, AR_CH0_DDR_DPLL3,
|
||||
+ AR_CH0_DPLL3_PHASE_SHIFT, 0x1);
|
||||
+
|
||||
+ REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c);
|
||||
+ udelay(1000);
|
||||
+
|
||||
+ /* program refdiv, nint, frac to RTC register */
|
||||
+ REG_WRITE(ah, AR_RTC_PLL_CONTROL2, pll_control2);
|
||||
+
|
||||
+ /* program BB PLL kd and ki value */
|
||||
+ REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2, AR_CH0_DPLL2_KD, kd);
|
||||
+ REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2, AR_CH0_DPLL2_KI, 0x06);
|
||||
+
|
||||
+ /* program BB PLL phase_shift */
|
||||
+ REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
|
||||
+ AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x1);
|
||||
} else if (AR_SREV_9340(ah)) {
|
||||
u32 regval, pll2_divint, pll2_divfrac, refdiv;
|
||||
|
||||
@@ -774,7 +807,7 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
|
||||
|
||||
REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
|
||||
|
||||
- if (AR_SREV_9485(ah) || AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah))
|
||||
udelay(1000);
|
||||
|
||||
/* Switch the core clock for ar9271 to 117Mhz */
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index 826ed5d..f53a3bf 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -615,7 +615,10 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||
else
|
||||
ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
|
||||
|
||||
- ah->bb_watchdog_timeout_ms = 25;
|
||||
+ if (AR_SREV_9330(ah))
|
||||
+ ah->bb_watchdog_timeout_ms = 85;
|
||||
+ else
|
||||
+ ah->bb_watchdog_timeout_ms = 25;
|
||||
|
||||
common->state = ATH_HW_INITIALIZED;
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index f53a3bf..6315e7d 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2030,7 +2030,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
|
||||
|
||||
if (AR_SREV_9300_20_OR_LATER(ah)) {
|
||||
pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_FASTCLOCK;
|
||||
- if (!AR_SREV_9485(ah))
|
||||
+ if (!AR_SREV_9330(ah) && !AR_SREV_9485(ah))
|
||||
pCap->hw_caps |= ATH9K_HW_CAP_LDPC;
|
||||
|
||||
pCap->rx_hp_qdepth = ATH9K_HW_RX_HP_QDEPTH;
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index 48893f1..2df72cb 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -168,7 +168,7 @@ static void ar9003_hw_spur_mitigate_mrc_cck(struct ath_hw *ah,
|
||||
* is out-of-band and can be ignored.
|
||||
*/
|
||||
|
||||
- if (AR_SREV_9485(ah) || AR_SREV_9340(ah)) {
|
||||
+ if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah)) {
|
||||
spur_fbin_ptr = ar9003_get_spur_chan_ptr(ah,
|
||||
IS_CHAN_2GHZ(chan));
|
||||
if (spur_fbin_ptr[0] == 0) /* No spur */
|
||||
@@ -193,7 +193,7 @@ static void ar9003_hw_spur_mitigate_mrc_cck(struct ath_hw *ah,
|
||||
|
||||
for (i = 0; i < max_spur_cnts; i++) {
|
||||
negative = 0;
|
||||
- if (AR_SREV_9485(ah) || AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah))
|
||||
cur_bb_spur = FBIN2FREQ(spur_fbin_ptr[i],
|
||||
IS_CHAN_2GHZ(chan)) - synth_freq;
|
||||
else
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index 2df72cb..1194eeb 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -104,7 +104,7 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
u32 chan_frac;
|
||||
|
||||
channelSel = (freq * 2) / 75;
|
||||
- chan_frac = ((freq % 75) * 0x20000) / 75;
|
||||
+ chan_frac = (((freq * 2) % 75) * 0x20000) / 75;
|
||||
channelSel = (channelSel << 17) | chan_frac;
|
||||
} else {
|
||||
channelSel = CHANSEL_5G(freq);
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index 1194eeb..a0ca1eb 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -75,7 +75,19 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
freq = centers.synth_center;
|
||||
|
||||
if (freq < 4800) { /* 2 GHz, fractional mode */
|
||||
- if (AR_SREV_9485(ah)) {
|
||||
+ if (AR_SREV_9330(ah)) {
|
||||
+ u32 chan_frac;
|
||||
+ u32 div;
|
||||
+
|
||||
+ if (ah->is_clk_25mhz)
|
||||
+ div = 75;
|
||||
+ else
|
||||
+ div = 120;
|
||||
+
|
||||
+ channelSel = (freq * 4) / div;
|
||||
+ chan_frac = (((freq * 4) % div) * 0x20000) / div;
|
||||
+ channelSel = (channelSel << 17) | chan_frac;
|
||||
+ } else if (AR_SREV_9485(ah)) {
|
||||
u32 chan_frac;
|
||||
|
||||
/*
|
|
@ -0,0 +1,14 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index 6315e7d..a35af90 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1592,7 +1592,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
|
||||
}
|
||||
#ifdef __BIG_ENDIAN
|
||||
- else if (AR_SREV_9340(ah))
|
||||
+ else if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);
|
||||
else
|
||||
REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
index 729534c..6021186 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3795,7 +3795,7 @@ static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
|
||||
ar9003_hw_ant_ctrl_apply(ah, IS_CHAN_2GHZ(chan));
|
||||
ar9003_hw_drive_strength_apply(ah);
|
||||
ar9003_hw_atten_apply(ah, chan);
|
||||
- if (!AR_SREV_9340(ah))
|
||||
+ if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah))
|
||||
ar9003_hw_internal_regulator_apply(ah);
|
||||
if (AR_SREV_9485(ah) || AR_SREV_9340(ah))
|
||||
ar9003_hw_apply_tuning_caps(ah);
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
index 6021186..dd09cae 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3797,7 +3797,7 @@ static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
|
||||
ar9003_hw_atten_apply(ah, chan);
|
||||
if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah))
|
||||
ar9003_hw_internal_regulator_apply(ah);
|
||||
- if (AR_SREV_9485(ah) || AR_SREV_9340(ah))
|
||||
+ if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
ar9003_hw_apply_tuning_caps(ah);
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
index dd09cae..d7741d2 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3324,6 +3324,8 @@ static int ar9300_eeprom_restore_internal(struct ath_hw *ah,
|
||||
read = ar9300_read_eeprom;
|
||||
if (AR_SREV_9485(ah))
|
||||
cptr = AR9300_BASE_ADDR_4K;
|
||||
+ else if (AR_SREV_9330(ah))
|
||||
+ cptr = AR9300_BASE_ADDR_512;
|
||||
else
|
||||
cptr = AR9300_BASE_ADDR;
|
||||
ath_dbg(common, ATH_DBG_EEPROM,
|
|
@ -0,0 +1,14 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
index d7741d2..b3351f6 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3444,7 +3444,7 @@ static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)
|
||||
{
|
||||
int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz);
|
||||
|
||||
- if (AR_SREV_9485(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);
|
||||
else {
|
||||
REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index a0ca1eb..eb18b63 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -1089,7 +1089,10 @@ static void ar9003_hw_set_nf_limits(struct ath_hw *ah)
|
||||
{
|
||||
ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ;
|
||||
ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ;
|
||||
- ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9300_2GHZ;
|
||||
+ if (AR_SREV_9330(ah))
|
||||
+ ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9330_2GHZ;
|
||||
+ else
|
||||
+ ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9300_2GHZ;
|
||||
ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ;
|
||||
ah->nf_5g.min = AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ;
|
||||
ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9300_5GHZ;
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
index 443090d..d259278 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
@@ -332,6 +332,8 @@
|
||||
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ -95
|
||||
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ -100
|
||||
|
||||
+#define AR_PHY_CCA_NOM_VAL_9330_2GHZ -118
|
||||
+
|
||||
/*
|
||||
* AGC Field Definitions
|
||||
*/
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index a35af90..323b6ab 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2072,7 +2072,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
|
||||
}
|
||||
|
||||
|
||||
- if (AR_SREV_9485(ah)) {
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
||||
ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
|
||||
/*
|
||||
* enable the diversity-combining algorithm only when
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
|
||||
index c2defa2..5ffabb9 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -245,7 +245,7 @@ static void setup_ht_cap(struct ath_softc *sc,
|
||||
ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
||||
ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
|
||||
|
||||
- if (AR_SREV_9485(ah))
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9485(ah))
|
||||
max_streams = 1;
|
||||
else if (AR_SREV_9300_20_OR_LATER(ah))
|
||||
max_streams = 3;
|
|
@ -0,0 +1,12 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
index 07e35e5..d0af2f2 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -39,6 +39,7 @@ static inline bool ath_ant_div_comb_alt_check(u8 div_group, int alt_ratio,
|
||||
result = true;
|
||||
break;
|
||||
case 1:
|
||||
+ case 2:
|
||||
if ((((curr_main_set == ATH_ANT_DIV_COMB_LNA2) &&
|
||||
(curr_alt_set == ATH_ANT_DIV_COMB_LNA1) &&
|
||||
(alt_rssi_avg >= (main_rssi_avg - 5))) ||
|
|
@ -0,0 +1,21 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index eb18b63..b9f0b27 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -1214,8 +1214,14 @@ static void ar9003_hw_antdiv_comb_conf_get(struct ath_hw *ah,
|
||||
AR_PHY_9485_ANT_DIV_ALT_LNACONF_S;
|
||||
antconf->fast_div_bias = (regval & AR_PHY_9485_ANT_FAST_DIV_BIAS) >>
|
||||
AR_PHY_9485_ANT_FAST_DIV_BIAS_S;
|
||||
- antconf->lna1_lna2_delta = -9;
|
||||
- antconf->div_group = 2;
|
||||
+
|
||||
+ if (AR_SREV_9485(ah)) {
|
||||
+ antconf->lna1_lna2_delta = -9;
|
||||
+ antconf->div_group = 2;
|
||||
+ } else {
|
||||
+ antconf->lna1_lna2_delta = -3;
|
||||
+ antconf->div_group = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void ar9003_hw_antdiv_comb_conf_set(struct ath_hw *ah,
|
|
@ -0,0 +1,201 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
index d0af2f2..99f55b3 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -1076,39 +1076,39 @@ static void ath_lnaconf_alt_good_scan(struct ath_ant_comb *antcomb,
|
||||
antcomb->rssi_lna1 = main_rssi_avg;
|
||||
|
||||
switch ((ant_conf.main_lna_conf << 4) | ant_conf.alt_lna_conf) {
|
||||
- case (0x10): /* LNA2 A-B */
|
||||
+ case 0x10: /* LNA2 A-B */
|
||||
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
|
||||
antcomb->first_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
|
||||
antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1;
|
||||
break;
|
||||
- case (0x20): /* LNA1 A-B */
|
||||
+ case 0x20: /* LNA1 A-B */
|
||||
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
|
||||
antcomb->first_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
|
||||
antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2;
|
||||
break;
|
||||
- case (0x21): /* LNA1 LNA2 */
|
||||
+ case 0x21: /* LNA1 LNA2 */
|
||||
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA2;
|
||||
antcomb->first_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
|
||||
antcomb->second_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
|
||||
break;
|
||||
- case (0x12): /* LNA2 LNA1 */
|
||||
+ case 0x12: /* LNA2 LNA1 */
|
||||
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1;
|
||||
antcomb->first_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
|
||||
antcomb->second_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
|
||||
break;
|
||||
- case (0x13): /* LNA2 A+B */
|
||||
+ case 0x13: /* LNA2 A+B */
|
||||
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
|
||||
antcomb->first_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
|
||||
antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1;
|
||||
break;
|
||||
- case (0x23): /* LNA1 A+B */
|
||||
+ case 0x23: /* LNA1 A+B */
|
||||
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
|
||||
antcomb->first_quick_scan_conf =
|
||||
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
|
||||
@@ -1325,40 +1325,40 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
/* Adjust the fast_div_bias based on main and alt lna conf */
|
||||
switch ((ant_conf->main_lna_conf << 4) |
|
||||
ant_conf->alt_lna_conf) {
|
||||
- case (0x01): /* A-B LNA2 */
|
||||
+ case 0x01: /* A-B LNA2 */
|
||||
ant_conf->fast_div_bias = 0x3b;
|
||||
break;
|
||||
- case (0x02): /* A-B LNA1 */
|
||||
+ case 0x02: /* A-B LNA1 */
|
||||
ant_conf->fast_div_bias = 0x3d;
|
||||
break;
|
||||
- case (0x03): /* A-B A+B */
|
||||
+ case 0x03: /* A-B A+B */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
break;
|
||||
- case (0x10): /* LNA2 A-B */
|
||||
+ case 0x10: /* LNA2 A-B */
|
||||
ant_conf->fast_div_bias = 0x7;
|
||||
break;
|
||||
- case (0x12): /* LNA2 LNA1 */
|
||||
+ case 0x12: /* LNA2 LNA1 */
|
||||
ant_conf->fast_div_bias = 0x2;
|
||||
break;
|
||||
- case (0x13): /* LNA2 A+B */
|
||||
+ case 0x13: /* LNA2 A+B */
|
||||
ant_conf->fast_div_bias = 0x7;
|
||||
break;
|
||||
- case (0x20): /* LNA1 A-B */
|
||||
+ case 0x20: /* LNA1 A-B */
|
||||
ant_conf->fast_div_bias = 0x6;
|
||||
break;
|
||||
- case (0x21): /* LNA1 LNA2 */
|
||||
+ case 0x21: /* LNA1 LNA2 */
|
||||
ant_conf->fast_div_bias = 0x0;
|
||||
break;
|
||||
- case (0x23): /* LNA1 A+B */
|
||||
+ case 0x23: /* LNA1 A+B */
|
||||
ant_conf->fast_div_bias = 0x6;
|
||||
break;
|
||||
- case (0x30): /* A+B A-B */
|
||||
+ case 0x30: /* A+B A-B */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
break;
|
||||
- case (0x31): /* A+B LNA2 */
|
||||
+ case 0x31: /* A+B LNA2 */
|
||||
ant_conf->fast_div_bias = 0x3b;
|
||||
break;
|
||||
- case (0x32): /* A+B LNA1 */
|
||||
+ case 0x32: /* A+B LNA1 */
|
||||
ant_conf->fast_div_bias = 0x3d;
|
||||
break;
|
||||
default:
|
||||
@@ -1368,22 +1368,22 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
/* Adjust the fast_div_bias based on main and alt_lna_conf */
|
||||
switch ((ant_conf->main_lna_conf << 4) |
|
||||
ant_conf->alt_lna_conf) {
|
||||
- case (0x01): /* A-B LNA2 */
|
||||
+ case 0x01: /* A-B LNA2 */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x02): /* A-B LNA1 */
|
||||
+ case 0x02: /* A-B LNA1 */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x03): /* A-B A+B */
|
||||
+ case 0x03: /* A-B A+B */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x10): /* LNA2 A-B */
|
||||
+ case 0x10: /* LNA2 A-B */
|
||||
if (!(antcomb->scan) &&
|
||||
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
@@ -1392,12 +1392,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x12): /* LNA2 LNA1 */
|
||||
+ case 0x12: /* LNA2 LNA1 */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x13): /* LNA2 A+B */
|
||||
+ case 0x13: /* LNA2 A+B */
|
||||
if (!(antcomb->scan) &&
|
||||
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
@@ -1406,7 +1406,7 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x20): /* LNA1 A-B */
|
||||
+ case 0x20: /* LNA1 A-B */
|
||||
if (!(antcomb->scan) &&
|
||||
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
@@ -1415,12 +1415,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x21): /* LNA1 LNA2 */
|
||||
+ case 0x21: /* LNA1 LNA2 */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x23): /* LNA1 A+B */
|
||||
+ case 0x23: /* LNA1 A+B */
|
||||
if (!(antcomb->scan) &&
|
||||
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
@@ -1429,17 +1429,17 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x30): /* A+B A-B */
|
||||
+ case 0x30: /* A+B A-B */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x31): /* A+B LNA2 */
|
||||
+ case 0x31: /* A+B LNA2 */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
break;
|
||||
- case (0x32): /* A+B LNA1 */
|
||||
+ case 0x32: /* A+B LNA1 */
|
||||
ant_conf->fast_div_bias = 0x1;
|
||||
ant_conf->main_gaintb = 0;
|
||||
ant_conf->alt_gaintb = 0;
|
||||
@@ -1447,9 +1447,7 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
-
|
||||
}
|
||||
-
|
||||
}
|
||||
|
||||
/* Antenna diversity and combining */
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
index 99f55b3..80bb04f 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -1364,6 +1364,89 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
+ } else if (ant_conf->div_group == 1) {
|
||||
+ /* Adjust the fast_div_bias based on main and alt_lna_conf */
|
||||
+ switch ((ant_conf->main_lna_conf << 4) |
|
||||
+ ant_conf->alt_lna_conf) {
|
||||
+ case 0x01: /* A-B LNA2 */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x02: /* A-B LNA1 */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x03: /* A-B A+B */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x10: /* LNA2 A-B */
|
||||
+ if (!(antcomb->scan) &&
|
||||
+ (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
+ ant_conf->fast_div_bias = 0x3f;
|
||||
+ else
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x12: /* LNA2 LNA1 */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x13: /* LNA2 A+B */
|
||||
+ if (!(antcomb->scan) &&
|
||||
+ (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
+ ant_conf->fast_div_bias = 0x3f;
|
||||
+ else
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x20: /* LNA1 A-B */
|
||||
+ if (!(antcomb->scan) &&
|
||||
+ (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
+ ant_conf->fast_div_bias = 0x3f;
|
||||
+ else
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x21: /* LNA1 LNA2 */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x23: /* LNA1 A+B */
|
||||
+ if (!(antcomb->scan) &&
|
||||
+ (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
|
||||
+ ant_conf->fast_div_bias = 0x3f;
|
||||
+ else
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x30: /* A+B A-B */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x31: /* A+B LNA2 */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ case 0x32: /* A+B LNA1 */
|
||||
+ ant_conf->fast_div_bias = 0x1;
|
||||
+ ant_conf->main_gaintb = 0;
|
||||
+ ant_conf->alt_gaintb = 0;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
} else if (ant_conf->div_group == 2) {
|
||||
/* Adjust the fast_div_bias based on main and alt_lna_conf */
|
||||
switch ((ant_conf->main_lna_conf << 4) |
|
|
@ -0,0 +1,17 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
index b9f0b27..d9117bd 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -1215,7 +1215,10 @@ static void ar9003_hw_antdiv_comb_conf_get(struct ath_hw *ah,
|
||||
antconf->fast_div_bias = (regval & AR_PHY_9485_ANT_FAST_DIV_BIAS) >>
|
||||
AR_PHY_9485_ANT_FAST_DIV_BIAS_S;
|
||||
|
||||
- if (AR_SREV_9485(ah)) {
|
||||
+ if (AR_SREV_9330_11(ah)) {
|
||||
+ antconf->lna1_lna2_delta = -9;
|
||||
+ antconf->div_group = 1;
|
||||
+ } else if (AR_SREV_9485(ah)) {
|
||||
antconf->lna1_lna2_delta = -9;
|
||||
antconf->div_group = 2;
|
||||
} else {
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
index d259278..9eb3aa2 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
@@ -625,11 +625,11 @@
|
||||
#define AR_PHY_65NM_CH2_RXTX1 0x16900
|
||||
#define AR_PHY_65NM_CH2_RXTX2 0x16904
|
||||
|
||||
-#define AR_CH0_TOP2 (AR_SREV_9485(ah) ? 0x00016284 : 0x0001628c)
|
||||
+#define AR_CH0_TOP2 (AR_SREV_9300(ah) ? 0x1628c : 0x16284)
|
||||
#define AR_CH0_TOP2_XPABIASLVL 0xf000
|
||||
#define AR_CH0_TOP2_XPABIASLVL_S 12
|
||||
|
||||
-#define AR_CH0_XTAL (AR_SREV_9485(ah) ? 0x16290 : 0x16294)
|
||||
+#define AR_CH0_XTAL (AR_SREV_9300(ah) ? 0x16294 : 0x16290)
|
||||
#define AR_CH0_XTAL_CAPINDAC 0x7f000000
|
||||
#define AR_CH0_XTAL_CAPINDAC_S 24
|
||||
#define AR_CH0_XTAL_CAPOUTDAC 0x00fe0000
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
index b3351f6..ffdfa6d 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3525,7 +3525,7 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
|
||||
}
|
||||
}
|
||||
|
||||
- if (AR_SREV_9485(ah)) {
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
||||
value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1);
|
||||
/*
|
||||
* main_lnaconf, alt_lnaconf, main_tb, alt_tb
|
|
@ -0,0 +1,50 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
index ffdfa6d..963dc9b 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3712,7 +3712,7 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
|
||||
ath9k_hw_ar9300_get_eeprom(ah, EEP_INTERNAL_REGULATOR);
|
||||
|
||||
if (internal_regulator) {
|
||||
- if (AR_SREV_9485(ah)) {
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
|
||||
int reg_pmu_set;
|
||||
|
||||
reg_pmu_set = REG_READ(ah, AR_PHY_PMU2) & ~AR_PHY_PMU2_PGM;
|
||||
@@ -3720,9 +3720,24 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
|
||||
if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
|
||||
return;
|
||||
|
||||
- reg_pmu_set = (5 << 1) | (7 << 4) | (1 << 8) |
|
||||
- (2 << 14) | (6 << 17) | (1 << 20) |
|
||||
- (3 << 24) | (1 << 28);
|
||||
+ if (AR_SREV_9330(ah)) {
|
||||
+ if (ah->is_clk_25mhz) {
|
||||
+ reg_pmu_set = (3 << 1) | (8 << 4) |
|
||||
+ (3 << 8) | (1 << 14) |
|
||||
+ (6 << 17) | (1 << 20) |
|
||||
+ (3 << 24);
|
||||
+ } else {
|
||||
+ reg_pmu_set = (4 << 1) | (7 << 4) |
|
||||
+ (3 << 8) | (1 << 14) |
|
||||
+ (6 << 17) | (1 << 20) |
|
||||
+ (3 << 24);
|
||||
+ }
|
||||
+ } else {
|
||||
+ reg_pmu_set = (5 << 1) | (7 << 4) |
|
||||
+ (1 << 8) | (2 << 14) |
|
||||
+ (6 << 17) | (1 << 20) |
|
||||
+ (3 << 24) | (1 << 28);
|
||||
+ }
|
||||
|
||||
REG_WRITE(ah, AR_PHY_PMU1, reg_pmu_set);
|
||||
if (!is_pmu_set(ah, AR_PHY_PMU1, reg_pmu_set))
|
||||
@@ -3753,7 +3768,7 @@ static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
|
||||
AR_RTC_REG_CONTROL1_SWREG_PROGRAM);
|
||||
}
|
||||
} else {
|
||||
- if (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);
|
||||
while (REG_READ_FIELD(ah, AR_PHY_PMU2,
|
||||
AR_PHY_PMU2_PGM))
|
|
@ -0,0 +1,82 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index 323b6ab..5d373fc 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1161,6 +1161,41 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
|
||||
rst_flags |= AR_RTC_RC_MAC_COLD;
|
||||
}
|
||||
|
||||
+ if (AR_SREV_9330(ah)) {
|
||||
+ int npend = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ /* AR9330 WAR:
|
||||
+ * call external reset function to reset WMAC if:
|
||||
+ * - doing a cold reset
|
||||
+ * - we have pending frames in the TX queues
|
||||
+ */
|
||||
+
|
||||
+ for (i = 0; i < AR_NUM_QCU; i++) {
|
||||
+ npend = ath9k_hw_numtxpending(ah, i);
|
||||
+ if (npend)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (ah->external_reset &&
|
||||
+ (npend || type == ATH9K_RESET_COLD)) {
|
||||
+ int reset_err = 0;
|
||||
+
|
||||
+ ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET,
|
||||
+ "reset MAC via external reset\n");
|
||||
+
|
||||
+ reset_err = ah->external_reset();
|
||||
+ if (reset_err) {
|
||||
+ ath_err(ath9k_hw_common(ah),
|
||||
+ "External reset failed, err=%d\n",
|
||||
+ reset_err);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
REG_WRITE(ah, AR_RTC_RC, rst_flags);
|
||||
|
||||
REGWRITE_BUFFER_FLUSH(ah);
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
index 8d9ac49..f29a806 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -864,6 +864,7 @@ struct ath_hw {
|
||||
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
+ int (*external_reset)(void);
|
||||
};
|
||||
|
||||
struct ath_bus_ops {
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
|
||||
index 5ffabb9..f517649 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -576,6 +576,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
|
||||
sc->sc_ah->led_pin = pdata->led_pin;
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
+ ah->external_reset = pdata->external_reset;
|
||||
}
|
||||
|
||||
common = ath9k_hw_common(ah);
|
||||
diff --git a/include/linux/ath9k_platform.h b/include/linux/ath9k_platform.h
|
||||
index c207607..6e3f54f 100644
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -31,6 +31,7 @@ struct ath9k_platform_data {
|
||||
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
+ int (*external_reset)(void);
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
index 5d373fc..8cbcf12 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -644,6 +644,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
case AR2427_DEVID_PCIE:
|
||||
case AR9300_DEVID_PCIE:
|
||||
case AR9300_DEVID_AR9485_PCIE:
|
||||
+ case AR9300_DEVID_AR9330:
|
||||
case AR9300_DEVID_AR9340:
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in a new issue