Blame view

kernel/linux-rt-4.4.41/drivers/usb/storage/usual-tables.c 3.48 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  /* 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) }
  
  #define COMPLIANT_DEV	UNUSUAL_DEV
  
  #define USUAL_DEV(useProto, useTrans) \
  { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) }
  
  /* Define the device is matched with Vendor ID and interface descriptors */
  #define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \
  			vendorName, productName, useProtocol, useTransport, \
  			initFunction, flags) \
  { \
  	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
  				| USB_DEVICE_ID_MATCH_VENDOR, \
  	.idVendor    = (id_vendor), \
  	.bInterfaceClass = (cl), \
  	.bInterfaceSubClass = (sc), \
  	.bInterfaceProtocol = (pr), \
  	.driver_info = (flags) \
  }
  
  struct usb_device_id usb_storage_usb_ids[] = {
  #	include "unusual_devs.h"
  	{ }		/* Terminating entry */
  };
  MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids);
  
  #undef UNUSUAL_DEV
  #undef COMPLIANT_DEV
  #undef USUAL_DEV
  #undef UNUSUAL_VENDOR_INTF
  
  /*
   * 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_alauda.h"
  #	include "unusual_cypress.h"
  #	include "unusual_datafab.h"
  #	include "unusual_ene_ub6250.h"
  #	include "unusual_freecom.h"
  #	include "unusual_isd200.h"
  #	include "unusual_jumpshot.h"
  #	include "unusual_karma.h"
  #	include "unusual_onetouch.h"
  #	include "unusual_realtek.h"
  #	include "unusual_sddr09.h"
  #	include "unusual_sddr55.h"
  #	include "unusual_usbat.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;
  }