mac80211: convert HW flags to unsigned long bitmap
As we're running out of hardware capability flags pretty quickly, convert them to use the regular test_bit() style unsigned long bitmaps. This introduces a number of helper functions/macros to set and to test the bits, along with new debugfs code. The occurrences of an explicit __clear_bit() are intentional, the drivers were never supposed to change their supported bits on the fly. We should investigate changing this to be a per-frame flag. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Цей коміт міститься в:
@@ -564,8 +564,8 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
|
||||
return -EINVAL;
|
||||
|
||||
if ((tid >= IEEE80211_NUM_TIDS) ||
|
||||
!(local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) ||
|
||||
(local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW))
|
||||
!ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) ||
|
||||
ieee80211_hw_check(&local->hw, TX_AMPDU_SETUP_IN_HW))
|
||||
return -EINVAL;
|
||||
|
||||
ht_dbg(sdata, "Open BA session requested for %pM tid %u\n",
|
||||
|
@@ -1763,7 +1763,7 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
|
||||
/* our RSSI threshold implementation is supported only for
|
||||
* devices that report signal in dBm.
|
||||
*/
|
||||
if (!(sdata->local->hw.flags & IEEE80211_HW_SIGNAL_DBM))
|
||||
if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
|
||||
return -ENOTSUPP;
|
||||
conf->rssi_threshold = nconf->rssi_threshold;
|
||||
}
|
||||
@@ -2407,7 +2407,7 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (enabled == sdata->u.mgd.powersave &&
|
||||
@@ -2422,7 +2422,7 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
||||
__ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps);
|
||||
sdata_unlock(sdata);
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
|
||||
if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
||||
|
||||
ieee80211_recalc_ps(local, -1);
|
||||
@@ -2466,7 +2466,7 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
return -ENETDOWN;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) {
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
|
||||
ret = drv_set_bitrate_mask(local, sdata, mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -3451,7 +3451,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN |
|
||||
IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
|
||||
if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)
|
||||
if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
|
||||
IEEE80211_SKB_CB(skb)->hw_queue =
|
||||
local->hw.offchannel_tx_hw_queue;
|
||||
|
||||
|
@@ -91,56 +91,66 @@ static const struct file_operations reset_ops = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static const char *hw_flag_names[NUM_IEEE80211_HW_FLAGS + 1] = {
|
||||
#define FLAG(F) [IEEE80211_HW_##F] = #F
|
||||
FLAG(HAS_RATE_CONTROL),
|
||||
FLAG(RX_INCLUDES_FCS),
|
||||
FLAG(HOST_BROADCAST_PS_BUFFERING),
|
||||
FLAG(SIGNAL_UNSPEC),
|
||||
FLAG(SIGNAL_DBM),
|
||||
FLAG(NEED_DTIM_BEFORE_ASSOC),
|
||||
FLAG(SPECTRUM_MGMT),
|
||||
FLAG(AMPDU_AGGREGATION),
|
||||
FLAG(SUPPORTS_PS),
|
||||
FLAG(PS_NULLFUNC_STACK),
|
||||
FLAG(SUPPORTS_DYNAMIC_PS),
|
||||
FLAG(MFP_CAPABLE),
|
||||
FLAG(WANT_MONITOR_VIF),
|
||||
FLAG(NO_AUTO_VIF),
|
||||
FLAG(SW_CRYPTO_CONTROL),
|
||||
FLAG(SUPPORT_FAST_XMIT),
|
||||
FLAG(REPORTS_TX_ACK_STATUS),
|
||||
FLAG(CONNECTION_MONITOR),
|
||||
FLAG(QUEUE_CONTROL),
|
||||
FLAG(SUPPORTS_PER_STA_GTK),
|
||||
FLAG(AP_LINK_PS),
|
||||
FLAG(TX_AMPDU_SETUP_IN_HW),
|
||||
FLAG(SUPPORTS_RC_TABLE),
|
||||
FLAG(P2P_DEV_ADDR_FOR_INTF),
|
||||
FLAG(TIMING_BEACON_ONLY),
|
||||
FLAG(SUPPORTS_HT_CCK_RATES),
|
||||
FLAG(CHANCTX_STA_CSA),
|
||||
FLAG(SUPPORTS_CLONED_SKBS),
|
||||
FLAG(SINGLE_SCAN_ON_ALL_BANDS),
|
||||
|
||||
/* keep last for the build bug below */
|
||||
(void *)0x1
|
||||
#undef FLAG
|
||||
};
|
||||
|
||||
static ssize_t hwflags_read(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_local *local = file->private_data;
|
||||
int mxln = 500;
|
||||
size_t bufsz = 30 * NUM_IEEE80211_HW_FLAGS;
|
||||
char *buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
char *pos = buf, *end = buf + bufsz - 1;
|
||||
ssize_t rv;
|
||||
char *buf = kzalloc(mxln, GFP_KERNEL);
|
||||
int sf = 0; /* how many written so far */
|
||||
int i;
|
||||
|
||||
if (!buf)
|
||||
return 0;
|
||||
return -ENOMEM;
|
||||
|
||||
sf += scnprintf(buf, mxln - sf, "0x%x\n", local->hw.flags);
|
||||
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "HAS_RATE_CONTROL\n");
|
||||
if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "RX_INCLUDES_FCS\n");
|
||||
if (local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING)
|
||||
sf += scnprintf(buf + sf, mxln - sf,
|
||||
"HOST_BCAST_PS_BUFFERING\n");
|
||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "SIGNAL_UNSPEC\n");
|
||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "SIGNAL_DBM\n");
|
||||
if (local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC)
|
||||
sf += scnprintf(buf + sf, mxln - sf,
|
||||
"NEED_DTIM_BEFORE_ASSOC\n");
|
||||
if (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "SPECTRUM_MGMT\n");
|
||||
if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "AMPDU_AGGREGATION\n");
|
||||
if (local->hw.flags & IEEE80211_HW_SUPPORTS_PS)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_PS\n");
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "PS_NULLFUNC_STACK\n");
|
||||
if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS\n");
|
||||
if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "MFP_CAPABLE\n");
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
sf += scnprintf(buf + sf, mxln - sf,
|
||||
"REPORTS_TX_ACK_STATUS\n");
|
||||
if (local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "CONNECTION_MONITOR\n");
|
||||
if (local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "SUPPORTS_PER_STA_GTK\n");
|
||||
if (local->hw.flags & IEEE80211_HW_AP_LINK_PS)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "AP_LINK_PS\n");
|
||||
if (local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)
|
||||
sf += scnprintf(buf + sf, mxln - sf, "TX_AMPDU_SETUP_IN_HW\n");
|
||||
/* fail compilation if somebody adds or removes
|
||||
* a flag without updating the name array above
|
||||
*/
|
||||
BUILD_BUG_ON(hw_flag_names[NUM_IEEE80211_HW_FLAGS] != (void *)0x1);
|
||||
|
||||
for (i = 0; i < NUM_IEEE80211_HW_FLAGS; i++) {
|
||||
if (test_bit(i, local->hw.flags))
|
||||
pos += scnprintf(pos, end - pos, "%s",
|
||||
hw_flag_names[i]);
|
||||
}
|
||||
|
||||
rv = simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
|
||||
kfree(buf);
|
||||
|
@@ -146,7 +146,7 @@ static inline int drv_add_interface(struct ieee80211_local *local,
|
||||
|
||||
if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||
(sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||
!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF) &&
|
||||
!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) &&
|
||||
!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE))))
|
||||
return -EINVAL;
|
||||
|
||||
|
@@ -338,7 +338,7 @@ static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata,
|
||||
if ((iftype != NL80211_IFTYPE_AP &&
|
||||
iftype != NL80211_IFTYPE_P2P_GO &&
|
||||
iftype != NL80211_IFTYPE_MESH_POINT) ||
|
||||
!(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) {
|
||||
!ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) {
|
||||
sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
|
||||
return 0;
|
||||
}
|
||||
@@ -378,7 +378,7 @@ static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||||
if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)
|
||||
if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
|
||||
sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE;
|
||||
else if (local->hw.queues >= IEEE80211_NUM_ACS)
|
||||
sdata->vif.hw_queue[i] = i;
|
||||
@@ -393,7 +393,7 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
int ret;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF))
|
||||
if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
return 0;
|
||||
|
||||
ASSERT_RTNL();
|
||||
@@ -454,7 +454,7 @@ void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF))
|
||||
if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
return;
|
||||
|
||||
ASSERT_RTNL();
|
||||
@@ -1586,7 +1586,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
if (local->hw.flags & IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF) {
|
||||
if (ieee80211_hw_check(&local->hw, P2P_DEV_ADDR_FOR_INTF)) {
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE)
|
||||
continue;
|
||||
|
@@ -147,7 +147,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
||||
* is supported; if not, return.
|
||||
*/
|
||||
if (sta && !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) &&
|
||||
!(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK))
|
||||
!ieee80211_hw_check(&key->local->hw, SUPPORTS_PER_STA_GTK))
|
||||
goto out_unsupported;
|
||||
|
||||
if (sta && !sta->uploaded)
|
||||
@@ -201,7 +201,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
||||
/* all of these we can do in software - if driver can */
|
||||
if (ret == 1)
|
||||
return 0;
|
||||
if (key->local->hw.flags & IEEE80211_HW_SW_CRYPTO_CONTROL)
|
||||
if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
default:
|
||||
|
@@ -661,7 +661,7 @@ static int ieee80211_init_cipher_suites(struct ieee80211_local *local)
|
||||
{
|
||||
bool have_wep = !(IS_ERR(local->wep_tx_tfm) ||
|
||||
IS_ERR(local->wep_rx_tfm));
|
||||
bool have_mfp = local->hw.flags & IEEE80211_HW_MFP_CAPABLE;
|
||||
bool have_mfp = ieee80211_hw_check(&local->hw, MFP_CAPABLE);
|
||||
int n_suites = 0, r = 0, w = 0;
|
||||
u32 *suites;
|
||||
static const u32 cipher_suites[] = {
|
||||
@@ -681,7 +681,7 @@ static int ieee80211_init_cipher_suites(struct ieee80211_local *local)
|
||||
WLAN_CIPHER_SUITE_BIP_GMAC_256,
|
||||
};
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_SW_CRYPTO_CONTROL ||
|
||||
if (ieee80211_hw_check(&local->hw, SW_CRYPTO_CONTROL) ||
|
||||
local->hw.wiphy->cipher_suites) {
|
||||
/* If the driver advertises, or doesn't support SW crypto,
|
||||
* we only need to remove WEP if necessary.
|
||||
@@ -797,7 +797,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
netdev_features_t feature_whitelist;
|
||||
struct cfg80211_chan_def dflt_chandef = {};
|
||||
|
||||
if (hw->flags & IEEE80211_HW_QUEUE_CONTROL &&
|
||||
if (ieee80211_hw_check(hw, QUEUE_CONTROL) &&
|
||||
(local->hw.offchannel_tx_hw_queue == IEEE80211_INVAL_HW_QUEUE ||
|
||||
local->hw.offchannel_tx_hw_queue >= local->hw.queues))
|
||||
return -EINVAL;
|
||||
@@ -945,9 +945,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
/* mac80211 supports control port protocol changing */
|
||||
local->hw.wiphy->flags |= WIPHY_FLAG_CONTROL_PORT_PROTOCOL;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
|
||||
if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) {
|
||||
local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
|
||||
} else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) {
|
||||
} else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC)) {
|
||||
local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;
|
||||
if (hw->max_signal <= 0) {
|
||||
result = -EINVAL;
|
||||
@@ -1001,7 +1001,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;
|
||||
|
||||
/* mac80211 supports eCSA, if the driver supports STA CSA at all */
|
||||
if (local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)
|
||||
if (ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA))
|
||||
local->ext_capa[0] |= WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING;
|
||||
|
||||
local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM;
|
||||
@@ -1069,7 +1069,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
|
||||
/* add one default STA interface if supported */
|
||||
if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) &&
|
||||
!(hw->flags & IEEE80211_HW_NO_AUTO_VIF)) {
|
||||
!ieee80211_hw_check(hw, NO_AUTO_VIF)) {
|
||||
result = ieee80211_if_add(local, "wlan%d", NET_NAME_ENUM, NULL,
|
||||
NL80211_IFTYPE_STATION, NULL);
|
||||
if (result)
|
||||
|
@@ -118,7 +118,7 @@ void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
|
||||
if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
|
||||
return;
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
||||
if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
||||
return;
|
||||
|
||||
mod_timer(&sdata->u.mgd.bcn_mon_timer,
|
||||
@@ -134,7 +134,7 @@ void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
ifmgd->probe_send_count = 0;
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
||||
if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
||||
return;
|
||||
|
||||
mod_timer(&sdata->u.mgd.conn_mon_timer,
|
||||
@@ -677,7 +677,7 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
capab |= WLAN_CAPABILITY_PRIVACY;
|
||||
|
||||
if ((assoc_data->capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
|
||||
(local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
|
||||
ieee80211_hw_check(&local->hw, SPECTRUM_MGMT))
|
||||
capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
|
||||
|
||||
if (ifmgd->flags & IEEE80211_STA_ENABLE_RRM)
|
||||
@@ -885,7 +885,7 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
drv_mgd_prepare_tx(local, sdata);
|
||||
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
ieee80211_tx_skb(sdata, skb);
|
||||
@@ -927,7 +927,7 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
|
||||
IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
|
||||
if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL)
|
||||
@@ -1198,7 +1198,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
||||
chanctx = container_of(conf, struct ieee80211_chanctx, conf);
|
||||
|
||||
if (local->use_chanctx &&
|
||||
!(local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)) {
|
||||
!ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA)) {
|
||||
sdata_info(sdata,
|
||||
"driver doesn't support chan-switch with channel contexts\n");
|
||||
goto drop_connection;
|
||||
@@ -1407,15 +1407,15 @@ static void ieee80211_enable_ps(struct ieee80211_local *local,
|
||||
return;
|
||||
|
||||
if (conf->dynamic_ps_timeout > 0 &&
|
||||
!(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)) {
|
||||
!ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) {
|
||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||
msecs_to_jiffies(conf->dynamic_ps_timeout));
|
||||
} else {
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK))
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
|
||||
if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
|
||||
(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS))
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
return;
|
||||
|
||||
conf->flags |= IEEE80211_CONF_PS;
|
||||
@@ -1474,7 +1474,7 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
|
||||
int count = 0;
|
||||
int timeout;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) {
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) {
|
||||
local->ps_sdata = NULL;
|
||||
return;
|
||||
}
|
||||
@@ -1620,7 +1620,7 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
||||
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
||||
}
|
||||
|
||||
if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
|
||||
!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
|
||||
if (drv_tx_frames_pending(local)) {
|
||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||
@@ -1633,8 +1633,8 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
||||
}
|
||||
}
|
||||
|
||||
if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&
|
||||
(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) ||
|
||||
if (!(ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) &&
|
||||
ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) ||
|
||||
(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
|
||||
ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED;
|
||||
local->hw.conf.flags |= IEEE80211_CONF_PS;
|
||||
@@ -2159,7 +2159,7 @@ static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
|
||||
ieee80211_recalc_ps(local, -1);
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
||||
if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
@@ -2257,7 +2257,7 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
|
||||
*/
|
||||
ifmgd->probe_send_count++;
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
|
||||
if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
ifmgd->nullfunc_failed = false;
|
||||
ieee80211_send_nullfunc(sdata->local, sdata, 0);
|
||||
} else {
|
||||
@@ -2562,7 +2562,7 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
|
||||
return;
|
||||
auth_data->expected_transaction = 4;
|
||||
drv_mgd_prepare_tx(sdata->local, sdata);
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0,
|
||||
@@ -3337,7 +3337,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
ifmgd->have_beacon = true;
|
||||
ifmgd->assoc_data->need_beacon = false;
|
||||
if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) {
|
||||
if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
|
||||
sdata->vif.bss_conf.sync_tsf =
|
||||
le64_to_cpu(mgmt->u.beacon.timestamp);
|
||||
sdata->vif.bss_conf.sync_device_ts =
|
||||
@@ -3443,7 +3443,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
len - baselen, false, &elems,
|
||||
care_about_ies, ncrc);
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) {
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) {
|
||||
bool directed_tim = ieee80211_check_tim(elems.tim,
|
||||
elems.tim_len,
|
||||
ifmgd->aid);
|
||||
@@ -3511,7 +3511,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
* the driver will use them. The synchronized view is currently
|
||||
* guaranteed only in certain callbacks.
|
||||
*/
|
||||
if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) {
|
||||
if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
|
||||
sdata->vif.bss_conf.sync_tsf =
|
||||
le64_to_cpu(mgmt->u.beacon.timestamp);
|
||||
sdata->vif.bss_conf.sync_device_ts =
|
||||
@@ -3749,7 +3749,7 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
||||
auth_data->expected_transaction = trans;
|
||||
}
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
|
||||
@@ -3822,7 +3822,7 @@ static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
IEEE80211_ASSOC_MAX_TRIES);
|
||||
ieee80211_send_assoc(sdata);
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) {
|
||||
if (!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
assoc_data->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT;
|
||||
assoc_data->timeout_started = true;
|
||||
run_again(sdata, assoc_data->timeout);
|
||||
@@ -3936,7 +3936,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
max_tries = max_nullfunc_tries;
|
||||
else
|
||||
max_tries = max_probe_tries;
|
||||
@@ -3961,7 +3961,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
||||
}
|
||||
} else if (time_is_after_jiffies(ifmgd->probe_timeout))
|
||||
run_again(sdata, ifmgd->probe_timeout);
|
||||
else if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
|
||||
else if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
mlme_dbg(sdata,
|
||||
"Failed to send nullfunc to AP %pM after %dms, disconnecting\n",
|
||||
bssid, probe_wait_ms);
|
||||
@@ -4030,14 +4030,11 @@ static void ieee80211_sta_monitor_work(struct work_struct *work)
|
||||
|
||||
static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
u32 flags;
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
__ieee80211_stop_poll(sdata);
|
||||
|
||||
/* let's probe the connection once */
|
||||
flags = sdata->local->hw.flags;
|
||||
if (!(flags & IEEE80211_HW_CONNECTION_MONITOR))
|
||||
if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
||||
ieee80211_queue_work(&sdata->local->hw,
|
||||
&sdata->u.mgd.monitor_work);
|
||||
/* and do all the other regular work too */
|
||||
@@ -4450,8 +4447,8 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->vif.bss_conf.sync_dtim_count = tim_ie[2];
|
||||
else
|
||||
sdata->vif.bss_conf.sync_dtim_count = 0;
|
||||
} else if (!(local->hw.flags &
|
||||
IEEE80211_HW_TIMING_BEACON_ONLY)) {
|
||||
} else if (!ieee80211_hw_check(&sdata->local->hw,
|
||||
TIMING_BEACON_ONLY)) {
|
||||
ies = rcu_dereference(cbss->proberesp_ies);
|
||||
/* must be non-NULL since beacon IEs were NULL */
|
||||
sdata->vif.bss_conf.sync_tsf = ies->tsf;
|
||||
@@ -4829,7 +4826,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_unlock();
|
||||
|
||||
if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) &&
|
||||
(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK),
|
||||
ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK),
|
||||
"U-APSD not supported with HW_PS_NULLFUNC_STACK\n"))
|
||||
sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
|
||||
|
||||
@@ -4910,7 +4907,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_lock();
|
||||
beacon_ies = rcu_dereference(req->bss->beacon_ies);
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC &&
|
||||
if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) &&
|
||||
!beacon_ies) {
|
||||
/*
|
||||
* Wait up to one beacon interval ...
|
||||
@@ -4937,7 +4934,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
assoc_data->timeout = jiffies;
|
||||
assoc_data->timeout_started = true;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) {
|
||||
if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
|
||||
sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf;
|
||||
sdata->vif.bss_conf.sync_device_ts =
|
||||
bss->device_ts_beacon;
|
||||
|
@@ -46,7 +46,7 @@ static void ieee80211_offchannel_ps_enable(struct ieee80211_sub_if_data *sdata)
|
||||
}
|
||||
|
||||
if (!local->offchannel_ps_enabled ||
|
||||
!(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK))
|
||||
!ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK))
|
||||
/*
|
||||
* If power save was enabled, no need to send a nullfunc
|
||||
* frame because AP knows that we are sleeping. But if the
|
||||
|
@@ -23,7 +23,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||
|
||||
ieee80211_del_virtual_monitor(local);
|
||||
|
||||
if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
|
||||
if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
|
||||
mutex_lock(&local->sta_mtx);
|
||||
list_for_each_entry(sta, &local->sta_list, list) {
|
||||
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
||||
@@ -82,7 +82,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||
if (err < 0) {
|
||||
local->quiescing = false;
|
||||
local->wowlan = false;
|
||||
if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
|
||||
if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
|
||||
mutex_lock(&local->sta_mtx);
|
||||
list_for_each_entry(sta,
|
||||
&local->sta_list, list) {
|
||||
|
@@ -680,7 +680,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
|
||||
info->control.rates[i].count = 0;
|
||||
}
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
|
||||
if (ieee80211_hw_check(&sdata->local->hw, HAS_RATE_CONTROL))
|
||||
return;
|
||||
|
||||
if (ista) {
|
||||
@@ -691,7 +691,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
|
||||
ref->ops->get_rate(ref->priv, NULL, NULL, txrc);
|
||||
}
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_RC_TABLE)
|
||||
if (ieee80211_hw_check(&sdata->local->hw, SUPPORTS_RC_TABLE))
|
||||
return;
|
||||
|
||||
ieee80211_get_tx_rates(&sdata->vif, ista, txrc->skb,
|
||||
@@ -733,7 +733,7 @@ int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local,
|
||||
if (local->open_count)
|
||||
return -EBUSY;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) {
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
|
||||
if (WARN_ON(!local->ops->set_rts_threshold))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
|
@@ -1070,7 +1070,7 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
if (sband->band != IEEE80211_BAND_2GHZ)
|
||||
return;
|
||||
|
||||
if (!(mp->hw->flags & IEEE80211_HW_SUPPORTS_HT_CCK_RATES))
|
||||
if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
|
||||
return;
|
||||
|
||||
mi->cck_supported = 0;
|
||||
|
@@ -52,7 +52,7 @@ static struct sk_buff *remove_monitor_info(struct ieee80211_local *local,
|
||||
struct sk_buff *skb,
|
||||
unsigned int rtap_vendor_space)
|
||||
{
|
||||
if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) {
|
||||
if (ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) {
|
||||
if (likely(skb->len > FCS_LEN))
|
||||
__pskb_trim(skb, skb->len - FCS_LEN);
|
||||
else {
|
||||
@@ -110,7 +110,7 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
|
||||
len = ALIGN(len, 8);
|
||||
len += 8;
|
||||
}
|
||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||
if (ieee80211_hw_check(&local->hw, SIGNAL_DBM))
|
||||
len += 1;
|
||||
|
||||
/* antenna field, if we don't have per-chain info */
|
||||
@@ -185,7 +185,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
mpdulen = skb->len;
|
||||
if (!(has_fcs && (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)))
|
||||
if (!(has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)))
|
||||
mpdulen += FCS_LEN;
|
||||
|
||||
rthdr = (struct ieee80211_radiotap_header *)skb_push(skb, rtap_len);
|
||||
@@ -239,7 +239,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
/* IEEE80211_RADIOTAP_FLAGS */
|
||||
if (has_fcs && (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS))
|
||||
if (has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS))
|
||||
*pos |= IEEE80211_RADIOTAP_F_FCS;
|
||||
if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC))
|
||||
*pos |= IEEE80211_RADIOTAP_F_BADFCS;
|
||||
@@ -289,7 +289,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
||||
pos += 2;
|
||||
|
||||
/* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */
|
||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM &&
|
||||
if (ieee80211_hw_check(&local->hw, SIGNAL_DBM) &&
|
||||
!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
|
||||
*pos = status->signal;
|
||||
rthdr->it_present |=
|
||||
@@ -458,7 +458,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
|
||||
* the SKB because it has a bad FCS/PLCP checksum.
|
||||
*/
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)
|
||||
if (ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS))
|
||||
present_fcs_len = FCS_LEN;
|
||||
|
||||
/* ensure hdr->frame_control and vendor radiotap data are in skb head */
|
||||
@@ -1197,7 +1197,7 @@ static void sta_ps_start(struct sta_info *sta)
|
||||
|
||||
atomic_inc(&ps->num_sta_ps);
|
||||
set_sta_flag(sta, WLAN_STA_PS_STA);
|
||||
if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS))
|
||||
if (!ieee80211_hw_check(&local->hw, AP_LINK_PS))
|
||||
drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta);
|
||||
ps_dbg(sdata, "STA %pM aid %d enters power save mode\n",
|
||||
sta->sta.addr, sta->sta.aid);
|
||||
@@ -1245,7 +1245,7 @@ int ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start)
|
||||
struct sta_info *sta_inf = container_of(sta, struct sta_info, sta);
|
||||
bool in_ps;
|
||||
|
||||
WARN_ON(!(sta_inf->local->hw.flags & IEEE80211_HW_AP_LINK_PS));
|
||||
WARN_ON(!ieee80211_hw_check(&sta_inf->local->hw, AP_LINK_PS));
|
||||
|
||||
/* Don't let the same PS state be set twice */
|
||||
in_ps = test_sta_flag(sta_inf, WLAN_STA_PS_STA);
|
||||
@@ -1281,7 +1281,7 @@ ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx)
|
||||
* uAPSD and PS-Poll frames (the latter shouldn't even come up from
|
||||
* it to mac80211 since they're handled.)
|
||||
*/
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_AP_LINK_PS)
|
||||
if (ieee80211_hw_check(&sdata->local->hw, AP_LINK_PS))
|
||||
return RX_CONTINUE;
|
||||
|
||||
/*
|
||||
@@ -1413,7 +1413,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||
* Change STA power saving mode only at the end of a frame
|
||||
* exchange sequence.
|
||||
*/
|
||||
if (!(sta->local->hw.flags & IEEE80211_HW_AP_LINK_PS) &&
|
||||
if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) &&
|
||||
!ieee80211_has_morefrags(hdr->frame_control) &&
|
||||
!(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&
|
||||
(rx->sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
@@ -2543,7 +2543,7 @@ ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
|
||||
!(rx->flags & IEEE80211_RX_BEACON_REPORTED)) {
|
||||
int sig = 0;
|
||||
|
||||
if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||
if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM))
|
||||
sig = status->signal;
|
||||
|
||||
cfg80211_report_obss_beacon(rx->local->hw.wiphy,
|
||||
@@ -2874,7 +2874,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
|
||||
* it transmitted were processed or returned.
|
||||
*/
|
||||
|
||||
if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||
if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM))
|
||||
sig = status->signal;
|
||||
|
||||
if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
|
||||
@@ -2939,7 +2939,7 @@ ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx)
|
||||
info->flags = IEEE80211_TX_CTL_TX_OFFCHAN |
|
||||
IEEE80211_TX_INTFL_OFFCHAN_TX_OK |
|
||||
IEEE80211_TX_CTL_NO_CCK_RATE;
|
||||
if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)
|
||||
if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
|
||||
info->hw_queue =
|
||||
local->hw.offchannel_tx_hw_queue;
|
||||
}
|
||||
|
@@ -71,9 +71,9 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
|
||||
s32 signal = 0;
|
||||
bool signal_valid;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||
if (ieee80211_hw_check(&local->hw, SIGNAL_DBM))
|
||||
signal = rx_status->signal * 100;
|
||||
else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
|
||||
else if (ieee80211_hw_check(&local->hw, SIGNAL_UNSPEC))
|
||||
signal = (rx_status->signal * 100) / local->hw.max_signal;
|
||||
|
||||
scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
@@ -263,7 +263,7 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
|
||||
if (test_bit(SCAN_HW_CANCELLED, &local->scanning))
|
||||
return false;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS) {
|
||||
if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) {
|
||||
for (i = 0; i < req->n_channels; i++) {
|
||||
local->hw_scan_req->req.channels[i] = req->channels[i];
|
||||
bands_used |= BIT(req->channels[i]->band);
|
||||
@@ -332,7 +332,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
|
||||
return;
|
||||
|
||||
if (hw_scan && !aborted &&
|
||||
!(local->hw.flags & IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS) &&
|
||||
!ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS) &&
|
||||
ieee80211_prep_hw_scan(local)) {
|
||||
int rc;
|
||||
|
||||
@@ -526,7 +526,7 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
local->hw_scan_ies_bufsize = local->scan_ies_len + req->ie_len;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS) {
|
||||
if (ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS)) {
|
||||
int i, n_bands = 0;
|
||||
u8 bands_counted = 0;
|
||||
|
||||
|
@@ -282,7 +282,7 @@ static void sta_deliver_ps_frames(struct work_struct *wk)
|
||||
static int sta_prepare_rate_control(struct ieee80211_local *local,
|
||||
struct sta_info *sta, gfp_t gfp)
|
||||
{
|
||||
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
|
||||
return 0;
|
||||
|
||||
sta->rate_ctrl = local->rate_ctrl;
|
||||
@@ -643,7 +643,7 @@ static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending)
|
||||
}
|
||||
|
||||
/* No need to do anything if the driver does all */
|
||||
if (local->hw.flags & IEEE80211_HW_AP_LINK_PS)
|
||||
if (ieee80211_hw_check(&local->hw, AP_LINK_PS))
|
||||
return;
|
||||
|
||||
if (sta->dead)
|
||||
@@ -1148,7 +1148,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
|
||||
sta->driver_buffered_tids = 0;
|
||||
sta->txq_buffered_tids = 0;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS))
|
||||
if (!ieee80211_hw_check(&local->hw, AP_LINK_PS))
|
||||
drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta);
|
||||
|
||||
if (sta->sta.txq[0]) {
|
||||
@@ -1879,8 +1879,8 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
sinfo->rx_beacon_signal_avg = ieee80211_ave_rssi(&sdata->vif);
|
||||
}
|
||||
|
||||
if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
|
||||
(sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
|
||||
if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) ||
|
||||
ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) {
|
||||
if (!(sinfo->filled & BIT(NL80211_STA_INFO_SIGNAL))) {
|
||||
sinfo->signal = (s8)sta->last_signal;
|
||||
sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
|
||||
@@ -1932,7 +1932,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
|
||||
if (!(tidstats->filled &
|
||||
BIT(NL80211_TID_STATS_TX_MSDU_RETRIES)) &&
|
||||
local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
tidstats->filled |=
|
||||
BIT(NL80211_TID_STATS_TX_MSDU_RETRIES);
|
||||
tidstats->tx_msdu_retries = sta->tx_msdu_retries[i];
|
||||
@@ -1940,7 +1940,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
|
||||
if (!(tidstats->filled &
|
||||
BIT(NL80211_TID_STATS_TX_MSDU_FAILED)) &&
|
||||
local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
tidstats->filled |=
|
||||
BIT(NL80211_TID_STATS_TX_MSDU_FAILED);
|
||||
tidstats->tx_msdu_failed = sta->tx_msdu_failed[i];
|
||||
|
@@ -181,7 +181,7 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
|
||||
struct ieee80211_local *local = sta->local;
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
sta->last_rx = jiffies;
|
||||
|
||||
if (ieee80211_is_data_qos(mgmt->frame_control)) {
|
||||
@@ -414,8 +414,7 @@ static void ieee80211_tdls_td_tx_handle(struct ieee80211_local *local,
|
||||
|
||||
if (is_teardown) {
|
||||
/* This mechanism relies on being able to get ACKs */
|
||||
WARN_ON(!(local->hw.flags &
|
||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS));
|
||||
WARN_ON(!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS));
|
||||
|
||||
/* Check if peer has ACKed */
|
||||
if (flags & IEEE80211_TX_STAT_ACK) {
|
||||
@@ -731,7 +730,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
ieee80211_get_qos_ctl(hdr),
|
||||
sta, true, acked);
|
||||
|
||||
if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) &&
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
|
||||
(ieee80211_is_data(hdr->frame_control)) &&
|
||||
(rates_idx != -1))
|
||||
sta->last_tx_rate = info->status.rates[rates_idx];
|
||||
@@ -798,11 +797,11 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
ieee80211_frame_acked(sta, skb);
|
||||
|
||||
if ((sta->sdata->vif.type == NL80211_IFTYPE_STATION) &&
|
||||
(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS))
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
|
||||
acked, info->status.tx_time);
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
if (info->flags & IEEE80211_TX_STAT_ACK) {
|
||||
if (sta->lost_packets)
|
||||
sta->lost_packets = 0;
|
||||
@@ -853,7 +852,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) &&
|
||||
(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) &&
|
||||
!(info->flags & IEEE80211_TX_CTL_INJECTED) &&
|
||||
local->ps_sdata && !(local->scanning)) {
|
||||
if (info->flags & IEEE80211_TX_STAT_ACK) {
|
||||
|
@@ -935,7 +935,7 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev,
|
||||
* packet through the AP.
|
||||
*/
|
||||
if ((action_code == WLAN_TDLS_TEARDOWN) &&
|
||||
(sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) {
|
||||
ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
bool try_resend; /* Should we keep skb for possible resend */
|
||||
|
||||
/* If not sending directly to peer - no point in keeping skb */
|
||||
|
@@ -211,11 +211,11 @@ ieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx)
|
||||
struct ieee80211_if_managed *ifmgd;
|
||||
|
||||
/* driver doesn't support power save */
|
||||
if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
|
||||
return TX_CONTINUE;
|
||||
|
||||
/* hardware does dynamic power save */
|
||||
if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
|
||||
if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
|
||||
return TX_CONTINUE;
|
||||
|
||||
/* dynamic power save disabled */
|
||||
@@ -431,7 +431,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
||||
if (ieee80211_is_probe_req(hdr->frame_control))
|
||||
return TX_CONTINUE;
|
||||
|
||||
if (tx->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)
|
||||
if (ieee80211_hw_check(&tx->local->hw, QUEUE_CONTROL))
|
||||
info->hw_queue = tx->sdata->vif.cab_queue;
|
||||
|
||||
/* no stations in PS mode */
|
||||
@@ -441,7 +441,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
||||
info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM;
|
||||
|
||||
/* device releases frame after DTIM beacon */
|
||||
if (!(tx->local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING))
|
||||
if (!ieee80211_hw_check(&tx->local->hw, HOST_BROADCAST_PS_BUFFERING))
|
||||
return TX_CONTINUE;
|
||||
|
||||
/* buffered in mac80211 */
|
||||
@@ -1185,8 +1185,8 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) &&
|
||||
!ieee80211_is_qos_nullfunc(hdr->frame_control) &&
|
||||
(local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) &&
|
||||
!(local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)) {
|
||||
ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) &&
|
||||
!ieee80211_hw_check(&local->hw, TX_AMPDU_SETUP_IN_HW)) {
|
||||
struct tid_ampdu_tx *tid_tx;
|
||||
|
||||
qc = ieee80211_get_qos_ctl(hdr);
|
||||
@@ -1429,7 +1429,7 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
|
||||
vif = &sdata->vif;
|
||||
info->hw_queue =
|
||||
vif->hw_queue[skb_get_queue_mapping(skb)];
|
||||
} else if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) {
|
||||
} else if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
|
||||
dev_kfree_skb(skb);
|
||||
return true;
|
||||
} else
|
||||
@@ -1475,7 +1475,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx)
|
||||
CALL_TXH(ieee80211_tx_h_ps_buf);
|
||||
CALL_TXH(ieee80211_tx_h_check_control_port_protocol);
|
||||
CALL_TXH(ieee80211_tx_h_select_key);
|
||||
if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL))
|
||||
if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL))
|
||||
CALL_TXH(ieee80211_tx_h_rate_ctrl);
|
||||
|
||||
if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) {
|
||||
@@ -1490,7 +1490,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx)
|
||||
/* handlers after fragment must be aware of tx info fragmentation! */
|
||||
CALL_TXH(ieee80211_tx_h_stats);
|
||||
CALL_TXH(ieee80211_tx_h_encrypt);
|
||||
if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL))
|
||||
if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL))
|
||||
CALL_TXH(ieee80211_tx_h_calculate_duration);
|
||||
#undef CALL_TXH
|
||||
|
||||
@@ -1580,7 +1580,7 @@ static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
/* set up hw_queue value early */
|
||||
if (!(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) ||
|
||||
!(local->hw.flags & IEEE80211_HW_QUEUE_CONTROL))
|
||||
!ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
|
||||
info->hw_queue =
|
||||
sdata->vif.hw_queue[skb_get_queue_mapping(skb)];
|
||||
|
||||
@@ -1607,7 +1607,7 @@ static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
if (skb_cloned(skb) &&
|
||||
(!(local->hw.flags & IEEE80211_HW_SUPPORTS_CLONED_SKBS) ||
|
||||
(!ieee80211_hw_check(&local->hw, SUPPORTS_CLONED_SKBS) ||
|
||||
!skb_clone_writable(skb, ETH_HLEN) ||
|
||||
(may_encrypt && sdata->crypto_tx_tailroom_needed_cnt)))
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
|
||||
@@ -2426,7 +2426,7 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
||||
struct ieee80211_chanctx_conf *chanctx_conf;
|
||||
__le16 fc;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_SUPPORT_FAST_XMIT))
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT))
|
||||
return;
|
||||
|
||||
/* Locking here protects both the pointer itself, and against concurrent
|
||||
@@ -2442,8 +2442,8 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
||||
* cleared/changed already.
|
||||
*/
|
||||
spin_lock_bh(&sta->lock);
|
||||
if (local->hw.flags & IEEE80211_HW_SUPPORTS_PS &&
|
||||
!(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) &&
|
||||
if (ieee80211_hw_check(&local->hw, SUPPORTS_PS) &&
|
||||
!ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS) &&
|
||||
sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
goto out;
|
||||
|
||||
@@ -2790,7 +2790,7 @@ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
|
||||
if (fast_tx->key)
|
||||
info->control.hw_key = &fast_tx->key->conf;
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) {
|
||||
if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
|
||||
tx.skb = skb;
|
||||
r = ieee80211_tx_h_rate_ctrl(&tx);
|
||||
skb = tx.skb;
|
||||
@@ -3807,7 +3807,7 @@ int ieee80211_reserve_tid(struct ieee80211_sta *pubsta, u8 tid)
|
||||
synchronize_net();
|
||||
|
||||
/* Tear down BA sessions so we stop aggregating on this TID */
|
||||
if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION) {
|
||||
if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION)) {
|
||||
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
||||
__ieee80211_stop_tx_ba_session(sta, tid,
|
||||
AGG_STOP_LOCAL_REQUEST);
|
||||
@@ -3821,7 +3821,7 @@ int ieee80211_reserve_tid(struct ieee80211_sta *pubsta, u8 tid)
|
||||
ieee80211_wake_vif_queues(local, sdata,
|
||||
IEEE80211_QUEUE_STOP_REASON_RESERVE_TID);
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION)
|
||||
if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION))
|
||||
clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
||||
|
||||
ret = 0;
|
||||
|
@@ -564,7 +564,7 @@ ieee80211_get_vif_queues(struct ieee80211_local *local,
|
||||
{
|
||||
unsigned int queues;
|
||||
|
||||
if (sdata && local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) {
|
||||
if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
|
||||
int ac;
|
||||
|
||||
queues = 0;
|
||||
@@ -592,7 +592,7 @@ void __ieee80211_flush_queues(struct ieee80211_local *local,
|
||||
* If no queue was set, or if the HW doesn't support
|
||||
* IEEE80211_HW_QUEUE_CONTROL - flush all queues
|
||||
*/
|
||||
if (!queues || !(local->hw.flags & IEEE80211_HW_QUEUE_CONTROL))
|
||||
if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
|
||||
queues = ieee80211_get_vif_queues(local, sdata);
|
||||
|
||||
ieee80211_stop_queues_by_reason(&local->hw, queues,
|
||||
@@ -2046,7 +2046,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
* about the sessions, but we and the AP still think they
|
||||
* are active. This is really a workaround though.
|
||||
*/
|
||||
if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
|
||||
if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
|
||||
mutex_lock(&local->sta_mtx);
|
||||
|
||||
list_for_each_entry(sta, &local->sta_list, list) {
|
||||
|
Посилання в новій задачі
Заблокувати користувача