0x168c 0x002a 0x0777 0xe202 12 0 "Ubiquiti" "Bullet M2"
0x168c 0x002a 0x0777 0xe805 5 0 "Ubiquiti" "Bullet M5"
0x168c 0x002a 0x0777 0xe345 0 0 "Ubiquiti" "WispStation M5" /* ToDo: confirm offset - Wrong! */
-0x168c 0x0029 0x168c 0x9130 0 0 "Atheros" "AR9130"
0x168c 0x0029 0x168c 0xa094 0 0 "Atheros" "AR9220"
0x168c 0x0029 0x168c 0xa095 0 0 "Atheros" "AR9223"
0x168c 0x002a 0x168c 0xa093 0 0 "Atheros" "AR9280"
0x168c 0x002e 0x0777 0xe0a2 8 0 "Ubiquiti" "NanoStation Loco M2 (XM)" /* wrong offset! */
0x168c 0x002e 0x168c 0x30a4 0 0 "Atheros" "AR9287"
0x168c 0x0030 0x168c 0x3114 0 0 "Atheros" "AR9390"
-0x168c 0x0030 0x168c 0x9330 0 0 "Atheros" "AR9330"
-0x168c 0x0030 0x168c 0x9340 0 0 "Atheros" "AR9340"
-0x168c 0x0033 0x168c 0x9530 0 0 "Qualcomm Atheros" "QCA9530"
-0x168c 0x0033 0x168c 0x9550 0 0 "Qualcomm Atheros" "QCA9550"
-0x168c 0x0033 0x168c 0x9560 0 0 "Qualcomm Atheros" "QCA9560"
0x168c 0x0033 0x168c 0xa120 0 0 "Atheros" "AR9580"
0x168c 0x0033 0x168c 0xa136 0 0 "Atheros" "AR9580"
0x168c 0x0033 0x19b6 0xd014 0 0 "MikroTik" "R11e-5HnD"
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 0x8074 0x168c 0x8074 0 0 "Qualcomm Atheros" "IPQ8074"
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"
0x14c3 0x7663 0x14c3 0x7663 0 0 "MediaTek" "MT7613BE"
0x14c3 0x7615 0x7615 0x14c3 0 0 "MediaTek" "MT7615E"
0x14c3 0x7620 0x14c3 0x000c 0 0 "MediaTek" "MT7620"
-0x14c3 0x7622 0x14c3 0x7622 0 0 "MediaTek" "MT7622"
0x14c3 0x7628 0x14c3 0x0004 0 0 "MediaTek" "MT76x8"
0x14c3 0x7650 0x14c3 0x7650 0 0 "MediaTek" "MT7610E"
0x14c3 0x7662 0x14c3 0x7662 0 0 "MediaTek" "MT76x2E"
0x14c3 0x7915 0x14c3 0x7915 0 0 "MediaTek" "MT7915E"
-0x14c3 0x7986 0x14c3 0x7986 0 0 "MediaTek" "MT7986"
0x14e4 0xaa52 0x14e4 0xaa52 0 0 "Broadcom" "BCM43602"
0x02d0 0xa9a6 0x0000 0x0000 0 0 "Cypress" "CYW43455"
0x1ae9 0x0310 0x1ae9 0x0000 0 0 "Wilocity" "Wil6210"
# 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"
uint16_t device_id;
uint16_t subsystem_vendor_id;
uint16_t subsystem_device_id;
+ char compatible[128];
};
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[];
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
{
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);
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;
}
*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;
}
&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))
(e.subsystem_device_id != id->subsystem_device_id))
continue;
+ if (strcmp(e.compatible, id->compatible))
+ continue;
+
rv = &e;
break;
}