All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] mt76: channel switch support for USB devices
@ 2019-11-18 11:39 Markus Theil
  2019-11-18 11:39 ` [PATCH v2 1/4] mt76: mt76x02: ommit beacon slot clearing Markus Theil
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Markus Theil @ 2019-11-18 11:39 UTC (permalink / raw)
  To: nbd; +Cc: linux-wireless, lorenzo.bianconi, Stanislaw Gruszka, Markus Theil

This patch series adds channel switch support for mt76 usb interfaces.
When testing, I noticed that between 5 or 7 consecutive beacons had the
identical channel switch count set. After some debugging I found out,
that beacon copying over usb took far too long (up to 700ms for one call
of mt76x02u_pre_tbtt_work).

Therefore the first three patches speed up beacon copying and the last
patch enables channel switch support also for usb interfaces.

v2 (thanks for the comments Lorenzo):
* correctly track beacon data mask
* clean-ups
* make channel switch fn static (reported by kbuild test robot)

Markus Theil (4):
  mt76: mt76x02: ommit beacon slot clearing
  mt76: mt76x02: split beaconing
  mt76: speed up usb bulk copy
  mt76: mt76x02: add channel switch support for usb interfaces

 drivers/net/wireless/mediatek/mt76/mt76.h     |  2 +-
 .../wireless/mediatek/mt76/mt76x02_beacon.c   | 53 ++++++-------------
 .../net/wireless/mediatek/mt76/mt76x02_mac.h  |  1 +
 .../net/wireless/mediatek/mt76/mt76x02_mmio.c |  5 ++
 .../wireless/mediatek/mt76/mt76x02_usb_core.c | 12 +++++
 .../net/wireless/mediatek/mt76/mt76x02_util.c |  2 +-
 .../wireless/mediatek/mt76/mt76x2/usb_main.c  |  5 ++
 drivers/net/wireless/mediatek/mt76/usb.c      | 17 +++---
 8 files changed, 52 insertions(+), 45 deletions(-)

--
2.24.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 1/4] mt76: mt76x02: ommit beacon slot clearing
  2019-11-18 11:39 [PATCH v2 0/4] mt76: channel switch support for USB devices Markus Theil
@ 2019-11-18 11:39 ` Markus Theil
  2019-11-18 11:39 ` [PATCH v2 2/4] mt76: mt76x02: split beaconing Markus Theil
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Markus Theil @ 2019-11-18 11:39 UTC (permalink / raw)
  To: nbd; +Cc: linux-wireless, lorenzo.bianconi, Stanislaw Gruszka, Markus Theil

mt76 hw does not send beacons from beacon slots, if the corresponding
bitmask is set accordingly. Therefore we can ommit clearing the beacon
memory. Clearing uses many usb calls, if usb drivers are used. These
calls unnecessarily slow down the beacon tasklet. Thanks to Stanislaw
Gruzska for pointing this out.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
index 4209209ac940..403866496640 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
@@ -58,8 +58,6 @@ __mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 bcn_idx,
 			dev->beacon_data_mask |= BIT(bcn_idx);
 	} else {
 		dev->beacon_data_mask &= ~BIT(bcn_idx);
-		for (i = 0; i < beacon_len; i += 4)
-			mt76_wr(dev, beacon_addr + i, 0);
 	}
 
 	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~dev->beacon_data_mask);
@@ -241,17 +239,11 @@ EXPORT_SYMBOL_GPL(mt76x02_enqueue_buffered_bc);
 
 void mt76x02_init_beacon_config(struct mt76x02_dev *dev)
 {
-	int i;
-
 	mt76_clear(dev, MT_BEACON_TIME_CFG, (MT_BEACON_TIME_CFG_TIMER_EN |
 					     MT_BEACON_TIME_CFG_TBTT_EN |
 					     MT_BEACON_TIME_CFG_BEACON_TX));
 	mt76_set(dev, MT_BEACON_TIME_CFG, MT_BEACON_TIME_CFG_SYNC_MODE);
 	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xffff);
-
-	for (i = 0; i < 8; i++)
-		mt76x02_mac_set_beacon(dev, i, NULL);
-
 	mt76x02_set_beacon_offsets(dev);
 }
 EXPORT_SYMBOL_GPL(mt76x02_init_beacon_config);
-- 
2.24.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 2/4] mt76: mt76x02: split beaconing
  2019-11-18 11:39 [PATCH v2 0/4] mt76: channel switch support for USB devices Markus Theil
  2019-11-18 11:39 ` [PATCH v2 1/4] mt76: mt76x02: ommit beacon slot clearing Markus Theil
@ 2019-11-18 11:39 ` Markus Theil
  2019-11-18 12:18   ` Lorenzo Bianconi
  2019-11-18 11:39 ` [PATCH v2 3/4] mt76: speed up usb bulk copy Markus Theil
  2019-11-18 11:39 ` [PATCH v2 4/4] mt76: mt76x02: add channel switch support for usb interfaces Markus Theil
  3 siblings, 1 reply; 9+ messages in thread
From: Markus Theil @ 2019-11-18 11:39 UTC (permalink / raw)
  To: nbd; +Cc: linux-wireless, lorenzo.bianconi, Stanislaw Gruszka, Markus Theil

Sending beacons to the hardware always happens in batches. In order to
speed up beacon processing on usb devices, this patch splits out common
code an calls it only once (mt76x02_mac_set_beacon_prepare,
mt76x02_mac_set_beacon_finish). Making this split breaks beacon
enabling/disabling per vif. This is fixed by adding a call to set the
bypass mask, if beaconing should be disabled for a vif. Otherwise the
beacon is send after the next beacon interval.

The code is also adapted for the mmio part of the driver, but should not
have any performance implication there.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 .../wireless/mediatek/mt76/mt76x02_beacon.c   | 46 +++++++------------
 .../net/wireless/mediatek/mt76/mt76x02_mac.h  |  1 +
 .../net/wireless/mediatek/mt76/mt76x02_mmio.c |  5 ++
 .../wireless/mediatek/mt76/mt76x02_usb_core.c |  5 ++
 4 files changed, 28 insertions(+), 29 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
index 403866496640..faa6de6914a3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
@@ -47,10 +47,6 @@ __mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 bcn_idx,
 	int beacon_len = dev->beacon_ops->slot_size;
 	int beacon_addr = MT_BEACON_BASE + (beacon_len * bcn_idx);
 	int ret = 0;
-	int i;
-
-	/* Prevent corrupt transmissions during update */
-	mt76_set(dev, MT_BCN_BYPASS_MASK, BIT(bcn_idx));
 
 	if (skb) {
 		ret = mt76x02_write_beacon(dev, beacon_addr, skb);
@@ -60,41 +56,32 @@ __mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 bcn_idx,
 		dev->beacon_data_mask &= ~BIT(bcn_idx);
 	}
 
-	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~dev->beacon_data_mask);
-
 	return ret;
 }
 
-int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
-			   struct sk_buff *skb)
-{
-	bool force_update = false;
-	int bcn_idx = 0;
+void mt76x02_mac_set_beacon_finish(struct mt76x02_dev *dev) {
 	int i;
+	int bcn_idx = 0;
 
-	for (i = 0; i < ARRAY_SIZE(dev->beacons); i++) {
-		if (vif_idx == i) {
-			force_update = !!dev->beacons[i] ^ !!skb;
-			dev_kfree_skb(dev->beacons[i]);
-			dev->beacons[i] = skb;
-			__mt76x02_mac_set_beacon(dev, bcn_idx, skb);
-		} else if (force_update && dev->beacons[i]) {
-			__mt76x02_mac_set_beacon(dev, bcn_idx,
-						 dev->beacons[i]);
-		}
-
+	for(i = 0; i < hweight8(dev->mt76.beacon_mask); ++i) {
 		bcn_idx += !!dev->beacons[i];
 	}
 
-	for (i = bcn_idx; i < ARRAY_SIZE(dev->beacons); i++) {
-		if (!(dev->beacon_data_mask & BIT(i)))
-			break;
-
-		__mt76x02_mac_set_beacon(dev, i, NULL);
-	}
-
 	mt76_rmw_field(dev, MT_MAC_BSSID_DW1, MT_MAC_BSSID_DW1_MBEACON_N,
 		       bcn_idx - 1);
+
+	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~dev->beacon_data_mask);
+}
+EXPORT_SYMBOL_GPL(mt76x02_mac_set_beacon_finish);
+
+int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
+			   struct sk_buff *skb)
+{
+	dev_kfree_skb(dev->beacons[vif_idx]);
+	dev->beacons[vif_idx] = skb;
+	__mt76x02_mac_set_beacon(dev, vif_idx, skb);
+
+
 	return 0;
 }
 EXPORT_SYMBOL_GPL(mt76x02_mac_set_beacon);
@@ -115,6 +102,7 @@ void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
 	} else {
 		dev->mt76.beacon_mask &= ~BIT(mvif->idx);
 		mt76x02_mac_set_beacon(dev, mvif->idx, NULL);
+		mt76_set(dev, MT_BCN_BYPASS_MASK, BIT(mvif->idx));
 	}
 
 	if (!!old_mask == !!dev->mt76.beacon_mask)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
index efa4ef945e35..e6e585c72f0d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
@@ -197,6 +197,7 @@ int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
 			   struct sk_buff *skb);
 void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
 				   struct ieee80211_vif *vif, bool enable);
+void mt76x02_mac_set_beacon_finish(struct mt76x02_dev *dev);
 
 void mt76x02_edcca_init(struct mt76x02_dev *dev);
 #endif
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
index dc773070481d..73c39d03b7f8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
@@ -24,10 +24,15 @@ static void mt76x02_pre_tbtt_tasklet(unsigned long arg)
 
 	mt76x02_resync_beacon_timer(dev);
 
+	/* Prevent corrupt transmissions during update */
+	mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
+
 	ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
 		IEEE80211_IFACE_ITER_RESUME_ALL,
 		mt76x02_update_beacon_iter, dev);
 
+	mt76x02_mac_set_beacon_finish(dev);
+
 	mt76_csa_check(&dev->mt76);
 
 	if (dev->mt76.csa_complete)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
index 78dfc1e7f27b..8a2a90fb5663 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
@@ -179,6 +179,9 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
 
 	mt76x02_resync_beacon_timer(dev);
 
+	/* Prevent corrupt transmissions during update */
+	mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
+
 	ieee80211_iterate_active_interfaces(mt76_hw(dev),
 		IEEE80211_IFACE_ITER_RESUME_ALL,
 		mt76x02_update_beacon_iter, dev);
@@ -191,6 +194,8 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
 		mt76x02_mac_set_beacon(dev, i, skb);
 	}
 
+	mt76x02_mac_set_beacon_finish(dev);
+
 	mt76x02u_restart_pre_tbtt_timer(dev);
 }
 
-- 
2.24.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 3/4] mt76: speed up usb bulk copy
  2019-11-18 11:39 [PATCH v2 0/4] mt76: channel switch support for USB devices Markus Theil
  2019-11-18 11:39 ` [PATCH v2 1/4] mt76: mt76x02: ommit beacon slot clearing Markus Theil
  2019-11-18 11:39 ` [PATCH v2 2/4] mt76: mt76x02: split beaconing Markus Theil
@ 2019-11-18 11:39 ` Markus Theil
  2019-11-18 17:25     ` kbuild test robot
  2019-11-18 11:39 ` [PATCH v2 4/4] mt76: mt76x02: add channel switch support for usb interfaces Markus Theil
  3 siblings, 1 reply; 9+ messages in thread
From: Markus Theil @ 2019-11-18 11:39 UTC (permalink / raw)
  To: nbd; +Cc: linux-wireless, lorenzo.bianconi, Stanislaw Gruszka, Markus Theil

Use larger batches for usb copy to speed this operation up. Otherwise it
would be too slow for copying new beacons or broadcast frames over usb.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 drivers/net/wireless/mediatek/mt76/mt76.h       |  2 +-
 .../net/wireless/mediatek/mt76/mt76x02_beacon.c |  1 -
 drivers/net/wireless/mediatek/mt76/usb.c        | 17 +++++++++++------
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 8aec7ccf2d79..7a6f5d097a3d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -383,7 +383,7 @@ enum mt76u_out_ep {
 struct mt76_usb {
 	struct mutex usb_ctrl_mtx;
 	union {
-		u8 data[32];
+		u8 data[128];
 		__le32 reg_val;
 	};
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
index faa6de6914a3..873c8323bb70 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
@@ -81,7 +81,6 @@ int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
 	dev->beacons[vif_idx] = skb;
 	__mt76x02_mac_set_beacon(dev, vif_idx, skb);
 
-
 	return 0;
 }
 EXPORT_SYMBOL_GPL(mt76x02_mac_set_beacon);
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index 20c6fe510e9d..382004128897 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -149,18 +149,23 @@ static void mt76u_copy(struct mt76_dev *dev, u32 offset,
 		       const void *data, int len)
 {
 	struct mt76_usb *usb = &dev->usb;
-	const u32 *val = data;
-	int i, ret;
+	const u8 *val = data;
+	int ret;
+	int current_batch_size;
+	int i = 0;
 
 	mutex_lock(&usb->usb_ctrl_mtx);
-	for (i = 0; i < DIV_ROUND_UP(len, 4); i++) {
-		put_unaligned(val[i], (u32 *)usb->data);
+	while (i < len) {
+		current_batch_size = min(sizeof(usb->data), len - i);
+		memcpy(usb->data, val + i, current_batch_size);
 		ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
 					     USB_DIR_OUT | USB_TYPE_VENDOR,
-					     0, offset + i * 4, usb->data,
-					     sizeof(u32));
+					     0, offset + i, usb->data,
+					     current_batch_size);
 		if (ret < 0)
 			break;
+
+		i += current_batch_size;
 	}
 	mutex_unlock(&usb->usb_ctrl_mtx);
 }
-- 
2.24.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 4/4] mt76: mt76x02: add channel switch support for usb interfaces
  2019-11-18 11:39 [PATCH v2 0/4] mt76: channel switch support for USB devices Markus Theil
                   ` (2 preceding siblings ...)
  2019-11-18 11:39 ` [PATCH v2 3/4] mt76: speed up usb bulk copy Markus Theil
@ 2019-11-18 11:39 ` Markus Theil
  2019-11-18 12:23   ` Lorenzo Bianconi
  3 siblings, 1 reply; 9+ messages in thread
From: Markus Theil @ 2019-11-18 11:39 UTC (permalink / raw)
  To: nbd; +Cc: linux-wireless, lorenzo.bianconi, Stanislaw Gruszka, Markus Theil

This patch enables channel switch support on mt76 usb interfaces.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c | 7 +++++++
 drivers/net/wireless/mediatek/mt76/mt76x02_util.c     | 2 +-
 drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c  | 5 +++++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
index 8a2a90fb5663..891825043117 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
@@ -182,6 +182,12 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
 	/* Prevent corrupt transmissions during update */
 	mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
 
+	mt76_csa_check(&dev->mt76);
+	if (dev->mt76.csa_complete) {
+		mt76_csa_finish(&dev->mt76);
+		goto out;
+	}
+
 	ieee80211_iterate_active_interfaces(mt76_hw(dev),
 		IEEE80211_IFACE_ITER_RESUME_ALL,
 		mt76x02_update_beacon_iter, dev);
@@ -196,6 +202,7 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
 
 	mt76x02_mac_set_beacon_finish(dev);
 
+out:
 	mt76x02u_restart_pre_tbtt_timer(dev);
 }
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
index 414b22399d93..3f95e5b24e1d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
@@ -174,7 +174,6 @@ void mt76x02_init_device(struct mt76x02_dev *dev)
 		wiphy->reg_notifier = mt76x02_regd_notifier;
 		wiphy->iface_combinations = mt76x02_if_comb;
 		wiphy->n_iface_combinations = ARRAY_SIZE(mt76x02_if_comb);
-		wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
 
 		/* init led callbacks */
 		if (IS_ENABLED(CONFIG_MT76_LEDS)) {
@@ -184,6 +183,7 @@ void mt76x02_init_device(struct mt76x02_dev *dev)
 		}
 	}
 
+	wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
 
 	hw->sta_data_size = sizeof(struct mt76x02_sta);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
index eb73cb856c81..ae576b29c9ac 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
@@ -100,6 +100,10 @@ mt76x2u_config(struct ieee80211_hw *hw, u32 changed)
 	return err;
 }
 
+static void mt76x2u_channel_switch_beacon(struct ieee80211_hw *hw,
+					  struct ieee80211_vif *vif,
+					  struct cfg80211_chan_def *chandef) {}
+
 const struct ieee80211_ops mt76x2u_ops = {
 	.tx = mt76x02_tx,
 	.start = mt76x2u_start,
@@ -121,4 +125,5 @@ const struct ieee80211_ops mt76x2u_ops = {
 	.get_survey = mt76_get_survey,
 	.set_tim = mt76_set_tim,
 	.release_buffered_frames = mt76_release_buffered_frames,
+	.channel_switch_beacon = mt76x2u_channel_switch_beacon,
 };
-- 
2.24.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 2/4] mt76: mt76x02: split beaconing
  2019-11-18 11:39 ` [PATCH v2 2/4] mt76: mt76x02: split beaconing Markus Theil
@ 2019-11-18 12:18   ` Lorenzo Bianconi
  0 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2019-11-18 12:18 UTC (permalink / raw)
  To: Markus Theil; +Cc: nbd, linux-wireless, lorenzo.bianconi, Stanislaw Gruszka

[-- Attachment #1: Type: text/plain, Size: 6956 bytes --]

> Sending beacons to the hardware always happens in batches. In order to
> speed up beacon processing on usb devices, this patch splits out common
> code an calls it only once (mt76x02_mac_set_beacon_prepare,
> mt76x02_mac_set_beacon_finish). Making this split breaks beacon
> enabling/disabling per vif. This is fixed by adding a call to set the
> bypass mask, if beaconing should be disabled for a vif. Otherwise the
> beacon is send after the next beacon interval.
> 
> The code is also adapted for the mmio part of the driver, but should not
> have any performance implication there.
> 

Could you please fix following checkpatch errors/warnings?

Regards,
Lorenzo

ERROR: open brace '{' following function definitions go on the next line
#58: FILE: drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c:62:
+void mt76x02_mac_set_beacon_finish(struct mt76x02_dev *dev) {

ERROR: space required before the open parenthesis '('
#73: FILE: drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c:66:
+       for(i = 0; i < hweight8(dev->mt76.beacon_mask); ++i) {

WARNING: braces {} are not necessary for single statement blocks
#73: FILE: drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c:66:
+       for(i = 0; i < hweight8(dev->mt76.beacon_mask); ++i) {
                bcn_idx += !!dev->beacons[i];
        }

CHECK: Please don't use multiple blank lines
#98: FILE: drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c:84:
+
+


> Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
> ---
>  .../wireless/mediatek/mt76/mt76x02_beacon.c   | 46 +++++++------------
>  .../net/wireless/mediatek/mt76/mt76x02_mac.h  |  1 +
>  .../net/wireless/mediatek/mt76/mt76x02_mmio.c |  5 ++
>  .../wireless/mediatek/mt76/mt76x02_usb_core.c |  5 ++
>  4 files changed, 28 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
> index 403866496640..faa6de6914a3 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c
> @@ -47,10 +47,6 @@ __mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 bcn_idx,
>  	int beacon_len = dev->beacon_ops->slot_size;
>  	int beacon_addr = MT_BEACON_BASE + (beacon_len * bcn_idx);
>  	int ret = 0;
> -	int i;
> -
> -	/* Prevent corrupt transmissions during update */
> -	mt76_set(dev, MT_BCN_BYPASS_MASK, BIT(bcn_idx));
>  
>  	if (skb) {
>  		ret = mt76x02_write_beacon(dev, beacon_addr, skb);
> @@ -60,41 +56,32 @@ __mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 bcn_idx,
>  		dev->beacon_data_mask &= ~BIT(bcn_idx);
>  	}
>  
> -	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~dev->beacon_data_mask);
> -
>  	return ret;
>  }
>  
> -int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
> -			   struct sk_buff *skb)
> -{
> -	bool force_update = false;
> -	int bcn_idx = 0;
> +void mt76x02_mac_set_beacon_finish(struct mt76x02_dev *dev) {
>  	int i;
> +	int bcn_idx = 0;
>  
> -	for (i = 0; i < ARRAY_SIZE(dev->beacons); i++) {
> -		if (vif_idx == i) {
> -			force_update = !!dev->beacons[i] ^ !!skb;
> -			dev_kfree_skb(dev->beacons[i]);
> -			dev->beacons[i] = skb;
> -			__mt76x02_mac_set_beacon(dev, bcn_idx, skb);
> -		} else if (force_update && dev->beacons[i]) {
> -			__mt76x02_mac_set_beacon(dev, bcn_idx,
> -						 dev->beacons[i]);
> -		}
> -
> +	for(i = 0; i < hweight8(dev->mt76.beacon_mask); ++i) {
>  		bcn_idx += !!dev->beacons[i];
>  	}
>  
> -	for (i = bcn_idx; i < ARRAY_SIZE(dev->beacons); i++) {
> -		if (!(dev->beacon_data_mask & BIT(i)))
> -			break;
> -
> -		__mt76x02_mac_set_beacon(dev, i, NULL);
> -	}
> -
>  	mt76_rmw_field(dev, MT_MAC_BSSID_DW1, MT_MAC_BSSID_DW1_MBEACON_N,
>  		       bcn_idx - 1);
> +
> +	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~dev->beacon_data_mask);
> +}
> +EXPORT_SYMBOL_GPL(mt76x02_mac_set_beacon_finish);
> +
> +int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
> +			   struct sk_buff *skb)
> +{
> +	dev_kfree_skb(dev->beacons[vif_idx]);
> +	dev->beacons[vif_idx] = skb;
> +	__mt76x02_mac_set_beacon(dev, vif_idx, skb);
> +
> +
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(mt76x02_mac_set_beacon);
> @@ -115,6 +102,7 @@ void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
>  	} else {
>  		dev->mt76.beacon_mask &= ~BIT(mvif->idx);
>  		mt76x02_mac_set_beacon(dev, mvif->idx, NULL);
> +		mt76_set(dev, MT_BCN_BYPASS_MASK, BIT(mvif->idx));
>  	}
>  
>  	if (!!old_mask == !!dev->mt76.beacon_mask)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
> index efa4ef945e35..e6e585c72f0d 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
> @@ -197,6 +197,7 @@ int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
>  			   struct sk_buff *skb);
>  void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
>  				   struct ieee80211_vif *vif, bool enable);
> +void mt76x02_mac_set_beacon_finish(struct mt76x02_dev *dev);
>  
>  void mt76x02_edcca_init(struct mt76x02_dev *dev);
>  #endif
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
> index dc773070481d..73c39d03b7f8 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
> @@ -24,10 +24,15 @@ static void mt76x02_pre_tbtt_tasklet(unsigned long arg)
>  
>  	mt76x02_resync_beacon_timer(dev);
>  
> +	/* Prevent corrupt transmissions during update */
> +	mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
> +
>  	ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
>  		IEEE80211_IFACE_ITER_RESUME_ALL,
>  		mt76x02_update_beacon_iter, dev);
>  
> +	mt76x02_mac_set_beacon_finish(dev);
> +
>  	mt76_csa_check(&dev->mt76);
>  
>  	if (dev->mt76.csa_complete)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
> index 78dfc1e7f27b..8a2a90fb5663 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
> @@ -179,6 +179,9 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
>  
>  	mt76x02_resync_beacon_timer(dev);
>  
> +	/* Prevent corrupt transmissions during update */
> +	mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
> +
>  	ieee80211_iterate_active_interfaces(mt76_hw(dev),
>  		IEEE80211_IFACE_ITER_RESUME_ALL,
>  		mt76x02_update_beacon_iter, dev);
> @@ -191,6 +194,8 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
>  		mt76x02_mac_set_beacon(dev, i, skb);
>  	}
>  
> +	mt76x02_mac_set_beacon_finish(dev);
> +
>  	mt76x02u_restart_pre_tbtt_timer(dev);
>  }
>  
> -- 
> 2.24.0
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 4/4] mt76: mt76x02: add channel switch support for usb interfaces
  2019-11-18 11:39 ` [PATCH v2 4/4] mt76: mt76x02: add channel switch support for usb interfaces Markus Theil
@ 2019-11-18 12:23   ` Lorenzo Bianconi
  0 siblings, 0 replies; 9+ messages in thread
From: Lorenzo Bianconi @ 2019-11-18 12:23 UTC (permalink / raw)
  To: Markus Theil; +Cc: nbd, linux-wireless, lorenzo.bianconi, Stanislaw Gruszka

[-- Attachment #1: Type: text/plain, Size: 3645 bytes --]

> This patch enables channel switch support on mt76 usb interfaces.
> 
> Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
> ---
>  drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c | 7 +++++++
>  drivers/net/wireless/mediatek/mt76/mt76x02_util.c     | 2 +-
>  drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c  | 5 +++++
>  3 files changed, 13 insertions(+), 1 deletion(-)

could you please fix following checkpatch error?

Regards,
Lorenzo

ROR: open brace '{' following function definitions go on the next line
#73: FILE: drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c:103:
+static void mt76x2u_channel_switch_beacon(struct ieee80211_hw *hw,
+                                         struct ieee80211_vif *vif,
+                                         struct cfg80211_chan_def *chandef) {}

> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
> index 8a2a90fb5663..891825043117 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c
> @@ -182,6 +182,12 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
>  	/* Prevent corrupt transmissions during update */
>  	mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
>  
> +	mt76_csa_check(&dev->mt76);
> +	if (dev->mt76.csa_complete) {
> +		mt76_csa_finish(&dev->mt76);
> +		goto out;
> +	}
> +
>  	ieee80211_iterate_active_interfaces(mt76_hw(dev),
>  		IEEE80211_IFACE_ITER_RESUME_ALL,
>  		mt76x02_update_beacon_iter, dev);
> @@ -196,6 +202,7 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
>  
>  	mt76x02_mac_set_beacon_finish(dev);
>  
> +out:
>  	mt76x02u_restart_pre_tbtt_timer(dev);
>  }
>  
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
> index 414b22399d93..3f95e5b24e1d 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
> @@ -174,7 +174,6 @@ void mt76x02_init_device(struct mt76x02_dev *dev)
>  		wiphy->reg_notifier = mt76x02_regd_notifier;
>  		wiphy->iface_combinations = mt76x02_if_comb;
>  		wiphy->n_iface_combinations = ARRAY_SIZE(mt76x02_if_comb);
> -		wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
>  
>  		/* init led callbacks */
>  		if (IS_ENABLED(CONFIG_MT76_LEDS)) {
> @@ -184,6 +183,7 @@ void mt76x02_init_device(struct mt76x02_dev *dev)
>  		}
>  	}
>  
> +	wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
>  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
>  
>  	hw->sta_data_size = sizeof(struct mt76x02_sta);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
> index eb73cb856c81..ae576b29c9ac 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
> @@ -100,6 +100,10 @@ mt76x2u_config(struct ieee80211_hw *hw, u32 changed)
>  	return err;
>  }
>  
> +static void mt76x2u_channel_switch_beacon(struct ieee80211_hw *hw,
> +					  struct ieee80211_vif *vif,
> +					  struct cfg80211_chan_def *chandef) {}
> +
>  const struct ieee80211_ops mt76x2u_ops = {
>  	.tx = mt76x02_tx,
>  	.start = mt76x2u_start,
> @@ -121,4 +125,5 @@ const struct ieee80211_ops mt76x2u_ops = {
>  	.get_survey = mt76_get_survey,
>  	.set_tim = mt76_set_tim,
>  	.release_buffered_frames = mt76_release_buffered_frames,
> +	.channel_switch_beacon = mt76x2u_channel_switch_beacon,
>  };
> -- 
> 2.24.0
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/4] mt76: speed up usb bulk copy
  2019-11-18 11:39 ` [PATCH v2 3/4] mt76: speed up usb bulk copy Markus Theil
@ 2019-11-18 17:25     ` kbuild test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2019-11-18 17:25 UTC (permalink / raw)
  To: Markus Theil
  Cc: kbuild-all, nbd, linux-wireless, lorenzo.bianconi,
	Stanislaw Gruszka, Markus Theil

[-- Attachment #1: Type: text/plain, Size: 3225 bytes --]

Hi Markus,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on wireless-drivers-next/master]
[also build test WARNING on next-20191118]
[cannot apply to v5.4-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Markus-Theil/mt76-channel-switch-support-for-USB-devices/20191118-215808
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: sparc64-allmodconfig (attached as .config)
compiler: sparc64-linux-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=sparc64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from include/linux/list.h:9:0,
                    from include/linux/module.h:9,
                    from drivers/net/wireless/mediatek/mt76/usb.c:6:
   drivers/net/wireless/mediatek/mt76/usb.c: In function 'mt76u_copy':
   include/linux/kernel.h:842:29: warning: comparison of distinct pointer types lacks a cast
      (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
                                ^
   include/linux/kernel.h:856:4: note: in expansion of macro '__typecheck'
      (__typecheck(x, y) && __no_side_effects(x, y))
       ^~~~~~~~~~~
   include/linux/kernel.h:866:24: note: in expansion of macro '__safe_cmp'
     __builtin_choose_expr(__safe_cmp(x, y), \
                           ^~~~~~~~~~
   include/linux/kernel.h:875:19: note: in expansion of macro '__careful_cmp'
    #define min(x, y) __careful_cmp(x, y, <)
                      ^~~~~~~~~~~~~
>> drivers/net/wireless/mediatek/mt76/usb.c:159:24: note: in expansion of macro 'min'
      current_batch_size = min(sizeof(usb->data), len - i);
                           ^~~

vim +/min +159 drivers/net/wireless/mediatek/mt76/usb.c

   147	
   148	static void mt76u_copy(struct mt76_dev *dev, u32 offset,
   149			       const void *data, int len)
   150	{
   151		struct mt76_usb *usb = &dev->usb;
   152		const u8 *val = data;
   153		int ret;
   154		int current_batch_size;
   155		int i = 0;
   156	
   157		mutex_lock(&usb->usb_ctrl_mtx);
   158		while (i < len) {
 > 159			current_batch_size = min(sizeof(usb->data), len - i);
   160			memcpy(usb->data, val + i, current_batch_size);
   161			ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
   162						     USB_DIR_OUT | USB_TYPE_VENDOR,
   163						     0, offset + i, usb->data,
   164						     current_batch_size);
   165			if (ret < 0)
   166				break;
   167	
   168			i += current_batch_size;
   169		}
   170		mutex_unlock(&usb->usb_ctrl_mtx);
   171	}
   172	

---
0-DAY kernel test infrastructure                 Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 59128 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/4] mt76: speed up usb bulk copy
@ 2019-11-18 17:25     ` kbuild test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2019-11-18 17:25 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 3305 bytes --]

Hi Markus,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on wireless-drivers-next/master]
[also build test WARNING on next-20191118]
[cannot apply to v5.4-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Markus-Theil/mt76-channel-switch-support-for-USB-devices/20191118-215808
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: sparc64-allmodconfig (attached as .config)
compiler: sparc64-linux-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=sparc64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from include/linux/list.h:9:0,
                    from include/linux/module.h:9,
                    from drivers/net/wireless/mediatek/mt76/usb.c:6:
   drivers/net/wireless/mediatek/mt76/usb.c: In function 'mt76u_copy':
   include/linux/kernel.h:842:29: warning: comparison of distinct pointer types lacks a cast
      (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
                                ^
   include/linux/kernel.h:856:4: note: in expansion of macro '__typecheck'
      (__typecheck(x, y) && __no_side_effects(x, y))
       ^~~~~~~~~~~
   include/linux/kernel.h:866:24: note: in expansion of macro '__safe_cmp'
     __builtin_choose_expr(__safe_cmp(x, y), \
                           ^~~~~~~~~~
   include/linux/kernel.h:875:19: note: in expansion of macro '__careful_cmp'
    #define min(x, y) __careful_cmp(x, y, <)
                      ^~~~~~~~~~~~~
>> drivers/net/wireless/mediatek/mt76/usb.c:159:24: note: in expansion of macro 'min'
      current_batch_size = min(sizeof(usb->data), len - i);
                           ^~~

vim +/min +159 drivers/net/wireless/mediatek/mt76/usb.c

   147	
   148	static void mt76u_copy(struct mt76_dev *dev, u32 offset,
   149			       const void *data, int len)
   150	{
   151		struct mt76_usb *usb = &dev->usb;
   152		const u8 *val = data;
   153		int ret;
   154		int current_batch_size;
   155		int i = 0;
   156	
   157		mutex_lock(&usb->usb_ctrl_mtx);
   158		while (i < len) {
 > 159			current_batch_size = min(sizeof(usb->data), len - i);
   160			memcpy(usb->data, val + i, current_batch_size);
   161			ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
   162						     USB_DIR_OUT | USB_TYPE_VENDOR,
   163						     0, offset + i, usb->data,
   164						     current_batch_size);
   165			if (ret < 0)
   166				break;
   167	
   168			i += current_batch_size;
   169		}
   170		mutex_unlock(&usb->usb_ctrl_mtx);
   171	}
   172	

---
0-DAY kernel test infrastructure                 Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org Intel Corporation

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 59128 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2019-11-18 17:26 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-18 11:39 [PATCH v2 0/4] mt76: channel switch support for USB devices Markus Theil
2019-11-18 11:39 ` [PATCH v2 1/4] mt76: mt76x02: ommit beacon slot clearing Markus Theil
2019-11-18 11:39 ` [PATCH v2 2/4] mt76: mt76x02: split beaconing Markus Theil
2019-11-18 12:18   ` Lorenzo Bianconi
2019-11-18 11:39 ` [PATCH v2 3/4] mt76: speed up usb bulk copy Markus Theil
2019-11-18 17:25   ` kbuild test robot
2019-11-18 17:25     ` kbuild test robot
2019-11-18 11:39 ` [PATCH v2 4/4] mt76: mt76x02: add channel switch support for usb interfaces Markus Theil
2019-11-18 12:23   ` Lorenzo Bianconi

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.