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

Merge tag 'mac80211-next-for-davem-2015-06-10' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next

Johannes Berg says:

====================
For this round we mostly have fixes:
* mesh fixes from Alexis Green and Chun-Yeow Yeoh,
* a documentation fix from Jakub Kicinski,
* a missing channel release (from Michal Kazior),
* a fix for a signal strength reporting bug (from Sara Sharon),
* handle deauth while associating (myself),
* don't report mangled TX SKB back to userspace for status (myself),
* handle aggregation session timeouts properly in fast-xmit (myself)

However, there are also a few cleanups and one big change that
affects all drivers (and that required me to pull in your tree)
to change the mac80211 HW flags to use an unsigned long bitmap
so that we can extend them more easily - we're running out of
flags even with a cleanup to remove the two unused ones.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+765 -748
+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) |
+1 -3
drivers/net/wireless/ath/wcn36xx/smd.c
··· 216 216 memcpy(&sta_params->bssid, vif->addr, ETH_ALEN); 217 217 218 218 sta_params->encrypt_type = priv_vif->encrypt_type; 219 - sta_params->short_preamble_supported = 220 - !(WCN36XX_FLAGS(wcn) & 221 - IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE); 219 + sta_params->short_preamble_supported = true; 222 220 223 221 sta_params->rifs_mode = 0; 224 222 sta_params->rmf = 0;
+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_SINGLE_HW_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
+60 -48
include/net/mac80211.h
··· 446 446 * @ibss_creator: indicates if a new IBSS network is being created 447 447 * @aid: association ID number, valid only when @assoc is true 448 448 * @use_cts_prot: use CTS protection 449 - * @use_short_preamble: use 802.11b short preamble; 450 - * if the hardware cannot handle this it must set the 451 - * IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE hardware flag 452 - * @use_short_slot: use short slot time (only relevant for ERP); 453 - * if the hardware cannot handle this it must set the 454 - * IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE hardware flag 449 + * @use_short_preamble: use 802.11b short preamble 450 + * @use_short_slot: use short slot time (only relevant for ERP) 455 451 * @dtim_period: num of beacons before the next DTIM, for beaconing, 456 452 * valid in station mode only if after the driver was notified 457 453 * with the %BSS_CHANGED_BEACON_INFO flag, will be non-zero then. ··· 870 874 u32 flags; 871 875 /* 4 bytes free */ 872 876 } control; 877 + struct { 878 + u64 cookie; 879 + } ack; 873 880 struct { 874 881 struct ieee80211_tx_rate rates[IEEE80211_TX_MAX_RATES]; 875 882 s32 ack_signal; ··· 1478 1479 * wants to be given when a frame is transmitted and needs to be 1479 1480 * encrypted in hardware. 1480 1481 * @cipher: The key's cipher suite selector. 1482 + * @tx_pn: PN used for TX on non-TKIP keys, may be used by the driver 1483 + * as well if it needs to do software PN assignment by itself 1484 + * (e.g. due to TSO) 1481 1485 * @flags: key flags, see &enum ieee80211_key_flags. 1482 1486 * @keyidx: the key index (0-3) 1483 1487 * @keylen: key material length ··· 1493 1491 * @iv_len: The IV length for this key type 1494 1492 */ 1495 1493 struct ieee80211_key_conf { 1494 + atomic64_t tx_pn; 1496 1495 u32 cipher; 1497 1496 u8 icv_len; 1498 1497 u8 iv_len; ··· 1780 1777 * multicast frames when there are power saving stations so that 1781 1778 * the driver can fetch them with ieee80211_get_buffered_bc(). 1782 1779 * 1783 - * @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE: 1784 - * Hardware is not capable of short slot operation on the 2.4 GHz band. 1785 - * 1786 - * @IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE: 1787 - * Hardware is not capable of receiving frames with short preamble on 1788 - * the 2.4 GHz band. 1789 - * 1790 1780 * @IEEE80211_HW_SIGNAL_UNSPEC: 1791 1781 * Hardware can provide signal values but we don't know its units. We 1792 1782 * expect values between 0 and @max_signal. ··· 1885 1889 * @IEEE80211_HW_SUPPORTS_CLONED_SKBS: The driver will never modify the payload 1886 1890 * or tailroom of TX skbs without copying them first. 1887 1891 * 1888 - * @IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS: The HW supports scanning on all bands 1892 + * @IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS: The HW supports scanning on all bands 1889 1893 * in one command, mac80211 doesn't have to run separate scans per band. 1894 + * 1895 + * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays 1890 1896 */ 1891 1897 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_2GHZ_SHORT_SLOT_INCAPABLE = 1<<3, 1896 - IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4, 1897 - IEEE80211_HW_SIGNAL_UNSPEC = 1<<5, 1898 - IEEE80211_HW_SIGNAL_DBM = 1<<6, 1899 - IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC = 1<<7, 1900 - IEEE80211_HW_SPECTRUM_MGMT = 1<<8, 1901 - IEEE80211_HW_AMPDU_AGGREGATION = 1<<9, 1902 - IEEE80211_HW_SUPPORTS_PS = 1<<10, 1903 - IEEE80211_HW_PS_NULLFUNC_STACK = 1<<11, 1904 - IEEE80211_HW_SUPPORTS_DYNAMIC_PS = 1<<12, 1905 - IEEE80211_HW_MFP_CAPABLE = 1<<13, 1906 - IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, 1907 - IEEE80211_HW_NO_AUTO_VIF = 1<<15, 1908 - IEEE80211_HW_SW_CRYPTO_CONTROL = 1<<16, 1909 - IEEE80211_HW_SUPPORT_FAST_XMIT = 1<<17, 1910 - IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, 1911 - IEEE80211_HW_CONNECTION_MONITOR = 1<<19, 1912 - IEEE80211_HW_QUEUE_CONTROL = 1<<20, 1913 - IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21, 1914 - IEEE80211_HW_AP_LINK_PS = 1<<22, 1915 - IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23, 1916 - IEEE80211_HW_SUPPORTS_RC_TABLE = 1<<24, 1917 - IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25, 1918 - IEEE80211_HW_TIMING_BEACON_ONLY = 1<<26, 1919 - IEEE80211_HW_SUPPORTS_HT_CCK_RATES = 1<<27, 1920 - IEEE80211_HW_CHANCTX_STA_CSA = 1<<28, 1921 - IEEE80211_HW_SUPPORTS_CLONED_SKBS = 1<<29, 1922 - IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS = 1<<30, 1898 + IEEE80211_HW_HAS_RATE_CONTROL, 1899 + IEEE80211_HW_RX_INCLUDES_FCS, 1900 + IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING, 1901 + IEEE80211_HW_SIGNAL_UNSPEC, 1902 + IEEE80211_HW_SIGNAL_DBM, 1903 + IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC, 1904 + IEEE80211_HW_SPECTRUM_MGMT, 1905 + IEEE80211_HW_AMPDU_AGGREGATION, 1906 + IEEE80211_HW_SUPPORTS_PS, 1907 + IEEE80211_HW_PS_NULLFUNC_STACK, 1908 + IEEE80211_HW_SUPPORTS_DYNAMIC_PS, 1909 + IEEE80211_HW_MFP_CAPABLE, 1910 + IEEE80211_HW_WANT_MONITOR_VIF, 1911 + IEEE80211_HW_NO_AUTO_VIF, 1912 + IEEE80211_HW_SW_CRYPTO_CONTROL, 1913 + IEEE80211_HW_SUPPORT_FAST_XMIT, 1914 + IEEE80211_HW_REPORTS_TX_ACK_STATUS, 1915 + IEEE80211_HW_CONNECTION_MONITOR, 1916 + IEEE80211_HW_QUEUE_CONTROL, 1917 + IEEE80211_HW_SUPPORTS_PER_STA_GTK, 1918 + IEEE80211_HW_AP_LINK_PS, 1919 + IEEE80211_HW_TX_AMPDU_SETUP_IN_HW, 1920 + IEEE80211_HW_SUPPORTS_RC_TABLE, 1921 + IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF, 1922 + IEEE80211_HW_TIMING_BEACON_ONLY, 1923 + IEEE80211_HW_SUPPORTS_HT_CCK_RATES, 1924 + IEEE80211_HW_CHANCTX_STA_CSA, 1925 + IEEE80211_HW_SUPPORTS_CLONED_SKBS, 1926 + IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS, 1927 + 1928 + /* keep last, obviously */ 1929 + NUM_IEEE80211_HW_FLAGS 1923 1930 }; 1924 1931 1925 1932 /** ··· 2029 2030 struct wiphy *wiphy; 2030 2031 const char *rate_control_algorithm; 2031 2032 void *priv; 2032 - u32 flags; 2033 + unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)]; 2033 2034 unsigned int extra_tx_headroom; 2034 2035 unsigned int extra_beacon_tailroom; 2035 2036 int vif_data_size; ··· 2054 2055 const struct ieee80211_cipher_scheme *cipher_schemes; 2055 2056 int txq_ac_max_pending; 2056 2057 }; 2058 + 2059 + static inline bool _ieee80211_hw_check(struct ieee80211_hw *hw, 2060 + enum ieee80211_hw_flags flg) 2061 + { 2062 + return test_bit(flg, hw->flags); 2063 + } 2064 + #define ieee80211_hw_check(hw, flg) _ieee80211_hw_check(hw, IEEE80211_HW_##flg) 2065 + 2066 + static inline void _ieee80211_hw_set(struct ieee80211_hw *hw, 2067 + enum ieee80211_hw_flags flg) 2068 + { 2069 + return __set_bit(flg, hw->flags); 2070 + } 2071 + #define ieee80211_hw_set(hw, flg) _ieee80211_hw_set(hw, IEEE80211_HW_##flg) 2057 2072 2058 2073 /** 2059 2074 * struct ieee80211_scan_request - hw scan request ··· 2603 2590 * 2604 2591 * @FIF_OTHER_BSS: pass frames destined to other BSSes 2605 2592 * 2606 - * @FIF_PSPOLL: pass PS Poll frames, if PROMISC_IN_BSS is not set then only 2607 - * those addressed to this station. 2593 + * @FIF_PSPOLL: pass PS Poll frames 2608 2594 * 2609 2595 * @FIF_PROBE_REQ: pass probe request frames 2610 2596 */
+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",
+107 -83
net/mac80211/cfg.c
··· 2 2 * mac80211 configuration hooks for cfg80211 3 3 * 4 4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 5 - * Copyright 2013-2014 Intel Mobile Communications GmbH 5 + * Copyright 2013-2015 Intel Mobile Communications GmbH 6 6 * 7 7 * This file is GPLv2 as found in COPYING. 8 8 */ ··· 361 361 break; 362 362 case WLAN_CIPHER_SUITE_CCMP: 363 363 case WLAN_CIPHER_SUITE_CCMP_256: 364 + case WLAN_CIPHER_SUITE_AES_CMAC: 365 + case WLAN_CIPHER_SUITE_BIP_CMAC_256: 366 + BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) != 367 + offsetof(typeof(kseq), aes_cmac)); 368 + case WLAN_CIPHER_SUITE_BIP_GMAC_128: 369 + case WLAN_CIPHER_SUITE_BIP_GMAC_256: 370 + BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) != 371 + offsetof(typeof(kseq), aes_gmac)); 372 + case WLAN_CIPHER_SUITE_GCMP: 373 + case WLAN_CIPHER_SUITE_GCMP_256: 374 + BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) != 375 + offsetof(typeof(kseq), gcmp)); 376 + 364 377 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && 365 378 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { 366 379 drv_get_key_seq(sdata->local, key, &kseq); 367 380 memcpy(seq, kseq.ccmp.pn, 6); 368 381 } else { 369 - pn64 = atomic64_read(&key->u.ccmp.tx_pn); 370 - seq[0] = pn64; 371 - seq[1] = pn64 >> 8; 372 - seq[2] = pn64 >> 16; 373 - seq[3] = pn64 >> 24; 374 - seq[4] = pn64 >> 32; 375 - seq[5] = pn64 >> 40; 376 - } 377 - params.seq = seq; 378 - params.seq_len = 6; 379 - break; 380 - case WLAN_CIPHER_SUITE_AES_CMAC: 381 - case WLAN_CIPHER_SUITE_BIP_CMAC_256: 382 - if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && 383 - !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { 384 - drv_get_key_seq(sdata->local, key, &kseq); 385 - memcpy(seq, kseq.aes_cmac.pn, 6); 386 - } else { 387 - pn64 = atomic64_read(&key->u.aes_cmac.tx_pn); 388 - seq[0] = pn64; 389 - seq[1] = pn64 >> 8; 390 - seq[2] = pn64 >> 16; 391 - seq[3] = pn64 >> 24; 392 - seq[4] = pn64 >> 32; 393 - seq[5] = pn64 >> 40; 394 - } 395 - params.seq = seq; 396 - params.seq_len = 6; 397 - break; 398 - case WLAN_CIPHER_SUITE_BIP_GMAC_128: 399 - case WLAN_CIPHER_SUITE_BIP_GMAC_256: 400 - if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && 401 - !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { 402 - drv_get_key_seq(sdata->local, key, &kseq); 403 - memcpy(seq, kseq.aes_gmac.pn, 6); 404 - } else { 405 - pn64 = atomic64_read(&key->u.aes_gmac.tx_pn); 406 - seq[0] = pn64; 407 - seq[1] = pn64 >> 8; 408 - seq[2] = pn64 >> 16; 409 - seq[3] = pn64 >> 24; 410 - seq[4] = pn64 >> 32; 411 - seq[5] = pn64 >> 40; 412 - } 413 - params.seq = seq; 414 - params.seq_len = 6; 415 - break; 416 - case WLAN_CIPHER_SUITE_GCMP: 417 - case WLAN_CIPHER_SUITE_GCMP_256: 418 - if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && 419 - !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { 420 - drv_get_key_seq(sdata->local, key, &kseq); 421 - memcpy(seq, kseq.gcmp.pn, 6); 422 - } else { 423 - pn64 = atomic64_read(&key->u.gcmp.tx_pn); 382 + pn64 = atomic64_read(&key->conf.tx_pn); 424 383 seq[0] = pn64; 425 384 seq[1] = pn64 >> 8; 426 385 seq[2] = pn64 >> 16; ··· 1763 1804 /* our RSSI threshold implementation is supported only for 1764 1805 * devices that report signal in dBm. 1765 1806 */ 1766 - if (!(sdata->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)) 1807 + if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) 1767 1808 return -ENOTSUPP; 1768 1809 conf->rssi_threshold = nconf->rssi_threshold; 1769 1810 } ··· 2407 2448 if (sdata->vif.type != NL80211_IFTYPE_STATION) 2408 2449 return -EOPNOTSUPP; 2409 2450 2410 - if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) 2451 + if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) 2411 2452 return -EOPNOTSUPP; 2412 2453 2413 2454 if (enabled == sdata->u.mgd.powersave && ··· 2422 2463 __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps); 2423 2464 sdata_unlock(sdata); 2424 2465 2425 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 2466 + if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) 2426 2467 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 2427 2468 2428 2469 ieee80211_recalc_ps(local, -1); ··· 2466 2507 if (!ieee80211_sdata_running(sdata)) 2467 2508 return -ENETDOWN; 2468 2509 2469 - if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) { 2510 + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { 2470 2511 ret = drv_set_bitrate_mask(local, sdata, mask); 2471 2512 if (ret) 2472 2513 return ret; ··· 2517 2558 return true; 2518 2559 } 2519 2560 2561 + static u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local) 2562 + { 2563 + lockdep_assert_held(&local->mtx); 2564 + 2565 + local->roc_cookie_counter++; 2566 + 2567 + /* wow, you wrapped 64 bits ... more likely a bug */ 2568 + if (WARN_ON(local->roc_cookie_counter == 0)) 2569 + local->roc_cookie_counter++; 2570 + 2571 + return local->roc_cookie_counter; 2572 + } 2573 + 2520 2574 static int ieee80211_start_roc_work(struct ieee80211_local *local, 2521 2575 struct ieee80211_sub_if_data *sdata, 2522 2576 struct ieee80211_channel *channel, ··· 2567 2595 roc->req_duration = duration; 2568 2596 roc->frame = txskb; 2569 2597 roc->type = type; 2570 - roc->mgmt_tx_cookie = (unsigned long)txskb; 2571 2598 roc->sdata = sdata; 2572 2599 INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work); 2573 2600 INIT_LIST_HEAD(&roc->dependents); ··· 2576 2605 * or the SKB (for mgmt TX) 2577 2606 */ 2578 2607 if (!txskb) { 2579 - /* local->mtx protects this */ 2580 - local->roc_cookie_counter++; 2581 - roc->cookie = local->roc_cookie_counter; 2582 - /* wow, you wrapped 64 bits ... more likely a bug */ 2583 - if (WARN_ON(roc->cookie == 0)) { 2584 - roc->cookie = 1; 2585 - local->roc_cookie_counter++; 2586 - } 2608 + roc->cookie = ieee80211_mgmt_tx_cookie(local); 2587 2609 *cookie = roc->cookie; 2588 2610 } else { 2589 - *cookie = (unsigned long)txskb; 2611 + roc->mgmt_tx_cookie = *cookie; 2590 2612 } 2591 2613 2592 2614 /* if there's one pending or we're scanning, queue this one */ ··· 3252 3288 return err; 3253 3289 } 3254 3290 3291 + static struct sk_buff *ieee80211_make_ack_skb(struct ieee80211_local *local, 3292 + struct sk_buff *skb, u64 *cookie, 3293 + gfp_t gfp) 3294 + { 3295 + unsigned long spin_flags; 3296 + struct sk_buff *ack_skb; 3297 + int id; 3298 + 3299 + ack_skb = skb_copy(skb, gfp); 3300 + if (!ack_skb) 3301 + return ERR_PTR(-ENOMEM); 3302 + 3303 + spin_lock_irqsave(&local->ack_status_lock, spin_flags); 3304 + id = idr_alloc(&local->ack_status_frames, ack_skb, 3305 + 1, 0x10000, GFP_ATOMIC); 3306 + spin_unlock_irqrestore(&local->ack_status_lock, spin_flags); 3307 + 3308 + if (id < 0) { 3309 + kfree_skb(ack_skb); 3310 + return ERR_PTR(-ENOMEM); 3311 + } 3312 + 3313 + IEEE80211_SKB_CB(skb)->ack_frame_id = id; 3314 + 3315 + *cookie = ieee80211_mgmt_tx_cookie(local); 3316 + IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie; 3317 + 3318 + return ack_skb; 3319 + } 3320 + 3255 3321 static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, 3256 3322 struct cfg80211_mgmt_tx_params *params, 3257 3323 u64 *cookie) 3258 3324 { 3259 3325 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 3260 3326 struct ieee80211_local *local = sdata->local; 3261 - struct sk_buff *skb; 3327 + struct sk_buff *skb, *ack_skb; 3262 3328 struct sta_info *sta; 3263 3329 const struct ieee80211_mgmt *mgmt = (void *)params->buf; 3264 3330 bool need_offchan = false; ··· 3400 3406 /* Update CSA counters */ 3401 3407 if (sdata->vif.csa_active && 3402 3408 (sdata->vif.type == NL80211_IFTYPE_AP || 3409 + sdata->vif.type == NL80211_IFTYPE_MESH_POINT || 3403 3410 sdata->vif.type == NL80211_IFTYPE_ADHOC) && 3404 3411 params->n_csa_offsets) { 3405 3412 int i; ··· 3427 3432 3428 3433 skb->dev = sdata->dev; 3429 3434 3435 + if (!params->dont_wait_for_ack) { 3436 + /* make a copy to preserve the frame contents 3437 + * in case of encryption. 3438 + */ 3439 + ack_skb = ieee80211_make_ack_skb(local, skb, cookie, 3440 + GFP_KERNEL); 3441 + if (IS_ERR(ack_skb)) { 3442 + ret = PTR_ERR(ack_skb); 3443 + kfree_skb(skb); 3444 + goto out_unlock; 3445 + } 3446 + } else { 3447 + /* for cookie below */ 3448 + ack_skb = skb; 3449 + } 3450 + 3430 3451 if (!need_offchan) { 3431 - *cookie = (unsigned long) skb; 3432 3452 ieee80211_tx_skb(sdata, skb); 3433 3453 ret = 0; 3434 3454 goto out_unlock; ··· 3451 3441 3452 3442 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN | 3453 3443 IEEE80211_TX_INTFL_OFFCHAN_TX_OK; 3454 - if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) 3444 + if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) 3455 3445 IEEE80211_SKB_CB(skb)->hw_queue = 3456 3446 local->hw.offchannel_tx_hw_queue; 3457 3447 ··· 3536 3526 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 3537 3527 struct ieee80211_local *local = sdata->local; 3538 3528 struct ieee80211_qos_hdr *nullfunc; 3539 - struct sk_buff *skb; 3529 + struct sk_buff *skb, *ack_skb; 3540 3530 int size = sizeof(*nullfunc); 3541 3531 __le16 fc; 3542 3532 bool qos; ··· 3544 3534 struct sta_info *sta; 3545 3535 struct ieee80211_chanctx_conf *chanctx_conf; 3546 3536 enum ieee80211_band band; 3537 + int ret; 3538 + 3539 + /* the lock is needed to assign the cookie later */ 3540 + mutex_lock(&local->mtx); 3547 3541 3548 3542 rcu_read_lock(); 3549 3543 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 3550 3544 if (WARN_ON(!chanctx_conf)) { 3551 - rcu_read_unlock(); 3552 - return -EINVAL; 3545 + ret = -EINVAL; 3546 + goto unlock; 3553 3547 } 3554 3548 band = chanctx_conf->def.chan->band; 3555 3549 sta = sta_info_get_bss(sdata, peer); 3556 3550 if (sta) { 3557 3551 qos = sta->sta.wme; 3558 3552 } else { 3559 - rcu_read_unlock(); 3560 - return -ENOLINK; 3553 + ret = -ENOLINK; 3554 + goto unlock; 3561 3555 } 3562 3556 3563 3557 if (qos) { ··· 3577 3563 3578 3564 skb = dev_alloc_skb(local->hw.extra_tx_headroom + size); 3579 3565 if (!skb) { 3580 - rcu_read_unlock(); 3581 - return -ENOMEM; 3566 + ret = -ENOMEM; 3567 + goto unlock; 3582 3568 } 3583 3569 3584 3570 skb->dev = dev; ··· 3604 3590 if (qos) 3605 3591 nullfunc->qos_ctrl = cpu_to_le16(7); 3606 3592 3593 + ack_skb = ieee80211_make_ack_skb(local, skb, cookie, GFP_ATOMIC); 3594 + if (IS_ERR(ack_skb)) { 3595 + kfree_skb(skb); 3596 + ret = PTR_ERR(ack_skb); 3597 + goto unlock; 3598 + } 3599 + 3607 3600 local_bh_disable(); 3608 3601 ieee80211_xmit(sdata, sta, skb); 3609 3602 local_bh_enable(); 3610 - rcu_read_unlock(); 3611 3603 3612 - *cookie = (unsigned long) skb; 3613 - return 0; 3604 + ret = 0; 3605 + unlock: 3606 + rcu_read_unlock(); 3607 + mutex_unlock(&local->mtx); 3608 + 3609 + return ret; 3614 3610 } 3615 3611 3616 3612 static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
+52 -49
net/mac80211/debugfs.c
··· 1 - 2 1 /* 3 2 * mac80211 debugfs for wireless PHYs 4 3 * ··· 91 92 }; 92 93 #endif 93 94 95 + static const char *hw_flag_names[NUM_IEEE80211_HW_FLAGS + 1] = { 96 + #define FLAG(F) [IEEE80211_HW_##F] = #F 97 + FLAG(HAS_RATE_CONTROL), 98 + FLAG(RX_INCLUDES_FCS), 99 + FLAG(HOST_BROADCAST_PS_BUFFERING), 100 + FLAG(SIGNAL_UNSPEC), 101 + FLAG(SIGNAL_DBM), 102 + FLAG(NEED_DTIM_BEFORE_ASSOC), 103 + FLAG(SPECTRUM_MGMT), 104 + FLAG(AMPDU_AGGREGATION), 105 + FLAG(SUPPORTS_PS), 106 + FLAG(PS_NULLFUNC_STACK), 107 + FLAG(SUPPORTS_DYNAMIC_PS), 108 + FLAG(MFP_CAPABLE), 109 + FLAG(WANT_MONITOR_VIF), 110 + FLAG(NO_AUTO_VIF), 111 + FLAG(SW_CRYPTO_CONTROL), 112 + FLAG(SUPPORT_FAST_XMIT), 113 + FLAG(REPORTS_TX_ACK_STATUS), 114 + FLAG(CONNECTION_MONITOR), 115 + FLAG(QUEUE_CONTROL), 116 + FLAG(SUPPORTS_PER_STA_GTK), 117 + FLAG(AP_LINK_PS), 118 + FLAG(TX_AMPDU_SETUP_IN_HW), 119 + FLAG(SUPPORTS_RC_TABLE), 120 + FLAG(P2P_DEV_ADDR_FOR_INTF), 121 + FLAG(TIMING_BEACON_ONLY), 122 + FLAG(SUPPORTS_HT_CCK_RATES), 123 + FLAG(CHANCTX_STA_CSA), 124 + FLAG(SUPPORTS_CLONED_SKBS), 125 + FLAG(SINGLE_SCAN_ON_ALL_BANDS), 126 + 127 + /* keep last for the build bug below */ 128 + (void *)0x1 129 + #undef FLAG 130 + }; 131 + 94 132 static ssize_t hwflags_read(struct file *file, char __user *user_buf, 95 133 size_t count, loff_t *ppos) 96 134 { 97 135 struct ieee80211_local *local = file->private_data; 98 - int mxln = 500; 136 + size_t bufsz = 30 * NUM_IEEE80211_HW_FLAGS; 137 + char *buf = kzalloc(bufsz, GFP_KERNEL); 138 + char *pos = buf, *end = buf + bufsz - 1; 99 139 ssize_t rv; 100 - char *buf = kzalloc(mxln, GFP_KERNEL); 101 - int sf = 0; /* how many written so far */ 140 + int i; 102 141 103 142 if (!buf) 104 - return 0; 143 + return -ENOMEM; 105 144 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_2GHZ_SHORT_SLOT_INCAPABLE) 115 - sf += scnprintf(buf + sf, mxln - sf, 116 - "2GHZ_SHORT_SLOT_INCAPABLE\n"); 117 - if (local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE) 118 - sf += scnprintf(buf + sf, mxln - sf, 119 - "2GHZ_SHORT_PREAMBLE_INCAPABLE\n"); 120 - if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) 121 - sf += scnprintf(buf + sf, mxln - sf, "SIGNAL_UNSPEC\n"); 122 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 123 - sf += scnprintf(buf + sf, mxln - sf, "SIGNAL_DBM\n"); 124 - if (local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC) 125 - sf += scnprintf(buf + sf, mxln - sf, 126 - "NEED_DTIM_BEFORE_ASSOC\n"); 127 - if (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT) 128 - sf += scnprintf(buf + sf, mxln - sf, "SPECTRUM_MGMT\n"); 129 - if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) 130 - sf += scnprintf(buf + sf, mxln - sf, "AMPDU_AGGREGATION\n"); 131 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_PS) 132 - sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_PS\n"); 133 - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) 134 - sf += scnprintf(buf + sf, mxln - sf, "PS_NULLFUNC_STACK\n"); 135 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) 136 - sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS\n"); 137 - if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE) 138 - sf += scnprintf(buf + sf, mxln - sf, "MFP_CAPABLE\n"); 139 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 140 - sf += scnprintf(buf + sf, mxln - sf, 141 - "REPORTS_TX_ACK_STATUS\n"); 142 - if (local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) 143 - sf += scnprintf(buf + sf, mxln - sf, "CONNECTION_MONITOR\n"); 144 - if (local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK) 145 - sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_PER_STA_GTK\n"); 146 - if (local->hw.flags & IEEE80211_HW_AP_LINK_PS) 147 - sf += scnprintf(buf + sf, mxln - sf, "AP_LINK_PS\n"); 148 - if (local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW) 149 - sf += scnprintf(buf + sf, mxln - sf, "TX_AMPDU_SETUP_IN_HW\n"); 145 + /* fail compilation if somebody adds or removes 146 + * a flag without updating the name array above 147 + */ 148 + BUILD_BUG_ON(hw_flag_names[NUM_IEEE80211_HW_FLAGS] != (void *)0x1); 149 + 150 + for (i = 0; i < NUM_IEEE80211_HW_FLAGS; i++) { 151 + if (test_bit(i, local->hw.flags)) 152 + pos += scnprintf(pos, end - pos, "%s", 153 + hw_flag_names[i]); 154 + } 150 155 151 156 rv = simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); 152 157 kfree(buf);
+1 -16
net/mac80211/debugfs_key.c
··· 95 95 break; 96 96 case WLAN_CIPHER_SUITE_CCMP: 97 97 case WLAN_CIPHER_SUITE_CCMP_256: 98 - pn = atomic64_read(&key->u.ccmp.tx_pn); 99 - len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 100 - (u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24), 101 - (u8)(pn >> 16), (u8)(pn >> 8), (u8)pn); 102 - break; 103 98 case WLAN_CIPHER_SUITE_AES_CMAC: 104 99 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 105 - pn = atomic64_read(&key->u.aes_cmac.tx_pn); 106 - len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 107 - (u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24), 108 - (u8)(pn >> 16), (u8)(pn >> 8), (u8)pn); 109 - break; 110 100 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 111 101 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 112 - pn = atomic64_read(&key->u.aes_gmac.tx_pn); 113 - len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 114 - (u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24), 115 - (u8)(pn >> 16), (u8)(pn >> 8), (u8)pn); 116 - break; 117 102 case WLAN_CIPHER_SUITE_GCMP: 118 103 case WLAN_CIPHER_SUITE_GCMP_256: 119 - pn = atomic64_read(&key->u.gcmp.tx_pn); 104 + pn = atomic64_read(&key->conf.tx_pn); 120 105 len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 121 106 (u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24), 122 107 (u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
+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
+1
net/mac80211/ibss.c
··· 146 146 csa_settings->chandef.chan->center_freq); 147 147 presp->csa_counter_offsets[0] = (pos - presp->head); 148 148 *pos++ = csa_settings->count; 149 + presp->csa_current_counter = csa_settings->count; 149 150 } 150 151 151 152 /* put the remaining rates in WLAN_EID_EXT_SUPP_RATES */
+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;
+24 -60
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: ··· 896 896 break; 897 897 case WLAN_CIPHER_SUITE_CCMP: 898 898 case WLAN_CIPHER_SUITE_CCMP_256: 899 - pn64 = atomic64_read(&key->u.ccmp.tx_pn); 900 - seq->ccmp.pn[5] = pn64; 901 - seq->ccmp.pn[4] = pn64 >> 8; 902 - seq->ccmp.pn[3] = pn64 >> 16; 903 - seq->ccmp.pn[2] = pn64 >> 24; 904 - seq->ccmp.pn[1] = pn64 >> 32; 905 - seq->ccmp.pn[0] = pn64 >> 40; 906 - break; 907 899 case WLAN_CIPHER_SUITE_AES_CMAC: 908 900 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 909 - pn64 = atomic64_read(&key->u.aes_cmac.tx_pn); 910 - seq->ccmp.pn[5] = pn64; 911 - seq->ccmp.pn[4] = pn64 >> 8; 912 - seq->ccmp.pn[3] = pn64 >> 16; 913 - seq->ccmp.pn[2] = pn64 >> 24; 914 - seq->ccmp.pn[1] = pn64 >> 32; 915 - seq->ccmp.pn[0] = pn64 >> 40; 916 - break; 901 + BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != 902 + offsetof(typeof(*seq), aes_cmac)); 917 903 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 918 904 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 919 - pn64 = atomic64_read(&key->u.aes_gmac.tx_pn); 905 + BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != 906 + offsetof(typeof(*seq), aes_gmac)); 907 + case WLAN_CIPHER_SUITE_GCMP: 908 + case WLAN_CIPHER_SUITE_GCMP_256: 909 + BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != 910 + offsetof(typeof(*seq), gcmp)); 911 + pn64 = atomic64_read(&key->conf.tx_pn); 920 912 seq->ccmp.pn[5] = pn64; 921 913 seq->ccmp.pn[4] = pn64 >> 8; 922 914 seq->ccmp.pn[3] = pn64 >> 16; 923 915 seq->ccmp.pn[2] = pn64 >> 24; 924 916 seq->ccmp.pn[1] = pn64 >> 32; 925 917 seq->ccmp.pn[0] = pn64 >> 40; 926 - break; 927 - case WLAN_CIPHER_SUITE_GCMP: 928 - case WLAN_CIPHER_SUITE_GCMP_256: 929 - pn64 = atomic64_read(&key->u.gcmp.tx_pn); 930 - seq->gcmp.pn[5] = pn64; 931 - seq->gcmp.pn[4] = pn64 >> 8; 932 - seq->gcmp.pn[3] = pn64 >> 16; 933 - seq->gcmp.pn[2] = pn64 >> 24; 934 - seq->gcmp.pn[1] = pn64 >> 32; 935 - seq->gcmp.pn[0] = pn64 >> 40; 936 918 break; 937 919 default: 938 920 WARN_ON(1); ··· 990 1008 break; 991 1009 case WLAN_CIPHER_SUITE_CCMP: 992 1010 case WLAN_CIPHER_SUITE_CCMP_256: 1011 + case WLAN_CIPHER_SUITE_AES_CMAC: 1012 + case WLAN_CIPHER_SUITE_BIP_CMAC_256: 1013 + BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != 1014 + offsetof(typeof(*seq), aes_cmac)); 1015 + case WLAN_CIPHER_SUITE_BIP_GMAC_128: 1016 + case WLAN_CIPHER_SUITE_BIP_GMAC_256: 1017 + BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != 1018 + offsetof(typeof(*seq), aes_gmac)); 1019 + case WLAN_CIPHER_SUITE_GCMP: 1020 + case WLAN_CIPHER_SUITE_GCMP_256: 1021 + BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != 1022 + offsetof(typeof(*seq), gcmp)); 993 1023 pn64 = (u64)seq->ccmp.pn[5] | 994 1024 ((u64)seq->ccmp.pn[4] << 8) | 995 1025 ((u64)seq->ccmp.pn[3] << 16) | 996 1026 ((u64)seq->ccmp.pn[2] << 24) | 997 1027 ((u64)seq->ccmp.pn[1] << 32) | 998 1028 ((u64)seq->ccmp.pn[0] << 40); 999 - atomic64_set(&key->u.ccmp.tx_pn, pn64); 1000 - break; 1001 - case WLAN_CIPHER_SUITE_AES_CMAC: 1002 - case WLAN_CIPHER_SUITE_BIP_CMAC_256: 1003 - pn64 = (u64)seq->aes_cmac.pn[5] | 1004 - ((u64)seq->aes_cmac.pn[4] << 8) | 1005 - ((u64)seq->aes_cmac.pn[3] << 16) | 1006 - ((u64)seq->aes_cmac.pn[2] << 24) | 1007 - ((u64)seq->aes_cmac.pn[1] << 32) | 1008 - ((u64)seq->aes_cmac.pn[0] << 40); 1009 - atomic64_set(&key->u.aes_cmac.tx_pn, pn64); 1010 - break; 1011 - case WLAN_CIPHER_SUITE_BIP_GMAC_128: 1012 - case WLAN_CIPHER_SUITE_BIP_GMAC_256: 1013 - pn64 = (u64)seq->aes_gmac.pn[5] | 1014 - ((u64)seq->aes_gmac.pn[4] << 8) | 1015 - ((u64)seq->aes_gmac.pn[3] << 16) | 1016 - ((u64)seq->aes_gmac.pn[2] << 24) | 1017 - ((u64)seq->aes_gmac.pn[1] << 32) | 1018 - ((u64)seq->aes_gmac.pn[0] << 40); 1019 - atomic64_set(&key->u.aes_gmac.tx_pn, pn64); 1020 - break; 1021 - case WLAN_CIPHER_SUITE_GCMP: 1022 - case WLAN_CIPHER_SUITE_GCMP_256: 1023 - pn64 = (u64)seq->gcmp.pn[5] | 1024 - ((u64)seq->gcmp.pn[4] << 8) | 1025 - ((u64)seq->gcmp.pn[3] << 16) | 1026 - ((u64)seq->gcmp.pn[2] << 24) | 1027 - ((u64)seq->gcmp.pn[1] << 32) | 1028 - ((u64)seq->gcmp.pn[0] << 40); 1029 - atomic64_set(&key->u.gcmp.tx_pn, pn64); 1029 + atomic64_set(&key->conf.tx_pn, pn64); 1030 1030 break; 1031 1031 default: 1032 1032 WARN_ON(1);
-4
net/mac80211/key.h
··· 77 77 u32 mic_failures; 78 78 } tkip; 79 79 struct { 80 - atomic64_t tx_pn; 81 80 /* 82 81 * Last received packet number. The first 83 82 * IEEE80211_NUM_TIDS counters are used with Data ··· 88 89 u32 replays; /* dot11RSNAStatsCCMPReplays */ 89 90 } ccmp; 90 91 struct { 91 - atomic64_t tx_pn; 92 92 u8 rx_pn[IEEE80211_CMAC_PN_LEN]; 93 93 struct crypto_cipher *tfm; 94 94 u32 replays; /* dot11RSNAStatsCMACReplays */ 95 95 u32 icverrors; /* dot11RSNAStatsCMACICVErrors */ 96 96 } aes_cmac; 97 97 struct { 98 - atomic64_t tx_pn; 99 98 u8 rx_pn[IEEE80211_GMAC_PN_LEN]; 100 99 struct crypto_aead *tfm; 101 100 u32 replays; /* dot11RSNAStatsCMACReplays */ 102 101 u32 icverrors; /* dot11RSNAStatsCMACICVErrors */ 103 102 } aes_gmac; 104 103 struct { 105 - atomic64_t tx_pn; 106 104 /* Last received packet number. The first 107 105 * IEEE80211_NUM_TIDS counters are used with Data 108 106 * frames and the last counter is used with Robust
+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)
+1
net/mac80211/mesh.c
··· 680 680 *pos++ = 0x0; 681 681 *pos++ = ieee80211_frequency_to_channel( 682 682 csa->settings.chandef.chan->center_freq); 683 + bcn->csa_current_counter = csa->settings.count; 683 684 bcn->csa_counter_offsets[0] = hdr_len + 6; 684 685 *pos++ = csa->settings.count; 685 686 *pos++ = WLAN_EID_CHAN_SWITCH_PARAM;
+17 -18
net/mac80211/mesh_hwmp.c
··· 510 510 511 511 static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, 512 512 struct ieee80211_mgmt *mgmt, 513 - const u8 *preq_elem, u32 metric) 513 + const u8 *preq_elem, u32 orig_metric) 514 514 { 515 515 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 516 516 struct mesh_path *mpath = NULL; 517 517 const u8 *target_addr, *orig_addr; 518 518 const u8 *da; 519 519 u8 target_flags, ttl, flags; 520 - u32 orig_sn, target_sn, lifetime, orig_metric; 520 + u32 orig_sn, target_sn, lifetime, target_metric; 521 521 bool reply = false; 522 522 bool forward = true; 523 523 bool root_is_gate; ··· 528 528 target_sn = PREQ_IE_TARGET_SN(preq_elem); 529 529 orig_sn = PREQ_IE_ORIG_SN(preq_elem); 530 530 target_flags = PREQ_IE_TARGET_F(preq_elem); 531 - orig_metric = metric; 532 531 /* Proactive PREQ gate announcements */ 533 532 flags = PREQ_IE_FLAGS(preq_elem); 534 533 root_is_gate = !!(flags & RANN_FLAG_IS_GATE); ··· 538 539 mhwmp_dbg(sdata, "PREQ is for us\n"); 539 540 forward = false; 540 541 reply = true; 541 - metric = 0; 542 + target_metric = 0; 542 543 if (time_after(jiffies, ifmsh->last_sn_update + 543 544 net_traversal_jiffies(sdata)) || 544 545 time_before(jiffies, ifmsh->last_sn_update)) { ··· 555 556 reply = true; 556 557 target_addr = sdata->vif.addr; 557 558 target_sn = ++ifmsh->sn; 558 - metric = 0; 559 + target_metric = 0; 559 560 ifmsh->last_sn_update = jiffies; 560 561 } 561 562 if (root_is_gate) ··· 573 574 } else if ((!(target_flags & MP_F_DO)) && 574 575 (mpath->flags & MESH_PATH_ACTIVE)) { 575 576 reply = true; 576 - metric = mpath->metric; 577 + target_metric = mpath->metric; 577 578 target_sn = mpath->sn; 578 579 if (target_flags & MP_F_RF) 579 580 target_flags |= MP_F_DO; ··· 592 593 mesh_path_sel_frame_tx(MPATH_PREP, 0, orig_addr, 593 594 orig_sn, 0, target_addr, 594 595 target_sn, mgmt->sa, 0, ttl, 595 - lifetime, metric, 0, sdata); 596 + lifetime, target_metric, 0, 597 + sdata); 596 598 } else { 597 599 ifmsh->mshstats.dropped_frames_ttl++; 598 600 } ··· 619 619 if (flags & IEEE80211_PREQ_PROACTIVE_PREP_FLAG) { 620 620 target_addr = PREQ_IE_TARGET_ADDR(preq_elem); 621 621 target_sn = PREQ_IE_TARGET_SN(preq_elem); 622 - metric = orig_metric; 623 622 } 624 623 625 624 mesh_path_sel_frame_tx(MPATH_PREQ, flags, orig_addr, 626 625 orig_sn, target_flags, target_addr, 627 626 target_sn, da, hopcount, ttl, lifetime, 628 - metric, preq_id, sdata); 627 + orig_metric, preq_id, sdata); 629 628 if (!is_multicast_ether_addr(da)) 630 629 ifmsh->mshstats.fwded_unicast++; 631 630 else ··· 853 854 { 854 855 struct ieee802_11_elems elems; 855 856 size_t baselen; 856 - u32 last_hop_metric; 857 + u32 path_metric; 857 858 struct sta_info *sta; 858 859 859 860 /* need action_code */ ··· 876 877 if (elems.preq_len != 37) 877 878 /* Right now we support just 1 destination and no AE */ 878 879 return; 879 - last_hop_metric = hwmp_route_info_get(sdata, mgmt, elems.preq, 880 - MPATH_PREQ); 881 - if (last_hop_metric) 880 + path_metric = hwmp_route_info_get(sdata, mgmt, elems.preq, 881 + MPATH_PREQ); 882 + if (path_metric) 882 883 hwmp_preq_frame_process(sdata, mgmt, elems.preq, 883 - last_hop_metric); 884 + path_metric); 884 885 } 885 886 if (elems.prep) { 886 887 if (elems.prep_len != 31) 887 888 /* Right now we support no AE */ 888 889 return; 889 - last_hop_metric = hwmp_route_info_get(sdata, mgmt, elems.prep, 890 - MPATH_PREP); 891 - if (last_hop_metric) 890 + path_metric = hwmp_route_info_get(sdata, mgmt, elems.prep, 891 + MPATH_PREP); 892 + if (path_metric) 892 893 hwmp_prep_frame_process(sdata, mgmt, elems.prep, 893 - last_hop_metric); 894 + path_metric); 894 895 } 895 896 if (elems.perr) { 896 897 if (elems.perr_len != 15)
+3 -4
net/mac80211/mesh_plink.c
··· 106 106 /* (IEEE 802.11-2012 19.4.5) */ 107 107 short_slot = true; 108 108 goto out; 109 - } else if (band != IEEE80211_BAND_2GHZ || 110 - (band == IEEE80211_BAND_2GHZ && 111 - local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE)) 109 + } else if (band != IEEE80211_BAND_2GHZ) 112 110 goto out; 113 111 114 112 for (i = 0; i < sband->n_bitrates; i++) ··· 392 394 sta->last_rx = jiffies; 393 395 394 396 /* rates and capabilities don't change during peering */ 395 - if (sta->plink_state == NL80211_PLINK_ESTAB) 397 + if (sta->plink_state == NL80211_PLINK_ESTAB && sta->processed_beacon) 396 398 goto out; 399 + sta->processed_beacon = true; 397 400 398 401 if (sta->sta.supp_rates[band] != rates) 399 402 changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
+88 -76
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, ··· 669 669 capab = WLAN_CAPABILITY_ESS; 670 670 671 671 if (sband->band == IEEE80211_BAND_2GHZ) { 672 - if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE)) 673 - capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME; 674 - if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE)) 675 - capab |= WLAN_CAPABILITY_SHORT_PREAMBLE; 672 + capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME; 673 + capab |= WLAN_CAPABILITY_SHORT_PREAMBLE; 676 674 } 677 675 678 676 if (assoc_data->capability & WLAN_CAPABILITY_PRIVACY) 679 677 capab |= WLAN_CAPABILITY_PRIVACY; 680 678 681 679 if ((assoc_data->capability & WLAN_CAPABILITY_SPECTRUM_MGMT) && 682 - (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT)) 680 + ieee80211_hw_check(&local->hw, SPECTRUM_MGMT)) 683 681 capab |= WLAN_CAPABILITY_SPECTRUM_MGMT; 684 682 685 683 if (ifmgd->flags & IEEE80211_STA_ENABLE_RRM) ··· 885 887 drv_mgd_prepare_tx(local, sdata); 886 888 887 889 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 888 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 890 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 889 891 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS | 890 892 IEEE80211_TX_INTFL_MLME_CONN_TX; 891 893 ieee80211_tx_skb(sdata, skb); ··· 927 929 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | 928 930 IEEE80211_TX_INTFL_OFFCHAN_TX_OK; 929 931 930 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 932 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 931 933 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 932 934 933 935 if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL) ··· 1198 1200 chanctx = container_of(conf, struct ieee80211_chanctx, conf); 1199 1201 1200 1202 if (local->use_chanctx && 1201 - !(local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)) { 1203 + !ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA)) { 1202 1204 sdata_info(sdata, 1203 1205 "driver doesn't support chan-switch with channel contexts\n"); 1204 1206 goto drop_connection; ··· 1407 1409 return; 1408 1410 1409 1411 if (conf->dynamic_ps_timeout > 0 && 1410 - !(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)) { 1412 + !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) { 1411 1413 mod_timer(&local->dynamic_ps_timer, jiffies + 1412 1414 msecs_to_jiffies(conf->dynamic_ps_timeout)); 1413 1415 } else { 1414 - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) 1416 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) 1415 1417 ieee80211_send_nullfunc(local, sdata, 1); 1416 1418 1417 - if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 1418 - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) 1419 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) && 1420 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 1419 1421 return; 1420 1422 1421 1423 conf->flags |= IEEE80211_CONF_PS; ··· 1474 1476 int count = 0; 1475 1477 int timeout; 1476 1478 1477 - if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) { 1479 + if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) { 1478 1480 local->ps_sdata = NULL; 1479 1481 return; 1480 1482 } ··· 1620 1622 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 1621 1623 } 1622 1624 1623 - if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 1625 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) && 1624 1626 !(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { 1625 1627 if (drv_tx_frames_pending(local)) { 1626 1628 mod_timer(&local->dynamic_ps_timer, jiffies + ··· 1633 1635 } 1634 1636 } 1635 1637 1636 - if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && 1637 - (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) || 1638 + if (!(ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) && 1639 + ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) || 1638 1640 (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { 1639 1641 ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; 1640 1642 local->hw.conf.flags |= IEEE80211_CONF_PS; ··· 2159 2161 ieee80211_recalc_ps(local, -1); 2160 2162 mutex_unlock(&local->iflist_mtx); 2161 2163 2162 - if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) 2164 + if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) 2163 2165 goto out; 2164 2166 2165 2167 /* ··· 2257 2259 */ 2258 2260 ifmgd->probe_send_count++; 2259 2261 2260 - if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 2262 + if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { 2261 2263 ifmgd->nullfunc_failed = false; 2262 2264 ieee80211_send_nullfunc(sdata->local, sdata, 0); 2263 2265 } else { ··· 2519 2521 sdata->u.mgd.auth_data = NULL; 2520 2522 } 2521 2523 2524 + static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, 2525 + bool assoc) 2526 + { 2527 + struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; 2528 + 2529 + sdata_assert_lock(sdata); 2530 + 2531 + if (!assoc) { 2532 + /* 2533 + * we are not associated yet, the only timer that could be 2534 + * running is the timeout for the association response which 2535 + * which is not relevant anymore. 2536 + */ 2537 + del_timer_sync(&sdata->u.mgd.timer); 2538 + sta_info_destroy_addr(sdata, assoc_data->bss->bssid); 2539 + 2540 + eth_zero_addr(sdata->u.mgd.bssid); 2541 + ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); 2542 + sdata->u.mgd.flags = 0; 2543 + mutex_lock(&sdata->local->mtx); 2544 + ieee80211_vif_release_channel(sdata); 2545 + mutex_unlock(&sdata->local->mtx); 2546 + } 2547 + 2548 + kfree(assoc_data); 2549 + sdata->u.mgd.assoc_data = NULL; 2550 + } 2551 + 2522 2552 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, 2523 2553 struct ieee80211_mgmt *mgmt, size_t len) 2524 2554 { ··· 2562 2536 return; 2563 2537 auth_data->expected_transaction = 4; 2564 2538 drv_mgd_prepare_tx(sdata->local, sdata); 2565 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 2539 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 2566 2540 tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 2567 2541 IEEE80211_TX_INTFL_MLME_CONN_TX; 2568 2542 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, ··· 2739 2713 struct ieee80211_mgmt *mgmt, size_t len) 2740 2714 { 2741 2715 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2742 - const u8 *bssid = NULL; 2743 - u16 reason_code; 2716 + u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code); 2744 2717 2745 2718 sdata_assert_lock(sdata); 2746 2719 2747 2720 if (len < 24 + 2) 2748 2721 return; 2749 2722 2750 - if (!ifmgd->associated || 2751 - !ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid)) 2723 + if (ifmgd->associated && 2724 + ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid)) { 2725 + const u8 *bssid = ifmgd->associated->bssid; 2726 + 2727 + sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", 2728 + bssid, reason_code, 2729 + ieee80211_get_reason_code_string(reason_code)); 2730 + 2731 + ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 2732 + 2733 + ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, 2734 + reason_code); 2752 2735 return; 2736 + } 2753 2737 2754 - bssid = ifmgd->associated->bssid; 2738 + if (ifmgd->assoc_data && 2739 + ether_addr_equal(mgmt->bssid, ifmgd->assoc_data->bss->bssid)) { 2740 + const u8 *bssid = ifmgd->assoc_data->bss->bssid; 2755 2741 2756 - reason_code = le16_to_cpu(mgmt->u.deauth.reason_code); 2742 + sdata_info(sdata, 2743 + "deauthenticated from %pM while associating (Reason: %u=%s)\n", 2744 + bssid, reason_code, 2745 + ieee80211_get_reason_code_string(reason_code)); 2757 2746 2758 - sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", 2759 - bssid, reason_code, ieee80211_get_reason_code_string(reason_code)); 2747 + ieee80211_destroy_assoc_data(sdata, false); 2760 2748 2761 - ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 2762 - 2763 - ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); 2749 + cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); 2750 + return; 2751 + } 2764 2752 } 2765 2753 2766 2754 ··· 2852 2812 } 2853 2813 } 2854 2814 } 2855 - } 2856 - 2857 - static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, 2858 - bool assoc) 2859 - { 2860 - struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; 2861 - 2862 - sdata_assert_lock(sdata); 2863 - 2864 - if (!assoc) { 2865 - /* 2866 - * we are not associated yet, the only timer that could be 2867 - * running is the timeout for the association response which 2868 - * which is not relevant anymore. 2869 - */ 2870 - del_timer_sync(&sdata->u.mgd.timer); 2871 - sta_info_destroy_addr(sdata, assoc_data->bss->bssid); 2872 - 2873 - eth_zero_addr(sdata->u.mgd.bssid); 2874 - ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); 2875 - sdata->u.mgd.flags = 0; 2876 - mutex_lock(&sdata->local->mtx); 2877 - ieee80211_vif_release_channel(sdata); 2878 - mutex_unlock(&sdata->local->mtx); 2879 - } 2880 - 2881 - kfree(assoc_data); 2882 - sdata->u.mgd.assoc_data = NULL; 2883 2815 } 2884 2816 2885 2817 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, ··· 3337 3325 } 3338 3326 ifmgd->have_beacon = true; 3339 3327 ifmgd->assoc_data->need_beacon = false; 3340 - if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 3328 + if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) { 3341 3329 sdata->vif.bss_conf.sync_tsf = 3342 3330 le64_to_cpu(mgmt->u.beacon.timestamp); 3343 3331 sdata->vif.bss_conf.sync_device_ts = ··· 3443 3431 len - baselen, false, &elems, 3444 3432 care_about_ies, ncrc); 3445 3433 3446 - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) { 3434 + if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) { 3447 3435 bool directed_tim = ieee80211_check_tim(elems.tim, 3448 3436 elems.tim_len, 3449 3437 ifmgd->aid); ··· 3511 3499 * the driver will use them. The synchronized view is currently 3512 3500 * guaranteed only in certain callbacks. 3513 3501 */ 3514 - if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 3502 + if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) { 3515 3503 sdata->vif.bss_conf.sync_tsf = 3516 3504 le64_to_cpu(mgmt->u.beacon.timestamp); 3517 3505 sdata->vif.bss_conf.sync_device_ts = ··· 3749 3737 auth_data->expected_transaction = trans; 3750 3738 } 3751 3739 3752 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 3740 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 3753 3741 tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | 3754 3742 IEEE80211_TX_INTFL_MLME_CONN_TX; 3755 3743 ··· 3822 3810 IEEE80211_ASSOC_MAX_TRIES); 3823 3811 ieee80211_send_assoc(sdata); 3824 3812 3825 - if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { 3813 + if (!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 3826 3814 assoc_data->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT; 3827 3815 assoc_data->timeout_started = true; 3828 3816 run_again(sdata, assoc_data->timeout); ··· 3936 3924 3937 3925 memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN); 3938 3926 3939 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) 3927 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 3940 3928 max_tries = max_nullfunc_tries; 3941 3929 else 3942 3930 max_tries = max_probe_tries; ··· 3961 3949 } 3962 3950 } else if (time_is_after_jiffies(ifmgd->probe_timeout)) 3963 3951 run_again(sdata, ifmgd->probe_timeout); 3964 - else if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 3952 + else if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 3965 3953 mlme_dbg(sdata, 3966 3954 "Failed to send nullfunc to AP %pM after %dms, disconnecting\n", 3967 3955 bssid, probe_wait_ms); ··· 4030 4018 4031 4019 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) 4032 4020 { 4033 - u32 flags; 4034 - 4035 4021 if (sdata->vif.type == NL80211_IFTYPE_STATION) { 4036 4022 __ieee80211_stop_poll(sdata); 4037 4023 4038 4024 /* let's probe the connection once */ 4039 - flags = sdata->local->hw.flags; 4040 - if (!(flags & IEEE80211_HW_CONNECTION_MONITOR)) 4025 + if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) 4041 4026 ieee80211_queue_work(&sdata->local->hw, 4042 4027 &sdata->u.mgd.monitor_work); 4043 4028 /* and do all the other regular work too */ ··· 4447 4438 sdata->vif.bss_conf.sync_dtim_count = tim_ie[2]; 4448 4439 else 4449 4440 sdata->vif.bss_conf.sync_dtim_count = 0; 4450 - } else if (!(local->hw.flags & 4451 - IEEE80211_HW_TIMING_BEACON_ONLY)) { 4441 + } else if (!ieee80211_hw_check(&sdata->local->hw, 4442 + TIMING_BEACON_ONLY)) { 4452 4443 ies = rcu_dereference(cbss->proberesp_ies); 4453 4444 /* must be non-NULL since beacon IEs were NULL */ 4454 4445 sdata->vif.bss_conf.sync_tsf = ies->tsf; ··· 4598 4589 eth_zero_addr(ifmgd->bssid); 4599 4590 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); 4600 4591 ifmgd->auth_data = NULL; 4592 + mutex_lock(&sdata->local->mtx); 4593 + ieee80211_vif_release_channel(sdata); 4594 + mutex_unlock(&sdata->local->mtx); 4601 4595 err_free: 4602 4596 kfree(auth_data); 4603 4597 return err; ··· 4826 4814 rcu_read_unlock(); 4827 4815 4828 4816 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && 4829 - (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK), 4817 + ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK), 4830 4818 "U-APSD not supported with HW_PS_NULLFUNC_STACK\n")) 4831 4819 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; 4832 4820 ··· 4907 4895 rcu_read_lock(); 4908 4896 beacon_ies = rcu_dereference(req->bss->beacon_ies); 4909 4897 4910 - if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC && 4898 + if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && 4911 4899 !beacon_ies) { 4912 4900 /* 4913 4901 * Wait up to one beacon interval ... ··· 4934 4922 assoc_data->timeout = jiffies; 4935 4923 assoc_data->timeout_started = true; 4936 4924 4937 - if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 4925 + if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) { 4938 4926 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; 4939 4927 sdata->vif.bss_conf.sync_device_ts = 4940 4928 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 }
+12 -6
net/mac80211/scan.c
··· 6 6 * Copyright 2005, Devicescape Software, Inc. 7 7 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 8 8 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> 9 - * Copyright 2013-2014 Intel Mobile Communications GmbH 9 + * Copyright 2013-2015 Intel Mobile Communications GmbH 10 10 * 11 11 * This program is free software; you can redistribute it and/or modify 12 12 * it under the terms of the GNU General Public License version 2 as ··· 69 69 int clen, srlen; 70 70 enum nl80211_bss_scan_width scan_width; 71 71 s32 signal = 0; 72 + bool signal_valid; 72 73 73 - if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 74 + if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) 74 75 signal = rx_status->signal * 100; 75 - else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) 76 + else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC)) 76 77 signal = (rx_status->signal * 100) / local->hw.max_signal; 77 78 78 79 scan_width = NL80211_BSS_CHAN_WIDTH_20; ··· 87 86 GFP_ATOMIC); 88 87 if (!cbss) 89 88 return NULL; 89 + /* In case the signal is invalid update the status */ 90 + signal_valid = abs(channel->center_freq - cbss->channel->center_freq) 91 + <= local->hw.wiphy->max_adj_channel_rssi_comp; 92 + if (!signal_valid) 93 + rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL; 90 94 91 95 bss = (void *)cbss->priv; 92 96 ··· 263 257 if (test_bit(SCAN_HW_CANCELLED, &local->scanning)) 264 258 return false; 265 259 266 - if (local->hw.flags & IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS) { 260 + if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { 267 261 for (i = 0; i < req->n_channels; i++) { 268 262 local->hw_scan_req->req.channels[i] = req->channels[i]; 269 263 bands_used |= BIT(req->channels[i]->band); ··· 332 326 return; 333 327 334 328 if (hw_scan && !aborted && 335 - !(local->hw.flags & IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS) && 329 + !ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS) && 336 330 ieee80211_prep_hw_scan(local)) { 337 331 int rc; 338 332 ··· 526 520 527 521 local->hw_scan_ies_bufsize = local->scan_ies_len + req->ie_len; 528 522 529 - if (local->hw.flags & IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS) { 523 + if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) { 530 524 int i, n_bands = 0; 531 525 u8 bands_counted = 0; 532 526
+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];
+3
net/mac80211/sta_info.h
··· 369 369 * @rx_msdu: MSDUs received from this station, using IEEE80211_NUM_TID 370 370 * entry for non-QoS frames 371 371 * @fast_tx: TX fastpath information 372 + * @processed_beacon: set to true after peer rates and capabilities are 373 + * processed 372 374 */ 373 375 struct sta_info { 374 376 /* General information, mostly static */ ··· 475 473 enum nl80211_mesh_power_mode local_pm; 476 474 enum nl80211_mesh_power_mode peer_pm; 477 475 enum nl80211_mesh_power_mode nonpeer_pm; 476 + bool processed_beacon; 478 477 #endif 479 478 480 479 #ifdef CONFIG_MAC80211_DEBUGFS
+81 -54
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) { ··· 428 429 } 429 430 } 430 431 432 + static struct ieee80211_sub_if_data * 433 + ieee80211_sdata_from_skb(struct ieee80211_local *local, struct sk_buff *skb) 434 + { 435 + struct ieee80211_sub_if_data *sdata; 436 + 437 + if (skb->dev) { 438 + list_for_each_entry_rcu(sdata, &local->interfaces, list) { 439 + if (!sdata->dev) 440 + continue; 441 + 442 + if (skb->dev == sdata->dev) 443 + return sdata; 444 + } 445 + 446 + return NULL; 447 + } 448 + 449 + return rcu_dereference(local->p2p_sdata); 450 + } 451 + 452 + static void ieee80211_report_ack_skb(struct ieee80211_local *local, 453 + struct ieee80211_tx_info *info, 454 + bool acked, bool dropped) 455 + { 456 + struct sk_buff *skb; 457 + unsigned long flags; 458 + 459 + spin_lock_irqsave(&local->ack_status_lock, flags); 460 + skb = idr_find(&local->ack_status_frames, info->ack_frame_id); 461 + if (skb) 462 + idr_remove(&local->ack_status_frames, info->ack_frame_id); 463 + spin_unlock_irqrestore(&local->ack_status_lock, flags); 464 + 465 + if (!skb) 466 + return; 467 + 468 + if (dropped) { 469 + dev_kfree_skb_any(skb); 470 + return; 471 + } 472 + 473 + if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { 474 + u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie; 475 + struct ieee80211_sub_if_data *sdata; 476 + struct ieee80211_hdr *hdr = (void *)skb->data; 477 + 478 + rcu_read_lock(); 479 + sdata = ieee80211_sdata_from_skb(local, skb); 480 + if (sdata) { 481 + if (ieee80211_is_nullfunc(hdr->frame_control) || 482 + ieee80211_is_qos_nullfunc(hdr->frame_control)) 483 + cfg80211_probe_status(sdata->dev, hdr->addr1, 484 + cookie, acked, 485 + GFP_ATOMIC); 486 + else 487 + cfg80211_mgmt_tx_status(&sdata->wdev, cookie, 488 + skb->data, skb->len, 489 + acked, GFP_ATOMIC); 490 + } 491 + rcu_read_unlock(); 492 + 493 + dev_kfree_skb_any(skb); 494 + } else { 495 + /* consumes skb */ 496 + skb_complete_wifi_ack(skb, acked); 497 + } 498 + } 499 + 431 500 static void ieee80211_report_used_skb(struct ieee80211_local *local, 432 501 struct sk_buff *skb, bool dropped) 433 502 { ··· 506 439 if (dropped) 507 440 acked = false; 508 441 509 - if (info->flags & (IEEE80211_TX_INTFL_NL80211_FRAME_TX | 510 - IEEE80211_TX_INTFL_MLME_CONN_TX)) { 511 - struct ieee80211_sub_if_data *sdata = NULL; 512 - struct ieee80211_sub_if_data *iter_sdata; 513 - u64 cookie = (unsigned long)skb; 442 + if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { 443 + struct ieee80211_sub_if_data *sdata; 514 444 515 445 rcu_read_lock(); 516 446 517 - if (skb->dev) { 518 - list_for_each_entry_rcu(iter_sdata, &local->interfaces, 519 - list) { 520 - if (!iter_sdata->dev) 521 - continue; 522 - 523 - if (skb->dev == iter_sdata->dev) { 524 - sdata = iter_sdata; 525 - break; 526 - } 527 - } 528 - } else { 529 - sdata = rcu_dereference(local->p2p_sdata); 530 - } 447 + sdata = ieee80211_sdata_from_skb(local, skb); 531 448 532 449 if (!sdata) { 533 450 skb->dev = NULL; ··· 529 478 ieee80211_mgd_conn_tx_status(sdata, 530 479 hdr->frame_control, 531 480 acked); 532 - } else if (ieee80211_is_nullfunc(hdr->frame_control) || 533 - ieee80211_is_qos_nullfunc(hdr->frame_control)) { 534 - cfg80211_probe_status(sdata->dev, hdr->addr1, 535 - cookie, acked, GFP_ATOMIC); 536 481 } else { 537 - cfg80211_mgmt_tx_status(&sdata->wdev, cookie, skb->data, 538 - skb->len, acked, GFP_ATOMIC); 482 + /* we assign ack frame ID for the others */ 483 + WARN_ON(1); 539 484 } 540 485 541 486 rcu_read_unlock(); 542 - } 543 - 544 - if (unlikely(info->ack_frame_id)) { 545 - struct sk_buff *ack_skb; 546 - unsigned long flags; 547 - 548 - spin_lock_irqsave(&local->ack_status_lock, flags); 549 - ack_skb = idr_find(&local->ack_status_frames, 550 - info->ack_frame_id); 551 - if (ack_skb) 552 - idr_remove(&local->ack_status_frames, 553 - info->ack_frame_id); 554 - spin_unlock_irqrestore(&local->ack_status_lock, flags); 555 - 556 - if (ack_skb) { 557 - if (!dropped) { 558 - /* consumes ack_skb */ 559 - skb_complete_wifi_ack(ack_skb, acked); 560 - } else { 561 - dev_kfree_skb_any(ack_skb); 562 - } 563 - } 487 + } else if (info->ack_frame_id) { 488 + ieee80211_report_ack_skb(local, info, acked, dropped); 564 489 } 565 490 } 566 491 ··· 730 703 ieee80211_get_qos_ctl(hdr), 731 704 sta, true, acked); 732 705 733 - if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) && 706 + if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) && 734 707 (ieee80211_is_data(hdr->frame_control)) && 735 708 (rates_idx != -1)) 736 709 sta->last_tx_rate = info->status.rates[rates_idx]; ··· 797 770 ieee80211_frame_acked(sta, skb); 798 771 799 772 if ((sta->sdata->vif.type == NL80211_IFTYPE_STATION) && 800 - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) 773 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) 801 774 ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data, 802 775 acked, info->status.tx_time); 803 776 804 - if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { 777 + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { 805 778 if (info->flags & IEEE80211_TX_STAT_ACK) { 806 779 if (sta->lost_packets) 807 780 sta->lost_packets = 0; ··· 852 825 } 853 826 854 827 if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) && 855 - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && 828 + ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) && 856 829 !(info->flags & IEEE80211_TX_CTL_INJECTED) && 857 830 local->ps_sdata && !(local->scanning)) { 858 831 if (info->flags & IEEE80211_TX_STAT_ACK) {
+6 -13
net/mac80211/tdls.c
··· 167 167 static u16 ieee80211_get_tdls_sta_capab(struct ieee80211_sub_if_data *sdata, 168 168 u16 status_code) 169 169 { 170 - struct ieee80211_local *local = sdata->local; 171 - u16 capab; 172 - 173 170 /* The capability will be 0 when sending a failure code */ 174 171 if (status_code != 0) 175 172 return 0; 176 173 177 - capab = 0; 178 - if (ieee80211_get_sdata_band(sdata) != IEEE80211_BAND_2GHZ) 179 - return capab; 174 + if (ieee80211_get_sdata_band(sdata) == IEEE80211_BAND_2GHZ) { 175 + return WLAN_CAPABILITY_SHORT_SLOT_TIME | 176 + WLAN_CAPABILITY_SHORT_PREAMBLE; 177 + } 180 178 181 - if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE)) 182 - capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME; 183 - if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE)) 184 - capab |= WLAN_CAPABILITY_SHORT_PREAMBLE; 185 - 186 - return capab; 179 + return 0; 187 180 } 188 181 189 182 static void ieee80211_tdls_add_link_ie(struct ieee80211_sub_if_data *sdata, ··· 935 942 * packet through the AP. 936 943 */ 937 944 if ((action_code == WLAN_TDLS_TEARDOWN) && 938 - (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { 945 + ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { 939 946 bool try_resend; /* Should we keep skb for possible resend */ 940 947 941 948 /* If not sending directly to peer - no point in keeping skb */
+24 -29
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 ··· 2719 2719 if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { 2720 2720 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; 2721 2721 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); 2722 - if (tid_tx && 2723 - !test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) 2724 - return false; 2722 + if (tid_tx) { 2723 + if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) 2724 + return false; 2725 + if (tid_tx->timeout) 2726 + tid_tx->last_tx = jiffies; 2727 + } 2725 2728 } 2726 2729 2727 2730 /* after this point (skb is modified) we cannot return false */ ··· 2790 2787 if (fast_tx->key) 2791 2788 info->control.hw_key = &fast_tx->key->conf; 2792 2789 2793 - if (!(local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) { 2790 + if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { 2794 2791 tx.skb = skb; 2795 2792 r = ieee80211_tx_h_rate_ctrl(&tx); 2796 2793 skb = tx.skb; ··· 2816 2813 switch (fast_tx->key->conf.cipher) { 2817 2814 case WLAN_CIPHER_SUITE_CCMP: 2818 2815 case WLAN_CIPHER_SUITE_CCMP_256: 2819 - pn = atomic64_inc_return(&fast_tx->key->u.ccmp.tx_pn); 2820 - crypto_hdr[0] = pn; 2821 - crypto_hdr[1] = pn >> 8; 2822 - crypto_hdr[4] = pn >> 16; 2823 - crypto_hdr[5] = pn >> 24; 2824 - crypto_hdr[6] = pn >> 32; 2825 - crypto_hdr[7] = pn >> 40; 2826 - break; 2827 2816 case WLAN_CIPHER_SUITE_GCMP: 2828 2817 case WLAN_CIPHER_SUITE_GCMP_256: 2829 - pn = atomic64_inc_return(&fast_tx->key->u.gcmp.tx_pn); 2818 + pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); 2830 2819 crypto_hdr[0] = pn; 2831 2820 crypto_hdr[1] = pn >> 8; 2832 2821 crypto_hdr[4] = pn >> 16; ··· 3807 3812 synchronize_net(); 3808 3813 3809 3814 /* Tear down BA sessions so we stop aggregating on this TID */ 3810 - if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) { 3815 + if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION)) { 3811 3816 set_sta_flag(sta, WLAN_STA_BLOCK_BA); 3812 3817 __ieee80211_stop_tx_ba_session(sta, tid, 3813 3818 AGG_STOP_LOCAL_REQUEST); ··· 3821 3826 ieee80211_wake_vif_queues(local, sdata, 3822 3827 IEEE80211_QUEUE_STOP_REASON_RESERVE_TID); 3823 3828 3824 - if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) 3829 + if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION)) 3825 3830 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); 3826 3831 3827 3832 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) {
+5 -5
net/mac80211/wpa.c
··· 444 444 hdr = (struct ieee80211_hdr *) pos; 445 445 pos += hdrlen; 446 446 447 - pn64 = atomic64_inc_return(&key->u.ccmp.tx_pn); 447 + pn64 = atomic64_inc_return(&key->conf.tx_pn); 448 448 449 449 pn[5] = pn64; 450 450 pn[4] = pn64 >> 8; ··· 670 670 hdr = (struct ieee80211_hdr *)pos; 671 671 pos += hdrlen; 672 672 673 - pn64 = atomic64_inc_return(&key->u.gcmp.tx_pn); 673 + pn64 = atomic64_inc_return(&key->conf.tx_pn); 674 674 675 675 pn[5] = pn64; 676 676 pn[4] = pn64 >> 8; ··· 940 940 mmie->key_id = cpu_to_le16(key->conf.keyidx); 941 941 942 942 /* PN = PN + 1 */ 943 - pn64 = atomic64_inc_return(&key->u.aes_cmac.tx_pn); 943 + pn64 = atomic64_inc_return(&key->conf.tx_pn); 944 944 945 945 bip_ipn_set64(mmie->sequence_number, pn64); 946 946 ··· 984 984 mmie->key_id = cpu_to_le16(key->conf.keyidx); 985 985 986 986 /* PN = PN + 1 */ 987 - pn64 = atomic64_inc_return(&key->u.aes_cmac.tx_pn); 987 + pn64 = atomic64_inc_return(&key->conf.tx_pn); 988 988 989 989 bip_ipn_set64(mmie->sequence_number, pn64); 990 990 ··· 1129 1129 mmie->key_id = cpu_to_le16(key->conf.keyidx); 1130 1130 1131 1131 /* PN = PN + 1 */ 1132 - pn64 = atomic64_inc_return(&key->u.aes_gmac.tx_pn); 1132 + pn64 = atomic64_inc_return(&key->conf.tx_pn); 1133 1133 1134 1134 bip_ipn_set64(mmie->sequence_number, pn64); 1135 1135