aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/util.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-03-28 05:04:25 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-04-10 14:54:10 -0400
commit54bcbc695e2ca88e1c8f05a93d38a04ac6b1aa0e (patch)
tree9de43e51ce2195f5a81fa75770417c584ef50254 /net/mac80211/util.c
parenta3304b0a17495183a2270d4a25978795226597a4 (diff)
mac80211: refuse TX queue configuration on non-QoS HW
Drivers that don't support QoS also don't support setting up their ACs, catch that early. While at it, remove the input check since cfg80211 does it now. Also fix up the restart code to not try to set up the queues in this case. Finally also change the tx_conf array to have IEEE80211_NUM_ACS entries instead of # of queues since that's what it really needs. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r--net/mac80211/util.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 1d4b8b7a5a33..2b62307825d4 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -769,19 +769,22 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
769{ 769{
770 struct ieee80211_local *local = sdata->local; 770 struct ieee80211_local *local = sdata->local;
771 struct ieee80211_tx_queue_params qparam; 771 struct ieee80211_tx_queue_params qparam;
772 int queue; 772 int ac;
773 bool use_11b; 773 bool use_11b;
774 int aCWmin, aCWmax; 774 int aCWmin, aCWmax;
775 775
776 if (!local->ops->conf_tx) 776 if (!local->ops->conf_tx)
777 return; 777 return;
778 778
779 if (local->hw.queues < IEEE80211_NUM_ACS)
780 return;
781
779 memset(&qparam, 0, sizeof(qparam)); 782 memset(&qparam, 0, sizeof(qparam));
780 783
781 use_11b = (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) && 784 use_11b = (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) &&
782 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE); 785 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE);
783 786
784 for (queue = 0; queue < local->hw.queues; queue++) { 787 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
785 /* Set defaults according to 802.11-2007 Table 7-37 */ 788 /* Set defaults according to 802.11-2007 Table 7-37 */
786 aCWmax = 1023; 789 aCWmax = 1023;
787 if (use_11b) 790 if (use_11b)
@@ -789,7 +792,7 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
789 else 792 else
790 aCWmin = 15; 793 aCWmin = 15;
791 794
792 switch (queue) { 795 switch (ac) {
793 case IEEE80211_AC_BK: 796 case IEEE80211_AC_BK:
794 qparam.cw_max = aCWmax; 797 qparam.cw_max = aCWmax;
795 qparam.cw_min = aCWmin; 798 qparam.cw_min = aCWmin;
@@ -825,8 +828,8 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
825 828
826 qparam.uapsd = false; 829 qparam.uapsd = false;
827 830
828 sdata->tx_conf[queue] = qparam; 831 sdata->tx_conf[ac] = qparam;
829 drv_conf_tx(local, sdata, queue, &qparam); 832 drv_conf_tx(local, sdata, ac, &qparam);
830 } 833 }
831 834
832 /* after reinitialize QoS TX queues setting to default, 835 /* after reinitialize QoS TX queues setting to default,
@@ -1226,14 +1229,17 @@ int ieee80211_reconfig(struct ieee80211_local *local)
1226 mutex_unlock(&local->sta_mtx); 1229 mutex_unlock(&local->sta_mtx);
1227 1230
1228 /* reconfigure tx conf */ 1231 /* reconfigure tx conf */
1229 list_for_each_entry(sdata, &local->interfaces, list) { 1232 if (hw->queues >= IEEE80211_NUM_ACS) {
1230 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 1233 list_for_each_entry(sdata, &local->interfaces, list) {
1231 sdata->vif.type == NL80211_IFTYPE_MONITOR || 1234 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
1232 !ieee80211_sdata_running(sdata)) 1235 sdata->vif.type == NL80211_IFTYPE_MONITOR ||
1233 continue; 1236 !ieee80211_sdata_running(sdata))
1237 continue;
1234 1238
1235 for (i = 0; i < hw->queues; i++) 1239 for (i = 0; i < IEEE80211_NUM_ACS; i++)
1236 drv_conf_tx(local, sdata, i, &sdata->tx_conf[i]); 1240 drv_conf_tx(local, sdata, i,
1241 &sdata->tx_conf[i]);
1242 }
1237 } 1243 }
1238 1244
1239 /* reconfigure hardware */ 1245 /* reconfigure hardware */