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)
committerFelix Fietkau <nbd@nbd.name>
Thu, 15 Sep 2022 11:21:39 +0000 (13:21 +0200)
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>
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 6ff9249eee909232929491e0e32448c5d040d57a..8a53d8f286dbefd72f247916f6872390c39b583a 100644 (file)
@@ -148,6 +148,7 @@ static u32 __mt7921_reg_addr(struct mt7921_dev *dev, u32 addr)
                { 0x820c8000, 0x0c000, 0x02000 }, /* WF_UMAC_TOP (PSE) */
                { 0x820cc000, 0x0e000, 0x01000 }, /* WF_UMAC_TOP (PP) */
                { 0x820cd000, 0x0f000, 0x01000 }, /* WF_MDP_TOP */
+               { 0x74030000, 0x10000, 0x10000 }, /* PCIE_MAC_IREG */
                { 0x820ce000, 0x21c00, 0x00200 }, /* WF_LMAC_TOP (WF_SEC) */
                { 0x820cf000, 0x22000, 0x01000 }, /* WF_LMAC_TOP (WF_PF) */
                { 0x820e0000, 0x20000, 0x00400 }, /* WF_LMAC_TOP BN0 (WF_CFG) */
index 64568536c1e9650eeea21ec8acf11a5525deabd6..86340d3205c55a01b6dce9264b2414c53d3889af 100644 (file)
@@ -54,6 +54,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)