[iwinfo PATCH] devices: add support for declaring compatible matched devices

Robert Marko robimarko at gmail.com
Mon Jan 9 09:59:53 PST 2023


On Mon, 9 Jan 2023 at 18:29, Christian Marangi <ansuelsmth at gmail.com> wrote:
>
> From: Jo-Philipp Wich <jo at 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 <ansuelsmth at gmail.com>
> Co-developed-by: Christian Marangi <ansuelsmth at gmail.com>
> Signed-off-by: Jo-Philipp Wich <jo at mein.io>
> Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>

Tested-by: Robert Marko <robimarko at 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 at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list