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