xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: ISC
2*4882a593Smuzhiyun /* Copyright (C) 2019 MediaTek Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Author: Ryder Lee <ryder.lee@mediatek.com>
5*4882a593Smuzhiyun  *         Felix Fietkau <nbd@nbd.name>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/of.h>
9*4882a593Smuzhiyun #include "mt7615.h"
10*4882a593Smuzhiyun #include "eeprom.h"
11*4882a593Smuzhiyun 
mt7615_efuse_read(struct mt7615_dev * dev,u32 base,u16 addr,u8 * data)12*4882a593Smuzhiyun static int mt7615_efuse_read(struct mt7615_dev *dev, u32 base,
13*4882a593Smuzhiyun 			     u16 addr, u8 *data)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun 	u32 val;
16*4882a593Smuzhiyun 	int i;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 	val = mt76_rr(dev, base + MT_EFUSE_CTRL);
19*4882a593Smuzhiyun 	val &= ~(MT_EFUSE_CTRL_AIN | MT_EFUSE_CTRL_MODE);
20*4882a593Smuzhiyun 	val |= FIELD_PREP(MT_EFUSE_CTRL_AIN, addr & ~0xf);
21*4882a593Smuzhiyun 	val |= MT_EFUSE_CTRL_KICK;
22*4882a593Smuzhiyun 	mt76_wr(dev, base + MT_EFUSE_CTRL, val);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	if (!mt76_poll(dev, base + MT_EFUSE_CTRL, MT_EFUSE_CTRL_KICK, 0, 1000))
25*4882a593Smuzhiyun 		return -ETIMEDOUT;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	udelay(2);
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	val = mt76_rr(dev, base + MT_EFUSE_CTRL);
30*4882a593Smuzhiyun 	if ((val & MT_EFUSE_CTRL_AOUT) == MT_EFUSE_CTRL_AOUT ||
31*4882a593Smuzhiyun 	    WARN_ON_ONCE(!(val & MT_EFUSE_CTRL_VALID))) {
32*4882a593Smuzhiyun 		memset(data, 0x0, 16);
33*4882a593Smuzhiyun 		return 0;
34*4882a593Smuzhiyun 	}
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	for (i = 0; i < 4; i++) {
37*4882a593Smuzhiyun 		val = mt76_rr(dev, base + MT_EFUSE_RDATA(i));
38*4882a593Smuzhiyun 		put_unaligned_le32(val, data + 4 * i);
39*4882a593Smuzhiyun 	}
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	return 0;
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
mt7615_efuse_init(struct mt7615_dev * dev,u32 base)44*4882a593Smuzhiyun static int mt7615_efuse_init(struct mt7615_dev *dev, u32 base)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	int i, len = MT7615_EEPROM_SIZE;
47*4882a593Smuzhiyun 	void *buf;
48*4882a593Smuzhiyun 	u32 val;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	val = mt76_rr(dev, base + MT_EFUSE_BASE_CTRL);
51*4882a593Smuzhiyun 	if (val & MT_EFUSE_BASE_CTRL_EMPTY)
52*4882a593Smuzhiyun 		return 0;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	dev->mt76.otp.data = devm_kzalloc(dev->mt76.dev, len, GFP_KERNEL);
55*4882a593Smuzhiyun 	dev->mt76.otp.size = len;
56*4882a593Smuzhiyun 	if (!dev->mt76.otp.data)
57*4882a593Smuzhiyun 		return -ENOMEM;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	buf = dev->mt76.otp.data;
60*4882a593Smuzhiyun 	for (i = 0; i + 16 <= len; i += 16) {
61*4882a593Smuzhiyun 		int ret;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 		ret = mt7615_efuse_read(dev, base, i, buf + i);
64*4882a593Smuzhiyun 		if (ret)
65*4882a593Smuzhiyun 			return ret;
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	return 0;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
mt7615_eeprom_load(struct mt7615_dev * dev,u32 addr)71*4882a593Smuzhiyun static int mt7615_eeprom_load(struct mt7615_dev *dev, u32 addr)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	int ret;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	ret = mt76_eeprom_init(&dev->mt76, MT7615_EEPROM_FULL_SIZE);
76*4882a593Smuzhiyun 	if (ret < 0)
77*4882a593Smuzhiyun 		return ret;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	return mt7615_efuse_init(dev, addr);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
mt7615_check_eeprom(struct mt76_dev * dev)82*4882a593Smuzhiyun static int mt7615_check_eeprom(struct mt76_dev *dev)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	u16 val = get_unaligned_le16(dev->eeprom.data);
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	switch (val) {
87*4882a593Smuzhiyun 	case 0x7615:
88*4882a593Smuzhiyun 	case 0x7622:
89*4882a593Smuzhiyun 	case 0x7663:
90*4882a593Smuzhiyun 		return 0;
91*4882a593Smuzhiyun 	default:
92*4882a593Smuzhiyun 		return -EINVAL;
93*4882a593Smuzhiyun 	}
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun static void
mt7615_eeprom_parse_hw_band_cap(struct mt7615_dev * dev)97*4882a593Smuzhiyun mt7615_eeprom_parse_hw_band_cap(struct mt7615_dev *dev)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	u8 val, *eeprom = dev->mt76.eeprom.data;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	if (is_mt7663(&dev->mt76)) {
102*4882a593Smuzhiyun 		/* dual band */
103*4882a593Smuzhiyun 		dev->mt76.cap.has_2ghz = true;
104*4882a593Smuzhiyun 		dev->mt76.cap.has_5ghz = true;
105*4882a593Smuzhiyun 		return;
106*4882a593Smuzhiyun 	}
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	if (is_mt7622(&dev->mt76)) {
109*4882a593Smuzhiyun 		/* 2GHz only */
110*4882a593Smuzhiyun 		dev->mt76.cap.has_2ghz = true;
111*4882a593Smuzhiyun 		return;
112*4882a593Smuzhiyun 	}
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	if (is_mt7611(&dev->mt76)) {
115*4882a593Smuzhiyun 		/* 5GHz only */
116*4882a593Smuzhiyun 		dev->mt76.cap.has_5ghz = true;
117*4882a593Smuzhiyun 		return;
118*4882a593Smuzhiyun 	}
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	val = FIELD_GET(MT_EE_NIC_WIFI_CONF_BAND_SEL,
121*4882a593Smuzhiyun 			eeprom[MT_EE_WIFI_CONF]);
122*4882a593Smuzhiyun 	switch (val) {
123*4882a593Smuzhiyun 	case MT_EE_5GHZ:
124*4882a593Smuzhiyun 		dev->mt76.cap.has_5ghz = true;
125*4882a593Smuzhiyun 		break;
126*4882a593Smuzhiyun 	case MT_EE_2GHZ:
127*4882a593Smuzhiyun 		dev->mt76.cap.has_2ghz = true;
128*4882a593Smuzhiyun 		break;
129*4882a593Smuzhiyun 	case MT_EE_DBDC:
130*4882a593Smuzhiyun 		dev->dbdc_support = true;
131*4882a593Smuzhiyun 		/* fall through */
132*4882a593Smuzhiyun 	default:
133*4882a593Smuzhiyun 		dev->mt76.cap.has_2ghz = true;
134*4882a593Smuzhiyun 		dev->mt76.cap.has_5ghz = true;
135*4882a593Smuzhiyun 		break;
136*4882a593Smuzhiyun 	}
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
mt7615_eeprom_parse_hw_cap(struct mt7615_dev * dev)139*4882a593Smuzhiyun static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	u8 *eeprom = dev->mt76.eeprom.data;
142*4882a593Smuzhiyun 	u8 tx_mask, max_nss;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	mt7615_eeprom_parse_hw_band_cap(dev);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	if (is_mt7663(&dev->mt76)) {
147*4882a593Smuzhiyun 		max_nss = 2;
148*4882a593Smuzhiyun 		tx_mask = FIELD_GET(MT_EE_HW_CONF1_TX_MASK,
149*4882a593Smuzhiyun 				    eeprom[MT7663_EE_HW_CONF1]);
150*4882a593Smuzhiyun 	} else {
151*4882a593Smuzhiyun 		u32 val;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 		/* read tx-rx mask from eeprom */
154*4882a593Smuzhiyun 		val = mt76_rr(dev, MT_TOP_STRAP_STA);
155*4882a593Smuzhiyun 		max_nss = val & MT_TOP_3NSS ? 3 : 4;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 		tx_mask =  FIELD_GET(MT_EE_NIC_CONF_TX_MASK,
158*4882a593Smuzhiyun 				     eeprom[MT_EE_NIC_CONF_0]);
159*4882a593Smuzhiyun 	}
160*4882a593Smuzhiyun 	if (!tx_mask || tx_mask > max_nss)
161*4882a593Smuzhiyun 		tx_mask = max_nss;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	dev->chainmask = BIT(tx_mask) - 1;
164*4882a593Smuzhiyun 	dev->mphy.antenna_mask = dev->chainmask;
165*4882a593Smuzhiyun 	dev->phy.chainmask = dev->chainmask;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
mt7663_eeprom_get_target_power_index(struct mt7615_dev * dev,struct ieee80211_channel * chan,u8 chain_idx)168*4882a593Smuzhiyun static int mt7663_eeprom_get_target_power_index(struct mt7615_dev *dev,
169*4882a593Smuzhiyun 						struct ieee80211_channel *chan,
170*4882a593Smuzhiyun 						u8 chain_idx)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	int index, group;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	if (chain_idx > 1)
175*4882a593Smuzhiyun 		return -EINVAL;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	if (chan->band == NL80211_BAND_2GHZ)
178*4882a593Smuzhiyun 		return MT7663_EE_TX0_2G_TARGET_POWER + (chain_idx << 4);
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	group = mt7615_get_channel_group(chan->hw_value);
181*4882a593Smuzhiyun 	if (chain_idx == 1)
182*4882a593Smuzhiyun 		index = MT7663_EE_TX1_5G_G0_TARGET_POWER;
183*4882a593Smuzhiyun 	else
184*4882a593Smuzhiyun 		index = MT7663_EE_TX0_5G_G0_TARGET_POWER;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	return index + group * 3;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
mt7615_eeprom_get_target_power_index(struct mt7615_dev * dev,struct ieee80211_channel * chan,u8 chain_idx)189*4882a593Smuzhiyun int mt7615_eeprom_get_target_power_index(struct mt7615_dev *dev,
190*4882a593Smuzhiyun 					 struct ieee80211_channel *chan,
191*4882a593Smuzhiyun 					 u8 chain_idx)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	int index;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	if (is_mt7663(&dev->mt76))
196*4882a593Smuzhiyun 		return mt7663_eeprom_get_target_power_index(dev, chan,
197*4882a593Smuzhiyun 							    chain_idx);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	if (chain_idx > 3)
200*4882a593Smuzhiyun 		return -EINVAL;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	/* TSSI disabled */
203*4882a593Smuzhiyun 	if (mt7615_ext_pa_enabled(dev, chan->band)) {
204*4882a593Smuzhiyun 		if (chan->band == NL80211_BAND_2GHZ)
205*4882a593Smuzhiyun 			return MT_EE_EXT_PA_2G_TARGET_POWER;
206*4882a593Smuzhiyun 		else
207*4882a593Smuzhiyun 			return MT_EE_EXT_PA_5G_TARGET_POWER;
208*4882a593Smuzhiyun 	}
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	/* TSSI enabled */
211*4882a593Smuzhiyun 	if (chan->band == NL80211_BAND_2GHZ) {
212*4882a593Smuzhiyun 		index = MT_EE_TX0_2G_TARGET_POWER + chain_idx * 6;
213*4882a593Smuzhiyun 	} else {
214*4882a593Smuzhiyun 		int group = mt7615_get_channel_group(chan->hw_value);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 		switch (chain_idx) {
217*4882a593Smuzhiyun 		case 1:
218*4882a593Smuzhiyun 			index = MT_EE_TX1_5G_G0_TARGET_POWER;
219*4882a593Smuzhiyun 			break;
220*4882a593Smuzhiyun 		case 2:
221*4882a593Smuzhiyun 			index = MT_EE_TX2_5G_G0_TARGET_POWER;
222*4882a593Smuzhiyun 			break;
223*4882a593Smuzhiyun 		case 3:
224*4882a593Smuzhiyun 			index = MT_EE_TX3_5G_G0_TARGET_POWER;
225*4882a593Smuzhiyun 			break;
226*4882a593Smuzhiyun 		case 0:
227*4882a593Smuzhiyun 		default:
228*4882a593Smuzhiyun 			index = MT_EE_TX0_5G_G0_TARGET_POWER;
229*4882a593Smuzhiyun 			break;
230*4882a593Smuzhiyun 		}
231*4882a593Smuzhiyun 		index += 5 * group;
232*4882a593Smuzhiyun 	}
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	return index;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun 
mt7615_eeprom_get_power_delta_index(struct mt7615_dev * dev,enum nl80211_band band)237*4882a593Smuzhiyun int mt7615_eeprom_get_power_delta_index(struct mt7615_dev *dev,
238*4882a593Smuzhiyun 					enum nl80211_band band)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun 	/* assume the first rate has the highest power offset */
241*4882a593Smuzhiyun 	if (is_mt7663(&dev->mt76)) {
242*4882a593Smuzhiyun 		if (band == NL80211_BAND_2GHZ)
243*4882a593Smuzhiyun 			return MT_EE_TX0_5G_G0_TARGET_POWER;
244*4882a593Smuzhiyun 		else
245*4882a593Smuzhiyun 			return MT7663_EE_5G_RATE_POWER;
246*4882a593Smuzhiyun 	}
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	if (band == NL80211_BAND_2GHZ)
249*4882a593Smuzhiyun 		return MT_EE_2G_RATE_POWER;
250*4882a593Smuzhiyun 	else
251*4882a593Smuzhiyun 		return MT_EE_5G_RATE_POWER;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
mt7615_apply_cal_free_data(struct mt7615_dev * dev)254*4882a593Smuzhiyun static void mt7615_apply_cal_free_data(struct mt7615_dev *dev)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun 	static const u16 ical[] = {
257*4882a593Smuzhiyun 		0x53, 0x54, 0x55, 0x56, 0x57, 0x5c, 0x5d, 0x62, 0x63, 0x68,
258*4882a593Smuzhiyun 		0x69, 0x6e, 0x6f, 0x73, 0x74, 0x78, 0x79, 0x82, 0x83, 0x87,
259*4882a593Smuzhiyun 		0x88, 0x8c, 0x8d, 0x91, 0x92, 0x96, 0x97, 0x9b, 0x9c, 0xa0,
260*4882a593Smuzhiyun 		0xa1, 0xaa, 0xab, 0xaf, 0xb0, 0xb4, 0xb5, 0xb9, 0xba, 0xf4,
261*4882a593Smuzhiyun 		0xf7, 0xff,
262*4882a593Smuzhiyun 		0x140, 0x141, 0x145, 0x146, 0x14a, 0x14b, 0x154, 0x155, 0x159,
263*4882a593Smuzhiyun 		0x15a, 0x15e, 0x15f, 0x163, 0x164, 0x168, 0x169, 0x16d, 0x16e,
264*4882a593Smuzhiyun 		0x172, 0x173, 0x17c, 0x17d, 0x181, 0x182, 0x186, 0x187, 0x18b,
265*4882a593Smuzhiyun 		0x18c
266*4882a593Smuzhiyun 	};
267*4882a593Smuzhiyun 	static const u16 ical_nocheck[] = {
268*4882a593Smuzhiyun 		0x110, 0x111, 0x112, 0x113, 0x114, 0x115, 0x116, 0x117, 0x118,
269*4882a593Smuzhiyun 		0x1b5, 0x1b6, 0x1b7, 0x3ac, 0x3ad, 0x3ae, 0x3af, 0x3b0, 0x3b1,
270*4882a593Smuzhiyun 		0x3b2
271*4882a593Smuzhiyun 	};
272*4882a593Smuzhiyun 	u8 *eeprom = dev->mt76.eeprom.data;
273*4882a593Smuzhiyun 	u8 *otp = dev->mt76.otp.data;
274*4882a593Smuzhiyun 	int i;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	if (!otp)
277*4882a593Smuzhiyun 		return;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(ical); i++)
280*4882a593Smuzhiyun 		if (!otp[ical[i]])
281*4882a593Smuzhiyun 			return;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(ical); i++)
284*4882a593Smuzhiyun 		eeprom[ical[i]] = otp[ical[i]];
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(ical_nocheck); i++)
287*4882a593Smuzhiyun 		eeprom[ical_nocheck[i]] = otp[ical_nocheck[i]];
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
mt7622_apply_cal_free_data(struct mt7615_dev * dev)290*4882a593Smuzhiyun static void mt7622_apply_cal_free_data(struct mt7615_dev *dev)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun 	static const u16 ical[] = {
293*4882a593Smuzhiyun 		0x53, 0x54, 0x55, 0x56, 0xf4, 0xf7, 0x144, 0x156, 0x15b
294*4882a593Smuzhiyun 	};
295*4882a593Smuzhiyun 	u8 *eeprom = dev->mt76.eeprom.data;
296*4882a593Smuzhiyun 	u8 *otp = dev->mt76.otp.data;
297*4882a593Smuzhiyun 	int i;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	if (!otp)
300*4882a593Smuzhiyun 		return;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(ical); i++) {
303*4882a593Smuzhiyun 		if (!otp[ical[i]])
304*4882a593Smuzhiyun 			continue;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 		eeprom[ical[i]] = otp[ical[i]];
307*4882a593Smuzhiyun 	}
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
mt7615_cal_free_data(struct mt7615_dev * dev)310*4882a593Smuzhiyun static void mt7615_cal_free_data(struct mt7615_dev *dev)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun 	struct device_node *np = dev->mt76.dev->of_node;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	if (!np || !of_property_read_bool(np, "mediatek,eeprom-merge-otp"))
315*4882a593Smuzhiyun 		return;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	switch (mt76_chip(&dev->mt76)) {
318*4882a593Smuzhiyun 	case 0x7622:
319*4882a593Smuzhiyun 		mt7622_apply_cal_free_data(dev);
320*4882a593Smuzhiyun 		break;
321*4882a593Smuzhiyun 	case 0x7615:
322*4882a593Smuzhiyun 	case 0x7611:
323*4882a593Smuzhiyun 		mt7615_apply_cal_free_data(dev);
324*4882a593Smuzhiyun 		break;
325*4882a593Smuzhiyun 	}
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun 
mt7615_eeprom_init(struct mt7615_dev * dev,u32 addr)328*4882a593Smuzhiyun int mt7615_eeprom_init(struct mt7615_dev *dev, u32 addr)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun 	int ret;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	ret = mt7615_eeprom_load(dev, addr);
333*4882a593Smuzhiyun 	if (ret < 0)
334*4882a593Smuzhiyun 		return ret;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	ret = mt7615_check_eeprom(&dev->mt76);
337*4882a593Smuzhiyun 	if (ret && dev->mt76.otp.data) {
338*4882a593Smuzhiyun 		memcpy(dev->mt76.eeprom.data, dev->mt76.otp.data,
339*4882a593Smuzhiyun 		       MT7615_EEPROM_SIZE);
340*4882a593Smuzhiyun 	} else {
341*4882a593Smuzhiyun 		dev->flash_eeprom = true;
342*4882a593Smuzhiyun 		mt7615_cal_free_data(dev);
343*4882a593Smuzhiyun 	}
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	mt7615_eeprom_parse_hw_cap(dev);
346*4882a593Smuzhiyun 	memcpy(dev->mt76.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
347*4882a593Smuzhiyun 	       ETH_ALEN);
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	mt76_eeprom_override(&dev->mt76);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	return 0;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(mt7615_eeprom_init);
354