diff options
Diffstat (limited to 'package/kernel/mac80211/patches/328-ath9k-parse-the-device-configuration-from-an-OF-node.patch')
-rw-r--r-- | package/kernel/mac80211/patches/328-ath9k-parse-the-device-configuration-from-an-OF-node.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/328-ath9k-parse-the-device-configuration-from-an-OF-node.patch b/package/kernel/mac80211/patches/328-ath9k-parse-the-device-configuration-from-an-OF-node.patch new file mode 100644 index 0000000000..b260858d45 --- /dev/null +++ b/package/kernel/mac80211/patches/328-ath9k-parse-the-device-configuration-from-an-OF-node.patch @@ -0,0 +1,85 @@ +From cea03be5a848823cb8052e2e7b93cb2249d5f60c Mon Sep 17 00:00:00 2001 +From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> +Date: Sun, 16 Oct 2016 22:59:07 +0200 +Subject: [PATCH 3/3] ath9k: parse the device configuration from an OF node + +This allows setting the MAC address and specifying that the firmware +will be requested from userspace (because there might not be a hardware +EEPROM connected to the chip) for ath9k based PCI devices using +the device tree. + +There is some out-of-tree code to "convert devicetree to +ath9k_platform_data" (for example in OpenWrt and LEDE) which becomes +obsolete with this patch. + +Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> +Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> +--- + drivers/net/wireless/ath/ath9k/init.c | 42 +++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -20,6 +20,8 @@ + #include <linux/slab.h> + #include <linux/ath9k_platform.h> + #include <linux/module.h> ++#include <linux/of.h> ++#include <linux/of_net.h> + #include <linux/relay.h> + #include <net/ieee80211_radiotap.h> + +@@ -554,6 +556,42 @@ static int ath9k_init_platform(struct at + return 0; + } + ++static int ath9k_of_init(struct ath_softc *sc) ++{ ++ struct device_node *np = sc->dev->of_node; ++ struct ath_hw *ah = sc->sc_ah; ++ struct ath_common *common = ath9k_hw_common(ah); ++ enum ath_bus_type bus_type = common->bus_ops->ath_bus_type; ++ const char *mac; ++ char eeprom_name[100]; ++ int ret; ++ ++ if (!of_device_is_available(np)) ++ return 0; ++ ++ ath_dbg(common, CONFIG, "parsing configuration from OF node\n"); ++ ++ if (of_property_read_bool(np, "qca,no-eeprom")) { ++ /* ath9k-eeprom-<bus>-<id>.bin */ ++ scnprintf(eeprom_name, sizeof(eeprom_name), ++ "ath9k-eeprom-%s-%s.bin", ++ ath_bus_type_to_string(bus_type), dev_name(ah->dev)); ++ ++ ret = ath9k_eeprom_request(sc, eeprom_name); ++ if (ret) ++ return ret; ++ } ++ ++ mac = of_get_mac_address(np); ++ if (mac) ++ ether_addr_copy(common->macaddr, mac); ++ ++ ah->ah_flags &= ~AH_USE_EEPROM; ++ ah->ah_flags |= AH_NO_EEP_SWAP; ++ ++ return 0; ++} ++ + static int ath9k_init_softc(u16 devid, struct ath_softc *sc, + const struct ath_bus_ops *bus_ops) + { +@@ -610,6 +648,10 @@ static int ath9k_init_softc(u16 devid, s + if (ret) + return ret; + ++ ret = ath9k_of_init(sc); ++ if (ret) ++ return ret; ++ + if (ath9k_led_active_high != -1) + ah->config.led_active_high = ath9k_led_active_high == 1; + |