1 /* SPDX-License-Identifier: ISC */
3 #include <linux/firmware.h>
8 #define MCU_SKB_RESERVE 8
10 struct mt7603_fw_trailer
{
17 __mt7603_mcu_msg_send(struct mt7603_dev
*dev
, struct sk_buff
*skb
, int cmd
,
18 int query
, int *wait_seq
)
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
;
28 seq
= ++mdev
->mmio
.mcu
.msg_seq
& 0xf;
30 seq
= ++mdev
->mmio
.mcu
.msg_seq
& 0xf;
32 txd
= (struct mt7603_mcu_txd
*)skb_push(skb
, hdrlen
);
33 memset(txd
, 0, hdrlen
);
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
);
39 txd
->pq_id
= cpu_to_le16(MCU_PORT_QUEUE
);
40 txd
->pkt_type
= MCU_PKT_ID
;
46 txd
->cid
= MCU_CMD_EXT_CID
;
48 if (query
!= MCU_Q_NA
)
52 txd
->set_query
= query
;
57 return mt76_tx_queue_skb_raw(dev
, MT_TXQ_MCU
, skb
, 0);
61 mt7603_mcu_msg_send(struct mt7603_dev
*dev
, struct sk_buff
*skb
, int cmd
,
64 struct mt76_dev
*mdev
= &dev
->mt76
;
65 unsigned long expires
= jiffies
+ 3 * HZ
;
66 struct mt7603_mcu_rxd
*rxd
;
69 mutex_lock(&mdev
->mmio
.mcu
.mutex
);
71 ret
= __mt7603_mcu_msg_send(dev
, skb
, cmd
, query
, &seq
);
76 bool check_seq
= false;
78 skb
= mt76_mcu_get_response(&dev
->mt76
, expires
);
81 "MCU message %d (seq %d) timed out\n",
83 dev
->mcu_hang
= MT7603_WATCHDOG_TIMEOUT
;
88 rxd
= (struct mt7603_mcu_rxd
*)skb
->data
;
99 mutex_unlock(&mdev
->mmio
.mcu
.mutex
);
105 mt7603_mcu_init_download(struct mt7603_dev
*dev
, u32 addr
, u32 len
)
112 .addr
= cpu_to_le32(addr
),
113 .len
= cpu_to_le32(len
),
114 .mode
= cpu_to_le32(BIT(31)),
116 struct sk_buff
*skb
= mt7603_mcu_msg_alloc(&req
, sizeof(req
));
118 return mt7603_mcu_msg_send(dev
, skb
, -MCU_CMD_TARGET_ADDRESS_LEN_REQ
,
123 mt7603_mcu_send_firmware(struct mt7603_dev
*dev
, const void *data
, int len
)
129 int cur_len
= min_t(int, 4096 - sizeof(struct mt7603_mcu_txd
),
132 skb
= mt7603_mcu_msg_alloc(data
, cur_len
);
136 ret
= __mt7603_mcu_msg_send(dev
, skb
, -MCU_CMD_FW_SCATTER
,
149 mt7603_mcu_start_firmware(struct mt7603_dev
*dev
, u32 addr
)
155 .override
= cpu_to_le32(addr
? 1 : 0),
156 .addr
= cpu_to_le32(addr
),
158 struct sk_buff
*skb
= mt7603_mcu_msg_alloc(&req
, sizeof(req
));
160 return mt7603_mcu_msg_send(dev
, skb
, -MCU_CMD_FW_START_REQ
,
165 mt7603_mcu_restart(struct mt7603_dev
*dev
)
167 struct sk_buff
*skb
= mt7603_mcu_msg_alloc(NULL
, 0);
169 return mt7603_mcu_msg_send(dev
, skb
, -MCU_CMD_RESTART_DL_REQ
,
174 mt7603_load_firmware(struct mt7603_dev
*dev
)
176 const struct firmware
*fw
;
177 const struct mt7603_fw_trailer
*hdr
;
178 const char *firmware
;
183 if (is_mt7628(dev
)) {
184 if (mt76xx_rev(dev
) == MT7628_REV_E1
)
185 firmware
= MT7628_FIRMWARE_E1
;
187 firmware
= MT7628_FIRMWARE_E2
;
189 if (mt76xx_rev(dev
) < MT7603_REV_E2
)
190 firmware
= MT7603_FIRMWARE_E1
;
192 firmware
= MT7603_FIRMWARE_E2
;
195 ret
= request_firmware(&fw
, firmware
, dev
->mt76
.dev
);
199 if (!fw
|| !fw
->data
|| fw
->size
< sizeof(*hdr
)) {
200 dev_err(dev
->mt76
.dev
, "Invalid firmware\n");
205 hdr
= (const struct mt7603_fw_trailer
*)(fw
->data
+ fw
->size
-
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
);
211 addr
= mt7603_reg_map(dev
, 0x50012498);
212 mt76_wr(dev
, addr
, 0x5);
213 mt76_wr(dev
, addr
, 0x5);
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));
220 val
= mt76_rr(dev
, MT_TOP_MISC2
);
222 dev_info(dev
->mt76
.dev
, "Firmware already running...\n");
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");
232 dl_len
= le32_to_cpu(hdr
->dl_len
) + 4;
233 ret
= mt7603_mcu_init_download(dev
, MCU_FIRMWARE_ADDRESS
, dl_len
);
235 dev_err(dev
->mt76
.dev
, "Download request failed\n");
239 ret
= mt7603_mcu_send_firmware(dev
, fw
->data
, dl_len
);
241 dev_err(dev
->mt76
.dev
, "Failed to send firmware to device\n");
245 ret
= mt7603_mcu_start_firmware(dev
, MCU_FIRMWARE_ADDRESS
);
247 dev_err(dev
->mt76
.dev
, "Failed to start firmware\n");
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");
258 mt76_clear(dev
, MT_SCH_4
, MT_SCH_4_FORCE_QID
| MT_SCH_4_BYPASS
);
260 mt76_set(dev
, MT_SCH_4
, BIT(8));
261 mt76_clear(dev
, MT_SCH_4
, BIT(8));
263 dev
->mcu_running
= true;
264 dev_info(dev
->mt76
.dev
, "firmware init done\n");
267 release_firmware(fw
);
272 int mt7603_mcu_init(struct mt7603_dev
*dev
)
274 mutex_init(&dev
->mt76
.mmio
.mcu
.mutex
);
276 return mt7603_load_firmware(dev
);
279 void mt7603_mcu_exit(struct mt7603_dev
*dev
)
281 mt7603_mcu_restart(dev
);
282 skb_queue_purge(&dev
->mt76
.mmio
.mcu
.res_q
);
285 int mt7603_mcu_set_eeprom(struct mt7603_dev
*dev
)
287 static const u16 req_fields
[] = {
288 #define WORD(_start) \
291 #define GROUP_2G(_start) \
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
,
332 /* unknown fields below */
343 WORD(0x130), WORD(0x132), WORD(0x134), WORD(0x136),
344 WORD(0x138), WORD(0x13a), WORD(0x13c), WORD(0x13e),
361 .len
= ARRAY_SIZE(req_fields
) - 1,
364 struct req_data
*data
;
365 const int size
= 0xff * sizeof(struct req_data
);
366 u8
*eep
= (u8
*)dev
->mt76
.eeprom
.data
;
369 BUILD_BUG_ON(ARRAY_SIZE(req_fields
) * sizeof(*data
) > size
);
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
);
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
]];
382 return mt7603_mcu_msg_send(dev
, skb
, MCU_EXT_CMD_EFUSE_BUFFER_MODE
,
386 static int mt7603_mcu_set_tx_power(struct mt7603_dev
*dev
)
393 u8 rate_power_delta
[14];
395 u8 ch_power_delta
[6];
396 u8 temp_comp_power
[17];
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
),
404 EEP_VAL(MT_EE_TX_POWER_0_START_2G
+ 2),
405 EEP_VAL(MT_EE_TX_POWER_1_START_2G
+ 2)
407 .bw_power_delta
= EEP_VAL(MT_EE_TX_POWER_DELTA_BW40
),
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)
419 u8
*eep
= (u8
*)dev
->mt76
.eeprom
.data
;
421 memcpy(req
.rate_power_delta
, eep
+ MT_EE_TX_POWER_CCK
,
422 sizeof(req
.rate_power_delta
));
424 memcpy(req
.temp_comp_power
, eep
+ MT_EE_STEP_NUM_NEG_6_7
,
425 sizeof(req
.temp_comp_power
));
427 skb
= mt7603_mcu_msg_alloc(&req
, sizeof(req
));
428 return mt7603_mcu_msg_send(dev
, skb
, MCU_EXT_CMD_SET_TX_POWER_CTRL
,
432 int mt7603_mcu_set_channel(struct mt7603_dev
*dev
)
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
);
447 .control_chan
= chandef
->chan
->hw_value
,
448 .center_chan
= chandef
->chan
->hw_value
,
450 .tx_streams
= n_chains
,
451 .rx_streams
= n_chains
,
458 if (dev
->mt76
.chandef
.width
== NL80211_CHAN_WIDTH_40
) {
460 if (chandef
->center_freq1
> chandef
->chan
->center_freq
)
461 req
.center_chan
+= 2;
463 req
.center_chan
-= 2;
466 tx_power
= hw
->conf
.power_level
* 2;
467 if (dev
->mt76
.antenna_mask
== 3)
469 tx_power
= min(tx_power
, dev
->tx_power_limit
);
471 dev
->mt76
.txpower_cur
= tx_power
;
473 for (i
= 0; i
< ARRAY_SIZE(req
.txpower
); i
++)
474 req
.txpower
[i
] = tx_power
;
476 skb
= mt7603_mcu_msg_alloc(&req
, sizeof(req
));
477 ret
= mt7603_mcu_msg_send(dev
, skb
, MCU_EXT_CMD_CHANNEL_SWITCH
,
482 return mt7603_mcu_set_tx_power(dev
);