aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/main.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-08-06 08:18:13 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-08-09 15:58:24 -0400
commitf89d1bc4271153ac7864051778c0f2443e5cf2cd (patch)
tree6ffbdac8b042eb4cd6ceba24cbb891cfa1fd1ca6 /drivers/net/wireless/ath/ath9k/main.c
parent020f20f693c254a6daa727473d6e855a63c3e502 (diff)
ath9k: use software queueing for multicast traffic
Create a per-vif dummy node entry for keeping the multicast software queues. This helps in setups with a lot of mulitcast traffic that could otherwise potentially drown out unicast traffic to stations. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/main.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 252497ae5089..911744f5c43c 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -963,6 +963,8 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
963 struct ath_softc *sc = hw->priv; 963 struct ath_softc *sc = hw->priv;
964 struct ath_hw *ah = sc->sc_ah; 964 struct ath_hw *ah = sc->sc_ah;
965 struct ath_common *common = ath9k_hw_common(ah); 965 struct ath_common *common = ath9k_hw_common(ah);
966 struct ath_vif *avp = (void *)vif->drv_priv;
967 struct ath_node *an = &avp->mcast_node;
966 968
967 mutex_lock(&sc->mutex); 969 mutex_lock(&sc->mutex);
968 970
@@ -976,6 +978,12 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
976 if (ath9k_uses_beacons(vif->type)) 978 if (ath9k_uses_beacons(vif->type))
977 ath9k_beacon_assign_slot(sc, vif); 979 ath9k_beacon_assign_slot(sc, vif);
978 980
981 an->sc = sc;
982 an->sta = NULL;
983 an->vif = vif;
984 an->no_ps_filter = true;
985 ath_tx_node_init(sc, an);
986
979 mutex_unlock(&sc->mutex); 987 mutex_unlock(&sc->mutex);
980 return 0; 988 return 0;
981} 989}
@@ -1013,6 +1021,7 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
1013{ 1021{
1014 struct ath_softc *sc = hw->priv; 1022 struct ath_softc *sc = hw->priv;
1015 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 1023 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1024 struct ath_vif *avp = (void *)vif->drv_priv;
1016 1025
1017 ath_dbg(common, CONFIG, "Detach Interface\n"); 1026 ath_dbg(common, CONFIG, "Detach Interface\n");
1018 1027
@@ -1027,6 +1036,8 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
1027 ath9k_calculate_summary_state(hw, NULL); 1036 ath9k_calculate_summary_state(hw, NULL);
1028 ath9k_ps_restore(sc); 1037 ath9k_ps_restore(sc);
1029 1038
1039 ath_tx_node_cleanup(sc, &avp->mcast_node);
1040
1030 mutex_unlock(&sc->mutex); 1041 mutex_unlock(&sc->mutex);
1031} 1042}
1032 1043