diff --git a/Makefile b/Makefile index dc2238f5..e2c7d214 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ EXTRA_CFLAGS += -Werror obj-m := mt76.o mt76x2e.o mt7603e.o mt76-y := \ - mmio.o util.o trace.o dma.o mac80211.o debugfs.o + mmio.o util.o trace.o dma.o mac80211.o debugfs.o eeprom.o mt76x2e-y := \ mt76x2_pci.o mt76x2_dma.o \ @@ -11,8 +11,6 @@ mt76x2e-y := \ mt76x2_core.o mt76x2_mac.o mt76x2_eeprom.o mt76x2_mcu.o mt76x2_phy.o \ mt76x2_trace.o -mt76x2e-$(CONFIG_OF) += mt76x2_of.o - mt7603e-y := \ mt7603_pci.o mt7603_main.o mt7603_init.o mt7603_mcu.o \ mt7603_core.o mt7603_dma.o mt7603_mac.o diff --git a/debugfs.c b/debugfs.c index 67a48228..52274dcb 100644 --- a/debugfs.c +++ b/debugfs.c @@ -43,6 +43,7 @@ struct dentry *mt76_register_debugfs(struct mt76_dev *dev) debugfs_create_u32("regidx", S_IRUSR | S_IWUSR, dir, &dev->debugfs_reg); debugfs_create_file("regval", S_IRUSR | S_IWUSR, dir, dev, &fops_regval); + debugfs_create_blob("eeprom", S_IRUSR, dir, &dev->eeprom); return dir; } diff --git a/mt76x2_of.c b/eeprom.c similarity index 71% rename from mt76x2_of.c rename to eeprom.c index 60266ec7..00e0199c 100644 --- a/mt76x2_of.c +++ b/eeprom.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 Felix Fietkau + * Copyright (C) 2015 Felix Fietkau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -10,31 +10,16 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ - #include #include #include -#include "mt76x2.h" -#include "mt76x2_eeprom.h" -#include "mt76x2_of.h" +#include "mt76.h" -static int mt76x2_check_eeprom(struct mt76x2_dev *dev, const char *type) +static int +mt76_get_of_eeprom(struct mt76_dev *dev, int len) { - u16 val = get_unaligned_le16(dev->eeprom.data); - switch (val) { - case 0x7662: - case 0x7612: - return 0; - default: - printk("%s EEPROM data check failed: %04x\n", type, val); - return -EINVAL; - } -} - -int -mt76x2_get_of_eeprom(struct mt76x2_dev *dev, int len) -{ - struct device_node *np = dev->mt76.dev->of_node; +#ifdef CONFIG_OF + struct device_node *np = dev->dev->of_node; struct mtd_info *mtd; const __be32 *list; const char *part; @@ -79,13 +64,17 @@ mt76x2_get_of_eeprom(struct mt76x2_dev *dev, int len) if (retlen < len) return -EINVAL; - return mt76x2_check_eeprom(dev, "Flash"); + return 0; +#else + return -ENOENT; +#endif } +#ifdef CONFIG_OF void -mt76x2_get_of_overrides(struct mt76x2_dev *dev) +mt76_eeprom_override(struct mt76_dev *dev) { - struct device_node *np = dev->mt76.dev->of_node; + struct device_node *np = dev->dev->of_node; const __be32 *val; int size; @@ -100,3 +89,17 @@ mt76x2_get_of_overrides(struct mt76x2_dev *dev) if (val) dev->cap.has_5ghz = be32_to_cpup(val); } +EXPORT_SYMBOL_GPL(mt76_eeprom_override); +#endif + +int +mt76_eeprom_init(struct mt76_dev *dev, int len) +{ + dev->eeprom.size = len; + dev->eeprom.data = devm_kzalloc(dev->dev, len, GFP_KERNEL); + if (!dev->eeprom.data) + return -ENOMEM; + + return !mt76_get_of_eeprom(dev, len); +} +EXPORT_SYMBOL_GPL(mt76_eeprom_init); diff --git a/mac80211.c b/mac80211.c index 54d20708..8f41e8ea 100644 --- a/mac80211.c +++ b/mac80211.c @@ -183,7 +183,7 @@ static const struct ieee80211_iface_combination if_comb[] = { } }; -int mt76_register_device(struct mt76_dev *dev, int bands, bool vht, +int mt76_register_device(struct mt76_dev *dev, bool vht, struct ieee80211_rate *rates, int n_rates) { struct ieee80211_hw *hw = dev->hw; @@ -213,13 +213,13 @@ int mt76_register_device(struct mt76_dev *dev, int bands, bool vht, ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); - if (bands & BIT(IEEE80211_BAND_2GHZ)) { + if (dev->cap.has_2ghz) { ret = mt76_init_sband_2g(dev, rates, n_rates); if (ret) return ret; } - if (bands & BIT(IEEE80211_BAND_5GHZ)) { + if (dev->cap.has_5ghz) { ret = mt76_init_sband_5g(dev, rates + 4, n_rates - 4, vht); if (ret) return ret; diff --git a/mt76.h b/mt76.h index 44ebb004..980f09a2 100644 --- a/mt76.h +++ b/mt76.h @@ -92,6 +92,11 @@ enum { MT76_SCANNING, }; +struct mt76_hw_cap { + bool has_2ghz; + bool has_5ghz; +}; + struct mt76_dev { struct ieee80211_hw *hw; @@ -106,6 +111,8 @@ struct mt76_dev { struct ieee80211_supported_band sband_2g; struct ieee80211_supported_band sband_5g; + struct debugfs_blob_wrapper eeprom; + struct mt76_hw_cap cap; u32 debugfs_reg; }; @@ -159,9 +166,20 @@ static inline u16 mt76_rev(struct mt76_dev *dev) #define mt76_queue_cleanup(dev, ...) (dev)->mt76.queue_ops->cleanup(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) -int mt76_register_device(struct mt76_dev *dev, int bands, bool vht, +int mt76_register_device(struct mt76_dev *dev, bool vht, struct ieee80211_rate *rates, int n_rates); struct dentry *mt76_register_debugfs(struct mt76_dev *dev); + +#ifdef CONFIG_OF +void mt76_eeprom_override(struct mt76_dev *dev); +#else +static inline void mt76_eeprom_override(struct mt76_dev *dev) +{ +} +#endif + +int mt76_eeprom_init(struct mt76_dev *dev, int len); + #endif diff --git a/mt7603.h b/mt7603.h index 7bfb9eef..45e12a26 100644 --- a/mt7603.h +++ b/mt7603.h @@ -23,6 +23,8 @@ #define MT7603_FIRMWARE_E1 "mt7603_e1.bin" #define MT7603_FIRMWARE_E2 "mt7603_e2.bin" +#define MT7603_EEPROM_SIZE 1024 + enum { MT7603_REV_E1 = 0x00, MT7603_REV_E2 = 0x10 diff --git a/mt7603_init.c b/mt7603_init.c index aab8f067..5375f781 100644 --- a/mt7603_init.c +++ b/mt7603_init.c @@ -218,6 +218,12 @@ mt7603_init_hardware(struct mt7603_dev *dev) mt76_wr(dev, MT_INT_SOURCE_CSR, ~0); + ret = mt76_eeprom_init(&dev->mt76, MT7603_EEPROM_SIZE); + if (ret < 0) + return ret; + + dev->mt76.cap.has_2ghz = true; + ret = mt7603_dma_init(dev); if (ret) return ret; @@ -294,8 +300,8 @@ int mt7603_register_device(struct mt7603_dev *dev) SET_IEEE80211_PERM_ADDR(hw, macaddr); - ret = mt76_register_device(&dev->mt76, BIT(IEEE80211_BAND_2GHZ), true, - mt76x2_rates, ARRAY_SIZE(mt76x2_rates)); + ret = mt76_register_device(&dev->mt76, true, mt76x2_rates, + ARRAY_SIZE(mt76x2_rates)); if (ret) return ret; diff --git a/mt76x2.h b/mt76x2.h index 23fd2c4a..2cb7336b 100644 --- a/mt76x2.h +++ b/mt76x2.h @@ -93,11 +93,6 @@ struct mt76x2_wcid { u8 tx_rate_nss; }; -struct mt76x2_hw_cap { - bool has_2ghz; - bool has_5ghz; -}; - struct mt76x2_rate_power { union { struct { @@ -160,9 +155,7 @@ struct mt76x2_dev { u16 chainmask; struct mt76x2_calibration cal; - struct debugfs_blob_wrapper eeprom; struct debugfs_blob_wrapper otp; - struct mt76x2_hw_cap cap; s8 target_power; s8 target_power_delta[2]; diff --git a/mt76x2_debugfs.c b/mt76x2_debugfs.c index 9e4b85d1..64b8725b 100644 --- a/mt76x2_debugfs.c +++ b/mt76x2_debugfs.c @@ -89,7 +89,6 @@ void mt76x2_init_debugfs(struct mt76x2_dev *dev) if (!dir) return; - debugfs_create_blob("eeprom", S_IRUSR, dir, &dev->eeprom); debugfs_create_blob("otp", S_IRUSR, dir, &dev->otp); debugfs_create_u8("temperature", S_IRUSR, dir, &dev->cal.temp); diff --git a/mt76x2_eeprom.c b/mt76x2_eeprom.c index 935d2e99..5f8d191e 100644 --- a/mt76x2_eeprom.c +++ b/mt76x2_eeprom.c @@ -15,7 +15,6 @@ #include #include "mt76x2.h" #include "mt76x2_eeprom.h" -#include "mt76x2_of.h" #define EE_FIELD(_name, _value) [MT_EE_##_name] = (_value) | 1 @@ -23,17 +22,17 @@ static int mt76x2_eeprom_copy(struct mt76x2_dev *dev, enum mt76x2_eeprom_field field, void *dest, int len) { - if (field + len > dev->eeprom.size) + if (field + len > dev->mt76.eeprom.size) return -1; - memcpy(dest, dev->eeprom.data + field, len); + memcpy(dest, dev->mt76.eeprom.data + field, len); return 0; } static int mt76x2_eeprom_get_macaddr(struct mt76x2_dev *dev) { - void *src = dev->eeprom.data + MT_EE_MAC_ADDR; + void *src = dev->mt76.eeprom.data + MT_EE_MAC_ADDR; memcpy(dev->macaddr, src, ETH_ALEN); return 0; @@ -46,14 +45,14 @@ mt76x2_eeprom_parse_hw_cap(struct mt76x2_dev *dev) switch (MT76_GET(MT_EE_NIC_CONF_0_BOARD_TYPE, val)) { case BOARD_TYPE_5GHZ: - dev->cap.has_5ghz = true; + dev->mt76.cap.has_5ghz = true; break; case BOARD_TYPE_2GHZ: - dev->cap.has_2ghz = true; + dev->mt76.cap.has_2ghz = true; break; default: - dev->cap.has_2ghz = true; - dev->cap.has_5ghz = true; + dev->mt76.cap.has_2ghz = true; + dev->mt76.cap.has_5ghz = true; break; } } @@ -160,7 +159,7 @@ mt76x2_apply_cal_free_data(struct mt76x2_dev *dev, u8 *efuse) MT_EE_RF_5G_GRP4_5_RX_HIGH_GAIN, MT_EE_RF_5G_GRP4_5_RX_HIGH_GAIN + 1, }; - u8 *eeprom = dev->eeprom.data; + u8 *eeprom = dev->mt76.eeprom.data; u8 prev_grp0[4] = { eeprom[MT_EE_TX_POWER_0_START_5G], eeprom[MT_EE_TX_POWER_0_START_5G + 1], @@ -196,22 +195,39 @@ mt76x2_apply_cal_free_data(struct mt76x2_dev *dev, u8 *efuse) eeprom[MT_EE_BT_PMUCFG] = val & 0xff; } +static int mt76x2_check_eeprom(struct mt76x2_dev *dev) +{ + u16 val = get_unaligned_le16(dev->mt76.eeprom.data); + switch (val) { + case 0x7662: + case 0x7612: + return 0; + default: + printk("EEPROM data check failed: %04x\n", val); + return -EINVAL; + } +} + static int mt76x2_eeprom_load(struct mt76x2_dev *dev) { void *efuse; int len = MT7662_EEPROM_SIZE; bool found; + int ret; - dev->eeprom.size = len; - dev->eeprom.data = devm_kzalloc(dev->mt76.dev, len * 2, GFP_KERNEL); - if (!dev->eeprom.data) - return -ENOMEM; + ret = mt76_eeprom_init(&dev->mt76, len); + if (ret < 0) + return ret; + found = ret; + if (found) + found = !mt76x2_check_eeprom(dev); + + dev->otp.data = devm_kzalloc(dev->mt76.dev, len, GFP_KERNEL); dev->otp.size = len; - dev->otp.data = dev->eeprom.data + len; - - found = !mt76x2_get_of_eeprom(dev, len); + if (!dev->otp.data) + return -ENOMEM; efuse = dev->otp.data; @@ -223,7 +239,7 @@ mt76x2_eeprom_load(struct mt76x2_dev *dev) } else { /* FIXME: check if efuse data is complete */ found = true; - memcpy(dev->eeprom.data, efuse, len); + memcpy(dev->mt76.eeprom.data, efuse, len); } out: @@ -601,7 +617,7 @@ int mt76x2_eeprom_init(struct mt76x2_dev *dev) return ret; mt76x2_eeprom_parse_hw_cap(dev); - mt76x2_get_of_overrides(dev); + mt76_eeprom_override(&dev->mt76); mt76x2_eeprom_get_macaddr(dev); if (!is_valid_ether_addr(dev->macaddr)) { diff --git a/mt76x2_eeprom.h b/mt76x2_eeprom.h index e538f5cc..2ee06592 100644 --- a/mt76x2_eeprom.h +++ b/mt76x2_eeprom.h @@ -140,7 +140,7 @@ mt76x2_eeprom_get(struct mt76x2_dev *dev, enum mt76x2_eeprom_field field) if ((field & 1) || field >= __MT_EE_MAX) return -1; - return get_unaligned_le16(dev->eeprom.data + field); + return get_unaligned_le16(dev->mt76.eeprom.data + field); } void mt76x2_get_rate_power(struct mt76x2_dev *dev, struct mt76x2_rate_power *t); diff --git a/mt76x2_init.c b/mt76x2_init.c index a9098ac1..2d19c6a7 100644 --- a/mt76x2_init.c +++ b/mt76x2_init.c @@ -613,7 +613,6 @@ int mt76x2_register_device(struct mt76x2_dev *dev) void *status_fifo; int fifo_size; int i, ret; - int bands; fifo_size = roundup_pow_of_two(32 * sizeof(struct mt76x2_tx_status)); status_fifo = devm_kzalloc(dev->mt76.dev, fifo_size, GFP_KERNEL); @@ -656,15 +655,12 @@ int mt76x2_register_device(struct mt76x2_dev *dev) INIT_DELAYED_WORK(&dev->cal_work, mt76x2_phy_calibrate); INIT_DELAYED_WORK(&dev->mac_work, mt76x2_mac_work); - bands = (!!dev->cap.has_2ghz * BIT(IEEE80211_BAND_2GHZ)) | - (!!dev->cap.has_5ghz * BIT(IEEE80211_BAND_5GHZ)); - - ret = mt76_register_device(&dev->mt76, bands, true, - mt76x2_rates, ARRAY_SIZE(mt76x2_rates)); + ret = mt76_register_device(&dev->mt76, true, mt76x2_rates, + ARRAY_SIZE(mt76x2_rates)); if (ret) goto fail; - sband = wiphy->bands[dev->cap.has_5ghz ? IEEE80211_BAND_5GHZ : + sband = wiphy->bands[dev->mt76.cap.has_5ghz ? IEEE80211_BAND_5GHZ : IEEE80211_BAND_2GHZ]; dev->chandef.chan = &sband->channels[0]; diff --git a/mt76x2_of.h b/mt76x2_of.h deleted file mode 100644 index 931df2a1..00000000 --- a/mt76x2_of.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2014 Felix Fietkau - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MT76x2_OF_H -#define __MT76x2_OF_H - -#include "mt76x2.h" - -#ifdef CONFIG_OF - -int mt76x2_get_of_eeprom(struct mt76x2_dev *dev, int len); -void mt76x2_get_of_overrides(struct mt76x2_dev *dev); - -#else - -static inline int -mt76x2_get_of_eeprom(struct mt76x2_dev *dev, int len) -{ - return -ENOENT; -} - -static inline void -mt76x2_get_of_overrides(struct mt76x2_dev *dev) -{ -} - -#endif /* CONFIG_OF */ - -#endif