Branch data Line data Source code
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) }
38 : :
39 : : #define COMPLIANT_DEV UNUSUAL_DEV
40 : :
41 : : #define USUAL_DEV(useProto, useTrans) \
42 : : { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) }
43 : :
44 : : /* Define the device is matched with Vendor ID and interface descriptors */
45 : : #define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \
46 : : vendorName, productName, useProtocol, useTransport, \
47 : : initFunction, flags) \
48 : : { \
49 : : .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
50 : : | USB_DEVICE_ID_MATCH_VENDOR, \
51 : : .idVendor = (id_vendor), \
52 : : .bInterfaceClass = (cl), \
53 : : .bInterfaceSubClass = (sc), \
54 : : .bInterfaceProtocol = (pr), \
55 : : .driver_info = (flags) \
56 : : }
57 : :
58 : : struct usb_device_id usb_storage_usb_ids[] = {
59 : : # include "unusual_devs.h"
60 : : { } /* Terminating entry */
61 : : };
62 : : MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids);
63 : :
64 : : #undef UNUSUAL_DEV
65 : : #undef COMPLIANT_DEV
66 : : #undef USUAL_DEV
67 : : #undef UNUSUAL_VENDOR_INTF
68 : :
69 : : /*
70 : : * The table of devices to ignore
71 : : */
72 : : struct ignore_entry {
73 : : u16 vid, pid, bcdmin, bcdmax;
74 : : };
75 : :
76 : : #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
77 : : vendorName, productName, useProtocol, useTransport, \
78 : : initFunction, flags) \
79 : : { \
80 : : .vid = id_vendor, \
81 : : .pid = id_product, \
82 : : .bcdmin = bcdDeviceMin, \
83 : : .bcdmax = bcdDeviceMax, \
84 : : }
85 : :
86 : : static struct ignore_entry ignore_ids[] = {
87 : : # include "unusual_alauda.h"
88 : : # include "unusual_cypress.h"
89 : : # include "unusual_datafab.h"
90 : : # include "unusual_ene_ub6250.h"
91 : : # include "unusual_freecom.h"
92 : : # include "unusual_isd200.h"
93 : : # include "unusual_jumpshot.h"
94 : : # include "unusual_karma.h"
95 : : # include "unusual_onetouch.h"
96 : : # include "unusual_realtek.h"
97 : : # include "unusual_sddr09.h"
98 : : # include "unusual_sddr55.h"
99 : : # include "unusual_usbat.h"
100 : : { } /* Terminating entry */
101 : : };
102 : :
103 : : #undef UNUSUAL_DEV
104 : :
105 : : /* Return an error if a device is in the ignore_ids list */
106 : 0 : int usb_usual_ignore_device(struct usb_interface *intf)
107 : : {
108 : : struct usb_device *udev;
109 : : unsigned vid, pid, bcd;
110 : : struct ignore_entry *p;
111 : :
112 : : udev = interface_to_usbdev(intf);
113 : 0 : vid = le16_to_cpu(udev->descriptor.idVendor);
114 : 0 : pid = le16_to_cpu(udev->descriptor.idProduct);
115 : 0 : bcd = le16_to_cpu(udev->descriptor.bcdDevice);
116 : :
117 [ # # ]: 0 : for (p = ignore_ids; p->vid; ++p) {
118 [ # # ][ # # ]: 0 : if (p->vid == vid && p->pid == pid &&
[ # # ]
119 [ # # ]: 0 : p->bcdmin <= bcd && p->bcdmax >= bcd)
120 : : return -ENXIO;
121 : : }
122 : : return 0;
123 : : }
|