Skip to contentSkip to conversation

mac80211: Add extended ROC support for 40-80 MHz bandwidth

PATCH In review P Praneesh 4 participants 11 messages Oct 22, 2021 – Nov 24, 2021

Subsystems (16)
lore
Share & tools
lore

P Praneesh

author
#0 lore raw

v3 cover mac80211: Add extended ROC support for 40-80 MHz bandwidth

This patch add extended roc support for 40 and 80 Mhz bandwidth. It helps to handle remain on channel for wide band scan in ath11k.
---
v3:
- addressed Johannes comment to use ROC instead of SCAN command and changed cover letter title from 'add Wide Band Scan support' to 'mac80211: Add extended ROC support for 40-80 MHz bandwidth'
v2:
- updated message on cover letter.
---

P Praneesh (3):
nl80211: Extended ROC support for 40-80 MHz bandwidth
ath11k: Refactor update channel list function
ath11k: Add ROC support for wide band scan

 drivers/net/wireless/ath/ath10k/mac.c              |   3 +-
 drivers/net/wireless/ath/ath11k/core.c             |   1 +
 drivers/net/wireless/ath/ath11k/mac.c              | 203 ++++++++++++++++++---
 drivers/net/wireless/ath/ath11k/reg.c              |  99 +---------
 drivers/net/wireless/ath/ath11k/reg.h              |   1 -
 drivers/net/wireless/ath/ath11k/wmi.c              | 160 +++++++++++++++-
 drivers/net/wireless/ath/ath11k/wmi.h              |  31 +++-
 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 +-
 28 files changed, 452 insertions(+), 177 deletions(-)
Signature · 1 line
2.7.4
author
#1 lore raw

PATCH v3 1/3 nl80211: Extended ROC support for 40-80 MHz bandwidth

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.

---
 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(-)
drivers/net/wireless/ath/ath10k/mac.c +2 -1
index c272b29..e652e21 100644
@@ -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;
drivers/net/wireless/ath/ath6kl/cfg80211.c +2 -1
index fefdc67..4a2c132 100644
@@ -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,
drivers/net/wireless/ath/ath9k/main.c +3 -1
index 1398315..8f0fc64 100644
@@ -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);
drivers/net/wireless/ath/wil6210/cfg80211.c +2 -1
index 1ff2679..9ed172f 100644
@@ -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,
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +2 -1
index 9ac0d8c..e9cd84e 100644
@@ -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;
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h +1 -1
index d2ecee5..1646e6e 100644
@@ -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,
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +2 -1
index 70ebecb..09a775a 100644
@@ -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;
 
drivers/net/wireless/mac80211_hwsim.c +2 -1
index ffa894f..9692b58 100644
@@ -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)) {
drivers/net/wireless/marvell/mwifiex/cfg80211.c +2 -1
index 0961f4a..aee8338 100644
@@ -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) {
drivers/net/wireless/mediatek/mt76/mt7615/main.c +2 -1
index dada43d..e517268 100644
@@ -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))
drivers/net/wireless/microchip/wilc1000/cfg80211.c +2 -1
index 96973ec..75e097b 100644
@@ -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) {
drivers/net/wireless/rsi/rsi_91x_mac80211.c +2 -1
index b66975f..0284676 100644
@@ -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");
drivers/net/wireless/ti/wlcore/main.c +2 -1
index 5669f17..48f2d42 100644
@@ -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);
 
include/net/cfg80211.h +1 -1
index 62dd842..c0a3146 100644
@@ -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,
include/net/mac80211.h +1 -1
index af0fc13..13bbab7 100644
@@ -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,
net/mac80211/driver-ops.h +3 -3
index cd3731c..dff861c 100644
@@ -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;
net/mac80211/ieee80211_i.h +2 -2
index 159af6c..8c2a8a8 100644
@@ -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);
net/mac80211/offchannel.c +36 -20

187 lines not on this page · raw message

net/mac80211/trace.h +6 -5
index 9e8381b..2a18c85 100644
@@ -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;
 	),
net/wireless/nl80211.c +1 -1
index bf7cd47..c71c24c 100644
@@ -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)
net/wireless/rdev-ops.h +3 -3
index ce6bf21..07bc258 100644
@@ -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;
net/wireless/trace.h +3 -3
index 19b78d4..26b8f70 100644
@@ -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",
Signature · 1 line
2.7.4
maintainer
#2 lore raw

Re: [PATCH v3 1/3] nl80211: Extended ROC support for 40-80 MHz bandwidth

Quoted 12 lines · P Praneesh
include/net/cfg80211.h +0 -0
@@ -4181,7 +4181,7 @@ struct cfg80211_ops {

  int (*remain_on_channel)(struct wiphy *wiphy,
  struct wireless_dev *wdev,

include/net/cfg80211.h +1 -1
-				     struct ieee80211_channel *chan,
+				     struct cfg80211_chan_def *chandef,
Quoted 2 lines

  unsigned int duration, u64 *cookie);

I find it's odd you update this, but

Quoted 7 lines

  if (!roc->mgmt_tx_cookie) cfg80211_remain_on_channel_expired(&roc->sdata->wdev,

include/net/cfg80211.h +2 -1
-						   roc->cookie, roc->chan,
+						   roc->cookie,
+						   roc->chandef.chan,

  GFP_KERNEL);

not the reporting API? Would seem better to pass back the whole thing?

include/net/cfg80211.h static unsigned long ieee80211_end_finished_rocs(struct ieee80211_local *local, · line 217

Quoted 7 lines
include/net/cfg80211.h +1 -0
@@ -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);

spurious change?

include/net/cfg80211.h static void _ieee80211_start_next_roc(struct ieee80211_local *local) · line 320

Quoted 7 lines
include/net/cfg80211.h +1 -1
@@ -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;

This really doesn't work - you need to actually compare the chandefs for being identical or at least compatible when merging etc. happens here.

At least if we want mac80211 to support this feature (more on that later)

Quoted 7 lines
include/net/cfg80211.h +0 -0
@@ -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 ||

include/net/cfg80211.h +1 -1
-				    tmp->chan != roc->chan)
+				    tmp->chandef.chan != roc->chandef.chan)

  break;

likewise

include/net/cfg80211.h

Quoted 4 lines
include/net/cfg80211.h +4 -0
+	roc->chandef.chan = chandef->chan;
+	roc->chandef.width = chandef->width;
+	roc->chandef.center_freq1 = chandef->center_freq1;
+	roc->chandef.center_freq2 = chandef->center_freq2;

That probably should use a struct assignment - there are some more struct members you're now not setting.

include/net/cfg80211.h

Quoted 10 lines

  mutex_lock(&local->mtx);

include/net/cfg80211.h +5 -3
-	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);
+	}

No need for braces, but how would that actually be NULL?!

include/net/cfg80211.h

Quoted 2 lines
include/net/cfg80211.h +1 -0
+	chandef.chan = params->chan;

Uh, well, the other fields of a stack struct really want to be initialized too :)

include/net/cfg80211.h

Quoted 9 lines
include/net/cfg80211.h +0 -0
@@ -1244,8 +1244,9 @@ TRACE_EVENT(drv_remain_on_channel,

  TP_fast_assign(
  LOCAL_ASSIGN;
  VIF_ASSIGN;

include/net/cfg80211.h +3 -2
-		__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;

Why would we need center_freq/freq_offset if we have a whole chandef?

We're not usually taking much care with compatibility here with tracing.

Quoted 11 lines
net/wireless/nl80211.c +1 -1
@@ -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);
 
Quoted 2 lines

if (err)

Really though, the biggest issue I see with this that you added no feature advertisement, no checks for the channel even being valid, nothing?

Seems like we should have some kind of feature check, at least to reject 40/80/160/whatever bandwidths with all the existing drivers you only updated the API on, but didn't actually implement the new changes? I.e. this really needs to be opt-in somehow.

And for mac80211 we need to implement some different merge logic, etc., it seems.

johannes

Signature · 3 lines
ath11k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath11k
author
#3 lore raw

PATCH v3 2/3 ath11k: Refactor update channel list function

In reply to P Praneesh

For sending scan channel list command to firmware through wmi, remain on channel's scan request parameter needs to be updated. Add scan_req_params as an argument to the existing update_scan_chan_list to update scan request parameter through wmi. Also, rename regulatory update scan channel list to the ath11k_wmi_update_scan_chan_list since it is moved to wmi file.

---
 drivers/net/wireless/ath/ath11k/mac.c |   2 +-
 drivers/net/wireless/ath/ath11k/reg.c |  96 +-------------------------------
 drivers/net/wireless/ath/ath11k/reg.h |   1 -
 drivers/net/wireless/ath/ath11k/wmi.c | 101 ++++++++++++++++++++++++++++++++++
 drivers/net/wireless/ath/ath11k/wmi.h |   4 ++
 5 files changed, 107 insertions(+), 97 deletions(-)
drivers/net/wireless/ath/ath11k/mac.c +1 -1
index 1cc5560..fc2edef 100644
@@ -5256,7 +5256,7 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw)
 
 	/* TODO: Do we need to enable ANI? */
 
-	ath11k_reg_update_chan_list(ar);
+	ath11k_wmi_update_scan_chan_list(ar, NULL);
 
 	ar->num_started_vdevs = 0;
 	ar->num_created_vdevs = 0;
drivers/net/wireless/ath/ath11k/reg.c +1 -95

108 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/reg.h +0 -1
index 5fb9dc0..44830e6 100644
@@ -32,5 +32,4 @@ struct ieee80211_regdomain *
 ath11k_reg_build_regd(struct ath11k_base *ab,
 		      struct cur_regulatory_info *reg_info, bool intersect);
 int ath11k_regd_update(struct ath11k *ar);
-int ath11k_reg_update_chan_list(struct ath11k *ar);
 #endif
drivers/net/wireless/ath/ath11k/wmi.c +101 -0

107 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/wmi.h +4 -0
index 0584e68..aeec4e9 100644
@@ -3311,6 +3311,9 @@ struct scan_req_params {
 	u32 num_hint_bssid;
 	struct hint_short_ssid hint_s_ssid[WLAN_SCAN_MAX_HINT_S_SSID];
 	struct hint_bssid hint_bssid[WLAN_SCAN_MAX_HINT_BSSID];
+	u32 phymode;
+	u32 freq;
+	struct cfg80211_chan_def *chandef;
 };
 
 struct wmi_ssid_arg {
@@ -5378,6 +5381,7 @@ int ath11k_wmi_send_peer_delete_cmd(struct ath11k *ar,
 				    const u8 *peer_addr, u8 vdev_id);
 int ath11k_wmi_vdev_delete(struct ath11k *ar, u8 vdev_id);
 void ath11k_wmi_start_scan_init(struct ath11k *ar, struct scan_req_params *arg);
+int ath11k_wmi_update_scan_chan_list(struct ath11k *ar, struct scan_req_params *arg);
 int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar,
 				   struct scan_req_params *params);
 int ath11k_wmi_send_scan_stop_cmd(struct ath11k *ar,
Signature · 1 line
2.7.4
#4 lore raw

Re: [PATCH v3 2/3] ath11k: Refactor update channel list function

Quoted 9 lines · P Praneesh

For sending scan channel list command to firmware through wmi, remain on channel's scan request parameter needs to be updated. Add scan_req_params as an argument to the existing update_scan_chan_list to update scan request parameter through wmi. Also, rename regulatory update scan channel list to the ath11k_wmi_update_scan_chan_list since it is moved to wmi file.

Why is ath11k_reg_update_chan_list() moved to wmi.c? I couldn't figure out what's the reason for that.

2 patches set to Changes Requested.

12577691 [v3,2/3] ath11k: Refactor update channel list function 12577693 [v3,2/3] ath11k: Add ROC support for wide band scan

Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
#5 lore raw

Re: [PATCH v3 2/3] ath11k: Refactor update channel list function

In reply to P Praneesh

On 10/22/2021 8:37 PM, P Praneesh wrote:

...

Quoted 5 lines

---
...

(quoted diff) +0 -3
-			ch->maxpower = channel->max_power * 2;
-			ch->maxregpower = channel->max_reg_power * 2;
-			ch->antennamax = channel->max_antenna_gain * 2;

Review

Quoted 10 lines
(quoted diff) +6 -0
...
 
+int ath11k_wmi_update_scan_chan_list(struct ath11k *ar,
+				     struct scan_req_params *arg)
...
+			ch->maxpower = channel->max_power;
+			ch->maxregpower = channel->max_reg_power;
+			ch->antennamax = channel->max_antenna_gain;
+
...

I see it also have another patch to remove the "*2" for power.
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?id=9212c1b9e80a869e732769a4fe7f82d392b219be

ath11k: send proper txpower and maxregpower values to firmware.

so are you the same reason to remove "*2" ?

#6 lore raw

Re: [PATCH v3 2/3] ath11k: Refactor update channel list function

Quoted 22 lines · Wen Gong

On 10/22/2021 8:37 PM, P Praneesh wrote:

...

Quoted 4 lines

---
...

(quoted diff) +0 -2
-			ch->maxpower = channel->max_power * 2;
-			ch->maxregpower = channel->max_reg_power * 2;

Review

Quoted 10 lines
(quoted diff) +5 -1
-			ch->antennamax = channel->max_antenna_gain * 2;
...
  +int ath11k_wmi_update_scan_chan_list(struct ath11k *ar,
+				     struct scan_req_params *arg)
...
+			ch->maxpower = channel->max_power;
+			ch->maxregpower = channel->max_reg_power;
+			ch->antennamax = channel->max_antenna_gain;
+
...

I see it also have another patch to remove the "*2" for power.
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?id=9212c1b9e80a869e732769a4fe7f82d392b219be

Quoted 3 lines

ath11k: send proper txpower and maxregpower values to firmware.

so are you the same reason to remove "*2" ?

I'm not quite getting what you are saying, can you elaborate more? Did this patch break something?

Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
#7 lore raw

Re: [PATCH v3 2/3] ath11k: Refactor update channel list function

Quoted 23 lines · Kalle Valo
Quoted 21 lines · Wen Gong

On 10/22/2021 8:37 PM, P Praneesh wrote:

...

Quoted 4 lines

---
...

(quoted diff) +0 -2
-			ch->maxpower = channel->max_power * 2;
-			ch->maxregpower = channel->max_reg_power * 2;

Review

Quoted 10 lines
(quoted diff) +5 -1
-			ch->antennamax = channel->max_antenna_gain * 2;
...
   +int ath11k_wmi_update_scan_chan_list(struct ath11k *ar,
+				     struct scan_req_params *arg)
...
+			ch->maxpower = channel->max_power;
+			ch->maxregpower = channel->max_reg_power;
+			ch->antennamax = channel->max_antenna_gain;
+
...

I see it also have another patch to remove the "*2" for power.
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?id=9212c1b9e80a869e732769a4fe7f82d392b219be

Quoted 5 lines
Quoted 3 lines

ath11k: send proper txpower and maxregpower values to firmware.

so are you the same reason to remove "*2" ?

I'm not quite getting what you are saying, can you elaborate more? Did this patch break something?

Oh. Not see break anything.

I just want to know why remove the "*2". Did you see any issue if NOT remove "*2"?

Quoted 1 line
#8 lore raw

Re: [PATCH v3 2/3] ath11k: Refactor update channel list function

Quoted 26 lines · Wen Gong
Quoted 25 lines · Kalle Valo
Quoted 23 lines · Wen Gong

On 10/22/2021 8:37 PM, P Praneesh wrote:

...

Quoted 4 lines

---
...

(quoted diff) +0 -2
-			ch->maxpower = channel->max_power * 2;
-			ch->maxregpower = channel->max_reg_power * 2;

Review

Quoted 10 lines
(quoted diff) +5 -1
-			ch->antennamax = channel->max_antenna_gain * 2;
...
   +int ath11k_wmi_update_scan_chan_list(struct ath11k *ar,
+				     struct scan_req_params *arg)
...
+			ch->maxpower = channel->max_power;
+			ch->maxregpower = channel->max_reg_power;
+			ch->antennamax = channel->max_antenna_gain;
+
...

I see it also have another patch to remove the "*2" for power.
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?id=9212c1b9e80a869e732769a4fe7f82d392b219be

ath11k: send proper txpower and maxregpower values to firmware.

Quoted 8 lines
Quoted 3 lines
Quoted 1 line

so are you the same reason to remove "*2" ?

I'm not quite getting what you are saying, can you elaborate more? Did this patch break something?

Oh. Not see break anything.

I just want to know why remove the "*2". Did you see any issue if NOT remove "*2"?

All I know is that commit 9212c1b9e80a ("ath11k: send proper txpower and maxregpower values to firmware") mentions about cca getting stuck:

ath11k: send proper txpower and maxregpower values to firmware

Set proper values for max_regpower, max_power, max_antenna_gain as it is because firmware will convert power values to 0.5dbm steps by multiplying it with 2.

If txpower is not set, it will lead to cca stuck resulting in latency issues for QCN9074.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01386-QCAHKSWPL_SILICONZ-1

Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
author
#9 lore raw

PATCH v3 2/3 ath11k: Add ROC support for wide band scan

In reply to P Praneesh

Wide Band Scan allows to perform off-channel scan on requested channel/ frequency along with corresponding phy mode/bandwidth (40MHz, 80MHz).

Doing wide band scan instead of normal 20MHz scan before spectral dump, allows to fetch FFT reports for the complete requested bandwidth (40MHz, 80MHz).

Below are the FW expectations and configs from host to request Wide Band Scan,

1. SCAN_PHYMODE_SUPPORT WMI service bit advertised from FW.

2. SCAN_CHAN_LIST_CMD updated with the phymode and other channel params of the requested channel to do wide band scan.

3. START_SCAN_CMD updated with all the seven supported TLVs and PHYMODE TLV being the last. PHYMODE TLV holds the (wmi_phy_mode + 1) value corresponding to wide band scan channel. Scan flags scan_f_wide_band and scan_f_passive need to be set for wide band scan request from host.

This new ops callback (ath11k_mac_op_remain_on_channel) for ROC will holds the cfg80211_chan_def of the requested channel from which we update the center frequencies and phymode params needed for SCAN_CHAN_LIST_CMD and START_SCAN_CMD to FW.

Below are use cases of Wide Band Scan,

1. In case of phy running both AP and monitor vifs, wide band scan on a different channel along with phymode (40MHz, 80MHz) captures those off-channel data frames to monitor vif.

2. Doing wide band scan instead of normal 20MHz scan before spectral dump, allows to fetch FFT reports for the complete requested bandwidth (40MHz, 80MHz).

Since wide band scan is the AP mode feature and this support is enabled when firmware advertise SCAN_PHYMODE_SUPPORT wmi service bit, it will not affect QCA6390.

Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00156-QCAHKSWPL_SILICONZ-1

---
 drivers/net/wireless/ath/ath11k/core.c |   1 +
 drivers/net/wireless/ath/ath11k/mac.c  | 201 +++++++++++++++++++++++++++++----
 drivers/net/wireless/ath/ath11k/wmi.c  |  59 +++++++++-
 drivers/net/wireless/ath/ath11k/wmi.h  |  27 ++++-
 4 files changed, 263 insertions(+), 25 deletions(-)
drivers/net/wireless/ath/ath11k/core.c +1 -0
index b0d6922..b49b223 100644
@@ -1033,6 +1033,7 @@ static void ath11k_core_restart(struct work_struct *work)
 		complete(&ar->vdev_delete_done);
 		complete(&ar->bss_survey_done);
 		complete(&ar->thermal.wmi_sync);
+		complete(&ar->scan.on_channel);
 
 		wake_up(&ar->dp.tx_empty_waitq);
 		idr_for_each(&ar->txmgmt_idr,
drivers/net/wireless/ath/ath11k/mac.c +181 -20

253 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/wmi.c +56 -3

110 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/wmi.h +25 -2
index aeec4e9..c3aa2fe 100644
@@ -3094,6 +3094,12 @@ struct wlan_ssid {
 };
 
 #define WMI_IE_BITMAP_SIZE             8
+#define PROBE_REQ_MAX_OUIS	       16
+
+struct wmi_vendor_oui {
+	u32 tlv_header;
+	u32 oui_type_subtype; /* vendor OUI type and subtype */
+};
 
 #define WMI_SCAN_MAX_NUM_SSID                0x0A
 /* prefix used by scan requestor ids on the host */
@@ -3228,6 +3234,22 @@ struct hint_bssid {
 	struct wmi_mac_addr bssid;
 };
 
+struct wmi_chan_info {
+	u32 freq;
+	u32 phymode;
+};
+
+struct wmi_chan_list {
+	u32 num_chan;
+	struct wmi_chan_info chan[WLAN_SCAN_MAX_NUM_CHANNELS];
+};
+
+struct wmi_probe_req_whitelist {
+	u32 ie_bitmap[WMI_IE_BITMAP_SIZE];
+	u32 num_vendor_oui;
+	u32 voui[PROBE_REQ_MAX_OUIS];
+};
+
 struct scan_req_params {
 	u32 scan_id;
 	u32 scan_req_id;
@@ -3290,7 +3312,7 @@ struct scan_req_params {
 			    scan_f_forced:1,
 			    scan_f_2ghz:1,
 			    scan_f_5ghz:1,
-			    scan_f_80mhz:1;
+			    scan_f_wide_band:1;
 		};
 		u32 scan_flags;
 	};
@@ -3300,7 +3322,7 @@ struct scan_req_params {
 	u32 num_bssid;
 	u32 num_ssids;
 	u32 n_probes;
-	u32 chan_list[WLAN_SCAN_MAX_NUM_CHANNELS];
+	struct wmi_chan_list chan_list;
 	u32 notify_scan_events;
 	struct wlan_ssid ssid[WLAN_SCAN_MAX_NUM_SSID];
 	struct wmi_mac_addr bssid_list[WLAN_SCAN_MAX_NUM_BSSID];
@@ -3314,6 +3336,7 @@ struct scan_req_params {
 	u32 phymode;
 	u32 freq;
 	struct cfg80211_chan_def *chandef;
+	struct wmi_probe_req_whitelist ie_whitelist;
 };
 
 struct wmi_ssid_arg {
Signature · 1 line
2.7.4
maintainer
#10 lore raw

Re: [PATCH v3 2/3] ath11k: Add ROC support for wide band scan

FWIW, not sure how this patch got mislabeled as 2/3 when it should be 3/3, but that caused patchwork to drop it. Might want to fix that when you resend so that Kalle can actually see both.

johannes

Signature · 3 lines
ath11k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath11k