xref: /freebsd/sys/contrib/dev/mediatek/mt76/mt7603/mcu.c (revision cbb3ec25236ba72f91cbdf23f8b78b9d1af0cedf)
1 // SPDX-License-Identifier: ISC
2 
3 #include <linux/firmware.h>
4 #include "mt7603.h"
5 #include "mcu.h"
6 #include "eeprom.h"
7 
8 #define MCU_SKB_RESERVE	8
9 
10 struct mt7603_fw_trailer {
11 	char fw_ver[10];
12 	char build_date[15];
13 	__le32 dl_len;
14 } __packed;
15 
16 static int
mt7603_mcu_parse_response(struct mt76_dev * mdev,int cmd,struct sk_buff * skb,int seq)17 mt7603_mcu_parse_response(struct mt76_dev *mdev, int cmd,
18 			  struct sk_buff *skb, int seq)
19 {
20 	struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
21 	struct mt7603_mcu_rxd *rxd;
22 
23 	if (!skb) {
24 		dev_err(mdev->dev, "MCU message %02x (seq %d) timed out\n",
25 			abs(cmd), seq);
26 		dev->mcu_hang = MT7603_WATCHDOG_TIMEOUT;
27 		return -ETIMEDOUT;
28 	}
29 
30 	rxd = (struct mt7603_mcu_rxd *)skb->data;
31 	if (seq != rxd->seq)
32 		return -EAGAIN;
33 
34 	return 0;
35 }
36 
37 static int
mt7603_mcu_skb_send_msg(struct mt76_dev * mdev,struct sk_buff * skb,int cmd,int * wait_seq)38 mt7603_mcu_skb_send_msg(struct mt76_dev *mdev, struct sk_buff *skb,
39 			int cmd, int *wait_seq)
40 {
41 	struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
42 	int hdrlen = dev->mcu_running ? sizeof(struct mt7603_mcu_txd) : 12;
43 	struct mt7603_mcu_txd *txd;
44 	u8 seq;
45 
46 	mdev->mcu.timeout = 3 * HZ;
47 
48 	seq = ++mdev->mcu.msg_seq & 0xf;
49 	if (!seq)
50 		seq = ++mdev->mcu.msg_seq & 0xf;
51 
52 	txd = (struct mt7603_mcu_txd *)skb_push(skb, hdrlen);
53 
54 	txd->len = cpu_to_le16(skb->len);
55 	if (cmd == -MCU_CMD_FW_SCATTER)
56 		txd->pq_id = cpu_to_le16(MCU_PORT_QUEUE_FW);
57 	else
58 		txd->pq_id = cpu_to_le16(MCU_PORT_QUEUE);
59 	txd->pkt_type = MCU_PKT_ID;
60 	txd->seq = seq;
61 
62 	if (cmd < 0) {
63 		txd->cid = -cmd;
64 		txd->set_query = MCU_Q_NA;
65 	} else {
66 		txd->cid = MCU_CMD_EXT_CID;
67 		txd->ext_cid = cmd;
68 		txd->set_query = MCU_Q_SET;
69 		txd->ext_cid_ack = 1;
70 	}
71 
72 	if (wait_seq)
73 		*wait_seq = seq;
74 
75 	return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[MT_MCUQ_WM], skb, 0);
76 }
77 
78 static int
mt7603_mcu_init_download(struct mt7603_dev * dev,u32 addr,u32 len)79 mt7603_mcu_init_download(struct mt7603_dev *dev, u32 addr, u32 len)
80 {
81 	struct {
82 		__le32 addr;
83 		__le32 len;
84 		__le32 mode;
85 	} req = {
86 		.addr = cpu_to_le32(addr),
87 		.len = cpu_to_le32(len),
88 		.mode = cpu_to_le32(BIT(31)),
89 	};
90 
91 	return mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_TARGET_ADDRESS_LEN_REQ,
92 				 &req, sizeof(req), true);
93 }
94 
95 static int
mt7603_mcu_start_firmware(struct mt7603_dev * dev,u32 addr)96 mt7603_mcu_start_firmware(struct mt7603_dev *dev, u32 addr)
97 {
98 	struct {
99 		__le32 override;
100 		__le32 addr;
101 	} req = {
102 		.override = cpu_to_le32(addr ? 1 : 0),
103 		.addr = cpu_to_le32(addr),
104 	};
105 
106 	return mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_FW_START_REQ, &req,
107 				 sizeof(req), true);
108 }
109 
110 static int
mt7603_mcu_restart(struct mt76_dev * dev)111 mt7603_mcu_restart(struct mt76_dev *dev)
112 {
113 	return mt76_mcu_send_msg(dev, -MCU_CMD_RESTART_DL_REQ, NULL, 0, true);
114 }
115 
mt7603_load_firmware(struct mt7603_dev * dev)116 static int mt7603_load_firmware(struct mt7603_dev *dev)
117 {
118 	const struct firmware *fw;
119 	const struct mt7603_fw_trailer *hdr;
120 	const char *firmware;
121 	int dl_len;
122 	u32 addr, val;
123 	int ret;
124 
125 	if (is_mt7628(dev)) {
126 		if (mt76xx_rev(dev) == MT7628_REV_E1)
127 			firmware = MT7628_FIRMWARE_E1;
128 		else
129 			firmware = MT7628_FIRMWARE_E2;
130 	} else {
131 		if (mt76xx_rev(dev) < MT7603_REV_E2)
132 			firmware = MT7603_FIRMWARE_E1;
133 		else
134 			firmware = MT7603_FIRMWARE_E2;
135 	}
136 
137 	ret = request_firmware(&fw, firmware, dev->mt76.dev);
138 	if (ret)
139 		return ret;
140 
141 	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
142 		dev_err(dev->mt76.dev, "Invalid firmware\n");
143 		ret = -EINVAL;
144 		goto out;
145 	}
146 
147 	hdr = (const struct mt7603_fw_trailer *)(fw->data + fw->size -
148 						 sizeof(*hdr));
149 
150 	dev_info(dev->mt76.dev, "Firmware Version: %.10s\n", hdr->fw_ver);
151 	dev_info(dev->mt76.dev, "Build Time: %.15s\n", hdr->build_date);
152 
153 	addr = mt7603_reg_map(dev, 0x50012498);
154 	mt76_wr(dev, addr, 0x5);
155 	mt76_wr(dev, addr, 0x5);
156 	udelay(1);
157 
158 	/* switch to bypass mode */
159 	mt76_rmw(dev, MT_SCH_4, MT_SCH_4_FORCE_QID,
160 		 MT_SCH_4_BYPASS | FIELD_PREP(MT_SCH_4_FORCE_QID, 5));
161 
162 	val = mt76_rr(dev, MT_TOP_MISC2);
163 	if (val & BIT(1)) {
164 		dev_info(dev->mt76.dev, "Firmware already running...\n");
165 		goto running;
166 	}
167 
168 	if (!mt76_poll_msec(dev, MT_TOP_MISC2, BIT(0) | BIT(1), BIT(0), 500)) {
169 		dev_err(dev->mt76.dev, "Timeout waiting for ROM code to become ready\n");
170 		ret = -EIO;
171 		goto out;
172 	}
173 
174 	dl_len = le32_to_cpu(hdr->dl_len) + 4;
175 	ret = mt7603_mcu_init_download(dev, MCU_FIRMWARE_ADDRESS, dl_len);
176 	if (ret) {
177 		dev_err(dev->mt76.dev, "Download request failed\n");
178 		goto out;
179 	}
180 
181 	ret = mt76_mcu_send_firmware(&dev->mt76, -MCU_CMD_FW_SCATTER,
182 				     fw->data, dl_len);
183 	if (ret) {
184 		dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
185 		goto out;
186 	}
187 
188 	ret = mt7603_mcu_start_firmware(dev, MCU_FIRMWARE_ADDRESS);
189 	if (ret) {
190 		dev_err(dev->mt76.dev, "Failed to start firmware\n");
191 		goto out;
192 	}
193 
194 	if (!mt76_poll_msec(dev, MT_TOP_MISC2, BIT(1), BIT(1), 500)) {
195 		dev_err(dev->mt76.dev, "Timeout waiting for firmware to initialize\n");
196 		ret = -EIO;
197 		goto out;
198 	}
199 
200 running:
201 	mt76_clear(dev, MT_SCH_4, MT_SCH_4_FORCE_QID | MT_SCH_4_BYPASS);
202 
203 	mt76_set(dev, MT_SCH_4, BIT(8));
204 	mt76_clear(dev, MT_SCH_4, BIT(8));
205 
206 	dev->mcu_running = true;
207 	snprintf(dev->mt76.hw->wiphy->fw_version,
208 		 sizeof(dev->mt76.hw->wiphy->fw_version),
209 		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
210 	dev_info(dev->mt76.dev, "firmware init done\n");
211 
212 out:
213 	release_firmware(fw);
214 
215 	return ret;
216 }
217 
mt7603_mcu_init(struct mt7603_dev * dev)218 int mt7603_mcu_init(struct mt7603_dev *dev)
219 {
220 	static const struct mt76_mcu_ops mt7603_mcu_ops = {
221 		.headroom = sizeof(struct mt7603_mcu_txd),
222 		.mcu_skb_send_msg = mt7603_mcu_skb_send_msg,
223 		.mcu_parse_response = mt7603_mcu_parse_response,
224 	};
225 
226 	dev->mt76.mcu_ops = &mt7603_mcu_ops;
227 	return mt7603_load_firmware(dev);
228 }
229 
mt7603_mcu_exit(struct mt7603_dev * dev)230 void mt7603_mcu_exit(struct mt7603_dev *dev)
231 {
232 	mt7603_mcu_restart(&dev->mt76);
233 	skb_queue_purge(&dev->mt76.mcu.res_q);
234 }
235 
mt7603_mcu_set_eeprom(struct mt7603_dev * dev)236 int mt7603_mcu_set_eeprom(struct mt7603_dev *dev)
237 {
238 	static const u16 req_fields[] = {
239 #define WORD(_start)			\
240 		_start,			\
241 		_start + 1
242 #define GROUP_2G(_start)		\
243 		WORD(_start),		\
244 		WORD(_start + 2),	\
245 		WORD(_start + 4)
246 
247 		MT_EE_NIC_CONF_0 + 1,
248 		WORD(MT_EE_NIC_CONF_1),
249 		MT_EE_WIFI_RF_SETTING,
250 		MT_EE_TX_POWER_DELTA_BW40,
251 		MT_EE_TX_POWER_DELTA_BW80 + 1,
252 		MT_EE_TX_POWER_EXT_PA_5G,
253 		MT_EE_TEMP_SENSOR_CAL,
254 		GROUP_2G(MT_EE_TX_POWER_0_START_2G),
255 		GROUP_2G(MT_EE_TX_POWER_1_START_2G),
256 		WORD(MT_EE_TX_POWER_CCK),
257 		WORD(MT_EE_TX_POWER_OFDM_2G_6M),
258 		WORD(MT_EE_TX_POWER_OFDM_2G_24M),
259 		WORD(MT_EE_TX_POWER_OFDM_2G_54M),
260 		WORD(MT_EE_TX_POWER_HT_BPSK_QPSK),
261 		WORD(MT_EE_TX_POWER_HT_16_64_QAM),
262 		WORD(MT_EE_TX_POWER_HT_64_QAM),
263 		MT_EE_ELAN_RX_MODE_GAIN,
264 		MT_EE_ELAN_RX_MODE_NF,
265 		MT_EE_ELAN_RX_MODE_P1DB,
266 		MT_EE_ELAN_BYPASS_MODE_GAIN,
267 		MT_EE_ELAN_BYPASS_MODE_NF,
268 		MT_EE_ELAN_BYPASS_MODE_P1DB,
269 		WORD(MT_EE_STEP_NUM_NEG_6_7),
270 		WORD(MT_EE_STEP_NUM_NEG_4_5),
271 		WORD(MT_EE_STEP_NUM_NEG_2_3),
272 		WORD(MT_EE_STEP_NUM_NEG_0_1),
273 		WORD(MT_EE_REF_STEP_24G),
274 		WORD(MT_EE_STEP_NUM_PLUS_1_2),
275 		WORD(MT_EE_STEP_NUM_PLUS_3_4),
276 		WORD(MT_EE_STEP_NUM_PLUS_5_6),
277 		MT_EE_STEP_NUM_PLUS_7,
278 		MT_EE_XTAL_FREQ_OFFSET,
279 		MT_EE_XTAL_TRIM_2_COMP,
280 		MT_EE_XTAL_TRIM_3_COMP,
281 		MT_EE_XTAL_WF_RFCAL,
282 
283 		/* unknown fields below */
284 		WORD(0x24),
285 		0x34,
286 		0x39,
287 		0x3b,
288 		WORD(0x42),
289 		WORD(0x9e),
290 		0xf2,
291 		WORD(0xf8),
292 		0xfa,
293 		0x12e,
294 		WORD(0x130), WORD(0x132), WORD(0x134), WORD(0x136),
295 		WORD(0x138), WORD(0x13a), WORD(0x13c), WORD(0x13e),
296 
297 #undef GROUP_2G
298 #undef WORD
299 
300 	};
301 	struct req_data {
302 		__le16 addr;
303 		u8 val;
304 		u8 pad;
305 	} __packed;
306 	struct {
307 		u8 buffer_mode;
308 		u8 len;
309 		u8 pad[2];
310 	} req_hdr = {
311 		.buffer_mode = 1,
312 		.len = ARRAY_SIZE(req_fields) - 1,
313 	};
314 	const int size = 0xff * sizeof(struct req_data);
315 	u8 *req, *eep = (u8 *)dev->mt76.eeprom.data;
316 	int i, ret, len = sizeof(req_hdr) + size;
317 	struct req_data *data;
318 
319 	BUILD_BUG_ON(ARRAY_SIZE(req_fields) * sizeof(*data) > size);
320 
321 	req = kmalloc(len, GFP_KERNEL);
322 	if (!req)
323 		return -ENOMEM;
324 
325 	memcpy(req, &req_hdr, sizeof(req_hdr));
326 	data = (struct req_data *)(req + sizeof(req_hdr));
327 	memset(data, 0, size);
328 	for (i = 0; i < ARRAY_SIZE(req_fields); i++) {
329 		data[i].addr = cpu_to_le16(req_fields[i]);
330 		data[i].val = eep[req_fields[i]];
331 	}
332 
333 	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EFUSE_BUFFER_MODE,
334 				req, len, true);
335 	kfree(req);
336 
337 	return ret;
338 }
339 
mt7603_mcu_set_tx_power(struct mt7603_dev * dev)340 static int mt7603_mcu_set_tx_power(struct mt7603_dev *dev)
341 {
342 	struct {
343 		u8 center_channel;
344 		u8 tssi;
345 		u8 temp_comp;
346 		u8 target_power[2];
347 		u8 rate_power_delta[14];
348 		u8 bw_power_delta;
349 		u8 ch_power_delta[6];
350 		u8 temp_comp_power[17];
351 		u8 reserved;
352 	} req = {
353 		.center_channel = dev->mphy.chandef.chan->hw_value,
354 #define EEP_VAL(n) ((u8 *)dev->mt76.eeprom.data)[n]
355 		.tssi = EEP_VAL(MT_EE_NIC_CONF_1 + 1),
356 		.temp_comp = EEP_VAL(MT_EE_NIC_CONF_1),
357 		.target_power = {
358 			EEP_VAL(MT_EE_TX_POWER_0_START_2G + 2),
359 			EEP_VAL(MT_EE_TX_POWER_1_START_2G + 2)
360 		},
361 		.bw_power_delta = EEP_VAL(MT_EE_TX_POWER_DELTA_BW40),
362 		.ch_power_delta = {
363 			EEP_VAL(MT_EE_TX_POWER_0_START_2G + 3),
364 			EEP_VAL(MT_EE_TX_POWER_0_START_2G + 4),
365 			EEP_VAL(MT_EE_TX_POWER_0_START_2G + 5),
366 			EEP_VAL(MT_EE_TX_POWER_1_START_2G + 3),
367 			EEP_VAL(MT_EE_TX_POWER_1_START_2G + 4),
368 			EEP_VAL(MT_EE_TX_POWER_1_START_2G + 5)
369 		},
370 #undef EEP_VAL
371 	};
372 	u8 *eep = (u8 *)dev->mt76.eeprom.data;
373 
374 	memcpy(req.rate_power_delta, eep + MT_EE_TX_POWER_CCK,
375 	       sizeof(req.rate_power_delta));
376 
377 	memcpy(req.temp_comp_power, eep + MT_EE_STEP_NUM_NEG_6_7,
378 	       sizeof(req.temp_comp_power));
379 
380 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_TX_POWER_CTRL,
381 				 &req, sizeof(req), true);
382 }
383 
mt7603_mcu_set_channel(struct mt7603_dev * dev)384 int mt7603_mcu_set_channel(struct mt7603_dev *dev)
385 {
386 	struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
387 	struct ieee80211_hw *hw = mt76_hw(dev);
388 	int n_chains = hweight8(dev->mphy.antenna_mask);
389 	struct {
390 		u8 control_chan;
391 		u8 center_chan;
392 		u8 bw;
393 		u8 tx_streams;
394 		u8 rx_streams;
395 		u8 _res0[7];
396 		u8 txpower[21];
397 		u8 _res1[3];
398 	} req = {
399 		.control_chan = chandef->chan->hw_value,
400 		.center_chan = chandef->chan->hw_value,
401 		.bw = MT_BW_20,
402 		.tx_streams = n_chains,
403 		.rx_streams = n_chains,
404 	};
405 	s8 tx_power = hw->conf.power_level * 2;
406 	int i, ret;
407 
408 	if (dev->mphy.chandef.width == NL80211_CHAN_WIDTH_40) {
409 		req.bw = MT_BW_40;
410 		if (chandef->center_freq1 > chandef->chan->center_freq)
411 			req.center_chan += 2;
412 		else
413 			req.center_chan -= 2;
414 	}
415 
416 	tx_power = mt76_get_sar_power(&dev->mphy, chandef->chan, tx_power);
417 	if (dev->mphy.antenna_mask == 3)
418 		tx_power -= 6;
419 	tx_power = min(tx_power, dev->tx_power_limit);
420 
421 	dev->mphy.txpower_cur = tx_power;
422 
423 	for (i = 0; i < ARRAY_SIZE(req.txpower); i++)
424 		req.txpower[i] = tx_power;
425 
426 	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_CHANNEL_SWITCH, &req,
427 				sizeof(req), true);
428 	if (ret)
429 		return ret;
430 
431 	return mt7603_mcu_set_tx_power(dev);
432 }
433