Message ID | 1190a401463547e555912ef9417138df4ab2c363.1662972106.git.deren.wu@mediatek.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Felix Fietkau |
Headers | show |
Series | [v2] wifi: mt76: mt7921e: fix random fw download fail | expand |
Il 12/09/22 10:45, Deren Wu ha scritto: > From: Deren Wu <deren.wu@mediatek.com> > > 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> [For MT8195 Acer Tomato Chromebook] Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c index 9d1ba838e54f..43a8deeb17df 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c @@ -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) */ diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c index 5efda694fb9d..19facf31e4e1 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c @@ -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); diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/regs.h b/drivers/net/wireless/mediatek/mt76/mt7921/regs.h index ea643260ceb6..c65582acfa55 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/regs.h +++ b/drivers/net/wireless/mediatek/mt76/mt7921/regs.h @@ -440,6 +440,8 @@ #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)