All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mt76: mt7915: improve error recovery reliability
@ 2021-06-02  6:02 Felix Fietkau
  2021-06-02  9:29 ` kernel test robot
  0 siblings, 1 reply; 2+ messages in thread
From: Felix Fietkau @ 2021-06-02  6:02 UTC (permalink / raw)
  To: linux-wireless

- Remove no-op code for queue lock/unlock, which is no longer needed
- Set a missing DMA flag
- Wait for full completion of error recovery before restarting tx
- Schedule IRQ tasklet to ensure that IRQ mask gets written

Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
 .../net/wireless/mediatek/mt76/mt7915/mac.c   | 29 ++++++++++---------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 642a11e72bef..ecd00dfa68ff 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1608,14 +1608,18 @@ mt7915_dma_reset(struct mt7915_dev *dev)
 	mt76_set(dev, MT_WFDMA0_GLO_CFG,
 		 MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
 	mt76_set(dev, MT_WFDMA1_GLO_CFG,
-		 MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN);
+		 MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN |
+		 MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
+		 MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
 	if (dev->hif2) {
 		mt76_set(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
 			(MT_WFDMA0_GLO_CFG_TX_DMA_EN |
 			 MT_WFDMA0_GLO_CFG_RX_DMA_EN));
 		mt76_set(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,
 			(MT_WFDMA1_GLO_CFG_TX_DMA_EN |
-			 MT_WFDMA1_GLO_CFG_RX_DMA_EN));
+			 MT_WFDMA1_GLO_CFG_RX_DMA_EN |
+			 MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
+			 MT_WFDMA1_GLO_CFG_OMIT_RX_INFO));
 	}
 }
 
@@ -1659,11 +1663,6 @@ void mt7915_mac_reset_work(struct work_struct *work)
 		set_bit(MT76_RESET, &phy2->mt76->state);
 		cancel_delayed_work_sync(&phy2->mt76->mac_work);
 	}
-	/* lock/unlock all queues to ensure that no tx is pending */
-	mt76_txq_schedule_all(&dev->mphy);
-	if (ext_phy)
-		mt76_txq_schedule_all(ext_phy);
-
 	mt76_worker_disable(&dev->mt76.tx_worker);
 	napi_disable(&dev->mt76.napi[0]);
 	napi_disable(&dev->mt76.napi[1]);
@@ -1689,10 +1688,6 @@ void mt7915_mac_reset_work(struct work_struct *work)
 	if (phy2)
 		clear_bit(MT76_RESET, &phy2->mt76->state);
 
-	mt76_worker_enable(&dev->mt76.tx_worker);
-	napi_enable(&dev->mt76.tx_napi);
-	napi_schedule(&dev->mt76.tx_napi);
-
 	napi_enable(&dev->mt76.napi[0]);
 	napi_schedule(&dev->mt76.napi[0]);
 
@@ -1701,14 +1696,20 @@ void mt7915_mac_reset_work(struct work_struct *work)
 
 	napi_enable(&dev->mt76.napi[2]);
 	napi_schedule(&dev->mt76.napi[2]);
+	tasklet_schedule(&dev->irq_tasklet);
+
+	mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);
+	mt7915_wait_reset_state(dev, MT_MCU_CMD_NORMAL_STATE);
+
+	mt76_worker_enable(&dev->mt76.tx_worker);
+
+	napi_enable(&dev->mt76.tx_napi);
+	napi_schedule(&dev->mt76.tx_napi);
 
 	ieee80211_wake_queues(mt76_hw(dev));
 	if (ext_phy)
 		ieee80211_wake_queues(ext_phy->hw);
 
-	mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);
-	mt7915_wait_reset_state(dev, MT_MCU_CMD_NORMAL_STATE);
-
 	mutex_unlock(&dev->mt76.mutex);
 
 	mt7915_update_beacons(dev);
-- 
2.30.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] mt76: mt7915: improve error recovery reliability
  2021-06-02  6:02 [PATCH] mt76: mt7915: improve error recovery reliability Felix Fietkau
@ 2021-06-02  9:29 ` kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2021-06-02  9:29 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 4966 bytes --]

Hi Felix,

I love your patch! Yet something to improve:

[auto build test ERROR on wireless-drivers-next/master]
[also build test ERROR on wireless-drivers/master v5.13-rc4 next-20210601]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Felix-Fietkau/mt76-mt7915-improve-error-recovery-reliability/20210602-140346
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/2c848945c4f5daa30ffb2030d9709b06d323e602
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Felix-Fietkau/mt76-mt7915-improve-error-recovery-reliability/20210602-140346
        git checkout 2c848945c4f5daa30ffb2030d9709b06d323e602
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=riscv 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/net/wireless/mediatek/mt76/mt7915/mac.c: In function 'mt7915_mac_reset_work':
>> drivers/net/wireless/mediatek/mt76/mt7915/mac.c:1628:23: error: 'struct mt7915_dev' has no member named 'irq_tasklet'
    1628 |  tasklet_schedule(&dev->irq_tasklet);
         |                       ^~


vim +1628 drivers/net/wireless/mediatek/mt76/mt7915/mac.c

  1568	
  1569	/* system error recovery */
  1570	void mt7915_mac_reset_work(struct work_struct *work)
  1571	{
  1572		struct mt7915_phy *phy2;
  1573		struct mt76_phy *ext_phy;
  1574		struct mt7915_dev *dev;
  1575	
  1576		dev = container_of(work, struct mt7915_dev, reset_work);
  1577		ext_phy = dev->mt76.phy2;
  1578		phy2 = ext_phy ? ext_phy->priv : NULL;
  1579	
  1580		if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_DMA))
  1581			return;
  1582	
  1583		ieee80211_stop_queues(mt76_hw(dev));
  1584		if (ext_phy)
  1585			ieee80211_stop_queues(ext_phy->hw);
  1586	
  1587		set_bit(MT76_RESET, &dev->mphy.state);
  1588		set_bit(MT76_MCU_RESET, &dev->mphy.state);
  1589		wake_up(&dev->mt76.mcu.wait);
  1590		cancel_delayed_work_sync(&dev->mphy.mac_work);
  1591		if (phy2) {
  1592			set_bit(MT76_RESET, &phy2->mt76->state);
  1593			cancel_delayed_work_sync(&phy2->mt76->mac_work);
  1594		}
  1595		mt76_worker_disable(&dev->mt76.tx_worker);
  1596		napi_disable(&dev->mt76.napi[0]);
  1597		napi_disable(&dev->mt76.napi[1]);
  1598		napi_disable(&dev->mt76.napi[2]);
  1599		napi_disable(&dev->mt76.tx_napi);
  1600	
  1601		mutex_lock(&dev->mt76.mutex);
  1602	
  1603		mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
  1604	
  1605		if (mt7915_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {
  1606			mt7915_dma_reset(dev);
  1607	
  1608			mt7915_tx_token_put(dev);
  1609			idr_init(&dev->mt76.token);
  1610	
  1611			mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_INIT);
  1612			mt7915_wait_reset_state(dev, MT_MCU_CMD_RECOVERY_DONE);
  1613		}
  1614	
  1615		clear_bit(MT76_MCU_RESET, &dev->mphy.state);
  1616		clear_bit(MT76_RESET, &dev->mphy.state);
  1617		if (phy2)
  1618			clear_bit(MT76_RESET, &phy2->mt76->state);
  1619	
  1620		napi_enable(&dev->mt76.napi[0]);
  1621		napi_schedule(&dev->mt76.napi[0]);
  1622	
  1623		napi_enable(&dev->mt76.napi[1]);
  1624		napi_schedule(&dev->mt76.napi[1]);
  1625	
  1626		napi_enable(&dev->mt76.napi[2]);
  1627		napi_schedule(&dev->mt76.napi[2]);
> 1628		tasklet_schedule(&dev->irq_tasklet);
  1629	
  1630		mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);
  1631		mt7915_wait_reset_state(dev, MT_MCU_CMD_NORMAL_STATE);
  1632	
  1633		mt76_worker_enable(&dev->mt76.tx_worker);
  1634	
  1635		napi_enable(&dev->mt76.tx_napi);
  1636		napi_schedule(&dev->mt76.tx_napi);
  1637	
  1638		ieee80211_wake_queues(mt76_hw(dev));
  1639		if (ext_phy)
  1640			ieee80211_wake_queues(ext_phy->hw);
  1641	
  1642		mutex_unlock(&dev->mt76.mutex);
  1643	
  1644		mt7915_update_beacons(dev);
  1645	
  1646		ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
  1647					     MT7915_WATCHDOG_TIME);
  1648		if (phy2)
  1649			ieee80211_queue_delayed_work(ext_phy->hw,
  1650						     &phy2->mt76->mac_work,
  1651						     MT7915_WATCHDOG_TIME);
  1652	}
  1653	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 69794 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-06-02  9:29 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-06-02  6:02 [PATCH] mt76: mt7915: improve error recovery reliability Felix Fietkau
2021-06-02  9:29 ` kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.