![Linus Torvalds](/assets/img/avatar_default.png)
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
113 lines
3.2 KiB
C
113 lines
3.2 KiB
C
/*
|
|
* drivers/usb/core/otg_whitelist.h
|
|
*
|
|
* Copyright (C) 2004 Texas Instruments
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
/*
|
|
* This OTG Whitelist is the OTG "Targeted Peripheral List". It should
|
|
* mostly use of USB_DEVICE() or USB_DEVICE_VER() entries..
|
|
*
|
|
* YOU _SHOULD_ CHANGE THIS LIST TO MATCH YOUR PRODUCT AND ITS TESTING!
|
|
*/
|
|
|
|
static struct usb_device_id whitelist_table [] = {
|
|
|
|
/* hubs are optional in OTG, but very handy ... */
|
|
{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 0), },
|
|
{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 1), },
|
|
|
|
#ifdef CONFIG_USB_PRINTER /* ignoring nonstatic linkage! */
|
|
/* FIXME actually, printers are NOT supposed to use device classes;
|
|
* they're supposed to use interface classes...
|
|
*/
|
|
{ USB_DEVICE_INFO(7, 1, 1) },
|
|
{ USB_DEVICE_INFO(7, 1, 2) },
|
|
{ USB_DEVICE_INFO(7, 1, 3) },
|
|
#endif
|
|
|
|
#ifdef CONFIG_USB_CDCETHER
|
|
/* Linux-USB CDC Ethernet gadget */
|
|
{ USB_DEVICE(0x0525, 0xa4a1), },
|
|
/* Linux-USB CDC Ethernet + RNDIS gadget */
|
|
{ USB_DEVICE(0x0525, 0xa4a2), },
|
|
#endif
|
|
|
|
#if defined(CONFIG_USB_TEST) || defined(CONFIG_USB_TEST_MODULE)
|
|
/* gadget zero, for testing */
|
|
{ USB_DEVICE(0x0525, 0xa4a0), },
|
|
#endif
|
|
|
|
{ } /* Terminating entry */
|
|
};
|
|
|
|
static int is_targeted(struct usb_device *dev)
|
|
{
|
|
struct usb_device_id *id = whitelist_table;
|
|
|
|
/* possible in developer configs only! */
|
|
if (!dev->bus->otg_port)
|
|
return 1;
|
|
|
|
/* HNP test device is _never_ targeted (see OTG spec 6.6.6) */
|
|
if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a &&
|
|
le16_to_cpu(dev->descriptor.idProduct) == 0xbadd))
|
|
return 0;
|
|
|
|
/* NOTE: can't use usb_match_id() since interface caches
|
|
* aren't set up yet. this is cut/paste from that code.
|
|
*/
|
|
for (id = whitelist_table; id->match_flags; id++) {
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
|
|
id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
|
|
continue;
|
|
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
|
|
id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
|
|
continue;
|
|
|
|
/* No need to test id->bcdDevice_lo != 0, since 0 is never
|
|
greater than any unsigned number. */
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
|
|
(id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))
|
|
continue;
|
|
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
|
|
(id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice)))
|
|
continue;
|
|
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&
|
|
(id->bDeviceClass != dev->descriptor.bDeviceClass))
|
|
continue;
|
|
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&
|
|
(id->bDeviceSubClass!= dev->descriptor.bDeviceSubClass))
|
|
continue;
|
|
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&
|
|
(id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))
|
|
continue;
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* add other match criteria here ... */
|
|
|
|
|
|
/* OTG MESSAGE: report errors here, customize to match your product */
|
|
dev_err(&dev->dev, "device v%04x p%04x is not supported\n",
|
|
le16_to_cpu(dev->descriptor.idVendor),
|
|
le16_to_cpu(dev->descriptor.idProduct));
|
|
#ifdef CONFIG_USB_OTG_WHITELIST
|
|
return 0;
|
|
#else
|
|
return 1;
|
|
#endif
|
|
}
|
|
|