mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
wifi: mt76: connac: add support to load firmware for mt7990
Add firmware download support. Note that mt7990 does not have WA and DSP firmwares. This is a preliminary patch to support mt7990 chipset. Co-developed-by: Peter Chiu <[email protected]> Signed-off-by: Peter Chiu <[email protected]> Signed-off-by: StanleyYP Wang <[email protected]> Signed-off-by: Shayne Chen <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
committed by
Felix Fietkau
parent
63a4edf1cb
commit
a2dd2f7896
+6
-1
@@ -232,9 +232,14 @@ static inline bool is_mt7992(struct mt76_dev *dev)
|
|||||||
return mt76_chip(dev) == 0x7992;
|
return mt76_chip(dev) == 0x7992;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool is_mt7990(struct mt76_dev *dev)
|
||||||
|
{
|
||||||
|
return mt76_chip(dev) == 0x7993;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_mt799x(struct mt76_dev *dev)
|
static inline bool is_mt799x(struct mt76_dev *dev)
|
||||||
{
|
{
|
||||||
return is_mt7996(dev) || is_mt7992(dev);
|
return is_mt7996(dev) || is_mt7992(dev) || is_mt7990(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool is_mt7622(struct mt76_dev *dev)
|
static inline bool is_mt7622(struct mt76_dev *dev)
|
||||||
|
|||||||
+1
-2
@@ -67,8 +67,7 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
|
|||||||
if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
|
if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
|
||||||
(is_mt7921(dev) && addr == 0x900000) ||
|
(is_mt7921(dev) && addr == 0x900000) ||
|
||||||
(is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
|
(is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
|
||||||
(is_mt7996(dev) && addr == 0x900000) ||
|
(is_mt799x(dev) && addr == 0x900000))
|
||||||
(is_mt7992(dev) && addr == 0x900000))
|
|
||||||
cmd = MCU_CMD(PATCH_START_REQ);
|
cmd = MCU_CMD(PATCH_START_REQ);
|
||||||
else
|
else
|
||||||
cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
|
cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
|
||||||
|
|||||||
+15
-8
@@ -22,6 +22,9 @@
|
|||||||
_fw = MT7992_##name; \
|
_fw = MT7992_##name; \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
|
case MT7990_DEVICE_ID: \
|
||||||
|
_fw = MT7990_##name; \
|
||||||
|
break; \
|
||||||
case MT7996_DEVICE_ID: \
|
case MT7996_DEVICE_ID: \
|
||||||
default: \
|
default: \
|
||||||
switch ((_dev)->var.type) { \
|
switch ((_dev)->var.type) { \
|
||||||
@@ -265,7 +268,7 @@ mt7996_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
|
|||||||
|
|
||||||
txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
|
txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
|
||||||
txd = (__le32 *)skb_push(skb, txd_len);
|
txd = (__le32 *)skb_push(skb, txd_len);
|
||||||
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
|
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state) && mt7996_has_wa(dev))
|
||||||
qid = MT_MCUQ_WA;
|
qid = MT_MCUQ_WA;
|
||||||
else
|
else
|
||||||
qid = MT_MCUQ_WM;
|
qid = MT_MCUQ_WM;
|
||||||
@@ -3011,6 +3014,9 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (!mt7996_has_wa(dev))
|
||||||
|
return 0;
|
||||||
|
|
||||||
ret = __mt7996_load_ram(dev, "DSP", fw_name(dev, FIRMWARE_DSP),
|
ret = __mt7996_load_ram(dev, "DSP", fw_name(dev, FIRMWARE_DSP),
|
||||||
MT7996_RAM_TYPE_DSP);
|
MT7996_RAM_TYPE_DSP);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -3021,10 +3027,9 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mt7996_firmware_state(struct mt7996_dev *dev, bool wa)
|
mt7996_firmware_state(struct mt7996_dev *dev, u8 fw_state)
|
||||||
{
|
{
|
||||||
u32 state = FIELD_PREP(MT_TOP_MISC_FW_STATE,
|
u32 state = FIELD_PREP(MT_TOP_MISC_FW_STATE, fw_state);
|
||||||
wa ? FW_STATE_RDY : FW_STATE_FW_DOWNLOAD);
|
|
||||||
|
|
||||||
if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
|
if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
|
||||||
state, 1000)) {
|
state, 1000)) {
|
||||||
@@ -3056,13 +3061,14 @@ mt7996_mcu_restart(struct mt76_dev *dev)
|
|||||||
|
|
||||||
static int mt7996_load_firmware(struct mt7996_dev *dev)
|
static int mt7996_load_firmware(struct mt7996_dev *dev)
|
||||||
{
|
{
|
||||||
|
u8 fw_state;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* make sure fw is download state */
|
/* make sure fw is download state */
|
||||||
if (mt7996_firmware_state(dev, false)) {
|
if (mt7996_firmware_state(dev, FW_STATE_FW_DOWNLOAD)) {
|
||||||
/* restart firmware once */
|
/* restart firmware once */
|
||||||
mt7996_mcu_restart(&dev->mt76);
|
mt7996_mcu_restart(&dev->mt76);
|
||||||
ret = mt7996_firmware_state(dev, false);
|
ret = mt7996_firmware_state(dev, FW_STATE_FW_DOWNLOAD);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev->mt76.dev,
|
dev_err(dev->mt76.dev,
|
||||||
"Firmware is not ready for download\n");
|
"Firmware is not ready for download\n");
|
||||||
@@ -3078,7 +3084,8 @@ static int mt7996_load_firmware(struct mt7996_dev *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = mt7996_firmware_state(dev, true);
|
fw_state = mt7996_has_wa(dev) ? FW_STATE_RDY : FW_STATE_NORMAL_TRX;
|
||||||
|
ret = mt7996_firmware_state(dev, fw_state);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -3248,7 +3255,7 @@ int mt7996_mcu_init(struct mt7996_dev *dev)
|
|||||||
void mt7996_mcu_exit(struct mt7996_dev *dev)
|
void mt7996_mcu_exit(struct mt7996_dev *dev)
|
||||||
{
|
{
|
||||||
mt7996_mcu_restart(&dev->mt76);
|
mt7996_mcu_restart(&dev->mt76);
|
||||||
if (mt7996_firmware_state(dev, false)) {
|
if (mt7996_firmware_state(dev, FW_STATE_FW_DOWNLOAD)) {
|
||||||
dev_err(dev->mt76.dev, "Failed to exit mcu\n");
|
dev_err(dev->mt76.dev, "Failed to exit mcu\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#define MT7996_DEVICE_ID_2 0x7991
|
#define MT7996_DEVICE_ID_2 0x7991
|
||||||
#define MT7992_DEVICE_ID 0x7992
|
#define MT7992_DEVICE_ID 0x7992
|
||||||
#define MT7992_DEVICE_ID_2 0x799a
|
#define MT7992_DEVICE_ID_2 0x799a
|
||||||
|
#define MT7990_DEVICE_ID 0x7993
|
||||||
|
#define MT7990_DEVICE_ID_2 0x799b
|
||||||
|
|
||||||
#define MT7996_FIRMWARE_WA "mediatek/mt7996/mt7996_wa.bin"
|
#define MT7996_FIRMWARE_WA "mediatek/mt7996/mt7996_wa.bin"
|
||||||
#define MT7996_FIRMWARE_WM "mediatek/mt7996/mt7996_wm.bin"
|
#define MT7996_FIRMWARE_WM "mediatek/mt7996/mt7996_wm.bin"
|
||||||
@@ -55,6 +57,11 @@
|
|||||||
#define MT7992_FIRMWARE_DSP_23 "mediatek/mt7996/mt7992_dsp_23.bin"
|
#define MT7992_FIRMWARE_DSP_23 "mediatek/mt7996/mt7992_dsp_23.bin"
|
||||||
#define MT7992_ROM_PATCH_23 "mediatek/mt7996/mt7992_rom_patch_23.bin"
|
#define MT7992_ROM_PATCH_23 "mediatek/mt7996/mt7992_rom_patch_23.bin"
|
||||||
|
|
||||||
|
#define MT7990_FIRMWARE_WA ""
|
||||||
|
#define MT7990_FIRMWARE_WM "mediatek/mt7996/mt7990_wm.bin"
|
||||||
|
#define MT7990_FIRMWARE_DSP ""
|
||||||
|
#define MT7990_ROM_PATCH "mediatek/mt7996/mt7990_rom_patch.bin"
|
||||||
|
|
||||||
#define MT7996_EEPROM_DEFAULT "mediatek/mt7996/mt7996_eeprom.bin"
|
#define MT7996_EEPROM_DEFAULT "mediatek/mt7996/mt7996_eeprom.bin"
|
||||||
#define MT7996_EEPROM_DEFAULT_INT "mediatek/mt7996/mt7996_eeprom_2i5i6i.bin"
|
#define MT7996_EEPROM_DEFAULT_INT "mediatek/mt7996/mt7996_eeprom_2i5i6i.bin"
|
||||||
#define MT7996_EEPROM_DEFAULT_233 "mediatek/mt7996/mt7996_eeprom_233.bin"
|
#define MT7996_EEPROM_DEFAULT_233 "mediatek/mt7996/mt7996_eeprom_233.bin"
|
||||||
@@ -709,6 +716,11 @@ static inline u16 mt7996_rx_chainmask(struct mt7996_phy *phy)
|
|||||||
return tx_chainmask | (BIT(fls(tx_chainmask)) * phy->has_aux_rx);
|
return tx_chainmask | (BIT(fls(tx_chainmask)) * phy->has_aux_rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool mt7996_has_wa(struct mt7996_dev *dev)
|
||||||
|
{
|
||||||
|
return !is_mt7990(&dev->mt76);
|
||||||
|
}
|
||||||
|
|
||||||
void mt7996_mac_init(struct mt7996_dev *dev);
|
void mt7996_mac_init(struct mt7996_dev *dev);
|
||||||
u32 mt7996_mac_wtbl_lmac_addr(struct mt7996_dev *dev, u16 wcid, u8 dw);
|
u32 mt7996_mac_wtbl_lmac_addr(struct mt7996_dev *dev, u16 wcid, u8 dw);
|
||||||
bool mt7996_mac_wtbl_update(struct mt7996_dev *dev, int idx, u32 mask);
|
bool mt7996_mac_wtbl_update(struct mt7996_dev *dev, int idx, u32 mask);
|
||||||
|
|||||||
@@ -257,3 +257,5 @@ MODULE_FIRMWARE(MT7992_FIRMWARE_WA);
|
|||||||
MODULE_FIRMWARE(MT7992_FIRMWARE_WM);
|
MODULE_FIRMWARE(MT7992_FIRMWARE_WM);
|
||||||
MODULE_FIRMWARE(MT7992_FIRMWARE_DSP);
|
MODULE_FIRMWARE(MT7992_FIRMWARE_DSP);
|
||||||
MODULE_FIRMWARE(MT7992_ROM_PATCH);
|
MODULE_FIRMWARE(MT7992_ROM_PATCH);
|
||||||
|
MODULE_FIRMWARE(MT7990_FIRMWARE_WM);
|
||||||
|
MODULE_FIRMWARE(MT7990_ROM_PATCH);
|
||||||
|
|||||||
Reference in New Issue
Block a user