Commit 1bef016a authored by Nick Kossifidis's avatar Nick Kossifidis Committed by John W. Linville

ath5k: Update registers and SREV ids v2

 * Update registers
 * Update SREV values and add some PHY srevs
 * Prepare ath5k.h for newer radios etc

 Thanks to Atheros 's HAL source we now know for sure how many parts we have
 and what their SREV values are. We also have some updates on registers. Prepare
 ath5k for some major updates ;-)

 My previous mail had 2 more patches following (git log misusage), sorry for double
 posting ;-(

Changes-Licensed-under: ISC
Signed-Off-by: default avatarNick Kossifidis <mickflemm@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 14be9947
...@@ -281,7 +281,9 @@ enum ath5k_radio { ...@@ -281,7 +281,9 @@ enum ath5k_radio {
AR5K_RF5112 = 2, AR5K_RF5112 = 2,
AR5K_RF2413 = 3, AR5K_RF2413 = 3,
AR5K_RF5413 = 4, AR5K_RF5413 = 4,
AR5K_RF2425 = 5, AR5K_RF2316 = 5,
AR5K_RF2317 = 6,
AR5K_RF2425 = 7,
}; };
/* /*
...@@ -289,7 +291,7 @@ enum ath5k_radio { ...@@ -289,7 +291,7 @@ enum ath5k_radio {
*/ */
enum ath5k_srev_type { enum ath5k_srev_type {
AR5K_VERSION_VER, AR5K_VERSION_MAC,
AR5K_VERSION_RAD, AR5K_VERSION_RAD,
}; };
...@@ -301,23 +303,24 @@ struct ath5k_srev_name { ...@@ -301,23 +303,24 @@ struct ath5k_srev_name {
#define AR5K_SREV_UNKNOWN 0xffff #define AR5K_SREV_UNKNOWN 0xffff
#define AR5K_SREV_VER_AR5210 0x00 #define AR5K_SREV_AR5210 0x00 /* Crete */
#define AR5K_SREV_VER_AR5311 0x10 #define AR5K_SREV_AR5311 0x10 /* Maui 1 */
#define AR5K_SREV_VER_AR5311A 0x20 #define AR5K_SREV_AR5311A 0x20 /* Maui 2 */
#define AR5K_SREV_VER_AR5311B 0x30 #define AR5K_SREV_AR5311B 0x30 /* Spirit */
#define AR5K_SREV_VER_AR5211 0x40 #define AR5K_SREV_AR5211 0x40 /* Oahu */
#define AR5K_SREV_VER_AR5212 0x50 #define AR5K_SREV_AR5212 0x50 /* Venice */
#define AR5K_SREV_VER_AR5213 0x55 #define AR5K_SREV_AR5213 0x55 /* ??? */
#define AR5K_SREV_VER_AR5213A 0x59 #define AR5K_SREV_AR5213A 0x59 /* Hainan */
#define AR5K_SREV_VER_AR2413 0x78 #define AR5K_SREV_AR2413 0x78 /* Griffin lite */
#define AR5K_SREV_VER_AR2414 0x79 #define AR5K_SREV_AR2414 0x70 /* Griffin */
#define AR5K_SREV_VER_AR2424 0xa0 /* PCI-E */ #define AR5K_SREV_AR5424 0x90 /* Condor */
#define AR5K_SREV_VER_AR5424 0xa3 /* PCI-E */ #define AR5K_SREV_AR5413 0xa4 /* Eagle lite */
#define AR5K_SREV_VER_AR5413 0xa4 #define AR5K_SREV_AR5414 0xa0 /* Eagle */
#define AR5K_SREV_VER_AR5414 0xa5 #define AR5K_SREV_AR2415 0xb0 /* Cobra */
#define AR5K_SREV_VER_AR5416 0xc0 /* PCI-E */ #define AR5K_SREV_AR5416 0xc0 /* PCI-E */
#define AR5K_SREV_VER_AR5418 0xca /* PCI-E */ #define AR5K_SREV_AR5418 0xca /* PCI-E */
#define AR5K_SREV_VER_AR2425 0xe2 /* PCI-E */ #define AR5K_SREV_AR2425 0xe0 /* Swan */
#define AR5K_SREV_AR2417 0xf0 /* Nala */
#define AR5K_SREV_RAD_5110 0x00 #define AR5K_SREV_RAD_5110 0x00
#define AR5K_SREV_RAD_5111 0x10 #define AR5K_SREV_RAD_5111 0x10
...@@ -329,10 +332,20 @@ struct ath5k_srev_name { ...@@ -329,10 +332,20 @@ struct ath5k_srev_name {
#define AR5K_SREV_RAD_2112 0x40 #define AR5K_SREV_RAD_2112 0x40
#define AR5K_SREV_RAD_2112A 0x45 #define AR5K_SREV_RAD_2112A 0x45
#define AR5K_SREV_RAD_2112B 0x46 #define AR5K_SREV_RAD_2112B 0x46
#define AR5K_SREV_RAD_SC0 0x50 /* Found on 2413/2414 */ #define AR5K_SREV_RAD_2413 0x50
#define AR5K_SREV_RAD_SC1 0x60 /* Found on 5413/5414 */ #define AR5K_SREV_RAD_5413 0x60
#define AR5K_SREV_RAD_SC2 0xa0 /* Found on 2424-5/5424 */ #define AR5K_SREV_RAD_2316 0x70
#define AR5K_SREV_RAD_5133 0xc0 /* MIMO found on 5418 */ #define AR5K_SREV_RAD_2317 0x80
#define AR5K_SREV_RAD_5424 0xa0 /* Mostly same as 5413 */
#define AR5K_SREV_RAD_2425 0xa2
#define AR5K_SREV_RAD_5133 0xc0
#define AR5K_SREV_PHY_5211 0x30
#define AR5K_SREV_PHY_5212 0x41
#define AR5K_SREV_PHY_2112B 0x43
#define AR5K_SREV_PHY_2413 0x45
#define AR5K_SREV_PHY_5413 0x61
#define AR5K_SREV_PHY_2425 0x70
/* IEEE defs */ /* IEEE defs */
#define IEEE80211_MAX_LEN 2500 #define IEEE80211_MAX_LEN 2500
......
...@@ -168,19 +168,19 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) ...@@ -168,19 +168,19 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)
CHANNEL_2GHZ); CHANNEL_2GHZ);
/* Return on unsuported chips (unsupported eeprom etc) */ /* Return on unsuported chips (unsupported eeprom etc) */
if ((srev >= AR5K_SREV_VER_AR5416) && if ((srev >= AR5K_SREV_AR5416) &&
(srev < AR5K_SREV_VER_AR2425)) { (srev < AR5K_SREV_AR2425)) {
ATH5K_ERR(sc, "Device not yet supported.\n"); ATH5K_ERR(sc, "Device not yet supported.\n");
ret = -ENODEV; ret = -ENODEV;
goto err_free; goto err_free;
} else if (srev == AR5K_SREV_VER_AR2425) { } else if (srev == AR5K_SREV_AR2425) {
ATH5K_WARN(sc, "Support for RF2425 is under development.\n"); ATH5K_WARN(sc, "Support for RF2425 is under development.\n");
} }
/* Identify single chip solutions */ /* Identify single chip solutions */
if (((srev <= AR5K_SREV_VER_AR5414) && if (((srev <= AR5K_SREV_AR5414) &&
(srev >= AR5K_SREV_VER_AR2413)) || (srev >= AR5K_SREV_AR2413)) ||
(srev == AR5K_SREV_VER_AR2425)) { (srev == AR5K_SREV_AR2425)) {
ah->ah_single_chip = true; ah->ah_single_chip = true;
} else { } else {
ah->ah_single_chip = false; ah->ah_single_chip = false;
...@@ -199,24 +199,24 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) ...@@ -199,24 +199,24 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)
* correctly. For now we are based on mac's srev to * correctly. For now we are based on mac's srev to
* identify RF2425 radio. * identify RF2425 radio.
*/ */
} else if (srev == AR5K_SREV_VER_AR2425) { } else if (srev == AR5K_SREV_AR2425) {
ah->ah_radio = AR5K_RF2425; ah->ah_radio = AR5K_RF2425;
ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2425; ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2425;
} else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5112) { } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5112) {
ah->ah_radio = AR5K_RF5111; ah->ah_radio = AR5K_RF5111;
ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5111; ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5111;
} else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC0) { } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_2413) {
ah->ah_radio = AR5K_RF5112; ah->ah_radio = AR5K_RF5112;
ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112; ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112;
} else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC1) { } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5413) {
ah->ah_radio = AR5K_RF2413; ah->ah_radio = AR5K_RF2413;
ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2413; ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2413;
} else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC2) { } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_2316) {
ah->ah_radio = AR5K_RF5413; ah->ah_radio = AR5K_RF5413;
ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5413; ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5413;
} else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5133) { } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5133) {
/* AR5424 */ /* AR5424 */
if (srev >= AR5K_SREV_VER_AR5424) { if (srev >= AR5K_SREV_AR5424) {
ah->ah_radio = AR5K_RF5413; ah->ah_radio = AR5K_RF5413;
ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5413; ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5413;
/* AR2424 */ /* AR2424 */
...@@ -252,8 +252,8 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) ...@@ -252,8 +252,8 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)
/* Write AR5K_PCICFG_UNK on 2112B and later chips */ /* Write AR5K_PCICFG_UNK on 2112B and later chips */
if (ah->ah_radio_5ghz_revision > AR5K_SREV_RAD_2112B || if (ah->ah_radio_5ghz_revision > AR5K_SREV_RAD_2112B ||
srev > AR5K_SREV_VER_AR2413) { srev > AR5K_SREV_AR2413) {
ath5k_hw_reg_write(ah, AR5K_PCICFG_UNK, AR5K_PCICFG); ath5k_hw_reg_write(ah, AR5K_PCICFG_RETRY_FIX, AR5K_PCICFG);
} }
/* /*
......
...@@ -100,34 +100,40 @@ MODULE_DEVICE_TABLE(pci, ath5k_pci_id_table); ...@@ -100,34 +100,40 @@ MODULE_DEVICE_TABLE(pci, ath5k_pci_id_table);
/* Known SREVs */ /* Known SREVs */
static struct ath5k_srev_name srev_names[] = { static struct ath5k_srev_name srev_names[] = {
{ "5210", AR5K_VERSION_VER, AR5K_SREV_VER_AR5210 }, { "5210", AR5K_VERSION_MAC, AR5K_SREV_AR5210 },
{ "5311", AR5K_VERSION_VER, AR5K_SREV_VER_AR5311 }, { "5311", AR5K_VERSION_MAC, AR5K_SREV_AR5311 },
{ "5311A", AR5K_VERSION_VER, AR5K_SREV_VER_AR5311A }, { "5311A", AR5K_VERSION_MAC, AR5K_SREV_AR5311A },
{ "5311B", AR5K_VERSION_VER, AR5K_SREV_VER_AR5311B }, { "5311B", AR5K_VERSION_MAC, AR5K_SREV_AR5311B },
{ "5211", AR5K_VERSION_VER, AR5K_SREV_VER_AR5211 }, { "5211", AR5K_VERSION_MAC, AR5K_SREV_AR5211 },
{ "5212", AR5K_VERSION_VER, AR5K_SREV_VER_AR5212 }, { "5212", AR5K_VERSION_MAC, AR5K_SREV_AR5212 },
{ "5213", AR5K_VERSION_VER, AR5K_SREV_VER_AR5213 }, { "5213", AR5K_VERSION_MAC, AR5K_SREV_AR5213 },
{ "5213A", AR5K_VERSION_VER, AR5K_SREV_VER_AR5213A }, { "5213A", AR5K_VERSION_MAC, AR5K_SREV_AR5213A },
{ "2413", AR5K_VERSION_VER, AR5K_SREV_VER_AR2413 }, { "2413", AR5K_VERSION_MAC, AR5K_SREV_AR2413 },
{ "2414", AR5K_VERSION_VER, AR5K_SREV_VER_AR2414 }, { "2414", AR5K_VERSION_MAC, AR5K_SREV_AR2414 },
{ "2424", AR5K_VERSION_VER, AR5K_SREV_VER_AR2424 }, { "5424", AR5K_VERSION_MAC, AR5K_SREV_AR5424 },
{ "5424", AR5K_VERSION_VER, AR5K_SREV_VER_AR5424 }, { "5413", AR5K_VERSION_MAC, AR5K_SREV_AR5413 },
{ "5413", AR5K_VERSION_VER, AR5K_SREV_VER_AR5413 }, { "5414", AR5K_VERSION_MAC, AR5K_SREV_AR5414 },
{ "5414", AR5K_VERSION_VER, AR5K_SREV_VER_AR5414 }, { "2415", AR5K_VERSION_MAC, AR5K_SREV_AR2415 },
{ "5416", AR5K_VERSION_VER, AR5K_SREV_VER_AR5416 }, { "5416", AR5K_VERSION_MAC, AR5K_SREV_AR5416 },
{ "5418", AR5K_VERSION_VER, AR5K_SREV_VER_AR5418 }, { "5418", AR5K_VERSION_MAC, AR5K_SREV_AR5418 },
{ "2425", AR5K_VERSION_VER, AR5K_SREV_VER_AR2425 }, { "2425", AR5K_VERSION_MAC, AR5K_SREV_AR2425 },
{ "xxxxx", AR5K_VERSION_VER, AR5K_SREV_UNKNOWN }, { "2417", AR5K_VERSION_MAC, AR5K_SREV_AR2417 },
{ "xxxxx", AR5K_VERSION_MAC, AR5K_SREV_UNKNOWN },
{ "5110", AR5K_VERSION_RAD, AR5K_SREV_RAD_5110 }, { "5110", AR5K_VERSION_RAD, AR5K_SREV_RAD_5110 },
{ "5111", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111 }, { "5111", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111 },
{ "5111A", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111A },
{ "2111", AR5K_VERSION_RAD, AR5K_SREV_RAD_2111 }, { "2111", AR5K_VERSION_RAD, AR5K_SREV_RAD_2111 },
{ "5112", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112 }, { "5112", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112 },
{ "5112A", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112A }, { "5112A", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112A },
{ "5112B", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112B },
{ "2112", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112 }, { "2112", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112 },
{ "2112A", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112A }, { "2112A", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112A },
{ "SChip", AR5K_VERSION_RAD, AR5K_SREV_RAD_SC0 }, { "2112B", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112B },
{ "SChip", AR5K_VERSION_RAD, AR5K_SREV_RAD_SC1 }, { "2413", AR5K_VERSION_RAD, AR5K_SREV_RAD_2413 },
{ "SChip", AR5K_VERSION_RAD, AR5K_SREV_RAD_SC2 }, { "5413", AR5K_VERSION_RAD, AR5K_SREV_RAD_5413 },
{ "2316", AR5K_VERSION_RAD, AR5K_SREV_RAD_2316 },
{ "2317", AR5K_VERSION_RAD, AR5K_SREV_RAD_2317 },
{ "5424", AR5K_VERSION_RAD, AR5K_SREV_RAD_5424 },
{ "5133", AR5K_VERSION_RAD, AR5K_SREV_RAD_5133 }, { "5133", AR5K_VERSION_RAD, AR5K_SREV_RAD_5133 },
{ "xxxxx", AR5K_VERSION_RAD, AR5K_SREV_UNKNOWN }, { "xxxxx", AR5K_VERSION_RAD, AR5K_SREV_UNKNOWN },
}; };
...@@ -536,7 +542,7 @@ ath5k_pci_probe(struct pci_dev *pdev, ...@@ -536,7 +542,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
goto err_ah; goto err_ah;
ATH5K_INFO(sc, "Atheros AR%s chip found (MAC: 0x%x, PHY: 0x%x)\n", ATH5K_INFO(sc, "Atheros AR%s chip found (MAC: 0x%x, PHY: 0x%x)\n",
ath5k_chip_name(AR5K_VERSION_VER,sc->ah->ah_mac_srev), ath5k_chip_name(AR5K_VERSION_MAC, sc->ah->ah_mac_srev),
sc->ah->ah_mac_srev, sc->ah->ah_mac_srev,
sc->ah->ah_phy_revision); sc->ah->ah_phy_revision);
......
...@@ -375,7 +375,7 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) ...@@ -375,7 +375,7 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
case AR5K_TX_QUEUE_BEACON: case AR5K_TX_QUEUE_BEACON:
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue), AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
AR5K_QCU_MISC_FRSHED_DBA_GT | AR5K_QCU_MISC_FRSHED_DBA_GT |
AR5K_QCU_MISC_CBREXP_BCN | AR5K_QCU_MISC_CBREXP_BCN_DIS |
AR5K_QCU_MISC_BCN_ENABLE); AR5K_QCU_MISC_BCN_ENABLE);
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue), AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue),
...@@ -395,8 +395,8 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) ...@@ -395,8 +395,8 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
case AR5K_TX_QUEUE_CAB: case AR5K_TX_QUEUE_CAB:
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue), AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
AR5K_QCU_MISC_FRSHED_DBA_GT | AR5K_QCU_MISC_FRSHED_DBA_GT |
AR5K_QCU_MISC_CBREXP | AR5K_QCU_MISC_CBREXP_DIS |
AR5K_QCU_MISC_CBREXP_BCN); AR5K_QCU_MISC_CBREXP_BCN_DIS);
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue), AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue),
(AR5K_DCU_MISC_ARBLOCK_CTL_GLOBAL << (AR5K_DCU_MISC_ARBLOCK_CTL_GLOBAL <<
...@@ -405,7 +405,7 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) ...@@ -405,7 +405,7 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
case AR5K_TX_QUEUE_UAPSD: case AR5K_TX_QUEUE_UAPSD:
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue), AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
AR5K_QCU_MISC_CBREXP); AR5K_QCU_MISC_CBREXP_DIS);
break; break;
case AR5K_TX_QUEUE_DATA: case AR5K_TX_QUEUE_DATA:
......
This diff is collapsed.
...@@ -543,13 +543,13 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, ...@@ -543,13 +543,13 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
ath5k_hw_reg_write(ah, 0x0002a002, 0x982c); ath5k_hw_reg_write(ah, 0x0002a002, 0x982c);
if (channel->hw_value == CHANNEL_G) if (channel->hw_value == CHANNEL_G)
if (ah->ah_mac_srev < AR5K_SREV_VER_AR2413) if (ah->ah_mac_srev < AR5K_SREV_AR2413)
ath5k_hw_reg_write(ah, 0x00f80d80, ath5k_hw_reg_write(ah, 0x00f80d80,
0x994c); 0x994c);
else if (ah->ah_mac_srev < AR5K_SREV_VER_AR2424) else if (ah->ah_mac_srev < AR5K_SREV_AR5424)
ath5k_hw_reg_write(ah, 0x00380140, ath5k_hw_reg_write(ah, 0x00380140,
0x994c); 0x994c);
else if (ah->ah_mac_srev < AR5K_SREV_VER_AR2425) else if (ah->ah_mac_srev < AR5K_SREV_AR2425)
ath5k_hw_reg_write(ah, 0x00fc0ec0, ath5k_hw_reg_write(ah, 0x00fc0ec0,
0x994c); 0x994c);
else /* 2425 */ else /* 2425 */
...@@ -915,7 +915,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, ...@@ -915,7 +915,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
ath5k_hw_reg_write(ah, 0x000100aa, 0x8118); ath5k_hw_reg_write(ah, 0x000100aa, 0x8118);
ath5k_hw_reg_write(ah, 0x00003210, 0x811c); ath5k_hw_reg_write(ah, 0x00003210, 0x811c);
ath5k_hw_reg_write(ah, 0x00000052, 0x8108); ath5k_hw_reg_write(ah, 0x00000052, 0x8108);
if (ah->ah_mac_srev >= AR5K_SREV_VER_AR2413) if (ah->ah_mac_srev >= AR5K_SREV_AR2413)
ath5k_hw_reg_write(ah, 0x00000004, 0x8120); ath5k_hw_reg_write(ah, 0x00000004, 0x8120);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment