diff options
-rw-r--r-- | hardware.txt | 1 | ||||
-rw-r--r-- | iwinfo_nl80211.c | 30 |
2 files changed, 31 insertions, 0 deletions
diff --git a/hardware.txt b/hardware.txt index 7255925..07a249b 100644 --- a/hardware.txt +++ b/hardware.txt @@ -160,6 +160,7 @@ 0x168c 0x003c 0x168c 0x3223 0 0 "Qualcomm Atheros" "QCA9880" 0x168c 0x003c 0x1a56 0x1420 0 0 "Qualcomm Atheros" "QCA9862" 0x168c 0x003c 0x19b6 0xd03c 0 0 "Mikrotik" "R11e-5HacT" +0x168c 0x003c 0x168c 0x4019 0 0 "Qualcomm Atheros" "IPQ4019" 0x168c 0x003c 0x19b6 0xd075 0 0 "Mikrotik" "R11e-5HacD" 0x168c 0x0040 0x168c 0x0002 0 0 "Qualcomm Atheros" "QCA9990" 0x168c 0x0046 0x168c 0xcafe 0 0 "Qualcomm Atheros" "QCA9984" diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c index 2b2a043..52632de 100644 --- a/iwinfo_nl80211.c +++ b/iwinfo_nl80211.c @@ -3109,6 +3109,31 @@ static int nl80211_get_mbssid_support(const char *ifname, int *buf) return 0; } +static int nl80211_hardware_id_from_fdt(struct iwinfo_hardware_id *id, const char *ifname) +{ + char *phy, compat[64], path[PATH_MAX]; + int i; + + /* Try to determine the phy name from the given interface */ + phy = nl80211_ifname2phy(ifname); + + snprintf(path, sizeof(path), "/sys/class/%s/%s/device/of_node/compatible", + phy ? "ieee80211" : "net", phy ? phy : ifname); + + if (nl80211_readstr(path, compat, sizeof(compat)) <= 0) + return -1; + + if (!strcmp(compat, "qcom,ipq4019-wifi")) { + id->vendor_id = 0x168c; + id->device_id = 0x003c; + id->subsystem_vendor_id = 0x168c; + id->subsystem_device_id = 0x4019; + } + + return (id->vendor_id && id->device_id) ? 0 : -1; +} + + static int nl80211_get_hardware_id(const char *ifname, char *buf) { struct iwinfo_hardware_id *id = (struct iwinfo_hardware_id *)buf; @@ -3137,6 +3162,11 @@ static int nl80211_get_hardware_id(const char *ifname, char *buf) *lookup[i].dest = strtoul(num, NULL, 16); } + /* Failed to obtain hardware IDs, try FDT */ + if (id->vendor_id == 0 || id->device_id == 0) + if (!nl80211_hardware_id_from_fdt(id, ifname)) + return 0; + /* Failed to obtain hardware IDs, search board config */ if (id->vendor_id == 0 || id->device_id == 0) return iwinfo_hardware_id_from_mtd(id); |