ath5k: Check EEPROM before tweaking SERDES
* Read PCI-E infos offset from EEPROM and if it points to serdes section (0x40), enable serdes programming (further tweaking of serdes values during attach). This follows Legacy and Sam's HAL sources. Signed-off-by: Nick Kossifidis <mickflemm@gmail.com> Acked-by: Bob Copeland <me@bobcopeland.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
d6756d0dc2
commit
c38e7a9348
@@ -252,28 +252,6 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write PCI-E power save settings
|
||||
*/
|
||||
if ((ah->ah_version == AR5K_AR5212) && (pdev->is_pcie)) {
|
||||
ath5k_hw_reg_write(ah, 0x9248fc00, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0x24924924, AR5K_PCIE_SERDES);
|
||||
/* Shut off RX when elecidle is asserted */
|
||||
ath5k_hw_reg_write(ah, 0x28000039, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0x53160824, AR5K_PCIE_SERDES);
|
||||
/* TODO: EEPROM work */
|
||||
ath5k_hw_reg_write(ah, 0xe5980579, AR5K_PCIE_SERDES);
|
||||
/* Shut off PLL and CLKREQ active in L1 */
|
||||
ath5k_hw_reg_write(ah, 0x001defff, AR5K_PCIE_SERDES);
|
||||
/* Preserce other settings */
|
||||
ath5k_hw_reg_write(ah, 0x1aaabe40, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0xbe105554, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0x000e3007, AR5K_PCIE_SERDES);
|
||||
/* Reset SERDES to load new settings */
|
||||
ath5k_hw_reg_write(ah, 0x00000000, AR5K_PCIE_SERDES_RESET);
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* POST
|
||||
*/
|
||||
@@ -295,6 +273,40 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write PCI-E power save settings
|
||||
*/
|
||||
if ((ah->ah_version == AR5K_AR5212) && (pdev->is_pcie)) {
|
||||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||
|
||||
ath5k_hw_reg_write(ah, 0x9248fc00, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0x24924924, AR5K_PCIE_SERDES);
|
||||
|
||||
/* Shut off RX when elecidle is asserted */
|
||||
ath5k_hw_reg_write(ah, 0x28000039, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0x53160824, AR5K_PCIE_SERDES);
|
||||
|
||||
/* If serdes programing is enabled, increase PCI-E
|
||||
* tx power for systems with long trace from host
|
||||
* to minicard connector. */
|
||||
if (ee->ee_serdes)
|
||||
ath5k_hw_reg_write(ah, 0xe5980579, AR5K_PCIE_SERDES);
|
||||
else
|
||||
ath5k_hw_reg_write(ah, 0xf6800579, AR5K_PCIE_SERDES);
|
||||
|
||||
/* Shut off PLL and CLKREQ active in L1 */
|
||||
ath5k_hw_reg_write(ah, 0x001defff, AR5K_PCIE_SERDES);
|
||||
|
||||
/* Preserve other settings */
|
||||
ath5k_hw_reg_write(ah, 0x1aaabe40, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0xbe105554, AR5K_PCIE_SERDES);
|
||||
ath5k_hw_reg_write(ah, 0x000e3007, AR5K_PCIE_SERDES);
|
||||
|
||||
/* Reset SERDES to load new settings */
|
||||
ath5k_hw_reg_write(ah, 0x00000000, AR5K_PCIE_SERDES_RESET);
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
/* Get misc capabilities */
|
||||
ret = ath5k_hw_set_capabilities(ah);
|
||||
if (ret) {
|
||||
|
Reference in New Issue
Block a user