162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for USB Mass Storage devices 462306a36Sopenharmony_ci * Usual Tables File for usb-storage and libusual 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu) 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/usb.h> 1262306a36Sopenharmony_ci#include <linux/usb_usual.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 1662306a36Sopenharmony_ci * The table of devices 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ 1962306a36Sopenharmony_ci vendorName, productName, useProtocol, useTransport, \ 2062306a36Sopenharmony_ci initFunction, flags) \ 2162306a36Sopenharmony_ci{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \ 2262306a36Sopenharmony_ci .driver_info = (flags) } 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define COMPLIANT_DEV UNUSUAL_DEV 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define USUAL_DEV(useProto, useTrans) \ 2762306a36Sopenharmony_ci{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) } 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* Define the device is matched with Vendor ID and interface descriptors */ 3062306a36Sopenharmony_ci#define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \ 3162306a36Sopenharmony_ci vendorName, productName, useProtocol, useTransport, \ 3262306a36Sopenharmony_ci initFunction, flags) \ 3362306a36Sopenharmony_ci{ \ 3462306a36Sopenharmony_ci .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ 3562306a36Sopenharmony_ci | USB_DEVICE_ID_MATCH_VENDOR, \ 3662306a36Sopenharmony_ci .idVendor = (id_vendor), \ 3762306a36Sopenharmony_ci .bInterfaceClass = (cl), \ 3862306a36Sopenharmony_ci .bInterfaceSubClass = (sc), \ 3962306a36Sopenharmony_ci .bInterfaceProtocol = (pr), \ 4062306a36Sopenharmony_ci .driver_info = (flags) \ 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ciconst struct usb_device_id usb_storage_usb_ids[] = { 4462306a36Sopenharmony_ci# include "unusual_devs.h" 4562306a36Sopenharmony_ci { } /* Terminating entry */ 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(usb, usb_storage_usb_ids); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#undef UNUSUAL_DEV 5062306a36Sopenharmony_ci#undef COMPLIANT_DEV 5162306a36Sopenharmony_ci#undef USUAL_DEV 5262306a36Sopenharmony_ci#undef UNUSUAL_VENDOR_INTF 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* 5562306a36Sopenharmony_ci * The table of devices to ignore 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_cistruct ignore_entry { 5862306a36Sopenharmony_ci u16 vid, pid, bcdmin, bcdmax; 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ 6262306a36Sopenharmony_ci vendorName, productName, useProtocol, useTransport, \ 6362306a36Sopenharmony_ci initFunction, flags) \ 6462306a36Sopenharmony_ci{ \ 6562306a36Sopenharmony_ci .vid = id_vendor, \ 6662306a36Sopenharmony_ci .pid = id_product, \ 6762306a36Sopenharmony_ci .bcdmin = bcdDeviceMin, \ 6862306a36Sopenharmony_ci .bcdmax = bcdDeviceMax, \ 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic const struct ignore_entry ignore_ids[] = { 7262306a36Sopenharmony_ci# include "unusual_alauda.h" 7362306a36Sopenharmony_ci# include "unusual_cypress.h" 7462306a36Sopenharmony_ci# include "unusual_datafab.h" 7562306a36Sopenharmony_ci# include "unusual_ene_ub6250.h" 7662306a36Sopenharmony_ci# include "unusual_freecom.h" 7762306a36Sopenharmony_ci# include "unusual_isd200.h" 7862306a36Sopenharmony_ci# include "unusual_jumpshot.h" 7962306a36Sopenharmony_ci# include "unusual_karma.h" 8062306a36Sopenharmony_ci# include "unusual_onetouch.h" 8162306a36Sopenharmony_ci# include "unusual_realtek.h" 8262306a36Sopenharmony_ci# include "unusual_sddr09.h" 8362306a36Sopenharmony_ci# include "unusual_sddr55.h" 8462306a36Sopenharmony_ci# include "unusual_usbat.h" 8562306a36Sopenharmony_ci { } /* Terminating entry */ 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#undef UNUSUAL_DEV 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* Return an error if a device is in the ignore_ids list */ 9162306a36Sopenharmony_ciint usb_usual_ignore_device(struct usb_interface *intf) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct usb_device *udev; 9462306a36Sopenharmony_ci unsigned vid, pid, bcd; 9562306a36Sopenharmony_ci const struct ignore_entry *p; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci udev = interface_to_usbdev(intf); 9862306a36Sopenharmony_ci vid = le16_to_cpu(udev->descriptor.idVendor); 9962306a36Sopenharmony_ci pid = le16_to_cpu(udev->descriptor.idProduct); 10062306a36Sopenharmony_ci bcd = le16_to_cpu(udev->descriptor.bcdDevice); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci for (p = ignore_ids; p->vid; ++p) { 10362306a36Sopenharmony_ci if (p->vid == vid && p->pid == pid && 10462306a36Sopenharmony_ci p->bcdmin <= bcd && p->bcdmax >= bcd) 10562306a36Sopenharmony_ci return -ENXIO; 10662306a36Sopenharmony_ci } 10762306a36Sopenharmony_ci return 0; 10862306a36Sopenharmony_ci} 109