You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
This commit is contained in:
@@ -1074,15 +1074,18 @@ out:
|
||||
void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
|
||||
enum wmi_phy_mode mode)
|
||||
{
|
||||
enum nl80211_channel_type type;
|
||||
struct cfg80211_chan_def chandef;
|
||||
|
||||
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
|
||||
"channel switch notify nw_type %d freq %d mode %d\n",
|
||||
vif->nw_type, freq, mode);
|
||||
|
||||
type = (mode == WMI_11G_HT20) ? NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT;
|
||||
cfg80211_chandef_create(&chandef,
|
||||
ieee80211_get_channel(vif->ar->wiphy, freq),
|
||||
(mode == WMI_11G_HT20) ?
|
||||
NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT);
|
||||
|
||||
cfg80211_ch_switch_notify(vif->ndev, freq, type);
|
||||
cfg80211_ch_switch_notify(vif->ndev, &chandef);
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
@@ -1594,8 +1597,8 @@ static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
|
||||
vif->ssid_len = ibss_param->ssid_len;
|
||||
memcpy(vif->ssid, ibss_param->ssid, vif->ssid_len);
|
||||
|
||||
if (ibss_param->channel)
|
||||
vif->ch_hint = ibss_param->channel->center_freq;
|
||||
if (ibss_param->chandef.chan)
|
||||
vif->ch_hint = ibss_param->chandef.chan->center_freq;
|
||||
|
||||
if (ibss_param->channel_fixed) {
|
||||
/*
|
||||
@@ -2878,7 +2881,7 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
p.ssid_len = vif->ssid_len;
|
||||
memcpy(p.ssid, vif->ssid, vif->ssid_len);
|
||||
p.dot11_auth_mode = vif->dot11_auth_mode;
|
||||
p.ch = cpu_to_le16(info->channel->center_freq);
|
||||
p.ch = cpu_to_le16(info->chandef.chan->center_freq);
|
||||
|
||||
/* Enable uAPSD support by default */
|
||||
res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true);
|
||||
@@ -2909,8 +2912,9 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
return res;
|
||||
}
|
||||
|
||||
if (ath6kl_set_htcap(vif, info->channel->band,
|
||||
info->channel_type != NL80211_CHAN_NO_HT))
|
||||
if (ath6kl_set_htcap(vif, info->chandef.chan->band,
|
||||
cfg80211_get_chandef_type(&info->chandef)
|
||||
!= NL80211_CHAN_NO_HT))
|
||||
return -EIO;
|
||||
|
||||
/*
|
||||
@@ -3006,7 +3010,6 @@ static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ath6kl_remain_on_channel(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
unsigned int duration,
|
||||
u64 *cookie)
|
||||
{
|
||||
@@ -3165,10 +3168,8 @@ static bool ath6kl_is_p2p_go_ssid(const u8 *buf, size_t len)
|
||||
|
||||
static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan, bool offchan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
bool channel_type_valid, unsigned int wait,
|
||||
const u8 *buf, size_t len, bool no_cck,
|
||||
bool dont_wait_for_ack, u64 *cookie)
|
||||
unsigned int wait, const u8 *buf, size_t len,
|
||||
bool no_cck, bool dont_wait_for_ack, u64 *cookie)
|
||||
{
|
||||
struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
|
||||
struct ath6kl *ar = ath6kl_priv(vif->ndev);
|
||||
|
||||
@@ -474,7 +474,7 @@ static int ath6kl_wmi_remain_on_chnl_event_rx(struct wmi *wmi, u8 *datap,
|
||||
return -EINVAL;
|
||||
}
|
||||
id = vif->last_roc_id;
|
||||
cfg80211_ready_on_channel(&vif->wdev, id, chan, NL80211_CHAN_NO_HT,
|
||||
cfg80211_ready_on_channel(&vif->wdev, id, chan,
|
||||
dur, GFP_ATOMIC);
|
||||
|
||||
return 0;
|
||||
@@ -513,8 +513,7 @@ static int ath6kl_wmi_cancel_remain_on_chnl_event_rx(struct wmi *wmi,
|
||||
else
|
||||
id = vif->last_roc_id; /* timeout on uncanceled r-o-c */
|
||||
vif->last_cancel_roc_id = 0;
|
||||
cfg80211_remain_on_channel_expired(&vif->wdev, id, chan,
|
||||
NL80211_CHAN_NO_HT, GFP_ATOMIC);
|
||||
cfg80211_remain_on_channel_expired(&vif->wdev, id, chan, GFP_ATOMIC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1013,8 +1013,8 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
|
||||
else
|
||||
WL_CONN("No BSSID specified\n");
|
||||
|
||||
if (params->channel)
|
||||
WL_CONN("channel: %d\n", params->channel->center_freq);
|
||||
if (params->chandef.chan)
|
||||
WL_CONN("channel: %d\n", params->chandef.chan->center_freq);
|
||||
else
|
||||
WL_CONN("no channel specified\n");
|
||||
|
||||
@@ -1087,12 +1087,12 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
/* Channel */
|
||||
if (params->channel) {
|
||||
if (params->chandef.chan) {
|
||||
u32 target_channel;
|
||||
|
||||
cfg->channel =
|
||||
ieee80211_frequency_to_channel(
|
||||
params->channel->center_freq);
|
||||
params->chandef.chan->center_freq);
|
||||
if (params->channel_fixed) {
|
||||
/* adding chanspec */
|
||||
brcmf_ch_to_chanspec(cfg->channel,
|
||||
@@ -3506,7 +3506,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
|
||||
s32 bssidx = 0;
|
||||
|
||||
WL_TRACE("channel_type=%d, beacon_interval=%d, dtim_period=%d,\n",
|
||||
settings->channel_type, settings->beacon_interval,
|
||||
cfg80211_get_chandef_type(&settings->chandef),
|
||||
settings->beacon_interval,
|
||||
settings->dtim_period);
|
||||
WL_TRACE("ssid=%s(%zu), auth_type=%d, inactivity_timeout=%d\n",
|
||||
settings->ssid, settings->ssid_len, settings->auth_type,
|
||||
|
||||
@@ -789,7 +789,6 @@ struct iwl_priv {
|
||||
/* remain-on-channel offload support */
|
||||
struct ieee80211_channel *hw_roc_channel;
|
||||
struct delayed_work hw_roc_disable_work;
|
||||
enum nl80211_channel_type hw_roc_chantype;
|
||||
int hw_roc_duration;
|
||||
bool hw_roc_setup, hw_roc_start_notified;
|
||||
|
||||
|
||||
@@ -1037,7 +1037,6 @@ done:
|
||||
static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type channel_type,
|
||||
int duration)
|
||||
{
|
||||
struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
|
||||
@@ -1069,7 +1068,6 @@ static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
priv->hw_roc_channel = channel;
|
||||
priv->hw_roc_chantype = channel_type;
|
||||
/* convert from ms to TU */
|
||||
priv->hw_roc_duration = DIV_ROUND_UP(1000 * duration, 1024);
|
||||
priv->hw_roc_start_notified = false;
|
||||
|
||||
@@ -436,19 +436,19 @@ static int lbs_add_wpa_tlv(u8 *tlv, const u8 *ie, u8 ie_len)
|
||||
*/
|
||||
|
||||
static int lbs_cfg_set_monitor_channel(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type channel_type)
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct lbs_private *priv = wiphy_priv(wiphy);
|
||||
int ret = -ENOTSUPP;
|
||||
|
||||
lbs_deb_enter_args(LBS_DEB_CFG80211, "freq %d, type %d",
|
||||
channel->center_freq, channel_type);
|
||||
chandef->chan->center_freq,
|
||||
cfg80211_get_chandef_type(chandef));
|
||||
|
||||
if (channel_type != NL80211_CHAN_NO_HT)
|
||||
if (cfg80211_get_chandef_type(chandef) != NL80211_CHAN_NO_HT)
|
||||
goto out;
|
||||
|
||||
ret = lbs_set_channel(priv, channel->hw_value);
|
||||
ret = lbs_set_channel(priv, chandef->chan->hw_value);
|
||||
|
||||
out:
|
||||
lbs_deb_leave_args(LBS_DEB_CFG80211, "ret %d", ret);
|
||||
@@ -1734,7 +1734,7 @@ static void lbs_join_post(struct lbs_private *priv,
|
||||
/* Fake DS channel IE */
|
||||
*fake++ = WLAN_EID_DS_PARAMS;
|
||||
*fake++ = 1;
|
||||
*fake++ = params->channel->hw_value;
|
||||
*fake++ = params->chandef.chan->hw_value;
|
||||
/* Fake IBSS params IE */
|
||||
*fake++ = WLAN_EID_IBSS_PARAMS;
|
||||
*fake++ = 2;
|
||||
@@ -1755,7 +1755,7 @@ static void lbs_join_post(struct lbs_private *priv,
|
||||
lbs_deb_hex(LBS_DEB_CFG80211, "IE", fake_ie, fake - fake_ie);
|
||||
|
||||
bss = cfg80211_inform_bss(priv->wdev->wiphy,
|
||||
params->channel,
|
||||
params->chandef.chan,
|
||||
bssid,
|
||||
0,
|
||||
capability,
|
||||
@@ -1833,7 +1833,7 @@ static int lbs_ibss_join_existing(struct lbs_private *priv,
|
||||
cmd.bss.beaconperiod = cpu_to_le16(params->beacon_interval);
|
||||
cmd.bss.ds.header.id = WLAN_EID_DS_PARAMS;
|
||||
cmd.bss.ds.header.len = 1;
|
||||
cmd.bss.ds.channel = params->channel->hw_value;
|
||||
cmd.bss.ds.channel = params->chandef.chan->hw_value;
|
||||
cmd.bss.ibss.header.id = WLAN_EID_IBSS_PARAMS;
|
||||
cmd.bss.ibss.header.len = 2;
|
||||
cmd.bss.ibss.atimwindow = 0;
|
||||
@@ -1942,7 +1942,7 @@ static int lbs_ibss_start_new(struct lbs_private *priv,
|
||||
cmd.ibss.atimwindow = 0;
|
||||
cmd.ds.header.id = WLAN_EID_DS_PARAMS;
|
||||
cmd.ds.header.len = 1;
|
||||
cmd.ds.channel = params->channel->hw_value;
|
||||
cmd.ds.channel = params->chandef.chan->hw_value;
|
||||
/* Only v8 and below support setting probe delay */
|
||||
if (MRVL_FW_MAJOR_REV(priv->fwrelease) <= 8)
|
||||
cmd.probedelay = cpu_to_le16(CMD_SCAN_PROBE_DELAY_TIME);
|
||||
@@ -1987,18 +1987,18 @@ static int lbs_join_ibss(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
lbs_deb_enter(LBS_DEB_CFG80211);
|
||||
|
||||
if (!params->channel) {
|
||||
if (!params->chandef.chan) {
|
||||
ret = -ENOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = lbs_set_channel(priv, params->channel->hw_value);
|
||||
ret = lbs_set_channel(priv, params->chandef.chan->hw_value);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* Search if someone is beaconing. This assumes that the
|
||||
* bss list is populated already */
|
||||
bss = cfg80211_get_bss(wiphy, params->channel, params->bssid,
|
||||
bss = cfg80211_get_bss(wiphy, params->chandef.chan, params->bssid,
|
||||
params->ssid, params->ssid_len,
|
||||
WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);
|
||||
|
||||
|
||||
@@ -681,7 +681,7 @@ static void mac80211_hwsim_tx_iter(void *_data, u8 *addr,
|
||||
return;
|
||||
|
||||
if (!hwsim_chans_compat(data->channel,
|
||||
rcu_dereference(vif->chanctx_conf)->channel))
|
||||
rcu_dereference(vif->chanctx_conf)->def.chan))
|
||||
return;
|
||||
|
||||
data->receive = true;
|
||||
@@ -832,7 +832,7 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
|
||||
} else {
|
||||
chanctx_conf = rcu_dereference(txi->control.vif->chanctx_conf);
|
||||
if (chanctx_conf)
|
||||
channel = chanctx_conf->channel;
|
||||
channel = chanctx_conf->def.chan;
|
||||
else
|
||||
channel = NULL;
|
||||
}
|
||||
@@ -977,7 +977,7 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
|
||||
return;
|
||||
|
||||
mac80211_hwsim_tx_frame(hw, skb,
|
||||
rcu_dereference(vif->chanctx_conf)->channel);
|
||||
rcu_dereference(vif->chanctx_conf)->def.chan);
|
||||
}
|
||||
|
||||
|
||||
@@ -1107,9 +1107,8 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_HT) {
|
||||
wiphy_debug(hw->wiphy, " HT: op_mode=0x%x, chantype=%s\n",
|
||||
info->ht_operation_mode,
|
||||
hwsim_chantypes[info->channel_type]);
|
||||
wiphy_debug(hw->wiphy, " HT: op_mode=0x%x\n",
|
||||
info->ht_operation_mode);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||
@@ -1368,7 +1367,6 @@ static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
|
||||
struct cfg80211_scan_request *req)
|
||||
{
|
||||
struct mac80211_hwsim_data *hwsim = hw->priv;
|
||||
int i;
|
||||
|
||||
mutex_lock(&hwsim->mutex);
|
||||
if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) {
|
||||
@@ -1381,11 +1379,6 @@ static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
|
||||
mutex_unlock(&hwsim->mutex);
|
||||
|
||||
wiphy_debug(hw->wiphy, "hwsim hw_scan request\n");
|
||||
for (i = 0; i < req->n_channels; i++)
|
||||
printk(KERN_DEBUG "hwsim hw_scan freq %d\n",
|
||||
req->channels[i]->center_freq);
|
||||
print_hex_dump(KERN_DEBUG, "scan IEs: ", DUMP_PREFIX_OFFSET,
|
||||
16, 1, req->ie, req->ie_len, 1);
|
||||
|
||||
ieee80211_queue_delayed_work(hwsim->hw, &hwsim->hw_scan, 0);
|
||||
|
||||
@@ -1455,7 +1448,6 @@ static void hw_roc_done(struct work_struct *work)
|
||||
static int mac80211_hwsim_roc(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
int duration)
|
||||
{
|
||||
struct mac80211_hwsim_data *hwsim = hw->priv;
|
||||
@@ -1498,16 +1490,20 @@ static int mac80211_hwsim_add_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
hwsim_set_chanctx_magic(ctx);
|
||||
wiphy_debug(hw->wiphy, "add channel context %d MHz/%d\n",
|
||||
ctx->channel->center_freq, ctx->channel_type);
|
||||
wiphy_debug(hw->wiphy,
|
||||
"add channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
|
||||
ctx->def.chan->center_freq, ctx->def.width,
|
||||
ctx->def.center_freq1, ctx->def.center_freq2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mac80211_hwsim_remove_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
wiphy_debug(hw->wiphy, "remove channel context %d MHz/%d\n",
|
||||
ctx->channel->center_freq, ctx->channel_type);
|
||||
wiphy_debug(hw->wiphy,
|
||||
"remove channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
|
||||
ctx->def.chan->center_freq, ctx->def.width,
|
||||
ctx->def.center_freq1, ctx->def.center_freq2);
|
||||
hwsim_check_chanctx_magic(ctx);
|
||||
hwsim_clear_chanctx_magic(ctx);
|
||||
}
|
||||
@@ -1517,8 +1513,10 @@ static void mac80211_hwsim_change_chanctx(struct ieee80211_hw *hw,
|
||||
u32 changed)
|
||||
{
|
||||
hwsim_check_chanctx_magic(ctx);
|
||||
wiphy_debug(hw->wiphy, "change channel context %#x (%d MHz/%d)\n",
|
||||
changed, ctx->channel->center_freq, ctx->channel_type);
|
||||
wiphy_debug(hw->wiphy,
|
||||
"change channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
|
||||
ctx->def.chan->center_freq, ctx->def.width,
|
||||
ctx->def.center_freq1, ctx->def.center_freq2);
|
||||
}
|
||||
|
||||
static int mac80211_hwsim_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
@@ -1640,7 +1638,7 @@ static void hwsim_send_ps_poll(void *dat, u8 *mac, struct ieee80211_vif *vif)
|
||||
|
||||
rcu_read_lock();
|
||||
mac80211_hwsim_tx_frame(data->hw, skb,
|
||||
rcu_dereference(vif->chanctx_conf)->channel);
|
||||
rcu_dereference(vif->chanctx_conf)->def.chan);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
@@ -1672,7 +1670,7 @@ static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
|
||||
|
||||
rcu_read_lock();
|
||||
mac80211_hwsim_tx_frame(data->hw, skb,
|
||||
rcu_dereference(vif->chanctx_conf)->channel);
|
||||
rcu_dereference(vif->chanctx_conf)->def.chan);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
@@ -2204,6 +2202,34 @@ static int __init init_mac80211_hwsim(void)
|
||||
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
|
||||
hw->wiphy->bands[band] = sband;
|
||||
|
||||
if (channels == 1)
|
||||
continue;
|
||||
|
||||
sband->vht_cap.vht_supported = true;
|
||||
sband->vht_cap.cap =
|
||||
IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
|
||||
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ |
|
||||
IEEE80211_VHT_CAP_RXLDPC |
|
||||
IEEE80211_VHT_CAP_SHORT_GI_80 |
|
||||
IEEE80211_VHT_CAP_SHORT_GI_160 |
|
||||
IEEE80211_VHT_CAP_TXSTBC |
|
||||
IEEE80211_VHT_CAP_RXSTBC_1 |
|
||||
IEEE80211_VHT_CAP_RXSTBC_2 |
|
||||
IEEE80211_VHT_CAP_RXSTBC_3 |
|
||||
IEEE80211_VHT_CAP_RXSTBC_4 |
|
||||
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT;
|
||||
sband->vht_cap.vht_mcs.rx_mcs_map =
|
||||
cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_8 << 0 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_8 << 2 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_8 << 6 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_8 << 8 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 |
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_8 << 14);
|
||||
sband->vht_cap.vht_mcs.tx_mcs_map =
|
||||
sband->vht_cap.vht_mcs.rx_mcs_map;
|
||||
}
|
||||
/* By default all radios are belonging to the first group */
|
||||
data->group = 1;
|
||||
|
||||
@@ -180,10 +180,8 @@ mwifiex_form_mgmt_frame(struct sk_buff *skb, const u8 *buf, size_t len)
|
||||
static int
|
||||
mwifiex_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan, bool offchan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
bool channel_type_valid, unsigned int wait,
|
||||
const u8 *buf, size_t len, bool no_cck,
|
||||
bool dont_wait_for_ack, u64 *cookie)
|
||||
unsigned int wait, const u8 *buf, size_t len,
|
||||
bool no_cck, bool dont_wait_for_ack, u64 *cookie)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
u16 pkt_len;
|
||||
@@ -253,7 +251,6 @@ static int
|
||||
mwifiex_cfg80211_remain_on_channel(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
unsigned int duration, u64 *cookie)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
@@ -271,15 +268,14 @@ mwifiex_cfg80211_remain_on_channel(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
ret = mwifiex_remain_on_chan_cfg(priv, HostCmd_ACT_GEN_SET, chan,
|
||||
&channel_type, duration);
|
||||
duration);
|
||||
|
||||
if (!ret) {
|
||||
*cookie = random32() | 1;
|
||||
priv->roc_cfg.cookie = *cookie;
|
||||
priv->roc_cfg.chan = *chan;
|
||||
priv->roc_cfg.chan_type = channel_type;
|
||||
|
||||
cfg80211_ready_on_channel(wdev, *cookie, chan, channel_type,
|
||||
cfg80211_ready_on_channel(wdev, *cookie, chan,
|
||||
duration, GFP_ATOMIC);
|
||||
|
||||
wiphy_dbg(wiphy, "info: ROC, cookie = 0x%llx\n", *cookie);
|
||||
@@ -302,13 +298,11 @@ mwifiex_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
|
||||
return -ENOENT;
|
||||
|
||||
ret = mwifiex_remain_on_chan_cfg(priv, HostCmd_ACT_GEN_REMOVE,
|
||||
&priv->roc_cfg.chan,
|
||||
&priv->roc_cfg.chan_type, 0);
|
||||
&priv->roc_cfg.chan, 0);
|
||||
|
||||
if (!ret) {
|
||||
cfg80211_remain_on_channel_expired(wdev, cookie,
|
||||
&priv->roc_cfg.chan,
|
||||
priv->roc_cfg.chan_type,
|
||||
GFP_ATOMIC);
|
||||
|
||||
memset(&priv->roc_cfg, 0, sizeof(struct mwifiex_roc_cfg));
|
||||
@@ -1297,21 +1291,23 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bss_cfg->channel =
|
||||
(u8)ieee80211_frequency_to_channel(params->channel->center_freq);
|
||||
bss_cfg->channel = ieee80211_frequency_to_channel(
|
||||
params->chandef.chan->center_freq);
|
||||
|
||||
/* Set appropriate bands */
|
||||
if (params->channel->band == IEEE80211_BAND_2GHZ) {
|
||||
if (params->chandef.chan->band == IEEE80211_BAND_2GHZ) {
|
||||
bss_cfg->band_cfg = BAND_CONFIG_BG;
|
||||
|
||||
if (params->channel_type == NL80211_CHAN_NO_HT)
|
||||
if (cfg80211_get_chandef_type(¶ms->chandef) ==
|
||||
NL80211_CHAN_NO_HT)
|
||||
config_bands = BAND_B | BAND_G;
|
||||
else
|
||||
config_bands = BAND_B | BAND_G | BAND_GN;
|
||||
} else {
|
||||
bss_cfg->band_cfg = BAND_CONFIG_A;
|
||||
|
||||
if (params->channel_type == NL80211_CHAN_NO_HT)
|
||||
if (cfg80211_get_chandef_type(¶ms->chandef) ==
|
||||
NL80211_CHAN_NO_HT)
|
||||
config_bands = BAND_A;
|
||||
else
|
||||
config_bands = BAND_AN | BAND_A;
|
||||
@@ -1684,7 +1680,7 @@ static int mwifiex_set_ibss_params(struct mwifiex_private *priv,
|
||||
int index = 0, i;
|
||||
u8 config_bands = 0;
|
||||
|
||||
if (params->channel->band == IEEE80211_BAND_2GHZ) {
|
||||
if (params->chandef.chan->band == IEEE80211_BAND_2GHZ) {
|
||||
if (!params->basic_rates) {
|
||||
config_bands = BAND_B | BAND_G;
|
||||
} else {
|
||||
@@ -1709,10 +1705,12 @@ static int mwifiex_set_ibss_params(struct mwifiex_private *priv,
|
||||
}
|
||||
}
|
||||
|
||||
if (params->channel_type != NL80211_CHAN_NO_HT)
|
||||
if (cfg80211_get_chandef_type(¶ms->chandef) !=
|
||||
NL80211_CHAN_NO_HT)
|
||||
config_bands |= BAND_GN;
|
||||
} else {
|
||||
if (params->channel_type == NL80211_CHAN_NO_HT)
|
||||
if (cfg80211_get_chandef_type(¶ms->chandef) !=
|
||||
NL80211_CHAN_NO_HT)
|
||||
config_bands = BAND_A;
|
||||
else
|
||||
config_bands = BAND_AN | BAND_A;
|
||||
@@ -1729,9 +1727,10 @@ static int mwifiex_set_ibss_params(struct mwifiex_private *priv,
|
||||
}
|
||||
|
||||
adapter->sec_chan_offset =
|
||||
mwifiex_chan_type_to_sec_chan_offset(params->channel_type);
|
||||
priv->adhoc_channel =
|
||||
ieee80211_frequency_to_channel(params->channel->center_freq);
|
||||
mwifiex_chan_type_to_sec_chan_offset(
|
||||
cfg80211_get_chandef_type(¶ms->chandef));
|
||||
priv->adhoc_channel = ieee80211_frequency_to_channel(
|
||||
params->chandef.chan->center_freq);
|
||||
|
||||
wiphy_dbg(wiphy, "info: set ibss band %d, chan %d, chan offset %d\n",
|
||||
config_bands, priv->adhoc_channel, adapter->sec_chan_offset);
|
||||
@@ -1765,7 +1764,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid,
|
||||
params->bssid, priv->bss_mode,
|
||||
params->channel, NULL, params->privacy);
|
||||
params->chandef.chan, NULL,
|
||||
params->privacy);
|
||||
done:
|
||||
if (!ret) {
|
||||
cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, GFP_KERNEL);
|
||||
|
||||
@@ -371,7 +371,6 @@ struct wps {
|
||||
struct mwifiex_roc_cfg {
|
||||
u64 cookie;
|
||||
struct ieee80211_channel chan;
|
||||
enum nl80211_channel_type chan_type;
|
||||
};
|
||||
|
||||
struct mwifiex_adapter;
|
||||
@@ -1018,7 +1017,6 @@ int mwifiex_get_ver_ext(struct mwifiex_private *priv);
|
||||
|
||||
int mwifiex_remain_on_chan_cfg(struct mwifiex_private *priv, u16 action,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type *channel_type,
|
||||
unsigned int duration);
|
||||
|
||||
int mwifiex_set_bss_role(struct mwifiex_private *priv, u8 bss_role);
|
||||
|
||||
@@ -421,7 +421,6 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
||||
cfg80211_remain_on_channel_expired(priv->wdev,
|
||||
priv->roc_cfg.cookie,
|
||||
&priv->roc_cfg.chan,
|
||||
priv->roc_cfg.chan_type,
|
||||
GFP_ATOMIC);
|
||||
|
||||
memset(&priv->roc_cfg, 0x00, sizeof(struct mwifiex_roc_cfg));
|
||||
|
||||
@@ -1044,7 +1044,6 @@ mwifiex_get_ver_ext(struct mwifiex_private *priv)
|
||||
int
|
||||
mwifiex_remain_on_chan_cfg(struct mwifiex_private *priv, u16 action,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type *ct,
|
||||
unsigned int duration)
|
||||
{
|
||||
struct host_cmd_ds_remain_on_chan roc_cfg;
|
||||
@@ -1054,7 +1053,7 @@ mwifiex_remain_on_chan_cfg(struct mwifiex_private *priv, u16 action,
|
||||
roc_cfg.action = cpu_to_le16(action);
|
||||
if (action == HostCmd_ACT_GEN_SET) {
|
||||
roc_cfg.band_cfg = chan->band;
|
||||
sc = mwifiex_chan_type_to_sec_chan_offset(*ct);
|
||||
sc = mwifiex_chan_type_to_sec_chan_offset(NL80211_CHAN_NO_HT);
|
||||
roc_cfg.band_cfg |= (sc << 2);
|
||||
|
||||
roc_cfg.channel =
|
||||
|
||||
@@ -161,24 +161,23 @@ static int orinoco_scan(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int orinoco_set_monitor_channel(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type)
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct orinoco_private *priv = wiphy_priv(wiphy);
|
||||
int err = 0;
|
||||
unsigned long flags;
|
||||
int channel;
|
||||
|
||||
if (!chan)
|
||||
if (!chandef->chan)
|
||||
return -EINVAL;
|
||||
|
||||
if (channel_type != NL80211_CHAN_NO_HT)
|
||||
if (cfg80211_get_chandef_type(chandef) != NL80211_CHAN_NO_HT)
|
||||
return -EINVAL;
|
||||
|
||||
if (chan->band != IEEE80211_BAND_2GHZ)
|
||||
if (chandef->chan->band != IEEE80211_BAND_2GHZ)
|
||||
return -EINVAL;
|
||||
|
||||
channel = ieee80211_freq_to_dsss_chan(chan->center_freq);
|
||||
channel = ieee80211_freq_to_dsss_chan(chandef->chan->center_freq);
|
||||
|
||||
if ((channel < 1) || (channel > NUM_CHANNELS) ||
|
||||
!(priv->channel_mask & (1 << (channel - 1))))
|
||||
|
||||
@@ -2293,7 +2293,7 @@ static int rndis_join_ibss(struct wiphy *wiphy, struct net_device *dev,
|
||||
{
|
||||
struct rndis_wlan_private *priv = wiphy_priv(wiphy);
|
||||
struct usbnet *usbdev = priv->usbdev;
|
||||
struct ieee80211_channel *channel = params->channel;
|
||||
struct ieee80211_channel *channel = params->chandef.chan;
|
||||
struct ndis_80211_ssid ssid;
|
||||
enum nl80211_auth_type auth_type;
|
||||
int ret, alg, length, chan = -1;
|
||||
|
||||
@@ -3791,7 +3791,7 @@ static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
|
||||
|
||||
/* Handle HT information change */
|
||||
if ((changed & BSS_CHANGED_HT) &&
|
||||
(bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
|
||||
(bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) {
|
||||
ret = wl1271_acx_set_ht_information(wl, wlvif,
|
||||
bss_conf->ht_operation_mode);
|
||||
if (ret < 0) {
|
||||
@@ -3905,7 +3905,8 @@ sta_not_found:
|
||||
u32 rates;
|
||||
int ieoffset;
|
||||
wlvif->aid = bss_conf->aid;
|
||||
wlvif->channel_type = bss_conf->channel_type;
|
||||
wlvif->channel_type =
|
||||
cfg80211_get_chandef_type(&bss_conf->chandef);
|
||||
wlvif->beacon_int = bss_conf->beacon_int;
|
||||
do_join = true;
|
||||
set_assoc = true;
|
||||
@@ -4071,7 +4072,7 @@ sta_not_found:
|
||||
/* Handle new association with HT. Do this after join. */
|
||||
if (sta_exists) {
|
||||
if ((changed & BSS_CHANGED_HT) &&
|
||||
(bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
|
||||
(bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) {
|
||||
ret = wl1271_acx_set_ht_capabilities(wl,
|
||||
&sta_ht_cap,
|
||||
true,
|
||||
@@ -4098,7 +4099,7 @@ sta_not_found:
|
||||
|
||||
/* Handle HT information change. Done after join. */
|
||||
if ((changed & BSS_CHANGED_HT) &&
|
||||
(bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
|
||||
(bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) {
|
||||
ret = wl1271_acx_set_ht_information(wl, wlvif,
|
||||
bss_conf->ht_operation_mode);
|
||||
if (ret < 0) {
|
||||
|
||||
@@ -667,6 +667,21 @@ struct ieee80211_meshconf_ie {
|
||||
u8 meshconf_cap;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* enum mesh_config_capab_flags - Mesh Configuration IE capability field flags
|
||||
*
|
||||
* @IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS: STA is willing to establish
|
||||
* additional mesh peerings with other mesh STAs
|
||||
* @IEEE80211_MESHCONF_CAPAB_FORWARDING: the STA forwards MSDUs
|
||||
* @IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING: TBTT adjustment procedure
|
||||
* is ongoing
|
||||
*/
|
||||
enum mesh_config_capab_flags {
|
||||
IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS = 0x01,
|
||||
IEEE80211_MESHCONF_CAPAB_FORWARDING = 0x08,
|
||||
IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING = 0x20,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_rann_ie
|
||||
*
|
||||
@@ -1148,11 +1163,13 @@ struct ieee80211_ht_operation {
|
||||
* STA can receive. Rate expressed in units of 1 Mbps.
|
||||
* If this field is 0 this value should not be used to
|
||||
* consider the highest RX data rate supported.
|
||||
* The top 3 bits of this field are reserved.
|
||||
* @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams
|
||||
* @tx_highest: Indicates highest long GI VHT PPDU data rate
|
||||
* STA can transmit. Rate expressed in units of 1 Mbps.
|
||||
* If this field is 0 this value should not be used to
|
||||
* consider the highest TX data rate supported.
|
||||
* The top 3 bits of this field are reserved.
|
||||
*/
|
||||
struct ieee80211_vht_mcs_info {
|
||||
__le16 rx_mcs_map;
|
||||
@@ -1161,6 +1178,27 @@ struct ieee80211_vht_mcs_info {
|
||||
__le16 tx_highest;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* enum ieee80211_vht_mcs_support - VHT MCS support definitions
|
||||
* @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
|
||||
* number of streams
|
||||
* @IEEE80211_VHT_MCS_SUPPORT_0_8: MCSes 0-8 are supported
|
||||
* @IEEE80211_VHT_MCS_SUPPORT_0_9: MCSes 0-9 are supported
|
||||
* @IEEE80211_VHT_MCS_NOT_SUPPORTED: This number of streams isn't supported
|
||||
*
|
||||
* These definitions are used in each 2-bit subfield of the @rx_mcs_map
|
||||
* and @tx_mcs_map fields of &struct ieee80211_vht_mcs_info, which are
|
||||
* both split into 8 subfields by number of streams. These values indicate
|
||||
* which MCSes are supported for the number of streams the value appears
|
||||
* for.
|
||||
*/
|
||||
enum ieee80211_vht_mcs_support {
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_7 = 0,
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_8 = 1,
|
||||
IEEE80211_VHT_MCS_SUPPORT_0_9 = 2,
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_vht_cap - VHT capabilities
|
||||
*
|
||||
|
||||
+122
-48
@@ -305,6 +305,88 @@ struct key_params {
|
||||
u32 cipher;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cfg80211_chan_def - channel definition
|
||||
* @chan: the (control) channel
|
||||
* @width: channel width
|
||||
* @center_freq1: center frequency of first segment
|
||||
* @center_freq2: center frequency of second segment
|
||||
* (only with 80+80 MHz)
|
||||
*/
|
||||
struct cfg80211_chan_def {
|
||||
struct ieee80211_channel *chan;
|
||||
enum nl80211_chan_width width;
|
||||
u32 center_freq1;
|
||||
u32 center_freq2;
|
||||
};
|
||||
|
||||
/**
|
||||
* cfg80211_get_chandef_type - return old channel type from chandef
|
||||
* @chandef: the channel definition
|
||||
*
|
||||
* Returns the old channel type (NOHT, HT20, HT40+/-) from a given
|
||||
* chandef, which must have a bandwidth allowing this conversion.
|
||||
*/
|
||||
static inline enum nl80211_channel_type
|
||||
cfg80211_get_chandef_type(const struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
switch (chandef->width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
return NL80211_CHAN_NO_HT;
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
return NL80211_CHAN_HT20;
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
if (chandef->center_freq1 > chandef->chan->center_freq)
|
||||
return NL80211_CHAN_HT40PLUS;
|
||||
return NL80211_CHAN_HT40MINUS;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return NL80211_CHAN_NO_HT;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* cfg80211_chandef_create - create channel definition using channel type
|
||||
* @chandef: the channel definition struct to fill
|
||||
* @channel: the control channel
|
||||
* @chantype: the channel type
|
||||
*
|
||||
* Given a channel type, create a channel definition.
|
||||
*/
|
||||
void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type chantype);
|
||||
|
||||
/**
|
||||
* cfg80211_chandef_identical - check if two channel definitions are identical
|
||||
* @chandef1: first channel definition
|
||||
* @chandef2: second channel definition
|
||||
*
|
||||
* Returns %true if the channels defined by the channel definitions are
|
||||
* identical, %false otherwise.
|
||||
*/
|
||||
static inline bool
|
||||
cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef1,
|
||||
const struct cfg80211_chan_def *chandef2)
|
||||
{
|
||||
return (chandef1->chan == chandef2->chan &&
|
||||
chandef1->width == chandef2->width &&
|
||||
chandef1->center_freq1 == chandef2->center_freq1 &&
|
||||
chandef1->center_freq2 == chandef2->center_freq2);
|
||||
}
|
||||
|
||||
/**
|
||||
* cfg80211_chandef_compatible - check if two channel definitions are compatible
|
||||
* @chandef1: first channel definition
|
||||
* @chandef2: second channel definition
|
||||
*
|
||||
* Returns %NULL if the given channel definitions are incompatible,
|
||||
* chandef1 or chandef2 otherwise.
|
||||
*/
|
||||
const struct cfg80211_chan_def *
|
||||
cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1,
|
||||
const struct cfg80211_chan_def *chandef2);
|
||||
|
||||
/**
|
||||
* enum survey_info_flags - survey information flags
|
||||
*
|
||||
@@ -426,8 +508,7 @@ struct cfg80211_beacon_data {
|
||||
*
|
||||
* Used to configure an AP interface.
|
||||
*
|
||||
* @channel: the channel to start the AP on
|
||||
* @channel_type: the channel type to use
|
||||
* @chandef: defines the channel to use
|
||||
* @beacon: beacon data
|
||||
* @beacon_interval: beacon interval
|
||||
* @dtim_period: DTIM period
|
||||
@@ -441,8 +522,7 @@ struct cfg80211_beacon_data {
|
||||
* @inactivity_timeout: time in seconds to determine station's inactivity.
|
||||
*/
|
||||
struct cfg80211_ap_settings {
|
||||
struct ieee80211_channel *channel;
|
||||
enum nl80211_channel_type channel_type;
|
||||
struct cfg80211_chan_def chandef;
|
||||
|
||||
struct cfg80211_beacon_data beacon;
|
||||
|
||||
@@ -582,16 +662,24 @@ enum station_info_flags {
|
||||
* Used by the driver to indicate the specific rate transmission
|
||||
* type for 802.11n transmissions.
|
||||
*
|
||||
* @RATE_INFO_FLAGS_MCS: @tx_bitrate_mcs filled
|
||||
* @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 Mhz width transmission
|
||||
* @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS
|
||||
* @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS
|
||||
* @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 MHz width transmission
|
||||
* @RATE_INFO_FLAGS_80_MHZ_WIDTH: 80 MHz width transmission
|
||||
* @RATE_INFO_FLAGS_80P80_MHZ_WIDTH: 80+80 MHz width transmission
|
||||
* @RATE_INFO_FLAGS_160_MHZ_WIDTH: 160 MHz width transmission
|
||||
* @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
|
||||
* @RATE_INFO_FLAGS_60G: 60gHz MCS
|
||||
* @RATE_INFO_FLAGS_60G: 60GHz MCS
|
||||
*/
|
||||
enum rate_info_flags {
|
||||
RATE_INFO_FLAGS_MCS = 1<<0,
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH = 1<<1,
|
||||
RATE_INFO_FLAGS_SHORT_GI = 1<<2,
|
||||
RATE_INFO_FLAGS_60G = 1<<3,
|
||||
RATE_INFO_FLAGS_MCS = BIT(0),
|
||||
RATE_INFO_FLAGS_VHT_MCS = BIT(1),
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH = BIT(2),
|
||||
RATE_INFO_FLAGS_80_MHZ_WIDTH = BIT(3),
|
||||
RATE_INFO_FLAGS_80P80_MHZ_WIDTH = BIT(4),
|
||||
RATE_INFO_FLAGS_160_MHZ_WIDTH = BIT(5),
|
||||
RATE_INFO_FLAGS_SHORT_GI = BIT(6),
|
||||
RATE_INFO_FLAGS_60G = BIT(7),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -602,11 +690,13 @@ enum rate_info_flags {
|
||||
* @flags: bitflag of flags from &enum rate_info_flags
|
||||
* @mcs: mcs index if struct describes a 802.11n bitrate
|
||||
* @legacy: bitrate in 100kbit/s for 802.11abg
|
||||
* @nss: number of streams (VHT only)
|
||||
*/
|
||||
struct rate_info {
|
||||
u8 flags;
|
||||
u8 mcs;
|
||||
u16 legacy;
|
||||
u8 nss;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -909,8 +999,7 @@ struct mesh_config {
|
||||
|
||||
/**
|
||||
* struct mesh_setup - 802.11s mesh setup configuration
|
||||
* @channel: the channel to start the mesh network on
|
||||
* @channel_type: the channel type to use
|
||||
* @chandef: defines the channel to use
|
||||
* @mesh_id: the mesh ID
|
||||
* @mesh_id_len: length of the mesh ID, at least 1 and at most 32 bytes
|
||||
* @sync_method: which synchronization method to use
|
||||
@@ -925,8 +1014,7 @@ struct mesh_config {
|
||||
* These parameters are fixed when the mesh is created.
|
||||
*/
|
||||
struct mesh_setup {
|
||||
struct ieee80211_channel *channel;
|
||||
enum nl80211_channel_type channel_type;
|
||||
struct cfg80211_chan_def chandef;
|
||||
const u8 *mesh_id;
|
||||
u8 mesh_id_len;
|
||||
u8 sync_method;
|
||||
@@ -1266,8 +1354,7 @@ struct cfg80211_disassoc_request {
|
||||
* @ssid_len: The length of the SSID, will always be non-zero.
|
||||
* @bssid: Fixed BSSID requested, maybe be %NULL, if set do not
|
||||
* search for IBSSs with a different BSSID.
|
||||
* @channel: The channel to use if no IBSS can be found to join.
|
||||
* @channel_type: channel type (HT mode)
|
||||
* @chandef: defines the channel to use if no other IBSS to join can be found
|
||||
* @channel_fixed: The channel should be fixed -- do not search for
|
||||
* IBSSs to join on other channels.
|
||||
* @ie: information element(s) to include in the beacon
|
||||
@@ -1285,8 +1372,7 @@ struct cfg80211_disassoc_request {
|
||||
struct cfg80211_ibss_params {
|
||||
u8 *ssid;
|
||||
u8 *bssid;
|
||||
struct ieee80211_channel *channel;
|
||||
enum nl80211_channel_type channel_type;
|
||||
struct cfg80211_chan_def chandef;
|
||||
u8 *ie;
|
||||
u8 ssid_len, ie_len;
|
||||
u16 beacon_interval;
|
||||
@@ -1728,8 +1814,7 @@ struct cfg80211_ops {
|
||||
struct ieee80211_channel *chan);
|
||||
|
||||
int (*set_monitor_channel)(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type);
|
||||
struct cfg80211_chan_def *chandef);
|
||||
|
||||
int (*scan)(struct wiphy *wiphy,
|
||||
struct cfg80211_scan_request *request);
|
||||
@@ -1791,7 +1876,6 @@ struct cfg80211_ops {
|
||||
int (*remain_on_channel)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
unsigned int duration,
|
||||
u64 *cookie);
|
||||
int (*cancel_remain_on_channel)(struct wiphy *wiphy,
|
||||
@@ -1800,10 +1884,8 @@ struct cfg80211_ops {
|
||||
|
||||
int (*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan, bool offchan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
bool channel_type_valid, unsigned int wait,
|
||||
const u8 *buf, size_t len, bool no_cck,
|
||||
bool dont_wait_for_ack, u64 *cookie);
|
||||
unsigned int wait, const u8 *buf, size_t len,
|
||||
bool no_cck, bool dont_wait_for_ack, u64 *cookie);
|
||||
int (*mgmt_tx_cancel_wait)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
u64 cookie);
|
||||
@@ -1858,10 +1940,9 @@ struct cfg80211_ops {
|
||||
void (*get_et_strings)(struct wiphy *wiphy, struct net_device *dev,
|
||||
u32 sset, u8 *data);
|
||||
|
||||
struct ieee80211_channel *
|
||||
(*get_channel)(struct wiphy *wiphy,
|
||||
int (*get_channel)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
enum nl80211_channel_type *type);
|
||||
struct cfg80211_chan_def *chandef);
|
||||
|
||||
int (*start_p2p_device)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev);
|
||||
@@ -2469,8 +2550,7 @@ struct wireless_dev {
|
||||
spinlock_t event_lock;
|
||||
|
||||
struct cfg80211_internal_bss *current_bss; /* associated / joined */
|
||||
struct ieee80211_channel *preset_chan;
|
||||
enum nl80211_channel_type preset_chantype;
|
||||
struct cfg80211_chan_def preset_chandef;
|
||||
|
||||
/* for AP and mesh channel tracking */
|
||||
struct ieee80211_channel *channel;
|
||||
@@ -3350,14 +3430,12 @@ void cfg80211_disconnected(struct net_device *dev, u16 reason,
|
||||
* @wdev: wireless device
|
||||
* @cookie: the request cookie
|
||||
* @chan: The current channel (from remain_on_channel request)
|
||||
* @channel_type: Channel type
|
||||
* @duration: Duration in milliseconds that the driver intents to remain on the
|
||||
* channel
|
||||
* @gfp: allocation flags
|
||||
*/
|
||||
void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
unsigned int duration, gfp_t gfp);
|
||||
|
||||
/**
|
||||
@@ -3365,12 +3443,10 @@ void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
|
||||
* @wdev: wireless device
|
||||
* @cookie: the request cookie
|
||||
* @chan: The current channel (from remain_on_channel request)
|
||||
* @channel_type: Channel type
|
||||
* @gfp: allocation flags
|
||||
*/
|
||||
void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
gfp_t gfp);
|
||||
|
||||
|
||||
@@ -3570,28 +3646,25 @@ void cfg80211_report_obss_beacon(struct wiphy *wiphy,
|
||||
int freq, int sig_dbm);
|
||||
|
||||
/**
|
||||
* cfg80211_can_beacon_sec_chan - test if ht40 on extension channel can be used
|
||||
* cfg80211_reg_can_beacon - check if beaconing is allowed
|
||||
* @wiphy: the wiphy
|
||||
* @chan: main channel
|
||||
* @channel_type: HT mode
|
||||
* @chandef: the channel definition
|
||||
*
|
||||
* This function returns true if there is no secondary channel or the secondary
|
||||
* channel can be used for beaconing (i.e. is not a radar channel etc.)
|
||||
* channel(s) can be used for beaconing (i.e. is not a radar channel etc.)
|
||||
*/
|
||||
bool cfg80211_can_beacon_sec_chan(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type);
|
||||
bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
|
||||
/*
|
||||
* cfg80211_ch_switch_notify - update wdev channel and notify userspace
|
||||
* @dev: the device which switched channels
|
||||
* @freq: new channel frequency (in MHz)
|
||||
* @type: channel type
|
||||
* @chandef: the new channel definition
|
||||
*
|
||||
* Acquires wdev_lock, so must only be called from sleepable driver context!
|
||||
*/
|
||||
void cfg80211_ch_switch_notify(struct net_device *dev, int freq,
|
||||
enum nl80211_channel_type type);
|
||||
void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
|
||||
/*
|
||||
* cfg80211_tdls_oper_request - request userspace to perform TDLS operation
|
||||
@@ -3652,8 +3725,9 @@ void cfg80211_unregister_wdev(struct wireless_dev *wdev);
|
||||
* the data is malformed or the attribute can't be found (respectively),
|
||||
* or the length of the found attribute (which can be zero).
|
||||
*/
|
||||
unsigned int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,
|
||||
u8 attr, u8 *buf, unsigned int bufsize);
|
||||
int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,
|
||||
enum ieee80211_p2p_attr_id attr,
|
||||
u8 *buf, unsigned int bufsize);
|
||||
|
||||
/* Logging, debugging and troubleshooting/diagnostic helpers. */
|
||||
|
||||
|
||||
+51
-15
@@ -145,11 +145,11 @@ struct ieee80211_low_level_stats {
|
||||
|
||||
/**
|
||||
* enum ieee80211_chanctx_change - change flag for channel context
|
||||
* @IEEE80211_CHANCTX_CHANGE_CHANNEL_TYPE: The channel type was changed
|
||||
* @IEEE80211_CHANCTX_CHANGE_WIDTH: The channel width changed
|
||||
* @IEEE80211_CHANCTX_CHANGE_RX_CHAINS: The number of RX chains changed
|
||||
*/
|
||||
enum ieee80211_chanctx_change {
|
||||
IEEE80211_CHANCTX_CHANGE_CHANNEL_TYPE = BIT(0),
|
||||
IEEE80211_CHANCTX_CHANGE_WIDTH = BIT(0),
|
||||
IEEE80211_CHANCTX_CHANGE_RX_CHAINS = BIT(1),
|
||||
};
|
||||
|
||||
@@ -159,8 +159,7 @@ enum ieee80211_chanctx_change {
|
||||
* This is the driver-visible part. The ieee80211_chanctx
|
||||
* that contains it is visible in mac80211 only.
|
||||
*
|
||||
* @channel: the channel to tune to
|
||||
* @channel_type: the channel (HT) type
|
||||
* @def: the channel definition
|
||||
* @rx_chains_static: The number of RX chains that must always be
|
||||
* active on the channel to receive MIMO transmissions
|
||||
* @rx_chains_dynamic: The number of RX chains that must be enabled
|
||||
@@ -170,8 +169,7 @@ enum ieee80211_chanctx_change {
|
||||
* sizeof(void *), size is determined in hw information.
|
||||
*/
|
||||
struct ieee80211_chanctx_conf {
|
||||
struct ieee80211_channel *channel;
|
||||
enum nl80211_channel_type channel_type;
|
||||
struct cfg80211_chan_def def;
|
||||
|
||||
u8 rx_chains_static, rx_chains_dynamic;
|
||||
|
||||
@@ -288,9 +286,8 @@ enum ieee80211_rssi_event {
|
||||
* @mcast_rate: per-band multicast rate index + 1 (0: disabled)
|
||||
* @bssid: The BSSID for this BSS
|
||||
* @enable_beacon: whether beaconing should be enabled or not
|
||||
* @channel_type: Channel type for this BSS -- the hardware might be
|
||||
* configured for HT40+ while this BSS only uses no-HT, for
|
||||
* example.
|
||||
* @chandef: Channel definition for this BSS -- the hardware might be
|
||||
* configured a higher bandwidth than this BSS uses, for example.
|
||||
* @ht_operation_mode: HT operation mode like in &struct ieee80211_ht_operation.
|
||||
* This field is only valid when the channel type is one of the HT types.
|
||||
* @cqm_rssi_thold: Connection quality monitor RSSI threshold, a zero value
|
||||
@@ -339,7 +336,7 @@ struct ieee80211_bss_conf {
|
||||
u16 ht_operation_mode;
|
||||
s32 cqm_rssi_thold;
|
||||
u32 cqm_rssi_hyst;
|
||||
enum nl80211_channel_type channel_type;
|
||||
struct cfg80211_chan_def chandef;
|
||||
__be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN];
|
||||
u8 arp_addr_cnt;
|
||||
bool arp_filter_enabled;
|
||||
@@ -502,9 +499,14 @@ enum mac80211_tx_control_flags {
|
||||
* This is set if the current BSS requires ERP protection.
|
||||
* @IEEE80211_TX_RC_USE_SHORT_PREAMBLE: Use short preamble.
|
||||
* @IEEE80211_TX_RC_MCS: HT rate.
|
||||
* @IEEE80211_TX_RC_VHT_MCS: VHT MCS rate, in this case the idx field is split
|
||||
* into a higher 4 bits (Nss) and lower 4 bits (MCS number)
|
||||
* @IEEE80211_TX_RC_GREEN_FIELD: Indicates whether this rate should be used in
|
||||
* Greenfield mode.
|
||||
* @IEEE80211_TX_RC_40_MHZ_WIDTH: Indicates if the Channel Width should be 40 MHz.
|
||||
* @IEEE80211_TX_RC_80_MHZ_WIDTH: Indicates 80 MHz transmission
|
||||
* @IEEE80211_TX_RC_160_MHZ_WIDTH: Indicates 160 MHz transmission
|
||||
* (80+80 isn't supported yet)
|
||||
* @IEEE80211_TX_RC_DUP_DATA: The frame should be transmitted on both of the
|
||||
* adjacent 20 MHz channels, if the current channel type is
|
||||
* NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS.
|
||||
@@ -515,12 +517,15 @@ enum mac80211_rate_control_flags {
|
||||
IEEE80211_TX_RC_USE_CTS_PROTECT = BIT(1),
|
||||
IEEE80211_TX_RC_USE_SHORT_PREAMBLE = BIT(2),
|
||||
|
||||
/* rate index is an MCS rate number instead of an index */
|
||||
/* rate index is an HT/VHT MCS instead of an index */
|
||||
IEEE80211_TX_RC_MCS = BIT(3),
|
||||
IEEE80211_TX_RC_GREEN_FIELD = BIT(4),
|
||||
IEEE80211_TX_RC_40_MHZ_WIDTH = BIT(5),
|
||||
IEEE80211_TX_RC_DUP_DATA = BIT(6),
|
||||
IEEE80211_TX_RC_SHORT_GI = BIT(7),
|
||||
IEEE80211_TX_RC_VHT_MCS = BIT(8),
|
||||
IEEE80211_TX_RC_80_MHZ_WIDTH = BIT(9),
|
||||
IEEE80211_TX_RC_160_MHZ_WIDTH = BIT(10),
|
||||
};
|
||||
|
||||
|
||||
@@ -563,10 +568,32 @@ enum mac80211_rate_control_flags {
|
||||
*/
|
||||
struct ieee80211_tx_rate {
|
||||
s8 idx;
|
||||
u8 count;
|
||||
u8 flags;
|
||||
u16 count:5,
|
||||
flags:11;
|
||||
} __packed;
|
||||
|
||||
#define IEEE80211_MAX_TX_RETRY 31
|
||||
|
||||
static inline void ieee80211_rate_set_vht(struct ieee80211_tx_rate *rate,
|
||||
u8 mcs, u8 nss)
|
||||
{
|
||||
WARN_ON(mcs & ~0xF);
|
||||
WARN_ON(nss & ~0x7);
|
||||
rate->idx = (nss << 4) | mcs;
|
||||
}
|
||||
|
||||
static inline u8
|
||||
ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate *rate)
|
||||
{
|
||||
return rate->idx & 0xF;
|
||||
}
|
||||
|
||||
static inline u8
|
||||
ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate)
|
||||
{
|
||||
return rate->idx >> 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct ieee80211_tx_info - skb transmit information
|
||||
*
|
||||
@@ -720,7 +747,11 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
|
||||
* (including FCS) was received.
|
||||
* @RX_FLAG_SHORTPRE: Short preamble was used for this frame
|
||||
* @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
|
||||
* @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index
|
||||
* @RX_FLAG_40MHZ: HT40 (40 MHz) was used
|
||||
* @RX_FLAG_80MHZ: 80 MHz was used
|
||||
* @RX_FLAG_80P80MHZ: 80+80 MHz was used
|
||||
* @RX_FLAG_160MHZ: 160 MHz was used
|
||||
* @RX_FLAG_SHORT_GI: Short guard interval was used
|
||||
* @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present.
|
||||
* Valid only for data frames (mainly A-MPDU)
|
||||
@@ -763,6 +794,10 @@ enum mac80211_rx_flags {
|
||||
RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(19),
|
||||
RX_FLAG_AMPDU_DELIM_CRC_KNOWN = BIT(20),
|
||||
RX_FLAG_MACTIME_END = BIT(21),
|
||||
RX_FLAG_VHT = BIT(22),
|
||||
RX_FLAG_80MHZ = BIT(23),
|
||||
RX_FLAG_80P80MHZ = BIT(24),
|
||||
RX_FLAG_160MHZ = BIT(25),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -783,7 +818,8 @@ enum mac80211_rx_flags {
|
||||
* @IEEE80211_HW_SIGNAL_*
|
||||
* @antenna: antenna used
|
||||
* @rate_idx: index of data rate into band's supported rates or MCS index if
|
||||
* HT rates are use (RX_FLAG_HT)
|
||||
* HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
|
||||
* @vht_nss: number of streams (VHT only)
|
||||
* @flag: %RX_FLAG_*
|
||||
* @rx_flags: internal RX flags for mac80211
|
||||
* @ampdu_reference: A-MPDU reference number, must be a different value for
|
||||
@@ -806,6 +842,7 @@ struct ieee80211_rx_status {
|
||||
u16 vendor_radiotap_len;
|
||||
u16 freq;
|
||||
u8 rate_idx;
|
||||
u8 vht_nss;
|
||||
u8 rx_flags;
|
||||
u8 band;
|
||||
u8 antenna;
|
||||
@@ -2550,7 +2587,6 @@ struct ieee80211_ops {
|
||||
int (*remain_on_channel)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
int duration);
|
||||
int (*cancel_remain_on_channel)(struct ieee80211_hw *hw);
|
||||
int (*set_ringparam)(struct ieee80211_hw *hw, u32 tx, u32 rx);
|
||||
|
||||
@@ -118,8 +118,9 @@
|
||||
* to get a list of all present wiphys.
|
||||
* @NL80211_CMD_SET_WIPHY: set wiphy parameters, needs %NL80211_ATTR_WIPHY or
|
||||
* %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME,
|
||||
* %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ,
|
||||
* %NL80211_ATTR_WIPHY_CHANNEL_TYPE, %NL80211_ATTR_WIPHY_RETRY_SHORT,
|
||||
* %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the
|
||||
* attributes determining the channel width; this is used for setting
|
||||
* monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT,
|
||||
* %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
|
||||
* and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD.
|
||||
* However, for setting the channel, see %NL80211_CMD_SET_CHANNEL
|
||||
@@ -171,7 +172,7 @@
|
||||
* %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY,
|
||||
* %NL80211_ATTR_AUTH_TYPE and %NL80211_ATTR_INACTIVITY_TIMEOUT.
|
||||
* The channel to use can be set on the interface or be given using the
|
||||
* %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_WIPHY_CHANNEL_TYPE attrs.
|
||||
* %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width.
|
||||
* @NL80211_CMD_NEW_BEACON: old alias for %NL80211_CMD_START_AP
|
||||
* @NL80211_CMD_STOP_AP: Stop AP operation on the given interface
|
||||
* @NL80211_CMD_DEL_BEACON: old alias for %NL80211_CMD_STOP_AP
|
||||
@@ -401,8 +402,7 @@
|
||||
* a response while being associated to an AP on another channel.
|
||||
* %NL80211_ATTR_IFINDEX is used to specify which interface (and thus
|
||||
* radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the
|
||||
* frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be
|
||||
* optionally used to specify additional channel parameters.
|
||||
* frequency for the operation.
|
||||
* %NL80211_ATTR_DURATION is used to specify the duration in milliseconds
|
||||
* to remain on the channel. This command is also used as an event to
|
||||
* notify when the requested duration starts (it may take a while for the
|
||||
@@ -440,12 +440,11 @@
|
||||
* as an event indicating reception of a frame that was not processed in
|
||||
* kernel code, but is for us (i.e., which may need to be processed in a
|
||||
* user space application). %NL80211_ATTR_FRAME is used to specify the
|
||||
* frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and
|
||||
* optionally %NL80211_ATTR_WIPHY_CHANNEL_TYPE) is used to indicate on
|
||||
* which channel the frame is to be transmitted or was received. If this
|
||||
* channel is not the current channel (remain-on-channel or the
|
||||
* operational channel) the device will switch to the given channel and
|
||||
* transmit the frame, optionally waiting for a response for the time
|
||||
* frame contents (including header). %NL80211_ATTR_WIPHY_FREQ is used
|
||||
* to indicate on which channel the frame is to be transmitted or was
|
||||
* received. If this channel is not the current channel (remain-on-channel
|
||||
* or the operational channel) the device will switch to the given channel
|
||||
* and transmit the frame, optionally waiting for a response for the time
|
||||
* specified using %NL80211_ATTR_DURATION. When called, this operation
|
||||
* returns a cookie (%NL80211_ATTR_COOKIE) that will be included with the
|
||||
* TX status event pertaining to the TX request.
|
||||
@@ -473,8 +472,8 @@
|
||||
* command is used as an event to indicate the that a trigger level was
|
||||
* reached.
|
||||
* @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ
|
||||
* and %NL80211_ATTR_WIPHY_CHANNEL_TYPE) the given interface (identifed
|
||||
* by %NL80211_ATTR_IFINDEX) shall operate on.
|
||||
* and the attributes determining channel width) the given interface
|
||||
* (identifed by %NL80211_ATTR_IFINDEX) shall operate on.
|
||||
* In case multiple channels are supported by the device, the mechanism
|
||||
* with which it switches channels is implementation-defined.
|
||||
* When a monitor interface is given, it can only switch channel while
|
||||
@@ -568,8 +567,8 @@
|
||||
*
|
||||
* @NL80211_CMD_CH_SWITCH_NOTIFY: An AP or GO may decide to switch channels
|
||||
* independently of the userspace SME, send this event indicating
|
||||
* %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ with
|
||||
* %NL80211_ATTR_WIPHY_CHANNEL_TYPE.
|
||||
* %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the
|
||||
* attributes determining channel width.
|
||||
*
|
||||
* @NL80211_CMD_START_P2P_DEVICE: Start the given P2P Device, identified by
|
||||
* its %NL80211_ATTR_WDEV identifier. It must have been created with
|
||||
@@ -773,14 +772,26 @@ enum nl80211_commands {
|
||||
* /sys/class/ieee80211/<phyname>/index
|
||||
* @NL80211_ATTR_WIPHY_NAME: wiphy name (used for renaming)
|
||||
* @NL80211_ATTR_WIPHY_TXQ_PARAMS: a nested array of TX queue parameters
|
||||
* @NL80211_ATTR_WIPHY_FREQ: frequency of the selected channel in MHz
|
||||
* @NL80211_ATTR_WIPHY_FREQ: frequency of the selected channel in MHz,
|
||||
* defines the channel together with the (deprecated)
|
||||
* %NL80211_ATTR_WIPHY_CHANNEL_TYPE attribute or the attributes
|
||||
* %NL80211_ATTR_CHANNEL_WIDTH and if needed %NL80211_ATTR_CENTER_FREQ1
|
||||
* and %NL80211_ATTR_CENTER_FREQ2
|
||||
* @NL80211_ATTR_CHANNEL_WIDTH: u32 attribute containing one of the values
|
||||
* of &enum nl80211_chan_width, describing the channel width. See the
|
||||
* documentation of the enum for more information.
|
||||
* @NL80211_ATTR_CENTER_FREQ1: Center frequency of the first part of the
|
||||
* channel, used for anything but 20 MHz bandwidth
|
||||
* @NL80211_ATTR_CENTER_FREQ2: Center frequency of the second part of the
|
||||
* channel, used only for 80+80 MHz bandwidth
|
||||
* @NL80211_ATTR_WIPHY_CHANNEL_TYPE: included with NL80211_ATTR_WIPHY_FREQ
|
||||
* if HT20 or HT40 are allowed (i.e., 802.11n disabled if not included):
|
||||
* if HT20 or HT40 are to be used (i.e., HT disabled if not included):
|
||||
* NL80211_CHAN_NO_HT = HT not allowed (i.e., same as not including
|
||||
* this attribute)
|
||||
* NL80211_CHAN_HT20 = HT20 only
|
||||
* NL80211_CHAN_HT40MINUS = secondary channel is below the primary channel
|
||||
* NL80211_CHAN_HT40PLUS = secondary channel is above the primary channel
|
||||
* This attribute is now deprecated.
|
||||
* @NL80211_ATTR_WIPHY_RETRY_SHORT: TX retry limit for frames whose length is
|
||||
* less than or equal to the RTS threshold; allowed range: 1..255;
|
||||
* dot11ShortRetryLimit; u8
|
||||
@@ -1555,6 +1566,10 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_SCAN_FLAGS,
|
||||
|
||||
NL80211_ATTR_CHANNEL_WIDTH,
|
||||
NL80211_ATTR_CENTER_FREQ1,
|
||||
NL80211_ATTR_CENTER_FREQ2,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -1719,10 +1734,15 @@ struct nl80211_sta_flag_update {
|
||||
* @__NL80211_RATE_INFO_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_RATE_INFO_BITRATE: total bitrate (u16, 100kbit/s)
|
||||
* @NL80211_RATE_INFO_MCS: mcs index for 802.11n (u8)
|
||||
* @NL80211_RATE_INFO_40_MHZ_WIDTH: 40 Mhz dualchannel bitrate
|
||||
* @NL80211_RATE_INFO_40_MHZ_WIDTH: 40 MHz dualchannel bitrate
|
||||
* @NL80211_RATE_INFO_SHORT_GI: 400ns guard interval
|
||||
* @NL80211_RATE_INFO_BITRATE32: total bitrate (u32, 100kbit/s)
|
||||
* @NL80211_RATE_INFO_MAX: highest rate_info number currently defined
|
||||
* @NL80211_RATE_INFO_VHT_MCS: MCS index for VHT (u8)
|
||||
* @NL80211_RATE_INFO_VHT_NSS: number of streams in VHT (u8)
|
||||
* @NL80211_RATE_INFO_80_MHZ_WIDTH: 80 MHz VHT rate
|
||||
* @NL80211_RATE_INFO_80P80_MHZ_WIDTH: 80+80 MHz VHT rate
|
||||
* @NL80211_RATE_INFO_160_MHZ_WIDTH: 160 MHz VHT rate
|
||||
* @__NL80211_RATE_INFO_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_rate_info {
|
||||
@@ -1732,6 +1752,11 @@ enum nl80211_rate_info {
|
||||
NL80211_RATE_INFO_40_MHZ_WIDTH,
|
||||
NL80211_RATE_INFO_SHORT_GI,
|
||||
NL80211_RATE_INFO_BITRATE32,
|
||||
NL80211_RATE_INFO_VHT_MCS,
|
||||
NL80211_RATE_INFO_VHT_NSS,
|
||||
NL80211_RATE_INFO_80_MHZ_WIDTH,
|
||||
NL80211_RATE_INFO_80P80_MHZ_WIDTH,
|
||||
NL80211_RATE_INFO_160_MHZ_WIDTH,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_RATE_INFO_AFTER_LAST,
|
||||
@@ -2440,6 +2465,15 @@ enum nl80211_ac {
|
||||
#define NL80211_TXQ_Q_BE NL80211_AC_BE
|
||||
#define NL80211_TXQ_Q_BK NL80211_AC_BK
|
||||
|
||||
/**
|
||||
* enum nl80211_channel_type - channel type
|
||||
* @NL80211_CHAN_NO_HT: 20 MHz, non-HT channel
|
||||
* @NL80211_CHAN_HT20: 20 MHz HT channel
|
||||
* @NL80211_CHAN_HT40MINUS: HT40 channel, secondary channel
|
||||
* below the control channel
|
||||
* @NL80211_CHAN_HT40PLUS: HT40 channel, secondary channel
|
||||
* above the control channel
|
||||
*/
|
||||
enum nl80211_channel_type {
|
||||
NL80211_CHAN_NO_HT,
|
||||
NL80211_CHAN_HT20,
|
||||
@@ -2447,6 +2481,32 @@ enum nl80211_channel_type {
|
||||
NL80211_CHAN_HT40PLUS
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_chan_width - channel width definitions
|
||||
*
|
||||
* These values are used with the %NL80211_ATTR_CHANNEL_WIDTH
|
||||
* attribute.
|
||||
*
|
||||
* @NL80211_CHAN_WIDTH_20_NOHT: 20 MHz, non-HT channel
|
||||
* @NL80211_CHAN_WIDTH_20: 20 MHz HT channel
|
||||
* @NL80211_CHAN_WIDTH_40: 40 MHz channel, the %NL80211_ATTR_CENTER_FREQ1
|
||||
* attribute must be provided as well
|
||||
* @NL80211_CHAN_WIDTH_80: 80 MHz channel, the %NL80211_ATTR_CENTER_FREQ1
|
||||
* attribute must be provided as well
|
||||
* @NL80211_CHAN_WIDTH_80P80: 80+80 MHz channel, the %NL80211_ATTR_CENTER_FREQ1
|
||||
* and %NL80211_ATTR_CENTER_FREQ2 attributes must be provided as well
|
||||
* @NL80211_CHAN_WIDTH_160: 160 MHz channel, the %NL80211_ATTR_CENTER_FREQ1
|
||||
* attribute must be provided as well
|
||||
*/
|
||||
enum nl80211_chan_width {
|
||||
NL80211_CHAN_WIDTH_20_NOHT,
|
||||
NL80211_CHAN_WIDTH_20,
|
||||
NL80211_CHAN_WIDTH_40,
|
||||
NL80211_CHAN_WIDTH_80,
|
||||
NL80211_CHAN_WIDTH_80P80,
|
||||
NL80211_CHAN_WIDTH_160,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_bss - netlink attributes for a BSS
|
||||
*
|
||||
|
||||
+73
-64
@@ -370,30 +370,32 @@ static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rate_idx_to_bitrate(struct rate_info *rate, struct sta_info *sta, int idx)
|
||||
{
|
||||
enum ieee80211_band band = ieee80211_get_sdata_band(sta->sdata);
|
||||
|
||||
if (!(rate->flags & RATE_INFO_FLAGS_MCS)) {
|
||||
struct ieee80211_supported_band *sband;
|
||||
sband = sta->local->hw.wiphy->bands[band];
|
||||
rate->legacy = sband->bitrates[idx].bitrate;
|
||||
} else
|
||||
rate->mcs = idx;
|
||||
}
|
||||
|
||||
void sta_set_rate_info_tx(struct sta_info *sta,
|
||||
const struct ieee80211_tx_rate *rate,
|
||||
struct rate_info *rinfo)
|
||||
{
|
||||
rinfo->flags = 0;
|
||||
if (rate->flags & IEEE80211_TX_RC_MCS)
|
||||
if (rate->flags & IEEE80211_TX_RC_MCS) {
|
||||
rinfo->flags |= RATE_INFO_FLAGS_MCS;
|
||||
rinfo->mcs = rate->idx;
|
||||
} else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
rinfo->mcs = ieee80211_rate_get_vht_mcs(rate);
|
||||
rinfo->nss = ieee80211_rate_get_vht_nss(rate);
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
sband = sta->local->hw.wiphy->bands[
|
||||
ieee80211_get_sdata_band(sta->sdata)];
|
||||
rinfo->legacy = sband->bitrates[rate->idx].bitrate;
|
||||
}
|
||||
if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
rate_idx_to_bitrate(rinfo, sta, rate->idx);
|
||||
}
|
||||
|
||||
static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
@@ -444,13 +446,32 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate);
|
||||
|
||||
sinfo->rxrate.flags = 0;
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_HT)
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_HT) {
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_MCS;
|
||||
sinfo->rxrate.mcs = sta->last_rx_rate_idx;
|
||||
} else if (sta->last_rx_rate_flag & RX_FLAG_VHT) {
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
sinfo->rxrate.nss = sta->last_rx_rate_vht_nss;
|
||||
sinfo->rxrate.mcs = sta->last_rx_rate_idx;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
sband = sta->local->hw.wiphy->bands[
|
||||
ieee80211_get_sdata_band(sta->sdata)];
|
||||
sinfo->rxrate.legacy =
|
||||
sband->bitrates[sta->last_rx_rate_idx].bitrate;
|
||||
}
|
||||
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_40MHZ)
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI)
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
rate_idx_to_bitrate(&sinfo->rxrate, sta, sta->last_rx_rate_idx);
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_80MHZ)
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_80P80MHZ)
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_80P80_MHZ_WIDTH;
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_160MHZ)
|
||||
sinfo->rxrate.flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
@@ -615,7 +636,7 @@ do_survey:
|
||||
rcu_read_lock();
|
||||
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||
if (chanctx_conf)
|
||||
channel = chanctx_conf->channel;
|
||||
channel = chanctx_conf->def.chan;
|
||||
else
|
||||
channel = NULL;
|
||||
rcu_read_unlock();
|
||||
@@ -735,15 +756,13 @@ static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type)
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
int ret = 0;
|
||||
|
||||
if (local->monitor_channel == chan &&
|
||||
local->monitor_channel_type == channel_type)
|
||||
if (cfg80211_chandef_identical(&local->monitor_chandef, chandef))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
@@ -753,20 +772,17 @@ static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
|
||||
lockdep_is_held(&local->iflist_mtx));
|
||||
if (sdata) {
|
||||
ieee80211_vif_release_channel(sdata);
|
||||
ret = ieee80211_vif_use_channel(
|
||||
sdata, chan, channel_type,
|
||||
ret = ieee80211_vif_use_channel(sdata, chandef,
|
||||
IEEE80211_CHANCTX_EXCLUSIVE);
|
||||
}
|
||||
} else if (local->open_count == local->monitors) {
|
||||
local->_oper_channel = chan;
|
||||
local->_oper_channel_type = channel_type;
|
||||
local->_oper_channel = chandef->chan;
|
||||
local->_oper_channel_type = cfg80211_get_chandef_type(chandef);
|
||||
ieee80211_hw_config(local, 0);
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
local->monitor_channel = chan;
|
||||
local->monitor_channel_type = channel_type;
|
||||
}
|
||||
if (ret == 0)
|
||||
local->monitor_chandef = *chandef;
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
return ret;
|
||||
@@ -888,8 +904,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
sdata->smps_mode = IEEE80211_SMPS_OFF;
|
||||
sdata->needed_rx_chains = sdata->local->rx_chains;
|
||||
|
||||
err = ieee80211_vif_use_channel(sdata, params->channel,
|
||||
params->channel_type,
|
||||
err = ieee80211_vif_use_channel(sdata, ¶ms->chandef,
|
||||
IEEE80211_CHANCTX_SHARED);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -1707,8 +1722,7 @@ static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev,
|
||||
sdata->smps_mode = IEEE80211_SMPS_OFF;
|
||||
sdata->needed_rx_chains = sdata->local->rx_chains;
|
||||
|
||||
err = ieee80211_vif_use_channel(sdata, setup->channel,
|
||||
setup->channel_type,
|
||||
err = ieee80211_vif_use_channel(sdata, &setup->chandef,
|
||||
IEEE80211_CHANCTX_SHARED);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -1990,10 +2004,16 @@ static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (changed & WIPHY_PARAM_RETRY_SHORT)
|
||||
if (changed & WIPHY_PARAM_RETRY_SHORT) {
|
||||
if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY)
|
||||
return -EINVAL;
|
||||
local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
|
||||
if (changed & WIPHY_PARAM_RETRY_LONG)
|
||||
}
|
||||
if (changed & WIPHY_PARAM_RETRY_LONG) {
|
||||
if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY)
|
||||
return -EINVAL;
|
||||
local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
|
||||
}
|
||||
if (changed &
|
||||
(WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
|
||||
@@ -2129,7 +2149,7 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
|
||||
* the new value until we associate.
|
||||
*/
|
||||
if (!sdata->u.mgd.associated ||
|
||||
sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT)
|
||||
sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
|
||||
return 0;
|
||||
|
||||
ap = sdata->u.mgd.associated->bssid;
|
||||
@@ -2236,7 +2256,6 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
|
||||
static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type channel_type,
|
||||
unsigned int duration, u64 *cookie,
|
||||
struct sk_buff *txskb)
|
||||
{
|
||||
@@ -2254,7 +2273,6 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
||||
return -ENOMEM;
|
||||
|
||||
roc->chan = channel;
|
||||
roc->chan_type = channel_type;
|
||||
roc->duration = duration;
|
||||
roc->req_duration = duration;
|
||||
roc->frame = txskb;
|
||||
@@ -2287,8 +2305,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
||||
if (!duration)
|
||||
duration = 10;
|
||||
|
||||
ret = drv_remain_on_channel(local, sdata, channel, channel_type,
|
||||
duration);
|
||||
ret = drv_remain_on_channel(local, sdata, channel, duration);
|
||||
if (ret) {
|
||||
kfree(roc);
|
||||
return ret;
|
||||
@@ -2299,8 +2316,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
||||
|
||||
out_check_combine:
|
||||
list_for_each_entry(tmp, &local->roc_list, list) {
|
||||
if (tmp->chan != channel || tmp->chan_type != channel_type ||
|
||||
tmp->sdata != sdata)
|
||||
if (tmp->chan != channel || tmp->sdata != sdata)
|
||||
continue;
|
||||
|
||||
/*
|
||||
@@ -2417,7 +2433,6 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
||||
static int ieee80211_remain_on_channel(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
unsigned int duration,
|
||||
u64 *cookie)
|
||||
{
|
||||
@@ -2426,7 +2441,7 @@ static int ieee80211_remain_on_channel(struct wiphy *wiphy,
|
||||
int ret;
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
ret = ieee80211_start_roc_work(local, sdata, chan, channel_type,
|
||||
ret = ieee80211_start_roc_work(local, sdata, chan,
|
||||
duration, cookie, NULL);
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
@@ -2519,10 +2534,8 @@ static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
|
||||
|
||||
static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct ieee80211_channel *chan, bool offchan,
|
||||
enum nl80211_channel_type channel_type,
|
||||
bool channel_type_valid, unsigned int wait,
|
||||
const u8 *buf, size_t len, bool no_cck,
|
||||
bool dont_wait_for_ack, u64 *cookie)
|
||||
unsigned int wait, const u8 *buf, size_t len,
|
||||
bool no_cck, bool dont_wait_for_ack, u64 *cookie)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
@@ -2591,14 +2604,10 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
rcu_read_lock();
|
||||
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||
|
||||
if (chanctx_conf) {
|
||||
need_offchan = chan != chanctx_conf->channel;
|
||||
if (channel_type_valid &&
|
||||
channel_type != chanctx_conf->channel_type)
|
||||
need_offchan = true;
|
||||
} else {
|
||||
if (chanctx_conf)
|
||||
need_offchan = chan != chanctx_conf->def.chan;
|
||||
else
|
||||
need_offchan = true;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
@@ -2633,7 +2642,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
local->hw.offchannel_tx_hw_queue;
|
||||
|
||||
/* This will handle all kinds of coalescing and immediate TX */
|
||||
ret = ieee80211_start_roc_work(local, sdata, chan, channel_type,
|
||||
ret = ieee80211_start_roc_work(local, sdata, chan,
|
||||
wait, cookie, skb);
|
||||
if (ret)
|
||||
kfree_skb(skb);
|
||||
@@ -3067,7 +3076,7 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
rcu_read_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
band = chanctx_conf->channel->band;
|
||||
band = chanctx_conf->def.chan->band;
|
||||
sta = sta_info_get(sdata, peer);
|
||||
if (sta) {
|
||||
qos = test_sta_flag(sta, WLAN_STA_WME);
|
||||
@@ -3124,23 +3133,23 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ieee80211_channel *
|
||||
ieee80211_cfg_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
enum nl80211_channel_type *type)
|
||||
static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_chanctx_conf *chanctx_conf;
|
||||
struct ieee80211_channel *chan = NULL;
|
||||
int ret = -ENODATA;
|
||||
|
||||
rcu_read_lock();
|
||||
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||
if (chanctx_conf) {
|
||||
*type = chanctx_conf->channel_type;
|
||||
chan = chanctx_conf->channel;
|
||||
*chandef = chanctx_conf->def;
|
||||
ret = 0;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return chan;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
+38
-90
@@ -8,93 +8,47 @@
|
||||
#include "ieee80211_i.h"
|
||||
#include "driver-ops.h"
|
||||
|
||||
static bool
|
||||
ieee80211_channel_types_are_compatible(enum nl80211_channel_type chantype1,
|
||||
enum nl80211_channel_type chantype2,
|
||||
enum nl80211_channel_type *compat)
|
||||
static void ieee80211_change_chandef(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *ctx,
|
||||
const struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
/*
|
||||
* start out with chantype1 being the result,
|
||||
* overwriting later if needed
|
||||
*/
|
||||
if (compat)
|
||||
*compat = chantype1;
|
||||
|
||||
switch (chantype1) {
|
||||
case NL80211_CHAN_NO_HT:
|
||||
if (compat)
|
||||
*compat = chantype2;
|
||||
break;
|
||||
case NL80211_CHAN_HT20:
|
||||
/*
|
||||
* allow any change that doesn't go to no-HT
|
||||
* (if it already is no-HT no change is needed)
|
||||
*/
|
||||
if (chantype2 == NL80211_CHAN_NO_HT)
|
||||
break;
|
||||
if (compat)
|
||||
*compat = chantype2;
|
||||
break;
|
||||
case NL80211_CHAN_HT40PLUS:
|
||||
case NL80211_CHAN_HT40MINUS:
|
||||
/* allow smaller bandwidth and same */
|
||||
if (chantype2 == NL80211_CHAN_NO_HT)
|
||||
break;
|
||||
if (chantype2 == NL80211_CHAN_HT20)
|
||||
break;
|
||||
if (chantype2 == chantype1)
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void ieee80211_change_chantype(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *ctx,
|
||||
enum nl80211_channel_type chantype)
|
||||
{
|
||||
if (chantype == ctx->conf.channel_type)
|
||||
if (cfg80211_chandef_identical(&ctx->conf.def, chandef))
|
||||
return;
|
||||
|
||||
ctx->conf.channel_type = chantype;
|
||||
drv_change_chanctx(local, ctx, IEEE80211_CHANCTX_CHANGE_CHANNEL_TYPE);
|
||||
WARN_ON(!cfg80211_chandef_compatible(&ctx->conf.def, chandef));
|
||||
|
||||
ctx->conf.def = *chandef;
|
||||
drv_change_chanctx(local, ctx, IEEE80211_CHANCTX_CHANGE_WIDTH);
|
||||
|
||||
if (!local->use_chanctx) {
|
||||
local->_oper_channel_type = chantype;
|
||||
local->_oper_channel_type = cfg80211_get_chandef_type(chandef);
|
||||
ieee80211_hw_config(local, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static struct ieee80211_chanctx *
|
||||
ieee80211_find_chanctx(struct ieee80211_local *local,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type channel_type,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
enum ieee80211_chanctx_mode mode)
|
||||
{
|
||||
struct ieee80211_chanctx *ctx;
|
||||
enum nl80211_channel_type compat_type;
|
||||
|
||||
lockdep_assert_held(&local->chanctx_mtx);
|
||||
|
||||
if (mode == IEEE80211_CHANCTX_EXCLUSIVE)
|
||||
return NULL;
|
||||
if (WARN_ON(!channel))
|
||||
return NULL;
|
||||
|
||||
list_for_each_entry(ctx, &local->chanctx_list, list) {
|
||||
compat_type = ctx->conf.channel_type;
|
||||
const struct cfg80211_chan_def *compat;
|
||||
|
||||
if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE)
|
||||
continue;
|
||||
if (ctx->conf.channel != channel)
|
||||
continue;
|
||||
if (!ieee80211_channel_types_are_compatible(ctx->conf.channel_type,
|
||||
channel_type,
|
||||
&compat_type))
|
||||
|
||||
compat = cfg80211_chandef_compatible(&ctx->conf.def, chandef);
|
||||
if (!compat)
|
||||
continue;
|
||||
|
||||
ieee80211_change_chantype(local, ctx, compat_type);
|
||||
ieee80211_change_chandef(local, ctx, compat);
|
||||
|
||||
return ctx;
|
||||
}
|
||||
@@ -104,8 +58,7 @@ ieee80211_find_chanctx(struct ieee80211_local *local,
|
||||
|
||||
static struct ieee80211_chanctx *
|
||||
ieee80211_new_chanctx(struct ieee80211_local *local,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type channel_type,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
enum ieee80211_chanctx_mode mode)
|
||||
{
|
||||
struct ieee80211_chanctx *ctx;
|
||||
@@ -117,15 +70,15 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
|
||||
if (!ctx)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ctx->conf.channel = channel;
|
||||
ctx->conf.channel_type = channel_type;
|
||||
ctx->conf.def = *chandef;
|
||||
ctx->conf.rx_chains_static = 1;
|
||||
ctx->conf.rx_chains_dynamic = 1;
|
||||
ctx->mode = mode;
|
||||
|
||||
if (!local->use_chanctx) {
|
||||
local->_oper_channel_type = channel_type;
|
||||
local->_oper_channel = channel;
|
||||
local->_oper_channel_type =
|
||||
cfg80211_get_chandef_type(chandef);
|
||||
local->_oper_channel = chandef->chan;
|
||||
ieee80211_hw_config(local, 0);
|
||||
} else {
|
||||
err = drv_add_chanctx(local, ctx);
|
||||
@@ -178,41 +131,37 @@ static int ieee80211_assign_vif_chanctx(struct ieee80211_sub_if_data *sdata,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum nl80211_channel_type
|
||||
ieee80211_calc_chantype(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *ctx)
|
||||
static void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *ctx)
|
||||
{
|
||||
struct ieee80211_chanctx_conf *conf = &ctx->conf;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
enum nl80211_channel_type result = NL80211_CHAN_NO_HT;
|
||||
const struct cfg80211_chan_def *compat = NULL;
|
||||
|
||||
lockdep_assert_held(&local->chanctx_mtx);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
continue;
|
||||
if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf)
|
||||
continue;
|
||||
|
||||
WARN_ON_ONCE(!ieee80211_channel_types_are_compatible(
|
||||
sdata->vif.bss_conf.channel_type,
|
||||
result, &result));
|
||||
if (!compat)
|
||||
compat = &sdata->vif.bss_conf.chandef;
|
||||
|
||||
compat = cfg80211_chandef_compatible(
|
||||
&sdata->vif.bss_conf.chandef, compat);
|
||||
if (!compat)
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return result;
|
||||
}
|
||||
if (WARN_ON_ONCE(!compat))
|
||||
return;
|
||||
|
||||
static void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *ctx)
|
||||
{
|
||||
enum nl80211_channel_type chantype;
|
||||
|
||||
lockdep_assert_held(&local->chanctx_mtx);
|
||||
|
||||
chantype = ieee80211_calc_chantype(local, ctx);
|
||||
ieee80211_change_chantype(local, ctx, chantype);
|
||||
ieee80211_change_chandef(local, ctx, compat);
|
||||
}
|
||||
|
||||
static void ieee80211_unassign_vif_chanctx(struct ieee80211_sub_if_data *sdata,
|
||||
@@ -337,8 +286,7 @@ void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
int ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_channel *channel,
|
||||
enum nl80211_channel_type channel_type,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
enum ieee80211_chanctx_mode mode)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
@@ -350,15 +298,15 @@ int ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
|
||||
mutex_lock(&local->chanctx_mtx);
|
||||
__ieee80211_vif_release_channel(sdata);
|
||||
|
||||
ctx = ieee80211_find_chanctx(local, channel, channel_type, mode);
|
||||
ctx = ieee80211_find_chanctx(local, chandef, mode);
|
||||
if (!ctx)
|
||||
ctx = ieee80211_new_chanctx(local, channel, channel_type, mode);
|
||||
ctx = ieee80211_new_chanctx(local, chandef, mode);
|
||||
if (IS_ERR(ctx)) {
|
||||
ret = PTR_ERR(ctx);
|
||||
goto out;
|
||||
}
|
||||
|
||||
sdata->vif.bss_conf.channel_type = channel_type;
|
||||
sdata->vif.bss_conf.chandef = *chandef;
|
||||
|
||||
ret = ieee80211_assign_vif_chanctx(sdata, ctx);
|
||||
if (ret) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user