summarylogtreecommitdiffstats
path: root/sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initial...
diff options
context:
space:
mode:
authordragonn2021-09-18 10:01:44 +0200
committerdragonn2021-09-18 10:01:44 +0200
commit825d71ed713c470164cb24131dd6af6fcb19664e (patch)
tree2422ae50eb0bf5fec3e80d533425293bf1a57730 /sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initialization-flow.patch
parent8f5e12722e0aa4ead0854037a38ff6dbb1981a6b (diff)
downloadaur-825d71ed713c470164cb24131dd6af6fcb19664e.tar.gz
5.14.5
Diffstat (limited to 'sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initialization-flow.patch')
-rw-r--r--sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initialization-flow.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initialization-flow.patch b/sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initialization-flow.patch
new file mode 100644
index 000000000000..f475476f8832
--- /dev/null
+++ b/sys-kernel_arch-sources-g14_files-8013-mt76-mt7921-robustify-hardware-initialization-flow.patch
@@ -0,0 +1,125 @@
+From: <sean.wang@mediatek.com>
+To: <nbd@nbd.name>, <lorenzo.bianconi@redhat.com>
+CC: <sean.wang@mediatek.com>, <Soul.Huang@mediatek.com>,
+ <YN.Chen@mediatek.com>, <Leon.Yen@mediatek.com>,
+ <Eric-SY.Chang@mediatek.com>, <Deren.Wu@mediatek.com>, <km.lin@mediatek.com>,
+ <robin.chiu@mediatek.com>, <ch.yeh@mediatek.com>, <posh.sun@mediatek.com>,
+ <ted.huang@mediatek.com>, <Eric.Liang@mediatek.com>,
+ <Stella.Chang@mediatek.com>, <jemele@google.com>,
+ <linux-wireless@vger.kernel.org>, <linux-mediatek@lists.infradead.org>
+Subject: [PATCH 1/2] mt76: mt7921: robustify hardware initialization flow
+Date: Tue, 14 Sep 2021 23:50:21 +0800
+
+From: Sean Wang <sean.wang@mediatek.com>
+
+Robustify hardware initialization in the current driver probing flow
+to get rid of the device is possibly lost after the machine boot due
+to possible firmware abnormal state by trying to recover the failure
+with more chances.
+
+Tested-by: Leon Yen <Leon.Yen@mediatek.com>
+Tested-by: YN Chen <YN.Chen@mediatek.com>
+Signed-off-by: Sean Wang <sean.wang@mediatek.com>
+---
+ .../net/wireless/mediatek/mt76/mt7921/init.c | 53 ++++++++++++++-----
+ .../wireless/mediatek/mt76/mt7921/mt7921.h | 1 +
+ 2 files changed, 41 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
+index 1f37e64b6038..d26166a612f0 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
+@@ -146,33 +146,60 @@ int mt7921_mac_init(struct mt7921_dev *dev)
+ return mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b, 0);
+ }
+
+-static int mt7921_init_hardware(struct mt7921_dev *dev)
++static int __mt7921_init_hardware(struct mt7921_dev *dev)
+ {
+- int ret, idx;
+-
+- ret = mt7921_dma_init(dev);
+- if (ret)
+- return ret;
+-
+- set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state);
++ struct mt76_dev *mdev = &dev->mt76;
++ int ret;
+
+ /* force firmware operation mode into normal state,
+ * which should be set before firmware download stage.
+ */
+ mt76_wr(dev, MT_SWDEF_MODE, MT_SWDEF_NORMAL_MODE);
+-
+ ret = mt7921_mcu_init(dev);
+ if (ret)
+- return ret;
++ goto out;
+
+ ret = mt7921_eeprom_init(dev);
+- if (ret < 0)
+- return ret;
++ if (ret)
++ goto out;
+
+ ret = mt7921_mcu_set_eeprom(dev);
++ if (ret)
++ goto out;
++
++ ret = mt7921_mac_init(dev);
++out:
++ if (ret && mdev->eeprom.data) {
++ devm_kfree(mdev->dev, mdev->eeprom.data);
++ mdev->eeprom.data = NULL;
++ }
++
++ return ret;
++}
++
++static int mt7921_init_hardware(struct mt7921_dev *dev)
++{
++ int ret, idx, i;
++
++ ret = mt7921_dma_init(dev);
+ if (ret)
+ return ret;
+
++ set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state);
++
++ for (i = 0; i < MT7921_MCU_INIT_RETRY_COUNT; i++) {
++ ret = __mt7921_init_hardware(dev);
++ if (!ret)
++ break;
++
++ mt7921_wpdma_reset(dev, true);
++ }
++
++ if (i == MT7921_MCU_INIT_RETRY_COUNT) {
++ dev_err(dev->mt76.dev, "hardware init failed\n");
++ return ret;
++ }
++
+ /* Beacon and mgmt frames should occupy wcid 0 */
+ idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7921_WTBL_STA - 1);
+ if (idx)
+@@ -183,7 +210,7 @@ static int mt7921_init_hardware(struct mt7921_dev *dev)
+ dev->mt76.global_wcid.tx_info |= MT_WCID_TX_INFO_SET;
+ rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid);
+
+- return mt7921_mac_init(dev);
++ return 0;
+ }
+
+ int mt7921_register_device(struct mt7921_dev *dev)
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+index 6a47ba65b96e..cee7a2507224 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+@@ -29,6 +29,7 @@
+ #define MT7921_RX_MCU_RING_SIZE 512
+
+ #define MT7921_DRV_OWN_RETRY_COUNT 10
++#define MT7921_MCU_INIT_RETRY_COUNT 10
+
+ #define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin"
+ #define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin"