Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / usb / storage / usual-tables.c
diff --git a/kernel/drivers/usb/storage/usual-tables.c b/kernel/drivers/usb/storage/usual-tables.c
new file mode 100644 (file)
index 0000000..5ef8ce7
--- /dev/null
@@ -0,0 +1,123 @@
+/* Driver for USB Mass Storage devices
+ * Usual Tables File for usb-storage and libusual
+ *
+ * Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu)
+ *
+ * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more
+ * information about this driver.
+ *
+ * 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, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include <linux/usb_usual.h>
+
+
+/*
+ * The table of devices
+ */
+#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
+                   vendorName, productName, useProtocol, useTransport, \
+                   initFunction, flags) \
+{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
+  .driver_info = (flags) }
+
+#define COMPLIANT_DEV  UNUSUAL_DEV
+
+#define USUAL_DEV(useProto, useTrans) \
+{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) }
+
+/* Define the device is matched with Vendor ID and interface descriptors */
+#define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \
+                       vendorName, productName, useProtocol, useTransport, \
+                       initFunction, flags) \
+{ \
+       .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
+                               | USB_DEVICE_ID_MATCH_VENDOR, \
+       .idVendor    = (id_vendor), \
+       .bInterfaceClass = (cl), \
+       .bInterfaceSubClass = (sc), \
+       .bInterfaceProtocol = (pr), \
+       .driver_info = (flags) \
+}
+
+struct usb_device_id usb_storage_usb_ids[] = {
+#      include "unusual_devs.h"
+       { }             /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids);
+
+#undef UNUSUAL_DEV
+#undef COMPLIANT_DEV
+#undef USUAL_DEV
+#undef UNUSUAL_VENDOR_INTF
+
+/*
+ * The table of devices to ignore
+ */
+struct ignore_entry {
+       u16     vid, pid, bcdmin, bcdmax;
+};
+
+#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
+                   vendorName, productName, useProtocol, useTransport, \
+                   initFunction, flags) \
+{                                      \
+       .vid    = id_vendor,            \
+       .pid    = id_product,           \
+       .bcdmin = bcdDeviceMin,         \
+       .bcdmax = bcdDeviceMax,         \
+}
+
+static struct ignore_entry ignore_ids[] = {
+#      include "unusual_alauda.h"
+#      include "unusual_cypress.h"
+#      include "unusual_datafab.h"
+#      include "unusual_ene_ub6250.h"
+#      include "unusual_freecom.h"
+#      include "unusual_isd200.h"
+#      include "unusual_jumpshot.h"
+#      include "unusual_karma.h"
+#      include "unusual_onetouch.h"
+#      include "unusual_realtek.h"
+#      include "unusual_sddr09.h"
+#      include "unusual_sddr55.h"
+#      include "unusual_usbat.h"
+       { }             /* Terminating entry */
+};
+
+#undef UNUSUAL_DEV
+
+/* Return an error if a device is in the ignore_ids list */
+int usb_usual_ignore_device(struct usb_interface *intf)
+{
+       struct usb_device *udev;
+       unsigned vid, pid, bcd;
+       struct ignore_entry *p;
+
+       udev = interface_to_usbdev(intf);
+       vid = le16_to_cpu(udev->descriptor.idVendor);
+       pid = le16_to_cpu(udev->descriptor.idProduct);
+       bcd = le16_to_cpu(udev->descriptor.bcdDevice);
+
+       for (p = ignore_ids; p->vid; ++p) {
+               if (p->vid == vid && p->pid == pid &&
+                               p->bcdmin <= bcd && p->bcdmax >= bcd)
+                       return -ENXIO;
+       }
+       return 0;
+}