From: P Praneesh <ppranees@codeaurora.org>
To: ath11k@lists.infradead.org, johannes@sipsolutions.net
Cc: linux-wireless@vger.kernel.org,
P Praneesh <ppranees@codeaurora.org>,
Sathishkumar Muruganandam <murugana@codeaurora.org>
Subject: [PATCH v3 1/3] nl80211: Extended ROC support for 40-80 MHz bandwidth
Date: Fri, 22 Oct 2021 18:07:05 +0530 [thread overview]
Message-ID: <1634906227-22028-2-git-send-email-ppranees@codeaurora.org> (raw)
In-Reply-To: <1634906227-22028-1-git-send-email-ppranees@codeaurora.org>
Replace struct ieee80211_channel with struct cfg80211_chan_def
in remain on channel apis, because the channel width information is needed
to handle centre frequency of 80MHz, and it is available in
cfg80211_chan_def.
Co-developed-by: Sathishkumar Muruganandam <murugana@codeaurora.org>
Signed-off-by: Sathishkumar Muruganandam <murugana@codeaurora.org>
Signed-off-by: P Praneesh <ppranees@codeaurora.org>
---
drivers/net/wireless/ath/ath10k/mac.c | 3 +-
drivers/net/wireless/ath/ath6kl/cfg80211.c | 3 +-
drivers/net/wireless/ath/ath9k/main.c | 4 +-
drivers/net/wireless/ath/wil6210/cfg80211.c | 3 +-
.../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 3 +-
.../net/wireless/broadcom/brcm80211/brcmfmac/p2p.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +-
drivers/net/wireless/mac80211_hwsim.c | 3 +-
drivers/net/wireless/marvell/mwifiex/cfg80211.c | 3 +-
drivers/net/wireless/mediatek/mt76/mt7615/main.c | 3 +-
drivers/net/wireless/microchip/wilc1000/cfg80211.c | 3 +-
drivers/net/wireless/rsi/rsi_91x_mac80211.c | 3 +-
drivers/net/wireless/ti/wlcore/main.c | 3 +-
include/net/cfg80211.h | 2 +-
include/net/mac80211.h | 2 +-
net/mac80211/driver-ops.h | 6 +--
net/mac80211/ieee80211_i.h | 4 +-
net/mac80211/offchannel.c | 56 ++++++++++++++--------
net/mac80211/trace.h | 11 +++--
net/wireless/nl80211.c | 2 +-
net/wireless/rdev-ops.h | 6 +--
net/wireless/trace.h | 6 +--
22 files changed, 82 insertions(+), 52 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index c272b29..e652e21 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -7805,12 +7805,13 @@ static int ath10k_conf_tx(struct ieee80211_hw *hw,
static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = (void *)vif->drv_priv;
+ struct ieee80211_channel *chan = chandef->chan;
struct wmi_start_scan_arg arg;
int ret = 0;
u32 scan_time_msec;
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index fefdc67..4a2c132 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -3023,12 +3023,13 @@ static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
static int ath6kl_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
u64 *cookie)
{
struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
struct ath6kl *ar = ath6kl_priv(vif->ndev);
+ struct ieee80211_channel *chan = chandef->chan;
u32 id;
/* TODO: if already pending or ongoing remain-on-channel,
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 1398315..8f0fc64 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -2466,11 +2466,13 @@ static void ath9k_cancel_hw_scan(struct ieee80211_hw *hw,
static int ath9k_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan, int duration,
+ struct cfg80211_chan_def *chandef,
+ int duration,
enum ieee80211_roc_type type)
{
struct ath_softc *sc = hw->priv;
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+ struct ieee80211_channel *chan = chandef->chan;
int ret = 0;
mutex_lock(&sc->mutex);
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
index 1ff2679..9ed172f 100644
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
@@ -1734,11 +1734,12 @@ static int wil_cfg80211_set_default_key(struct wiphy *wiphy,
static int wil_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
u64 *cookie)
{
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+ struct ieee80211_channel *chan = chandef->chan;
int rc;
wil_dbg_misc(wil,
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
index 9ac0d8c..e9cd84e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
@@ -972,10 +972,11 @@ brcmf_p2p_discover_listen(struct brcmf_p2p_info *p2p, u16 channel, u32 duration)
* @cookie: cookie.
*/
int brcmf_p2p_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+ struct ieee80211_channel *channel = chandef->chan;
struct brcmf_p2p_info *p2p = &cfg->p2p;
s32 err;
u16 channel_nr;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
index d2ecee5..1646e6e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
@@ -156,7 +156,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wiphy,
struct cfg80211_scan_request *request,
struct brcmf_cfg80211_vif *vif);
int brcmf_p2p_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie);
int brcmf_p2p_notify_listen_complete(struct brcmf_if *ifp,
const struct brcmf_event_msg *e,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 70ebecb..09a775a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3792,7 +3792,7 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
static int iwl_mvm_roc(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandefcfg,
int duration,
enum ieee80211_roc_type type)
{
@@ -3800,6 +3800,7 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
struct cfg80211_chan_def chandef;
struct iwl_mvm_phy_ctxt *phy_ctxt;
+ struct ieee80211_channel *channel = chandefcfg->chan;
bool band_change_removal;
int ret, i;
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index ffa894f..9692b58 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -2475,11 +2475,12 @@ static void hw_roc_done(struct work_struct *work)
static int mac80211_hwsim_roc(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct mac80211_hwsim_data *hwsim = hw->priv;
+ struct ieee80211_channel *chan = chandef->chan;
mutex_lock(&hwsim->mutex);
if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) {
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index 0961f4a..aee8338 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -292,10 +292,11 @@ mwifiex_cfg80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
static int
mwifiex_cfg80211_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
+ struct ieee80211_channel *chan = chandef->chan;
int ret;
if (!chan || !cookie) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
index dada43d..e517268 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
@@ -1128,11 +1128,12 @@ mt7615_stop_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
static int mt7615_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct mt7615_phy *phy = mt7615_hw_phy(hw);
+ struct ieee80211_channel *chan = chandef->chan;
int err;
if (test_and_set_bit(MT76_STATE_ROC, &phy->mt76->state))
diff --git a/drivers/net/wireless/microchip/wilc1000/cfg80211.c b/drivers/net/wireless/microchip/wilc1000/cfg80211.c
index 96973ec..75e097b 100644
--- a/drivers/net/wireless/microchip/wilc1000/cfg80211.c
+++ b/drivers/net/wireless/microchip/wilc1000/cfg80211.c
@@ -1060,12 +1060,13 @@ static void wilc_wfi_remain_on_channel_expired(void *data, u64 cookie)
static int remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
int ret = 0;
struct wilc_vif *vif = netdev_priv(wdev->netdev);
struct wilc_priv *priv = &vif->priv;
+ struct ieee80211_channel *chan = chandef->chan;
u64 id;
if (wdev->iftype == NL80211_IFTYPE_AP) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index b66975f..0284676 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -1788,11 +1788,12 @@ void rsi_roc_timeout(struct timer_list *t)
}
static int rsi_mac80211_roc(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- struct ieee80211_channel *chan, int duration,
+ struct cfg80211_chan_def *chandef, int duration,
enum ieee80211_roc_type type)
{
struct rsi_hw *adapter = (struct rsi_hw *)hw->priv;
struct rsi_common *common = (struct rsi_common *)adapter->priv;
+ struct ieee80211_channel *chan = chandef->chan;
int status = 0;
rsi_dbg(INFO_ZONE, "***** Remain on channel *****\n");
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 5669f17..48f2d42 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -5640,13 +5640,14 @@ static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
struct wl1271 *wl = hw->priv;
int channel, active_roc, ret = 0;
+ struct ieee80211_channel *chan = chandef->chan;
channel = ieee80211_frequency_to_channel(chan->center_freq);
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 62dd842..c0a3146 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4181,7 +4181,7 @@ struct cfg80211_ops {
int (*remain_on_channel)(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
u64 *cookie);
int (*cancel_remain_on_channel)(struct wiphy *wiphy,
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index af0fc13..13bbab7 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -4107,7 +4107,7 @@ struct ieee80211_ops {
int (*remain_on_channel)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type);
int (*cancel_remain_on_channel)(struct ieee80211_hw *hw,
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index cd3731c..dff861c 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -675,7 +675,7 @@ static inline int drv_get_antenna(struct ieee80211_local *local,
static inline int drv_remain_on_channel(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
enum ieee80211_roc_type type)
{
@@ -683,9 +683,9 @@ static inline int drv_remain_on_channel(struct ieee80211_local *local,
might_sleep();
- trace_drv_remain_on_channel(local, sdata, chan, duration, type);
+ trace_drv_remain_on_channel(local, sdata, chandef, duration, type);
ret = local->ops->remain_on_channel(&local->hw, &sdata->vif,
- chan, duration, type);
+ chandef, duration, type);
trace_drv_return_int(local, ret);
return ret;
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 159af6c..8c2a8a8 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -337,7 +337,7 @@ struct ieee80211_roc_work {
struct ieee80211_sub_if_data *sdata;
- struct ieee80211_channel *chan;
+ struct cfg80211_chan_def chandef;
bool started, abort, hw_begun, notified;
bool on_channel;
@@ -1886,7 +1886,7 @@ void ieee80211_start_next_roc(struct ieee80211_local *local);
void ieee80211_roc_purge(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata);
int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie);
int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev, u64 cookie);
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
index 853c9a3..4e1d010 100644
--- a/net/mac80211/offchannel.c
+++ b/net/mac80211/offchannel.c
@@ -178,12 +178,13 @@ static void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc)
if (!roc->mgmt_tx_cookie)
cfg80211_remain_on_channel_expired(&roc->sdata->wdev,
- roc->cookie, roc->chan,
+ roc->cookie,
+ roc->chandef.chan,
GFP_KERNEL);
else
cfg80211_tx_mgmt_expired(&roc->sdata->wdev,
roc->mgmt_tx_cookie,
- roc->chan, GFP_KERNEL);
+ roc->chandef.chan, GFP_KERNEL);
list_del(&roc->list);
kfree(roc);
@@ -211,6 +212,7 @@ static unsigned long ieee80211_end_finished_rocs(struct ieee80211_local *local,
* ROC session before the actual requested time. In such a case
* end the ROC session (disregarding the remaining time).
*/
+
if (roc->abort || roc->hw_begun || remaining <= 0)
ieee80211_roc_notify_destroy(roc);
else
@@ -235,21 +237,24 @@ static bool ieee80211_recalc_sw_work(struct ieee80211_local *local,
static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc,
unsigned long start_time)
{
+ enum nl80211_band band;
+
if (WARN_ON(roc->notified))
return;
+ band = roc->chandef.chan->band;
roc->start_time = start_time;
roc->started = true;
if (roc->mgmt_tx_cookie) {
if (!WARN_ON(!roc->frame)) {
ieee80211_tx_skb_tid_band(roc->sdata, roc->frame, 7,
- roc->chan->band);
+ band);
roc->frame = NULL;
}
} else {
cfg80211_ready_on_channel(&roc->sdata->wdev, roc->cookie,
- roc->chan, roc->req_duration,
+ roc->chandef.chan, roc->req_duration,
GFP_KERNEL);
}
@@ -311,7 +316,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
list_for_each_entry(tmp, &local->roc_list, list) {
if (tmp == roc)
continue;
- if (tmp->sdata != roc->sdata || tmp->chan != roc->chan)
+ if (tmp->sdata != roc->sdata || tmp->chandef.chan != roc->chandef.chan)
break;
max_dur = max(tmp->duration, max_dur);
min_dur = min(tmp->duration, min_dur);
@@ -319,7 +324,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
}
if (local->ops->remain_on_channel) {
- int ret = drv_remain_on_channel(local, roc->sdata, roc->chan,
+ int ret = drv_remain_on_channel(local, roc->sdata,
+ &roc->chandef,
max_dur, type);
if (ret) {
@@ -331,7 +337,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
*/
list_for_each_entry(tmp, &local->roc_list, list) {
if (tmp->sdata != roc->sdata ||
- tmp->chan != roc->chan)
+ tmp->chandef.chan != roc->chandef.chan)
break;
tmp->started = true;
tmp->abort = true;
@@ -342,7 +348,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
/* we'll notify about the start once the HW calls back */
list_for_each_entry(tmp, &local->roc_list, list) {
- if (tmp->sdata != roc->sdata || tmp->chan != roc->chan)
+ if (tmp->sdata != roc->sdata ||
+ tmp->chandef.chan != roc->chandef.chan)
break;
tmp->started = true;
}
@@ -352,7 +359,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
* treat it as though the ROC operation started properly, so
* other ROC operations won't interfere with this one.
*/
- roc->on_channel = roc->chan == local->_oper_chandef.chan &&
+ roc->on_channel = roc->chandef.chan == local->_oper_chandef.chan &&
local->_oper_chandef.width != NL80211_CHAN_WIDTH_5 &&
local->_oper_chandef.width != NL80211_CHAN_WIDTH_10;
@@ -362,7 +369,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
if (!roc->on_channel) {
ieee80211_offchannel_stop_vifs(local);
- local->tmp_channel = roc->chan;
+ local->tmp_channel = roc->chandef.chan;
ieee80211_hw_config(local, 0);
}
@@ -371,7 +378,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
/* tell userspace or send frame(s) */
list_for_each_entry(tmp, &local->roc_list, list) {
- if (tmp->sdata != roc->sdata || tmp->chan != roc->chan)
+ if (tmp->sdata != roc->sdata ||
+ tmp->chandef.chan != roc->chandef.chan)
break;
tmp->on_channel = roc->on_channel;
@@ -526,12 +534,13 @@ ieee80211_coalesce_hw_started_roc(struct ieee80211_local *local,
static int ieee80211_start_roc_work(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie,
struct sk_buff *txskb,
enum ieee80211_roc_type type)
{
struct ieee80211_roc_work *roc, *tmp;
+ struct ieee80211_channel *channel = chandef->chan;
bool queued = false, combine_started = true;
int ret;
@@ -560,7 +569,10 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
if (!duration)
duration = 10;
- roc->chan = channel;
+ roc->chandef.chan = chandef->chan;
+ roc->chandef.width = chandef->width;
+ roc->chandef.center_freq1 = chandef->center_freq1;
+ roc->chandef.center_freq2 = chandef->center_freq2;
roc->duration = duration;
roc->req_duration = duration;
roc->frame = txskb;
@@ -590,7 +602,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
/* otherwise actually kick it off here
* (for error handling)
*/
- ret = drv_remain_on_channel(local, sdata, channel,
+ ret = drv_remain_on_channel(local, sdata, chandef,
duration, type);
if (ret) {
kfree(roc);
@@ -606,7 +618,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
/* otherwise handle queueing */
list_for_each_entry(tmp, &local->roc_list, list) {
- if (tmp->chan != channel || tmp->sdata != sdata)
+ if (tmp->chandef.chan != channel || tmp->sdata != sdata)
continue;
/*
@@ -668,7 +680,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
}
int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
@@ -676,9 +688,11 @@ int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
int ret;
mutex_lock(&local->mtx);
- ret = ieee80211_start_roc_work(local, sdata, chan,
- duration, cookie, NULL,
- IEEE80211_ROC_TYPE_NORMAL);
+ if (chandef) {
+ ret = ieee80211_start_roc_work(local, sdata, chandef,
+ duration, cookie, NULL,
+ IEEE80211_ROC_TYPE_NORMAL);
+ }
mutex_unlock(&local->mtx);
return ret;
@@ -766,6 +780,7 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
{
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
struct ieee80211_local *local = sdata->local;
+ struct cfg80211_chan_def chandef;
struct sk_buff *skb;
struct sta_info *sta;
const struct ieee80211_mgmt *mgmt = (void *)params->buf;
@@ -935,8 +950,9 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
IEEE80211_SKB_CB(skb)->hw_queue =
local->hw.offchannel_tx_hw_queue;
+ chandef.chan = params->chan;
/* This will handle all kinds of coalescing and immediate TX */
- ret = ieee80211_start_roc_work(local, sdata, params->chan,
+ ret = ieee80211_start_roc_work(local, sdata, &chandef,
params->wait, cookie, skb,
IEEE80211_ROC_TYPE_MGMT_TX);
if (ret)
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 9e8381b..2a18c85 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1226,17 +1226,17 @@ TRACE_EVENT(drv_get_antenna,
TRACE_EVENT(drv_remain_on_channel,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
enum ieee80211_roc_type type),
- TP_ARGS(local, sdata, chan, duration, type),
+ TP_ARGS(local, sdata, chandef, duration, type),
TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
+ CHANDEF_ENTRY
__field(int, center_freq)
- __field(int, freq_offset)
__field(unsigned int, duration)
__field(u32, type)
),
@@ -1244,8 +1244,9 @@ TRACE_EVENT(drv_remain_on_channel,
TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
- __entry->center_freq = chan->center_freq;
- __entry->freq_offset = chan->freq_offset;
+ CHANDEF_ASSIGN(chandef);
+ __entry->center_freq = chandef->chan->center_freq;
+ __entry->freq_offset = chandef->chan->freq_offset;
__entry->duration = duration;
__entry->type = type;
),
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index bf7cd47..c71c24c 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -11282,7 +11282,7 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
goto free_msg;
}
- err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
+ err = rdev_remain_on_channel(rdev, wdev, &chandef,
duration, &cookie);
if (err)
diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
index ce6bf21..07bc258 100644
--- a/net/wireless/rdev-ops.h
+++ b/net/wireless/rdev-ops.h
@@ -710,12 +710,12 @@ static inline int rdev_flush_pmksa(struct cfg80211_registered_device *rdev,
static inline int
rdev_remain_on_channel(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
int ret;
- trace_rdev_remain_on_channel(&rdev->wiphy, wdev, chan, duration);
- ret = rdev->ops->remain_on_channel(&rdev->wiphy, wdev, chan,
+ trace_rdev_remain_on_channel(&rdev->wiphy, wdev, chandef, duration);
+ ret = rdev->ops->remain_on_channel(&rdev->wiphy, wdev, chandef,
duration, cookie);
trace_rdev_return_int_cookie(&rdev->wiphy, ret, *cookie);
return ret;
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 19b78d4..26b8f70 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1900,9 +1900,9 @@ DEFINE_EVENT(rdev_pmksa, rdev_del_pmksa,
TRACE_EVENT(rdev_remain_on_channel,
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration),
- TP_ARGS(wiphy, wdev, chan, duration),
+ TP_ARGS(wiphy, wdev, chandef, duration),
TP_STRUCT__entry(
WIPHY_ENTRY
WDEV_ENTRY
@@ -1912,7 +1912,7 @@ TRACE_EVENT(rdev_remain_on_channel,
TP_fast_assign(
WIPHY_ASSIGN;
WDEV_ASSIGN;
- CHAN_ASSIGN(chan);
+ CHAN_ASSIGN(chandef->chan);
__entry->duration = duration;
),
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", " CHAN_PR_FMT ", duration: %u",
--
2.7.4
--
ath11k mailing list
ath11k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath11k
WARNING: multiple messages have this Message-ID (diff)
From: P Praneesh <ppranees@codeaurora.org>
To: ath11k@lists.infradead.org, johannes@sipsolutions.net
Cc: linux-wireless@vger.kernel.org,
P Praneesh <ppranees@codeaurora.org>,
Sathishkumar Muruganandam <murugana@codeaurora.org>
Subject: [PATCH v3 1/3] nl80211: Extended ROC support for 40-80 MHz bandwidth
Date: Fri, 22 Oct 2021 18:07:05 +0530 [thread overview]
Message-ID: <1634906227-22028-2-git-send-email-ppranees@codeaurora.org> (raw)
In-Reply-To: <1634906227-22028-1-git-send-email-ppranees@codeaurora.org>
Replace struct ieee80211_channel with struct cfg80211_chan_def
in remain on channel apis, because the channel width information is needed
to handle centre frequency of 80MHz, and it is available in
cfg80211_chan_def.
Co-developed-by: Sathishkumar Muruganandam <murugana@codeaurora.org>
Signed-off-by: Sathishkumar Muruganandam <murugana@codeaurora.org>
Signed-off-by: P Praneesh <ppranees@codeaurora.org>
---
drivers/net/wireless/ath/ath10k/mac.c | 3 +-
drivers/net/wireless/ath/ath6kl/cfg80211.c | 3 +-
drivers/net/wireless/ath/ath9k/main.c | 4 +-
drivers/net/wireless/ath/wil6210/cfg80211.c | 3 +-
.../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 3 +-
.../net/wireless/broadcom/brcm80211/brcmfmac/p2p.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +-
drivers/net/wireless/mac80211_hwsim.c | 3 +-
drivers/net/wireless/marvell/mwifiex/cfg80211.c | 3 +-
drivers/net/wireless/mediatek/mt76/mt7615/main.c | 3 +-
drivers/net/wireless/microchip/wilc1000/cfg80211.c | 3 +-
drivers/net/wireless/rsi/rsi_91x_mac80211.c | 3 +-
drivers/net/wireless/ti/wlcore/main.c | 3 +-
include/net/cfg80211.h | 2 +-
include/net/mac80211.h | 2 +-
net/mac80211/driver-ops.h | 6 +--
net/mac80211/ieee80211_i.h | 4 +-
net/mac80211/offchannel.c | 56 ++++++++++++++--------
net/mac80211/trace.h | 11 +++--
net/wireless/nl80211.c | 2 +-
net/wireless/rdev-ops.h | 6 +--
net/wireless/trace.h | 6 +--
22 files changed, 82 insertions(+), 52 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index c272b29..e652e21 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -7805,12 +7805,13 @@ static int ath10k_conf_tx(struct ieee80211_hw *hw,
static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = (void *)vif->drv_priv;
+ struct ieee80211_channel *chan = chandef->chan;
struct wmi_start_scan_arg arg;
int ret = 0;
u32 scan_time_msec;
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index fefdc67..4a2c132 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -3023,12 +3023,13 @@ static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
static int ath6kl_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
u64 *cookie)
{
struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
struct ath6kl *ar = ath6kl_priv(vif->ndev);
+ struct ieee80211_channel *chan = chandef->chan;
u32 id;
/* TODO: if already pending or ongoing remain-on-channel,
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 1398315..8f0fc64 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -2466,11 +2466,13 @@ static void ath9k_cancel_hw_scan(struct ieee80211_hw *hw,
static int ath9k_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan, int duration,
+ struct cfg80211_chan_def *chandef,
+ int duration,
enum ieee80211_roc_type type)
{
struct ath_softc *sc = hw->priv;
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+ struct ieee80211_channel *chan = chandef->chan;
int ret = 0;
mutex_lock(&sc->mutex);
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
index 1ff2679..9ed172f 100644
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
@@ -1734,11 +1734,12 @@ static int wil_cfg80211_set_default_key(struct wiphy *wiphy,
static int wil_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
u64 *cookie)
{
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+ struct ieee80211_channel *chan = chandef->chan;
int rc;
wil_dbg_misc(wil,
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
index 9ac0d8c..e9cd84e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
@@ -972,10 +972,11 @@ brcmf_p2p_discover_listen(struct brcmf_p2p_info *p2p, u16 channel, u32 duration)
* @cookie: cookie.
*/
int brcmf_p2p_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+ struct ieee80211_channel *channel = chandef->chan;
struct brcmf_p2p_info *p2p = &cfg->p2p;
s32 err;
u16 channel_nr;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
index d2ecee5..1646e6e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
@@ -156,7 +156,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wiphy,
struct cfg80211_scan_request *request,
struct brcmf_cfg80211_vif *vif);
int brcmf_p2p_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie);
int brcmf_p2p_notify_listen_complete(struct brcmf_if *ifp,
const struct brcmf_event_msg *e,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 70ebecb..09a775a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3792,7 +3792,7 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
static int iwl_mvm_roc(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandefcfg,
int duration,
enum ieee80211_roc_type type)
{
@@ -3800,6 +3800,7 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
struct cfg80211_chan_def chandef;
struct iwl_mvm_phy_ctxt *phy_ctxt;
+ struct ieee80211_channel *channel = chandefcfg->chan;
bool band_change_removal;
int ret, i;
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index ffa894f..9692b58 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -2475,11 +2475,12 @@ static void hw_roc_done(struct work_struct *work)
static int mac80211_hwsim_roc(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct mac80211_hwsim_data *hwsim = hw->priv;
+ struct ieee80211_channel *chan = chandef->chan;
mutex_lock(&hwsim->mutex);
if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) {
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index 0961f4a..aee8338 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -292,10 +292,11 @@ mwifiex_cfg80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
static int
mwifiex_cfg80211_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
+ struct ieee80211_channel *chan = chandef->chan;
int ret;
if (!chan || !cookie) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
index dada43d..e517268 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
@@ -1128,11 +1128,12 @@ mt7615_stop_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
static int mt7615_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct mt7615_phy *phy = mt7615_hw_phy(hw);
+ struct ieee80211_channel *chan = chandef->chan;
int err;
if (test_and_set_bit(MT76_STATE_ROC, &phy->mt76->state))
diff --git a/drivers/net/wireless/microchip/wilc1000/cfg80211.c b/drivers/net/wireless/microchip/wilc1000/cfg80211.c
index 96973ec..75e097b 100644
--- a/drivers/net/wireless/microchip/wilc1000/cfg80211.c
+++ b/drivers/net/wireless/microchip/wilc1000/cfg80211.c
@@ -1060,12 +1060,13 @@ static void wilc_wfi_remain_on_channel_expired(void *data, u64 cookie)
static int remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
int ret = 0;
struct wilc_vif *vif = netdev_priv(wdev->netdev);
struct wilc_priv *priv = &vif->priv;
+ struct ieee80211_channel *chan = chandef->chan;
u64 id;
if (wdev->iftype == NL80211_IFTYPE_AP) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index b66975f..0284676 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -1788,11 +1788,12 @@ void rsi_roc_timeout(struct timer_list *t)
}
static int rsi_mac80211_roc(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- struct ieee80211_channel *chan, int duration,
+ struct cfg80211_chan_def *chandef, int duration,
enum ieee80211_roc_type type)
{
struct rsi_hw *adapter = (struct rsi_hw *)hw->priv;
struct rsi_common *common = (struct rsi_common *)adapter->priv;
+ struct ieee80211_channel *chan = chandef->chan;
int status = 0;
rsi_dbg(INFO_ZONE, "***** Remain on channel *****\n");
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 5669f17..48f2d42 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -5640,13 +5640,14 @@ static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type)
{
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
struct wl1271 *wl = hw->priv;
int channel, active_roc, ret = 0;
+ struct ieee80211_channel *chan = chandef->chan;
channel = ieee80211_frequency_to_channel(chan->center_freq);
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 62dd842..c0a3146 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4181,7 +4181,7 @@ struct cfg80211_ops {
int (*remain_on_channel)(struct wiphy *wiphy,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
u64 *cookie);
int (*cancel_remain_on_channel)(struct wiphy *wiphy,
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index af0fc13..13bbab7 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -4107,7 +4107,7 @@ struct ieee80211_ops {
int (*remain_on_channel)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
int duration,
enum ieee80211_roc_type type);
int (*cancel_remain_on_channel)(struct ieee80211_hw *hw,
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index cd3731c..dff861c 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -675,7 +675,7 @@ static inline int drv_get_antenna(struct ieee80211_local *local,
static inline int drv_remain_on_channel(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
enum ieee80211_roc_type type)
{
@@ -683,9 +683,9 @@ static inline int drv_remain_on_channel(struct ieee80211_local *local,
might_sleep();
- trace_drv_remain_on_channel(local, sdata, chan, duration, type);
+ trace_drv_remain_on_channel(local, sdata, chandef, duration, type);
ret = local->ops->remain_on_channel(&local->hw, &sdata->vif,
- chan, duration, type);
+ chandef, duration, type);
trace_drv_return_int(local, ret);
return ret;
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 159af6c..8c2a8a8 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -337,7 +337,7 @@ struct ieee80211_roc_work {
struct ieee80211_sub_if_data *sdata;
- struct ieee80211_channel *chan;
+ struct cfg80211_chan_def chandef;
bool started, abort, hw_begun, notified;
bool on_channel;
@@ -1886,7 +1886,7 @@ void ieee80211_start_next_roc(struct ieee80211_local *local);
void ieee80211_roc_purge(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata);
int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie);
int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
struct wireless_dev *wdev, u64 cookie);
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
index 853c9a3..4e1d010 100644
--- a/net/mac80211/offchannel.c
+++ b/net/mac80211/offchannel.c
@@ -178,12 +178,13 @@ static void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc)
if (!roc->mgmt_tx_cookie)
cfg80211_remain_on_channel_expired(&roc->sdata->wdev,
- roc->cookie, roc->chan,
+ roc->cookie,
+ roc->chandef.chan,
GFP_KERNEL);
else
cfg80211_tx_mgmt_expired(&roc->sdata->wdev,
roc->mgmt_tx_cookie,
- roc->chan, GFP_KERNEL);
+ roc->chandef.chan, GFP_KERNEL);
list_del(&roc->list);
kfree(roc);
@@ -211,6 +212,7 @@ static unsigned long ieee80211_end_finished_rocs(struct ieee80211_local *local,
* ROC session before the actual requested time. In such a case
* end the ROC session (disregarding the remaining time).
*/
+
if (roc->abort || roc->hw_begun || remaining <= 0)
ieee80211_roc_notify_destroy(roc);
else
@@ -235,21 +237,24 @@ static bool ieee80211_recalc_sw_work(struct ieee80211_local *local,
static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc,
unsigned long start_time)
{
+ enum nl80211_band band;
+
if (WARN_ON(roc->notified))
return;
+ band = roc->chandef.chan->band;
roc->start_time = start_time;
roc->started = true;
if (roc->mgmt_tx_cookie) {
if (!WARN_ON(!roc->frame)) {
ieee80211_tx_skb_tid_band(roc->sdata, roc->frame, 7,
- roc->chan->band);
+ band);
roc->frame = NULL;
}
} else {
cfg80211_ready_on_channel(&roc->sdata->wdev, roc->cookie,
- roc->chan, roc->req_duration,
+ roc->chandef.chan, roc->req_duration,
GFP_KERNEL);
}
@@ -311,7 +316,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
list_for_each_entry(tmp, &local->roc_list, list) {
if (tmp == roc)
continue;
- if (tmp->sdata != roc->sdata || tmp->chan != roc->chan)
+ if (tmp->sdata != roc->sdata || tmp->chandef.chan != roc->chandef.chan)
break;
max_dur = max(tmp->duration, max_dur);
min_dur = min(tmp->duration, min_dur);
@@ -319,7 +324,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
}
if (local->ops->remain_on_channel) {
- int ret = drv_remain_on_channel(local, roc->sdata, roc->chan,
+ int ret = drv_remain_on_channel(local, roc->sdata,
+ &roc->chandef,
max_dur, type);
if (ret) {
@@ -331,7 +337,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
*/
list_for_each_entry(tmp, &local->roc_list, list) {
if (tmp->sdata != roc->sdata ||
- tmp->chan != roc->chan)
+ tmp->chandef.chan != roc->chandef.chan)
break;
tmp->started = true;
tmp->abort = true;
@@ -342,7 +348,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
/* we'll notify about the start once the HW calls back */
list_for_each_entry(tmp, &local->roc_list, list) {
- if (tmp->sdata != roc->sdata || tmp->chan != roc->chan)
+ if (tmp->sdata != roc->sdata ||
+ tmp->chandef.chan != roc->chandef.chan)
break;
tmp->started = true;
}
@@ -352,7 +359,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
* treat it as though the ROC operation started properly, so
* other ROC operations won't interfere with this one.
*/
- roc->on_channel = roc->chan == local->_oper_chandef.chan &&
+ roc->on_channel = roc->chandef.chan == local->_oper_chandef.chan &&
local->_oper_chandef.width != NL80211_CHAN_WIDTH_5 &&
local->_oper_chandef.width != NL80211_CHAN_WIDTH_10;
@@ -362,7 +369,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
if (!roc->on_channel) {
ieee80211_offchannel_stop_vifs(local);
- local->tmp_channel = roc->chan;
+ local->tmp_channel = roc->chandef.chan;
ieee80211_hw_config(local, 0);
}
@@ -371,7 +378,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)
/* tell userspace or send frame(s) */
list_for_each_entry(tmp, &local->roc_list, list) {
- if (tmp->sdata != roc->sdata || tmp->chan != roc->chan)
+ if (tmp->sdata != roc->sdata ||
+ tmp->chandef.chan != roc->chandef.chan)
break;
tmp->on_channel = roc->on_channel;
@@ -526,12 +534,13 @@ ieee80211_coalesce_hw_started_roc(struct ieee80211_local *local,
static int ieee80211_start_roc_work(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- struct ieee80211_channel *channel,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie,
struct sk_buff *txskb,
enum ieee80211_roc_type type)
{
struct ieee80211_roc_work *roc, *tmp;
+ struct ieee80211_channel *channel = chandef->chan;
bool queued = false, combine_started = true;
int ret;
@@ -560,7 +569,10 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
if (!duration)
duration = 10;
- roc->chan = channel;
+ roc->chandef.chan = chandef->chan;
+ roc->chandef.width = chandef->width;
+ roc->chandef.center_freq1 = chandef->center_freq1;
+ roc->chandef.center_freq2 = chandef->center_freq2;
roc->duration = duration;
roc->req_duration = duration;
roc->frame = txskb;
@@ -590,7 +602,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
/* otherwise actually kick it off here
* (for error handling)
*/
- ret = drv_remain_on_channel(local, sdata, channel,
+ ret = drv_remain_on_channel(local, sdata, chandef,
duration, type);
if (ret) {
kfree(roc);
@@ -606,7 +618,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
/* otherwise handle queueing */
list_for_each_entry(tmp, &local->roc_list, list) {
- if (tmp->chan != channel || tmp->sdata != sdata)
+ if (tmp->chandef.chan != channel || tmp->sdata != sdata)
continue;
/*
@@ -668,7 +680,7 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
}
int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
@@ -676,9 +688,11 @@ int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
int ret;
mutex_lock(&local->mtx);
- ret = ieee80211_start_roc_work(local, sdata, chan,
- duration, cookie, NULL,
- IEEE80211_ROC_TYPE_NORMAL);
+ if (chandef) {
+ ret = ieee80211_start_roc_work(local, sdata, chandef,
+ duration, cookie, NULL,
+ IEEE80211_ROC_TYPE_NORMAL);
+ }
mutex_unlock(&local->mtx);
return ret;
@@ -766,6 +780,7 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
{
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
struct ieee80211_local *local = sdata->local;
+ struct cfg80211_chan_def chandef;
struct sk_buff *skb;
struct sta_info *sta;
const struct ieee80211_mgmt *mgmt = (void *)params->buf;
@@ -935,8 +950,9 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
IEEE80211_SKB_CB(skb)->hw_queue =
local->hw.offchannel_tx_hw_queue;
+ chandef.chan = params->chan;
/* This will handle all kinds of coalescing and immediate TX */
- ret = ieee80211_start_roc_work(local, sdata, params->chan,
+ ret = ieee80211_start_roc_work(local, sdata, &chandef,
params->wait, cookie, skb,
IEEE80211_ROC_TYPE_MGMT_TX);
if (ret)
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 9e8381b..2a18c85 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1226,17 +1226,17 @@ TRACE_EVENT(drv_get_antenna,
TRACE_EVENT(drv_remain_on_channel,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration,
enum ieee80211_roc_type type),
- TP_ARGS(local, sdata, chan, duration, type),
+ TP_ARGS(local, sdata, chandef, duration, type),
TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
+ CHANDEF_ENTRY
__field(int, center_freq)
- __field(int, freq_offset)
__field(unsigned int, duration)
__field(u32, type)
),
@@ -1244,8 +1244,9 @@ TRACE_EVENT(drv_remain_on_channel,
TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
- __entry->center_freq = chan->center_freq;
- __entry->freq_offset = chan->freq_offset;
+ CHANDEF_ASSIGN(chandef);
+ __entry->center_freq = chandef->chan->center_freq;
+ __entry->freq_offset = chandef->chan->freq_offset;
__entry->duration = duration;
__entry->type = type;
),
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index bf7cd47..c71c24c 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -11282,7 +11282,7 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
goto free_msg;
}
- err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
+ err = rdev_remain_on_channel(rdev, wdev, &chandef,
duration, &cookie);
if (err)
diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
index ce6bf21..07bc258 100644
--- a/net/wireless/rdev-ops.h
+++ b/net/wireless/rdev-ops.h
@@ -710,12 +710,12 @@ static inline int rdev_flush_pmksa(struct cfg80211_registered_device *rdev,
static inline int
rdev_remain_on_channel(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration, u64 *cookie)
{
int ret;
- trace_rdev_remain_on_channel(&rdev->wiphy, wdev, chan, duration);
- ret = rdev->ops->remain_on_channel(&rdev->wiphy, wdev, chan,
+ trace_rdev_remain_on_channel(&rdev->wiphy, wdev, chandef, duration);
+ ret = rdev->ops->remain_on_channel(&rdev->wiphy, wdev, chandef,
duration, cookie);
trace_rdev_return_int_cookie(&rdev->wiphy, ret, *cookie);
return ret;
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 19b78d4..26b8f70 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1900,9 +1900,9 @@ DEFINE_EVENT(rdev_pmksa, rdev_del_pmksa,
TRACE_EVENT(rdev_remain_on_channel,
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev,
- struct ieee80211_channel *chan,
+ struct cfg80211_chan_def *chandef,
unsigned int duration),
- TP_ARGS(wiphy, wdev, chan, duration),
+ TP_ARGS(wiphy, wdev, chandef, duration),
TP_STRUCT__entry(
WIPHY_ENTRY
WDEV_ENTRY
@@ -1912,7 +1912,7 @@ TRACE_EVENT(rdev_remain_on_channel,
TP_fast_assign(
WIPHY_ASSIGN;
WDEV_ASSIGN;
- CHAN_ASSIGN(chan);
+ CHAN_ASSIGN(chandef->chan);
__entry->duration = duration;
),
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", " CHAN_PR_FMT ", duration: %u",
--
2.7.4
next prev parent reply other threads:[~2021-10-22 12:39 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-22 12:37 [PATCH v3 0/3] mac80211: Add extended ROC support for 40-80 MHz bandwidth P Praneesh
2021-10-22 12:37 ` P Praneesh
2021-10-22 12:37 ` P Praneesh [this message]
2021-10-22 12:37 ` [PATCH v3 1/3] nl80211: Extended " P Praneesh
2021-10-25 19:59 ` Johannes Berg
2021-10-25 19:59 ` Johannes Berg
2021-10-22 12:37 ` [PATCH v3 2/3] ath11k: Refactor update channel list function P Praneesh
2021-10-22 12:37 ` P Praneesh
2021-11-12 8:31 ` Kalle Valo
2021-11-12 8:31 ` Kalle Valo
2021-11-24 3:50 ` Wen Gong
2021-11-24 3:50 ` Wen Gong
2021-11-24 7:39 ` Kalle Valo
2021-11-24 7:39 ` Kalle Valo
2021-11-24 7:48 ` Wen Gong
2021-11-24 7:48 ` Wen Gong
2021-11-24 7:56 ` Kalle Valo
2021-11-24 7:56 ` Kalle Valo
2021-10-22 12:37 ` [PATCH v3 2/3] ath11k: Add ROC support for wide band scan P Praneesh
2021-10-22 12:37 ` P Praneesh
2021-10-25 20:10 ` Johannes Berg
2021-10-25 20:10 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1634906227-22028-2-git-send-email-ppranees@codeaurora.org \
--to=ppranees@codeaurora.org \
--cc=ath11k@lists.infradead.org \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=murugana@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.