cfg80211: don't allow WoWLAN support without CONFIG_PM
When CONFIG_PM is disabled, no device can possibly support WoWLAN since it can't go to sleep to start with. Due to this, mac80211 had even rejected the hardware registration. By making all the code and data for WoWLAN depend on CONFIG_PM we can promote this runtime error to a compile-time error. Add #ifdef around all WoWLAN code to remove it in systems that don't need it as they never suspend. Cc: Kalle Valo <kvalo@qca.qualcomm.com> Acked-by: Luciano Coelho <coelho@ti.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
cc45ae547b
commit
dfb89c56ad
6 changed files with 19 additions and 4 deletions
|
@ -3487,6 +3487,7 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
|
||||||
wiphy->cipher_suites = cipher_suites;
|
wiphy->cipher_suites = cipher_suites;
|
||||||
wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||||
WIPHY_WOWLAN_DISCONNECT |
|
WIPHY_WOWLAN_DISCONNECT |
|
||||||
WIPHY_WOWLAN_GTK_REKEY_FAILURE |
|
WIPHY_WOWLAN_GTK_REKEY_FAILURE |
|
||||||
|
@ -3496,6 +3497,7 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
|
||||||
wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;
|
wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;
|
||||||
wiphy->wowlan.pattern_min_len = 1;
|
wiphy->wowlan.pattern_min_len = 1;
|
||||||
wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
|
wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
|
||||||
|
#endif
|
||||||
|
|
||||||
wiphy->max_sched_scan_ssids = MAX_PROBED_SSID_INDEX;
|
wiphy->max_sched_scan_ssids = MAX_PROBED_SSID_INDEX;
|
||||||
|
|
||||||
|
|
|
@ -5321,6 +5321,7 @@ int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
|
||||||
goto out_free_hw;
|
goto out_free_hw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
ret = enable_irq_wake(wl->irq);
|
ret = enable_irq_wake(wl->irq);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
wl->irq_wake_enabled = true;
|
wl->irq_wake_enabled = true;
|
||||||
|
@ -5334,6 +5335,7 @@ int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
|
||||||
WL1271_RX_FILTER_MAX_PATTERN_SIZE;
|
WL1271_RX_FILTER_MAX_PATTERN_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
disable_irq(wl->irq);
|
disable_irq(wl->irq);
|
||||||
|
|
||||||
ret = wl12xx_get_hw_info(wl);
|
ret = wl12xx_get_hw_info(wl);
|
||||||
|
|
|
@ -2153,7 +2153,9 @@ struct wiphy {
|
||||||
char fw_version[ETHTOOL_BUSINFO_LEN];
|
char fw_version[ETHTOOL_BUSINFO_LEN];
|
||||||
u32 hw_version;
|
u32 hw_version;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
struct wiphy_wowlan_support wowlan;
|
struct wiphy_wowlan_support wowlan;
|
||||||
|
#endif
|
||||||
|
|
||||||
u16 max_remain_on_channel_duration;
|
u16 max_remain_on_channel_duration;
|
||||||
|
|
||||||
|
|
|
@ -706,12 +706,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||||
local->hw.offchannel_tx_hw_queue >= local->hw.queues))
|
local->hw.offchannel_tx_hw_queue >= local->hw.queues))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if ((hw->wiphy->wowlan.flags || hw->wiphy->wowlan.n_patterns)
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
&& (!local->ops->suspend || !local->ops->resume)
|
if ((hw->wiphy->wowlan.flags || hw->wiphy->wowlan.n_patterns) &&
|
||||||
#endif
|
(!local->ops->suspend || !local->ops->resume))
|
||||||
)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((hw->flags & IEEE80211_HW_SCAN_WHILE_IDLE) && !local->ops->hw_scan)
|
if ((hw->flags & IEEE80211_HW_SCAN_WHILE_IDLE) && !local->ops->hw_scan)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -421,9 +421,11 @@ int wiphy_register(struct wiphy *wiphy)
|
||||||
int i;
|
int i;
|
||||||
u16 ifmodes = wiphy->interface_modes;
|
u16 ifmodes = wiphy->interface_modes;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
if (WARN_ON((wiphy->wowlan.flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
|
if (WARN_ON((wiphy->wowlan.flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
|
||||||
!(wiphy->wowlan.flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)))
|
!(wiphy->wowlan.flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (WARN_ON(wiphy->ap_sme_capa &&
|
if (WARN_ON(wiphy->ap_sme_capa &&
|
||||||
!(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
|
!(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
|
||||||
|
@ -500,12 +502,14 @@ int wiphy_register(struct wiphy *wiphy)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
if (rdev->wiphy.wowlan.n_patterns) {
|
if (rdev->wiphy.wowlan.n_patterns) {
|
||||||
if (WARN_ON(!rdev->wiphy.wowlan.pattern_min_len ||
|
if (WARN_ON(!rdev->wiphy.wowlan.pattern_min_len ||
|
||||||
rdev->wiphy.wowlan.pattern_min_len >
|
rdev->wiphy.wowlan.pattern_min_len >
|
||||||
rdev->wiphy.wowlan.pattern_max_len))
|
rdev->wiphy.wowlan.pattern_max_len))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* check and set up bitrates */
|
/* check and set up bitrates */
|
||||||
ieee80211_set_bitrate_flags(wiphy);
|
ieee80211_set_bitrate_flags(wiphy);
|
||||||
|
|
|
@ -1112,6 +1112,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
|
||||||
nla_nest_end(msg, nl_ifs);
|
nla_nest_end(msg, nl_ifs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
if (dev->wiphy.wowlan.flags || dev->wiphy.wowlan.n_patterns) {
|
if (dev->wiphy.wowlan.flags || dev->wiphy.wowlan.n_patterns) {
|
||||||
struct nlattr *nl_wowlan;
|
struct nlattr *nl_wowlan;
|
||||||
|
|
||||||
|
@ -1152,6 +1153,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
|
||||||
|
|
||||||
nla_nest_end(msg, nl_wowlan);
|
nla_nest_end(msg, nl_wowlan);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
|
if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
|
||||||
dev->wiphy.software_iftypes))
|
dev->wiphy.software_iftypes))
|
||||||
|
@ -6276,6 +6278,7 @@ static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
|
||||||
return cfg80211_leave_mesh(rdev, dev);
|
return cfg80211_leave_mesh(rdev, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
|
static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
|
||||||
{
|
{
|
||||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||||
|
@ -6504,6 +6507,7 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
|
||||||
kfree(new_triggers.patterns);
|
kfree(new_triggers.patterns);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
|
static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
|
||||||
{
|
{
|
||||||
|
@ -7158,6 +7162,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||||
NL80211_FLAG_NEED_RTNL,
|
NL80211_FLAG_NEED_RTNL,
|
||||||
},
|
},
|
||||||
|
#ifdef CONFIG_PM
|
||||||
{
|
{
|
||||||
.cmd = NL80211_CMD_GET_WOWLAN,
|
.cmd = NL80211_CMD_GET_WOWLAN,
|
||||||
.doit = nl80211_get_wowlan,
|
.doit = nl80211_get_wowlan,
|
||||||
|
@ -7174,6 +7179,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||||
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
||||||
NL80211_FLAG_NEED_RTNL,
|
NL80211_FLAG_NEED_RTNL,
|
||||||
},
|
},
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
.cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
|
.cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
|
||||||
.doit = nl80211_set_rekey_data,
|
.doit = nl80211_set_rekey_data,
|
||||||
|
|
Loading…
Reference in a new issue