Commit f9f84e96 authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville

ath9k_hw: embed the ath_ops callbacks in the ath_hw struct

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: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent ec15e68b
...@@ -430,14 +430,6 @@ static void ath9k_regwrite_flush(void *hw_priv) ...@@ -430,14 +430,6 @@ static void ath9k_regwrite_flush(void *hw_priv)
mutex_unlock(&priv->wmi->multi_write_mutex); 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) static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
{ {
*csz = L1_CACHE_BYTES >> 2; *csz = L1_CACHE_BYTES >> 2;
...@@ -658,10 +650,15 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv, ...@@ -658,10 +650,15 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
ah->hw_version.subsysid = 0; /* FIXME */ ah->hw_version.subsysid = 0; /* FIXME */
ah->hw_version.usbdev = drv_info; ah->hw_version.usbdev = drv_info;
ah->ah_flags |= AH_USE_EEPROM; 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; priv->ah = ah;
common = ath9k_hw_common(ah); common = ath9k_hw_common(ah);
common->ops = &ath9k_common_ops; common->ops = &ah->reg_ops;
common->bus_ops = &ath9k_usb_bus_ops; common->bus_ops = &ath9k_usb_bus_ops;
common->ah = ah; common->ah = ah;
common->hw = priv->hw; common->hw = priv->hw;
......
...@@ -65,24 +65,24 @@ ...@@ -65,24 +65,24 @@
/* Register read/write primitives */ /* Register read/write primitives */
#define REG_WRITE(_ah, _reg, _val) \ #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) \ #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) \ #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) \ #define ENABLE_REGWRITE_BUFFER(_ah) \
do { \ do { \
if (ath9k_hw_common(_ah)->ops->enable_write_buffer) \ if ((_ah)->reg_ops.enable_write_buffer) \
ath9k_hw_common(_ah)->ops->enable_write_buffer((_ah)); \ (_ah)->reg_ops.enable_write_buffer((_ah)); \
} while (0) } while (0)
#define REGWRITE_BUFFER_FLUSH(_ah) \ #define REGWRITE_BUFFER_FLUSH(_ah) \
do { \ do { \
if (ath9k_hw_common(_ah)->ops->write_flush) \ if ((_ah)->reg_ops.write_flush) \
ath9k_hw_common(_ah)->ops->write_flush((_ah)); \ (_ah)->reg_ops.write_flush((_ah)); \
} while (0) } while (0)
#define SM(_v, _f) (((_v) << _f##_S) & _f) #define SM(_v, _f) (((_v) << _f##_S) & _f)
...@@ -657,6 +657,8 @@ struct ath_nf_limits { ...@@ -657,6 +657,8 @@ struct ath_nf_limits {
#define AH_UNPLUGGED 0x2 /* The card has been physically removed. */ #define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
struct ath_hw { struct ath_hw {
struct ath_ops reg_ops;
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct ath_common common; struct ath_common common;
struct ath9k_hw_version hw_version; struct ath9k_hw_version hw_version;
......
...@@ -196,11 +196,6 @@ static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset) ...@@ -196,11 +196,6 @@ static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
return val; return val;
} }
static const struct ath_ops ath9k_common_ops = {
.read = ath9k_ioread32,
.write = ath9k_iowrite32,
};
/**************************/ /**************************/
/* Initialization */ /* Initialization */
/**************************/ /**************************/
...@@ -551,6 +546,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, ...@@ -551,6 +546,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
ah->hw = sc->hw; ah->hw = sc->hw;
ah->hw_version.devid = devid; ah->hw_version.devid = devid;
ah->hw_version.subsysid = subsysid; ah->hw_version.subsysid = subsysid;
ah->reg_ops.read = ath9k_ioread32;
ah->reg_ops.write = ath9k_iowrite32;
sc->sc_ah = ah; sc->sc_ah = ah;
if (!pdata) { if (!pdata) {
...@@ -563,7 +560,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, ...@@ -563,7 +560,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
} }
common = ath9k_hw_common(ah); common = ath9k_hw_common(ah);
common->ops = &ath9k_common_ops; common->ops = &ah->reg_ops;
common->bus_ops = bus_ops; common->bus_ops = bus_ops;
common->ah = ah; common->ah = ah;
common->hw = sc->hw; common->hw = sc->hw;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment