Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: convert HW flags to unsigned long bitmap

As we're running out of hardware capability flags pretty quickly,
convert them to use the regular test_bit() style unsigned long
bitmaps.

This introduces a number of helper functions/macros to set and to
test the bits, along with new debugfs code.

The occurrences of an explicit __clear_bit() are intentional, the
drivers were never supposed to change their supported bits on the
fly. We should investigate changing this to be a per-frame flag.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+446 -422
+4 -4
drivers/net/wireless/adm8211.c
··· 1373 1373 ADM8211_CSR_READ(NAR); 1374 1374 1375 1375 if (priv->nar & ADM8211_NAR_PR) 1376 - dev->flags |= IEEE80211_HW_RX_INCLUDES_FCS; 1376 + ieee80211_hw_set(dev, RX_INCLUDES_FCS); 1377 1377 else 1378 - dev->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; 1378 + __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, dev->flags); 1379 1379 1380 1380 if (*total_flags & FIF_BCN_PRBRESP_PROMISC) 1381 1381 adm8211_set_bssid(dev, bcast); ··· 1861 1861 SET_IEEE80211_PERM_ADDR(dev, perm_addr); 1862 1862 1863 1863 dev->extra_tx_headroom = sizeof(struct adm8211_tx_hdr); 1864 - /* dev->flags = IEEE80211_HW_RX_INCLUDES_FCS in promisc mode */ 1865 - dev->flags = IEEE80211_HW_SIGNAL_UNSPEC; 1864 + /* dev->flags = RX_INCLUDES_FCS in promisc mode */ 1865 + ieee80211_hw_set(dev, SIGNAL_UNSPEC); 1866 1866 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); 1867 1867 1868 1868 dev->max_signal = 100; /* FIXME: find better value */
+2 -2
drivers/net/wireless/at76c50x-usb.c
··· 2360 2360 priv->hw->wiphy->max_scan_ie_len = 0; 2361 2361 priv->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); 2362 2362 priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &at76_supported_band; 2363 - priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 2364 - IEEE80211_HW_SIGNAL_UNSPEC; 2363 + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); 2364 + ieee80211_hw_set(priv->hw, SIGNAL_UNSPEC); 2365 2365 priv->hw->max_signal = 100; 2366 2366 2367 2367 SET_IEEE80211_DEV(priv->hw, &interface->dev);
+3 -3
drivers/net/wireless/ath/ar5523/ar5523.c
··· 1682 1682 (id->driver_info & AR5523_FLAG_ABG) ? '5' : '2'); 1683 1683 1684 1684 ar->vif = NULL; 1685 - hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 1686 - IEEE80211_HW_SIGNAL_DBM | 1687 - IEEE80211_HW_HAS_RATE_CONTROL; 1685 + ieee80211_hw_set(hw, HAS_RATE_CONTROL); 1686 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 1687 + ieee80211_hw_set(hw, SIGNAL_DBM); 1688 1688 hw->extra_tx_headroom = sizeof(struct ar5523_tx_desc) + 1689 1689 sizeof(struct ar5523_chunk); 1690 1690 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
+17 -17
drivers/net/wireless/ath/ath10k/mac.c
··· 6882 6882 BIT(NL80211_IFTYPE_P2P_CLIENT) | 6883 6883 BIT(NL80211_IFTYPE_P2P_GO); 6884 6884 6885 - ar->hw->flags = IEEE80211_HW_SIGNAL_DBM | 6886 - IEEE80211_HW_SUPPORTS_PS | 6887 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 6888 - IEEE80211_HW_MFP_CAPABLE | 6889 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 6890 - IEEE80211_HW_HAS_RATE_CONTROL | 6891 - IEEE80211_HW_AP_LINK_PS | 6892 - IEEE80211_HW_SPECTRUM_MGMT | 6893 - IEEE80211_HW_SW_CRYPTO_CONTROL | 6894 - IEEE80211_HW_SUPPORT_FAST_XMIT | 6895 - IEEE80211_HW_CONNECTION_MONITOR | 6896 - IEEE80211_HW_SUPPORTS_PER_STA_GTK | 6897 - IEEE80211_HW_WANT_MONITOR_VIF | 6898 - IEEE80211_HW_CHANCTX_STA_CSA | 6899 - IEEE80211_HW_QUEUE_CONTROL; 6885 + ieee80211_hw_set(ar->hw, SIGNAL_DBM); 6886 + ieee80211_hw_set(ar->hw, SUPPORTS_PS); 6887 + ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); 6888 + ieee80211_hw_set(ar->hw, MFP_CAPABLE); 6889 + ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); 6890 + ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); 6891 + ieee80211_hw_set(ar->hw, AP_LINK_PS); 6892 + ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); 6893 + ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); 6894 + ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); 6895 + ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); 6896 + ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); 6897 + ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); 6898 + ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); 6899 + ieee80211_hw_set(ar->hw, QUEUE_CONTROL); 6900 6900 6901 6901 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; 6902 6902 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; ··· 6905 6905 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; 6906 6906 6907 6907 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) { 6908 - ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; 6909 - ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW; 6908 + ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); 6909 + ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); 6910 6910 } 6911 6911 6912 6912 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
+6 -6
drivers/net/wireless/ath/ath5k/base.c
··· 2537 2537 2538 2538 /* Initialize driver private data */ 2539 2539 SET_IEEE80211_DEV(hw, ah->dev); 2540 - hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 2541 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 2542 - IEEE80211_HW_SIGNAL_DBM | 2543 - IEEE80211_HW_MFP_CAPABLE | 2544 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 2545 - IEEE80211_HW_SUPPORTS_RC_TABLE; 2540 + ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); 2541 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 2542 + ieee80211_hw_set(hw, MFP_CAPABLE); 2543 + ieee80211_hw_set(hw, SIGNAL_DBM); 2544 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 2545 + ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING); 2546 2546 2547 2547 hw->wiphy->interface_modes = 2548 2548 BIT(NL80211_IFTYPE_AP) |
+10 -10
drivers/net/wireless/ath/ath9k/htc_drv_init.c
··· 717 717 struct ath_common *common = ath9k_hw_common(priv->ah); 718 718 struct base_eep_header *pBase; 719 719 720 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 721 - IEEE80211_HW_AMPDU_AGGREGATION | 722 - IEEE80211_HW_SPECTRUM_MGMT | 723 - IEEE80211_HW_HAS_RATE_CONTROL | 724 - IEEE80211_HW_RX_INCLUDES_FCS | 725 - IEEE80211_HW_PS_NULLFUNC_STACK | 726 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 727 - IEEE80211_HW_MFP_CAPABLE | 728 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; 720 + ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING); 721 + ieee80211_hw_set(hw, MFP_CAPABLE); 722 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 723 + ieee80211_hw_set(hw, PS_NULLFUNC_STACK); 724 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 725 + ieee80211_hw_set(hw, HAS_RATE_CONTROL); 726 + ieee80211_hw_set(hw, SPECTRUM_MGMT); 727 + ieee80211_hw_set(hw, SIGNAL_DBM); 728 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 729 729 730 730 if (ath9k_ps_enable) 731 - hw->flags |= IEEE80211_HW_SUPPORTS_PS; 731 + ieee80211_hw_set(hw, SUPPORTS_PS); 732 732 733 733 hw->wiphy->interface_modes = 734 734 BIT(NL80211_IFTYPE_STATION) |
+12 -12
drivers/net/wireless/ath/ath9k/init.c
··· 796 796 if (!ath9k_is_chanctx_enabled()) 797 797 return; 798 798 799 - hw->flags |= IEEE80211_HW_QUEUE_CONTROL; 799 + ieee80211_hw_set(hw, QUEUE_CONTROL); 800 800 hw->queues = ATH9K_NUM_TX_QUEUES; 801 801 hw->offchannel_tx_hw_queue = hw->queues - 1; 802 802 hw->wiphy->interface_modes &= ~ BIT(NL80211_IFTYPE_WDS); ··· 818 818 struct ath_hw *ah = sc->sc_ah; 819 819 struct ath_common *common = ath9k_hw_common(ah); 820 820 821 - hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 822 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 823 - IEEE80211_HW_SIGNAL_DBM | 824 - IEEE80211_HW_PS_NULLFUNC_STACK | 825 - IEEE80211_HW_SPECTRUM_MGMT | 826 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 827 - IEEE80211_HW_SUPPORTS_RC_TABLE | 828 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES; 821 + ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES); 822 + ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); 823 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 824 + ieee80211_hw_set(hw, SPECTRUM_MGMT); 825 + ieee80211_hw_set(hw, PS_NULLFUNC_STACK); 826 + ieee80211_hw_set(hw, SIGNAL_DBM); 827 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 828 + ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING); 829 829 830 830 if (ath9k_ps_enable) 831 - hw->flags |= IEEE80211_HW_SUPPORTS_PS; 831 + ieee80211_hw_set(hw, SUPPORTS_PS); 832 832 833 833 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) { 834 - hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; 834 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 835 835 836 836 if (AR_SREV_9280_20_OR_LATER(ah)) 837 837 hw->radiotap_mcs_details |= ··· 839 839 } 840 840 841 841 if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || ath9k_modparam_nohwcrypt) 842 - hw->flags |= IEEE80211_HW_MFP_CAPABLE; 842 + ieee80211_hw_set(hw, MFP_CAPABLE); 843 843 844 844 hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR | 845 845 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
+1 -1
drivers/net/wireless/ath/carl9170/fw.c
··· 286 286 } 287 287 288 288 if (SUPP(CARL9170FW_PSM) && SUPP(CARL9170FW_FIXED_5GHZ_PSM)) 289 - ar->hw->flags |= IEEE80211_HW_SUPPORTS_PS; 289 + ieee80211_hw_set(ar->hw, SUPPORTS_PS); 290 290 291 291 if (!SUPP(CARL9170FW_USB_INIT_FIRMWARE)) { 292 292 dev_err(&ar->udev->dev, "firmware does not provide "
+10 -10
drivers/net/wireless/ath/carl9170/main.c
··· 1844 1844 /* firmware decides which modes we support */ 1845 1845 hw->wiphy->interface_modes = 0; 1846 1846 1847 - hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS | 1848 - IEEE80211_HW_MFP_CAPABLE | 1849 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 1850 - IEEE80211_HW_SUPPORTS_PS | 1851 - IEEE80211_HW_PS_NULLFUNC_STACK | 1852 - IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC | 1853 - IEEE80211_HW_SUPPORTS_RC_TABLE | 1854 - IEEE80211_HW_SIGNAL_DBM | 1855 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES; 1847 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 1848 + ieee80211_hw_set(hw, MFP_CAPABLE); 1849 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 1850 + ieee80211_hw_set(hw, SUPPORTS_PS); 1851 + ieee80211_hw_set(hw, PS_NULLFUNC_STACK); 1852 + ieee80211_hw_set(hw, NEED_DTIM_BEFORE_ASSOC); 1853 + ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); 1854 + ieee80211_hw_set(hw, SIGNAL_DBM); 1855 + ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES); 1856 1856 1857 1857 if (!modparam_noht) { 1858 1858 /* 1859 1859 * see the comment above, why we allow the user 1860 1860 * to disable HT by a module parameter. 1861 1861 */ 1862 - hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; 1862 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 1863 1863 } 1864 1864 1865 1865 hw->extra_tx_headroom = sizeof(struct _carl9170_tx_superframe);
+6 -6
drivers/net/wireless/ath/wcn36xx/main.c
··· 944 944 WLAN_CIPHER_SUITE_CCMP, 945 945 }; 946 946 947 - wcn->hw->flags = IEEE80211_HW_SIGNAL_DBM | 948 - IEEE80211_HW_HAS_RATE_CONTROL | 949 - IEEE80211_HW_SUPPORTS_PS | 950 - IEEE80211_HW_CONNECTION_MONITOR | 951 - IEEE80211_HW_AMPDU_AGGREGATION | 952 - IEEE80211_HW_TIMING_BEACON_ONLY; 947 + ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY); 948 + ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION); 949 + ieee80211_hw_set(wcn->hw, CONNECTION_MONITOR); 950 + ieee80211_hw_set(wcn->hw, SUPPORTS_PS); 951 + ieee80211_hw_set(wcn->hw, SIGNAL_DBM); 952 + ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL); 953 953 954 954 wcn->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 955 955 BIT(NL80211_IFTYPE_AP) |
+2 -2
drivers/net/wireless/b43/main.c
··· 5605 5605 wl = hw_to_b43_wl(hw); 5606 5606 5607 5607 /* fill hw info */ 5608 - hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 5609 - IEEE80211_HW_SIGNAL_DBM; 5608 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 5609 + ieee80211_hw_set(hw, SIGNAL_DBM); 5610 5610 5611 5611 hw->wiphy->interface_modes = 5612 5612 BIT(NL80211_IFTYPE_AP) |
+3 -2
drivers/net/wireless/b43legacy/main.c
··· 3832 3832 } 3833 3833 3834 3834 /* fill hw info */ 3835 - hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 3836 - IEEE80211_HW_SIGNAL_DBM; 3835 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 3836 + ieee80211_hw_set(hw, SIGNAL_DBM); 3837 + 3837 3838 hw->wiphy->interface_modes = 3838 3839 BIT(NL80211_IFTYPE_AP) | 3839 3840 BIT(NL80211_IFTYPE_STATION) |
+3 -4
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
··· 1060 1060 */ 1061 1061 static int ieee_hw_init(struct ieee80211_hw *hw) 1062 1062 { 1063 - hw->flags = IEEE80211_HW_SIGNAL_DBM 1064 - /* | IEEE80211_HW_CONNECTION_MONITOR What is this? */ 1065 - | IEEE80211_HW_REPORTS_TX_ACK_STATUS 1066 - | IEEE80211_HW_AMPDU_AGGREGATION; 1063 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 1064 + ieee80211_hw_set(hw, SIGNAL_DBM); 1065 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 1067 1066 1068 1067 hw->extra_tx_headroom = brcms_c_get_header_len(); 1069 1068 hw->queues = N_TX_QUEUES;
+8 -8
drivers/net/wireless/cw1200/main.c
··· 278 278 else 279 279 priv->ba_tx_tid_mask = 0xff; /* Enable TX BLKACK for all TIDs */ 280 280 281 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 282 - IEEE80211_HW_SUPPORTS_PS | 283 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 284 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 285 - IEEE80211_HW_CONNECTION_MONITOR | 286 - IEEE80211_HW_AMPDU_AGGREGATION | 287 - IEEE80211_HW_TX_AMPDU_SETUP_IN_HW | 288 - IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC; 281 + ieee80211_hw_set(hw, NEED_DTIM_BEFORE_ASSOC); 282 + ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW); 283 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 284 + ieee80211_hw_set(hw, CONNECTION_MONITOR); 285 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 286 + ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 287 + ieee80211_hw_set(hw, SIGNAL_DBM); 288 + ieee80211_hw_set(hw, SUPPORTS_PS); 289 289 290 290 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 291 291 BIT(NL80211_IFTYPE_ADHOC) |
+4 -2
drivers/net/wireless/iwlegacy/3945-mac.c
··· 3561 3561 hw->vif_data_size = sizeof(struct il_vif_priv); 3562 3562 3563 3563 /* Tell mac80211 our characteristics */ 3564 - hw->flags = IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_SPECTRUM_MGMT | 3565 - IEEE80211_HW_SUPPORTS_PS | IEEE80211_HW_SUPPORTS_DYNAMIC_PS; 3564 + ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 3565 + ieee80211_hw_set(hw, SUPPORTS_PS); 3566 + ieee80211_hw_set(hw, SIGNAL_DBM); 3567 + ieee80211_hw_set(hw, SPECTRUM_MGMT); 3566 3568 3567 3569 hw->wiphy->interface_modes = 3568 3570 BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
+7 -5
drivers/net/wireless/iwlegacy/4965-mac.c
··· 5751 5751 hw->rate_control_algorithm = "iwl-4965-rs"; 5752 5752 5753 5753 /* Tell mac80211 our characteristics */ 5754 - hw->flags = 5755 - IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_AMPDU_AGGREGATION | 5756 - IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC | IEEE80211_HW_SPECTRUM_MGMT | 5757 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | IEEE80211_HW_SUPPORTS_PS | 5758 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS; 5754 + ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 5755 + ieee80211_hw_set(hw, SUPPORTS_PS); 5756 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 5757 + ieee80211_hw_set(hw, SPECTRUM_MGMT); 5758 + ieee80211_hw_set(hw, NEED_DTIM_BEFORE_ASSOC); 5759 + ieee80211_hw_set(hw, SIGNAL_DBM); 5760 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 5759 5761 if (il->cfg->sku & IL_SKU_N) 5760 5762 hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS | 5761 5763 NL80211_FEATURE_STATIC_SMPS;
+13 -13
drivers/net/wireless/iwlwifi/dvm/mac80211.c
··· 104 104 hw->rate_control_algorithm = "iwl-agn-rs"; 105 105 106 106 /* Tell mac80211 our characteristics */ 107 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 108 - IEEE80211_HW_AMPDU_AGGREGATION | 109 - IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC | 110 - IEEE80211_HW_SPECTRUM_MGMT | 111 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 112 - IEEE80211_HW_QUEUE_CONTROL | 113 - IEEE80211_HW_SUPPORTS_PS | 114 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 115 - IEEE80211_HW_SUPPORT_FAST_XMIT | 116 - IEEE80211_HW_WANT_MONITOR_VIF; 107 + ieee80211_hw_set(hw, SIGNAL_DBM); 108 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 109 + ieee80211_hw_set(hw, NEED_DTIM_BEFORE_ASSOC); 110 + ieee80211_hw_set(hw, SPECTRUM_MGMT); 111 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 112 + ieee80211_hw_set(hw, QUEUE_CONTROL); 113 + ieee80211_hw_set(hw, SUPPORTS_PS); 114 + ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 115 + ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 116 + ieee80211_hw_set(hw, WANT_MONITOR_VIF); 117 117 118 118 hw->offchannel_tx_hw_queue = IWL_AUX_QUEUE; 119 119 hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FMT; ··· 136 136 */ 137 137 if (priv->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP && 138 138 !iwlwifi_mod_params.sw_crypto) 139 - hw->flags |= IEEE80211_HW_MFP_CAPABLE; 139 + ieee80211_hw_set(hw, MFP_CAPABLE); 140 140 141 141 hw->sta_data_size = sizeof(struct iwl_station_priv); 142 142 hw->vif_data_size = sizeof(struct iwl_vif_priv); ··· 1342 1342 * other interfaces are added, this is safe. 1343 1343 */ 1344 1344 if (vif->type == NL80211_IFTYPE_MONITOR) 1345 - priv->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS; 1345 + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); 1346 1346 else 1347 - priv->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; 1347 + __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, priv->hw->flags); 1348 1348 1349 1349 err = iwl_setup_interface(priv, ctx); 1350 1350 if (!err || reset)
+2 -2
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
··· 852 852 MAC_FILTER_IN_BEACON | 853 853 MAC_FILTER_IN_PROBE_REQUEST | 854 854 MAC_FILTER_IN_CRC32); 855 - mvm->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS; 855 + ieee80211_hw_set(mvm->hw, RX_INCLUDES_FCS); 856 856 857 857 return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd); 858 858 } ··· 1270 1270 mvmvif->uploaded = false; 1271 1271 1272 1272 if (vif->type == NL80211_IFTYPE_MONITOR) 1273 - mvm->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; 1273 + __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, mvm->hw->flags); 1274 1274 1275 1275 return 0; 1276 1276 }
+16 -16
drivers/net/wireless/iwlwifi/mvm/mac80211.c
··· 423 423 }; 424 424 425 425 /* Tell mac80211 our characteristics */ 426 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 427 - IEEE80211_HW_SPECTRUM_MGMT | 428 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 429 - IEEE80211_HW_QUEUE_CONTROL | 430 - IEEE80211_HW_WANT_MONITOR_VIF | 431 - IEEE80211_HW_SUPPORTS_PS | 432 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 433 - IEEE80211_HW_AMPDU_AGGREGATION | 434 - IEEE80211_HW_TIMING_BEACON_ONLY | 435 - IEEE80211_HW_CONNECTION_MONITOR | 436 - IEEE80211_HW_CHANCTX_STA_CSA | 437 - IEEE80211_HW_SUPPORT_FAST_XMIT | 438 - IEEE80211_HW_SUPPORTS_CLONED_SKBS; 426 + ieee80211_hw_set(hw, SIGNAL_DBM); 427 + ieee80211_hw_set(hw, SPECTRUM_MGMT); 428 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 429 + ieee80211_hw_set(hw, QUEUE_CONTROL); 430 + ieee80211_hw_set(hw, WANT_MONITOR_VIF); 431 + ieee80211_hw_set(hw, SUPPORTS_PS); 432 + ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 433 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 434 + ieee80211_hw_set(hw, TIMING_BEACON_ONLY); 435 + ieee80211_hw_set(hw, CONNECTION_MONITOR); 436 + ieee80211_hw_set(hw, CHANCTX_STA_CSA); 437 + ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 438 + ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS); 439 439 440 440 hw->queues = mvm->first_agg_queue; 441 441 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE; ··· 459 459 */ 460 460 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP && 461 461 !iwlwifi_mod_params.sw_crypto) { 462 - hw->flags |= IEEE80211_HW_MFP_CAPABLE; 462 + ieee80211_hw_set(hw, MFP_CAPABLE); 463 463 mvm->ciphers[hw->wiphy->n_cipher_suites] = 464 464 WLAN_CIPHER_SUITE_AES_CMAC; 465 465 hw->wiphy->n_cipher_suites++; ··· 474 474 hw->wiphy->n_cipher_suites++; 475 475 } 476 476 477 - hw->flags |= IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS; 477 + ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); 478 478 hw->wiphy->features |= 479 479 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR | 480 480 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | ··· 2885 2885 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 2886 2886 break; 2887 2887 case WLAN_CIPHER_SUITE_AES_CMAC: 2888 - WARN_ON_ONCE(!(hw->flags & IEEE80211_HW_MFP_CAPABLE)); 2888 + WARN_ON_ONCE(!ieee80211_hw_check(hw, MFP_CAPABLE)); 2889 2889 break; 2890 2890 case WLAN_CIPHER_SUITE_WEP40: 2891 2891 case WLAN_CIPHER_SUITE_WEP104:
+1 -1
drivers/net/wireless/libertas_tf/main.c
··· 634 634 priv->tx_skb = NULL; 635 635 636 636 hw->queues = 1; 637 - hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; 637 + ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING); 638 638 hw->extra_tx_headroom = sizeof(struct txpd); 639 639 memcpy(priv->channels, lbtf_channels, sizeof(lbtf_channels)); 640 640 memcpy(priv->rates, lbtf_rates, sizeof(lbtf_rates));
+13 -13
drivers/net/wireless/mac80211_hwsim.c
··· 1286 1286 if (control->sta) 1287 1287 hwsim_check_sta_magic(control->sta); 1288 1288 1289 - if (hw->flags & IEEE80211_HW_SUPPORTS_RC_TABLE) 1289 + if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE)) 1290 1290 ieee80211_get_tx_rates(txi->control.vif, control->sta, skb, 1291 1291 txi->control.rates, 1292 1292 ARRAY_SIZE(txi->control.rates)); ··· 1395 1395 { 1396 1396 u32 _pid = ACCESS_ONCE(wmediumd_portid); 1397 1397 1398 - if (hw->flags & IEEE80211_HW_SUPPORTS_RC_TABLE) { 1398 + if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE)) { 1399 1399 struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb); 1400 1400 ieee80211_get_tx_rates(txi->control.vif, NULL, skb, 1401 1401 txi->control.rates, ··· 1432 1432 if (skb == NULL) 1433 1433 return; 1434 1434 info = IEEE80211_SKB_CB(skb); 1435 - if (hw->flags & IEEE80211_HW_SUPPORTS_RC_TABLE) 1435 + if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE)) 1436 1436 ieee80211_get_tx_rates(vif, NULL, skb, 1437 1437 info->control.rates, 1438 1438 ARRAY_SIZE(info->control.rates)); ··· 2391 2391 if (param->p2p_device) 2392 2392 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_DEVICE); 2393 2393 2394 - hw->flags = IEEE80211_HW_MFP_CAPABLE | 2395 - IEEE80211_HW_SIGNAL_DBM | 2396 - IEEE80211_HW_AMPDU_AGGREGATION | 2397 - IEEE80211_HW_WANT_MONITOR_VIF | 2398 - IEEE80211_HW_QUEUE_CONTROL | 2399 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES | 2400 - IEEE80211_HW_CHANCTX_STA_CSA | 2401 - IEEE80211_HW_SUPPORT_FAST_XMIT; 2394 + ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 2395 + ieee80211_hw_set(hw, CHANCTX_STA_CSA); 2396 + ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES); 2397 + ieee80211_hw_set(hw, QUEUE_CONTROL); 2398 + ieee80211_hw_set(hw, WANT_MONITOR_VIF); 2399 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 2400 + ieee80211_hw_set(hw, MFP_CAPABLE); 2401 + ieee80211_hw_set(hw, SIGNAL_DBM); 2402 2402 if (rctbl) 2403 - hw->flags |= IEEE80211_HW_SUPPORTS_RC_TABLE; 2403 + ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); 2404 2404 2405 2405 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | 2406 2406 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | ··· 2509 2509 } 2510 2510 2511 2511 if (param->no_vif) 2512 - hw->flags |= IEEE80211_HW_NO_AUTO_VIF; 2512 + ieee80211_hw_set(hw, NO_AUTO_VIF); 2513 2513 2514 2514 err = ieee80211_register_hw(hw); 2515 2515 if (err < 0) {
+5 -5
drivers/net/wireless/mediatek/mt7601u/init.c
··· 591 591 SET_IEEE80211_DEV(hw, dev->dev); 592 592 593 593 hw->queues = 4; 594 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 595 - IEEE80211_HW_PS_NULLFUNC_STACK | 596 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES | 597 - IEEE80211_HW_AMPDU_AGGREGATION | 598 - IEEE80211_HW_SUPPORTS_RC_TABLE; 594 + ieee80211_hw_set(hw, SIGNAL_DBM); 595 + ieee80211_hw_set(hw, PS_NULLFUNC_STACK); 596 + ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES); 597 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 598 + ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); 599 599 hw->max_rates = 1; 600 600 hw->max_report_rates = 7; 601 601 hw->max_rate_tries = 1;
+5 -4
drivers/net/wireless/mwl8k.c
··· 2380 2380 if (cap & MWL8K_CAP_GREENFIELD) 2381 2381 band->ht_cap.cap |= IEEE80211_HT_CAP_GRN_FLD; 2382 2382 if (cap & MWL8K_CAP_AMPDU) { 2383 - hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; 2383 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 2384 2384 band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 2385 2385 band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; 2386 2386 } ··· 5431 5431 u8 *addr = sta->addr, idx; 5432 5432 struct mwl8k_sta *sta_info = MWL8K_STA(sta); 5433 5433 5434 - if (!(hw->flags & IEEE80211_HW_AMPDU_AGGREGATION)) 5434 + if (!ieee80211_hw_check(hw, AMPDU_AGGREGATION)) 5435 5435 return -ENOTSUPP; 5436 5436 5437 5437 spin_lock(&priv->stream_lock); ··· 6076 6076 hw->queues = MWL8K_TX_WMM_QUEUES; 6077 6077 6078 6078 /* Set rssi values to dBm */ 6079 - hw->flags |= IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HAS_RATE_CONTROL; 6079 + ieee80211_hw_set(hw, SIGNAL_DBM); 6080 + ieee80211_hw_set(hw, HAS_RATE_CONTROL); 6080 6081 6081 6082 /* 6082 6083 * Ask mac80211 to not to trigger PS mode 6083 6084 * based on PM bit of incoming frames. 6084 6085 */ 6085 6086 if (priv->ap_fw) 6086 - hw->flags |= IEEE80211_HW_AP_LINK_PS; 6087 + ieee80211_hw_set(hw, AP_LINK_PS); 6087 6088 6088 6089 hw->vif_data_size = sizeof(struct mwl8k_vif); 6089 6090 hw->sta_data_size = sizeof(struct mwl8k_sta);
+6 -6
drivers/net/wireless/p54/main.c
··· 746 746 spin_lock_init(&priv->tx_stats_lock); 747 747 skb_queue_head_init(&priv->tx_queue); 748 748 skb_queue_head_init(&priv->tx_pending); 749 - dev->flags = IEEE80211_HW_RX_INCLUDES_FCS | 750 - IEEE80211_HW_SIGNAL_DBM | 751 - IEEE80211_HW_SUPPORTS_PS | 752 - IEEE80211_HW_PS_NULLFUNC_STACK | 753 - IEEE80211_HW_MFP_CAPABLE | 754 - IEEE80211_HW_REPORTS_TX_ACK_STATUS; 749 + ieee80211_hw_set(dev, REPORTS_TX_ACK_STATUS); 750 + ieee80211_hw_set(dev, MFP_CAPABLE); 751 + ieee80211_hw_set(dev, PS_NULLFUNC_STACK); 752 + ieee80211_hw_set(dev, SUPPORTS_PS); 753 + ieee80211_hw_set(dev, RX_INCLUDES_FCS); 754 + ieee80211_hw_set(dev, SIGNAL_DBM); 755 755 756 756 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 757 757 BIT(NL80211_IFTYPE_ADHOC) |
+3 -4
drivers/net/wireless/rsi/rsi_91x_mac80211.c
··· 1062 1062 hw->priv = adapter; 1063 1063 adapter->hw = hw; 1064 1064 1065 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 1066 - IEEE80211_HW_HAS_RATE_CONTROL | 1067 - IEEE80211_HW_AMPDU_AGGREGATION | 1068 - 0; 1065 + ieee80211_hw_set(hw, SIGNAL_DBM); 1066 + ieee80211_hw_set(hw, HAS_RATE_CONTROL); 1067 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 1069 1068 1070 1069 hw->queues = MAX_HW_QUEUES; 1071 1070 hw->extra_tx_headroom = RSI_NEEDED_HEADROOM;
+4 -4
drivers/net/wireless/rt2x00/rt2400pci.c
··· 1574 1574 /* 1575 1575 * Initialize all hw fields. 1576 1576 */ 1577 - rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 1578 - IEEE80211_HW_SIGNAL_DBM | 1579 - IEEE80211_HW_SUPPORTS_PS | 1580 - IEEE80211_HW_PS_NULLFUNC_STACK; 1577 + ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK); 1578 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS); 1579 + ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING); 1580 + ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM); 1581 1581 1582 1582 SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); 1583 1583 SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
+4 -4
drivers/net/wireless/rt2x00/rt2500pci.c
··· 1869 1869 /* 1870 1870 * Initialize all hw fields. 1871 1871 */ 1872 - rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 1873 - IEEE80211_HW_SIGNAL_DBM | 1874 - IEEE80211_HW_SUPPORTS_PS | 1875 - IEEE80211_HW_PS_NULLFUNC_STACK; 1872 + ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK); 1873 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS); 1874 + ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING); 1875 + ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM); 1876 1876 1877 1877 SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); 1878 1878 SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
+4 -5
drivers/net/wireless/rt2x00/rt2500usb.c
··· 1696 1696 * multicast and broadcast traffic immediately instead of buffering it 1697 1697 * infinitly and thus dropping it after some time. 1698 1698 */ 1699 - rt2x00dev->hw->flags = 1700 - IEEE80211_HW_RX_INCLUDES_FCS | 1701 - IEEE80211_HW_SIGNAL_DBM | 1702 - IEEE80211_HW_SUPPORTS_PS | 1703 - IEEE80211_HW_PS_NULLFUNC_STACK; 1699 + ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK); 1700 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS); 1701 + ieee80211_hw_set(rt2x00dev->hw, RX_INCLUDES_FCS); 1702 + ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM); 1704 1703 1705 1704 /* 1706 1705 * Disable powersaving as default.
+7 -9
drivers/net/wireless/rt2x00/rt2800lib.c
··· 7497 7497 /* 7498 7498 * Initialize all hw fields. 7499 7499 */ 7500 - rt2x00dev->hw->flags = 7501 - IEEE80211_HW_SIGNAL_DBM | 7502 - IEEE80211_HW_SUPPORTS_PS | 7503 - IEEE80211_HW_PS_NULLFUNC_STACK | 7504 - IEEE80211_HW_AMPDU_AGGREGATION | 7505 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 7506 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES; 7500 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_HT_CCK_RATES); 7501 + ieee80211_hw_set(rt2x00dev->hw, REPORTS_TX_ACK_STATUS); 7502 + ieee80211_hw_set(rt2x00dev->hw, AMPDU_AGGREGATION); 7503 + ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK); 7504 + ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM); 7505 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS); 7507 7506 7508 7507 /* 7509 7508 * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices ··· 7512 7513 * infinitly and thus dropping it after some time. 7513 7514 */ 7514 7515 if (!rt2x00_is_usb(rt2x00dev)) 7515 - rt2x00dev->hw->flags |= 7516 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; 7516 + ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING); 7517 7517 7518 7518 SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); 7519 7519 SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
+4 -5
drivers/net/wireless/rt2x00/rt61pci.c
··· 2758 2758 /* 2759 2759 * Initialize all hw fields. 2760 2760 */ 2761 - rt2x00dev->hw->flags = 2762 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 2763 - IEEE80211_HW_SIGNAL_DBM | 2764 - IEEE80211_HW_SUPPORTS_PS | 2765 - IEEE80211_HW_PS_NULLFUNC_STACK; 2761 + ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK); 2762 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS); 2763 + ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING); 2764 + ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM); 2766 2765 2767 2766 SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); 2768 2767 SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
+4 -5
drivers/net/wireless/rt2x00/rt73usb.c
··· 2105 2105 /* 2106 2106 * Initialize all hw fields. 2107 2107 * 2108 - * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING unless we are 2108 + * Don't set IEEE80211_HOST_BROADCAST_PS_BUFFERING unless we are 2109 2109 * capable of sending the buffered frames out after the DTIM 2110 2110 * transmission using rt2x00lib_beacondone. This will send out 2111 2111 * multicast and broadcast traffic immediately instead of buffering it 2112 2112 * infinitly and thus dropping it after some time. 2113 2113 */ 2114 - rt2x00dev->hw->flags = 2115 - IEEE80211_HW_SIGNAL_DBM | 2116 - IEEE80211_HW_SUPPORTS_PS | 2117 - IEEE80211_HW_PS_NULLFUNC_STACK; 2114 + ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK); 2115 + ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM); 2116 + ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS); 2118 2117 2119 2118 SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); 2120 2119 SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
+5 -4
drivers/net/wireless/rtl818x/rtl8180/dev.c
··· 1802 1802 priv->band.n_bitrates = 4; 1803 1803 dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band; 1804 1804 1805 - dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 1806 - IEEE80211_HW_RX_INCLUDES_FCS; 1805 + ieee80211_hw_set(dev, HOST_BROADCAST_PS_BUFFERING); 1806 + ieee80211_hw_set(dev, RX_INCLUDES_FCS); 1807 + 1807 1808 dev->vif_data_size = sizeof(struct rtl8180_vif); 1808 1809 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 1809 1810 BIT(NL80211_IFTYPE_ADHOC); ··· 1869 1868 } 1870 1869 1871 1870 if (priv->chip_family != RTL818X_CHIP_FAMILY_RTL8180) 1872 - dev->flags |= IEEE80211_HW_SIGNAL_DBM; 1871 + ieee80211_hw_set(dev, SIGNAL_DBM); 1873 1872 else 1874 - dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC; 1873 + ieee80211_hw_set(dev, SIGNAL_UNSPEC); 1875 1874 1876 1875 rtl8180_eeprom_read(priv); 1877 1876
+3 -3
drivers/net/wireless/rtl818x/rtl8187/dev.c
··· 1478 1478 dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band; 1479 1479 1480 1480 1481 - dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 1482 - IEEE80211_HW_SIGNAL_DBM | 1483 - IEEE80211_HW_RX_INCLUDES_FCS; 1481 + ieee80211_hw_set(dev, RX_INCLUDES_FCS); 1482 + ieee80211_hw_set(dev, HOST_BROADCAST_PS_BUFFERING); 1483 + ieee80211_hw_set(dev, SIGNAL_DBM); 1484 1484 /* Initialize rate-control variables */ 1485 1485 dev->max_rates = 1; 1486 1486 dev->max_rate_tries = RETRY_COUNT;
+10 -12
drivers/net/wireless/rtlwifi/base.c
··· 394 394 } 395 395 } 396 396 /* <5> set hw caps */ 397 - hw->flags = IEEE80211_HW_SIGNAL_DBM | 398 - IEEE80211_HW_RX_INCLUDES_FCS | 399 - IEEE80211_HW_AMPDU_AGGREGATION | 400 - IEEE80211_HW_CONNECTION_MONITOR | 401 - /* IEEE80211_HW_SUPPORTS_CQM_RSSI | */ 402 - IEEE80211_HW_MFP_CAPABLE | 403 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0; 397 + ieee80211_hw_set(hw, SIGNAL_DBM); 398 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 399 + ieee80211_hw_set(hw, AMPDU_AGGREGATION); 400 + ieee80211_hw_set(hw, CONNECTION_MONITOR); 401 + ieee80211_hw_set(hw, MFP_CAPABLE); 402 + ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 404 403 405 404 /* swlps or hwlps has been set in diff chip in init_sw_vars */ 406 - if (rtlpriv->psc.swctrl_lps) 407 - hw->flags |= IEEE80211_HW_SUPPORTS_PS | 408 - IEEE80211_HW_PS_NULLFUNC_STACK | 409 - /* IEEE80211_HW_SUPPORTS_DYNAMIC_PS | */ 410 - 0; 405 + if (rtlpriv->psc.swctrl_lps) { 406 + ieee80211_hw_set(hw, SUPPORTS_PS); 407 + ieee80211_hw_set(hw, PS_NULLFUNC_STACK); 408 + } 411 409 hw->wiphy->interface_modes = 412 410 BIT(NL80211_IFTYPE_AP) | 413 411 BIT(NL80211_IFTYPE_STATION) |
+2 -1
drivers/net/wireless/ti/wl1251/main.c
··· 1476 1476 /* unit us */ 1477 1477 /* FIXME: find a proper value */ 1478 1478 1479 - wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_SUPPORTS_PS; 1479 + ieee80211_hw_set(wl->hw, SIGNAL_DBM); 1480 + ieee80211_hw_set(wl->hw, SUPPORTS_PS); 1480 1481 1481 1482 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 1482 1483 BIT(NL80211_IFTYPE_ADHOC);
+13 -13
drivers/net/wireless/ti/wlcore/main.c
··· 6060 6060 /* FIXME: find a proper value */ 6061 6061 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval; 6062 6062 6063 - wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | 6064 - IEEE80211_HW_SUPPORTS_PS | 6065 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 6066 - IEEE80211_HW_HAS_RATE_CONTROL | 6067 - IEEE80211_HW_CONNECTION_MONITOR | 6068 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 6069 - IEEE80211_HW_SPECTRUM_MGMT | 6070 - IEEE80211_HW_AP_LINK_PS | 6071 - IEEE80211_HW_AMPDU_AGGREGATION | 6072 - IEEE80211_HW_TX_AMPDU_SETUP_IN_HW | 6073 - IEEE80211_HW_QUEUE_CONTROL | 6074 - IEEE80211_HW_CHANCTX_STA_CSA | 6075 - IEEE80211_HW_SUPPORT_FAST_XMIT; 6063 + ieee80211_hw_set(wl->hw, SUPPORT_FAST_XMIT); 6064 + ieee80211_hw_set(wl->hw, CHANCTX_STA_CSA); 6065 + ieee80211_hw_set(wl->hw, QUEUE_CONTROL); 6066 + ieee80211_hw_set(wl->hw, TX_AMPDU_SETUP_IN_HW); 6067 + ieee80211_hw_set(wl->hw, AMPDU_AGGREGATION); 6068 + ieee80211_hw_set(wl->hw, AP_LINK_PS); 6069 + ieee80211_hw_set(wl->hw, SPECTRUM_MGMT); 6070 + ieee80211_hw_set(wl->hw, REPORTS_TX_ACK_STATUS); 6071 + ieee80211_hw_set(wl->hw, CONNECTION_MONITOR); 6072 + ieee80211_hw_set(wl->hw, HAS_RATE_CONTROL); 6073 + ieee80211_hw_set(wl->hw, SUPPORTS_DYNAMIC_PS); 6074 + ieee80211_hw_set(wl->hw, SIGNAL_DBM); 6075 + ieee80211_hw_set(wl->hw, SUPPORTS_PS); 6076 6076 6077 6077 wl->hw->wiphy->cipher_suites = cipher_suites; 6078 6078 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
+4 -4
drivers/net/wireless/zd1211rw/zd_mac.c
··· 1397 1397 1398 1398 hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &mac->band; 1399 1399 1400 - hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 1401 - IEEE80211_HW_SIGNAL_UNSPEC | 1402 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 1403 - IEEE80211_HW_MFP_CAPABLE; 1400 + ieee80211_hw_set(hw, MFP_CAPABLE); 1401 + ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING); 1402 + ieee80211_hw_set(hw, RX_INCLUDES_FCS); 1403 + ieee80211_hw_set(hw, SIGNAL_UNSPEC); 1404 1404 1405 1405 hw->wiphy->interface_modes = 1406 1406 BIT(NL80211_IFTYPE_MESH_POINT) |
+4 -4
drivers/staging/vt6655/device_main.c
··· 1793 1793 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 1794 1794 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP); 1795 1795 1796 - priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 1797 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 1798 - IEEE80211_HW_SIGNAL_DBM | 1799 - IEEE80211_HW_TIMING_BEACON_ONLY; 1796 + ieee80211_hw_set(priv->hw, TIMING_BEACON_ONLY); 1797 + ieee80211_hw_set(priv->hw, SIGNAL_DBM); 1798 + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); 1799 + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); 1800 1800 1801 1801 priv->hw->max_signal = 100; 1802 1802
+4 -4
drivers/staging/vt6656/main_usb.c
··· 978 978 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 979 979 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP); 980 980 981 - priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 982 - IEEE80211_HW_REPORTS_TX_ACK_STATUS | 983 - IEEE80211_HW_SIGNAL_DBM | 984 - IEEE80211_HW_TIMING_BEACON_ONLY; 981 + ieee80211_hw_set(priv->hw, TIMING_BEACON_ONLY); 982 + ieee80211_hw_set(priv->hw, SIGNAL_DBM); 983 + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); 984 + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); 985 985 986 986 priv->hw->max_signal = 100; 987 987
+49 -30
include/net/mac80211.h
··· 1887 1887 * 1888 1888 * @IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS: The HW supports scanning on all bands 1889 1889 * in one command, mac80211 doesn't have to run separate scans per band. 1890 + * 1891 + * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays 1890 1892 */ 1891 1893 enum ieee80211_hw_flags { 1892 - IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, 1893 - IEEE80211_HW_RX_INCLUDES_FCS = 1<<1, 1894 - IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2, 1895 - IEEE80211_HW_SIGNAL_UNSPEC = 1<<5, 1896 - IEEE80211_HW_SIGNAL_DBM = 1<<6, 1897 - IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC = 1<<7, 1898 - IEEE80211_HW_SPECTRUM_MGMT = 1<<8, 1899 - IEEE80211_HW_AMPDU_AGGREGATION = 1<<9, 1900 - IEEE80211_HW_SUPPORTS_PS = 1<<10, 1901 - IEEE80211_HW_PS_NULLFUNC_STACK = 1<<11, 1902 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS = 1<<12, 1903 - IEEE80211_HW_MFP_CAPABLE = 1<<13, 1904 - IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, 1905 - IEEE80211_HW_NO_AUTO_VIF = 1<<15, 1906 - IEEE80211_HW_SW_CRYPTO_CONTROL = 1<<16, 1907 - IEEE80211_HW_SUPPORT_FAST_XMIT = 1<<17, 1908 - IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, 1909 - IEEE80211_HW_CONNECTION_MONITOR = 1<<19, 1910 - IEEE80211_HW_QUEUE_CONTROL = 1<<20, 1911 - IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21, 1912 - IEEE80211_HW_AP_LINK_PS = 1<<22, 1913 - IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23, 1914 - IEEE80211_HW_SUPPORTS_RC_TABLE = 1<<24, 1915 - IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25, 1916 - IEEE80211_HW_TIMING_BEACON_ONLY = 1<<26, 1917 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES = 1<<27, 1918 - IEEE80211_HW_CHANCTX_STA_CSA = 1<<28, 1919 - IEEE80211_HW_SUPPORTS_CLONED_SKBS = 1<<29, 1920 - IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS = 1<<30, 1894 + IEEE80211_HW_HAS_RATE_CONTROL, 1895 + IEEE80211_HW_RX_INCLUDES_FCS, 1896 + IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING, 1897 + IEEE80211_HW_SIGNAL_UNSPEC, 1898 + IEEE80211_HW_SIGNAL_DBM, 1899 + IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC, 1900 + IEEE80211_HW_SPECTRUM_MGMT, 1901 + IEEE80211_HW_AMPDU_AGGREGATION, 1902 + IEEE80211_HW_SUPPORTS_PS, 1903 + IEEE80211_HW_PS_NULLFUNC_STACK, 1904 + IEEE80211_HW_SUPPORTS_DYNAMIC_PS, 1905 + IEEE80211_HW_MFP_CAPABLE, 1906 + IEEE80211_HW_WANT_MONITOR_VIF, 1907 + IEEE80211_HW_NO_AUTO_VIF, 1908 + IEEE80211_HW_SW_CRYPTO_CONTROL, 1909 + IEEE80211_HW_SUPPORT_FAST_XMIT, 1910 + IEEE80211_HW_REPORTS_TX_ACK_STATUS, 1911 + IEEE80211_HW_CONNECTION_MONITOR, 1912 + IEEE80211_HW_QUEUE_CONTROL, 1913 + IEEE80211_HW_SUPPORTS_PER_STA_GTK, 1914 + IEEE80211_HW_AP_LINK_PS, 1915 + IEEE80211_HW_TX_AMPDU_SETUP_IN_HW, 1916 + IEEE80211_HW_SUPPORTS_RC_TABLE, 1917 + IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF, 1918 + IEEE80211_HW_TIMING_BEACON_ONLY, 1919 + IEEE80211_HW_SUPPORTS_HT_CCK_RATES, 1920 + IEEE80211_HW_CHANCTX_STA_CSA, 1921 + IEEE80211_HW_SUPPORTS_CLONED_SKBS, 1922 + IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS, 1923 + 1924 + /* keep last, obviously */ 1925 + NUM_IEEE80211_HW_FLAGS 1921 1926 }; 1922 1927 1923 1928 /** ··· 2029 2024 struct wiphy *wiphy; 2030 2025 const char *rate_control_algorithm; 2031 2026 void *priv; 2032 - u32 flags; 2027 + unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)]; 2033 2028 unsigned int extra_tx_headroom; 2034 2029 unsigned int extra_beacon_tailroom; 2035 2030 int vif_data_size; ··· 2054 2049 const struct ieee80211_cipher_scheme *cipher_schemes; 2055 2050 int txq_ac_max_pending; 2056 2051 }; 2052 + 2053 + static inline bool _ieee80211_hw_check(struct ieee80211_hw *hw, 2054 + enum ieee80211_hw_flags flg) 2055 + { 2056 + return test_bit(flg, hw->flags); 2057 + } 2058 + #define ieee80211_hw_check(hw, flg) _ieee80211_hw_check(hw, IEEE80211_HW_##flg) 2059 + 2060 + static inline void _ieee80211_hw_set(struct ieee80211_hw *hw, 2061 + enum ieee80211_hw_flags flg) 2062 + { 2063 + return __set_bit(flg, hw->flags); 2064 + } 2065 + #define ieee80211_hw_set(hw, flg) _ieee80211_hw_set(hw, IEEE80211_HW_##flg) 2057 2066 2058 2067 /** 2059 2068 * struct ieee80211_scan_request - hw scan request
+2 -2
net/mac80211/agg-tx.c
··· 564 564 return -EINVAL; 565 565 566 566 if ((tid >= IEEE80211_NUM_TIDS) || 567 - !(local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) || 568 - (local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)) 567 + !ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) || 568 + ieee80211_hw_check(&local->hw, TX_AMPDU_SETUP_IN_HW)) 569 569 return -EINVAL; 570 570 571 571 ht_dbg(sdata, "Open BA session requested for %pM tid %u\n",
+5 -5
net/mac80211/cfg.c
··· 1763 1763 /* our RSSI threshold implementation is supported only for 1764 1764 * devices that report signal in dBm. 1765 1765 */ 1766 - if (!(sdata->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)) 1766 + if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) 1767 1767 return -ENOTSUPP; 1768 1768 conf->rssi_threshold = nconf->rssi_threshold; 1769 1769 } ··· 2407 2407 if (sdata->vif.type != NL80211_IFTYPE_STATION) 2408 2408 return -EOPNOTSUPP; 2409 2409 2410 - if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) 2410 + if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) 2411 2411 return -EOPNOTSUPP; 2412 2412 2413 2413 if (enabled == sdata->u.mgd.powersave && ··· 2422 2422 __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps); 2423 2423 sdata_unlock(sdata); 2424 2424 2425 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 2425 + if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) 2426 2426 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 2427 2427 2428 2428 ieee80211_recalc_ps(local, -1); ··· 2466 2466 if (!ieee80211_sdata_running(sdata)) 2467 2467 return -ENETDOWN; 2468 2468 2469 - if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) { 2469 + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { 2470 2470 ret = drv_set_bitrate_mask(local, sdata, mask); 2471 2471 if (ret) 2472 2472 return ret; ··· 3451 3451 3452 3452 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN | 3453 3453 IEEE80211_TX_INTFL_OFFCHAN_TX_OK; 3454 - if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) 3454 + if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 3455 3455 IEEE80211_SKB_CB(skb)->hw_queue = 3456 3456 local->hw.offchannel_tx_hw_queue; 3457 3457
+52 -42
net/mac80211/debugfs.c
··· 91 91 }; 92 92 #endif 93 93 94 + static const char *hw_flag_names[NUM_IEEE80211_HW_FLAGS + 1] = { 95 + #define FLAG(F) [IEEE80211_HW_##F] = #F 96 + FLAG(HAS_RATE_CONTROL), 97 + FLAG(RX_INCLUDES_FCS), 98 + FLAG(HOST_BROADCAST_PS_BUFFERING), 99 + FLAG(SIGNAL_UNSPEC), 100 + FLAG(SIGNAL_DBM), 101 + FLAG(NEED_DTIM_BEFORE_ASSOC), 102 + FLAG(SPECTRUM_MGMT), 103 + FLAG(AMPDU_AGGREGATION), 104 + FLAG(SUPPORTS_PS), 105 + FLAG(PS_NULLFUNC_STACK), 106 + FLAG(SUPPORTS_DYNAMIC_PS), 107 + FLAG(MFP_CAPABLE), 108 + FLAG(WANT_MONITOR_VIF), 109 + FLAG(NO_AUTO_VIF), 110 + FLAG(SW_CRYPTO_CONTROL), 111 + FLAG(SUPPORT_FAST_XMIT), 112 + FLAG(REPORTS_TX_ACK_STATUS), 113 + FLAG(CONNECTION_MONITOR), 114 + FLAG(QUEUE_CONTROL), 115 + FLAG(SUPPORTS_PER_STA_GTK), 116 + FLAG(AP_LINK_PS), 117 + FLAG(TX_AMPDU_SETUP_IN_HW), 118 + FLAG(SUPPORTS_RC_TABLE), 119 + FLAG(P2P_DEV_ADDR_FOR_INTF), 120 + FLAG(TIMING_BEACON_ONLY), 121 + FLAG(SUPPORTS_HT_CCK_RATES), 122 + FLAG(CHANCTX_STA_CSA), 123 + FLAG(SUPPORTS_CLONED_SKBS), 124 + FLAG(SINGLE_SCAN_ON_ALL_BANDS), 125 + 126 + /* keep last for the build bug below */ 127 + (void *)0x1 128 + #undef FLAG 129 + }; 130 + 94 131 static ssize_t hwflags_read(struct file *file, char __user *user_buf, 95 132 size_t count, loff_t *ppos) 96 133 { 97 134 struct ieee80211_local *local = file->private_data; 98 - int mxln = 500; 135 + size_t bufsz = 30 * NUM_IEEE80211_HW_FLAGS; 136 + char *buf = kzalloc(bufsz, GFP_KERNEL); 137 + char *pos = buf, *end = buf + bufsz - 1; 99 138 ssize_t rv; 100 - char *buf = kzalloc(mxln, GFP_KERNEL); 101 - int sf = 0; /* how many written so far */ 139 + int i; 102 140 103 141 if (!buf) 104 - return 0; 142 + return -ENOMEM; 105 143 106 - sf += scnprintf(buf, mxln - sf, "0x%x\n", local->hw.flags); 107 - if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) 108 - sf += scnprintf(buf + sf, mxln - sf, "HAS_RATE_CONTROL\n"); 109 - if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) 110 - sf += scnprintf(buf + sf, mxln - sf, "RX_INCLUDES_FCS\n"); 111 - if (local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING) 112 - sf += scnprintf(buf + sf, mxln - sf, 113 - "HOST_BCAST_PS_BUFFERING\n"); 114 - if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) 115 - sf += scnprintf(buf + sf, mxln - sf, "SIGNAL_UNSPEC\n"); 116 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 117 - sf += scnprintf(buf + sf, mxln - sf, "SIGNAL_DBM\n"); 118 - if (local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC) 119 - sf += scnprintf(buf + sf, mxln - sf, 120 - "NEED_DTIM_BEFORE_ASSOC\n"); 121 - if (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT) 122 - sf += scnprintf(buf + sf, mxln - sf, "SPECTRUM_MGMT\n"); 123 - if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) 124 - sf += scnprintf(buf + sf, mxln - sf, "AMPDU_AGGREGATION\n"); 125 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_PS) 126 - sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_PS\n"); 127 - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) 128 - sf += scnprintf(buf + sf, mxln - sf, "PS_NULLFUNC_STACK\n"); 129 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 130 - sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS\n"); 131 - if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE) 132 - sf += scnprintf(buf + sf, mxln - sf, "MFP_CAPABLE\n"); 133 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 134 - sf += scnprintf(buf + sf, mxln - sf, 135 - "REPORTS_TX_ACK_STATUS\n"); 136 - if (local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) 137 - sf += scnprintf(buf + sf, mxln - sf, "CONNECTION_MONITOR\n"); 138 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK) 139 - sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_PER_STA_GTK\n"); 140 - if (local->hw.flags & IEEE80211_HW_AP_LINK_PS) 141 - sf += scnprintf(buf + sf, mxln - sf, "AP_LINK_PS\n"); 142 - if (local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW) 143 - sf += scnprintf(buf + sf, mxln - sf, "TX_AMPDU_SETUP_IN_HW\n"); 144 + /* fail compilation if somebody adds or removes 145 + * a flag without updating the name array above 146 + */ 147 + BUILD_BUG_ON(hw_flag_names[NUM_IEEE80211_HW_FLAGS] != (void *)0x1); 148 + 149 + for (i = 0; i < NUM_IEEE80211_HW_FLAGS; i++) { 150 + if (test_bit(i, local->hw.flags)) 151 + pos += scnprintf(pos, end - pos, "%s", 152 + hw_flag_names[i]); 153 + } 144 154 145 155 rv = simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); 146 156 kfree(buf);
+1 -1
net/mac80211/driver-ops.h
··· 146 146 147 147 if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 148 148 (sdata->vif.type == NL80211_IFTYPE_MONITOR && 149 - !(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF) && 149 + !ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) && 150 150 !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)))) 151 151 return -EINVAL; 152 152
+5 -5
net/mac80211/iface.c
··· 338 338 if ((iftype != NL80211_IFTYPE_AP && 339 339 iftype != NL80211_IFTYPE_P2P_GO && 340 340 iftype != NL80211_IFTYPE_MESH_POINT) || 341 - !(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) { 341 + !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { 342 342 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; 343 343 return 0; 344 344 } ··· 378 378 int i; 379 379 380 380 for (i = 0; i < IEEE80211_NUM_ACS; i++) { 381 - if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) 381 + if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 382 382 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; 383 383 else if (local->hw.queues >= IEEE80211_NUM_ACS) 384 384 sdata->vif.hw_queue[i] = i; ··· 393 393 struct ieee80211_sub_if_data *sdata; 394 394 int ret; 395 395 396 - if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) 396 + if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) 397 397 return 0; 398 398 399 399 ASSERT_RTNL(); ··· 454 454 { 455 455 struct ieee80211_sub_if_data *sdata; 456 456 457 - if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) 457 + if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) 458 458 return; 459 459 460 460 ASSERT_RTNL(); ··· 1586 1586 break; 1587 1587 case NL80211_IFTYPE_P2P_CLIENT: 1588 1588 case NL80211_IFTYPE_P2P_GO: 1589 - if (local->hw.flags & IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF) { 1589 + if (ieee80211_hw_check(&local->hw, P2P_DEV_ADDR_FOR_INTF)) { 1590 1590 list_for_each_entry(sdata, &local->interfaces, list) { 1591 1591 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) 1592 1592 continue;
+2 -2
net/mac80211/key.c
··· 147 147 * is supported; if not, return. 148 148 */ 149 149 if (sta && !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) && 150 - !(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK)) 150 + !ieee80211_hw_check(&key->local->hw, SUPPORTS_PER_STA_GTK)) 151 151 goto out_unsupported; 152 152 153 153 if (sta && !sta->uploaded) ··· 201 201 /* all of these we can do in software - if driver can */ 202 202 if (ret == 1) 203 203 return 0; 204 - if (key->local->hw.flags & IEEE80211_HW_SW_CRYPTO_CONTROL) 204 + if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL)) 205 205 return -EINVAL; 206 206 return 0; 207 207 default:
+7 -7
net/mac80211/main.c
··· 661 661 { 662 662 bool have_wep = !(IS_ERR(local->wep_tx_tfm) || 663 663 IS_ERR(local->wep_rx_tfm)); 664 - bool have_mfp = local->hw.flags & IEEE80211_HW_MFP_CAPABLE; 664 + bool have_mfp = ieee80211_hw_check(&local->hw, MFP_CAPABLE); 665 665 int n_suites = 0, r = 0, w = 0; 666 666 u32 *suites; 667 667 static const u32 cipher_suites[] = { ··· 681 681 WLAN_CIPHER_SUITE_BIP_GMAC_256, 682 682 }; 683 683 684 - if (local->hw.flags & IEEE80211_HW_SW_CRYPTO_CONTROL || 684 + if (ieee80211_hw_check(&local->hw, SW_CRYPTO_CONTROL) || 685 685 local->hw.wiphy->cipher_suites) { 686 686 /* If the driver advertises, or doesn't support SW crypto, 687 687 * we only need to remove WEP if necessary. ··· 797 797 netdev_features_t feature_whitelist; 798 798 struct cfg80211_chan_def dflt_chandef = {}; 799 799 800 - if (hw->flags & IEEE80211_HW_QUEUE_CONTROL && 800 + if (ieee80211_hw_check(hw, QUEUE_CONTROL) && 801 801 (local->hw.offchannel_tx_hw_queue == IEEE80211_INVAL_HW_QUEUE || 802 802 local->hw.offchannel_tx_hw_queue >= local->hw.queues)) 803 803 return -EINVAL; ··· 945 945 /* mac80211 supports control port protocol changing */ 946 946 local->hw.wiphy->flags |= WIPHY_FLAG_CONTROL_PORT_PROTOCOL; 947 947 948 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) { 948 + if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) { 949 949 local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; 950 - } else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) { 950 + } else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC)) { 951 951 local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; 952 952 if (hw->max_signal <= 0) { 953 953 result = -EINVAL; ··· 1001 1001 local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP; 1002 1002 1003 1003 /* mac80211 supports eCSA, if the driver supports STA CSA at all */ 1004 - if (local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA) 1004 + if (ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA)) 1005 1005 local->ext_capa[0] |= WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING; 1006 1006 1007 1007 local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM; ··· 1069 1069 1070 1070 /* add one default STA interface if supported */ 1071 1071 if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) && 1072 - !(hw->flags & IEEE80211_HW_NO_AUTO_VIF)) { 1072 + !ieee80211_hw_check(hw, NO_AUTO_VIF)) { 1073 1073 result = ieee80211_if_add(local, "wlan%d", NET_NAME_ENUM, NULL, 1074 1074 NL80211_IFTYPE_STATION, NULL); 1075 1075 if (result)
+30 -33
net/mac80211/mlme.c
··· 118 118 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) 119 119 return; 120 120 121 - if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) 121 + if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) 122 122 return; 123 123 124 124 mod_timer(&sdata->u.mgd.bcn_mon_timer, ··· 134 134 135 135 ifmgd->probe_send_count = 0; 136 136 137 - if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) 137 + if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) 138 138 return; 139 139 140 140 mod_timer(&sdata->u.mgd.conn_mon_timer, ··· 677 677 capab |= WLAN_CAPABILITY_PRIVACY; 678 678 679 679 if ((assoc_data->capability & WLAN_CAPABILITY_SPECTRUM_MGMT) && 680 - (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT)) 680 + ieee80211_hw_check(&local->hw, SPECTRUM_MGMT)) 681 681 capab |= WLAN_CAPABILITY_SPECTRUM_MGMT; 682 682 683 683 if (ifmgd->flags & IEEE80211_STA_ENABLE_RRM) ··· 885 885 drv_mgd_prepare_tx(local, sdata); 886 886 887 887 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 888 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 888 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 889 889 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS | 890 890 IEEE80211_TX_INTFL_MLME_CONN_TX; 891 891 ieee80211_tx_skb(sdata, skb); ··· 927 927 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | 928 928 IEEE80211_TX_INTFL_OFFCHAN_TX_OK; 929 929 930 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 930 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 931 931 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 932 932 933 933 if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL) ··· 1198 1198 chanctx = container_of(conf, struct ieee80211_chanctx, conf); 1199 1199 1200 1200 if (local->use_chanctx && 1201 - !(local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)) { 1201 + !ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA)) { 1202 1202 sdata_info(sdata, 1203 1203 "driver doesn't support chan-switch with channel contexts\n"); 1204 1204 goto drop_connection; ··· 1407 1407 return; 1408 1408 1409 1409 if (conf->dynamic_ps_timeout > 0 && 1410 - !(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)) { 1410 + !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) { 1411 1411 mod_timer(&local->dynamic_ps_timer, jiffies + 1412 1412 msecs_to_jiffies(conf->dynamic_ps_timeout)); 1413 1413 } else { 1414 - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) 1414 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) 1415 1415 ieee80211_send_nullfunc(local, sdata, 1); 1416 1416 1417 - if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 1418 - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) 1417 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) && 1418 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 1419 1419 return; 1420 1420 1421 1421 conf->flags |= IEEE80211_CONF_PS; ··· 1474 1474 int count = 0; 1475 1475 int timeout; 1476 1476 1477 - if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) { 1477 + if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) { 1478 1478 local->ps_sdata = NULL; 1479 1479 return; 1480 1480 } ··· 1620 1620 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 1621 1621 } 1622 1622 1623 - if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 1623 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) && 1624 1624 !(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { 1625 1625 if (drv_tx_frames_pending(local)) { 1626 1626 mod_timer(&local->dynamic_ps_timer, jiffies + ··· 1633 1633 } 1634 1634 } 1635 1635 1636 - if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && 1637 - (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) || 1636 + if (!(ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) && 1637 + ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) || 1638 1638 (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { 1639 1639 ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; 1640 1640 local->hw.conf.flags |= IEEE80211_CONF_PS; ··· 2159 2159 ieee80211_recalc_ps(local, -1); 2160 2160 mutex_unlock(&local->iflist_mtx); 2161 2161 2162 - if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) 2162 + if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) 2163 2163 goto out; 2164 2164 2165 2165 /* ··· 2257 2257 */ 2258 2258 ifmgd->probe_send_count++; 2259 2259 2260 - if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 2260 + if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { 2261 2261 ifmgd->nullfunc_failed = false; 2262 2262 ieee80211_send_nullfunc(sdata->local, sdata, 0); 2263 2263 } else { ··· 2562 2562 return; 2563 2563 auth_data->expected_transaction = 4; 2564 2564 drv_mgd_prepare_tx(sdata->local, sdata); 2565 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 2565 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 2566 2566 tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 2567 2567 IEEE80211_TX_INTFL_MLME_CONN_TX; 2568 2568 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, ··· 3337 3337 } 3338 3338 ifmgd->have_beacon = true; 3339 3339 ifmgd->assoc_data->need_beacon = false; 3340 - if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 3340 + if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) { 3341 3341 sdata->vif.bss_conf.sync_tsf = 3342 3342 le64_to_cpu(mgmt->u.beacon.timestamp); 3343 3343 sdata->vif.bss_conf.sync_device_ts = ··· 3443 3443 len - baselen, false, &elems, 3444 3444 care_about_ies, ncrc); 3445 3445 3446 - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) { 3446 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) { 3447 3447 bool directed_tim = ieee80211_check_tim(elems.tim, 3448 3448 elems.tim_len, 3449 3449 ifmgd->aid); ··· 3511 3511 * the driver will use them. The synchronized view is currently 3512 3512 * guaranteed only in certain callbacks. 3513 3513 */ 3514 - if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 3514 + if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) { 3515 3515 sdata->vif.bss_conf.sync_tsf = 3516 3516 le64_to_cpu(mgmt->u.beacon.timestamp); 3517 3517 sdata->vif.bss_conf.sync_device_ts = ··· 3749 3749 auth_data->expected_transaction = trans; 3750 3750 } 3751 3751 3752 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 3752 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 3753 3753 tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 3754 3754 IEEE80211_TX_INTFL_MLME_CONN_TX; 3755 3755 ··· 3822 3822 IEEE80211_ASSOC_MAX_TRIES); 3823 3823 ieee80211_send_assoc(sdata); 3824 3824 3825 - if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { 3825 + if (!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 3826 3826 assoc_data->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT; 3827 3827 assoc_data->timeout_started = true; 3828 3828 run_again(sdata, assoc_data->timeout); ··· 3936 3936 3937 3937 memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN); 3938 3938 3939 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 3939 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 3940 3940 max_tries = max_nullfunc_tries; 3941 3941 else 3942 3942 max_tries = max_probe_tries; ··· 3961 3961 } 3962 3962 } else if (time_is_after_jiffies(ifmgd->probe_timeout)) 3963 3963 run_again(sdata, ifmgd->probe_timeout); 3964 - else if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 3964 + else if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 3965 3965 mlme_dbg(sdata, 3966 3966 "Failed to send nullfunc to AP %pM after %dms, disconnecting\n", 3967 3967 bssid, probe_wait_ms); ··· 4030 4030 4031 4031 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) 4032 4032 { 4033 - u32 flags; 4034 - 4035 4033 if (sdata->vif.type == NL80211_IFTYPE_STATION) { 4036 4034 __ieee80211_stop_poll(sdata); 4037 4035 4038 4036 /* let's probe the connection once */ 4039 - flags = sdata->local->hw.flags; 4040 - if (!(flags & IEEE80211_HW_CONNECTION_MONITOR)) 4037 + if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) 4041 4038 ieee80211_queue_work(&sdata->local->hw, 4042 4039 &sdata->u.mgd.monitor_work); 4043 4040 /* and do all the other regular work too */ ··· 4447 4450 sdata->vif.bss_conf.sync_dtim_count = tim_ie[2]; 4448 4451 else 4449 4452 sdata->vif.bss_conf.sync_dtim_count = 0; 4450 - } else if (!(local->hw.flags & 4451 - IEEE80211_HW_TIMING_BEACON_ONLY)) { 4453 + } else if (!ieee80211_hw_check(&sdata->local->hw, 4454 + TIMING_BEACON_ONLY)) { 4452 4455 ies = rcu_dereference(cbss->proberesp_ies); 4453 4456 /* must be non-NULL since beacon IEs were NULL */ 4454 4457 sdata->vif.bss_conf.sync_tsf = ies->tsf; ··· 4826 4829 rcu_read_unlock(); 4827 4830 4828 4831 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && 4829 - (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK), 4832 + ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK), 4830 4833 "U-APSD not supported with HW_PS_NULLFUNC_STACK\n")) 4831 4834 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; 4832 4835 ··· 4907 4910 rcu_read_lock(); 4908 4911 beacon_ies = rcu_dereference(req->bss->beacon_ies); 4909 4912 4910 - if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC && 4913 + if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && 4911 4914 !beacon_ies) { 4912 4915 /* 4913 4916 * Wait up to one beacon interval ... ··· 4934 4937 assoc_data->timeout = jiffies; 4935 4938 assoc_data->timeout_started = true; 4936 4939 4937 - if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 4940 + if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) { 4938 4941 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; 4939 4942 sdata->vif.bss_conf.sync_device_ts = 4940 4943 bss->device_ts_beacon;
+1 -1
net/mac80211/offchannel.c
··· 46 46 } 47 47 48 48 if (!local->offchannel_ps_enabled || 49 - !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) 49 + !ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) 50 50 /* 51 51 * If power save was enabled, no need to send a nullfunc 52 52 * frame because AP knows that we are sleeping. But if the
+2 -2
net/mac80211/pm.c
··· 23 23 24 24 ieee80211_del_virtual_monitor(local); 25 25 26 - if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { 26 + if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) { 27 27 mutex_lock(&local->sta_mtx); 28 28 list_for_each_entry(sta, &local->sta_list, list) { 29 29 set_sta_flag(sta, WLAN_STA_BLOCK_BA); ··· 82 82 if (err < 0) { 83 83 local->quiescing = false; 84 84 local->wowlan = false; 85 - if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { 85 + if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) { 86 86 mutex_lock(&local->sta_mtx); 87 87 list_for_each_entry(sta, 88 88 &local->sta_list, list) {
+3 -3
net/mac80211/rate.c
··· 680 680 info->control.rates[i].count = 0; 681 681 } 682 682 683 - if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) 683 + if (ieee80211_hw_check(&sdata->local->hw, HAS_RATE_CONTROL)) 684 684 return; 685 685 686 686 if (ista) { ··· 691 691 ref->ops->get_rate(ref->priv, NULL, NULL, txrc); 692 692 } 693 693 694 - if (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_RC_TABLE) 694 + if (ieee80211_hw_check(&sdata->local->hw, SUPPORTS_RC_TABLE)) 695 695 return; 696 696 697 697 ieee80211_get_tx_rates(&sdata->vif, ista, txrc->skb, ··· 733 733 if (local->open_count) 734 734 return -EBUSY; 735 735 736 - if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) { 736 + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { 737 737 if (WARN_ON(!local->ops->set_rts_threshold)) 738 738 return -EINVAL; 739 739 return 0;
+1 -1
net/mac80211/rc80211_minstrel_ht.c
··· 1070 1070 if (sband->band != IEEE80211_BAND_2GHZ) 1071 1071 return; 1072 1072 1073 - if (!(mp->hw->flags & IEEE80211_HW_SUPPORTS_HT_CCK_RATES)) 1073 + if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES)) 1074 1074 return; 1075 1075 1076 1076 mi->cck_supported = 0;
+13 -13
net/mac80211/rx.c
··· 52 52 struct sk_buff *skb, 53 53 unsigned int rtap_vendor_space) 54 54 { 55 - if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) { 55 + if (ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) { 56 56 if (likely(skb->len > FCS_LEN)) 57 57 __pskb_trim(skb, skb->len - FCS_LEN); 58 58 else { ··· 110 110 len = ALIGN(len, 8); 111 111 len += 8; 112 112 } 113 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 113 + if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) 114 114 len += 1; 115 115 116 116 /* antenna field, if we don't have per-chain info */ ··· 185 185 } 186 186 187 187 mpdulen = skb->len; 188 - if (!(has_fcs && (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS))) 188 + if (!(has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS))) 189 189 mpdulen += FCS_LEN; 190 190 191 191 rthdr = (struct ieee80211_radiotap_header *)skb_push(skb, rtap_len); ··· 239 239 } 240 240 241 241 /* IEEE80211_RADIOTAP_FLAGS */ 242 - if (has_fcs && (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)) 242 + if (has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) 243 243 *pos |= IEEE80211_RADIOTAP_F_FCS; 244 244 if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) 245 245 *pos |= IEEE80211_RADIOTAP_F_BADFCS; ··· 289 289 pos += 2; 290 290 291 291 /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */ 292 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM && 292 + if (ieee80211_hw_check(&local->hw, SIGNAL_DBM) && 293 293 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { 294 294 *pos = status->signal; 295 295 rthdr->it_present |= ··· 458 458 * the SKB because it has a bad FCS/PLCP checksum. 459 459 */ 460 460 461 - if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) 461 + if (ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) 462 462 present_fcs_len = FCS_LEN; 463 463 464 464 /* ensure hdr->frame_control and vendor radiotap data are in skb head */ ··· 1197 1197 1198 1198 atomic_inc(&ps->num_sta_ps); 1199 1199 set_sta_flag(sta, WLAN_STA_PS_STA); 1200 - if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS)) 1200 + if (!ieee80211_hw_check(&local->hw, AP_LINK_PS)) 1201 1201 drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta); 1202 1202 ps_dbg(sdata, "STA %pM aid %d enters power save mode\n", 1203 1203 sta->sta.addr, sta->sta.aid); ··· 1245 1245 struct sta_info *sta_inf = container_of(sta, struct sta_info, sta); 1246 1246 bool in_ps; 1247 1247 1248 - WARN_ON(!(sta_inf->local->hw.flags & IEEE80211_HW_AP_LINK_PS)); 1248 + WARN_ON(!ieee80211_hw_check(&sta_inf->local->hw, AP_LINK_PS)); 1249 1249 1250 1250 /* Don't let the same PS state be set twice */ 1251 1251 in_ps = test_sta_flag(sta_inf, WLAN_STA_PS_STA); ··· 1281 1281 * uAPSD and PS-Poll frames (the latter shouldn't even come up from 1282 1282 * it to mac80211 since they're handled.) 1283 1283 */ 1284 - if (sdata->local->hw.flags & IEEE80211_HW_AP_LINK_PS) 1284 + if (ieee80211_hw_check(&sdata->local->hw, AP_LINK_PS)) 1285 1285 return RX_CONTINUE; 1286 1286 1287 1287 /* ··· 1413 1413 * Change STA power saving mode only at the end of a frame 1414 1414 * exchange sequence. 1415 1415 */ 1416 - if (!(sta->local->hw.flags & IEEE80211_HW_AP_LINK_PS) && 1416 + if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && 1417 1417 !ieee80211_has_morefrags(hdr->frame_control) && 1418 1418 !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && 1419 1419 (rx->sdata->vif.type == NL80211_IFTYPE_AP || ··· 2543 2543 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) { 2544 2544 int sig = 0; 2545 2545 2546 - if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 2546 + if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM)) 2547 2547 sig = status->signal; 2548 2548 2549 2549 cfg80211_report_obss_beacon(rx->local->hw.wiphy, ··· 2874 2874 * it transmitted were processed or returned. 2875 2875 */ 2876 2876 2877 - if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 2877 + if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM)) 2878 2878 sig = status->signal; 2879 2879 2880 2880 if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig, ··· 2939 2939 info->flags = IEEE80211_TX_CTL_TX_OFFCHAN | 2940 2940 IEEE80211_TX_INTFL_OFFCHAN_TX_OK | 2941 2941 IEEE80211_TX_CTL_NO_CCK_RATE; 2942 - if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) 2942 + if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 2943 2943 info->hw_queue = 2944 2944 local->hw.offchannel_tx_hw_queue; 2945 2945 }
+5 -5
net/mac80211/scan.c
··· 71 71 s32 signal = 0; 72 72 bool signal_valid; 73 73 74 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 74 + if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) 75 75 signal = rx_status->signal * 100; 76 - else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) 76 + else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC)) 77 77 signal = (rx_status->signal * 100) / local->hw.max_signal; 78 78 79 79 scan_width = NL80211_BSS_CHAN_WIDTH_20; ··· 263 263 if (test_bit(SCAN_HW_CANCELLED, &local->scanning)) 264 264 return false; 265 265 266 - if (local->hw.flags & IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS) { 266 + if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { 267 267 for (i = 0; i < req->n_channels; i++) { 268 268 local->hw_scan_req->req.channels[i] = req->channels[i]; 269 269 bands_used |= BIT(req->channels[i]->band); ··· 332 332 return; 333 333 334 334 if (hw_scan && !aborted && 335 - !(local->hw.flags & IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS) && 335 + !ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS) && 336 336 ieee80211_prep_hw_scan(local)) { 337 337 int rc; 338 338 ··· 526 526 527 527 local->hw_scan_ies_bufsize = local->scan_ies_len + req->ie_len; 528 528 529 - if (local->hw.flags & IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS) { 529 + if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { 530 530 int i, n_bands = 0; 531 531 u8 bands_counted = 0; 532 532
+7 -7
net/mac80211/sta_info.c
··· 282 282 static int sta_prepare_rate_control(struct ieee80211_local *local, 283 283 struct sta_info *sta, gfp_t gfp) 284 284 { 285 - if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) 285 + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) 286 286 return 0; 287 287 288 288 sta->rate_ctrl = local->rate_ctrl; ··· 643 643 } 644 644 645 645 /* No need to do anything if the driver does all */ 646 - if (local->hw.flags & IEEE80211_HW_AP_LINK_PS) 646 + if (ieee80211_hw_check(&local->hw, AP_LINK_PS)) 647 647 return; 648 648 649 649 if (sta->dead) ··· 1148 1148 sta->driver_buffered_tids = 0; 1149 1149 sta->txq_buffered_tids = 0; 1150 1150 1151 - if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS)) 1151 + if (!ieee80211_hw_check(&local->hw, AP_LINK_PS)) 1152 1152 drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); 1153 1153 1154 1154 if (sta->sta.txq[0]) { ··· 1879 1879 sinfo->rx_beacon_signal_avg = ieee80211_ave_rssi(&sdata->vif); 1880 1880 } 1881 1881 1882 - if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) || 1883 - (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) { 1882 + if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) || 1883 + ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) { 1884 1884 if (!(sinfo->filled & BIT(NL80211_STA_INFO_SIGNAL))) { 1885 1885 sinfo->signal = (s8)sta->last_signal; 1886 1886 sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL); ··· 1932 1932 1933 1933 if (!(tidstats->filled & 1934 1934 BIT(NL80211_TID_STATS_TX_MSDU_RETRIES)) && 1935 - local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 1935 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 1936 1936 tidstats->filled |= 1937 1937 BIT(NL80211_TID_STATS_TX_MSDU_RETRIES); 1938 1938 tidstats->tx_msdu_retries = sta->tx_msdu_retries[i]; ··· 1940 1940 1941 1941 if (!(tidstats->filled & 1942 1942 BIT(NL80211_TID_STATS_TX_MSDU_FAILED)) && 1943 - local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 1943 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 1944 1944 tidstats->filled |= 1945 1945 BIT(NL80211_TID_STATS_TX_MSDU_FAILED); 1946 1946 tidstats->tx_msdu_failed = sta->tx_msdu_failed[i];
+6 -7
net/mac80211/status.c
··· 181 181 struct ieee80211_local *local = sta->local; 182 182 struct ieee80211_sub_if_data *sdata = sta->sdata; 183 183 184 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 184 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 185 185 sta->last_rx = jiffies; 186 186 187 187 if (ieee80211_is_data_qos(mgmt->frame_control)) { ··· 414 414 415 415 if (is_teardown) { 416 416 /* This mechanism relies on being able to get ACKs */ 417 - WARN_ON(!(local->hw.flags & 418 - IEEE80211_HW_REPORTS_TX_ACK_STATUS)); 417 + WARN_ON(!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)); 419 418 420 419 /* Check if peer has ACKed */ 421 420 if (flags & IEEE80211_TX_STAT_ACK) { ··· 730 731 ieee80211_get_qos_ctl(hdr), 731 732 sta, true, acked); 732 733 733 - if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) && 734 + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) && 734 735 (ieee80211_is_data(hdr->frame_control)) && 735 736 (rates_idx != -1)) 736 737 sta->last_tx_rate = info->status.rates[rates_idx]; ··· 797 798 ieee80211_frame_acked(sta, skb); 798 799 799 800 if ((sta->sdata->vif.type == NL80211_IFTYPE_STATION) && 800 - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) 801 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 801 802 ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data, 802 803 acked, info->status.tx_time); 803 804 804 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 805 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 805 806 if (info->flags & IEEE80211_TX_STAT_ACK) { 806 807 if (sta->lost_packets) 807 808 sta->lost_packets = 0; ··· 852 853 } 853 854 854 855 if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) && 855 - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && 856 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) && 856 857 !(info->flags & IEEE80211_TX_CTL_INJECTED) && 857 858 local->ps_sdata && !(local->scanning)) { 858 859 if (info->flags & IEEE80211_TX_STAT_ACK) {
+1 -1
net/mac80211/tdls.c
··· 935 935 * packet through the AP. 936 936 */ 937 937 if ((action_code == WLAN_TDLS_TEARDOWN) && 938 - (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { 938 + ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { 939 939 bool try_resend; /* Should we keep skb for possible resend */ 940 940 941 941 /* If not sending directly to peer - no point in keeping skb */
+17 -17
net/mac80211/tx.c
··· 211 211 struct ieee80211_if_managed *ifmgd; 212 212 213 213 /* driver doesn't support power save */ 214 - if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) 214 + if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) 215 215 return TX_CONTINUE; 216 216 217 217 /* hardware does dynamic power save */ 218 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 218 + if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) 219 219 return TX_CONTINUE; 220 220 221 221 /* dynamic power save disabled */ ··· 431 431 if (ieee80211_is_probe_req(hdr->frame_control)) 432 432 return TX_CONTINUE; 433 433 434 - if (tx->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) 434 + if (ieee80211_hw_check(&tx->local->hw, QUEUE_CONTROL)) 435 435 info->hw_queue = tx->sdata->vif.cab_queue; 436 436 437 437 /* no stations in PS mode */ ··· 441 441 info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM; 442 442 443 443 /* device releases frame after DTIM beacon */ 444 - if (!(tx->local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING)) 444 + if (!ieee80211_hw_check(&tx->local->hw, HOST_BROADCAST_PS_BUFFERING)) 445 445 return TX_CONTINUE; 446 446 447 447 /* buffered in mac80211 */ ··· 1185 1185 1186 1186 if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) && 1187 1187 !ieee80211_is_qos_nullfunc(hdr->frame_control) && 1188 - (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) && 1189 - !(local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)) { 1188 + ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) && 1189 + !ieee80211_hw_check(&local->hw, TX_AMPDU_SETUP_IN_HW)) { 1190 1190 struct tid_ampdu_tx *tid_tx; 1191 1191 1192 1192 qc = ieee80211_get_qos_ctl(hdr); ··· 1429 1429 vif = &sdata->vif; 1430 1430 info->hw_queue = 1431 1431 vif->hw_queue[skb_get_queue_mapping(skb)]; 1432 - } else if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) { 1432 + } else if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) { 1433 1433 dev_kfree_skb(skb); 1434 1434 return true; 1435 1435 } else ··· 1475 1475 CALL_TXH(ieee80211_tx_h_ps_buf); 1476 1476 CALL_TXH(ieee80211_tx_h_check_control_port_protocol); 1477 1477 CALL_TXH(ieee80211_tx_h_select_key); 1478 - if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) 1478 + if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) 1479 1479 CALL_TXH(ieee80211_tx_h_rate_ctrl); 1480 1480 1481 1481 if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { ··· 1490 1490 /* handlers after fragment must be aware of tx info fragmentation! */ 1491 1491 CALL_TXH(ieee80211_tx_h_stats); 1492 1492 CALL_TXH(ieee80211_tx_h_encrypt); 1493 - if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) 1493 + if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) 1494 1494 CALL_TXH(ieee80211_tx_h_calculate_duration); 1495 1495 #undef CALL_TXH 1496 1496 ··· 1580 1580 1581 1581 /* set up hw_queue value early */ 1582 1582 if (!(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) || 1583 - !(local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) 1583 + !ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 1584 1584 info->hw_queue = 1585 1585 sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; 1586 1586 ··· 1607 1607 } 1608 1608 1609 1609 if (skb_cloned(skb) && 1610 - (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CLONED_SKBS) || 1610 + (!ieee80211_hw_check(&local->hw, SUPPORTS_CLONED_SKBS) || 1611 1611 !skb_clone_writable(skb, ETH_HLEN) || 1612 1612 (may_encrypt && sdata->crypto_tx_tailroom_needed_cnt))) 1613 1613 I802_DEBUG_INC(local->tx_expand_skb_head_cloned); ··· 2426 2426 struct ieee80211_chanctx_conf *chanctx_conf; 2427 2427 __le16 fc; 2428 2428 2429 - if (!(local->hw.flags & IEEE80211_HW_SUPPORT_FAST_XMIT)) 2429 + if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT)) 2430 2430 return; 2431 2431 2432 2432 /* Locking here protects both the pointer itself, and against concurrent ··· 2442 2442 * cleared/changed already. 2443 2443 */ 2444 2444 spin_lock_bh(&sta->lock); 2445 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_PS && 2446 - !(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) && 2445 + if (ieee80211_hw_check(&local->hw, SUPPORTS_PS) && 2446 + !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS) && 2447 2447 sdata->vif.type == NL80211_IFTYPE_STATION) 2448 2448 goto out; 2449 2449 ··· 2790 2790 if (fast_tx->key) 2791 2791 info->control.hw_key = &fast_tx->key->conf; 2792 2792 2793 - if (!(local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) { 2793 + if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { 2794 2794 tx.skb = skb; 2795 2795 r = ieee80211_tx_h_rate_ctrl(&tx); 2796 2796 skb = tx.skb; ··· 3807 3807 synchronize_net(); 3808 3808 3809 3809 /* Tear down BA sessions so we stop aggregating on this TID */ 3810 - if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) { 3810 + if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION)) { 3811 3811 set_sta_flag(sta, WLAN_STA_BLOCK_BA); 3812 3812 __ieee80211_stop_tx_ba_session(sta, tid, 3813 3813 AGG_STOP_LOCAL_REQUEST); ··· 3821 3821 ieee80211_wake_vif_queues(local, sdata, 3822 3822 IEEE80211_QUEUE_STOP_REASON_RESERVE_TID); 3823 3823 3824 - if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) 3824 + if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION)) 3825 3825 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); 3826 3826 3827 3827 ret = 0;
+3 -3
net/mac80211/util.c
··· 564 564 { 565 565 unsigned int queues; 566 566 567 - if (sdata && local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) { 567 + if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) { 568 568 int ac; 569 569 570 570 queues = 0; ··· 592 592 * If no queue was set, or if the HW doesn't support 593 593 * IEEE80211_HW_QUEUE_CONTROL - flush all queues 594 594 */ 595 - if (!queues || !(local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) 595 + if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 596 596 queues = ieee80211_get_vif_queues(local, sdata); 597 597 598 598 ieee80211_stop_queues_by_reason(&local->hw, queues, ··· 2046 2046 * about the sessions, but we and the AP still think they 2047 2047 * are active. This is really a workaround though. 2048 2048 */ 2049 - if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { 2049 + if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) { 2050 2050 mutex_lock(&local->sta_mtx); 2051 2051 2052 2052 list_for_each_entry(sta, &local->sta_list, list) {