mt76: mt7663: rely on mt76_connac_pm_ref/mt76_connac_pm_unref in tx/rx napi
Introduce mt7615_poll_rx rx napi callback for mt7663. Do not access device registers in tx/rx napi if the device is not awake. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
committed by
Felix Fietkau
parent
917dccb6ee
commit
db928f1ab9
@@ -71,15 +71,39 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)
|
|||||||
struct mt7615_dev *dev;
|
struct mt7615_dev *dev;
|
||||||
|
|
||||||
dev = container_of(napi, struct mt7615_dev, mt76.tx_napi);
|
dev = container_of(napi, struct mt7615_dev, mt76.tx_napi);
|
||||||
|
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
|
||||||
|
napi_complete(napi);
|
||||||
|
queue_work(dev->mt76.wq, &dev->pm.wake_work);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
|
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
|
||||||
|
if (napi_complete(napi))
|
||||||
if (napi_complete_done(napi, 0))
|
|
||||||
mt7615_irq_enable(dev, mt7615_tx_mcu_int_mask(dev));
|
mt7615_irq_enable(dev, mt7615_tx_mcu_int_mask(dev));
|
||||||
|
|
||||||
|
mt76_connac_pm_unref(&dev->pm);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mt7615_poll_rx(struct napi_struct *napi, int budget)
|
||||||
|
{
|
||||||
|
struct mt7615_dev *dev;
|
||||||
|
int done;
|
||||||
|
|
||||||
|
dev = container_of(napi->dev, struct mt7615_dev, mt76.napi_dev);
|
||||||
|
|
||||||
|
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
|
||||||
|
napi_complete(napi);
|
||||||
|
queue_work(dev->mt76.wq, &dev->pm.wake_work);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
done = mt76_dma_rx_poll(napi, budget);
|
||||||
|
mt76_connac_pm_unref(&dev->pm);
|
||||||
|
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
int mt7615_wait_pdma_busy(struct mt7615_dev *dev)
|
int mt7615_wait_pdma_busy(struct mt7615_dev *dev)
|
||||||
{
|
{
|
||||||
struct mt76_dev *mdev = &dev->mt76;
|
struct mt76_dev *mdev = &dev->mt76;
|
||||||
@@ -261,7 +285,7 @@ int mt7615_dma_init(struct mt7615_dev *dev)
|
|||||||
|
|
||||||
mt76_wr(dev, MT_DELAY_INT_CFG, 0);
|
mt76_wr(dev, MT_DELAY_INT_CFG, 0);
|
||||||
|
|
||||||
ret = mt76_init_queues(dev, mt76_dma_rx_poll);
|
ret = mt76_init_queues(dev, mt7615_poll_rx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|||||||
@@ -1913,10 +1913,14 @@ void mt7615_pm_wake_work(struct work_struct *work)
|
|||||||
pm.wake_work);
|
pm.wake_work);
|
||||||
mphy = dev->phy.mt76;
|
mphy = dev->phy.mt76;
|
||||||
|
|
||||||
if (!mt7615_mcu_set_drv_ctrl(dev))
|
if (!mt7615_mcu_set_drv_ctrl(dev)) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mt76_for_each_q_rx(&dev->mt76, i)
|
||||||
|
napi_schedule(&dev->mt76.napi[i]);
|
||||||
mt76_connac_pm_dequeue_skbs(mphy, &dev->pm);
|
mt76_connac_pm_dequeue_skbs(mphy, &dev->pm);
|
||||||
else
|
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
|
||||||
dev_err(mphy->dev->dev, "failed to wake device\n");
|
}
|
||||||
|
|
||||||
ieee80211_wake_queues(mphy->hw);
|
ieee80211_wake_queues(mphy->hw);
|
||||||
complete_all(&dev->pm.wake_cmpl);
|
complete_all(&dev->pm.wake_cmpl);
|
||||||
|
|||||||
Reference in New Issue
Block a user