From 25a8617a49af1670c4f54015c0c8a748f950e155 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 4002/4002] wifi: mt76: mt7992: add kite eeprom load support

Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
---
 mt7996/eeprom.c | 27 ++++++++++++++++++---------
 mt7996/mcu.c    |  2 +-
 mt7996/mt7996.h | 10 ++++++++++
 3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
index bee4a4b..a57121c 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,11 +69,16 @@ 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
+	switch (mt76_chip(&dev->mt76)) {
+	case 0x7990:
+		return dev->testmode_enable ?
+		       MT7996_EEPROM_DEFAULT_TM : MT7996_EEPROM_DEFAULT;
+	case 0x7992:
+		return dev->testmode_enable ?
+		       MT7992_EEPROM_DEFAULT_TM : MT7992_EEPROM_DEFAULT;
+	default:
 		return MT7996_EEPROM_DEFAULT;
+	}
 }
 
 int
@@ -123,7 +131,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:
@@ -139,7 +147,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)
@@ -151,7 +159,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;
@@ -184,6 +192,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;
 
@@ -198,7 +207,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 4272fa1..c67b1e0 100644
--- a/mt7996/mcu.c
+++ b/mt7996/mcu.c
@@ -3513,7 +3513,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 d7d2917..37634f6 100644
--- a/mt7996/mt7996.h
+++ b/mt7996/mt7996.h
@@ -42,7 +42,12 @@
 
 #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.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_TX_PAO_SIZE		(IEEE80211_MAX_MPDU_LEN_VHT_11454 - 256)
@@ -794,6 +799,11 @@ void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
 #endif
 int mt7996_mcu_set_band_confg(struct mt7996_phy *phy, u16 option, bool enable);
 
+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 MT7996_MAX_INTERFACES * (1 + dev->dbdc_support + dev->tbtc_support);
-- 
2.18.0

