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