1847248fc1
These patches add support for configuring ath9k based devices via devicetree. This was tested on PCI(e) based devices. This should work for AHB based devices as well (adding more AHB specific properties may still be needed) as soon as the ath79 platform is ready to populate the ath9k wmac via devicetree. This patchset was accepted upstream, more information can be found on the linux-wireless list: https://www.spinics.net/lists/linux-wireless/msg155474.html Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
85 lines
2.4 KiB
Diff
85 lines
2.4 KiB
Diff
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;
|
|
|