diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2007-12-19 01:31:26 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 15:09:36 -0800 |
commit | 32bfd35d4b63bd63de4bb0d791ef049c3c868726 (patch) | |
tree | c1c213a35a00bcbe71a2ecc6521e19dec66cf6eb /drivers/net/wireless/ath5k | |
parent | f653211197f3841f383fa9757ef8ce182c6cf627 (diff) |
mac80211: dont use interface indices in drivers
This patch gets rid of the if_id stuff where possible in favour of
a new per-virtual-interface structure "struct ieee80211_vif". This
structure is located at the end of the per-interface structure and
contains a variable length driver-use data area.
This has two advantages:
* removes the need to look up interfaces by if_id, this is better
for working with network namespaces and performance
* allows drivers to store and retrieve per-interface data without
having to allocate own lists/hash tables
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath5k')
-rw-r--r-- | drivers/net/wireless/ath5k/base.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/base.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/hw.c | 2 |
3 files changed, 10 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index d3d37282f3dc..742616a03d5f 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c @@ -178,7 +178,8 @@ static void ath5k_remove_interface(struct ieee80211_hw *hw, struct ieee80211_if_init_conf *conf); static int ath5k_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf); -static int ath5k_config_interface(struct ieee80211_hw *hw, int if_id, +static int ath5k_config_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, struct ieee80211_if_conf *conf); static void ath5k_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags, @@ -2498,12 +2499,12 @@ static int ath5k_add_interface(struct ieee80211_hw *hw, int ret; mutex_lock(&sc->lock); - if (sc->iface_id) { + if (sc->vif) { ret = 0; goto end; } - sc->iface_id = conf->if_id; + sc->vif = conf->vif; switch (conf->type) { case IEEE80211_IF_TYPE_STA: @@ -2528,10 +2529,10 @@ ath5k_remove_interface(struct ieee80211_hw *hw, struct ath5k_softc *sc = hw->priv; mutex_lock(&sc->lock); - if (sc->iface_id != conf->if_id) + if (sc->vif != conf->vif) goto end; - sc->iface_id = 0; + sc->vif = NULL; end: mutex_unlock(&sc->lock); } @@ -2549,7 +2550,7 @@ ath5k_config(struct ieee80211_hw *hw, } static int -ath5k_config_interface(struct ieee80211_hw *hw, int if_id, +ath5k_config_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_if_conf *conf) { struct ath5k_softc *sc = hw->priv; @@ -2560,7 +2561,7 @@ ath5k_config_interface(struct ieee80211_hw *hw, int if_id, * be set to mac80211's value at ath5k_config(). */ sc->bintval = 1000 * 1000 / 1024; mutex_lock(&sc->lock); - if (sc->iface_id != if_id) { + if (sc->vif != vif) { ret = -EIO; goto unlock; } diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h index 927d67db3dc2..7ba2223d2247 100644 --- a/drivers/net/wireless/ath5k/base.h +++ b/drivers/net/wireless/ath5k/base.h @@ -123,7 +123,7 @@ struct ath5k_softc { unsigned int curmode; /* current phy mode */ struct ieee80211_channel *curchan; /* current h/w channel */ - int iface_id; /* add/remove_interface id */ + struct ieee80211_vif *vif; struct { u8 rxflags; /* radiotap rx flags */ diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c index 5623d7dc738e..3b9336387df0 100644 --- a/drivers/net/wireless/ath5k/hw.c +++ b/drivers/net/wireless/ath5k/hw.c @@ -533,7 +533,7 @@ static inline void ath5k_hw_write_rate_duration(struct ath5k_hw *ah, * ieee80211_duration() for a brief description of * what rate we should choose to TX ACKs. */ tx_time = ieee80211_generic_frame_duration(sc->hw, - sc->iface_id, 10, control_rate->rate_kbps/100); + sc->vif, 10, control_rate->rate_kbps/100); ath5k_hw_reg_write(ah, tx_time, reg); |