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

Reply via email to