blob: 8def00eb80959279165b618e585f9aca5fb79fab [file] [log] [blame]
From a6bd94f22e1b58c4248e433889071b4e0bd1f283 Mon Sep 17 00:00:00 2001
From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Date: Fri, 14 Jun 2024 10:14:31 +0800
Subject: [PATCH 169/199] mtk: mt76: mt7996: update adie efuse merge support
Refactor efuse merge due to FW supporting the efuse merge mcu command
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
---
mt7996/eeprom.c | 144 -----------------------------------------
mt7996/mcu.c | 167 +++++++++++++++++++++++++++++++++++++++++++++++-
mt7996/mcu.h | 1 +
3 files changed, 167 insertions(+), 145 deletions(-)
diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
index e8e1d85a..fb0f2953 100644
--- a/mt7996/eeprom.c
+++ b/mt7996/eeprom.c
@@ -531,146 +531,6 @@ fail:
return ret;
}
-static int mt7996_apply_cal_free_data(struct mt7996_dev *dev)
-{
-#define MT_EE_CAL_FREE_MAX_SIZE 30
-#define MT_EE_7977BN_OFFSET (0x1200 - 0x500)
-#define MT_EE_END_OFFSET 0xffff
- enum adie_type {
- ADIE_7975,
- ADIE_7976,
- ADIE_7977,
- ADIE_7978,
- ADIE_7979,
- };
- static const u16 adie_offs_list[][MT_EE_CAL_FREE_MAX_SIZE] = {
- [ADIE_7975] = {0x5cd, 0x5cf, 0x5d1, 0x5d3, 0x6c0, 0x6c1, 0x6c2, 0x6c3,
- 0x7a1, 0x7a6, 0x7a8, 0x7aa, -1},
- [ADIE_7976] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
- 0x70, 0x71, 0x790, 0x791, 0x794, 0x795, 0x7a6, 0x7a8, 0x7aa, -1},
- [ADIE_7977] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
- 0x69, 0x6a, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, -1},
- [ADIE_7978] = {0x91, 0x95, 0x100, 0x102, 0x104, 0x106, 0x107,
- 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10e, 0x110, -1},
- [ADIE_7979] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
- 0x69, 0x6a, 0x7a, 0x7b, 0x7c, 0x7e, 0x80, -1},
- };
- static const u16 eep_offs_list[][MT_EE_CAL_FREE_MAX_SIZE] = {
- [ADIE_7975] = {0x451, 0x453, 0x455, 0x457, 0x44c, 0x44d, 0x44e, 0x44f,
- 0xba1, 0xba6, 0xba8, 0xbaa, -1},
- [ADIE_7976] = {0x44c, 0x44d, 0x44e, 0x44f, 0x450,
- 0x451, 0x453, 0x455, 0x457, 0x459,
- 0x470, 0x471, 0xb90, 0xb91, 0xb94, 0xb95,
- 0xba6, 0xba8, 0xbaa, -1},
- [ADIE_7977] = {0x124c, 0x124d, 0x124e, 0x124f, 0x1250,
- 0x1251, 0x1253, 0x1255, 0x1257, 0x1259,
- 0x1269, 0x126a, 0x127a, 0x127b, 0x127c, 0x127d, 0x127e, -1},
- [ADIE_7978] = {0xb91, 0xb95, 0x480, 0x482, 0x484, 0x486, 0x487, 0x488, 0x489,
- 0x48a, 0x48b, 0x48c, 0x48e, 0x490, -1},
- [ADIE_7979] = {0x124c, 0x124d, 0x124e, 0x124f, 0x1250, 0x1251,
- 0x1253, 0x1255, 0x1257, 0x1259, 0x1269, 0x126a,
- 0x127a, 0x127b, 0x127c, 0x127e, 0x1280, -1},
- };
- static const u16 adie_base_7996[] = {
- 0x400, 0x1e00, 0x1200
- };
- static const u16 adie_base_7992[] = {
- 0x400, 0x1200, 0x0
- };
- static const u16 *adie_offs[__MT_MAX_BAND];
- static const u16 *eep_offs[__MT_MAX_BAND];
- static const u16 *adie_base;
- u8 *eeprom = dev->mt76.eeprom.data;
- u8 buf[MT7996_EEPROM_BLOCK_SIZE];
- int adie_id, band, i, ret;
-
- switch (mt76_chip(&dev->mt76)) {
- case 0x7990:
- adie_base = adie_base_7996;
- /* adie 0 */
- if (dev->fem_type == MT7996_FEM_INT && dev->chip_sku != MT7996_SKU_233)
- adie_id = ADIE_7975;
- else
- adie_id = ADIE_7976;
- adie_offs[0] = adie_offs_list[adie_id];
- eep_offs[0] = eep_offs_list[adie_id];
-
- /* adie 1 */
- if (dev->chip_sku == MT7996_SKU_444) {
- adie_offs[1] = adie_offs_list[ADIE_7977];
- eep_offs[1] = eep_offs_list[ADIE_7977];
- }
-
- /* adie 2 */
- adie_offs[2] = adie_offs_list[ADIE_7977];
- eep_offs[2] = eep_offs_list[ADIE_7977];
- break;
- case 0x7992:
- adie_base = adie_base_7992;
- /* adie 0 */
- if (dev->chip_sku == MT7992_SKU_44 &&
- dev->fem_type != MT7996_FEM_EXT)
- adie_id = ADIE_7975;
- else if (dev->chip_sku == MT7992_SKU_24)
- adie_id = ADIE_7978;
- else
- adie_id = ADIE_7976;
- adie_offs[0] = adie_offs_list[adie_id];
- eep_offs[0] = eep_offs_list[adie_id];
-
- /* adie 1 */
- if (dev->chip_sku == MT7992_SKU_44 &&
- dev->fem_type != MT7996_FEM_INT)
- adie_id = ADIE_7977;
- else if (dev->chip_sku != MT7992_SKU_23)
- adie_id = ADIE_7979;
- else
- break;
- adie_offs[1] = adie_offs_list[adie_id];
- eep_offs[1] = eep_offs_list[adie_id];
- break;
- default:
- return -EINVAL;
- }
-
- for (band = 0; band < __MT_MAX_BAND; band++) {
- u16 adie_offset, eep_offset;
- u32 block_num, prev_block_num = -1;
-
- if (!adie_offs[band])
- continue;
-
- for (i = 0; i < MT_EE_CAL_FREE_MAX_SIZE; i++) {
- adie_offset = adie_offs[band][i] + adie_base[band];
- eep_offset = eep_offs[band][i];
- block_num = adie_offset / MT7996_EEPROM_BLOCK_SIZE;
-
- if (adie_offs[band][i] == MT_EE_END_OFFSET)
- break;
-
- if (is_mt7996(&dev->mt76) && dev->chip_sku == MT7996_SKU_444 &&
- band == MT_BAND1)
- eep_offset -= MT_EE_7977BN_OFFSET;
-
- if (prev_block_num != block_num) {
- ret = mt7996_mcu_get_eeprom(dev, adie_offset, buf);
- if (ret) {
- if (ret != -EINVAL)
- return ret;
-
- prev_block_num = -1;
- continue;
- }
- }
-
- eeprom[eep_offset] = buf[adie_offset % MT7996_EEPROM_BLOCK_SIZE];
- prev_block_num = block_num;
- }
- }
-
- return 0;
-}
-
int mt7996_eeprom_init(struct mt7996_dev *dev)
{
int ret;
@@ -685,10 +545,6 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
mt7996_eeprom_load_precal(dev);
- ret = mt7996_apply_cal_free_data(dev);
- if (ret)
- return ret;
-
ret = mt7996_eeprom_parse_hw_cap(dev, &dev->phy);
if (ret < 0)
return ret;
diff --git a/mt7996/mcu.c b/mt7996/mcu.c
index 9b3c6e3d..08c92eb3 100644
--- a/mt7996/mcu.c
+++ b/mt7996/mcu.c
@@ -4595,7 +4595,151 @@ int mt7996_mcu_set_chan_info(struct mt7996_phy *phy, u16 tag, bool sta)
&req, sizeof(req), true);
}
-int mt7996_mcu_set_eeprom(struct mt7996_dev *dev)
+static int mt7996_mcu_set_cal_free_data(struct mt7996_dev *dev)
+{
+#define MT_EE_CAL_FREE_MAX_SIZE 30
+#define MT_EE_7977BN_OFFSET (0x1200 - 0x500)
+#define MT_EE_END_OFFSET 0xffff
+ enum adie_type {
+ ADIE_7975,
+ ADIE_7976,
+ ADIE_7977,
+ ADIE_7978,
+ ADIE_7979,
+ };
+ static const u16 adie_offs_list[][MT_EE_CAL_FREE_MAX_SIZE] = {
+ [ADIE_7975] = {0x5cd, 0x5cf, 0x5d1, 0x5d3, 0x6c0, 0x6c1, 0x6c2, 0x6c3,
+ 0x7a1, 0x7a6, 0x7a8, 0x7aa, -1},
+ [ADIE_7976] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
+ 0x70, 0x71, 0x790, 0x791, 0x794, 0x795, 0x7a6, 0x7a8, 0x7aa, -1},
+ [ADIE_7977] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
+ 0x69, 0x6a, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, -1},
+ [ADIE_7978] = {0x91, 0x95, 0x100, 0x102, 0x104, 0x106, 0x107,
+ 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10e, 0x110, -1},
+ [ADIE_7979] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
+ 0x69, 0x6a, 0x7a, 0x7b, 0x7c, 0x7e, 0x80, -1},
+ };
+ static const u16 eep_offs_list[][MT_EE_CAL_FREE_MAX_SIZE] = {
+ [ADIE_7975] = {0x451, 0x453, 0x455, 0x457, 0x44c, 0x44d, 0x44e, 0x44f,
+ 0xba1, 0xba6, 0xba8, 0xbaa, -1},
+ [ADIE_7976] = {0x44c, 0x44d, 0x44e, 0x44f, 0x450,
+ 0x451, 0x453, 0x455, 0x457, 0x459,
+ 0x470, 0x471, 0xb90, 0xb91, 0xb94, 0xb95,
+ 0xba6, 0xba8, 0xbaa, -1},
+ [ADIE_7977] = {0x124c, 0x124d, 0x124e, 0x124f, 0x1250,
+ 0x1251, 0x1253, 0x1255, 0x1257, 0x1259,
+ 0x1269, 0x126a, 0x127a, 0x127b, 0x127c, 0x127d, 0x127e, -1},
+ [ADIE_7978] = {0xb91, 0xb95, 0x480, 0x482, 0x484, 0x486, 0x487, 0x488, 0x489,
+ 0x48a, 0x48b, 0x48c, 0x48e, 0x490, -1},
+ [ADIE_7979] = {0x124c, 0x124d, 0x124e, 0x124f, 0x1250, 0x1251,
+ 0x1253, 0x1255, 0x1257, 0x1259, 0x1269, 0x126a,
+ 0x127a, 0x127b, 0x127c, 0x127e, 0x1280, -1},
+ };
+ static const u16 adie_base_7996[] = {
+ 0x400, 0x1e00, 0x1200
+ };
+ static const u16 adie_base_7992[] = {
+ 0x400, 0x1200, 0x0
+ };
+ static const u16 *adie_offs[__MT_MAX_BAND];
+ static const u16 *eep_offs[__MT_MAX_BAND];
+ static const u16 *adie_base;
+ int adie_id, band, i, ret;
+
+ switch (mt76_chip(&dev->mt76)) {
+ case 0x7990:
+ adie_base = adie_base_7996;
+ /* adie 0 */
+ if (dev->fem_type == MT7996_FEM_INT && dev->chip_sku != MT7996_SKU_233)
+ adie_id = ADIE_7975;
+ else
+ adie_id = ADIE_7976;
+ adie_offs[0] = adie_offs_list[adie_id];
+ eep_offs[0] = eep_offs_list[adie_id];
+
+ /* adie 1 */
+ if (dev->chip_sku == MT7996_SKU_444) {
+ adie_offs[1] = adie_offs_list[ADIE_7977];
+ eep_offs[1] = eep_offs_list[ADIE_7977];
+ }
+
+ /* adie 2 */
+ adie_offs[2] = adie_offs_list[ADIE_7977];
+ eep_offs[2] = eep_offs_list[ADIE_7977];
+ break;
+ case 0x7992:
+ adie_base = adie_base_7992;
+ /* adie 0 */
+ if (dev->chip_sku == MT7992_SKU_44 &&
+ dev->fem_type != MT7996_FEM_EXT)
+ adie_id = ADIE_7975;
+ else if (dev->chip_sku == MT7992_SKU_24)
+ adie_id = ADIE_7978;
+ else
+ adie_id = ADIE_7976;
+ adie_offs[0] = adie_offs_list[adie_id];
+ eep_offs[0] = eep_offs_list[adie_id];
+
+ /* adie 1 */
+ if (dev->chip_sku == MT7992_SKU_44 &&
+ dev->fem_type != MT7996_FEM_INT)
+ adie_id = ADIE_7977;
+ else if (dev->chip_sku != MT7992_SKU_23)
+ adie_id = ADIE_7979;
+ else
+ break;
+ adie_offs[1] = adie_offs_list[adie_id];
+ eep_offs[1] = eep_offs_list[adie_id];
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ for (band = 0; band < __MT_MAX_BAND; band++) {
+ struct {
+ /* fixed field */
+ u8 __rsv[4];
+
+ __le16 tag;
+ __le16 len;
+ __le16 adie_offset;
+ __le16 eep_offset;
+ __le16 count;
+ u8 rsv[2];
+ } __packed req = {
+ .tag = cpu_to_le16(UNI_EFUSE_PATCH),
+ .len = cpu_to_le16(sizeof(req) - 4),
+ .count = cpu_to_le16(1),
+ };
+ u16 adie_offset, eep_offset;
+
+ if (!adie_offs[band])
+ continue;
+
+ for (i = 0; i < MT_EE_CAL_FREE_MAX_SIZE; i++) {
+ adie_offset = adie_offs[band][i] + adie_base[band];
+ eep_offset = eep_offs[band][i];
+
+ if (adie_offs[band][i] == MT_EE_END_OFFSET)
+ break;
+
+ if (is_mt7996(&dev->mt76) && dev->chip_sku == MT7996_SKU_444 &&
+ band == MT_BAND1)
+ eep_offset -= MT_EE_7977BN_OFFSET;
+
+ req.eep_offset = cpu_to_le16(eep_offset);
+ req.adie_offset = cpu_to_le16(adie_offset);
+ ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(EFUSE_CTRL),
+ &req, sizeof(req), true);
+ if (ret)
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+int mt7996_mcu_set_eeprom_flash(struct mt7996_dev *dev)
{
#define MAX_PAGE_IDX_MASK GENMASK(7, 5)
#define PAGE_IDX_MASK GENMASK(4, 2)
@@ -4640,6 +4784,27 @@ int mt7996_mcu_set_eeprom(struct mt7996_dev *dev)
return 0;
}
+int mt7996_mcu_set_eeprom(struct mt7996_dev *dev)
+{
+ struct mt7996_mcu_eeprom req = {
+ .tag = cpu_to_le16(UNI_EFUSE_BUFFER_MODE),
+ .len = cpu_to_le16(sizeof(req) - 4),
+ .buffer_mode = EE_MODE_EFUSE,
+ .format = EE_FORMAT_WHOLE
+ };
+ int ret;
+
+ if (dev->flash_mode)
+ ret = mt7996_mcu_set_eeprom_flash(dev);
+ else
+ ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(EFUSE_CTRL),
+ &req, sizeof(req), true);
+ if (ret)
+ return ret;
+
+ return mt7996_mcu_set_cal_free_data(dev);
+}
+
int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *read_buf)
{
struct mt7996_mcu_eeprom_info req = {
diff --git a/mt7996/mcu.h b/mt7996/mcu.h
index 05b29c90..d99e9a60 100644
--- a/mt7996/mcu.h
+++ b/mt7996/mcu.h
@@ -1038,6 +1038,7 @@ enum {
UNI_EFUSE_BUFFER_MODE,
UNI_EFUSE_FREE_BLOCK,
UNI_EFUSE_BUFFER_RD,
+ UNI_EFUSE_PATCH,
};
enum {
--
2.18.0