diff --git a/patches.suse/wifi-mt76-mt7921e-improve-reliability-of-dma-reset.patch b/patches.suse/wifi-mt76-mt7921e-improve-reliability-of-dma-reset.patch new file mode 100644 index 0000000..b721952 --- /dev/null +++ b/patches.suse/wifi-mt76-mt7921e-improve-reliability-of-dma-reset.patch @@ -0,0 +1,107 @@ +From 87714bf6ed1589813e473db5471e6e9857755764 Mon Sep 17 00:00:00 2001 +From: Quan Zhou +Date: Thu, 13 Apr 2023 05:11:13 +0800 +Subject: [PATCH] wifi: mt76: mt7921e: improve reliability of dma reset +Git-commit: 87714bf6ed1589813e473db5471e6e9857755764 +Patch-mainline: v6.4-rc1 +References: git-fixes + +The hardware team has advised the driver that it is necessary to first put +WFDMA into an idle state before resetting the WFDMA. Otherwise, the WFDMA +may enter an unknown state where it cannot be polled with the right state +successfully. To ensure that the DMA can work properly while a stressful +cold reboot test was being made, we have reordered the programming sequence +in the driver based on the hardware team's guidance. + +The patch would modify the WFDMA disabling flow from + +"DMA reset -> disabling DMASHDL -> disabling WFDMA -> polling and waiting +until DMA idle" to "disabling WFDMA -> polling and waiting for DMA idle -> +disabling DMASHDL -> DMA reset. + +Where he polling and waiting until WFDMA is idle is coordinated with the +operation of disabling WFDMA. Even while WFDMA is being disabled, it can +still handle Tx/Rx requests. The additional polling allows sufficient time +for WFDMA to process the last T/Rx request. When the idle state of WFDMA is +reached, it is a reliable indication that DMASHDL is also idle to ensure it +is safe to disable it and perform the DMA reset. + +Fixes: 0a1059d0f060 ("mt76: mt7921: move mt7921_dma_reset in dma.c") +Co-developed-by: Sean Wang +Signed-off-by: Sean Wang +Co-developed-by: Deren Wu +Signed-off-by: Deren Wu +Co-developed-by: Wang Zhao +Signed-off-by: Wang Zhao +Signed-off-by: Quan Zhou +Signed-off-by: Felix Fietkau +Acked-by: Takashi Iwai + +--- + .../net/wireless/mediatek/mt76/mt7921/dma.c | 36 ++++++++++--------- + 1 file changed, 20 insertions(+), 16 deletions(-) + +diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/dma.c b/drivers/net/wireless/mediatek/mt76/mt7921/dma.c +index 28207172c4ef..f0a80c2b476a 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt7921/dma.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7921/dma.c +@@ -66,22 +66,6 @@ static void mt7921_dma_prefetch(struct mt7921_dev *dev) + + static int mt7921_dma_disable(struct mt7921_dev *dev, bool force) + { +- if (force) { +- /* reset */ +- mt76_clear(dev, MT_WFDMA0_RST, +- MT_WFDMA0_RST_DMASHDL_ALL_RST | +- MT_WFDMA0_RST_LOGIC_RST); +- +- mt76_set(dev, MT_WFDMA0_RST, +- MT_WFDMA0_RST_DMASHDL_ALL_RST | +- MT_WFDMA0_RST_LOGIC_RST); +- } +- +- /* disable dmashdl */ +- mt76_clear(dev, MT_WFDMA0_GLO_CFG_EXT0, +- MT_WFDMA0_CSR_TX_DMASHDL_ENABLE); +- mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS); +- + /* disable WFDMA0 */ + mt76_clear(dev, MT_WFDMA0_GLO_CFG, + MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN | +@@ -95,6 +79,22 @@ static int mt7921_dma_disable(struct mt7921_dev *dev, bool force) + MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1)) + return -ETIMEDOUT; + ++ /* disable dmashdl */ ++ mt76_clear(dev, MT_WFDMA0_GLO_CFG_EXT0, ++ MT_WFDMA0_CSR_TX_DMASHDL_ENABLE); ++ mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS); ++ ++ if (force) { ++ /* reset */ ++ mt76_clear(dev, MT_WFDMA0_RST, ++ MT_WFDMA0_RST_DMASHDL_ALL_RST | ++ MT_WFDMA0_RST_LOGIC_RST); ++ ++ mt76_set(dev, MT_WFDMA0_RST, ++ MT_WFDMA0_RST_DMASHDL_ALL_RST | ++ MT_WFDMA0_RST_LOGIC_RST); ++ } ++ + return 0; + } + +@@ -301,6 +301,10 @@ void mt7921_dma_cleanup(struct mt7921_dev *dev) + MT_WFDMA0_GLO_CFG_OMIT_RX_INFO | + MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2); + ++ mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG, ++ MT_WFDMA0_GLO_CFG_TX_DMA_BUSY | ++ MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1); ++ + /* reset */ + mt76_clear(dev, MT_WFDMA0_RST, + MT_WFDMA0_RST_DMASHDL_ALL_RST | +-- +2.35.3 + diff --git a/series.conf b/series.conf index 836bc6d..6e8a5e6 100644 --- a/series.conf +++ b/series.conf @@ -19915,6 +19915,7 @@ patches.suse/wifi-mt76-mt7921e-Set-memory-space-enable-in-PCI_COM.patch patches.suse/wifi-mt76-mt7921e-fix-probe-timeout-after-reboot.patch patches.suse/wifi-mt76-fix-6GHz-high-channel-not-be-scanned.patch + patches.suse/wifi-mt76-mt7921e-improve-reliability-of-dma-reset.patch patches.suse/Revert-Bluetooth-btsdio-fix-use-after-free-bug-in-bt.patch patches.suse/bluetooth-Perform-careful-capability-checks-in-hci_s.patch patches.suse/net-mana-Rename-mana_refill_rxoob-and-remove-some-em.patch