| From dcace898314b1d369b61a0c4f7f9e325f04784dc Mon Sep 17 00:00:00 2001 |
| From: StanleyYP Wang <StanleyYP.Wang@mediatek.com> |
| Date: Fri, 26 May 2023 14:44:04 +0800 |
| Subject: [PATCH 61/98] wifi: mt76: mt7996: add kite eeprom load support |
| |
| Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com> |
| --- |
| mt7996/eeprom.c | 33 ++++++++++++++++++++++----------- |
| mt7996/mcu.c | 2 +- |
| mt7996/mt7996.h | 10 ++++++++++ |
| 3 files changed, 33 insertions(+), 12 deletions(-) |
| |
| diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c |
| index 56605de..6605853 100644 |
| --- a/mt7996/eeprom.c |
| +++ b/mt7996/eeprom.c |
| @@ -53,9 +53,12 @@ static int mt7996_check_eeprom(struct mt7996_dev *dev) |
| u8 *eeprom = dev->mt76.eeprom.data; |
| u16 val = get_unaligned_le16(eeprom); |
| |
| +#define CHECK_EEPROM_ERR(match) (match ? 0 : -EINVAL) |
| switch (val) { |
| case 0x7990: |
| - return 0; |
| + return CHECK_EEPROM_ERR(is_mt7996(&dev->mt76)); |
| + case 0x7992: |
| + return CHECK_EEPROM_ERR(is_mt7992(&dev->mt76)); |
| default: |
| return -EINVAL; |
| } |
| @@ -66,13 +69,20 @@ const char *mt7996_eeprom_name(struct mt7996_dev *dev) |
| if (dev->bin_file_mode) |
| return dev->mt76.bin_file_name; |
| |
| - /* reserve for future variants */ |
| - if (dev->testmode_enable) |
| - return MT7996_EEPROM_DEFAULT_TM; |
| - else if (dev->chip_sku == MT7996_SKU_404) |
| - return MT7996_EEPROM_DEFAULT_404; |
| - else |
| + switch (mt76_chip(&dev->mt76)) { |
| + case 0x7990: |
| + if (dev->testmode_enable) |
| + return MT7996_EEPROM_DEFAULT_TM; |
| + else if (dev->chip_sku == MT7996_SKU_404) |
| + return MT7996_EEPROM_DEFAULT_404; |
| + else |
| + return MT7996_EEPROM_DEFAULT; |
| + case 0x7992: |
| + return dev->testmode_enable ? |
| + MT7992_EEPROM_DEFAULT_TM : MT7992_EEPROM_DEFAULT; |
| + default: |
| return MT7996_EEPROM_DEFAULT; |
| + } |
| } |
| |
| int |
| @@ -125,7 +135,7 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev) |
| goto out; |
| } |
| |
| - memcpy(eeprom, fw->data, MT7996_EEPROM_SIZE); |
| + memcpy(eeprom, fw->data, mt7996_eeprom_size(dev)); |
| dev->flash_mode = true; |
| |
| out: |
| @@ -141,7 +151,7 @@ static int mt7996_eeprom_load_flash(struct mt7996_dev *dev) |
| /* return > 0 for load success, return 0 for load failed, return < 0 for non memory */ |
| dev->bin_file_mode = mt76_check_bin_file_mode(&dev->mt76); |
| if (dev->bin_file_mode) { |
| - dev->mt76.eeprom.size = MT7996_EEPROM_SIZE; |
| + dev->mt76.eeprom.size = mt7996_eeprom_size(dev); |
| dev->mt76.eeprom.data = devm_kzalloc(dev->mt76.dev, dev->mt76.eeprom.size, |
| GFP_KERNEL); |
| if (!dev->mt76.eeprom.data) |
| @@ -153,7 +163,7 @@ static int mt7996_eeprom_load_flash(struct mt7996_dev *dev) |
| if (mt7996_check_eeprom(dev)) |
| return 0; |
| } else { |
| - ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE); |
| + ret = mt76_eeprom_init(&dev->mt76, mt7996_eeprom_size(dev)); |
| } |
| |
| return ret; |
| @@ -186,6 +196,7 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev) |
| { |
| int ret; |
| u8 free_block_num; |
| + u16 eeprom_size = mt7996_eeprom_size(dev); |
| u32 block_num, i; |
| u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE; |
| |
| @@ -200,7 +211,7 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev) |
| return -EINVAL; |
| |
| /* read eeprom data from efuse */ |
| - block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size); |
| + block_num = DIV_ROUND_UP(eeprom_size, eeprom_blk_size); |
| for (i = 0; i < block_num; i++) { |
| ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size); |
| if (ret < 0) |
| diff --git a/mt7996/mcu.c b/mt7996/mcu.c |
| index 255d0ba..e9088ba 100644 |
| --- a/mt7996/mcu.c |
| +++ b/mt7996/mcu.c |
| @@ -3425,7 +3425,7 @@ static int mt7996_mcu_set_eeprom_flash(struct mt7996_dev *dev) |
| .tag = cpu_to_le16(UNI_EFUSE_BUFFER_MODE), |
| .buffer_mode = EE_MODE_BUFFER |
| }; |
| - u16 eeprom_size = MT7996_EEPROM_SIZE; |
| + u16 eeprom_size = mt7996_eeprom_size(dev); |
| u8 total = DIV_ROUND_UP(eeprom_size, PER_PAGE_SIZE); |
| u8 *eep = (u8 *)dev->mt76.eeprom.data; |
| int eep_len, i; |
| diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h |
| index eb192eb..433d886 100644 |
| --- a/mt7996/mt7996.h |
| +++ b/mt7996/mt7996.h |
| @@ -44,7 +44,12 @@ |
| #define MT7996_EEPROM_DEFAULT "mediatek/mt7996/mt7996_eeprom.bin" |
| #define MT7996_EEPROM_DEFAULT_404 "mediatek/mt7996/mt7996_eeprom_dual_404.bin" |
| #define MT7996_EEPROM_DEFAULT_TM "mediatek/mt7996/mt7996_eeprom_tm.bin" |
| +#define MT7992_EEPROM_DEFAULT "mediatek/mt7996/mt7992_eeprom.bin" |
| +#define MT7992_EEPROM_DEFAULT_TM "mediatek/mt7996/mt7992_eeprom_tm.bin" |
| + |
| #define MT7996_EEPROM_SIZE 7680 |
| +#define MT7992_EEPROM_SIZE 7680 |
| + |
| #define MT7996_EEPROM_BLOCK_SIZE 16 |
| #define MT7996_TOKEN_SIZE 16384 |
| #define MT7996_HW_TOKEN_SIZE 8192 |
| @@ -643,6 +648,11 @@ void mt7996_mcu_scs_sta_poll(struct work_struct *work); |
| void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb); |
| #endif |
| |
| +static inline u16 mt7996_eeprom_size(struct mt7996_dev *dev) |
| +{ |
| + return is_mt7996(&dev->mt76) ? MT7996_EEPROM_SIZE : MT7992_EEPROM_SIZE; |
| +} |
| + |
| static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev) |
| { |
| return min(MT7996_MAX_INTERFACES * (1 + dev->dbdc_support + dev->tbtc_support), |
| -- |
| 2.18.0 |
| |