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

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

ath9k: move memory allocation of ath_hw to ath_init()



This lets us simplify attach code and arguments passed.

Signed-off-by: default avatarLuis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7819ac84
Loading
Loading
Loading
Loading
+20 −45
Original line number Diff line number Diff line
@@ -437,20 +437,9 @@ static void ath9k_hw_set_defaults(struct ath_hw *ah)
		ah->config.serialize_regmode = SER_REG_MODE_AUTO;
}

static struct ath_hw *ath9k_hw_newstate(u16 devid, struct ath_softc *sc,
					int *status)
static void ath9k_hw_newstate(u16 devid,
			      struct ath_hw *ah)
{
	struct ath_hw *ah;

	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
	if (ah == NULL) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Cannot allocate memory for state block\n");
		*status = -ENOMEM;
		return NULL;
	}

	ah->ah_sc = sc;
	ah->hw_version.magic = AR5416_MAGIC;
	ah->regulatory.country_code = CTRY_DEFAULT;
	ah->hw_version.devid = devid;
@@ -479,8 +468,6 @@ static struct ath_hw *ath9k_hw_newstate(u16 devid, struct ath_softc *sc,
	ah->gbeacon_rate = 0;

	ah->power_mode = ATH9K_PM_UNDEFINED;

	return ah;
}

static int ath9k_hw_rfattach(struct ath_hw *ah)
@@ -623,28 +610,25 @@ static int ath9k_hw_post_attach(struct ath_hw *ah)
	return 0;
}

static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
					 int *status)
static int ath9k_hw_do_attach(struct ath_hw *ah,
			      u16 devid,
			      struct ath_softc *sc)
{
	struct ath_hw *ah;
	int ecode;
	int r;
	u32 i, j;

	ah = ath9k_hw_newstate(devid, sc, status);
	if (ah == NULL)
		return NULL;

	ath9k_hw_newstate(devid, ah);
	ath9k_hw_set_defaults(ah);

	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
		DPRINTF(sc, ATH_DBG_FATAL, "Couldn't reset chip\n");
		ecode = -EIO;
		r = -EIO;
		goto bad;
	}

	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
		DPRINTF(sc, ATH_DBG_FATAL, "Couldn't wakeup chip\n");
		ecode = -EIO;
		r = -EIO;
		goto bad;
	}

@@ -676,7 +660,7 @@ static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
			"Mac Chip Rev 0x%02x.%x is not supported by "
			"this driver\n", ah->hw_version.macVersion,
			ah->hw_version.macRev);
		ecode = -EOPNOTSUPP;
		r = -EOPNOTSUPP;
		goto bad;
	}

@@ -878,8 +862,8 @@ static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
	else
		ath9k_hw_disablepcie(ah);

	ecode = ath9k_hw_post_attach(ah);
	if (ecode != 0)
	r = ath9k_hw_post_attach(ah);
	if (r)
		goto bad;

	if (AR_SREV_9287_11(ah))
@@ -939,8 +923,8 @@ static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
		}
	}

	ecode = ath9k_hw_init_macaddr(ah);
	if (ecode != 0) {
	r = ath9k_hw_init_macaddr(ah);
	if (r) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Failed to initialize MAC address\n");
		goto bad;
@@ -953,14 +937,10 @@ static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,

	ath9k_init_nfcal_hist_buffer(ah);

	return ah;
	return 0;
bad:
	if (ah)
	ath9k_hw_detach(ah);
	if (status)
		*status = ecode;

	return NULL;
	return r;
}

static void ath9k_hw_init_bb(struct ath_hw *ah,
@@ -1206,10 +1186,8 @@ void ath9k_hw_detach(struct ath_hw *ah)
	kfree(ah);
}

struct ath_hw *ath9k_hw_attach(u16 devid, struct ath_softc *sc, int *error)
int ath9k_hw_attach(struct ath_hw *ah, u16 devid, struct ath_softc *sc)
{
	struct ath_hw *ah = NULL;

	switch (devid) {
	case AR5416_DEVID_PCI:
	case AR5416_DEVID_PCIE:
@@ -1220,14 +1198,11 @@ struct ath_hw *ath9k_hw_attach(u16 devid, struct ath_softc *sc, int *error)
	case AR9285_DEVID_PCIE:
	case AR5416_DEVID_AR9287_PCI:
	case AR5416_DEVID_AR9287_PCIE:
		ah = ath9k_hw_do_attach(devid, sc, error);
		break;
		return ath9k_hw_do_attach(ah, devid, sc);
	default:
		*error = -EOPNOTSUPP;
		break;
	}

	return ah;
	return -EOPNOTSUPP;
}

/*******/
+1 −1
Original line number Diff line number Diff line
@@ -544,7 +544,7 @@ struct ath_hw {
/* Attach, Detach, Reset */
const char *ath9k_hw_probe(u16 vendorid, u16 devid);
void ath9k_hw_detach(struct ath_hw *ah);
struct ath_hw *ath9k_hw_attach(u16 devid, struct ath_softc *sc, int *error);
int ath9k_hw_attach(struct ath_hw *ah, u16 devid, struct ath_softc *sc);
void ath9k_hw_rfdetach(struct ath_hw *ah);
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
		   bool bChannelChange);
+23 −12
Original line number Diff line number Diff line
@@ -1295,7 +1295,7 @@ static int ath9k_reg_notifier(struct wiphy *wiphy,
static int ath_init(u16 devid, struct ath_softc *sc)
{
	struct ath_hw *ah = NULL;
	int error = 0, i;
	int r = 0, i;
	int csz = 0;

	/* XXX: hardware will not be ready until ath_open() being called */
@@ -1322,11 +1322,21 @@ static int ath_init(u16 devid, struct ath_softc *sc)
	/* XXX assert csz is non-zero */
	sc->cachelsz = csz << 2;	/* convert to bytes */

	ah = ath9k_hw_attach(devid, sc, &error);
	if (ah == NULL) {
	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
	if (!ah) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Cannot allocate memory for state block\n");
		r = -ENOMEM;
		goto bad_no_ah;
	}

	ah->ah_sc = sc;

	r = ath9k_hw_attach(ah, devid, sc);
	if (r) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to attach hardware; "
			"initialization status: %d\n", error);
			"initialization status: %d\n", r);
		goto bad;
	}
	sc->sc_ah = ah;
@@ -1347,7 +1357,7 @@ static int ath_init(u16 devid, struct ath_softc *sc)
	for (i = 0; i < sc->keymax; i++)
		ath9k_hw_keyreset(ah, (u16) i);

	if (error)
	if (r)
		goto bad;

	/* default to MONITOR mode */
@@ -1369,14 +1379,14 @@ static int ath_init(u16 devid, struct ath_softc *sc)
	if (sc->beacon.beaconq == -1) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to setup a beacon xmit queue\n");
		error = -EIO;
		r = -EIO;
		goto bad2;
	}
	sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
	if (sc->beacon.cabq == NULL) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to setup CAB xmit queue\n");
		error = -EIO;
		r = -EIO;
		goto bad2;
	}

@@ -1391,26 +1401,26 @@ static int ath_init(u16 devid, struct ath_softc *sc)
	if (!ath_tx_setup(sc, ATH9K_WME_AC_BK)) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to setup xmit queue for BK traffic\n");
		error = -EIO;
		r = -EIO;
		goto bad2;
	}

	if (!ath_tx_setup(sc, ATH9K_WME_AC_BE)) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to setup xmit queue for BE traffic\n");
		error = -EIO;
		r = -EIO;
		goto bad2;
	}
	if (!ath_tx_setup(sc, ATH9K_WME_AC_VI)) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to setup xmit queue for VI traffic\n");
		error = -EIO;
		r = -EIO;
		goto bad2;
	}
	if (!ath_tx_setup(sc, ATH9K_WME_AC_VO)) {
		DPRINTF(sc, ATH_DBG_FATAL,
			"Unable to setup xmit queue for VO traffic\n");
		error = -EIO;
		r = -EIO;
		goto bad2;
	}

@@ -1506,9 +1516,10 @@ static int ath_init(u16 devid, struct ath_softc *sc)
bad:
	if (ah)
		ath9k_hw_detach(ah);
bad_no_ah:
	ath9k_exit_debug(sc);

	return error;
	return r;
}

void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)