Detect SoC wireless mac such as AR9340 using the devices modalias string. Beside PCI IDs the hardware.txt can now contain modalias strings as device identification.
Signed-off-by: Stefan Agner <ste...@agner.ch> --- package/network/utils/iwinfo/src/hardware.txt | 1 + package/network/utils/iwinfo/src/include/iwinfo.h | 1 + .../utils/iwinfo/src/include/iwinfo/utils.h | 3 +- .../network/utils/iwinfo/src/include/iwinfo/wext.h | 1 + package/network/utils/iwinfo/src/iwinfo_nl80211.c | 9 +++-- package/network/utils/iwinfo/src/iwinfo_utils.c | 39 +++++++++++++++++++++- package/network/utils/iwinfo/src/iwinfo_wext.c | 9 +++++ 7 files changed, 58 insertions(+), 5 deletions(-) diff --git a/package/network/utils/iwinfo/src/hardware.txt b/package/network/utils/iwinfo/src/hardware.txt index 153ffeb..85b2986 100644 --- a/package/network/utils/iwinfo/src/hardware.txt +++ b/package/network/utils/iwinfo/src/hardware.txt @@ -51,6 +51,7 @@ 0x168c 0x0029 0x168c 0xa095 0 0 "Atheros" "AR9223" 0x168c 0x002a 0x168c 0xa093 0 0 "Atheros" "AR9280" 0x168c 0x002b 0x168c 0xa091 0 0 "Atheros" "AR9285" +"platform:ar934x_wmac" 0 0 "Atheros" "AR9340" 0x168c 0x0033 0x168c 0xa120 0 0 "Atheros" "AR9580" 0x1814 0x3050 0x1814 0x0005 0 0 "RaLink" "Rt3050" 0x1814 0x3052 0x1814 0x0008 0 0 "RaLink" "Rt3052" diff --git a/package/network/utils/iwinfo/src/include/iwinfo.h b/package/network/utils/iwinfo/src/include/iwinfo.h index ebea319..0729915 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo.h +++ b/package/network/utils/iwinfo/src/include/iwinfo.h @@ -138,6 +138,7 @@ struct iwinfo_hardware_entry { uint16_t device_id; uint16_t subsystem_vendor_id; uint16_t subsystem_device_id; + char modstring[64]; int16_t txpower_offset; int16_t frequency_offset; }; diff --git a/package/network/utils/iwinfo/src/include/iwinfo/utils.h b/package/network/utils/iwinfo/src/include/iwinfo/utils.h index d58ec5f..0328ccf 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo/utils.h +++ b/package/network/utils/iwinfo/src/include/iwinfo/utils.h @@ -37,7 +37,8 @@ int iwinfo_ifmac(const char *ifname); void iwinfo_close(void); -struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id); +struct iwinfo_hardware_entry * iwinfo_hardware_modstring(char *modstring); +struct iwinfo_hardware_entry * iwinfo_hardware_pci(struct iwinfo_hardware_id *id); int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id); diff --git a/package/network/utils/iwinfo/src/include/iwinfo/wext.h b/package/network/utils/iwinfo/src/include/iwinfo/wext.h index e84f6a6..aefc72b 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo/wext.h +++ b/package/network/utils/iwinfo/src/include/iwinfo/wext.h @@ -51,6 +51,7 @@ int wext_get_countrylist(const char *ifname, char *buf, int *len); int wext_get_hwmodelist(const char *ifname, int *buf); int wext_get_mbssid_support(const char *ifname, int *buf); int wext_get_hardware_id(const char *ifname, char *buf); +int wext_get_hardware_modstring(const char *ifname, char *buf); int wext_get_hardware_name(const char *ifname, char *buf); void wext_close(void); diff --git a/package/network/utils/iwinfo/src/iwinfo_nl80211.c b/package/network/utils/iwinfo/src/iwinfo_nl80211.c index a258d2f..9d23d36 100644 --- a/package/network/utils/iwinfo/src/iwinfo_nl80211.c +++ b/package/network/utils/iwinfo/src/iwinfo_nl80211.c @@ -2317,11 +2317,14 @@ static const struct iwinfo_hardware_entry * nl80211_get_hardware_entry(const char *ifname) { struct iwinfo_hardware_id id; + static char modstring[64]; - if (nl80211_get_hardware_id(ifname, (char *)&id)) - return NULL; + if (!nl80211_get_hardware_id(ifname, (char *)&id)) + return iwinfo_hardware_pci(&id); - return iwinfo_hardware(&id); + /* Get hardware from modstring (SoC) */ + if (!wext_get_hardware_modstring(ifname, modstring)) + return iwinfo_hardware_modstring(modstring); } int nl80211_get_hardware_name(const char *ifname, char *buf) diff --git a/package/network/utils/iwinfo/src/iwinfo_utils.c b/package/network/utils/iwinfo/src/iwinfo_utils.c index 1a831f3..09194c9 100644 --- a/package/network/utils/iwinfo/src/iwinfo_utils.c +++ b/package/network/utils/iwinfo/src/iwinfo_utils.c @@ -127,7 +127,7 @@ void iwinfo_close(void) ioctl_socket = -1; } -struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id) +struct iwinfo_hardware_entry * iwinfo_hardware_modstring(char *modstring) { FILE *db; char buf[256] = { 0 }; @@ -140,6 +140,43 @@ struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id) { memset(&e, 0, sizeof(e)); + if (!strcmp(buf, "\"platform:")) + continue; + + if (sscanf(buf, "\"%63[^\"]\" %hd %hd \"%63[^\"]\" \"%63[^\"]\"", + e.modstring, &e.txpower_offset, + &e.frequency_offset, e.vendor_name, + e.device_name) < 5) + continue; + + if (!strcmp(e.modstring, modstring)) + continue; + + rv = &e; + break; + } + + fclose(db); + return rv; +} + +struct iwinfo_hardware_entry * iwinfo_hardware_pci(struct iwinfo_hardware_id *id) +{ + FILE *db; + char buf[256] = { 0 }; + static struct iwinfo_hardware_entry e, *rv = NULL; + + if (!(db = fopen(IWINFO_HARDWARE_FILE, "r"))) + return NULL; + + while (fgets(buf, sizeof(buf) - 1, db) != NULL) + { + memset(&e, 0, sizeof(e)); + + /* Parse PCI device IDs only */ + if (buf[0] != '0' || buf[1] != 'x') + continue; + if (sscanf(buf, "%hx %hx %hx %hx %hd %hd \"%63[^\"]\" \"%63[^\"]\"", &e.vendor_id, &e.device_id, &e.subsystem_vendor_id, &e.subsystem_device_id, diff --git a/package/network/utils/iwinfo/src/iwinfo_wext.c b/package/network/utils/iwinfo/src/iwinfo_wext.c index 890a36d..22ac993 100644 --- a/package/network/utils/iwinfo/src/iwinfo_wext.c +++ b/package/network/utils/iwinfo/src/iwinfo_wext.c @@ -506,6 +506,15 @@ int wext_get_hardware_id(const char *ifname, char *buf) return (id->vendor_id > 0 && id->device_id > 0) ? 0 : -1; } +int wext_get_hardware_modstring(const char *ifname, char *buf) +{ + char *data = wext_sysfs_ifname_file(ifname, "device/modalias"); + if (data) + strcpy(buf, data); + + return data ? 0 : -1; +} + int wext_get_hardware_name(const char *ifname, char *buf) { sprintf(buf, "Generic WEXT"); -- 1.8.4.2 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel