From a515727e842304b023344d3a4325cd425d5c3d47 Mon Sep 17 00:00:00 2001 From: Shayne Chen Date: Mon, 14 Dec 2020 10:38:55 +0800 Subject: [PATCH] mt76: mt7915: add support for flash mode Add support for getting rf values from flash. This is used for some test purposes and products. If the mtd partition is configured in dts, driver will read from flash to init eeprom command; if not, still init it with efuse's values. An example: &slot0 { mt7915@0,0 { reg = <0x0000 0 0 0 0>; device_type = "pci"; mediatek,mtd-eeprom = <&factory 0x0000>; }; }; Acked-by: Ryder Lee Signed-off-by: Shayne Chen Signed-off-by: Felix Fietkau --- mt7915/eeprom.c | 5 ++++- mt7915/mcu.c | 50 ++++++++++++++++++++++++++++++++++++++++++++----- mt7915/mcu.h | 6 ++++++ mt7915/mt7915.h | 1 + 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c index aec70d52..1186cbc4 100644 --- a/mt7915/eeprom.c +++ b/mt7915/eeprom.c @@ -22,7 +22,10 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev) if (ret < 0) return ret; - memset(dev->mt76.eeprom.data, -1, MT7915_EEPROM_SIZE); + if (ret) + dev->flash_mode = true; + else + memset(dev->mt76.eeprom.data, -1, MT7915_EEPROM_SIZE); return 0; } diff --git a/mt7915/mcu.c b/mt7915/mcu.c index b4199d72..8b6857f0 100644 --- a/mt7915/mcu.c +++ b/mt7915/mcu.c @@ -3207,17 +3207,57 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true); } +static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev) +{ +#define TOTAL_PAGE_MASK GENMASK(7, 5) +#define PAGE_IDX_MASK GENMASK(4, 2) +#define PER_PAGE_SIZE 0x400 + struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER }; + u8 total = MT7915_EEPROM_SIZE / PER_PAGE_SIZE; + u8 *eep = (u8 *)dev->mt76.eeprom.data; + int eep_len; + int i; + + for (i = 0; i <= total; i++, eep += eep_len) { + struct sk_buff *skb; + int ret; + + if (i == total) + eep_len = MT7915_EEPROM_SIZE % PER_PAGE_SIZE; + else + eep_len = PER_PAGE_SIZE; + + skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, + sizeof(req) + eep_len); + if (!skb) + return -ENOMEM; + + req.format = FIELD_PREP(TOTAL_PAGE_MASK, total) | + FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE; + req.len = cpu_to_le16(eep_len); + + skb_put_data(skb, &req, sizeof(req)); + skb_put_data(skb, eep, eep_len); + + ret = mt76_mcu_skb_send_msg(&dev->mt76, skb, + MCU_EXT_CMD_EFUSE_BUFFER_MODE, true); + if (ret) + return ret; + } + + return 0; +} + int mt7915_mcu_set_eeprom(struct mt7915_dev *dev) { - struct req_hdr { - u8 buffer_mode; - u8 format; - __le16 len; - } __packed req = { + struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_EFUSE, .format = EE_FORMAT_WHOLE, }; + if (dev->flash_mode) + return mt7915_mcu_set_eeprom_flash(dev); + return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EFUSE_BUFFER_MODE, &req, sizeof(req), true); } diff --git a/mt7915/mcu.h b/mt7915/mcu.h index cd1a4256..30ec2ef4 100644 --- a/mt7915/mcu.h +++ b/mt7915/mcu.h @@ -118,6 +118,12 @@ struct mt7915_mcu_rdd_report { } hw_pulse[32]; } __packed; +struct mt7915_mcu_eeprom { + u8 buffer_mode; + u8 format; + __le16 len; +} __packed; + struct mt7915_mcu_eeprom_info { __le32 addr; __le32 valid; diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h index 6a6a82c8..519e27fe 100644 --- a/mt7915/mt7915.h +++ b/mt7915/mt7915.h @@ -169,6 +169,7 @@ struct mt7915_dev { struct idr token; bool dbdc_support; + bool flash_mode; bool fw_debug; #ifdef CONFIG_NL80211_TESTMODE