Commit 358ae888 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg

cfg80211: expose the rfkill device to the low level driver

This will allow the low level driver to query the rfkill
state.
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Link: https://lore.kernel.org/r/20210616202826.9833-1-emmanuel.grumbach@intel.comSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 3f9d9725
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/if_ether.h> #include <linux/if_ether.h>
#include <linux/ieee80211.h> #include <linux/ieee80211.h>
#include <linux/net.h> #include <linux/net.h>
#include <linux/rfkill.h>
#include <net/regulatory.h> #include <net/regulatory.h>
/** /**
...@@ -4943,6 +4944,7 @@ struct wiphy_iftype_akm_suites { ...@@ -4943,6 +4944,7 @@ struct wiphy_iftype_akm_suites {
* configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and * configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and
* %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes * %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes
* @sar_capa: SAR control capabilities * @sar_capa: SAR control capabilities
* @rfkill: a pointer to the rfkill structure
*/ */
struct wiphy { struct wiphy {
struct mutex mtx; struct mutex mtx;
...@@ -5085,6 +5087,8 @@ struct wiphy { ...@@ -5085,6 +5087,8 @@ struct wiphy {
const struct cfg80211_sar_capa *sar_capa; const struct cfg80211_sar_capa *sar_capa;
struct rfkill *rfkill;
char priv[] __aligned(NETDEV_ALIGN); char priv[] __aligned(NETDEV_ALIGN);
}; };
...@@ -6659,7 +6663,10 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy); ...@@ -6659,7 +6663,10 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy);
* wiphy_rfkill_stop_polling - stop polling rfkill * wiphy_rfkill_stop_polling - stop polling rfkill
* @wiphy: the wiphy * @wiphy: the wiphy
*/ */
void wiphy_rfkill_stop_polling(struct wiphy *wiphy); static inline void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
{
rfkill_pause_polling(wiphy->rfkill);
}
/** /**
* DOC: Vendor commands * DOC: Vendor commands
......
...@@ -532,11 +532,11 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv, ...@@ -532,11 +532,11 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
wiphy_net_set(&rdev->wiphy, &init_net); wiphy_net_set(&rdev->wiphy, &init_net);
rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block; rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block;
rdev->rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev), rdev->wiphy.rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev),
&rdev->wiphy.dev, RFKILL_TYPE_WLAN, &rdev->wiphy.dev, RFKILL_TYPE_WLAN,
&rdev->rfkill_ops, rdev); &rdev->rfkill_ops, rdev);
if (!rdev->rfkill) { if (!rdev->wiphy.rfkill) {
wiphy_free(&rdev->wiphy); wiphy_free(&rdev->wiphy);
return NULL; return NULL;
} }
...@@ -985,10 +985,10 @@ int wiphy_register(struct wiphy *wiphy) ...@@ -985,10 +985,10 @@ int wiphy_register(struct wiphy *wiphy)
rdev->wiphy.registered = true; rdev->wiphy.registered = true;
rtnl_unlock(); rtnl_unlock();
res = rfkill_register(rdev->rfkill); res = rfkill_register(rdev->wiphy.rfkill);
if (res) { if (res) {
rfkill_destroy(rdev->rfkill); rfkill_destroy(rdev->wiphy.rfkill);
rdev->rfkill = NULL; rdev->wiphy.rfkill = NULL;
wiphy_unregister(&rdev->wiphy); wiphy_unregister(&rdev->wiphy);
return res; return res;
} }
...@@ -1004,18 +1004,10 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy) ...@@ -1004,18 +1004,10 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy)
if (!rdev->ops->rfkill_poll) if (!rdev->ops->rfkill_poll)
return; return;
rdev->rfkill_ops.poll = cfg80211_rfkill_poll; rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
rfkill_resume_polling(rdev->rfkill); rfkill_resume_polling(wiphy->rfkill);
} }
EXPORT_SYMBOL(wiphy_rfkill_start_polling); EXPORT_SYMBOL(wiphy_rfkill_start_polling);
void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
{
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
rfkill_pause_polling(rdev->rfkill);
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);
void wiphy_unregister(struct wiphy *wiphy) void wiphy_unregister(struct wiphy *wiphy)
{ {
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
...@@ -1027,8 +1019,8 @@ void wiphy_unregister(struct wiphy *wiphy) ...@@ -1027,8 +1019,8 @@ void wiphy_unregister(struct wiphy *wiphy)
wiphy_unlock(&rdev->wiphy); wiphy_unlock(&rdev->wiphy);
__count == 0; })); __count == 0; }));
if (rdev->rfkill) if (rdev->wiphy.rfkill)
rfkill_unregister(rdev->rfkill); rfkill_unregister(rdev->wiphy.rfkill);
rtnl_lock(); rtnl_lock();
wiphy_lock(&rdev->wiphy); wiphy_lock(&rdev->wiphy);
...@@ -1080,7 +1072,7 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev) ...@@ -1080,7 +1072,7 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
{ {
struct cfg80211_internal_bss *scan, *tmp; struct cfg80211_internal_bss *scan, *tmp;
struct cfg80211_beacon_registration *reg, *treg; struct cfg80211_beacon_registration *reg, *treg;
rfkill_destroy(rdev->rfkill); rfkill_destroy(rdev->wiphy.rfkill);
list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) { list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) {
list_del(&reg->list); list_del(&reg->list);
kfree(reg); kfree(reg);
...@@ -1102,7 +1094,7 @@ void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked, ...@@ -1102,7 +1094,7 @@ void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked,
{ {
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
if (rfkill_set_hw_state_reason(rdev->rfkill, blocked, reason)) if (rfkill_set_hw_state_reason(wiphy->rfkill, blocked, reason))
schedule_work(&rdev->rfkill_block); schedule_work(&rdev->rfkill_block);
} }
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state_reason); EXPORT_SYMBOL(wiphy_rfkill_set_hw_state_reason);
...@@ -1495,7 +1487,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, ...@@ -1495,7 +1487,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
wdev->use_4addr, 0)) wdev->use_4addr, 0))
return notifier_from_errno(-EOPNOTSUPP); return notifier_from_errno(-EOPNOTSUPP);
if (rfkill_blocked(rdev->rfkill)) if (rfkill_blocked(rdev->wiphy.rfkill))
return notifier_from_errno(-ERFKILL); return notifier_from_errno(-ERFKILL);
break; break;
default: default:
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Wireless configuration interface internals. * Wireless configuration interface internals.
* *
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
* Copyright (C) 2018-2020 Intel Corporation * Copyright (C) 2018-2021 Intel Corporation
*/ */
#ifndef __NET_WIRELESS_CORE_H #ifndef __NET_WIRELESS_CORE_H
#define __NET_WIRELESS_CORE_H #define __NET_WIRELESS_CORE_H
...@@ -27,7 +27,6 @@ struct cfg80211_registered_device { ...@@ -27,7 +27,6 @@ struct cfg80211_registered_device {
/* rfkill support */ /* rfkill support */
struct rfkill_ops rfkill_ops; struct rfkill_ops rfkill_ops;
struct rfkill *rfkill;
struct work_struct rfkill_block; struct work_struct rfkill_block;
/* ISO / IEC 3166 alpha2 for which this device is receiving /* ISO / IEC 3166 alpha2 for which this device is receiving
......
...@@ -13041,7 +13041,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) ...@@ -13041,7 +13041,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
if (wdev_running(wdev)) if (wdev_running(wdev))
return 0; return 0;
if (rfkill_blocked(rdev->rfkill)) if (rfkill_blocked(rdev->wiphy.rfkill))
return -ERFKILL; return -ERFKILL;
err = rdev_start_p2p_device(rdev, wdev); err = rdev_start_p2p_device(rdev, wdev);
...@@ -13083,7 +13083,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) ...@@ -13083,7 +13083,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
if (wdev_running(wdev)) if (wdev_running(wdev))
return -EEXIST; return -EEXIST;
if (rfkill_blocked(rdev->rfkill)) if (rfkill_blocked(rdev->wiphy.rfkill))
return -ERFKILL; return -ERFKILL;
if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
......
...@@ -902,7 +902,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev, ...@@ -902,7 +902,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev,
/* only change when not disabling */ /* only change when not disabling */
if (!data->txpower.disabled) { if (!data->txpower.disabled) {
rfkill_set_sw_state(rdev->rfkill, false); rfkill_set_sw_state(rdev->wiphy.rfkill, false);
if (data->txpower.fixed) { if (data->txpower.fixed) {
/* /*
...@@ -927,7 +927,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev, ...@@ -927,7 +927,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev,
} }
} }
} else { } else {
if (rfkill_set_sw_state(rdev->rfkill, true)) if (rfkill_set_sw_state(rdev->wiphy.rfkill, true))
schedule_work(&rdev->rfkill_block); schedule_work(&rdev->rfkill_block);
return 0; return 0;
} }
...@@ -963,7 +963,7 @@ static int cfg80211_wext_giwtxpower(struct net_device *dev, ...@@ -963,7 +963,7 @@ static int cfg80211_wext_giwtxpower(struct net_device *dev,
/* well... oh well */ /* well... oh well */
data->txpower.fixed = 1; data->txpower.fixed = 1;
data->txpower.disabled = rfkill_blocked(rdev->rfkill); data->txpower.disabled = rfkill_blocked(rdev->wiphy.rfkill);
data->txpower.value = val; data->txpower.value = val;
data->txpower.flags = IW_TXPOW_DBM; data->txpower.flags = IW_TXPOW_DBM;
......
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