#ifdef USB_GLOBAL_INCLUDE_FILE
#include USB_GLOBAL_INCLUDE_FILE
#else
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/module.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/condvar.h>
#include <sys/sysctl.h>
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
#include <sys/limits.h>
#include <sys/endian.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#endif
const struct usb_device_id *
usbd_lookup_id_by_info(const struct usb_device_id *id, usb_size_t sizeof_id,
const struct usbd_lookup_info *info)
{
const struct usb_device_id *id_end;
if (id == NULL) {
goto done;
}
id_end = (const void *)(((const uint8_t *)id) + sizeof_id);
for (; id != id_end; id++) {
if ((id->match_flag_vendor) &&
(id->idVendor != info->idVendor)) {
continue;
}
if ((id->match_flag_product) &&
(id->idProduct != info->idProduct)) {
continue;
}
if ((id->match_flag_dev_lo) &&
(id->bcdDevice_lo > info->bcdDevice)) {
continue;
}
if ((id->match_flag_dev_hi) &&
(id->bcdDevice_hi < info->bcdDevice)) {
continue;
}
if ((id->match_flag_dev_class) &&
(id->bDeviceClass != info->bDeviceClass)) {
continue;
}
if ((id->match_flag_dev_subclass) &&
(id->bDeviceSubClass != info->bDeviceSubClass)) {
continue;
}
if ((id->match_flag_dev_protocol) &&
(id->bDeviceProtocol != info->bDeviceProtocol)) {
continue;
}
if ((id->match_flag_int_class) &&
(id->bInterfaceClass != info->bInterfaceClass)) {
continue;
}
if ((id->match_flag_int_subclass) &&
(id->bInterfaceSubClass != info->bInterfaceSubClass)) {
continue;
}
if ((id->match_flag_int_protocol) &&
(id->bInterfaceProtocol != info->bInterfaceProtocol)) {
continue;
}
return (id);
}
done:
return (NULL);
}
int
usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id,
struct usb_attach_arg *uaa)
{
id = usbd_lookup_id_by_info(id, sizeof_id, &uaa->info);
if (id) {
uaa->driver_info = id->driver_info;
return (0);
}
return (ENXIO);
}
#if BYTE_ORDER == LITTLE_ENDIAN
#define U16_XOR "0"
#else
#define U16_XOR "8"
#endif
#if defined(KLD_MODULE) && (USB_HAVE_ID_SECTION != 0)
static const char __section("bus_autoconf_format") __used usb_id_format[] = {
"usb_host_id{256,:}"
"usb_device_id{256,:}"
"usb_dual_id{256,:}"
"mf_vendor{" U16_XOR ",1}"
"mf_product{" U16_XOR ",1}"
"mf_dev_lo{" U16_XOR ",1}"
"mf_dev_hi{" U16_XOR ",1}"
"mf_dev_class{" U16_XOR ",1}"
"mf_dev_subclass{" U16_XOR ",1}"
"mf_dev_protocol{" U16_XOR ",1}"
"mf_int_class{" U16_XOR ",1}"
"mf_int_subclass{" U16_XOR ",1}"
"mf_int_protocol{" U16_XOR ",1}"
"unused{" U16_XOR ",6}"
"idVendor[0]{" U16_XOR ",8}"
"idVendor[1]{" U16_XOR ",8}"
"idProduct[0]{" U16_XOR ",8}"
"idProduct[1]{" U16_XOR ",8}"
"bcdDevice_lo[0]{" U16_XOR ",8}"
"bcdDevice_lo[1]{" U16_XOR ",8}"
"bcdDevice_hi[0]{" U16_XOR ",8}"
"bcdDevice_hi[1]{" U16_XOR ",8}"
"bDeviceClass{0,8}"
"bDeviceSubClass{0,8}"
"bDeviceProtocol{0,8}"
"bInterfaceClass{0,8}"
"bInterfaceSubClass{0,8}"
"bInterfaceProtocol{0,8}"
#if USB_HAVE_COMPAT_LINUX
"mfl_vendor{" U16_XOR ",1}"
"mfl_product{" U16_XOR ",1}"
"mfl_dev_lo{" U16_XOR ",1}"
"mfl_dev_hi{" U16_XOR ",1}"
"mfl_dev_class{" U16_XOR ",1}"
"mfl_dev_subclass{" U16_XOR ",1}"
"mfl_dev_protocol{" U16_XOR ",1}"
"mfl_int_class{" U16_XOR ",1}"
"mfl_int_subclass{" U16_XOR ",1}"
"mfl_int_protocol{" U16_XOR ",1}"
"unused{" U16_XOR ",6}"
#endif
};
#endif