diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 18 | ||||
-rw-r--r-- | include/net/mac80211.h | 11 | ||||
-rw-r--r-- | net/mac80211/cfg.c | 4 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 11 | ||||
-rw-r--r-- | net/mac80211/util.c | 7 |
5 files changed, 24 insertions, 27 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index f73eb08a9494..676d49df77ed 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -1763,6 +1763,15 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
1763 | 1763 | ||
1764 | mutex_lock(&priv->mutex); | 1764 | mutex_lock(&priv->mutex); |
1765 | 1765 | ||
1766 | if (changes & BSS_CHANGED_QOS) { | ||
1767 | unsigned long flags; | ||
1768 | |||
1769 | spin_lock_irqsave(&priv->lock, flags); | ||
1770 | priv->qos_data.qos_active = bss_conf->qos; | ||
1771 | iwl_update_qos(priv); | ||
1772 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1773 | } | ||
1774 | |||
1766 | if (changes & BSS_CHANGED_BEACON && vif->type == NL80211_IFTYPE_AP) { | 1775 | if (changes & BSS_CHANGED_BEACON && vif->type == NL80211_IFTYPE_AP) { |
1767 | dev_kfree_skb(priv->ibss_beacon); | 1776 | dev_kfree_skb(priv->ibss_beacon); |
1768 | priv->ibss_beacon = ieee80211_beacon_get(hw, vif); | 1777 | priv->ibss_beacon = ieee80211_beacon_get(hw, vif); |
@@ -2134,15 +2143,6 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed) | |||
2134 | iwl_set_tx_power(priv, conf->power_level, false); | 2143 | iwl_set_tx_power(priv, conf->power_level, false); |
2135 | } | 2144 | } |
2136 | 2145 | ||
2137 | if (changed & IEEE80211_CONF_CHANGE_QOS) { | ||
2138 | bool qos_active = !!(conf->flags & IEEE80211_CONF_QOS); | ||
2139 | |||
2140 | spin_lock_irqsave(&priv->lock, flags); | ||
2141 | priv->qos_data.qos_active = qos_active; | ||
2142 | iwl_update_qos(priv); | ||
2143 | spin_unlock_irqrestore(&priv->lock, flags); | ||
2144 | } | ||
2145 | |||
2146 | if (!iwl_is_ready(priv)) { | 2146 | if (!iwl_is_ready(priv)) { |
2147 | IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); | 2147 | IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); |
2148 | goto out; | 2148 | goto out; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 7f256e23c57f..20d372edec29 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -147,6 +147,8 @@ struct ieee80211_low_level_stats { | |||
147 | * @BSS_CHANGED_CQM: Connection quality monitor config changed | 147 | * @BSS_CHANGED_CQM: Connection quality monitor config changed |
148 | * @BSS_CHANGED_IBSS: IBSS join status changed | 148 | * @BSS_CHANGED_IBSS: IBSS join status changed |
149 | * @BSS_CHANGED_ARP_FILTER: Hardware ARP filter address list or state changed. | 149 | * @BSS_CHANGED_ARP_FILTER: Hardware ARP filter address list or state changed. |
150 | * @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note | ||
151 | * that it is only ever disabled for station mode. | ||
150 | */ | 152 | */ |
151 | enum ieee80211_bss_change { | 153 | enum ieee80211_bss_change { |
152 | BSS_CHANGED_ASSOC = 1<<0, | 154 | BSS_CHANGED_ASSOC = 1<<0, |
@@ -162,6 +164,7 @@ enum ieee80211_bss_change { | |||
162 | BSS_CHANGED_CQM = 1<<10, | 164 | BSS_CHANGED_CQM = 1<<10, |
163 | BSS_CHANGED_IBSS = 1<<11, | 165 | BSS_CHANGED_IBSS = 1<<11, |
164 | BSS_CHANGED_ARP_FILTER = 1<<12, | 166 | BSS_CHANGED_ARP_FILTER = 1<<12, |
167 | BSS_CHANGED_QOS = 1<<13, | ||
165 | 168 | ||
166 | /* when adding here, make sure to change ieee80211_reconfig */ | 169 | /* when adding here, make sure to change ieee80211_reconfig */ |
167 | }; | 170 | }; |
@@ -217,6 +220,7 @@ enum ieee80211_bss_change { | |||
217 | * filter ARP queries based on the @arp_addr_list, if disabled, the | 220 | * filter ARP queries based on the @arp_addr_list, if disabled, the |
218 | * hardware must not perform any ARP filtering. Note, that the filter will | 221 | * hardware must not perform any ARP filtering. Note, that the filter will |
219 | * be enabled also in promiscuous mode. | 222 | * be enabled also in promiscuous mode. |
223 | * @qos: This is a QoS-enabled BSS. | ||
220 | */ | 224 | */ |
221 | struct ieee80211_bss_conf { | 225 | struct ieee80211_bss_conf { |
222 | const u8 *bssid; | 226 | const u8 *bssid; |
@@ -240,6 +244,7 @@ struct ieee80211_bss_conf { | |||
240 | __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; | 244 | __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; |
241 | u8 arp_addr_cnt; | 245 | u8 arp_addr_cnt; |
242 | bool arp_filter_enabled; | 246 | bool arp_filter_enabled; |
247 | bool qos; | ||
243 | }; | 248 | }; |
244 | 249 | ||
245 | /** | 250 | /** |
@@ -620,15 +625,11 @@ struct ieee80211_rx_status { | |||
620 | * may turn the device off as much as possible. Typically, this flag will | 625 | * may turn the device off as much as possible. Typically, this flag will |
621 | * be set when an interface is set UP but not associated or scanning, but | 626 | * be set when an interface is set UP but not associated or scanning, but |
622 | * it can also be unset in that case when monitor interfaces are active. | 627 | * it can also be unset in that case when monitor interfaces are active. |
623 | * @IEEE80211_CONF_QOS: Enable 802.11e QoS also know as WMM (Wireless | ||
624 | * Multimedia). On some drivers (iwlwifi is one of know) we have | ||
625 | * to enable/disable QoS explicitly. | ||
626 | */ | 628 | */ |
627 | enum ieee80211_conf_flags { | 629 | enum ieee80211_conf_flags { |
628 | IEEE80211_CONF_MONITOR = (1<<0), | 630 | IEEE80211_CONF_MONITOR = (1<<0), |
629 | IEEE80211_CONF_PS = (1<<1), | 631 | IEEE80211_CONF_PS = (1<<1), |
630 | IEEE80211_CONF_IDLE = (1<<2), | 632 | IEEE80211_CONF_IDLE = (1<<2), |
631 | IEEE80211_CONF_QOS = (1<<3), | ||
632 | }; | 633 | }; |
633 | 634 | ||
634 | 635 | ||
@@ -643,7 +644,6 @@ enum ieee80211_conf_flags { | |||
643 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed | 644 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed |
644 | * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed | 645 | * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed |
645 | * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed | 646 | * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed |
646 | * @IEEE80211_CONF_CHANGE_QOS: Quality of service was enabled or disabled | ||
647 | */ | 647 | */ |
648 | enum ieee80211_conf_changed { | 648 | enum ieee80211_conf_changed { |
649 | IEEE80211_CONF_CHANGE_SMPS = BIT(1), | 649 | IEEE80211_CONF_CHANGE_SMPS = BIT(1), |
@@ -654,7 +654,6 @@ enum ieee80211_conf_changed { | |||
654 | IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), | 654 | IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), |
655 | IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), | 655 | IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), |
656 | IEEE80211_CONF_CHANGE_IDLE = BIT(8), | 656 | IEEE80211_CONF_CHANGE_IDLE = BIT(8), |
657 | IEEE80211_CONF_CHANGE_QOS = BIT(9), | ||
658 | }; | 657 | }; |
659 | 658 | ||
660 | /** | 659 | /** |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 5b8b4460b69f..35b07ea0633a 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1154,10 +1154,6 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy, | |||
1154 | return -EINVAL; | 1154 | return -EINVAL; |
1155 | } | 1155 | } |
1156 | 1156 | ||
1157 | /* enable WMM or activate new settings */ | ||
1158 | local->hw.conf.flags |= IEEE80211_CONF_QOS; | ||
1159 | drv_config(local, IEEE80211_CONF_CHANGE_QOS); | ||
1160 | |||
1161 | return 0; | 1157 | return 0; |
1162 | } | 1158 | } |
1163 | 1159 | ||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index d1962650b254..7a4e4bffbc71 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -698,10 +698,11 @@ void ieee80211_dynamic_ps_timer(unsigned long data) | |||
698 | 698 | ||
699 | /* MLME */ | 699 | /* MLME */ |
700 | static void ieee80211_sta_wmm_params(struct ieee80211_local *local, | 700 | static void ieee80211_sta_wmm_params(struct ieee80211_local *local, |
701 | struct ieee80211_if_managed *ifmgd, | 701 | struct ieee80211_sub_if_data *sdata, |
702 | u8 *wmm_param, size_t wmm_param_len) | 702 | u8 *wmm_param, size_t wmm_param_len) |
703 | { | 703 | { |
704 | struct ieee80211_tx_queue_params params; | 704 | struct ieee80211_tx_queue_params params; |
705 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | ||
705 | size_t left; | 706 | size_t left; |
706 | int count; | 707 | int count; |
707 | u8 *pos, uapsd_queues = 0; | 708 | u8 *pos, uapsd_queues = 0; |
@@ -790,8 +791,8 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local, | |||
790 | } | 791 | } |
791 | 792 | ||
792 | /* enable WMM or activate new settings */ | 793 | /* enable WMM or activate new settings */ |
793 | local->hw.conf.flags |= IEEE80211_CONF_QOS; | 794 | sdata->vif.bss_conf.qos = true; |
794 | drv_config(local, IEEE80211_CONF_CHANGE_QOS); | 795 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); |
795 | } | 796 | } |
796 | 797 | ||
797 | static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, | 798 | static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, |
@@ -1325,7 +1326,7 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk, | |||
1325 | } | 1326 | } |
1326 | 1327 | ||
1327 | if (elems.wmm_param) | 1328 | if (elems.wmm_param) |
1328 | ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param, | 1329 | ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, |
1329 | elems.wmm_param_len); | 1330 | elems.wmm_param_len); |
1330 | else | 1331 | else |
1331 | ieee80211_set_wmm_default(sdata); | 1332 | ieee80211_set_wmm_default(sdata); |
@@ -1597,7 +1598,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, | |||
1597 | ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, | 1598 | ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, |
1598 | true); | 1599 | true); |
1599 | 1600 | ||
1600 | ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param, | 1601 | ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, |
1601 | elems.wmm_param_len); | 1602 | elems.wmm_param_len); |
1602 | } | 1603 | } |
1603 | 1604 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index a54cf146ed50..794792177376 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -803,8 +803,8 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata) | |||
803 | 803 | ||
804 | /* after reinitialize QoS TX queues setting to default, | 804 | /* after reinitialize QoS TX queues setting to default, |
805 | * disable QoS at all */ | 805 | * disable QoS at all */ |
806 | local->hw.conf.flags &= ~IEEE80211_CONF_QOS; | 806 | sdata->vif.bss_conf.qos = sdata->vif.type != NL80211_IFTYPE_STATION; |
807 | drv_config(local, IEEE80211_CONF_CHANGE_QOS); | 807 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); |
808 | } | 808 | } |
809 | 809 | ||
810 | void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, | 810 | void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, |
@@ -1161,7 +1161,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1161 | BSS_CHANGED_BASIC_RATES | | 1161 | BSS_CHANGED_BASIC_RATES | |
1162 | BSS_CHANGED_BEACON_INT | | 1162 | BSS_CHANGED_BEACON_INT | |
1163 | BSS_CHANGED_BSSID | | 1163 | BSS_CHANGED_BSSID | |
1164 | BSS_CHANGED_CQM; | 1164 | BSS_CHANGED_CQM | |
1165 | BSS_CHANGED_QOS; | ||
1165 | 1166 | ||
1166 | switch (sdata->vif.type) { | 1167 | switch (sdata->vif.type) { |
1167 | case NL80211_IFTYPE_STATION: | 1168 | case NL80211_IFTYPE_STATION: |