blob: cfd12e523678520b30d1bc6fc378ceba7d77f24d [file] [log] [blame]
Greg Kroah-Hartman5fd54ac2017-11-03 11:28:30 +01001// SPDX-License-Identifier: GPL-2.0+
Felipe Balbif0183a32016-04-18 13:09:11 +03002/*
3 * Driver for USB Mass Storage devices
Alan Sterne6e244b2009-02-12 14:47:44 -05004 * Usual Tables File for usb-storage and libusual
5 *
6 * Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu)
Alan Sterne6e244b2009-02-12 14:47:44 -05007 */
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/usb.h>
12#include <linux/usb_usual.h>
13
14
15/*
16 * The table of devices
17 */
18#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
19 vendorName, productName, useProtocol, useTransport, \
20 initFunction, flags) \
21{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
Alan Sterne6e244b2009-02-12 14:47:44 -050022 .driver_info = (flags) }
23
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +020024#define COMPLIANT_DEV UNUSUAL_DEV
25
26#define USUAL_DEV(useProto, useTrans) \
27{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) }
Alan Sterne6e244b2009-02-12 14:47:44 -050028
fangxiaozhi07c7be32013-02-04 15:14:46 +080029/* Define the device is matched with Vendor ID and interface descriptors */
30#define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \
31 vendorName, productName, useProtocol, useTransport, \
32 initFunction, flags) \
33{ \
34 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
35 | USB_DEVICE_ID_MATCH_VENDOR, \
36 .idVendor = (id_vendor), \
37 .bInterfaceClass = (cl), \
38 .bInterfaceSubClass = (sc), \
39 .bInterfaceProtocol = (pr), \
40 .driver_info = (flags) \
41}
42
Alan Sterne6e244b2009-02-12 14:47:44 -050043struct usb_device_id usb_storage_usb_ids[] = {
44# include "unusual_devs.h"
45 { } /* Terminating entry */
46};
Alan Sterne6e244b2009-02-12 14:47:44 -050047MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids);
48
49#undef UNUSUAL_DEV
50#undef COMPLIANT_DEV
51#undef USUAL_DEV
fangxiaozhi07c7be32013-02-04 15:14:46 +080052#undef UNUSUAL_VENDOR_INTF
Alan Sterne6e244b2009-02-12 14:47:44 -050053
Alan Sterne6e244b2009-02-12 14:47:44 -050054/*
55 * The table of devices to ignore
56 */
57struct ignore_entry {
58 u16 vid, pid, bcdmin, bcdmax;
59};
60
61#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
62 vendorName, productName, useProtocol, useTransport, \
63 initFunction, flags) \
64{ \
65 .vid = id_vendor, \
66 .pid = id_product, \
67 .bcdmin = bcdDeviceMin, \
68 .bcdmax = bcdDeviceMax, \
69}
70
71static struct ignore_entry ignore_ids[] = {
Alan Sterna74bba32009-02-12 14:48:22 -050072# include "unusual_alauda.h"
Alan Sternfcdb5142009-02-12 14:48:04 -050073# include "unusual_cypress.h"
Alan Stern2cbbf352009-02-12 14:48:15 -050074# include "unusual_datafab.h"
huajun li41e568d2011-03-04 10:56:18 +080075# include "unusual_ene_ub6250.h"
Alan Stern0d629392009-02-12 14:48:11 -050076# include "unusual_freecom.h"
Alan Stern32d54932009-02-12 14:47:54 -050077# include "unusual_isd200.h"
Alan Sterna9fb6d02009-02-12 14:48:19 -050078# include "unusual_jumpshot.h"
Alan Sternc1033782009-02-12 14:48:26 -050079# include "unusual_karma.h"
Alan Stern9cfb95e2009-02-12 14:48:33 -050080# include "unusual_onetouch.h"
wwang50a6cb92011-01-14 16:53:34 +080081# include "unusual_realtek.h"
Alan Stern0ff71882009-02-12 14:47:49 -050082# include "unusual_sddr09.h"
Alan Stern70fcc002009-02-12 14:47:59 -050083# include "unusual_sddr55.h"
Alan Stern26d68182009-02-12 14:48:08 -050084# include "unusual_usbat.h"
Alan Sterne6e244b2009-02-12 14:47:44 -050085 { } /* Terminating entry */
86};
87
88#undef UNUSUAL_DEV
89
Alan Sterne6e244b2009-02-12 14:47:44 -050090/* Return an error if a device is in the ignore_ids list */
91int usb_usual_ignore_device(struct usb_interface *intf)
92{
93 struct usb_device *udev;
94 unsigned vid, pid, bcd;
95 struct ignore_entry *p;
96
97 udev = interface_to_usbdev(intf);
98 vid = le16_to_cpu(udev->descriptor.idVendor);
99 pid = le16_to_cpu(udev->descriptor.idProduct);
100 bcd = le16_to_cpu(udev->descriptor.bcdDevice);
101
102 for (p = ignore_ids; p->vid; ++p) {
103 if (p->vid == vid && p->pid == pid &&
104 p->bcdmin <= bcd && p->bcdmax >= bcd)
105 return -ENXIO;
106 }
107 return 0;
108}