diff options
Diffstat (limited to 'drivers/usb/storage/usual-tables.c')
-rw-r--r-- | drivers/usb/storage/usual-tables.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/drivers/usb/storage/usual-tables.c b/drivers/usb/storage/usual-tables.c new file mode 100644 index 000000000000..1924e3229409 --- /dev/null +++ b/drivers/usb/storage/usual-tables.c | |||
@@ -0,0 +1,105 @@ | |||
1 | /* Driver for USB Mass Storage devices | ||
2 | * Usual Tables File for usb-storage and libusual | ||
3 | * | ||
4 | * Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu) | ||
5 | * | ||
6 | * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more | ||
7 | * information about this driver. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2, or (at your option) any | ||
12 | * later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License along | ||
20 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
21 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/usb.h> | ||
27 | #include <linux/usb_usual.h> | ||
28 | |||
29 | |||
30 | /* | ||
31 | * The table of devices | ||
32 | */ | ||
33 | #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ | ||
34 | vendorName, productName, useProtocol, useTransport, \ | ||
35 | initFunction, flags) \ | ||
36 | { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \ | ||
37 | .driver_info = (flags)|(USB_US_TYPE_STOR<<24) } | ||
38 | |||
39 | #define COMPLIANT_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ | ||
40 | vendorName, productName, useProtocol, useTransport, \ | ||
41 | initFunction, flags) \ | ||
42 | { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \ | ||
43 | .driver_info = (flags) } | ||
44 | |||
45 | #define USUAL_DEV(useProto, useTrans, useType) \ | ||
46 | { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \ | ||
47 | .driver_info = ((useType)<<24) } | ||
48 | |||
49 | struct usb_device_id usb_storage_usb_ids[] = { | ||
50 | # include "unusual_devs.h" | ||
51 | { } /* Terminating entry */ | ||
52 | }; | ||
53 | EXPORT_SYMBOL_GPL(usb_storage_usb_ids); | ||
54 | |||
55 | MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids); | ||
56 | |||
57 | #undef UNUSUAL_DEV | ||
58 | #undef COMPLIANT_DEV | ||
59 | #undef USUAL_DEV | ||
60 | |||
61 | |||
62 | /* | ||
63 | * The table of devices to ignore | ||
64 | */ | ||
65 | struct ignore_entry { | ||
66 | u16 vid, pid, bcdmin, bcdmax; | ||
67 | }; | ||
68 | |||
69 | #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ | ||
70 | vendorName, productName, useProtocol, useTransport, \ | ||
71 | initFunction, flags) \ | ||
72 | { \ | ||
73 | .vid = id_vendor, \ | ||
74 | .pid = id_product, \ | ||
75 | .bcdmin = bcdDeviceMin, \ | ||
76 | .bcdmax = bcdDeviceMax, \ | ||
77 | } | ||
78 | |||
79 | static struct ignore_entry ignore_ids[] = { | ||
80 | { } /* Terminating entry */ | ||
81 | }; | ||
82 | |||
83 | #undef UNUSUAL_DEV | ||
84 | |||
85 | |||
86 | /* Return an error if a device is in the ignore_ids list */ | ||
87 | int usb_usual_ignore_device(struct usb_interface *intf) | ||
88 | { | ||
89 | struct usb_device *udev; | ||
90 | unsigned vid, pid, bcd; | ||
91 | struct ignore_entry *p; | ||
92 | |||
93 | udev = interface_to_usbdev(intf); | ||
94 | vid = le16_to_cpu(udev->descriptor.idVendor); | ||
95 | pid = le16_to_cpu(udev->descriptor.idProduct); | ||
96 | bcd = le16_to_cpu(udev->descriptor.bcdDevice); | ||
97 | |||
98 | for (p = ignore_ids; p->vid; ++p) { | ||
99 | if (p->vid == vid && p->pid == pid && | ||
100 | p->bcdmin <= bcd && p->bcdmax >= bcd) | ||
101 | return -ENXIO; | ||
102 | } | ||
103 | return 0; | ||
104 | } | ||
105 | EXPORT_SYMBOL_GPL(usb_usual_ignore_device); | ||