0001
0002
0003
0004
0005
0006 #include <linux/kernel.h>
0007 #include <linux/firmware.h>
0008 #include <linux/delay.h>
0009
0010 #include "mt76x2.h"
0011 #include "mcu.h"
0012 #include "eeprom.h"
0013
0014 static int
0015 mt76pci_load_rom_patch(struct mt76x02_dev *dev)
0016 {
0017 const struct firmware *fw = NULL;
0018 struct mt76x02_patch_header *hdr;
0019 bool rom_protect = !is_mt7612(dev);
0020 int len, ret = 0;
0021 __le32 *cur;
0022 u32 patch_mask, patch_reg;
0023
0024 if (rom_protect && !mt76_poll(dev, MT_MCU_SEMAPHORE_03, 1, 1, 600)) {
0025 dev_err(dev->mt76.dev,
0026 "Could not get hardware semaphore for ROM PATCH\n");
0027 return -ETIMEDOUT;
0028 }
0029
0030 if (mt76xx_rev(dev) >= MT76XX_REV_E3) {
0031 patch_mask = BIT(0);
0032 patch_reg = MT_MCU_CLOCK_CTL;
0033 } else {
0034 patch_mask = BIT(1);
0035 patch_reg = MT_MCU_COM_REG0;
0036 }
0037
0038 if (rom_protect && (mt76_rr(dev, patch_reg) & patch_mask)) {
0039 dev_info(dev->mt76.dev, "ROM patch already applied\n");
0040 goto out;
0041 }
0042
0043 ret = request_firmware(&fw, MT7662_ROM_PATCH, dev->mt76.dev);
0044 if (ret)
0045 goto out;
0046
0047 if (!fw || !fw->data || fw->size <= sizeof(*hdr)) {
0048 ret = -EIO;
0049 dev_err(dev->mt76.dev, "Failed to load firmware\n");
0050 goto out;
0051 }
0052
0053 hdr = (struct mt76x02_patch_header *)fw->data;
0054 dev_info(dev->mt76.dev, "ROM patch build: %.15s\n", hdr->build_time);
0055
0056 mt76_wr(dev, MT_MCU_PCIE_REMAP_BASE4, MT_MCU_ROM_PATCH_OFFSET);
0057
0058 cur = (__le32 *)(fw->data + sizeof(*hdr));
0059 len = fw->size - sizeof(*hdr);
0060 mt76_wr_copy(dev, MT_MCU_ROM_PATCH_ADDR, cur, len);
0061
0062 mt76_wr(dev, MT_MCU_PCIE_REMAP_BASE4, 0);
0063
0064
0065 mt76_wr(dev, MT_MCU_INT_LEVEL, 4);
0066
0067 if (!mt76_poll_msec(dev, patch_reg, patch_mask, patch_mask, 2000)) {
0068 dev_err(dev->mt76.dev, "Failed to load ROM patch\n");
0069 ret = -ETIMEDOUT;
0070 }
0071
0072 out:
0073
0074 if (rom_protect)
0075 mt76_wr(dev, MT_MCU_SEMAPHORE_03, 1);
0076 release_firmware(fw);
0077 return ret;
0078 }
0079
0080 static int
0081 mt76pci_load_firmware(struct mt76x02_dev *dev)
0082 {
0083 const struct firmware *fw;
0084 const struct mt76x02_fw_header *hdr;
0085 int len, ret;
0086 __le32 *cur;
0087 u32 offset, val;
0088
0089 ret = request_firmware(&fw, MT7662_FIRMWARE, dev->mt76.dev);
0090 if (ret)
0091 return ret;
0092
0093 if (!fw || !fw->data || fw->size < sizeof(*hdr))
0094 goto error;
0095
0096 hdr = (const struct mt76x02_fw_header *)fw->data;
0097
0098 len = sizeof(*hdr);
0099 len += le32_to_cpu(hdr->ilm_len);
0100 len += le32_to_cpu(hdr->dlm_len);
0101
0102 if (fw->size != len)
0103 goto error;
0104
0105 val = le16_to_cpu(hdr->fw_ver);
0106 dev_info(dev->mt76.dev, "Firmware Version: %d.%d.%02d\n",
0107 (val >> 12) & 0xf, (val >> 8) & 0xf, val & 0xf);
0108
0109 val = le16_to_cpu(hdr->build_ver);
0110 dev_info(dev->mt76.dev, "Build: %x\n", val);
0111 dev_info(dev->mt76.dev, "Build Time: %.16s\n", hdr->build_time);
0112
0113 cur = (__le32 *)(fw->data + sizeof(*hdr));
0114 len = le32_to_cpu(hdr->ilm_len);
0115
0116 mt76_wr(dev, MT_MCU_PCIE_REMAP_BASE4, MT_MCU_ILM_OFFSET);
0117 mt76_wr_copy(dev, MT_MCU_ILM_ADDR, cur, len);
0118
0119 cur += len / sizeof(*cur);
0120 len = le32_to_cpu(hdr->dlm_len);
0121
0122 if (mt76xx_rev(dev) >= MT76XX_REV_E3)
0123 offset = MT_MCU_DLM_ADDR_E3;
0124 else
0125 offset = MT_MCU_DLM_ADDR;
0126
0127 mt76_wr(dev, MT_MCU_PCIE_REMAP_BASE4, MT_MCU_DLM_OFFSET);
0128 mt76_wr_copy(dev, offset, cur, len);
0129
0130 mt76_wr(dev, MT_MCU_PCIE_REMAP_BASE4, 0);
0131
0132 val = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_2);
0133 if (FIELD_GET(MT_EE_NIC_CONF_2_XTAL_OPTION, val) == 1)
0134 mt76_set(dev, MT_MCU_COM_REG0, BIT(30));
0135
0136
0137 mt76_wr(dev, MT_MCU_INT_LEVEL, 2);
0138 if (!mt76_poll_msec(dev, MT_MCU_COM_REG0, 1, 1, 200)) {
0139 dev_err(dev->mt76.dev, "Firmware failed to start\n");
0140 release_firmware(fw);
0141 return -ETIMEDOUT;
0142 }
0143
0144 mt76x02_set_ethtool_fwver(dev, hdr);
0145 dev_info(dev->mt76.dev, "Firmware running!\n");
0146
0147 release_firmware(fw);
0148
0149 return ret;
0150
0151 error:
0152 dev_err(dev->mt76.dev, "Invalid firmware\n");
0153 release_firmware(fw);
0154 return -ENOENT;
0155 }
0156
0157 static int
0158 mt76pci_mcu_restart(struct mt76_dev *mdev)
0159 {
0160 struct mt76x02_dev *dev;
0161 int ret;
0162
0163 dev = container_of(mdev, struct mt76x02_dev, mt76);
0164
0165 mt76x02_mcu_cleanup(dev);
0166 mt76x2_mac_reset(dev, true);
0167
0168 ret = mt76pci_load_firmware(dev);
0169 if (ret)
0170 return ret;
0171
0172 mt76_wr(dev, MT_WPDMA_RST_IDX, ~0);
0173
0174 return 0;
0175 }
0176
0177 int mt76x2_mcu_init(struct mt76x02_dev *dev)
0178 {
0179 static const struct mt76_mcu_ops mt76x2_mcu_ops = {
0180 .mcu_restart = mt76pci_mcu_restart,
0181 .mcu_send_msg = mt76x02_mcu_msg_send,
0182 .mcu_parse_response = mt76x02_mcu_parse_response,
0183 };
0184 int ret;
0185
0186 dev->mt76.mcu_ops = &mt76x2_mcu_ops;
0187
0188 ret = mt76pci_load_rom_patch(dev);
0189 if (ret)
0190 return ret;
0191
0192 ret = mt76pci_load_firmware(dev);
0193 if (ret)
0194 return ret;
0195
0196 mt76x02_mcu_function_select(dev, Q_SELECT, 1);
0197 return 0;
0198 }