nl80211: add ability to describe USB devices

Treat USB vendor and product IDs like PCI subsystem vendor and device IDs
respectively to allow describing USB devices as `0000 0000 $vid $pid` in
the hardware database.

As a side effect, this also skips potentially expensive MTD lookups on
embedded devices with plugged in USB radios.

With a 5.15 kernel, such MTD lookups even spam dmesg with:

    mtdblock: MTD device 'factory' is NAND, please consider using UBI block devices instead.

This fix speeds up iwinfo considerably on affected systems:

Before:
sys     0m 3.56s

After:
sys     0m 0.09s

Suggested-by: Andre Heider <a.heider@gmail.com>
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2022-12-15 20:45:20 +01:00
parent a5a75fd661
commit 14f864eb72

View file

@ -3468,7 +3468,9 @@ static int nl80211_get_hardware_id(const char *ifname, char *buf)
{ "vendor", &id->vendor_id },
{ "device", &id->device_id },
{ "subsystem_vendor", &id->subsystem_vendor_id },
{ "subsystem_device", &id->subsystem_device_id }
{ "subsystem_device", &id->subsystem_device_id },
{ "../idVendor", &id->subsystem_vendor_id },
{ "../idProduct", &id->subsystem_device_id }
};
memset(id, 0, sizeof(*id));
@ -3487,12 +3489,14 @@ static int nl80211_get_hardware_id(const char *ifname, char *buf)
}
/* Failed to obtain hardware IDs, try FDT */
if (id->vendor_id == 0 || id->device_id == 0)
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 */
if (id->vendor_id == 0 || id->device_id == 0)
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);
return 0;