Commit ae44b502 authored by Andrew Zaborowski's avatar Andrew Zaborowski Committed by Johannes Berg

wireless: Set NL80211_EXT_FEATURE_CQM_RSSI_LIST in multiple drivers

Set the NL80211_EXT_FEATURE_CQM_RSSI_LIST wiphy extended feature
wholesale in all mac80211-based drivers that do not set the
IEEE80211_VIF_BEACON_FILTER flags on their interfaces.  mac80211 will
be processing supplied RSSI values in ieee80211_rx_mgmt_beacon and
will detect when the thresholds set by
ieee80211_set_cqm_rssi_range_config are crossed.  Remaining (few)
drivers need code to enable the firmware to monitor the thresholds.
This is mostly only compile-tested.
Signed-off-by: default avatarAndrew Zaborowski <andrew.zaborowski@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2c3c5f8c
...@@ -1917,6 +1917,8 @@ static int adm8211_probe(struct pci_dev *pdev, ...@@ -1917,6 +1917,8 @@ static int adm8211_probe(struct pci_dev *pdev,
dev->wiphy->bands[NL80211_BAND_2GHZ] = &priv->band; 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); err = ieee80211_register_hw(dev);
if (err) { if (err) {
printk(KERN_ERR "%s (adm8211): Cannot register device\n", printk(KERN_ERR "%s (adm8211): Cannot register device\n",
......
...@@ -1689,6 +1689,8 @@ static int ar5523_probe(struct usb_interface *intf, ...@@ -1689,6 +1689,8 @@ static int ar5523_probe(struct usb_interface *intf,
if (error) if (error)
goto out_cancel_rx_cmd; goto out_cancel_rx_cmd;
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
usb_set_intfdata(intf, hw); usb_set_intfdata(intf, hw);
error = ieee80211_register_hw(hw); error = ieee80211_register_hw(hw);
......
...@@ -8248,6 +8248,8 @@ int ath10k_mac_register(struct ath10k *ar) ...@@ -8248,6 +8248,8 @@ int ath10k_mac_register(struct ath10k *ar)
ar->hw->wiphy->cipher_suites = cipher_suites; ar->hw->wiphy->cipher_suites = cipher_suites;
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(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); ret = ieee80211_register_hw(ar->hw);
if (ret) { if (ret) {
ath10k_err(ar, "failed to register ieee80211: %d\n", 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) ...@@ -2564,6 +2564,8 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)
hw->extra_tx_headroom = 2; 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 * Mark the device as detached to avoid processing
* interrupts until setup is complete. * interrupts until setup is complete.
......
...@@ -780,6 +780,8 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv, ...@@ -780,6 +780,8 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
} }
SET_IEEE80211_PERM_ADDR(hw, common->macaddr); 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) 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) ...@@ -955,6 +955,8 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
ath9k_cmn_reload_chainmask(ah); ath9k_cmn_reload_chainmask(ah);
SET_IEEE80211_PERM_ADDR(hw, common->macaddr); 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, int ath9k_init_device(u16 devid, struct ath_softc *sc,
......
...@@ -1874,6 +1874,8 @@ void *carl9170_alloc(size_t priv_size) ...@@ -1874,6 +1874,8 @@ void *carl9170_alloc(size_t priv_size)
for (i = 0; i < ARRAY_SIZE(ar->noise); i++) for (i = 0; i < ARRAY_SIZE(ar->noise); i++)
ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */ ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
return ar; return ar;
err_nomem: err_nomem:
......
...@@ -1112,6 +1112,9 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) ...@@ -1112,6 +1112,9 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn)
wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta); wcn->hw->sta_data_size = sizeof(struct wcn36xx_sta);
wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif); wcn->hw->vif_data_size = sizeof(struct wcn36xx_vif);
wiphy_ext_feature_set(wcn->hw->wiphy,
NL80211_EXT_FEATURE_CQM_RSSI_LIST);
return ret; return ret;
} }
......
...@@ -2377,6 +2377,8 @@ static int at76_init_new_device(struct at76_priv *priv, ...@@ -2377,6 +2377,8 @@ static int at76_init_new_device(struct at76_priv *priv,
wiphy->hw_version = priv->board_type; wiphy->hw_version = priv->board_type;
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
ret = ieee80211_register_hw(priv->hw); ret = ieee80211_register_hw(priv->hw);
if (ret) { if (ret) {
printk(KERN_ERR "cannot register mac80211 hw (status %d)!\n", 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) ...@@ -5598,6 +5598,8 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
wl->hw_registred = false; wl->hw_registred = false;
hw->max_rates = 2; hw->max_rates = 2;
SET_IEEE80211_DEV(hw, dev->dev); SET_IEEE80211_DEV(hw, dev->dev);
......
...@@ -3850,6 +3850,8 @@ static int b43legacy_wireless_init(struct ssb_device *dev) ...@@ -3850,6 +3850,8 @@ static int b43legacy_wireless_init(struct ssb_device *dev)
else else
SET_IEEE80211_PERM_ADDR(hw, sprom->il0mac); 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 */ /* Get and initialize struct b43legacy_wl */
wl = hw_to_b43legacy_wl(hw); wl = hw_to_b43legacy_wl(hw);
memset(wl, 0, sizeof(*wl)); memset(wl, 0, sizeof(*wl));
......
...@@ -1082,6 +1082,8 @@ static int ieee_hw_init(struct ieee80211_hw *hw) ...@@ -1082,6 +1082,8 @@ static int ieee_hw_init(struct ieee80211_hw *hw)
* hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; * 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->rate_control_algorithm = "minstrel_ht";
hw->sta_data_size = 0; hw->sta_data_size = 0;
......
...@@ -3592,6 +3592,8 @@ il3945_setup_mac(struct il_priv *il) ...@@ -3592,6 +3592,8 @@ il3945_setup_mac(struct il_priv *il)
il_leds_init(il); il_leds_init(il);
wiphy_ext_feature_set(il->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
ret = ieee80211_register_hw(il->hw); ret = ieee80211_register_hw(il->hw);
if (ret) { if (ret) {
IL_ERR("Failed to register hw (error %d)\n", ret); IL_ERR("Failed to register hw (error %d)\n", ret);
......
...@@ -5799,6 +5799,8 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length) ...@@ -5799,6 +5799,8 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length)
il_leds_init(il); il_leds_init(il);
wiphy_ext_feature_set(il->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
ret = ieee80211_register_hw(il->hw); ret = ieee80211_register_hw(il->hw);
if (ret) { if (ret) {
IL_ERR("Failed to register hw (error %d)\n", ret); IL_ERR("Failed to register hw (error %d)\n", ret);
......
...@@ -213,6 +213,8 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv, ...@@ -213,6 +213,8 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
iwl_leds_init(priv); iwl_leds_init(priv);
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
ret = ieee80211_register_hw(priv->hw); ret = ieee80211_register_hw(priv->hw);
if (ret) { if (ret) {
IWL_ERR(priv, "Failed to register hw (error %d)\n", ret); IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
......
...@@ -2645,6 +2645,8 @@ static int mac80211_hwsim_new_radio(struct genl_info *info, ...@@ -2645,6 +2645,8 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
if (param->no_vif) if (param->no_vif)
ieee80211_hw_set(hw, NO_AUTO_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); err = ieee80211_register_hw(hw);
if (err < 0) { if (err < 0) {
printk(KERN_DEBUG "mac80211_hwsim: ieee80211_register_hw failed (%d)\n", printk(KERN_DEBUG "mac80211_hwsim: ieee80211_register_hw failed (%d)\n",
......
...@@ -641,6 +641,8 @@ struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev) ...@@ -641,6 +641,8 @@ struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev)
BIT(NL80211_IFTYPE_ADHOC); BIT(NL80211_IFTYPE_ADHOC);
skb_queue_head_init(&priv->bc_ps_buf); 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); SET_IEEE80211_DEV(hw, dmdev);
INIT_WORK(&priv->cmd_work, lbtf_cmd_work); INIT_WORK(&priv->cmd_work, lbtf_cmd_work);
......
...@@ -6144,6 +6144,8 @@ static int mwl8k_firmware_load_success(struct mwl8k_priv *priv) ...@@ -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) if (priv->sta_macids_supported || priv->device_info->fw_image_sta)
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_STATION); 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); rc = ieee80211_register_hw(hw);
if (rc) { if (rc) {
wiphy_err(hw->wiphy, "Cannot register device\n"); wiphy_err(hw->wiphy, "Cannot register device\n");
......
...@@ -615,6 +615,8 @@ int mt7601u_register_device(struct mt7601u_dev *dev) ...@@ -615,6 +615,8 @@ int mt7601u_register_device(struct mt7601u_dev *dev)
wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR; wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
ret = mt76_init_sband_2g(dev); ret = mt76_init_sband_2g(dev);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1384,6 +1384,9 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) ...@@ -1384,6 +1384,9 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
wiphy_ext_feature_set(rt2x00dev->hw->wiphy,
NL80211_EXT_FEATURE_CQM_RSSI_LIST);
/* /*
* Initialize ieee80211 structure. * Initialize ieee80211 structure.
*/ */
......
...@@ -1877,6 +1877,8 @@ static int rtl8180_probe(struct pci_dev *pdev, ...@@ -1877,6 +1877,8 @@ static int rtl8180_probe(struct pci_dev *pdev,
else else
ieee80211_hw_set(dev, SIGNAL_UNSPEC); ieee80211_hw_set(dev, SIGNAL_UNSPEC);
wiphy_ext_feature_set(dev->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
rtl8180_eeprom_read(priv); rtl8180_eeprom_read(priv);
switch (priv->rf_type) { switch (priv->rf_type) {
......
...@@ -1609,6 +1609,8 @@ static int rtl8187_probe(struct usb_interface *intf, ...@@ -1609,6 +1609,8 @@ static int rtl8187_probe(struct usb_interface *intf,
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
BIT(NL80211_IFTYPE_ADHOC) ; 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) if ((id->driver_info == DEVICE_RTL8187) && priv->is_rtl8187b)
printk(KERN_INFO "rtl8187: inconsistency between id with OEM" printk(KERN_INFO "rtl8187: inconsistency between id with OEM"
" info!\n"); " info!\n");
......
...@@ -6135,6 +6135,8 @@ static int rtl8xxxu_probe(struct usb_interface *interface, ...@@ -6135,6 +6135,8 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
ieee80211_hw_set(hw, HAS_RATE_CONTROL); ieee80211_hw_set(hw, HAS_RATE_CONTROL);
ieee80211_hw_set(hw, AMPDU_AGGREGATION); ieee80211_hw_set(hw, AMPDU_AGGREGATION);
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
ret = ieee80211_register_hw(priv->hw); ret = ieee80211_register_hw(priv->hw);
if (ret) { if (ret) {
dev_err(&udev->dev, "%s: Failed to register: %i\n", dev_err(&udev->dev, "%s: Failed to register: %i\n",
......
...@@ -1261,6 +1261,8 @@ int rsi_mac80211_attach(struct rsi_common *common) ...@@ -1261,6 +1261,8 @@ int rsi_mac80211_attach(struct rsi_common *common)
wiphy->reg_notifier = rsi_reg_notify; wiphy->reg_notifier = rsi_reg_notify;
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
status = ieee80211_register_hw(hw); status = ieee80211_register_hw(hw);
if (status) if (status)
return status; return status;
......
...@@ -1408,6 +1408,8 @@ struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf) ...@@ -1408,6 +1408,8 @@ struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf)
BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_ADHOC) |
BIT(NL80211_IFTYPE_AP); BIT(NL80211_IFTYPE_AP);
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
hw->max_signal = 100; hw->max_signal = 100;
hw->queues = 1; hw->queues = 1;
hw->extra_tx_headroom = sizeof(struct zd_ctrlset); hw->extra_tx_headroom = sizeof(struct zd_ctrlset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment