On Mon, 9 Jan 2023 at 18:29, Christian Marangi <ansuels...@gmail.com> wrote: > > From: Jo-Philipp Wich <j...@mein.io> > > 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 <ansuels...@gmail.com> > Co-developed-by: Christian Marangi <ansuels...@gmail.com> > Signed-off-by: Jo-Philipp Wich <j...@mein.io> > Signed-off-by: Christian Marangi <ansuels...@gmail.com>
Tested-by: Robert Marko <robima...@gmail.com> Regards, Robert > --- > 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 > > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel