diff options
author | Johannes Berg <johannes.berg@intel.com> | 2014-11-11 06:48:42 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-12-15 06:34:45 -0500 |
commit | 848955ccf0bdf42fff33e021a76f6daec98fe59b (patch) | |
tree | f4d17dc5c3f732ad016152ba509b4bc681526ec2 | |
parent | 4bcc56bb3a9622e877772598d1cac124266b2b8a (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.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/cw1200/main.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/cw1200/sta.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wl1251/main.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wlcore/main.c | 2 | ||||
-rw-r--r-- | include/net/mac80211.h | 15 | ||||
-rw-r--r-- | net/mac80211/debugfs.c | 2 | ||||
-rw-r--r-- | net/mac80211/main.c | 4 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 7 |
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 | */ |
1191 | enum ieee80211_vif_flags { | 1195 | enum 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 { |