mt76u: convert rx/status path to worker APIs
Subsystems (2)
Lorenzo Bianconi
maintainercover 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
Lorenzo Bianconi
maintainerPATCH 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
Signed-off-by Lorenzo Bianconi <[email protected]>
--- 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
@@ -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
@@ -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
@@ -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
@@ -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
Lorenzo Bianconi
maintainerPATCH 2/2 mt76: mt76u: use dedicated thread for status work
In reply to Lorenzo BianconiSplit tx and status path in mt76-usb module relying on mt76 workers APIs
Signed-off-by Lorenzo Bianconi <[email protected]>
--- 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
@@ -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
@@ -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