0ff71883b2
This patch (as1207) converts usb-storage's sddr09 subdriver into a separate module. An unexpected complication arises because of DPCM devices, in which one LUN uses the sddr09 transport and one uses the standard CB transport. Since these devices can be used even when USB_STORAGE_SDDR09 isn't configured, their entries in unusual_devs.h require special treatment. If SDDR09 isn't configured then the entries remain in unusual_devs.h; if it is then the entries are present in unusual_sddr09.h instead. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
106 lines
3 KiB
C
106 lines
3 KiB
C
/* 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)|(USB_US_TYPE_STOR<<24) }
|
|
|
|
#define COMPLIANT_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 USUAL_DEV(useProto, useTrans, useType) \
|
|
{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \
|
|
.driver_info = ((useType)<<24) }
|
|
|
|
struct usb_device_id usb_storage_usb_ids[] = {
|
|
# include "unusual_devs.h"
|
|
{ } /* Terminating entry */
|
|
};
|
|
EXPORT_SYMBOL_GPL(usb_storage_usb_ids);
|
|
|
|
MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids);
|
|
|
|
#undef UNUSUAL_DEV
|
|
#undef COMPLIANT_DEV
|
|
#undef USUAL_DEV
|
|
|
|
|
|
/*
|
|
* 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_sddr09.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;
|
|
}
|
|
EXPORT_SYMBOL_GPL(usb_usual_ignore_device);
|