aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2014-11-11 06:48:42 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-12-15 06:34:45 -0500
commit848955ccf0bdf42fff33e021a76f6daec98fe59b (patch)
treef4d17dc5c3f732ad016152ba509b4bc681526ec2
parent4bcc56bb3a9622e877772598d1cac124266b2b8a (diff)
mac80211: move U-APSD enablement to vif flags
In order to let drivers have more dynamic U-APSD support, move the enablement flag to the virtual interface driver flags. This lets drivers not only set it up differently for different interfaces, but also enable/disable on the fly if needed. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c3
-rw-r--r--drivers/net/wireless/cw1200/main.c1
-rw-r--r--drivers/net/wireless/cw1200/sta.c1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c13
-rw-r--r--drivers/net/wireless/ti/wl1251/main.c5
-rw-r--r--drivers/net/wireless/ti/wlcore/main.c2
-rw-r--r--include/net/mac80211.h15
-rw-r--r--net/mac80211/debugfs.c2
-rw-r--r--net/mac80211/main.c4
-rw-r--r--net/mac80211/mlme.c7
10 files changed, 25 insertions, 28 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index c4005670cba2..2619db1e3e74 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -2871,6 +2871,8 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
2871 int bit; 2871 int bit;
2872 u32 vdev_param; 2872 u32 vdev_param;
2873 2873
2874 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
2875
2874 mutex_lock(&ar->conf_mutex); 2876 mutex_lock(&ar->conf_mutex);
2875 2877
2876 memset(arvif, 0, sizeof(*arvif)); 2878 memset(arvif, 0, sizeof(*arvif));
@@ -5024,7 +5026,6 @@ int ath10k_mac_register(struct ath10k *ar)
5024 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM | 5026 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
5025 IEEE80211_HW_SUPPORTS_PS | 5027 IEEE80211_HW_SUPPORTS_PS |
5026 IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 5028 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
5027 IEEE80211_HW_SUPPORTS_UAPSD |
5028 IEEE80211_HW_MFP_CAPABLE | 5029 IEEE80211_HW_MFP_CAPABLE |
5029 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 5030 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
5030 IEEE80211_HW_HAS_RATE_CONTROL | 5031 IEEE80211_HW_HAS_RATE_CONTROL |
diff --git a/drivers/net/wireless/cw1200/main.c b/drivers/net/wireless/cw1200/main.c
index 3e78cc3ccb78..0da6e423da63 100644
--- a/drivers/net/wireless/cw1200/main.c
+++ b/drivers/net/wireless/cw1200/main.c
@@ -282,7 +282,6 @@ static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,
282 IEEE80211_HW_SUPPORTS_PS | 282 IEEE80211_HW_SUPPORTS_PS |
283 IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 283 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
284 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 284 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
285 IEEE80211_HW_SUPPORTS_UAPSD |
286 IEEE80211_HW_CONNECTION_MONITOR | 285 IEEE80211_HW_CONNECTION_MONITOR |
287 IEEE80211_HW_AMPDU_AGGREGATION | 286 IEEE80211_HW_AMPDU_AGGREGATION |
288 IEEE80211_HW_TX_AMPDU_SETUP_IN_HW | 287 IEEE80211_HW_TX_AMPDU_SETUP_IN_HW |
diff --git a/drivers/net/wireless/cw1200/sta.c b/drivers/net/wireless/cw1200/sta.c
index 5b84664db13b..a1e3237c0be8 100644
--- a/drivers/net/wireless/cw1200/sta.c
+++ b/drivers/net/wireless/cw1200/sta.c
@@ -213,6 +213,7 @@ int cw1200_add_interface(struct ieee80211_hw *dev,
213 /* __le32 auto_calibration_mode = __cpu_to_le32(1); */ 213 /* __le32 auto_calibration_mode = __cpu_to_le32(1); */
214 214
215 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | 215 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
216 IEEE80211_VIF_SUPPORTS_UAPSD |
216 IEEE80211_VIF_SUPPORTS_CQM_RSSI; 217 IEEE80211_VIF_SUPPORTS_CQM_RSSI;
217 218
218 mutex_lock(&priv->conf_mutex); 219 mutex_lock(&priv->conf_mutex);
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 31a5b3f4266c..346331d3c696 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -326,6 +326,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
326 hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC | 326 hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC |
327 IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED; 327 IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED;
328 hw->rate_control_algorithm = "iwl-mvm-rs"; 328 hw->rate_control_algorithm = "iwl-mvm-rs";
329 hw->uapsd_queues = IWL_MVM_UAPSD_QUEUES;
330 hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
329 331
330 /* 332 /*
331 * Enable 11w if advertised by firmware and software crypto 333 * Enable 11w if advertised by firmware and software crypto
@@ -336,13 +338,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
336 !iwlwifi_mod_params.sw_crypto) 338 !iwlwifi_mod_params.sw_crypto)
337 hw->flags |= IEEE80211_HW_MFP_CAPABLE; 339 hw->flags |= IEEE80211_HW_MFP_CAPABLE;
338 340
339 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT &&
340 !iwlwifi_mod_params.uapsd_disable) {
341 hw->flags |= IEEE80211_HW_SUPPORTS_UAPSD;
342 hw->uapsd_queues = IWL_MVM_UAPSD_QUEUES;
343 hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
344 }
345
346 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN || 341 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN ||
347 mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) { 342 mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) {
348 hw->flags |= IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS; 343 hw->flags |= IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS;
@@ -1147,6 +1142,10 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
1147 mvm->bf_allowed_vif = mvmvif; 1142 mvm->bf_allowed_vif = mvmvif;
1148 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | 1143 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
1149 IEEE80211_VIF_SUPPORTS_CQM_RSSI; 1144 IEEE80211_VIF_SUPPORTS_CQM_RSSI;
1145 if (mvm->fw->ucode_capa.flags &
1146 IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT &&
1147 !iwlwifi_mod_params.uapsd_disable)
1148 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
1150 } 1149 }
1151 1150
1152 /* 1151 /*
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 0b30a7b4d663..d4ba009ac9aa 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -500,6 +500,7 @@ static int wl1251_op_add_interface(struct ieee80211_hw *hw,
500 int ret = 0; 500 int ret = 0;
501 501
502 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | 502 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
503 IEEE80211_VIF_SUPPORTS_UAPSD |
503 IEEE80211_VIF_SUPPORTS_CQM_RSSI; 504 IEEE80211_VIF_SUPPORTS_CQM_RSSI;
504 505
505 wl1251_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM", 506 wl1251_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
@@ -1480,9 +1481,7 @@ int wl1251_init_ieee80211(struct wl1251 *wl)
1480 /* unit us */ 1481 /* unit us */
1481 /* FIXME: find a proper value */ 1482 /* FIXME: find a proper value */
1482 1483
1483 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | 1484 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_SUPPORTS_PS;
1484 IEEE80211_HW_SUPPORTS_PS |
1485 IEEE80211_HW_SUPPORTS_UAPSD;
1486 1485
1487 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 1486 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1488 BIT(NL80211_IFTYPE_ADHOC); 1487 BIT(NL80211_IFTYPE_ADHOC);
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 6ad3fcedab9b..2a99456b6b8f 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -2508,6 +2508,7 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
2508 } 2508 }
2509 2509
2510 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | 2510 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
2511 IEEE80211_VIF_SUPPORTS_UAPSD |
2511 IEEE80211_VIF_SUPPORTS_CQM_RSSI; 2512 IEEE80211_VIF_SUPPORTS_CQM_RSSI;
2512 2513
2513 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM", 2514 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
@@ -5776,7 +5777,6 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
5776 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | 5777 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
5777 IEEE80211_HW_SUPPORTS_PS | 5778 IEEE80211_HW_SUPPORTS_PS |
5778 IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 5779 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
5779 IEEE80211_HW_SUPPORTS_UAPSD |
5780 IEEE80211_HW_HAS_RATE_CONTROL | 5780 IEEE80211_HW_HAS_RATE_CONTROL |
5781 IEEE80211_HW_CONNECTION_MONITOR | 5781 IEEE80211_HW_CONNECTION_MONITOR |
5782 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 5782 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index b24ef577aed9..4913c00539fb 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1187,10 +1187,15 @@ struct ieee80211_channel_switch {
1187 * monitoring on this virtual interface -- i.e. it can monitor 1187 * monitoring on this virtual interface -- i.e. it can monitor
1188 * connection quality related parameters, such as the RSSI level and 1188 * connection quality related parameters, such as the RSSI level and
1189 * provide notifications if configured trigger levels are reached. 1189 * provide notifications if configured trigger levels are reached.
1190 * @IEEE80211_VIF_SUPPORTS_UAPSD: The device can do U-APSD for this
1191 * interface. This flag should be set during interface addition,
1192 * but may be set/cleared as late as authentication to an AP. It is
1193 * only valid for managed/station mode interfaces.
1190 */ 1194 */
1191enum ieee80211_vif_flags { 1195enum ieee80211_vif_flags {
1192 IEEE80211_VIF_BEACON_FILTER = BIT(0), 1196 IEEE80211_VIF_BEACON_FILTER = BIT(0),
1193 IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1), 1197 IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1),
1198 IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2),
1194}; 1199};
1195 1200
1196/** 1201/**
@@ -1589,11 +1594,6 @@ struct ieee80211_tx_control {
1589 * @IEEE80211_HW_MFP_CAPABLE: 1594 * @IEEE80211_HW_MFP_CAPABLE:
1590 * Hardware supports management frame protection (MFP, IEEE 802.11w). 1595 * Hardware supports management frame protection (MFP, IEEE 802.11w).
1591 * 1596 *
1592 * @IEEE80211_HW_SUPPORTS_UAPSD:
1593 * Hardware supports Unscheduled Automatic Power Save Delivery
1594 * (U-APSD) in managed mode. The mode is configured with
1595 * conf_tx() operation.
1596 *
1597 * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: 1597 * @IEEE80211_HW_REPORTS_TX_ACK_STATUS:
1598 * Hardware can provide ack status reports of Tx frames to 1598 * Hardware can provide ack status reports of Tx frames to
1599 * the stack. 1599 * the stack.
@@ -1679,8 +1679,7 @@ enum ieee80211_hw_flags {
1679 IEEE80211_HW_MFP_CAPABLE = 1<<13, 1679 IEEE80211_HW_MFP_CAPABLE = 1<<13,
1680 IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, 1680 IEEE80211_HW_WANT_MONITOR_VIF = 1<<14,
1681 IEEE80211_HW_NO_AUTO_VIF = 1<<15, 1681 IEEE80211_HW_NO_AUTO_VIF = 1<<15,
1682 /* free slot */ 1682 /* free slots */
1683 IEEE80211_HW_SUPPORTS_UAPSD = 1<<17,
1684 IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, 1683 IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18,
1685 IEEE80211_HW_CONNECTION_MONITOR = 1<<19, 1684 IEEE80211_HW_CONNECTION_MONITOR = 1<<19,
1686 IEEE80211_HW_QUEUE_CONTROL = 1<<20, 1685 IEEE80211_HW_QUEUE_CONTROL = 1<<20,
@@ -2032,7 +2031,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
2032 * enabled whenever user has enabled powersave. 2031 * enabled whenever user has enabled powersave.
2033 * 2032 *
2034 * Driver informs U-APSD client support by enabling 2033 * Driver informs U-APSD client support by enabling
2035 * %IEEE80211_HW_SUPPORTS_UAPSD flag. The mode is configured through the 2034 * %IEEE80211_VIF_SUPPORTS_UAPSD flag. The mode is configured through the
2036 * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS 2035 * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS
2037 * Nullfunc frames and stay awake until the service period has ended. To 2036 * Nullfunc frames and stay awake until the service period has ended. To
2038 * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames 2037 * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c
index 54a189f0393e..eeb0bbd69d98 100644
--- a/net/mac80211/debugfs.c
+++ b/net/mac80211/debugfs.c
@@ -303,8 +303,6 @@ static ssize_t hwflags_read(struct file *file, char __user *user_buf,
303 sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS\n"); 303 sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS\n");
304 if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE) 304 if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE)
305 sf += scnprintf(buf + sf, mxln - sf, "MFP_CAPABLE\n"); 305 sf += scnprintf(buf + sf, mxln - sf, "MFP_CAPABLE\n");
306 if (local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)
307 sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_UAPSD\n");
308 if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 306 if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
309 sf += scnprintf(buf + sf, mxln - sf, 307 sf += scnprintf(buf + sf, mxln - sf,
310 "REPORTS_TX_ACK_STATUS\n"); 308 "REPORTS_TX_ACK_STATUS\n");
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 6ab99da38db9..d9ce33663c73 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -916,10 +916,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
916 } 916 }
917 } 917 }
918 918
919 WARN((local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)
920 && (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK),
921 "U-APSD not supported with HW_PS_NULLFUNC_STACK\n");
922
923 /* 919 /*
924 * Calculate scan IE length -- we need this to alloc 920 * Calculate scan IE length -- we need this to alloc
925 * memory and to subtract from the driver limit. It 921 * memory and to subtract from the driver limit. It
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 75a9bf50207e..f495b800b92c 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -4667,8 +4667,13 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
4667 ifmgd->flags |= IEEE80211_STA_DISABLE_VHT; 4667 ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4668 rcu_read_unlock(); 4668 rcu_read_unlock();
4669 4669
4670 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) &&
4671 (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK),
4672 "U-APSD not supported with HW_PS_NULLFUNC_STACK\n"))
4673 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
4674
4670 if (bss->wmm_used && bss->uapsd_supported && 4675 if (bss->wmm_used && bss->uapsd_supported &&
4671 (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) { 4676 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) {
4672 assoc_data->uapsd = true; 4677 assoc_data->uapsd = true;
4673 ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED; 4678 ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
4674 } else { 4679 } else {