]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: mt7921e: fix random fw download fail
authorDeren Wu <deren.wu@mediatek.com>
Mon, 12 Sep 2022 08:45:52 +0000 (16:45 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 29 Oct 2022 08:08:35 +0000 (10:08 +0200)
[ Upstream commit 29e247ece5d3edfa71495768a9ab5fc7bba76bd4 ]

In case of PCIe interoperability problem shows up, the firmware
payload may be corrupted in download stage. Turn off L0s to keep
fw download process accurately.

[ 1093.528363] mt7921e 0000:3b:00.0: Message 00000007 (seq 7) timeout
[ 1093.528414] mt7921e 0000:3b:00.0: Failed to start patch
[ 1096.600156] mt7921e 0000:3b:00.0: Message 00000010 (seq 8) timeout
[ 1096.600207] mt7921e 0000:3b:00.0: Failed to release patch semaphore
[ 1097.699031] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1098.758427] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1099.834408] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1100.915264] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1101.990625] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1103.077587] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1104.173258] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1105.248466] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1106.336969] mt7921e 0000:3b:00.0: Timeout for driver own
[ 1106.397542] mt7921e 0000:3b:00.0: hardware init failed

Cc: stable@vger.kernel.org
Fixes: bf3747ae2e25 ("mt76: mt7921: enable aspm by default")
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c
drivers/net/wireless/mediatek/mt76/mt7921/regs.h

index e5b1f6249763adc85f822deeb94f545874f607a7..9c92f20c4aeb449fc84a24f55b95939e43a7918d 100644 (file)
@@ -152,6 +152,7 @@ static u32 __mt7921_reg_addr(struct mt7921_dev *dev, u32 addr)
                { 0x820c8000, 0x0c000, 0x2000 }, /* WF_UMAC_TOP (PSE) */
                { 0x820cc000, 0x0e000, 0x1000 }, /* WF_UMAC_TOP (PP) */
                { 0x820cd000, 0x0f000, 0x1000 }, /* WF_MDP_TOP */
+               { 0x74030000, 0x10000, 0x10000 }, /* PCIE_MAC_IREG */
                { 0x820ce000, 0x21c00, 0x0200 }, /* WF_LMAC_TOP (WF_SEC) */
                { 0x820cf000, 0x22000, 0x1000 }, /* WF_LMAC_TOP (WF_PF) */
                { 0x820e0000, 0x20000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_CFG) */
index 5efda694fb9d56c338d6da47e922d3bb1199295c..19facf31e4e144594c77aa4861fbe3f55a8ba8d8 100644 (file)
@@ -59,6 +59,8 @@ int mt7921e_mcu_init(struct mt7921_dev *dev)
        if (err)
                return err;
 
+       mt76_rmw_field(dev, MT_PCIE_MAC_PM, MT_PCIE_MAC_PM_L0S_DIS, 1);
+
        err = mt7921_run_firmware(dev);
 
        mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
index ea643260ceb6666209fec4cb9f4a0b178999d43f..c65582acfa55de50231af74e4540b980af4ac1fe 100644 (file)
 #define MT_PCIE_MAC_BASE               0x10000
 #define MT_PCIE_MAC(ofs)               (MT_PCIE_MAC_BASE + (ofs))
 #define MT_PCIE_MAC_INT_ENABLE         MT_PCIE_MAC(0x188)
+#define MT_PCIE_MAC_PM                 MT_PCIE_MAC(0x194)
+#define MT_PCIE_MAC_PM_L0S_DIS         BIT(8)
 
 #define MT_DMA_SHDL(ofs)               (0x7c026000 + (ofs))
 #define MT_DMASHDL_SW_CONTROL          MT_DMA_SHDL(0x004)