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