2 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <linux/kernel.h>
18 #include <linux/firmware.h>
19 #include <linux/delay.h>
22 #include "mt76x2_mcu.h"
23 #include "mt76x2_dma.h"
24 #include "mt76x2_eeprom.h"
26 struct mt76x2_fw_header
{
35 struct mt76x2_patch_header
{
39 char patch_version
[4];
43 static struct sk_buff
*mt76x2_mcu_msg_alloc(const void *data
, int len
)
47 skb
= alloc_skb(len
, GFP_KERNEL
);
50 memcpy(skb_put(skb
, len
), data
, len
);
55 static struct sk_buff
*
56 mt76x2_mcu_get_response(struct mt76x2_dev
*dev
, unsigned long expires
)
58 unsigned long timeout
;
60 if (!time_is_after_jiffies(expires
))
63 timeout
= expires
- jiffies
;
64 wait_event_timeout(dev
->mcu
.wait
, !skb_queue_empty(&dev
->mcu
.res_q
),
66 return skb_dequeue(&dev
->mcu
.res_q
);
70 mt76x2_mcu_msg_send(struct mt76x2_dev
*dev
, struct sk_buff
*skb
,
73 unsigned long expires
= jiffies
+ HZ
;
80 mutex_lock(&dev
->mcu
.mutex
);
82 seq
= ++dev
->mcu
.msg_seq
& 0xf;
84 seq
= ++dev
->mcu
.msg_seq
& 0xf;
86 ret
= mt76x2_tx_queue_mcu(dev
, MT_TXQ_MCU
, skb
, cmd
, seq
);
92 bool check_seq
= false;
94 skb
= mt76x2_mcu_get_response(dev
, expires
);
96 dev_err(dev
->mt76
.dev
,
97 "MCU message %d (seq %d) timed out\n", cmd
,
103 rxfce
= (u32
*) skb
->cb
;
105 if (seq
== FIELD_GET(MT_RX_FCE_INFO_CMD_SEQ
, *rxfce
))
114 mutex_unlock(&dev
->mcu
.mutex
);
120 mt76pci_load_rom_patch(struct mt76x2_dev
*dev
)
122 const struct firmware
*fw
= NULL
;
123 struct mt76x2_patch_header
*hdr
;
124 bool rom_protect
= !is_mt7612(dev
);
127 u32 patch_mask
, patch_reg
;
129 if (rom_protect
&& !mt76_poll(dev
, MT_MCU_SEMAPHORE_03
, 1, 1, 600)) {
130 dev_err(dev
->mt76
.dev
,
131 "Could not get hardware semaphore for ROM PATCH\n");
135 if (mt76xx_rev(dev
) >= MT76XX_REV_E3
) {
137 patch_reg
= MT_MCU_CLOCK_CTL
;
140 patch_reg
= MT_MCU_COM_REG0
;
143 if (rom_protect
&& (mt76_rr(dev
, patch_reg
) & patch_mask
)) {
144 dev_info(dev
->mt76
.dev
, "ROM patch already applied\n");
148 ret
= request_firmware(&fw
, MT7662_ROM_PATCH
, dev
->mt76
.dev
);
152 if (!fw
|| !fw
->data
|| fw
->size
<= sizeof(*hdr
)) {
154 dev_err(dev
->mt76
.dev
, "Failed to load firmware\n");
158 hdr
= (struct mt76x2_patch_header
*) fw
->data
;
159 dev_info(dev
->mt76
.dev
, "ROM patch build: %.15s\n", hdr
->build_time
);
161 mt76_wr(dev
, MT_MCU_PCIE_REMAP_BASE4
, MT_MCU_ROM_PATCH_OFFSET
);
163 cur
= (__le32
*) (fw
->data
+ sizeof(*hdr
));
164 len
= fw
->size
- sizeof(*hdr
);
165 mt76_wr_copy(dev
, MT_MCU_ROM_PATCH_ADDR
, cur
, len
);
167 mt76_wr(dev
, MT_MCU_PCIE_REMAP_BASE4
, 0);
170 mt76_wr(dev
, MT_MCU_INT_LEVEL
, 4);
172 if (!mt76_poll_msec(dev
, patch_reg
, patch_mask
, patch_mask
, 2000)) {
173 dev_err(dev
->mt76
.dev
, "Failed to load ROM patch\n");
178 /* release semaphore */
180 mt76_wr(dev
, MT_MCU_SEMAPHORE_03
, 1);
181 release_firmware(fw
);
186 mt76pci_load_firmware(struct mt76x2_dev
*dev
)
188 const struct firmware
*fw
;
189 const struct mt76x2_fw_header
*hdr
;
194 ret
= request_firmware(&fw
, MT7662_FIRMWARE
, dev
->mt76
.dev
);
198 if (!fw
|| !fw
->data
|| fw
->size
< sizeof(*hdr
))
201 hdr
= (const struct mt76x2_fw_header
*) fw
->data
;
204 len
+= le32_to_cpu(hdr
->ilm_len
);
205 len
+= le32_to_cpu(hdr
->dlm_len
);
210 val
= le16_to_cpu(hdr
->fw_ver
);
211 dev_info(dev
->mt76
.dev
, "Firmware Version: %d.%d.%02d\n",
212 (val
>> 12) & 0xf, (val
>> 8) & 0xf, val
& 0xf);
214 val
= le16_to_cpu(hdr
->build_ver
);
215 dev_info(dev
->mt76
.dev
, "Build: %x\n", val
);
216 dev_info(dev
->mt76
.dev
, "Build Time: %.16s\n", hdr
->build_time
);
218 cur
= (__le32
*) (fw
->data
+ sizeof(*hdr
));
219 len
= le32_to_cpu(hdr
->ilm_len
);
221 mt76_wr(dev
, MT_MCU_PCIE_REMAP_BASE4
, MT_MCU_ILM_OFFSET
);
222 mt76_wr_copy(dev
, MT_MCU_ILM_ADDR
, cur
, len
);
224 cur
+= len
/ sizeof(*cur
);
225 len
= le32_to_cpu(hdr
->dlm_len
);
227 if (mt76xx_rev(dev
) >= MT76XX_REV_E3
)
228 offset
= MT_MCU_DLM_ADDR_E3
;
230 offset
= MT_MCU_DLM_ADDR
;
232 mt76_wr(dev
, MT_MCU_PCIE_REMAP_BASE4
, MT_MCU_DLM_OFFSET
);
233 mt76_wr_copy(dev
, offset
, cur
, len
);
235 mt76_wr(dev
, MT_MCU_PCIE_REMAP_BASE4
, 0);
237 val
= mt76x2_eeprom_get(dev
, MT_EE_NIC_CONF_2
);
238 if (FIELD_GET(MT_EE_NIC_CONF_2_XTAL_OPTION
, val
) == 1)
239 mt76_set(dev
, MT_MCU_COM_REG0
, BIT(30));
241 /* trigger firmware */
242 mt76_wr(dev
, MT_MCU_INT_LEVEL
, 2);
243 for (i
= 200; i
> 0; i
--) {
244 val
= mt76_rr(dev
, MT_MCU_COM_REG0
);
253 dev_err(dev
->mt76
.dev
, "Firmware failed to start\n");
254 release_firmware(fw
);
258 dev_info(dev
->mt76
.dev
, "Firmware running!\n");
260 release_firmware(fw
);
265 dev_err(dev
->mt76
.dev
, "Invalid firmware\n");
266 release_firmware(fw
);
271 mt76x2_mcu_function_select(struct mt76x2_dev
*dev
, enum mcu_function func
,
278 } __packed
__aligned(4) msg
= {
279 .id
= cpu_to_le32(func
),
280 .value
= cpu_to_le32(val
),
283 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
284 return mt76x2_mcu_msg_send(dev
, skb
, CMD_FUN_SET_OP
);
287 int mt76x2_mcu_load_cr(struct mt76x2_dev
*dev
, u8 type
, u8 temp_level
,
298 } __packed
__aligned(4) msg
= {
306 val
|= (mt76x2_eeprom_get(dev
, MT_EE_NIC_CONF_0
) >> 8) & 0x00ff;
307 val
|= (mt76x2_eeprom_get(dev
, MT_EE_NIC_CONF_1
) << 8) & 0xff00;
308 msg
.cfg
= cpu_to_le32(val
);
310 /* first set the channel without the extension channel info */
311 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
312 return mt76x2_mcu_msg_send(dev
, skb
, CMD_LOAD_CR
);
315 int mt76x2_mcu_set_channel(struct mt76x2_dev
*dev
, u8 channel
, u8 bw
,
316 u8 bw_index
, bool scan
)
329 } __packed
__aligned(4) msg
= {
333 .chainmask
= cpu_to_le16(dev
->chainmask
),
336 /* first set the channel without the extension channel info */
337 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
338 mt76x2_mcu_msg_send(dev
, skb
, CMD_SWITCH_CHANNEL_OP
);
340 usleep_range(5000, 10000);
342 msg
.ext_chan
= 0xe0 + bw_index
;
343 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
344 return mt76x2_mcu_msg_send(dev
, skb
, CMD_SWITCH_CHANNEL_OP
);
347 int mt76x2_mcu_set_radio_state(struct mt76x2_dev
*dev
, bool on
)
353 } __packed
__aligned(4) msg
= {
354 .mode
= cpu_to_le32(on
? RADIO_ON
: RADIO_OFF
),
355 .level
= cpu_to_le32(0),
358 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
359 return mt76x2_mcu_msg_send(dev
, skb
, CMD_POWER_SAVING_OP
);
362 int mt76x2_mcu_calibrate(struct mt76x2_dev
*dev
, enum mcu_calibration type
,
369 } __packed
__aligned(4) msg
= {
370 .id
= cpu_to_le32(type
),
371 .value
= cpu_to_le32(param
),
375 mt76_clear(dev
, MT_MCU_COM_REG0
, BIT(31));
377 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
378 ret
= mt76x2_mcu_msg_send(dev
, skb
, CMD_CALIBRATION_OP
);
382 if (WARN_ON(!mt76_poll_msec(dev
, MT_MCU_COM_REG0
,
383 BIT(31), BIT(31), 100)))
389 int mt76x2_mcu_tssi_comp(struct mt76x2_dev
*dev
,
390 struct mt76x2_tssi_comp
*tssi_data
)
395 struct mt76x2_tssi_comp data
;
396 } __packed
__aligned(4) msg
= {
397 .id
= cpu_to_le32(MCU_CAL_TSSI_COMP
),
401 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
402 return mt76x2_mcu_msg_send(dev
, skb
, CMD_CALIBRATION_OP
);
405 int mt76x2_mcu_init_gain(struct mt76x2_dev
*dev
, u8 channel
, u32 gain
,
412 } __packed
__aligned(4) msg
= {
413 .channel
= cpu_to_le32(channel
),
414 .gain_val
= cpu_to_le32(gain
),
418 msg
.channel
|= cpu_to_le32(BIT(31));
420 skb
= mt76x2_mcu_msg_alloc(&msg
, sizeof(msg
));
421 return mt76x2_mcu_msg_send(dev
, skb
, CMD_INIT_GAIN_OP
);
424 int mt76x2_mcu_init(struct mt76x2_dev
*dev
)
428 mutex_init(&dev
->mcu
.mutex
);
430 ret
= mt76pci_load_rom_patch(dev
);
434 ret
= mt76pci_load_firmware(dev
);
438 mt76x2_mcu_function_select(dev
, Q_SELECT
, 1);
442 int mt76x2_mcu_cleanup(struct mt76x2_dev
*dev
)
446 mt76_wr(dev
, MT_MCU_INT_LEVEL
, 1);
447 usleep_range(20000, 30000);
449 while ((skb
= skb_dequeue(&dev
->mcu
.res_q
)) != NULL
)