Skip to content

Commit 9daf27e

Browse files
LorenzoBianconinbd168
authored andcommitted
mt76: mt76u: use dedicated thread for status work
Split tx and status path in mt76-usb module relying on mt76 workers APIs Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
1 parent be83a7e commit 9daf27e

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

drivers/net/wireless/mediatek/mt76/mt76.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,9 @@ struct mt76_usb {
430430
u8 *data;
431431
u16 data_len;
432432

433+
struct mt76_worker status_worker;
433434
struct mt76_worker rx_worker;
435+
434436
struct work_struct stat_work;
435437

436438
u8 out_ep[__MT_EP_OUT_MAX];

drivers/net/wireless/mediatek/mt76/usb.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -805,9 +805,10 @@ int mt76u_resume_rx(struct mt76_dev *dev)
805805
}
806806
EXPORT_SYMBOL_GPL(mt76u_resume_rx);
807807

808-
static void mt76u_tx_worker(struct mt76_worker *w)
808+
static void mt76u_status_worker(struct mt76_worker *w)
809809
{
810-
struct mt76_dev *dev = container_of(w, struct mt76_dev, tx_worker);
810+
struct mt76_usb *usb = container_of(w, struct mt76_usb, status_worker);
811+
struct mt76_dev *dev = container_of(usb, struct mt76_dev, usb);
811812
struct mt76_queue_entry entry;
812813
struct mt76_queue *q;
813814
bool wake;
@@ -833,7 +834,7 @@ static void mt76u_tx_worker(struct mt76_worker *w)
833834
if (!q->queued)
834835
wake_up(&dev->tx_wait);
835836

836-
mt76_txq_schedule(&dev->phy, i);
837+
mt76_worker_schedule(&dev->tx_worker);
837838

838839
if (dev->drv->tx_status_data &&
839840
!test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
@@ -877,7 +878,7 @@ static void mt76u_complete_tx(struct urb *urb)
877878
dev_err(dev->dev, "tx urb failed: %d\n", urb->status);
878879
e->done = true;
879880

880-
mt76_worker_schedule(&dev->tx_worker);
881+
mt76_worker_schedule(&dev->usb.status_worker);
881882
}
882883

883884
static int
@@ -1016,6 +1017,8 @@ static void mt76u_free_tx(struct mt76_dev *dev)
10161017
{
10171018
int i;
10181019

1020+
mt76_worker_teardown(&dev->usb.status_worker);
1021+
10191022
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
10201023
struct mt76_queue *q;
10211024
int j;
@@ -1036,6 +1039,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)
10361039
int ret;
10371040

10381041
mt76_worker_disable(&dev->tx_worker);
1042+
mt76_worker_disable(&dev->usb.status_worker);
10391043

10401044
ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
10411045
HZ / 5);
@@ -1074,6 +1078,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)
10741078
clear_bit(MT76_READING_STATS, &dev->phy.state);
10751079

10761080
mt76_worker_enable(&dev->tx_worker);
1081+
mt76_worker_enable(&dev->usb.status_worker);
10771082

10781083
mt76_tx_status_check(dev, NULL, true);
10791084
}
@@ -1124,7 +1129,6 @@ int mt76u_init(struct mt76_dev *dev,
11241129
mt76u_ops.rmw = ext ? mt76u_rmw_ext : mt76u_rmw;
11251130
mt76u_ops.write_copy = ext ? mt76u_copy_ext : mt76u_copy;
11261131

1127-
dev->tx_worker.fn = mt76u_tx_worker;
11281132
INIT_WORK(&usb->stat_work, mt76u_tx_status_data);
11291133

11301134
usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
@@ -1152,7 +1156,13 @@ int mt76u_init(struct mt76_dev *dev,
11521156
if (err)
11531157
return err;
11541158

1159+
err = mt76_worker_setup(dev->hw, &usb->status_worker,
1160+
mt76u_status_worker, "usb-status");
1161+
if (err)
1162+
return err;
1163+
11551164
sched_set_fifo_low(usb->rx_worker.task);
1165+
sched_set_fifo_low(usb->status_worker.task);
11561166

11571167
return 0;
11581168
}

0 commit comments

Comments
 (0)