ath9k: move memory allocation of ath_hw to ath_init()
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Mon, 3 Aug 2009 19:24:36 +0000 (12:24 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 4 Aug 2009 20:44:27 +0000 (16:44 -0400)
This lets us simplify attach code and arguments passed.

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/hw.h
drivers/net/wireless/ath/ath9k/main.c

index 2e09204..fcefea8 100644 (file)
@@ -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;
+       ath9k_hw_detach(ah);
+       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;
 }
 
 /*******/
index 93a8930..4a0d5f2 100644 (file)
@@ -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);
index ada5fef..c2b9974 100644 (file)
@@ -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 @@ bad2:
 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)