summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c
diff options
context:
space:
mode:
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>2018-10-01 11:18:42 +0300
committerFelix Fietkau <nbd@nbd.name>2018-10-05 21:05:44 +0300
commit1613c621e19416754beda19879d574cd149bf91e (patch)
tree58026863ad4402d86630f197f4dcba080112a994 /drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c
parentd00efcf123871337c30b71d0cd2aaea6fa065cb8 (diff)
downloadlinux-1613c621e19416754beda19879d574cd149bf91e.tar.xz
mt76x2: move mt76x2 source files to mt76x2 folder
Move mt76x2 and mt76x2u drivers to mt76x2 subfolder and leave just shared code in mt76 root folder Acked-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c')
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c292
1 files changed, 0 insertions, 292 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c
deleted file mode 100644
index fdd94cad7b66..000000000000
--- a/drivers/net/wireless/mediatek/mt76/mt76x2u_mcu.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (C) 2018 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <linux/firmware.h>
-
-#include "mt76x2u.h"
-#include "mt76x2_eeprom.h"
-#include "mt76x02_usb.h"
-
-#define MT_CMD_HDR_LEN 4
-
-#define MCU_FW_URB_MAX_PAYLOAD 0x3900
-#define MCU_ROM_PATCH_MAX_PAYLOAD 2048
-
-#define MT76U_MCU_ILM_OFFSET 0x80000
-#define MT76U_MCU_DLM_OFFSET 0x110000
-#define MT76U_MCU_ROM_PATCH_OFFSET 0x90000
-
-int mt76x2u_mcu_set_dynamic_vga(struct mt76x2_dev *dev, u8 channel, bool ap,
- bool ext, int rssi, u32 false_cca)
-{
- struct {
- __le32 channel;
- __le32 rssi_val;
- __le32 false_cca_val;
- } __packed __aligned(4) msg = {
- .rssi_val = cpu_to_le32(rssi),
- .false_cca_val = cpu_to_le32(false_cca),
- };
- struct sk_buff *skb;
- u32 val = channel;
-
- if (ap)
- val |= BIT(31);
- if (ext)
- val |= BIT(30);
- msg.channel = cpu_to_le32(val);
-
- skb = mt76_mcu_msg_alloc(dev, &msg, sizeof(msg));
- return mt76_mcu_send_msg(dev, skb, CMD_DYNC_VGA_OP, true);
-}
-
-static void mt76x2u_mcu_load_ivb(struct mt76x2_dev *dev)
-{
- mt76u_vendor_request(&dev->mt76, MT_VEND_DEV_MODE,
- USB_DIR_OUT | USB_TYPE_VENDOR,
- 0x12, 0, NULL, 0);
-}
-
-static void mt76x2u_mcu_enable_patch(struct mt76x2_dev *dev)
-{
- struct mt76_usb *usb = &dev->mt76.usb;
- const u8 data[] = {
- 0x6f, 0xfc, 0x08, 0x01,
- 0x20, 0x04, 0x00, 0x00,
- 0x00, 0x09, 0x00,
- };
-
- memcpy(usb->data, data, sizeof(data));
- mt76u_vendor_request(&dev->mt76, MT_VEND_DEV_MODE,
- USB_DIR_OUT | USB_TYPE_CLASS,
- 0x12, 0, usb->data, sizeof(data));
-}
-
-static void mt76x2u_mcu_reset_wmt(struct mt76x2_dev *dev)
-{
- struct mt76_usb *usb = &dev->mt76.usb;
- u8 data[] = {
- 0x6f, 0xfc, 0x05, 0x01,
- 0x07, 0x01, 0x00, 0x04
- };
-
- memcpy(usb->data, data, sizeof(data));
- mt76u_vendor_request(&dev->mt76, MT_VEND_DEV_MODE,
- USB_DIR_OUT | USB_TYPE_CLASS,
- 0x12, 0, usb->data, sizeof(data));
-}
-
-static int mt76x2u_mcu_load_rom_patch(struct mt76x2_dev *dev)
-{
- bool rom_protect = !is_mt7612(dev);
- struct mt76x02_patch_header *hdr;
- u32 val, patch_mask, patch_reg;
- const struct firmware *fw;
- int err;
-
- if (rom_protect &&
- !mt76_poll_msec(dev, MT_MCU_SEMAPHORE_03, 1, 1, 600)) {
- dev_err(dev->mt76.dev,
- "could not get hardware semaphore for ROM PATCH\n");
- return -ETIMEDOUT;
- }
-
- if (mt76xx_rev(dev) >= MT76XX_REV_E3) {
- patch_mask = BIT(0);
- patch_reg = MT_MCU_CLOCK_CTL;
- } else {
- patch_mask = BIT(1);
- patch_reg = MT_MCU_COM_REG0;
- }
-
- if (rom_protect && (mt76_rr(dev, patch_reg) & patch_mask)) {
- dev_info(dev->mt76.dev, "ROM patch already applied\n");
- return 0;
- }
-
- err = request_firmware(&fw, MT7662U_ROM_PATCH, dev->mt76.dev);
- if (err < 0)
- return err;
-
- if (!fw || !fw->data || fw->size <= sizeof(*hdr)) {
- dev_err(dev->mt76.dev, "failed to load firmware\n");
- err = -EIO;
- goto out;
- }
-
- hdr = (struct mt76x02_patch_header *)fw->data;
- dev_info(dev->mt76.dev, "ROM patch build: %.15s\n", hdr->build_time);
-
- /* enable USB_DMA_CFG */
- val = MT_USB_DMA_CFG_RX_BULK_EN |
- MT_USB_DMA_CFG_TX_BULK_EN |
- FIELD_PREP(MT_USB_DMA_CFG_RX_BULK_AGG_TOUT, 0x20);
- mt76_wr(dev, MT_VEND_ADDR(CFG, MT_USB_U3DMA_CFG), val);
-
- /* vendor reset */
- mt76x02u_mcu_fw_reset(&dev->mt76);
- usleep_range(5000, 10000);
-
- /* enable FCE to send in-band cmd */
- mt76_wr(dev, MT_FCE_PSE_CTRL, 0x1);
- /* FCE tx_fs_base_ptr */
- mt76_wr(dev, MT_TX_CPU_FROM_FCE_BASE_PTR, 0x400230);
- /* FCE tx_fs_max_cnt */
- mt76_wr(dev, MT_TX_CPU_FROM_FCE_MAX_COUNT, 0x1);
- /* FCE pdma enable */
- mt76_wr(dev, MT_FCE_PDMA_GLOBAL_CONF, 0x44);
- /* FCE skip_fs_en */
- mt76_wr(dev, MT_FCE_SKIP_FS, 0x3);
-
- err = mt76x02u_mcu_fw_send_data(&dev->mt76, fw->data + sizeof(*hdr),
- fw->size - sizeof(*hdr),
- MCU_ROM_PATCH_MAX_PAYLOAD,
- MT76U_MCU_ROM_PATCH_OFFSET);
- if (err < 0) {
- err = -EIO;
- goto out;
- }
-
- mt76x2u_mcu_enable_patch(dev);
- mt76x2u_mcu_reset_wmt(dev);
- mdelay(20);
-
- if (!mt76_poll_msec(dev, patch_reg, patch_mask, patch_mask, 100)) {
- dev_err(dev->mt76.dev, "failed to load ROM patch\n");
- err = -ETIMEDOUT;
- }
-
-out:
- if (rom_protect)
- mt76_wr(dev, MT_MCU_SEMAPHORE_03, 1);
- release_firmware(fw);
- return err;
-}
-
-static int mt76x2u_mcu_load_firmware(struct mt76x2_dev *dev)
-{
- u32 val, dlm_offset = MT76U_MCU_DLM_OFFSET;
- const struct mt76x02_fw_header *hdr;
- int err, len, ilm_len, dlm_len;
- const struct firmware *fw;
-
- err = request_firmware(&fw, MT7662U_FIRMWARE, dev->mt76.dev);
- if (err < 0)
- return err;
-
- if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
- err = -EINVAL;
- goto out;
- }
-
- hdr = (const struct mt76x02_fw_header *)fw->data;
- ilm_len = le32_to_cpu(hdr->ilm_len);
- dlm_len = le32_to_cpu(hdr->dlm_len);
- len = sizeof(*hdr) + ilm_len + dlm_len;
- if (fw->size != len) {
- err = -EINVAL;
- goto out;
- }
-
- val = le16_to_cpu(hdr->fw_ver);
- dev_info(dev->mt76.dev, "Firmware Version: %d.%d.%02d\n",
- (val >> 12) & 0xf, (val >> 8) & 0xf, val & 0xf);
-
- val = le16_to_cpu(hdr->build_ver);
- dev_info(dev->mt76.dev, "Build: %x\n", val);
- dev_info(dev->mt76.dev, "Build Time: %.16s\n", hdr->build_time);
-
- /* vendor reset */
- mt76x02u_mcu_fw_reset(&dev->mt76);
- usleep_range(5000, 10000);
-
- /* enable USB_DMA_CFG */
- val = MT_USB_DMA_CFG_RX_BULK_EN |
- MT_USB_DMA_CFG_TX_BULK_EN |
- FIELD_PREP(MT_USB_DMA_CFG_RX_BULK_AGG_TOUT, 0x20);
- mt76_wr(dev, MT_VEND_ADDR(CFG, MT_USB_U3DMA_CFG), val);
- /* enable FCE to send in-band cmd */
- mt76_wr(dev, MT_FCE_PSE_CTRL, 0x1);
- /* FCE tx_fs_base_ptr */
- mt76_wr(dev, MT_TX_CPU_FROM_FCE_BASE_PTR, 0x400230);
- /* FCE tx_fs_max_cnt */
- mt76_wr(dev, MT_TX_CPU_FROM_FCE_MAX_COUNT, 0x1);
- /* FCE pdma enable */
- mt76_wr(dev, MT_FCE_PDMA_GLOBAL_CONF, 0x44);
- /* FCE skip_fs_en */
- mt76_wr(dev, MT_FCE_SKIP_FS, 0x3);
-
- /* load ILM */
- err = mt76x02u_mcu_fw_send_data(&dev->mt76, fw->data + sizeof(*hdr),
- ilm_len, MCU_FW_URB_MAX_PAYLOAD,
- MT76U_MCU_ILM_OFFSET);
- if (err < 0) {
- err = -EIO;
- goto out;
- }
-
- /* load DLM */
- if (mt76xx_rev(dev) >= MT76XX_REV_E3)
- dlm_offset += 0x800;
- err = mt76x02u_mcu_fw_send_data(&dev->mt76,
- fw->data + sizeof(*hdr) + ilm_len,
- dlm_len, MCU_FW_URB_MAX_PAYLOAD,
- dlm_offset);
- if (err < 0) {
- err = -EIO;
- goto out;
- }
-
- mt76x2u_mcu_load_ivb(dev);
- if (!mt76_poll_msec(dev, MT_MCU_COM_REG0, 1, 1, 100)) {
- dev_err(dev->mt76.dev, "firmware failed to start\n");
- err = -ETIMEDOUT;
- goto out;
- }
-
- mt76_set(dev, MT_MCU_COM_REG0, BIT(1));
- /* enable FCE to send in-band cmd */
- mt76_wr(dev, MT_FCE_PSE_CTRL, 0x1);
- dev_dbg(dev->mt76.dev, "firmware running\n");
- mt76x02_set_ethtool_fwver(&dev->mt76, hdr);
-
-out:
- release_firmware(fw);
- return err;
-}
-
-int mt76x2u_mcu_fw_init(struct mt76x2_dev *dev)
-{
- int err;
-
- err = mt76x2u_mcu_load_rom_patch(dev);
- if (err < 0)
- return err;
-
- return mt76x2u_mcu_load_firmware(dev);
-}
-
-int mt76x2u_mcu_init(struct mt76x2_dev *dev)
-{
- int err;
-
- err = mt76x02_mcu_function_select(&dev->mt76, Q_SELECT,
- 1, false);
- if (err < 0)
- return err;
-
- return mt76x02_mcu_set_radio_state(&dev->mt76, true, false);
-}