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 = (kernel_ulong_t)(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 29const struct usb_device_id usb_storage_usb_ids[] = { 30# include "unusual_devs.h" 31 { } /* Terminating entry */ 32}; 33MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids); 34 35#undef UNUSUAL_DEV 36#undef COMPLIANT_DEV 37#undef USUAL_DEV 38 39/* 40 * The table of devices to ignore 41 */ 42struct ignore_entry { 43 u16 vid, pid, bcdmin, bcdmax; 44}; 45 46#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ 47 vendorName, productName, useProtocol, useTransport, \ 48 initFunction, flags) \ 49{ \ 50 .vid = id_vendor, \ 51 .pid = id_product, \ 52 .bcdmin = bcdDeviceMin, \ 53 .bcdmax = bcdDeviceMax, \ 54} 55 56static const struct ignore_entry ignore_ids[] = { 57# include "unusual_alauda.h" 58# include "unusual_cypress.h" 59# include "unusual_datafab.h" 60# include "unusual_ene_ub6250.h" 61# include "unusual_freecom.h" 62# include "unusual_isd200.h" 63# include "unusual_jumpshot.h" 64# include "unusual_karma.h" 65# include "unusual_onetouch.h" 66# include "unusual_realtek.h" 67# include "unusual_sddr09.h" 68# include "unusual_sddr55.h" 69# include "unusual_usbat.h" 70 { } /* Terminating entry */ 71}; 72 73#undef UNUSUAL_DEV 74 75/* Return an error if a device is in the ignore_ids list */ 76int usb_usual_ignore_device(struct usb_interface *intf) 77{ 78 struct usb_device *udev; 79 unsigned vid, pid, bcd; 80 const struct ignore_entry *p; 81 82 udev = interface_to_usbdev(intf); 83 vid = le16_to_cpu(udev->descriptor.idVendor); 84 pid = le16_to_cpu(udev->descriptor.idProduct); 85 bcd = le16_to_cpu(udev->descriptor.bcdDevice); 86 87 for (p = ignore_ids; p->vid; ++p) { 88 if (p->vid == vid && p->pid == pid && 89 p->bcdmin <= bcd && p->bcdmax >= bcd) 90 return -ENXIO; 91 } 92 return 0; 93} 94