ath9k: call ath9k_hw_detach() once upon hw init failure
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Mon, 3 Aug 2009 19:24:54 +0000 (12:24 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 4 Aug 2009 20:44:33 +0000 (16:44 -0400)
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: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/main.c

index 633fe8b6f5f7feba3035c981fcaf25b27e2dcc5e..08715299f75d5e542e94a27fc2f24fa6c4a6138d 100644 (file)
@@ -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 r;
+       int r = 0;
 
-       if (!ath9k_hw_devid_supported(ah->hw_version.devid)) {
-               r = -EOPNOTSUPP;
-               goto bad;
-       }
+       if (!ath9k_hw_devid_supported(ah->hw_version.devid))
+               return -EOPNOTSUPP;
 
        ath9k_hw_init_defaults(ah);
        ath9k_hw_init_config(ah);
 
        if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
                DPRINTF(ah->ah_sc, ATH_DBG_FATAL, "Couldn't reset chip\n");
-               r = -EIO;
-               goto bad;
+               return -EIO;
        }
 
        if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
                DPRINTF(ah->ah_sc, ATH_DBG_FATAL, "Couldn't wakeup chip\n");
-               r = -EIO;
-               goto bad;
+               return -EIO;
        }
 
        if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
@@ -939,8 +935,7 @@ int ath9k_hw_init(struct ath_hw *ah)
                        "Mac Chip Rev 0x%02x.%x is not supported by "
                        "this driver\n", ah->hw_version.macVersion,
                        ah->hw_version.macRev);
-               r = -EOPNOTSUPP;
-               goto bad;
+               return -EOPNOTSUPP;
        }
 
        if (AR_SREV_9100(ah)) {
@@ -965,7 +960,7 @@ int ath9k_hw_init(struct ath_hw *ah)
 
        r = ath9k_hw_post_init(ah);
        if (r)
-               goto bad;
+               return r;
 
        ath9k_hw_init_mode_gain_regs(ah);
        ath9k_hw_fill_cap_info(ah);
@@ -975,7 +970,7 @@ int ath9k_hw_init(struct ath_hw *ah)
        if (r) {
                DPRINTF(ah->ah_sc, ATH_DBG_FATAL,
                        "Failed to initialize MAC address\n");
-               goto bad;
+               return r;
        }
 
        if (AR_SREV_9285(ah))
@@ -986,9 +981,6 @@ int ath9k_hw_init(struct ath_hw *ah)
        ath9k_init_nfcal_hist_buffer(ah);
 
        return 0;
-bad:
-       ath9k_hw_detach(ah);
-       return r;
 }
 
 static void ath9k_hw_init_bb(struct ath_hw *ah,
index d3d2cb667dc665666b0170da6409fe1e49626e32..a5475b7a59defe2976745135b06ab5a79e7ded85 100644 (file)
@@ -1520,8 +1520,7 @@ bad2:
                if (ATH_TXQ_SETUP(sc, i))
                        ath_tx_cleanupq(sc, &sc->tx.txq[i]);
 bad:
-       if (ah)
-               ath9k_hw_detach(ah);
+       ath9k_hw_detach(ah);
        sc->sc_ah = NULL;
 bad_no_ah:
        ath9k_exit_debug(sc);