Commit 95fafca2 authored by Luis R. Rodriguez's avatar Luis R. Rodriguez Committed by John W. Linville

ath9k: call ath9k_hw_detach() once upon hw init failure

If hw initialization fails (ath9k_hw_init()) on ath_init_softc()
we bail out and call ath9k_hw_detach(). The call ath9k_hw_detach()
is conditional though as ath9k_hw_init() could itself have called
ath9k_hw_detach(). Just describing this is itself a brain twister.
Avoid this nonsense by removing ath9k_hw_detach() from ath9k_hw_init().

Upon hw initialization failure we expect the callers to take care of
the cleanup.
Signed-off-by: default avatarLuis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 3ce1b1a9
...@@ -898,26 +898,22 @@ static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah) ...@@ -898,26 +898,22 @@ static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah)
int ath9k_hw_init(struct ath_hw *ah) int ath9k_hw_init(struct ath_hw *ah)
{ {
int r; int r = 0;
if (!ath9k_hw_devid_supported(ah->hw_version.devid)) { if (!ath9k_hw_devid_supported(ah->hw_version.devid))
r = -EOPNOTSUPP; return -EOPNOTSUPP;
goto bad;
}
ath9k_hw_init_defaults(ah); ath9k_hw_init_defaults(ah);
ath9k_hw_init_config(ah); ath9k_hw_init_config(ah);
if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
DPRINTF(ah->ah_sc, ATH_DBG_FATAL, "Couldn't reset chip\n"); DPRINTF(ah->ah_sc, ATH_DBG_FATAL, "Couldn't reset chip\n");
r = -EIO; return -EIO;
goto bad;
} }
if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) { if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
DPRINTF(ah->ah_sc, ATH_DBG_FATAL, "Couldn't wakeup chip\n"); DPRINTF(ah->ah_sc, ATH_DBG_FATAL, "Couldn't wakeup chip\n");
r = -EIO; return -EIO;
goto bad;
} }
if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) { if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
...@@ -939,8 +935,7 @@ int ath9k_hw_init(struct ath_hw *ah) ...@@ -939,8 +935,7 @@ int ath9k_hw_init(struct ath_hw *ah)
"Mac Chip Rev 0x%02x.%x is not supported by " "Mac Chip Rev 0x%02x.%x is not supported by "
"this driver\n", ah->hw_version.macVersion, "this driver\n", ah->hw_version.macVersion,
ah->hw_version.macRev); ah->hw_version.macRev);
r = -EOPNOTSUPP; return -EOPNOTSUPP;
goto bad;
} }
if (AR_SREV_9100(ah)) { if (AR_SREV_9100(ah)) {
...@@ -965,7 +960,7 @@ int ath9k_hw_init(struct ath_hw *ah) ...@@ -965,7 +960,7 @@ int ath9k_hw_init(struct ath_hw *ah)
r = ath9k_hw_post_init(ah); r = ath9k_hw_post_init(ah);
if (r) if (r)
goto bad; return r;
ath9k_hw_init_mode_gain_regs(ah); ath9k_hw_init_mode_gain_regs(ah);
ath9k_hw_fill_cap_info(ah); ath9k_hw_fill_cap_info(ah);
...@@ -975,7 +970,7 @@ int ath9k_hw_init(struct ath_hw *ah) ...@@ -975,7 +970,7 @@ int ath9k_hw_init(struct ath_hw *ah)
if (r) { if (r) {
DPRINTF(ah->ah_sc, ATH_DBG_FATAL, DPRINTF(ah->ah_sc, ATH_DBG_FATAL,
"Failed to initialize MAC address\n"); "Failed to initialize MAC address\n");
goto bad; return r;
} }
if (AR_SREV_9285(ah)) if (AR_SREV_9285(ah))
...@@ -986,9 +981,6 @@ int ath9k_hw_init(struct ath_hw *ah) ...@@ -986,9 +981,6 @@ int ath9k_hw_init(struct ath_hw *ah)
ath9k_init_nfcal_hist_buffer(ah); ath9k_init_nfcal_hist_buffer(ah);
return 0; return 0;
bad:
ath9k_hw_detach(ah);
return r;
} }
static void ath9k_hw_init_bb(struct ath_hw *ah, static void ath9k_hw_init_bb(struct ath_hw *ah,
......
...@@ -1520,8 +1520,7 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc) ...@@ -1520,8 +1520,7 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc)
if (ATH_TXQ_SETUP(sc, i)) if (ATH_TXQ_SETUP(sc, i))
ath_tx_cleanupq(sc, &sc->tx.txq[i]); ath_tx_cleanupq(sc, &sc->tx.txq[i]);
bad: bad:
if (ah) ath9k_hw_detach(ah);
ath9k_hw_detach(ah);
sc->sc_ah = NULL; sc->sc_ah = NULL;
bad_no_ah: bad_no_ah:
ath9k_exit_debug(sc); ath9k_exit_debug(sc);
......
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