Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+8 −16
Original line number Diff line number Diff line
@@ -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,
+1 −2
Original line number Diff line number Diff line
@@ -1520,7 +1520,6 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc)
		if (ATH_TXQ_SETUP(sc, i))
			ath_tx_cleanupq(sc, &sc->tx.txq[i]);
bad:
	if (ah)
	ath9k_hw_detach(ah);
	sc->sc_ah = NULL;
bad_no_ah: