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 <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
be83a7e20c
commit
9daf27e628
2 changed files with 17 additions and 5 deletions
|
@ -430,7 +430,9 @@ struct mt76_usb {
|
||||||
u8 *data;
|
u8 *data;
|
||||||
u16 data_len;
|
u16 data_len;
|
||||||
|
|
||||||
|
struct mt76_worker status_worker;
|
||||||
struct mt76_worker rx_worker;
|
struct mt76_worker rx_worker;
|
||||||
|
|
||||||
struct work_struct stat_work;
|
struct work_struct stat_work;
|
||||||
|
|
||||||
u8 out_ep[__MT_EP_OUT_MAX];
|
u8 out_ep[__MT_EP_OUT_MAX];
|
||||||
|
|
|
@ -805,9 +805,10 @@ int mt76u_resume_rx(struct mt76_dev *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mt76u_resume_rx);
|
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_entry entry;
|
||||||
struct mt76_queue *q;
|
struct mt76_queue *q;
|
||||||
bool wake;
|
bool wake;
|
||||||
|
@ -833,7 +834,7 @@ static void mt76u_tx_worker(struct mt76_worker *w)
|
||||||
if (!q->queued)
|
if (!q->queued)
|
||||||
wake_up(&dev->tx_wait);
|
wake_up(&dev->tx_wait);
|
||||||
|
|
||||||
mt76_txq_schedule(&dev->phy, i);
|
mt76_worker_schedule(&dev->tx_worker);
|
||||||
|
|
||||||
if (dev->drv->tx_status_data &&
|
if (dev->drv->tx_status_data &&
|
||||||
!test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
|
!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);
|
dev_err(dev->dev, "tx urb failed: %d\n", urb->status);
|
||||||
e->done = true;
|
e->done = true;
|
||||||
|
|
||||||
mt76_worker_schedule(&dev->tx_worker);
|
mt76_worker_schedule(&dev->usb.status_worker);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1016,6 +1017,8 @@ static void mt76u_free_tx(struct mt76_dev *dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
mt76_worker_teardown(&dev->usb.status_worker);
|
||||||
|
|
||||||
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||||||
struct mt76_queue *q;
|
struct mt76_queue *q;
|
||||||
int j;
|
int j;
|
||||||
|
@ -1036,6 +1039,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mt76_worker_disable(&dev->tx_worker);
|
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),
|
ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
|
||||||
HZ / 5);
|
HZ / 5);
|
||||||
|
@ -1074,6 +1078,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)
|
||||||
clear_bit(MT76_READING_STATS, &dev->phy.state);
|
clear_bit(MT76_READING_STATS, &dev->phy.state);
|
||||||
|
|
||||||
mt76_worker_enable(&dev->tx_worker);
|
mt76_worker_enable(&dev->tx_worker);
|
||||||
|
mt76_worker_enable(&dev->usb.status_worker);
|
||||||
|
|
||||||
mt76_tx_status_check(dev, NULL, true);
|
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.rmw = ext ? mt76u_rmw_ext : mt76u_rmw;
|
||||||
mt76u_ops.write_copy = ext ? mt76u_copy_ext : mt76u_copy;
|
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);
|
INIT_WORK(&usb->stat_work, mt76u_tx_status_data);
|
||||||
|
|
||||||
usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
|
usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
|
||||||
|
@ -1152,7 +1156,13 @@ int mt76u_init(struct mt76_dev *dev,
|
||||||
if (err)
|
if (err)
|
||||||
return 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->rx_worker.task);
|
||||||
|
sched_set_fifo_low(usb->status_worker.task);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue