diff options
Diffstat (limited to 'iwinfo_nl80211.c')
-rw-r--r-- | iwinfo_nl80211.c | 30 |
1 files changed, 30 insertions, 0 deletions
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); |