Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0+ 2 : : /* 3 : : * Driver for USB Mass Storage devices 4 : : * Usual Tables File for usb-storage and libusual 5 : : * 6 : : * Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu) 7 : : */ 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), \ 22 : : .driver_info = (flags) } 23 : : 24 : : #define COMPLIANT_DEV UNUSUAL_DEV 25 : : 26 : : #define USUAL_DEV(useProto, useTrans) \ 27 : : { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) } 28 : : 29 : : /* 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 : : 43 : : struct usb_device_id usb_storage_usb_ids[] = { 44 : : # include "unusual_devs.h" 45 : : { } /* Terminating entry */ 46 : : }; 47 : : MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids); 48 : : 49 : : #undef UNUSUAL_DEV 50 : : #undef COMPLIANT_DEV 51 : : #undef USUAL_DEV 52 : : #undef UNUSUAL_VENDOR_INTF 53 : : 54 : : /* 55 : : * The table of devices to ignore 56 : : */ 57 : : struct 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 : : 71 : : static struct ignore_entry ignore_ids[] = { 72 : : # include "unusual_alauda.h" 73 : : # include "unusual_cypress.h" 74 : : # include "unusual_datafab.h" 75 : : # include "unusual_ene_ub6250.h" 76 : : # include "unusual_freecom.h" 77 : : # include "unusual_isd200.h" 78 : : # include "unusual_jumpshot.h" 79 : : # include "unusual_karma.h" 80 : : # include "unusual_onetouch.h" 81 : : # include "unusual_realtek.h" 82 : : # include "unusual_sddr09.h" 83 : : # include "unusual_sddr55.h" 84 : : # include "unusual_usbat.h" 85 : : { } /* Terminating entry */ 86 : : }; 87 : : 88 : : #undef UNUSUAL_DEV 89 : : 90 : : /* Return an error if a device is in the ignore_ids list */ 91 : 0 : int 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 : 0 : vid = le16_to_cpu(udev->descriptor.idVendor); 99 : 0 : pid = le16_to_cpu(udev->descriptor.idProduct); 100 : 0 : bcd = le16_to_cpu(udev->descriptor.bcdDevice); 101 : : 102 : 0 : for (p = ignore_ids; p->vid; ++p) { 103 : 0 : if (p->vid == vid && p->pid == pid && 104 : 0 : p->bcdmin <= bcd && p->bcdmax >= bcd) 105 : : return -ENXIO; 106 : : } 107 : : return 0; 108 : : }