Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ansuel/8845e6faa9c51073269187817c48cf6e to your computer and use it in GitHub Desktop.
Save Ansuel/8845e6faa9c51073269187817c48cf6e to your computer and use it in GitHub Desktop.
From d818f80f3ced5cba7612c987e8443d54ada9c74d Mon Sep 17 00:00:00 2001
From: Jo-Philipp Wich <jo@mein.io>
Date: Mon, 9 Jan 2023 18:00:34 +0100
Subject: [iwinfo PATCH] devices: add support for declaring compatible matched
devices
Some device have embedded wifi card that are not connected with usb or
internall with pci. Such device have fake device_id and only the
vendor_id actually reflect something real but internally they don't have
any id and are just matched by the node compatible binding in DT.
We currently match this with a big if-else to match the single devices
but this can be improved and be matched directly in devices.txt
Rework this so that we can drop the big if-else and move the matching
from devices.txt
When a device is matched using compatible in iwinfo the hardware will be
flagged as embedded and won't print empty ids.
Tested-by: Christian Marangi <ansuelsmth@gmail.com>
Co-developed-by: Christian Marangi <ansuelsmth@gmail.com>
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
devices.txt | 13 +++++++++
include/iwinfo.h | 2 ++
iwinfo_cli.c | 9 ++++--
iwinfo_nl80211.c | 71 ++++++------------------------------------------
iwinfo_utils.c | 8 +++++-
5 files changed, 36 insertions(+), 67 deletions(-)
diff --git a/devices.txt b/devices.txt
index d76bbca..93938b5 100644
--- a/devices.txt
+++ b/devices.txt
@@ -206,3 +206,16 @@
# USB devices
# 0x0000 | 0x0000 | vendor id | product id | ...
0x0000 0x0000 0x0e8d 0x7961 0 0 "MediaTek" "MT7921AU"
+
+# FDT compatible strings
+# "compatible" | txpower offset | frequency offset | ...
+"qca,ar9130-wmac" 0 0 "Atheros" "AR9130"
+"qca,ar9330-wmac" 0 0 "Atheros" "AR9330"
+"qca,ar9340-wmac" 0 0 "Atheros" "AR9340"
+"qca,qca9530-wmac" 0 0 "Qualcomm Atheros" "QCA9530"
+"qca,qca9550-wmac" 0 0 "Qualcomm Atheros" "QCA9550"
+"qca,qca9560-wmac" 0 0 "Qualcomm Atheros" "QCA9560"
+"qcom,ipq4019-wifi" 0 0 "Qualcomm Atheros" "IPQ4019"
+"qcom,ipq8074-wifi" 0 0 "Qualcomm Atheros" "IPQ8074"
+"mediatek,mt7622-wmac" 0 0 "MediaTek" "MT7622"
+"mediatek,mt7986-wmac" 0 0 "MediaTek" "MT7986"
diff --git a/include/iwinfo.h b/include/iwinfo.h
index e87ad18..4b63f1e 100644
--- a/include/iwinfo.h
+++ b/include/iwinfo.h
@@ -243,6 +243,7 @@ struct iwinfo_hardware_id {
uint16_t device_id;
uint16_t subsystem_vendor_id;
uint16_t subsystem_device_id;
+ char compatible[128];
};
struct iwinfo_hardware_entry {
@@ -254,6 +255,7 @@ struct iwinfo_hardware_entry {
uint16_t subsystem_device_id;
int16_t txpower_offset;
int16_t frequency_offset;
+ char compatible[128];
};
extern const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[];
diff --git a/iwinfo_cli.c b/iwinfo_cli.c
index d70f7fb..9b3e8e3 100644
--- a/iwinfo_cli.c
+++ b/iwinfo_cli.c
@@ -335,9 +335,12 @@ static char * print_hardware_id(const struct iwinfo_ops *iw, const char *ifname)
if (!iw->hardware_id(ifname, (char *)&ids))
{
- snprintf(buf, sizeof(buf), "%04X:%04X %04X:%04X",
- ids.vendor_id, ids.device_id,
- ids.subsystem_vendor_id, ids.subsystem_device_id);
+ if (strlen(ids.compatible) > 0)
+ snprintf(buf, sizeof(buf), "embedded");
+ else
+ snprintf(buf, sizeof(buf), "%04X:%04X %04X:%04X",
+ ids.vendor_id, ids.device_id,
+ ids.subsystem_vendor_id, ids.subsystem_device_id);
}
else
{
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
index 916192f..a9e2adf 100644
--- a/iwinfo_nl80211.c
+++ b/iwinfo_nl80211.c
@@ -3445,7 +3445,7 @@ static int nl80211_get_mbssid_support(const char *ifname, int *buf)
static int nl80211_hardware_id_from_fdt(struct iwinfo_hardware_id *id, const char *ifname)
{
- char *phy, compat[64], path[PATH_MAX];
+ char *phy, path[PATH_MAX];
/* Try to determine the phy name from the given interface */
phy = nl80211_ifname2phy(ifname);
@@ -3453,62 +3453,10 @@ static int nl80211_hardware_id_from_fdt(struct iwinfo_hardware_id *id, const cha
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)
+ if (nl80211_readstr(path, id->compatible, sizeof(id->compatible)) <= 0)
return -1;
- if (!strcmp(compat, "qca,ar9130-wmac")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x0029;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x9130;
- } else if (!strcmp(compat, "qca,ar9330-wmac")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x0030;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x9330;
- } else if (!strcmp(compat, "qca,ar9340-wmac")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x0030;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x9340;
- } else if (!strcmp(compat, "qca,qca9530-wmac")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x0033;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x9530;
- } else if (!strcmp(compat, "qca,qca9550-wmac")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x0033;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x9550;
- } else if (!strcmp(compat, "qca,qca9560-wmac")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x0033;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x9560;
- } else if (!strcmp(compat, "qcom,ipq4019-wifi")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x003c;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x4019;
- } else if (!strcmp(compat, "qcom,ipq8074-wifi")) {
- id->vendor_id = 0x168c;
- id->device_id = 0x8074;
- id->subsystem_vendor_id = 0x168c;
- id->subsystem_device_id = 0x8074;
- } else if (!strcmp(compat, "mediatek,mt7622-wmac")) {
- id->vendor_id = 0x14c3;
- id->device_id = 0x7622;
- id->subsystem_vendor_id = 0x14c3;
- id->subsystem_device_id = 0x7622;
- } else if (!strcmp(compat, "mediatek,mt7986-wmac")) {
- id->vendor_id = 0x14c3;
- id->device_id = 0x7986;
- id->subsystem_vendor_id = 0x14c3;
- id->subsystem_device_id = 0x7986;
- }
-
- return (id->vendor_id && id->device_id) ? 0 : -1;
+ return 0;
}
@@ -3542,16 +3490,13 @@ 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 &&
- id->subsystem_vendor_id == 0 && id->subsystem_device_id == 0)
- if (!nl80211_hardware_id_from_fdt(id, ifname))
- return 0;
-
- /* Failed to obtain hardware IDs, search board config */
+ /* Failed to obtain hardware PCI/USB IDs... */
if (id->vendor_id == 0 && id->device_id == 0 &&
id->subsystem_vendor_id == 0 && id->subsystem_device_id == 0)
- return iwinfo_hardware_id_from_mtd(id);
+ /* ... first fallback to FDT ... */
+ if (nl80211_hardware_id_from_fdt(id, ifname) == -1)
+ /* ... then board config */
+ return iwinfo_hardware_id_from_mtd(id);
return 0;
}
diff --git a/iwinfo_utils.c b/iwinfo_utils.c
index a342b6a..ecd1dff 100644
--- a/iwinfo_utils.c
+++ b/iwinfo_utils.c
@@ -286,7 +286,10 @@ struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id)
&e.vendor_id, &e.device_id,
&e.subsystem_vendor_id, &e.subsystem_device_id,
&e.txpower_offset, &e.frequency_offset,
- e.vendor_name, e.device_name) < 8)
+ e.vendor_name, e.device_name) != 8 &&
+ sscanf(buf, "\"%127[^\"]\" %hd %hd \"%63[^\"]\" \"%63[^\"]\"",
+ e.compatible, &e.txpower_offset, &e.frequency_offset,
+ e.vendor_name, e.device_name) != 5)
continue;
if ((e.vendor_id != 0xffff) && (e.vendor_id != id->vendor_id))
@@ -303,6 +306,9 @@ struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id)
(e.subsystem_device_id != id->subsystem_device_id))
continue;
+ if (strcmp(e.compatible, id->compatible))
+ continue;
+
rv = &e;
break;
}
--
2.37.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment