Skip to contentSkip to conversation

mt76u: convert rx/status path to worker APIs

PATCH New Lorenzo Bianconi 1 participant 3 messages Oct 20, 2020

Subsystems (2)
lore
Share & tools
lore

Lorenzo Bianconi

author maintainer
#0 lore raw

cover mt76u: convert rx/status path to worker APIs

In order to improve parallelism and improve performances, convert rx and status path in mt76-usb module to mt76 worker APIs.

mt7663u upstream codepath:
TCP tx: ~420Mbps
TCP rx: ~360Mbps

mt7663u worker APIs:
TCP tx: ~455Mbps
TCP rx: ~380Mbps

Lorenzo Bianconi (2):
mt76: mt76u: rely on woker APIs for rx work
mt76: mt76u: use dedicated thread for status work

 drivers/net/wireless/mediatek/mt76/mt76.h     |  4 +-
 .../net/wireless/mediatek/mt76/mt7615/usb.c   |  9 ++-
 .../net/wireless/mediatek/mt76/mt76x0/usb.c   |  1 +
 .../net/wireless/mediatek/mt76/mt76x2/usb.c   |  1 +
 drivers/net/wireless/mediatek/mt76/usb.c      | 68 +++++++++++++------
 5 files changed, 56 insertions(+), 27 deletions(-)
Signature · 1 line
2.26.2
author maintainer
#1 lore raw

PATCH 1/2 mt76: mt76u: rely on woker APIs for rx work

In order to improve parallelism, convert rx path in mt76-usb module to mt76 workers APIs

---
 drivers/net/wireless/mediatek/mt76/mt76.h     |  2 +-
 .../net/wireless/mediatek/mt76/mt7615/usb.c   |  9 ++--
 .../net/wireless/mediatek/mt76/mt76x0/usb.c   |  1 +
 .../net/wireless/mediatek/mt76/mt76x2/usb.c   |  1 +
 drivers/net/wireless/mediatek/mt76/usb.c      | 48 ++++++++++++-------
 5 files changed, 39 insertions(+), 22 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
index 64683eff76fa..7b78244057b8 100644
@@ -430,7 +430,7 @@ struct mt76_usb {
 	u8 *data;
 	u16 data_len;
 
-	struct tasklet_struct rx_tasklet;
+	struct mt76_worker rx_worker;
 	struct work_struct stat_work;
 
 	u8 out_ep[__MT_EP_OUT_MAX];
drivers/net/wireless/mediatek/mt76/mt7615/usb.c +4 -5
index f0ad83af9e00..a60cfa345521 100644
@@ -126,21 +126,20 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
 alloc_queues:
 	ret = mt76u_alloc_mcu_queue(&dev->mt76);
 	if (ret)
-		goto error_free_q;
+		goto error;
 
 	ret = mt76u_alloc_queues(&dev->mt76);
 	if (ret)
-		goto error_free_q;
+		goto error;
 
 	ret = mt7663_usb_sdio_register_device(dev);
 	if (ret)
-		goto error_free_q;
+		goto error;
 
 	return 0;
 
-error_free_q:
-	mt76u_queues_deinit(&dev->mt76);
 error:
+	mt76u_queues_deinit(&dev->mt76);
 	usb_set_intfdata(usb_intf, NULL);
 	usb_put_dev(interface_to_usbdev(usb_intf));
 
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +1 -0
index ce6b286a8152..b12cb17cb43d 100644
@@ -277,6 +277,7 @@ static int mt76x0u_probe(struct usb_interface *usb_intf,
 err:
 	usb_set_intfdata(usb_intf, NULL);
 	usb_put_dev(interface_to_usbdev(usb_intf));
+	mt76u_queues_deinit(&dev->mt76);
 	mt76_free_device(&dev->mt76);
 
 	return ret;
drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +1 -0
index 4e003c7b62cf..2575369e44e2 100644
@@ -75,6 +75,7 @@ static int mt76x2u_probe(struct usb_interface *intf,
 	return 0;
 
 err:
+	mt76u_queues_deinit(&dev->mt76);
 	mt76_free_device(&dev->mt76);
 	usb_set_intfdata(intf, NULL);
 	usb_put_dev(udev);
drivers/net/wireless/mediatek/mt76/usb.c +32 -16

129 lines not on this page · raw message

Signature · 1 line
2.26.2
author maintainer
#2 lore raw

PATCH 2/2 mt76: mt76u: use dedicated thread for status work

In reply to Lorenzo Bianconi

Split tx and status path in mt76-usb module relying on mt76 workers APIs

---
 drivers/net/wireless/mediatek/mt76/mt76.h |  2 ++
 drivers/net/wireless/mediatek/mt76/usb.c  | 20 +++++++++++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +2 -0
index 7b78244057b8..cd60b47619f1 100644
@@ -430,7 +430,9 @@ struct mt76_usb {
 	u8 *data;
 	u16 data_len;
 
+	struct mt76_worker status_worker;
 	struct mt76_worker rx_worker;
+
 	struct work_struct stat_work;
 
 	u8 out_ep[__MT_EP_OUT_MAX];
drivers/net/wireless/mediatek/mt76/usb.c +15 -5
index 63f55abede71..7396bdae6db0 100644
@@ -805,9 +805,10 @@ int mt76u_resume_rx(struct mt76_dev *dev)
 }
 EXPORT_SYMBOL_GPL(mt76u_resume_rx);
 
-static void mt76u_tx_worker(struct mt76_worker *w)
+static void mt76u_status_worker(struct mt76_worker *w)
 {
-	struct mt76_dev *dev = container_of(w, struct mt76_dev, tx_worker);
+	struct mt76_usb *usb = container_of(w, struct mt76_usb, status_worker);
+	struct mt76_dev *dev = container_of(usb, struct mt76_dev, usb);
 	struct mt76_queue_entry entry;
 	struct mt76_queue *q;
 	bool wake;
@@ -833,7 +834,7 @@ static void mt76u_tx_worker(struct mt76_worker *w)
 		if (!q->queued)
 			wake_up(&dev->tx_wait);
 
-		mt76_txq_schedule(&dev->phy, i);
+		mt76_worker_schedule(&dev->tx_worker);
 
 		if (dev->drv->tx_status_data &&
 		    !test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
@@ -877,7 +878,7 @@ static void mt76u_complete_tx(struct urb *urb)
 		dev_err(dev->dev, "tx urb failed: %d\n", urb->status);
 	e->done = true;
 
-	mt76_worker_schedule(&dev->tx_worker);
+	mt76_worker_schedule(&dev->usb.status_worker);
 }
 
 static int
@@ -1016,6 +1017,8 @@ static void mt76u_free_tx(struct mt76_dev *dev)
 {
 	int i;
 
+	mt76_worker_teardown(&dev->usb.status_worker);
+
 	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
 		struct mt76_queue *q;
 		int j;
@@ -1036,6 +1039,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 	int ret;
 
 	mt76_worker_disable(&dev->tx_worker);
+	mt76_worker_disable(&dev->usb.status_worker);
 
 	ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
 				 HZ / 5);
@@ -1074,6 +1078,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 	clear_bit(MT76_READING_STATS, &dev->phy.state);
 
 	mt76_worker_enable(&dev->tx_worker);
+	mt76_worker_enable(&dev->usb.status_worker);
 
 	mt76_tx_status_check(dev, NULL, true);
 }
@@ -1124,7 +1129,6 @@ int mt76u_init(struct mt76_dev *dev,
 	mt76u_ops.rmw = ext ? mt76u_rmw_ext : mt76u_rmw;
 	mt76u_ops.write_copy = ext ? mt76u_copy_ext : mt76u_copy;
 
-	dev->tx_worker.fn = mt76u_tx_worker;
 	INIT_WORK(&usb->stat_work, mt76u_tx_status_data);
 
 	usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
@@ -1152,7 +1156,13 @@ int mt76u_init(struct mt76_dev *dev,
 	if (err)
 		return err;
 
+	err = mt76_worker_setup(dev->hw, &usb->status_worker,
+				mt76u_status_worker, "usb-status");
+	if (err)
+		return err;
+
 	sched_set_fifo_low(usb->rx_worker.task);
+	sched_set_fifo_low(usb->status_worker.task);
 
 	return 0;
 }
Signature · 1 line
2.26.2