Skip to content

Commit

Permalink
cfg80211: expose the rfkill device to the low level driver
Browse files Browse the repository at this point in the history
This will allow the low level driver to query the rfkill
state.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  • Loading branch information
egrumbach authored and intel-lab-lkp committed Jun 16, 2021
1 parent 7709193 commit 8b25a45
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 29 deletions.
8 changes: 7 additions & 1 deletion include/net/cfg80211.h
Expand Up @@ -4945,6 +4945,7 @@ struct wiphy_iftype_akm_suites {
* configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and
* %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes
* @sar_capa: SAR control capabilities
* @rfkill: a pointer to the rfkill structure
*/
struct wiphy {
struct mutex mtx;
Expand Down Expand Up @@ -5087,6 +5088,8 @@ struct wiphy {

const struct cfg80211_sar_capa *sar_capa;

struct rfkill *rfkill;

char priv[] __aligned(NETDEV_ALIGN);
};

Expand Down Expand Up @@ -6661,7 +6664,10 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy);
* wiphy_rfkill_stop_polling - stop polling rfkill
* @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
Expand Down
34 changes: 13 additions & 21 deletions net/wireless/core.c
Expand Up @@ -532,11 +532,11 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
wiphy_net_set(&rdev->wiphy, &init_net);

rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block;
rdev->rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev),
&rdev->wiphy.dev, RFKILL_TYPE_WLAN,
&rdev->rfkill_ops, rdev);
rdev->wiphy.rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev),
&rdev->wiphy.dev, RFKILL_TYPE_WLAN,
&rdev->rfkill_ops, rdev);

if (!rdev->rfkill) {
if (!rdev->wiphy.rfkill) {
wiphy_free(&rdev->wiphy);
return NULL;
}
Expand Down Expand Up @@ -993,10 +993,10 @@ int wiphy_register(struct wiphy *wiphy)
rdev->wiphy.registered = true;
rtnl_unlock();

res = rfkill_register(rdev->rfkill);
res = rfkill_register(rdev->wiphy.rfkill);
if (res) {
rfkill_destroy(rdev->rfkill);
rdev->rfkill = NULL;
rfkill_destroy(rdev->wiphy.rfkill);
rdev->wiphy.rfkill = NULL;
wiphy_unregister(&rdev->wiphy);
return res;
}
Expand All @@ -1012,18 +1012,10 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy)
if (!rdev->ops->rfkill_poll)
return;
rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
rfkill_resume_polling(rdev->rfkill);
rfkill_resume_polling(wiphy->rfkill);
}
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)
{
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
Expand All @@ -1035,8 +1027,8 @@ void wiphy_unregister(struct wiphy *wiphy)
wiphy_unlock(&rdev->wiphy);
__count == 0; }));

if (rdev->rfkill)
rfkill_unregister(rdev->rfkill);
if (rdev->wiphy.rfkill)
rfkill_unregister(rdev->wiphy.rfkill);

rtnl_lock();
wiphy_lock(&rdev->wiphy);
Expand Down Expand Up @@ -1088,7 +1080,7 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
{
struct cfg80211_internal_bss *scan, *tmp;
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_del(&reg->list);
kfree(reg);
Expand All @@ -1110,7 +1102,7 @@ void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked,
{
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);
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state_reason);
Expand Down Expand Up @@ -1506,7 +1498,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
wdev->use_4addr, 0))
return notifier_from_errno(-EOPNOTSUPP);

if (rfkill_blocked(rdev->rfkill))
if (rfkill_blocked(rdev->wiphy.rfkill))
return notifier_from_errno(-ERFKILL);
break;
default:
Expand Down
3 changes: 1 addition & 2 deletions net/wireless/core.h
Expand Up @@ -3,7 +3,7 @@
* Wireless configuration interface internals.
*
* 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
#define __NET_WIRELESS_CORE_H
Expand All @@ -27,7 +27,6 @@ struct cfg80211_registered_device {

/* rfkill support */
struct rfkill_ops rfkill_ops;
struct rfkill *rfkill;
struct work_struct rfkill_block;

/* ISO / IEC 3166 alpha2 for which this device is receiving
Expand Down
4 changes: 2 additions & 2 deletions net/wireless/nl80211.c
Expand Up @@ -13042,7 +13042,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
if (wdev_running(wdev))
return 0;

if (rfkill_blocked(rdev->rfkill))
if (rfkill_blocked(rdev->wiphy.rfkill))
return -ERFKILL;

err = rdev_start_p2p_device(rdev, wdev);
Expand Down Expand Up @@ -13084,7 +13084,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
if (wdev_running(wdev))
return -EEXIST;

if (rfkill_blocked(rdev->rfkill))
if (rfkill_blocked(rdev->wiphy.rfkill))
return -ERFKILL;

if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
Expand Down
6 changes: 3 additions & 3 deletions net/wireless/wext-compat.c
Expand Up @@ -902,7 +902,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev,

/* only change when not disabling */
if (!data->txpower.disabled) {
rfkill_set_sw_state(rdev->rfkill, false);
rfkill_set_sw_state(rdev->wiphy.rfkill, false);

if (data->txpower.fixed) {
/*
Expand All @@ -927,7 +927,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev,
}
}
} else {
if (rfkill_set_sw_state(rdev->rfkill, true))
if (rfkill_set_sw_state(rdev->wiphy.rfkill, true))
schedule_work(&rdev->rfkill_block);
return 0;
}
Expand Down Expand Up @@ -963,7 +963,7 @@ static int cfg80211_wext_giwtxpower(struct net_device *dev,

/* well... oh well */
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.flags = IW_TXPOW_DBM;

Expand Down

0 comments on commit 8b25a45

Please sign in to comment.