ath9k_hw: embed the ath_ops callbacks in the ath_hw struct
authorFelix Fietkau <nbd@openwrt.org>
Wed, 23 Mar 2011 19:57:24 +0000 (20:57 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 30 Mar 2011 18:15:19 +0000 (14:15 -0400)
With this change, loading the address to a register read/write function
costs only one pointer dereference instead of two. On MIPS this reduces
ath9k_hw binary size from 326k down to 321k.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/init.c

index fc67c93..4e26946 100644 (file)
@@ -430,14 +430,6 @@ static void ath9k_regwrite_flush(void *hw_priv)
        mutex_unlock(&priv->wmi->multi_write_mutex);
 }
 
-static const struct ath_ops ath9k_common_ops = {
-       .read = ath9k_regread,
-       .multi_read = ath9k_multi_regread,
-       .write = ath9k_regwrite,
-       .enable_write_buffer = ath9k_enable_regwrite_buffer,
-       .write_flush = ath9k_regwrite_flush,
-};
-
 static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
 {
        *csz = L1_CACHE_BYTES >> 2;
@@ -658,10 +650,15 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
        ah->hw_version.subsysid = 0; /* FIXME */
        ah->hw_version.usbdev = drv_info;
        ah->ah_flags |= AH_USE_EEPROM;
+       ah->reg_ops.read = ath9k_regread;
+       ah->reg_ops.multi_read = ath9k_multi_regread;
+       ah->reg_ops.write = ath9k_regwrite;
+       ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer;
+       ah->reg_ops.write_flush = ath9k_regwrite_flush;
        priv->ah = ah;
 
        common = ath9k_hw_common(ah);
-       common->ops = &ath9k_common_ops;
+       common->ops = &ah->reg_ops;
        common->bus_ops = &ath9k_usb_bus_ops;
        common->ah = ah;
        common->hw = priv->hw;
index c819973..ef387a2 100644 (file)
 
 /* Register read/write primitives */
 #define REG_WRITE(_ah, _reg, _val) \
-       ath9k_hw_common(_ah)->ops->write((_ah), (_val), (_reg))
+       (_ah)->reg_ops.write((_ah), (_val), (_reg))
 
 #define REG_READ(_ah, _reg) \
-       ath9k_hw_common(_ah)->ops->read((_ah), (_reg))
+       (_ah)->reg_ops.read((_ah), (_reg))
 
 #define REG_READ_MULTI(_ah, _addr, _val, _cnt)         \
-       ath9k_hw_common(_ah)->ops->multi_read((_ah), (_addr), (_val), (_cnt))
+       (_ah)->reg_ops.multi_read((_ah), (_addr), (_val), (_cnt))
 
 #define ENABLE_REGWRITE_BUFFER(_ah)                                    \
        do {                                                            \
-               if (ath9k_hw_common(_ah)->ops->enable_write_buffer)     \
-                       ath9k_hw_common(_ah)->ops->enable_write_buffer((_ah)); \
+               if ((_ah)->reg_ops.enable_write_buffer) \
+                       (_ah)->reg_ops.enable_write_buffer((_ah)); \
        } while (0)
 
 #define REGWRITE_BUFFER_FLUSH(_ah)                                     \
        do {                                                            \
-               if (ath9k_hw_common(_ah)->ops->write_flush)             \
-                       ath9k_hw_common(_ah)->ops->write_flush((_ah));  \
+               if ((_ah)->reg_ops.write_flush)         \
+                       (_ah)->reg_ops.write_flush((_ah));      \
        } while (0)
 
 #define SM(_v, _f)  (((_v) << _f##_S) & _f)
@@ -657,6 +657,8 @@ struct ath_nf_limits {
 #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
 
 struct ath_hw {
+       struct ath_ops reg_ops;
+
        struct ieee80211_hw *hw;
        struct ath_common common;
        struct ath9k_hw_version hw_version;
index b590a9e..da114c2 100644 (file)
@@ -196,11 +196,6 @@ static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
        return val;
 }
 
-static const struct ath_ops ath9k_common_ops = {
-       .read = ath9k_ioread32,
-       .write = ath9k_iowrite32,
-};
-
 /**************************/
 /*     Initialization     */
 /**************************/
@@ -551,6 +546,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
        ah->hw = sc->hw;
        ah->hw_version.devid = devid;
        ah->hw_version.subsysid = subsysid;
+       ah->reg_ops.read = ath9k_ioread32;
+       ah->reg_ops.write = ath9k_iowrite32;
        sc->sc_ah = ah;
 
        if (!pdata) {
@@ -563,7 +560,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
        }
 
        common = ath9k_hw_common(ah);
-       common->ops = &ath9k_common_ops;
+       common->ops = &ah->reg_ops;
        common->bus_ops = bus_ops;
        common->ah = ah;
        common->hw = sc->hw;