Merge tag 'mac80211-next-for-davem-2017-04-18' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says: ==================== My last pull request has been a while, we now have: * connection quality monitoring with multiple thresholds * support for FILS shared key authentication offload * pre-CAC regulatory compliance - only ETSI allows this * sanity check for some rate confusion that hit ChromeOS (but nobody else uses it, evidently) * some documentation updates * lots of cleanups ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1917,6 +1917,8 @@ static int adm8211_probe(struct pci_dev *pdev,
|
||||
|
||||
dev->wiphy->bands[NL80211_BAND_2GHZ] = &priv->band;
|
||||
|
||||
wiphy_ext_feature_set(dev->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
err = ieee80211_register_hw(dev);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s (adm8211): Cannot register device\n",
|
||||
|
@@ -1689,6 +1689,8 @@ static int ar5523_probe(struct usb_interface *intf,
|
||||
if (error)
|
||||
goto out_cancel_rx_cmd;
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
usb_set_intfdata(intf, hw);
|
||||
|
||||
error = ieee80211_register_hw(hw);
|
||||
|
@@ -8267,6 +8267,8 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
ar->hw->wiphy->cipher_suites = cipher_suites;
|
||||
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||
|
||||
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = ieee80211_register_hw(ar->hw);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
|
||||
|
@@ -2564,6 +2564,8 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)
|
||||
|
||||
hw->extra_tx_headroom = 2;
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
/*
|
||||
* Mark the device as detached to avoid processing
|
||||
* interrupts until setup is complete.
|
||||
|
@@ -1503,7 +1503,6 @@ static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type,
|
||||
u32 *flags,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct ath6kl *ar = wiphy_priv(wiphy);
|
||||
@@ -1550,7 +1549,7 @@ static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy,
|
||||
|
||||
static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct ath6kl_vif *vif = netdev_priv(ndev);
|
||||
|
@@ -780,6 +780,8 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
|
||||
}
|
||||
|
||||
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
}
|
||||
|
||||
static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv)
|
||||
|
@@ -955,6 +955,8 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
ath9k_cmn_reload_chainmask(ah);
|
||||
|
||||
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
}
|
||||
|
||||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
|
@@ -1874,6 +1874,8 @@ void *carl9170_alloc(size_t priv_size)
|
||||
for (i = 0; i < ARRAY_SIZE(ar->noise); i++)
|
||||
ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
return ar;
|
||||
|
||||
err_nomem:
|
||||
|
@@ -1112,6 +1112,9 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn)
|
||||
wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta);
|
||||
wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif);
|
||||
|
||||
wiphy_ext_feature_set(wcn->hw->wiphy,
|
||||
NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -178,9 +178,8 @@ int wil_cid_fill_sinfo(struct wil6210_priv *wil, int cid,
|
||||
BIT(NL80211_STA_INFO_RX_DROP_MISC) |
|
||||
BIT(NL80211_STA_INFO_TX_FAILED);
|
||||
|
||||
sinfo->txrate.flags = RATE_INFO_FLAGS_MCS | RATE_INFO_FLAGS_60G;
|
||||
sinfo->txrate.flags = RATE_INFO_FLAGS_60G;
|
||||
sinfo->txrate.mcs = le16_to_cpu(reply.evt.bf_mcs);
|
||||
sinfo->rxrate.flags = RATE_INFO_FLAGS_MCS | RATE_INFO_FLAGS_60G;
|
||||
sinfo->rxrate.mcs = stats->last_mcs_rx;
|
||||
sinfo->rx_bytes = stats->rx_bytes;
|
||||
sinfo->rx_packets = stats->rx_packets;
|
||||
@@ -256,7 +255,7 @@ static struct wireless_dev *
|
||||
wil_cfg80211_add_iface(struct wiphy *wiphy, const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type,
|
||||
u32 *flags, struct vif_params *params)
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct net_device *ndev = wil_to_ndev(wil);
|
||||
@@ -307,7 +306,7 @@ static int wil_cfg80211_del_iface(struct wiphy *wiphy,
|
||||
|
||||
static int wil_cfg80211_change_iface(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
@@ -334,11 +333,8 @@ static int wil_cfg80211_change_iface(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
break;
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
if (flags)
|
||||
wil->monitor_flags = *flags;
|
||||
else
|
||||
wil->monitor_flags = 0;
|
||||
|
||||
if (params->flags)
|
||||
wil->monitor_flags = params->flags;
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
|
@@ -2377,6 +2377,8 @@ static int at76_init_new_device(struct at76_priv *priv,
|
||||
|
||||
wiphy->hw_version = priv->board_type;
|
||||
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = ieee80211_register_hw(priv->hw);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "cannot register mac80211 hw (status %d)!\n",
|
||||
|
@@ -5598,6 +5598,8 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
wl->hw_registred = false;
|
||||
hw->max_rates = 2;
|
||||
SET_IEEE80211_DEV(hw, dev->dev);
|
||||
|
@@ -3850,6 +3850,8 @@ static int b43legacy_wireless_init(struct ssb_device *dev)
|
||||
else
|
||||
SET_IEEE80211_PERM_ADDR(hw, sprom->il0mac);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
/* Get and initialize struct b43legacy_wl */
|
||||
wl = hw_to_b43legacy_wl(hw);
|
||||
memset(wl, 0, sizeof(*wl));
|
||||
|
@@ -575,12 +575,11 @@ static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
|
||||
*
|
||||
* @wiphy: wiphy device of new interface.
|
||||
* @name: name of the new interface.
|
||||
* @flags: not used.
|
||||
* @params: contains mac address for AP device.
|
||||
*/
|
||||
static
|
||||
struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
|
||||
u32 *flags, struct vif_params *params)
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
||||
@@ -653,7 +652,6 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type,
|
||||
u32 *flags,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct wireless_dev *wdev;
|
||||
@@ -674,12 +672,12 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
case NL80211_IFTYPE_AP:
|
||||
wdev = brcmf_ap_add_vif(wiphy, name, flags, params);
|
||||
wdev = brcmf_ap_add_vif(wiphy, name, params);
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, flags, params);
|
||||
wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, params);
|
||||
break;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
default:
|
||||
@@ -858,7 +856,7 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
@@ -6553,7 +6551,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
|
||||
if (err)
|
||||
goto default_conf_out;
|
||||
err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
|
||||
NULL, NULL);
|
||||
NULL);
|
||||
if (err)
|
||||
goto default_conf_out;
|
||||
|
||||
|
@@ -2141,12 +2141,11 @@ fail:
|
||||
* @name: name of the new interface.
|
||||
* @name_assign_type: origin of the interface name
|
||||
* @type: nl80211 interface type.
|
||||
* @flags: not used.
|
||||
* @params: contains mac address for P2P device.
|
||||
*/
|
||||
struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
|
@@ -150,7 +150,7 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced);
|
||||
void brcmf_p2p_detach(struct brcmf_p2p_info *p2p);
|
||||
struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params);
|
||||
int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev);
|
||||
int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg,
|
||||
|
@@ -1082,6 +1082,8 @@ static int ieee_hw_init(struct ieee80211_hw *hw)
|
||||
* hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
|
||||
*/
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
hw->rate_control_algorithm = "minstrel_ht";
|
||||
|
||||
hw->sta_data_size = 0;
|
||||
|
@@ -3592,6 +3592,8 @@ il3945_setup_mac(struct il_priv *il)
|
||||
|
||||
il_leds_init(il);
|
||||
|
||||
wiphy_ext_feature_set(il->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = ieee80211_register_hw(il->hw);
|
||||
if (ret) {
|
||||
IL_ERR("Failed to register hw (error %d)\n", ret);
|
||||
|
@@ -656,7 +656,7 @@ il3945_rs_get_rate(void *il_r, struct ieee80211_sta *sta, void *il_sta,
|
||||
rate_mask = sta->supp_rates[sband->band];
|
||||
|
||||
/* get user max rate if set */
|
||||
max_rate_idx = txrc->max_rate_idx;
|
||||
max_rate_idx = fls(txrc->rate_idx_mask) - 1;
|
||||
if (sband->band == NL80211_BAND_5GHZ && max_rate_idx != -1)
|
||||
max_rate_idx += IL_FIRST_OFDM_RATE;
|
||||
if (max_rate_idx < 0 || max_rate_idx >= RATE_COUNT)
|
||||
|
@@ -5799,6 +5799,8 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length)
|
||||
|
||||
il_leds_init(il);
|
||||
|
||||
wiphy_ext_feature_set(il->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = ieee80211_register_hw(il->hw);
|
||||
if (ret) {
|
||||
IL_ERR("Failed to register hw (error %d)\n", ret);
|
||||
|
@@ -2211,7 +2211,7 @@ il4965_rs_get_rate(void *il_r, struct ieee80211_sta *sta, void *il_sta,
|
||||
|
||||
/* Get max rate if user set max rate */
|
||||
if (lq_sta) {
|
||||
lq_sta->max_rate_idx = txrc->max_rate_idx;
|
||||
lq_sta->max_rate_idx = fls(txrc->rate_idx_mask) - 1;
|
||||
if (sband->band == NL80211_BAND_5GHZ &&
|
||||
lq_sta->max_rate_idx != -1)
|
||||
lq_sta->max_rate_idx += IL_FIRST_OFDM_RATE;
|
||||
|
@@ -213,6 +213,8 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
|
||||
|
||||
iwl_leds_init(priv);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = ieee80211_register_hw(priv->hw);
|
||||
if (ret) {
|
||||
IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
|
||||
|
@@ -2720,7 +2720,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
|
||||
|
||||
/* Get max rate if user set max rate */
|
||||
if (lq_sta) {
|
||||
lq_sta->max_rate_idx = txrc->max_rate_idx;
|
||||
lq_sta->max_rate_idx = fls(txrc->rate_idx_mask) - 1;
|
||||
if ((sband->band == NL80211_BAND_5GHZ) &&
|
||||
(lq_sta->max_rate_idx != -1))
|
||||
lq_sta->max_rate_idx += IWL_FIRST_OFDM_RATE;
|
||||
|
@@ -97,7 +97,7 @@ int orinoco_wiphy_register(struct wiphy *wiphy)
|
||||
}
|
||||
|
||||
static int orinoco_change_vif(struct wiphy *wiphy, struct net_device *dev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct orinoco_private *priv = wiphy_priv(wiphy);
|
||||
|
@@ -350,6 +350,7 @@ static const struct ieee80211_channel hwsim_channels_5ghz[] = {
|
||||
CHAN5G(5785), /* Channel 157 */
|
||||
CHAN5G(5805), /* Channel 161 */
|
||||
CHAN5G(5825), /* Channel 165 */
|
||||
CHAN5G(5845), /* Channel 169 */
|
||||
};
|
||||
|
||||
static const struct ieee80211_rate hwsim_rates[] = {
|
||||
@@ -525,6 +526,11 @@ struct mac80211_hwsim_data {
|
||||
struct ieee80211_vif *hw_scan_vif;
|
||||
int scan_chan_idx;
|
||||
u8 scan_addr[ETH_ALEN];
|
||||
struct {
|
||||
struct ieee80211_channel *channel;
|
||||
unsigned long next_start, start, end;
|
||||
} survey_data[ARRAY_SIZE(hwsim_channels_2ghz) +
|
||||
ARRAY_SIZE(hwsim_channels_5ghz)];
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
u64 beacon_int /* beacon interval in us */;
|
||||
@@ -552,8 +558,6 @@ struct mac80211_hwsim_data {
|
||||
/* wmediumd portid responsible for netgroup of this radio */
|
||||
u32 wmediumd;
|
||||
|
||||
int power_level;
|
||||
|
||||
/* difference between this hw's clock and the real clock, in usecs */
|
||||
s64 tsf_offset;
|
||||
s64 bcn_delta;
|
||||
@@ -1201,7 +1205,9 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
|
||||
if (info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
|
||||
rx_status.flag |= RX_FLAG_SHORT_GI;
|
||||
/* TODO: simulate real signal strength (and optional packet loss) */
|
||||
rx_status.signal = data->power_level - 50;
|
||||
rx_status.signal = -50;
|
||||
if (info->control.vif)
|
||||
rx_status.signal += info->control.vif->bss_conf.txpower;
|
||||
|
||||
if (data->ps != PS_DISABLED)
|
||||
hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
|
||||
@@ -1576,6 +1582,7 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
|
||||
[IEEE80211_SMPS_STATIC] = "static",
|
||||
[IEEE80211_SMPS_DYNAMIC] = "dynamic",
|
||||
};
|
||||
int idx;
|
||||
|
||||
if (conf->chandef.chan)
|
||||
wiphy_debug(hw->wiphy,
|
||||
@@ -1598,11 +1605,34 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
|
||||
|
||||
data->idle = !!(conf->flags & IEEE80211_CONF_IDLE);
|
||||
|
||||
data->channel = conf->chandef.chan;
|
||||
WARN_ON(conf->chandef.chan && data->use_chanctx);
|
||||
|
||||
WARN_ON(data->channel && data->use_chanctx);
|
||||
mutex_lock(&data->mutex);
|
||||
if (data->scanning && conf->chandef.chan) {
|
||||
for (idx = 0; idx < ARRAY_SIZE(data->survey_data); idx++) {
|
||||
if (data->survey_data[idx].channel == data->channel) {
|
||||
data->survey_data[idx].start =
|
||||
data->survey_data[idx].next_start;
|
||||
data->survey_data[idx].end = jiffies;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
data->channel = conf->chandef.chan;
|
||||
|
||||
for (idx = 0; idx < ARRAY_SIZE(data->survey_data); idx++) {
|
||||
if (data->survey_data[idx].channel &&
|
||||
data->survey_data[idx].channel != data->channel)
|
||||
continue;
|
||||
data->survey_data[idx].channel = data->channel;
|
||||
data->survey_data[idx].next_start = jiffies;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
data->channel = conf->chandef.chan;
|
||||
}
|
||||
mutex_unlock(&data->mutex);
|
||||
|
||||
data->power_level = conf->power_level;
|
||||
if (!data->started || !data->beacon_int)
|
||||
tasklet_hrtimer_cancel(&data->beacon_timer);
|
||||
else if (!hrtimer_is_queued(&data->beacon_timer.timer)) {
|
||||
@@ -1787,28 +1817,37 @@ static int mac80211_hwsim_conf_tx(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mac80211_hwsim_get_survey(
|
||||
struct ieee80211_hw *hw, int idx,
|
||||
struct survey_info *survey)
|
||||
static int mac80211_hwsim_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
struct survey_info *survey)
|
||||
{
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
struct mac80211_hwsim_data *hwsim = hw->priv;
|
||||
|
||||
wiphy_debug(hw->wiphy, "%s (idx=%d)\n", __func__, idx);
|
||||
|
||||
if (idx != 0)
|
||||
if (idx < 0 || idx >= ARRAY_SIZE(hwsim->survey_data))
|
||||
return -ENOENT;
|
||||
|
||||
/* Current channel */
|
||||
survey->channel = conf->chandef.chan;
|
||||
mutex_lock(&hwsim->mutex);
|
||||
survey->channel = hwsim->survey_data[idx].channel;
|
||||
if (!survey->channel) {
|
||||
mutex_unlock(&hwsim->mutex);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Magically conjured noise level --- this is only ok for simulated hardware.
|
||||
* Magically conjured dummy values --- this is only ok for simulated hardware.
|
||||
*
|
||||
* A real driver which cannot determine the real channel noise MUST NOT
|
||||
* report any noise, especially not a magically conjured one :-)
|
||||
* A real driver which cannot determine real values noise MUST NOT
|
||||
* report any, especially not a magically conjured ones :-)
|
||||
*/
|
||||
survey->filled = SURVEY_INFO_NOISE_DBM;
|
||||
survey->filled = SURVEY_INFO_NOISE_DBM |
|
||||
SURVEY_INFO_TIME |
|
||||
SURVEY_INFO_TIME_BUSY;
|
||||
survey->noise = -92;
|
||||
survey->time =
|
||||
jiffies_to_msecs(hwsim->survey_data[idx].end -
|
||||
hwsim->survey_data[idx].start);
|
||||
/* report 12.5% of channel time is used */
|
||||
survey->time_busy = survey->time/8;
|
||||
mutex_unlock(&hwsim->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1986,6 +2025,10 @@ static void hw_scan_work(struct work_struct *work)
|
||||
}
|
||||
ieee80211_queue_delayed_work(hwsim->hw, &hwsim->hw_scan,
|
||||
msecs_to_jiffies(dwell));
|
||||
hwsim->survey_data[hwsim->scan_chan_idx].channel = hwsim->tmp_chan;
|
||||
hwsim->survey_data[hwsim->scan_chan_idx].start = jiffies;
|
||||
hwsim->survey_data[hwsim->scan_chan_idx].end =
|
||||
jiffies + msecs_to_jiffies(dwell);
|
||||
hwsim->scan_chan_idx++;
|
||||
mutex_unlock(&hwsim->mutex);
|
||||
}
|
||||
@@ -2011,6 +2054,7 @@ static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
|
||||
hw_req->req.mac_addr_mask);
|
||||
else
|
||||
memcpy(hwsim->scan_addr, vif->addr, ETH_ALEN);
|
||||
memset(hwsim->survey_data, 0, sizeof(hwsim->survey_data));
|
||||
mutex_unlock(&hwsim->mutex);
|
||||
|
||||
wiphy_debug(hw->wiphy, "hwsim hw_scan request\n");
|
||||
@@ -2057,6 +2101,7 @@ static void mac80211_hwsim_sw_scan(struct ieee80211_hw *hw,
|
||||
|
||||
memcpy(hwsim->scan_addr, mac_addr, ETH_ALEN);
|
||||
hwsim->scanning = true;
|
||||
memset(hwsim->survey_data, 0, sizeof(hwsim->survey_data));
|
||||
|
||||
out:
|
||||
mutex_unlock(&hwsim->mutex);
|
||||
@@ -2207,7 +2252,6 @@ static const char mac80211_hwsim_gstrings_stats[][ETH_GSTRING_LEN] = {
|
||||
"d_tx_failed",
|
||||
"d_ps_mode",
|
||||
"d_group",
|
||||
"d_tx_power",
|
||||
};
|
||||
|
||||
#define MAC80211_HWSIM_SSTATS_LEN ARRAY_SIZE(mac80211_hwsim_gstrings_stats)
|
||||
@@ -2244,7 +2288,6 @@ static void mac80211_hwsim_get_et_stats(struct ieee80211_hw *hw,
|
||||
data[i++] = ar->tx_failed;
|
||||
data[i++] = ar->ps;
|
||||
data[i++] = ar->group;
|
||||
data[i++] = ar->power_level;
|
||||
|
||||
WARN_ON(i != MAC80211_HWSIM_SSTATS_LEN);
|
||||
}
|
||||
@@ -2438,6 +2481,9 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* ieee80211_alloc_hw_nm may have used a default name */
|
||||
param->hwname = wiphy_name(hw->wiphy);
|
||||
|
||||
if (info)
|
||||
net = genl_info_net(info);
|
||||
else
|
||||
@@ -2645,6 +2691,8 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
if (param->no_vif)
|
||||
ieee80211_hw_set(hw, NO_AUTO_VIF);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
err = ieee80211_register_hw(hw);
|
||||
if (err < 0) {
|
||||
printk(KERN_DEBUG "mac80211_hwsim: ieee80211_register_hw failed (%d)\n",
|
||||
|
@@ -57,12 +57,12 @@ enum hwsim_tx_control_flags {
|
||||
* @HWSIM_CMD_REGISTER: request to register and received all broadcasted
|
||||
* frames by any mac80211_hwsim radio device.
|
||||
* @HWSIM_CMD_FRAME: send/receive a broadcasted frame from/to kernel/user
|
||||
* space, uses:
|
||||
* space, uses:
|
||||
* %HWSIM_ATTR_ADDR_TRANSMITTER, %HWSIM_ATTR_ADDR_RECEIVER,
|
||||
* %HWSIM_ATTR_FRAME, %HWSIM_ATTR_FLAGS, %HWSIM_ATTR_RX_RATE,
|
||||
* %HWSIM_ATTR_SIGNAL, %HWSIM_ATTR_COOKIE, %HWSIM_ATTR_FREQ (optional)
|
||||
* @HWSIM_CMD_TX_INFO_FRAME: Transmission info report from user space to
|
||||
* kernel, uses:
|
||||
* kernel, uses:
|
||||
* %HWSIM_ATTR_ADDR_TRANSMITTER, %HWSIM_ATTR_FLAGS,
|
||||
* %HWSIM_ATTR_TX_INFO, %HWSIM_ATTR_SIGNAL, %HWSIM_ATTR_COOKIE
|
||||
* @HWSIM_CMD_NEW_RADIO: create a new radio with the given parameters,
|
||||
|
@@ -1657,7 +1657,7 @@ static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
*/
|
||||
|
||||
static int lbs_change_intf(struct wiphy *wiphy, struct net_device *dev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct lbs_private *priv = wiphy_priv(wiphy);
|
||||
|
@@ -641,6 +641,8 @@ struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev)
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
skb_queue_head_init(&priv->bc_ps_buf);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
SET_IEEE80211_DEV(hw, dmdev);
|
||||
|
||||
INIT_WORK(&priv->cmd_work, lbtf_cmd_work);
|
||||
|
@@ -935,7 +935,7 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
|
||||
static int
|
||||
mwifiex_change_vif_to_p2p(struct net_device *dev,
|
||||
enum nl80211_iftype curr_iftype,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct mwifiex_private *priv;
|
||||
@@ -1007,7 +1007,7 @@ mwifiex_change_vif_to_p2p(struct net_device *dev,
|
||||
static int
|
||||
mwifiex_change_vif_to_sta_adhoc(struct net_device *dev,
|
||||
enum nl80211_iftype curr_iftype,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct mwifiex_private *priv;
|
||||
@@ -1066,7 +1066,7 @@ mwifiex_change_vif_to_sta_adhoc(struct net_device *dev,
|
||||
static int
|
||||
mwifiex_change_vif_to_ap(struct net_device *dev,
|
||||
enum nl80211_iftype curr_iftype,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct mwifiex_private *priv;
|
||||
@@ -1122,7 +1122,7 @@ mwifiex_change_vif_to_ap(struct net_device *dev,
|
||||
static int
|
||||
mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
@@ -1143,10 +1143,10 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
return mwifiex_change_vif_to_p2p(dev, curr_iftype,
|
||||
type, flags, params);
|
||||
type, params);
|
||||
case NL80211_IFTYPE_AP:
|
||||
return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
|
||||
flags, params);
|
||||
params);
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
mwifiex_dbg(priv->adapter, INFO,
|
||||
"%s: kept type as IBSS\n", dev->name);
|
||||
@@ -1173,10 +1173,10 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
return mwifiex_change_vif_to_p2p(dev, curr_iftype,
|
||||
type, flags, params);
|
||||
type, params);
|
||||
case NL80211_IFTYPE_AP:
|
||||
return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
|
||||
flags, params);
|
||||
params);
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
mwifiex_dbg(priv->adapter, INFO,
|
||||
"%s: kept type as STA\n", dev->name);
|
||||
@@ -1194,13 +1194,12 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
case NL80211_IFTYPE_STATION:
|
||||
return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
|
||||
type, flags,
|
||||
params);
|
||||
type, params);
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
return mwifiex_change_vif_to_p2p(dev, curr_iftype,
|
||||
type, flags, params);
|
||||
type, params);
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
mwifiex_dbg(priv->adapter, INFO,
|
||||
"%s: kept type as AP\n", dev->name);
|
||||
@@ -1233,14 +1232,13 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
if (mwifiex_cfg80211_deinit_p2p(priv))
|
||||
return -EFAULT;
|
||||
return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
|
||||
type, flags,
|
||||
params);
|
||||
type, params);
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
if (mwifiex_cfg80211_deinit_p2p(priv))
|
||||
return -EFAULT;
|
||||
return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
|
||||
flags, params);
|
||||
params);
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
mwifiex_dbg(priv->adapter, INFO,
|
||||
"%s: kept type as P2P\n", dev->name);
|
||||
@@ -2841,7 +2839,6 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type,
|
||||
u32 *flags,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
|
||||
|
@@ -596,7 +596,7 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context)
|
||||
rtnl_lock();
|
||||
/* Create station interface by default */
|
||||
wdev = mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", NET_NAME_ENUM,
|
||||
NL80211_IFTYPE_STATION, NULL, NULL);
|
||||
NL80211_IFTYPE_STATION, NULL);
|
||||
if (IS_ERR(wdev)) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"cannot create default STA interface\n");
|
||||
@@ -606,7 +606,7 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context)
|
||||
|
||||
if (driver_mode & MWIFIEX_DRIVER_MODE_UAP) {
|
||||
wdev = mwifiex_add_virtual_intf(adapter->wiphy, "uap%d", NET_NAME_ENUM,
|
||||
NL80211_IFTYPE_AP, NULL, NULL);
|
||||
NL80211_IFTYPE_AP, NULL);
|
||||
if (IS_ERR(wdev)) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"cannot create AP interface\n");
|
||||
@@ -617,8 +617,7 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context)
|
||||
|
||||
if (driver_mode & MWIFIEX_DRIVER_MODE_P2P) {
|
||||
wdev = mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d", NET_NAME_ENUM,
|
||||
NL80211_IFTYPE_P2P_CLIENT, NULL,
|
||||
NULL);
|
||||
NL80211_IFTYPE_P2P_CLIENT, NULL);
|
||||
if (IS_ERR(wdev)) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"cannot create p2p client interface\n");
|
||||
|
@@ -1529,7 +1529,6 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
enum nl80211_iftype type,
|
||||
u32 *flags,
|
||||
struct vif_params *params);
|
||||
int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev);
|
||||
|
||||
|
@@ -349,7 +349,7 @@ static int mwifiex_tdls_add_vht_oper(struct mwifiex_private *priv,
|
||||
chan_bw = IEEE80211_VHT_CHANWIDTH_USE_HT;
|
||||
break;
|
||||
}
|
||||
vht_oper->center_freq_seg1_idx =
|
||||
vht_oper->center_freq_seg0_idx =
|
||||
mwifiex_get_center_freq_index(priv, BAND_AAC,
|
||||
bss_desc->channel,
|
||||
chan_bw);
|
||||
|
@@ -6144,6 +6144,8 @@ static int mwl8k_firmware_load_success(struct mwl8k_priv *priv)
|
||||
if (priv->sta_macids_supported || priv->device_info->fw_image_sta)
|
||||
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_STATION);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
rc = ieee80211_register_hw(hw);
|
||||
if (rc) {
|
||||
wiphy_err(hw->wiphy, "Cannot register device\n");
|
||||
|
@@ -615,6 +615,8 @@ int mt7601u_register_device(struct mt7601u_dev *dev)
|
||||
wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
|
||||
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
||||
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = mt76_init_sband_2g(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@@ -1456,6 +1456,9 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
||||
|
||||
wiphy_ext_feature_set(rt2x00dev->hw->wiphy,
|
||||
NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
/*
|
||||
* Initialize ieee80211 structure.
|
||||
*/
|
||||
|
@@ -1877,6 +1877,8 @@ static int rtl8180_probe(struct pci_dev *pdev,
|
||||
else
|
||||
ieee80211_hw_set(dev, SIGNAL_UNSPEC);
|
||||
|
||||
wiphy_ext_feature_set(dev->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
rtl8180_eeprom_read(priv);
|
||||
|
||||
switch (priv->rf_type) {
|
||||
|
@@ -1607,6 +1607,8 @@ static int rtl8187_probe(struct usb_interface *intf,
|
||||
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_ADHOC) ;
|
||||
|
||||
wiphy_ext_feature_set(dev->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
if ((id->driver_info == DEVICE_RTL8187) && priv->is_rtl8187b)
|
||||
printk(KERN_INFO "rtl8187: inconsistency between id with OEM"
|
||||
" info!\n");
|
||||
|
@@ -6135,6 +6135,8 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
|
||||
ieee80211_hw_set(hw, HAS_RATE_CONTROL);
|
||||
ieee80211_hw_set(hw, AMPDU_AGGREGATION);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ret = ieee80211_register_hw(priv->hw);
|
||||
if (ret) {
|
||||
dev_err(&udev->dev, "%s: Failed to register: %i\n",
|
||||
|
@@ -479,7 +479,7 @@ struct rndis_wlan_private {
|
||||
*/
|
||||
static int rndis_change_virtual_intf(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params);
|
||||
|
||||
static int rndis_scan(struct wiphy *wiphy,
|
||||
@@ -1857,7 +1857,7 @@ error:
|
||||
*/
|
||||
static int rndis_change_virtual_intf(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct rndis_wlan_private *priv = wiphy_priv(wiphy);
|
||||
|
@@ -1261,6 +1261,8 @@ int rsi_mac80211_attach(struct rsi_common *common)
|
||||
|
||||
wiphy->reg_notifier = rsi_reg_notify;
|
||||
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
status = ieee80211_register_hw(hw);
|
||||
if (status)
|
||||
return status;
|
||||
|
@@ -1408,6 +1408,8 @@ struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf)
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_AP);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
hw->max_signal = 100;
|
||||
hw->queues = 1;
|
||||
hw->extra_tx_headroom = sizeof(struct zd_ctrlset);
|
||||
|
Reference in New Issue
Block a user