Commit c2f9e631 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

mt76: mt7663s: rely on mt76_connac_pm_ref/mt76_connac_pm_unref in tx path

Similar to mt7663e, rely on mt76_connac_pm_ref/mt76_connac_pm_unref to
check PM state and increment/decrement wake counter
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 50a97efe
...@@ -1942,12 +1942,18 @@ void mt7615_pm_wake_work(struct work_struct *work) ...@@ -1942,12 +1942,18 @@ void mt7615_pm_wake_work(struct work_struct *work)
mphy = dev->phy.mt76; mphy = dev->phy.mt76;
if (!mt7615_mcu_set_drv_ctrl(dev)) { if (!mt7615_mcu_set_drv_ctrl(dev)) {
struct mt76_dev *mdev = &dev->mt76;
int i; int i;
mt76_for_each_q_rx(&dev->mt76, i) if (mt76_is_sdio(mdev)) {
napi_schedule(&dev->mt76.napi[i]); mt76_worker_schedule(&mdev->sdio.txrx_worker);
mt76_connac_pm_dequeue_skbs(mphy, &dev->pm); } else {
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false); mt76_for_each_q_rx(mdev, i)
napi_schedule(&mdev->napi[i]);
mt76_connac_pm_dequeue_skbs(mphy, &dev->pm);
mt76_queue_tx_cleanup(dev, mdev->q_mcu[MT_MCUQ_WM],
false);
}
if (test_bit(MT76_STATE_RUNNING, &mphy->state)) if (test_bit(MT76_STATE_RUNNING, &mphy->state))
ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
MT7615_WATCHDOG_TIME); MT7615_WATCHDOG_TIME);
......
...@@ -283,9 +283,15 @@ void mt7663s_txrx_worker(struct mt76_worker *w) ...@@ -283,9 +283,15 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
{ {
struct mt76_sdio *sdio = container_of(w, struct mt76_sdio, struct mt76_sdio *sdio = container_of(w, struct mt76_sdio,
txrx_worker); txrx_worker);
struct mt76_dev *dev = container_of(sdio, struct mt76_dev, sdio); struct mt76_dev *mdev = container_of(sdio, struct mt76_dev, sdio);
struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
int i, nframes, ret; int i, nframes, ret;
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
queue_work(mdev->wq, &dev->pm.wake_work);
return;
}
/* disable interrupt */ /* disable interrupt */
sdio_claim_host(sdio->func); sdio_claim_host(sdio->func);
sdio_writel(sdio->func, WHLPCR_INT_EN_CLR, MCR_WHLPCR, NULL); sdio_writel(sdio->func, WHLPCR_INT_EN_CLR, MCR_WHLPCR, NULL);
...@@ -295,16 +301,16 @@ void mt7663s_txrx_worker(struct mt76_worker *w) ...@@ -295,16 +301,16 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
/* tx */ /* tx */
for (i = 0; i <= MT_TXQ_PSD; i++) { for (i = 0; i <= MT_TXQ_PSD; i++) {
ret = mt7663s_tx_run_queue(dev, dev->phy.q_tx[i]); ret = mt7663s_tx_run_queue(mdev, mdev->phy.q_tx[i]);
if (ret > 0) if (ret > 0)
nframes += ret; nframes += ret;
} }
ret = mt7663s_tx_run_queue(dev, dev->q_mcu[MT_MCUQ_WM]); ret = mt7663s_tx_run_queue(mdev, mdev->q_mcu[MT_MCUQ_WM]);
if (ret > 0) if (ret > 0)
nframes += ret; nframes += ret;
/* rx */ /* rx */
ret = mt7663s_rx_handler(dev); ret = mt7663s_rx_handler(mdev);
if (ret > 0) if (ret > 0)
nframes += ret; nframes += ret;
} while (nframes > 0); } while (nframes > 0);
...@@ -312,6 +318,8 @@ void mt7663s_txrx_worker(struct mt76_worker *w) ...@@ -312,6 +318,8 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
/* enable interrupt */ /* enable interrupt */
sdio_writel(sdio->func, WHLPCR_INT_EN_SET, MCR_WHLPCR, NULL); sdio_writel(sdio->func, WHLPCR_INT_EN_SET, MCR_WHLPCR, NULL);
sdio_release_host(sdio->func); sdio_release_host(sdio->func);
mt76_connac_pm_unref(&dev->mphy, &dev->pm);
} }
void mt7663s_sdio_irq(struct sdio_func *func) void mt7663s_sdio_irq(struct sdio_func *func)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment