blob: 1c0b89f2a138aa2046abf81a57affcac6b9300a3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* Driver for USB Mass Storage compliant devices
2 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 * Current development and maintenance by:
4 * (c) 1999-2003 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
5 *
6 * Developed with the assistance of:
7 * (c) 2000 David L. Brown, Jr. (usb-storage@davidb.org)
Alan Sterne6e244b2009-02-12 14:47:44 -05008 * (c) 2003-2009 Alan Stern (stern@rowland.harvard.edu)
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 *
10 * Initial work by:
11 * (c) 1999 Michael Gee (michael@linuxspecific.com)
12 *
13 * usb_device_id support by Adam J. Richter (adam@yggdrasil.com):
14 * (c) 2000 Yggdrasil Computing, Inc.
15 *
16 * This driver is based on the 'USB Mass Storage Class' document. This
17 * describes in detail the protocol used to communicate with such
18 * devices. Clearly, the designers had SCSI and ATAPI commands in
19 * mind when they created this document. The commands are all very
20 * similar to commands in the SCSI-II and ATAPI specifications.
21 *
22 * It is important to note that in a number of cases this class
23 * exhibits class-specific exemptions from the USB specification.
24 * Notably the usage of NAK, STALL and ACK differs from the norm, in
25 * that they are used to communicate wait, failed and OK on commands.
26 *
27 * Also, for certain devices, the interrupt endpoint is used to convey
28 * status of a command.
29 *
30 * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more
31 * information about this driver.
32 *
33 * This program is free software; you can redistribute it and/or modify it
34 * under the terms of the GNU General Public License as published by the
35 * Free Software Foundation; either version 2, or (at your option) any
36 * later version.
37 *
38 * This program is distributed in the hope that it will be useful, but
39 * WITHOUT ANY WARRANTY; without even the implied warranty of
40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41 * General Public License for more details.
42 *
43 * You should have received a copy of the GNU General Public License along
44 * with this program; if not, write to the Free Software Foundation, Inc.,
45 * 675 Mass Ave, Cambridge, MA 02139, USA.
46 */
47
Matthew Wilcox9eb66f72009-09-24 16:19:49 -060048#ifdef CONFIG_USB_STORAGE_DEBUG
49#define DEBUG
50#endif
51
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#include <linux/sched.h>
53#include <linux/errno.h>
Nigel Cunningham7dfb7102006-12-06 20:34:23 -080054#include <linux/freezer.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070055#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070056#include <linux/slab.h>
Alan Stern3f13e662005-10-23 19:43:36 -070057#include <linux/kthread.h>
Arjan van de Ven4186ecf2006-01-11 15:55:29 +010058#include <linux/mutex.h>
Sam Ravnborg00f8b0c12007-03-05 00:30:55 -080059#include <linux/utsname.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070060
61#include <scsi/scsi.h>
62#include <scsi/scsi_cmnd.h>
63#include <scsi/scsi_device.h>
64
65#include "usb.h"
66#include "scsiglue.h"
67#include "transport.h"
68#include "protocol.h"
69#include "debug.h"
70#include "initializers.h"
71
Kevin Lloyd32fe5e32008-07-10 14:14:57 -070072#include "sierra_ms.h"
Dan Williams281b0642008-12-14 12:39:22 -050073#include "option_ms.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070074
75/* Some informational data */
76MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>");
77MODULE_DESCRIPTION("USB Mass Storage driver for Linux");
78MODULE_LICENSE("GPL");
79
Linus Torvaldsa4a47bc2010-02-26 10:03:22 -080080static unsigned int delay_use = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -070081module_param(delay_use, uint, S_IRUGO | S_IWUSR);
82MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device");
83
Alan Sternc838ea42008-12-15 10:40:06 -050084static char quirks[128];
85module_param_string(quirks, quirks, sizeof(quirks), S_IRUGO | S_IWUSR);
Alan Sternd4f373e2008-11-10 14:07:45 -050086MODULE_PARM_DESC(quirks, "supplemental list of device IDs and their quirks");
87
Linus Torvalds1da177e2005-04-16 15:20:36 -070088
Pete Zaitceva00828e2005-10-22 20:15:09 -070089/*
90 * The entries in this table correspond, line for line,
Alan Sterne6e244b2009-02-12 14:47:44 -050091 * with the entries in usb_storage_usb_ids[], defined in usual-tables.c.
Linus Torvalds1da177e2005-04-16 15:20:36 -070092 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070093
94/* The vendor name should be kept at eight characters or less, and
95 * the product name should be kept at 16 characters or less. If a device
96 * has the US_FL_FIX_INQUIRY flag, then the vendor and product names
97 * normally generated by a device thorugh the INQUIRY response will be
98 * taken from this list, and this is the reason for the above size
99 * restriction. However, if the flag is not present, then you
100 * are free to use as many characters as you like.
101 */
102
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
104 vendor_name, product_name, use_protocol, use_transport, \
105 init_function, Flags) \
106{ \
107 .vendorName = vendor_name, \
108 .productName = product_name, \
109 .useProtocol = use_protocol, \
110 .useTransport = use_transport, \
111 .initFunction = init_function, \
Pete Zaitceva00828e2005-10-22 20:15:09 -0700112}
113
Alan Stern25ff1c32008-12-15 12:43:41 -0500114#define COMPLIANT_DEV UNUSUAL_DEV
115
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +0200116#define USUAL_DEV(use_protocol, use_transport) \
Pete Zaitceva00828e2005-10-22 20:15:09 -0700117{ \
118 .useProtocol = use_protocol, \
119 .useTransport = use_transport, \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120}
121
fangxiaozhi07c7be32013-02-04 15:14:46 +0800122#define UNUSUAL_VENDOR_INTF(idVendor, cl, sc, pr, \
123 vendor_name, product_name, use_protocol, use_transport, \
124 init_function, Flags) \
125{ \
126 .vendorName = vendor_name, \
127 .productName = product_name, \
128 .useProtocol = use_protocol, \
129 .useTransport = use_transport, \
130 .initFunction = init_function, \
131}
132
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133static struct us_unusual_dev us_unusual_dev_list[] = {
Jeffrin Josea1631062012-05-17 00:33:36 +0530134# include "unusual_devs.h"
Alan Sterne6e244b2009-02-12 14:47:44 -0500135 { } /* Terminating entry */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136};
137
Huajun Lifd7ff362012-01-14 10:16:40 +0800138static struct us_unusual_dev for_dynamic_ids =
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +0200139 USUAL_DEV(USB_SC_SCSI, USB_PR_BULK);
Huajun Lifd7ff362012-01-14 10:16:40 +0800140
Alan Sterne6e244b2009-02-12 14:47:44 -0500141#undef UNUSUAL_DEV
142#undef COMPLIANT_DEV
143#undef USUAL_DEV
fangxiaozhi07c7be32013-02-04 15:14:46 +0800144#undef UNUSUAL_VENDOR_INTF
Alan Sterne6e244b2009-02-12 14:47:44 -0500145
Ming Leic825bab2012-03-19 15:20:57 +0800146#ifdef CONFIG_LOCKDEP
147
148static struct lock_class_key us_interface_key[USB_MAXINTERFACES];
149
150static void us_set_lock_class(struct mutex *mutex,
151 struct usb_interface *intf)
152{
153 struct usb_device *udev = interface_to_usbdev(intf);
154 struct usb_host_config *config = udev->actconfig;
155 int i;
156
157 for (i = 0; i < config->desc.bNumInterfaces; i++) {
158 if (config->interface[i] == intf)
159 break;
160 }
161
162 BUG_ON(i == config->desc.bNumInterfaces);
163
164 lockdep_set_class(mutex, &us_interface_key[i]);
165}
166
167#else
168
169static void us_set_lock_class(struct mutex *mutex,
170 struct usb_interface *intf)
171{
172}
173
174#endif
Alan Sternce2596d2005-10-23 19:41:39 -0700175
176#ifdef CONFIG_PM /* Minimal support for suspend and resume */
177
Alan Sterne6e244b2009-02-12 14:47:44 -0500178int usb_stor_suspend(struct usb_interface *iface, pm_message_t message)
Alan Sternce2596d2005-10-23 19:41:39 -0700179{
180 struct us_data *us = usb_get_intfdata(iface);
181
182 /* Wait until no command is running */
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100183 mutex_lock(&us->dev_mutex);
Alan Sternce2596d2005-10-23 19:41:39 -0700184
Matthew Dharm7931e1c2005-12-04 21:56:51 -0800185 if (us->suspend_resume_hook)
186 (us->suspend_resume_hook)(us, US_SUSPEND);
Alan Sternce2596d2005-10-23 19:41:39 -0700187
Greg Kroah-Hartmand5268752007-09-13 06:01:24 -0700188 /* When runtime PM is working, we'll set a flag to indicate
189 * whether we should autoresume when a SCSI request arrives. */
190
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100191 mutex_unlock(&us->dev_mutex);
Alan Sternce2596d2005-10-23 19:41:39 -0700192 return 0;
193}
Alan Sterne6e244b2009-02-12 14:47:44 -0500194EXPORT_SYMBOL_GPL(usb_stor_suspend);
Alan Sternce2596d2005-10-23 19:41:39 -0700195
Alan Sterne6e244b2009-02-12 14:47:44 -0500196int usb_stor_resume(struct usb_interface *iface)
Alan Sternce2596d2005-10-23 19:41:39 -0700197{
198 struct us_data *us = usb_get_intfdata(iface);
199
Greg Kroah-Hartmand5268752007-09-13 06:01:24 -0700200 mutex_lock(&us->dev_mutex);
Alan Stern8dfe4b12007-07-06 14:24:27 -0400201
Matthew Dharm7931e1c2005-12-04 21:56:51 -0800202 if (us->suspend_resume_hook)
203 (us->suspend_resume_hook)(us, US_RESUME);
Alan Sternce2596d2005-10-23 19:41:39 -0700204
Greg Kroah-Hartmand5268752007-09-13 06:01:24 -0700205 mutex_unlock(&us->dev_mutex);
Alan Sternce2596d2005-10-23 19:41:39 -0700206 return 0;
207}
Alan Sterne6e244b2009-02-12 14:47:44 -0500208EXPORT_SYMBOL_GPL(usb_stor_resume);
Alan Sternce2596d2005-10-23 19:41:39 -0700209
Alan Sterne6e244b2009-02-12 14:47:44 -0500210int usb_stor_reset_resume(struct usb_interface *iface)
Alan Sternf07600c2007-05-30 15:38:16 -0400211{
212 struct us_data *us = usb_get_intfdata(iface);
213
Alan Sternf07600c2007-05-30 15:38:16 -0400214 /* Report the reset to the SCSI core */
215 usb_stor_report_bus_reset(us);
216
217 /* FIXME: Notify the subdrivers that they need to reinitialize
218 * the device */
219 return 0;
220}
Alan Sterne6e244b2009-02-12 14:47:44 -0500221EXPORT_SYMBOL_GPL(usb_stor_reset_resume);
Alan Sternf07600c2007-05-30 15:38:16 -0400222
Alan Sternce2596d2005-10-23 19:41:39 -0700223#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224
225/*
Alan Stern47104b02006-06-01 13:52:56 -0400226 * The next two routines get called just before and just after
227 * a USB port reset, whether from this driver or a different one.
228 */
229
Alan Sterne6e244b2009-02-12 14:47:44 -0500230int usb_stor_pre_reset(struct usb_interface *iface)
Alan Stern47104b02006-06-01 13:52:56 -0400231{
232 struct us_data *us = usb_get_intfdata(iface);
233
Alan Stern47104b02006-06-01 13:52:56 -0400234 /* Make sure no command runs during the reset */
235 mutex_lock(&us->dev_mutex);
Alan Sternf07600c2007-05-30 15:38:16 -0400236 return 0;
Alan Stern47104b02006-06-01 13:52:56 -0400237}
Alan Sterne6e244b2009-02-12 14:47:44 -0500238EXPORT_SYMBOL_GPL(usb_stor_pre_reset);
Alan Stern47104b02006-06-01 13:52:56 -0400239
Alan Sterne6e244b2009-02-12 14:47:44 -0500240int usb_stor_post_reset(struct usb_interface *iface)
Alan Stern47104b02006-06-01 13:52:56 -0400241{
242 struct us_data *us = usb_get_intfdata(iface);
243
Alan Stern47104b02006-06-01 13:52:56 -0400244 /* Report the reset to the SCSI core */
Alan Stern47104b02006-06-01 13:52:56 -0400245 usb_stor_report_bus_reset(us);
Alan Stern47104b02006-06-01 13:52:56 -0400246
247 /* FIXME: Notify the subdrivers that they need to reinitialize
248 * the device */
Alan Stern0458d5b2007-05-04 11:52:20 -0400249
Alan Sternf07600c2007-05-30 15:38:16 -0400250 mutex_unlock(&us->dev_mutex);
251 return 0;
Alan Stern47104b02006-06-01 13:52:56 -0400252}
Alan Sterne6e244b2009-02-12 14:47:44 -0500253EXPORT_SYMBOL_GPL(usb_stor_post_reset);
Alan Stern47104b02006-06-01 13:52:56 -0400254
255/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 * fill_inquiry_response takes an unsigned char array (which must
257 * be at least 36 characters) and populates the vendor name,
258 * product name, and revision fields. Then the array is copied
259 * into the SCSI command's response buffer (oddly enough
260 * called request_buffer). data_len contains the length of the
261 * data array, which again must be at least 36.
262 */
263
264void fill_inquiry_response(struct us_data *us, unsigned char *data,
265 unsigned int data_len)
266{
Jeffrin Josea1631062012-05-17 00:33:36 +0530267 if (data_len < 36) /* You lose. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268 return;
269
Alan Sternf3f6faa2009-12-07 16:47:43 -0500270 memset(data+8, ' ', 28);
Jeffrin Josedb2c8622012-05-17 00:34:28 +0530271 if (data[0]&0x20) { /* USB device currently not connected. Return
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272 peripheral qualifier 001b ("...however, the
273 physical device is not currently connected
274 to this logical unit") and leave vendor and
275 product identification empty. ("If the target
276 does store some of the INQUIRY data on the
Jeffrin Josea1631062012-05-17 00:33:36 +0530277 device, it may return zeros or ASCII spaces
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 (20h) in those fields until the data is
279 available from the device."). */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 } else {
281 u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice);
Alan Sternf3f6faa2009-12-07 16:47:43 -0500282 int n;
283
284 n = strlen(us->unusual_dev->vendorName);
285 memcpy(data+8, us->unusual_dev->vendorName, min(8, n));
286 n = strlen(us->unusual_dev->productName);
287 memcpy(data+16, us->unusual_dev->productName, min(16, n));
288
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 data[32] = 0x30 + ((bcdDevice>>12) & 0x0F);
290 data[33] = 0x30 + ((bcdDevice>>8) & 0x0F);
291 data[34] = 0x30 + ((bcdDevice>>4) & 0x0F);
292 data[35] = 0x30 + ((bcdDevice) & 0x0F);
293 }
294
295 usb_stor_set_xfer_buf(data, data_len, us->srb);
296}
Alan Sterne6e244b2009-02-12 14:47:44 -0500297EXPORT_SYMBOL_GPL(fill_inquiry_response);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298
299static int usb_stor_control_thread(void * __us)
300{
301 struct us_data *us = (struct us_data *)__us;
302 struct Scsi_Host *host = us_to_host(us);
303
Jeffrin Josedb2c8622012-05-17 00:34:28 +0530304 for (;;) {
Joe Perches191648d2013-04-19 11:44:00 -0700305 usb_stor_dbg(us, "*** thread sleeping\n");
Alan Stern7119e3c2008-05-01 15:36:13 -0400306 if (wait_for_completion_interruptible(&us->cmnd_ready))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 break;
Alan Stern7119e3c2008-05-01 15:36:13 -0400308
Joe Perches191648d2013-04-19 11:44:00 -0700309 usb_stor_dbg(us, "*** thread awakened\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310
311 /* lock the device pointers */
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100312 mutex_lock(&(us->dev_mutex));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314 /* lock access to the state */
315 scsi_lock(host);
316
Alan Stern543f7812008-05-08 11:55:59 -0400317 /* When we are called with no command pending, we're done */
318 if (us->srb == NULL) {
319 scsi_unlock(host);
320 mutex_unlock(&us->dev_mutex);
Joe Perches191648d2013-04-19 11:44:00 -0700321 usb_stor_dbg(us, "-- exiting\n");
Alan Stern543f7812008-05-08 11:55:59 -0400322 break;
323 }
324
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 /* has the command timed out *already* ? */
Alan Stern7e4d6c32008-05-01 15:35:18 -0400326 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 us->srb->result = DID_ABORT << 16;
328 goto SkipForAbort;
329 }
330
331 scsi_unlock(host);
332
Jeffrin Josea1631062012-05-17 00:33:36 +0530333 /* reject the command if the direction indicator
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334 * is UNKNOWN
335 */
336 if (us->srb->sc_data_direction == DMA_BIDIRECTIONAL) {
Joe Perches191648d2013-04-19 11:44:00 -0700337 usb_stor_dbg(us, "UNKNOWN data direction\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 us->srb->result = DID_ERROR << 16;
339 }
340
341 /* reject if target != 0 or if LUN is higher than
342 * the maximum known LUN
343 */
Jeffrin Josea1631062012-05-17 00:33:36 +0530344 else if (us->srb->device->id &&
Alan Stern7e4d6c32008-05-01 15:35:18 -0400345 !(us->fflags & US_FL_SCM_MULT_TARG)) {
Joe Perches191648d2013-04-19 11:44:00 -0700346 usb_stor_dbg(us, "Bad target number (%d:%d)\n",
347 us->srb->device->id, us->srb->device->lun);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 us->srb->result = DID_BAD_TARGET << 16;
349 }
350
351 else if (us->srb->device->lun > us->max_lun) {
Joe Perches191648d2013-04-19 11:44:00 -0700352 usb_stor_dbg(us, "Bad LUN (%d:%d)\n",
353 us->srb->device->id, us->srb->device->lun);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 us->srb->result = DID_BAD_TARGET << 16;
355 }
356
Jeffrin Josea1631062012-05-17 00:33:36 +0530357 /* Handle those devices which need us to fake
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358 * their inquiry data */
359 else if ((us->srb->cmnd[0] == INQUIRY) &&
Alan Stern7e4d6c32008-05-01 15:35:18 -0400360 (us->fflags & US_FL_FIX_INQUIRY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361 unsigned char data_ptr[36] = {
362 0x00, 0x80, 0x02, 0x02,
363 0x1F, 0x00, 0x00, 0x00};
364
Joe Perches191648d2013-04-19 11:44:00 -0700365 usb_stor_dbg(us, "Faking INQUIRY command\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 fill_inquiry_response(us, data_ptr, 36);
367 us->srb->result = SAM_STAT_GOOD;
368 }
369
370 /* we've got a command, let's do it! */
371 else {
Joe Perches191648d2013-04-19 11:44:00 -0700372 US_DEBUG(usb_stor_show_command(us, us->srb));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 us->proto_handler(us->srb, us);
Alan Sternf2839252010-07-28 17:12:39 -0400374 usb_mark_last_busy(us->pusb_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 }
376
377 /* lock access to the state */
378 scsi_lock(host);
379
380 /* indicate that the command is done */
Alan Stern543f7812008-05-08 11:55:59 -0400381 if (us->srb->result != DID_ABORT << 16) {
Joe Perches191648d2013-04-19 11:44:00 -0700382 usb_stor_dbg(us, "scsi cmd done, result=0x%x\n",
383 us->srb->result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 us->srb->scsi_done(us->srb);
385 } else {
386SkipForAbort:
Joe Perches191648d2013-04-19 11:44:00 -0700387 usb_stor_dbg(us, "scsi command aborted\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 }
389
390 /* If an abort request was received we need to signal that
391 * the abort has finished. The proper test for this is
392 * the TIMED_OUT flag, not srb->result == DID_ABORT, because
Matthew Dharm226173e2005-08-25 20:03:50 -0700393 * the timeout might have occurred after the command had
394 * already completed with a different result code. */
Alan Stern7e4d6c32008-05-01 15:35:18 -0400395 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 complete(&(us->notify));
397
Matthew Dharm226173e2005-08-25 20:03:50 -0700398 /* Allow USB transfers to resume */
Alan Stern7e4d6c32008-05-01 15:35:18 -0400399 clear_bit(US_FLIDX_ABORTING, &us->dflags);
400 clear_bit(US_FLIDX_TIMED_OUT, &us->dflags);
Matthew Dharm226173e2005-08-25 20:03:50 -0700401 }
402
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403 /* finished working on this command */
404 us->srb = NULL;
405 scsi_unlock(host);
406
407 /* unlock the device pointers */
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100408 mutex_unlock(&us->dev_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 } /* for (;;) */
410
Alan Sterned76cac2007-06-07 17:12:25 -0400411 /* Wait until we are told to stop */
412 for (;;) {
413 set_current_state(TASK_INTERRUPTIBLE);
414 if (kthread_should_stop())
415 break;
416 schedule();
417 }
418 __set_current_state(TASK_RUNNING);
419 return 0;
Jeffrin Josea1631062012-05-17 00:33:36 +0530420}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
422/***********************************************************************
423 * Device probing and disconnecting
424 ***********************************************************************/
425
426/* Associate our private data with the USB device */
427static int associate_dev(struct us_data *us, struct usb_interface *intf)
428{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429 /* Fill in the device-related fields */
430 us->pusb_dev = interface_to_usbdev(intf);
431 us->pusb_intf = intf;
432 us->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
Joe Perches191648d2013-04-19 11:44:00 -0700433 usb_stor_dbg(us, "Vendor: 0x%04x, Product: 0x%04x, Revision: 0x%04x\n",
434 le16_to_cpu(us->pusb_dev->descriptor.idVendor),
435 le16_to_cpu(us->pusb_dev->descriptor.idProduct),
436 le16_to_cpu(us->pusb_dev->descriptor.bcdDevice));
437 usb_stor_dbg(us, "Interface Subclass: 0x%02x, Protocol: 0x%02x\n",
438 intf->cur_altsetting->desc.bInterfaceSubClass,
439 intf->cur_altsetting->desc.bInterfaceProtocol);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440
441 /* Store our private data in the interface */
442 usb_set_intfdata(intf, us);
443
Alan Stern0ede76f2010-03-05 15:10:17 -0500444 /* Allocate the control/setup and DMA-mapped buffers */
445 us->cr = kmalloc(sizeof(*us->cr), GFP_KERNEL);
Joe Perches191648d2013-04-19 11:44:00 -0700446 if (!us->cr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448
Daniel Mack997ea582010-04-12 13:17:25 +0200449 us->iobuf = usb_alloc_coherent(us->pusb_dev, US_IOBUF_SIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450 GFP_KERNEL, &us->iobuf_dma);
451 if (!us->iobuf) {
Joe Perches191648d2013-04-19 11:44:00 -0700452 usb_stor_dbg(us, "I/O buffer allocation failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 return -ENOMEM;
454 }
455 return 0;
456}
457
Alan Sternc838ea42008-12-15 10:40:06 -0500458/* Works only for digits and letters, but small and fast */
459#define TOLOWER(x) ((x) | 0x20)
460
Alan Sternd4f373e2008-11-10 14:07:45 -0500461/* Adjust device flags based on the "quirks=" module parameter */
462static void adjust_quirks(struct us_data *us)
463{
Alan Sternc838ea42008-12-15 10:40:06 -0500464 char *p;
465 u16 vid = le16_to_cpu(us->pusb_dev->descriptor.idVendor);
466 u16 pid = le16_to_cpu(us->pusb_dev->descriptor.idProduct);
467 unsigned f = 0;
Alan Sterna91b5932009-12-22 23:16:32 -0500468 unsigned int mask = (US_FL_SANE_SENSE | US_FL_BAD_SENSE |
469 US_FL_FIX_CAPACITY |
Alan Sternc838ea42008-12-15 10:40:06 -0500470 US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE |
Alan Sternd4f373e2008-11-10 14:07:45 -0500471 US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 |
Alan Sternc838ea42008-12-15 10:40:06 -0500472 US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE |
Karl Relton51169012011-05-18 21:42:34 +0100473 US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT |
Alan Stern21c13a42011-06-07 11:35:52 -0400474 US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 |
Namjae Jeoneaa05df2012-07-07 23:05:28 -0400475 US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE);
Alan Sternd4f373e2008-11-10 14:07:45 -0500476
Alan Sternc838ea42008-12-15 10:40:06 -0500477 p = quirks;
478 while (*p) {
479 /* Each entry consists of VID:PID:flags */
480 if (vid == simple_strtoul(p, &p, 16) &&
481 *p == ':' &&
482 pid == simple_strtoul(p+1, &p, 16) &&
483 *p == ':')
Alan Sternd4f373e2008-11-10 14:07:45 -0500484 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500485
486 /* Move forward to the next entry */
487 while (*p) {
488 if (*p++ == ',')
489 break;
Alan Sternd4f373e2008-11-10 14:07:45 -0500490 }
491 }
Alan Sternc838ea42008-12-15 10:40:06 -0500492 if (!*p) /* No match */
493 return;
494
495 /* Collect the flags */
496 while (*++p && *p != ',') {
497 switch (TOLOWER(*p)) {
498 case 'a':
499 f |= US_FL_SANE_SENSE;
500 break;
Alan Sterna0bb1082009-12-07 16:39:16 -0500501 case 'b':
502 f |= US_FL_BAD_SENSE;
503 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500504 case 'c':
505 f |= US_FL_FIX_CAPACITY;
506 break;
Karl Relton51169012011-05-18 21:42:34 +0100507 case 'd':
508 f |= US_FL_NO_READ_DISC_INFO;
509 break;
510 case 'e':
511 f |= US_FL_NO_READ_CAPACITY_16;
512 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500513 case 'h':
514 f |= US_FL_CAPACITY_HEURISTICS;
515 break;
516 case 'i':
517 f |= US_FL_IGNORE_DEVICE;
518 break;
519 case 'l':
520 f |= US_FL_NOT_LOCKABLE;
521 break;
522 case 'm':
523 f |= US_FL_MAX_SECTORS_64;
524 break;
Alan Stern21c13a42011-06-07 11:35:52 -0400525 case 'n':
526 f |= US_FL_INITIAL_READ10;
527 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500528 case 'o':
529 f |= US_FL_CAPACITY_OK;
530 break;
Namjae Jeoneaa05df2012-07-07 23:05:28 -0400531 case 'p':
532 f |= US_FL_WRITE_CACHE;
533 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500534 case 'r':
535 f |= US_FL_IGNORE_RESIDUE;
536 break;
537 case 's':
538 f |= US_FL_SINGLE_LUN;
539 break;
540 case 'w':
541 f |= US_FL_NO_WP_DETECT;
542 break;
543 /* Ignore unrecognized flag characters */
544 }
545 }
546 us->fflags = (us->fflags & ~mask) | f;
Alan Sternd4f373e2008-11-10 14:07:45 -0500547}
548
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549/* Get the unusual_devs entries and the string descriptors */
Alan Sterne6e244b2009-02-12 14:47:44 -0500550static int get_device_info(struct us_data *us, const struct usb_device_id *id,
551 struct us_unusual_dev *unusual_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552{
553 struct usb_device *dev = us->pusb_dev;
554 struct usb_interface_descriptor *idesc =
555 &us->pusb_intf->cur_altsetting->desc;
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300556 struct device *pdev = &us->pusb_intf->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557
558 /* Store the entries */
559 us->unusual_dev = unusual_dev;
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200560 us->subclass = (unusual_dev->useProtocol == USB_SC_DEVICE) ?
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 idesc->bInterfaceSubClass :
562 unusual_dev->useProtocol;
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200563 us->protocol = (unusual_dev->useTransport == USB_PR_DEVICE) ?
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564 idesc->bInterfaceProtocol :
565 unusual_dev->useTransport;
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +0200566 us->fflags = id->driver_info;
Alan Sternd4f373e2008-11-10 14:07:45 -0500567 adjust_quirks(us);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568
Alan Stern7e4d6c32008-05-01 15:35:18 -0400569 if (us->fflags & US_FL_IGNORE_DEVICE) {
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300570 dev_info(pdev, "device ignored\n");
Daniel Drake3c332422006-07-26 13:59:23 +0100571 return -ENODEV;
572 }
573
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574 /*
575 * This flag is only needed when we're in high-speed, so let's
576 * disable it if we're in full-speed
577 */
578 if (dev->speed != USB_SPEED_HIGH)
Alan Stern7e4d6c32008-05-01 15:35:18 -0400579 us->fflags &= ~US_FL_GO_SLOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580
Felipe Contreras39f2f082010-05-16 23:31:07 +0300581 if (us->fflags)
582 dev_info(pdev, "Quirks match for vid %04x pid %04x: %lx\n",
583 le16_to_cpu(dev->descriptor.idVendor),
584 le16_to_cpu(dev->descriptor.idProduct),
585 us->fflags);
586
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587 /* Log a message if a non-generic unusual_dev entry contains an
588 * unnecessary subclass or protocol override. This may stimulate
589 * reports from users that will help us remove unneeded entries
590 * from the unusual_devs.h table.
591 */
592 if (id->idVendor || id->idProduct) {
Arjan van de Ven4c4c9432005-11-29 09:43:42 +0100593 static const char *msgs[3] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594 "an unneeded SubClass entry",
595 "an unneeded Protocol entry",
596 "unneeded SubClass and Protocol entries"};
597 struct usb_device_descriptor *ddesc = &dev->descriptor;
598 int msg = -1;
599
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200600 if (unusual_dev->useProtocol != USB_SC_DEVICE &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601 us->subclass == idesc->bInterfaceSubClass)
602 msg += 1;
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200603 if (unusual_dev->useTransport != USB_PR_DEVICE &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604 us->protocol == idesc->bInterfaceProtocol)
605 msg += 2;
Alan Stern7e4d6c32008-05-01 15:35:18 -0400606 if (msg >= 0 && !(us->fflags & US_FL_NEED_OVERRIDE))
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300607 dev_notice(pdev, "This device "
608 "(%04x,%04x,%04x S %02x P %02x)"
609 " has %s in unusual_devs.h (kernel"
610 " %s)\n"
611 " Please send a copy of this message to "
612 "<linux-usb@vger.kernel.org> and "
613 "<usb-storage@lists.one-eyed-alien.net>\n",
614 le16_to_cpu(ddesc->idVendor),
615 le16_to_cpu(ddesc->idProduct),
616 le16_to_cpu(ddesc->bcdDevice),
617 idesc->bInterfaceSubClass,
618 idesc->bInterfaceProtocol,
619 msgs[msg],
620 utsname()->release);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 }
Daniel Drake3c332422006-07-26 13:59:23 +0100622
623 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624}
625
626/* Get the transport settings */
Alan Sterne6e244b2009-02-12 14:47:44 -0500627static void get_transport(struct us_data *us)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628{
629 switch (us->protocol) {
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200630 case USB_PR_CB:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631 us->transport_name = "Control/Bulk";
632 us->transport = usb_stor_CB_transport;
633 us->transport_reset = usb_stor_CB_reset;
634 us->max_lun = 7;
635 break;
636
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200637 case USB_PR_CBI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 us->transport_name = "Control/Bulk/Interrupt";
Alan Stern64648a92008-11-20 14:20:03 -0500639 us->transport = usb_stor_CB_transport;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 us->transport_reset = usb_stor_CB_reset;
641 us->max_lun = 7;
642 break;
643
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200644 case USB_PR_BULK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645 us->transport_name = "Bulk";
646 us->transport = usb_stor_Bulk_transport;
647 us->transport_reset = usb_stor_Bulk_reset;
648 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650}
651
652/* Get the protocol settings */
Alan Sterne6e244b2009-02-12 14:47:44 -0500653static void get_protocol(struct us_data *us)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654{
655 switch (us->subclass) {
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200656 case USB_SC_RBC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657 us->protocol_name = "Reduced Block Commands (RBC)";
658 us->proto_handler = usb_stor_transparent_scsi_command;
659 break;
660
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200661 case USB_SC_8020:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 us->protocol_name = "8020i";
Alan Stern3dae5342008-11-20 14:22:18 -0500663 us->proto_handler = usb_stor_pad12_command;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 us->max_lun = 0;
665 break;
666
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200667 case USB_SC_QIC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668 us->protocol_name = "QIC-157";
Alan Stern3dae5342008-11-20 14:22:18 -0500669 us->proto_handler = usb_stor_pad12_command;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 us->max_lun = 0;
671 break;
672
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200673 case USB_SC_8070:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 us->protocol_name = "8070i";
Alan Stern3dae5342008-11-20 14:22:18 -0500675 us->proto_handler = usb_stor_pad12_command;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 us->max_lun = 0;
677 break;
678
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200679 case USB_SC_SCSI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 us->protocol_name = "Transparent SCSI";
681 us->proto_handler = usb_stor_transparent_scsi_command;
682 break;
683
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200684 case USB_SC_UFI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 us->protocol_name = "Uniform Floppy Interface (UFI)";
686 us->proto_handler = usb_stor_ufi_command;
687 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689}
690
691/* Get the pipe settings */
692static int get_pipes(struct us_data *us)
693{
694 struct usb_host_interface *altsetting =
695 us->pusb_intf->cur_altsetting;
696 int i;
697 struct usb_endpoint_descriptor *ep;
698 struct usb_endpoint_descriptor *ep_in = NULL;
699 struct usb_endpoint_descriptor *ep_out = NULL;
700 struct usb_endpoint_descriptor *ep_int = NULL;
701
702 /*
Alan Stern1096f782007-01-22 11:58:34 -0500703 * Find the first endpoint of each type we need.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 * We are expecting a minimum of 2 endpoints - in and out (bulk).
Alan Stern1096f782007-01-22 11:58:34 -0500705 * An optional interrupt-in is OK (necessary for CBI protocol).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 * We will ignore any others.
707 */
708 for (i = 0; i < altsetting->desc.bNumEndpoints; i++) {
709 ep = &altsetting->endpoint[i].desc;
710
Luiz Fernando N. Capitulino04720742006-10-26 13:03:03 -0300711 if (usb_endpoint_xfer_bulk(ep)) {
Alan Stern1096f782007-01-22 11:58:34 -0500712 if (usb_endpoint_dir_in(ep)) {
713 if (!ep_in)
714 ep_in = ep;
715 } else {
716 if (!ep_out)
717 ep_out = ep;
718 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 }
720
Alan Stern1096f782007-01-22 11:58:34 -0500721 else if (usb_endpoint_is_int_in(ep)) {
722 if (!ep_int)
723 ep_int = ep;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 }
725 }
726
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200727 if (!ep_in || !ep_out || (us->protocol == USB_PR_CBI && !ep_int)) {
Joe Perches191648d2013-04-19 11:44:00 -0700728 usb_stor_dbg(us, "Endpoint sanity check failed! Rejecting dev.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 return -EIO;
730 }
731
732 /* Calculate and store the pipe values */
733 us->send_ctrl_pipe = usb_sndctrlpipe(us->pusb_dev, 0);
734 us->recv_ctrl_pipe = usb_rcvctrlpipe(us->pusb_dev, 0);
735 us->send_bulk_pipe = usb_sndbulkpipe(us->pusb_dev,
Julia Lawall2e0fe702008-12-29 11:22:14 +0100736 usb_endpoint_num(ep_out));
Jeffrin Josea1631062012-05-17 00:33:36 +0530737 us->recv_bulk_pipe = usb_rcvbulkpipe(us->pusb_dev,
Julia Lawall2e0fe702008-12-29 11:22:14 +0100738 usb_endpoint_num(ep_in));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 if (ep_int) {
740 us->recv_intr_pipe = usb_rcvintpipe(us->pusb_dev,
Julia Lawall2e0fe702008-12-29 11:22:14 +0100741 usb_endpoint_num(ep_int));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 us->ep_bInterval = ep_int->bInterval;
743 }
744 return 0;
745}
746
747/* Initialize all the dynamic resources we need */
748static int usb_stor_acquire_resources(struct us_data *us)
749{
750 int p;
Alan Stern3f13e662005-10-23 19:43:36 -0700751 struct task_struct *th;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752
753 us->current_urb = usb_alloc_urb(0, GFP_KERNEL);
754 if (!us->current_urb) {
Joe Perches191648d2013-04-19 11:44:00 -0700755 usb_stor_dbg(us, "URB allocation failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 return -ENOMEM;
757 }
758
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759 /* Just before we start our control thread, initialize
760 * the device if it needs initialization */
Alan Sternb876aef2005-10-23 19:38:56 -0700761 if (us->unusual_dev->initFunction) {
762 p = us->unusual_dev->initFunction(us);
763 if (p)
764 return p;
765 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766
767 /* Start up our control thread */
Alan Sterned76cac2007-06-07 17:12:25 -0400768 th = kthread_run(usb_stor_control_thread, us, "usb-storage");
Alan Stern3f13e662005-10-23 19:43:36 -0700769 if (IS_ERR(th)) {
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300770 dev_warn(&us->pusb_intf->dev,
771 "Unable to start control thread\n");
Alan Stern3f13e662005-10-23 19:43:36 -0700772 return PTR_ERR(th);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773 }
Alan Sterned76cac2007-06-07 17:12:25 -0400774 us->ctl_thread = th;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775
776 return 0;
777}
778
779/* Release all our dynamic resources */
780static void usb_stor_release_resources(struct us_data *us)
781{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 /* Tell the control thread to exit. The SCSI host must
Alan Stern543f7812008-05-08 11:55:59 -0400783 * already have been removed and the DISCONNECTING flag set
784 * so that we won't accept any more commands.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 */
Joe Perches191648d2013-04-19 11:44:00 -0700786 usb_stor_dbg(us, "-- sending exit command to thread\n");
Alan Stern7119e3c2008-05-01 15:36:13 -0400787 complete(&us->cmnd_ready);
Alan Sterned76cac2007-06-07 17:12:25 -0400788 if (us->ctl_thread)
789 kthread_stop(us->ctl_thread);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790
791 /* Call the destructor routine, if it exists */
792 if (us->extra_destructor) {
Joe Perches191648d2013-04-19 11:44:00 -0700793 usb_stor_dbg(us, "-- calling extra_destructor()\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794 us->extra_destructor(us->extra);
795 }
796
797 /* Free the extra data and the URB */
798 kfree(us->extra);
799 usb_free_urb(us->current_urb);
800}
801
802/* Dissociate from the USB device */
803static void dissociate_dev(struct us_data *us)
804{
Alan Stern0ede76f2010-03-05 15:10:17 -0500805 /* Free the buffers */
806 kfree(us->cr);
Daniel Mack997ea582010-04-12 13:17:25 +0200807 usb_free_coherent(us->pusb_dev, US_IOBUF_SIZE, us->iobuf, us->iobuf_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808
809 /* Remove our private data from the interface */
810 usb_set_intfdata(us->pusb_intf, NULL);
811}
812
Alan Stern543f7812008-05-08 11:55:59 -0400813/* First stage of disconnect processing: stop SCSI scanning,
814 * remove the host, and stop accepting new commands
815 */
Matthew Dharm77f46322005-07-28 14:44:29 -0700816static void quiesce_and_remove_host(struct us_data *us)
817{
Alan Sterneecd11e2006-06-19 14:50:15 -0400818 struct Scsi_Host *host = us_to_host(us);
819
Alan Stern543f7812008-05-08 11:55:59 -0400820 /* If the device is really gone, cut short reset delays */
Alan Sternbb94a402012-02-21 13:16:32 -0500821 if (us->pusb_dev->state == USB_STATE_NOTATTACHED) {
Alan Stern543f7812008-05-08 11:55:59 -0400822 set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
Alan Sternbb94a402012-02-21 13:16:32 -0500823 wake_up(&us->delay_wait);
824 }
Alan Stern543f7812008-05-08 11:55:59 -0400825
Alan Sternbb94a402012-02-21 13:16:32 -0500826 /* Prevent SCSI scanning (if it hasn't started yet)
827 * or wait for the SCSI-scanning routine to stop.
Alan Stern543f7812008-05-08 11:55:59 -0400828 */
Alan Sternbb94a402012-02-21 13:16:32 -0500829 cancel_delayed_work_sync(&us->scan_dwork);
830
831 /* Balance autopm calls if scanning was cancelled */
832 if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags))
833 usb_autopm_put_interface_no_suspend(us->pusb_intf);
Alan Stern543f7812008-05-08 11:55:59 -0400834
835 /* Removing the host will perform an orderly shutdown: caches
836 * synchronized, disks spun down, etc.
837 */
838 scsi_remove_host(host);
839
840 /* Prevent any new commands from being accepted and cut short
841 * reset delays.
842 */
Alan Sterneecd11e2006-06-19 14:50:15 -0400843 scsi_lock(host);
Alan Stern7e4d6c32008-05-01 15:35:18 -0400844 set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
Alan Sterneecd11e2006-06-19 14:50:15 -0400845 scsi_unlock(host);
Matthew Dharm77f46322005-07-28 14:44:29 -0700846 wake_up(&us->delay_wait);
Matthew Dharm77f46322005-07-28 14:44:29 -0700847}
848
849/* Second stage of disconnect processing: deallocate all resources */
850static void release_everything(struct us_data *us)
851{
852 usb_stor_release_resources(us);
853 dissociate_dev(us);
854
855 /* Drop our reference to the host; the SCSI core will free it
856 * (and "us" along with it) when the refcount becomes 0. */
857 scsi_host_put(us_to_host(us));
858}
859
Alan Sternbb94a402012-02-21 13:16:32 -0500860/* Delayed-work routine to carry out SCSI-device scanning */
861static void usb_stor_scan_dwork(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862{
Alan Sternbb94a402012-02-21 13:16:32 -0500863 struct us_data *us = container_of(work, struct us_data,
864 scan_dwork.work);
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300865 struct device *dev = &us->pusb_intf->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866
Alan Sternbb94a402012-02-21 13:16:32 -0500867 dev_dbg(dev, "starting scan\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868
Alan Sternbb94a402012-02-21 13:16:32 -0500869 /* For bulk-only devices, determine the max LUN value */
870 if (us->protocol == USB_PR_BULK && !(us->fflags & US_FL_SINGLE_LUN)) {
871 mutex_lock(&us->dev_mutex);
872 us->max_lun = usb_stor_Bulk_max_lun(us);
873 mutex_unlock(&us->dev_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874 }
Alan Sternbb94a402012-02-21 13:16:32 -0500875 scsi_scan_host(us_to_host(us));
876 dev_dbg(dev, "scan complete\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877
Alan Sternbb94a402012-02-21 13:16:32 -0500878 /* Should we unbind if no devices were detected? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879
Alan Sternf2839252010-07-28 17:12:39 -0400880 usb_autopm_put_interface(us->pusb_intf);
Alan Sternbb94a402012-02-21 13:16:32 -0500881 clear_bit(US_FLIDX_SCAN_PENDING, &us->dflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882}
883
David Vrabel4c1bd3d2009-08-24 14:44:30 +0100884static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf)
885{
886 struct usb_device *usb_dev = interface_to_usbdev(intf);
887
888 if (usb_dev->bus->sg_tablesize) {
889 return usb_dev->bus->sg_tablesize;
890 }
891 return SG_ALL;
892}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893
Alan Sterne6e244b2009-02-12 14:47:44 -0500894/* First part of general USB mass-storage probing */
895int usb_stor_probe1(struct us_data **pus,
896 struct usb_interface *intf,
897 const struct usb_device_id *id,
898 struct us_unusual_dev *unusual_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899{
900 struct Scsi_Host *host;
901 struct us_data *us;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902 int result;
Pete Zaitceva00828e2005-10-22 20:15:09 -0700903
Joe Perches191648d2013-04-19 11:44:00 -0700904 dev_info(&intf->dev, "USB Mass Storage device detected\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700905
906 /*
907 * Ask the SCSI layer to allocate a host structure, with extra
908 * space at the end for our private us_data structure.
909 */
910 host = scsi_host_alloc(&usb_stor_host_template, sizeof(*us));
911 if (!host) {
Joe Perches191648d2013-04-19 11:44:00 -0700912 dev_warn(&intf->dev, "Unable to allocate the scsi host\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913 return -ENOMEM;
914 }
915
Richard Sharpe17f060222007-10-10 10:56:28 -0700916 /*
917 * Allow 16-byte CDBs and thus > 2TB
918 */
919 host->max_cmd_len = 16;
David Vrabel4c1bd3d2009-08-24 14:44:30 +0100920 host->sg_tablesize = usb_stor_sg_tablesize(intf);
Alan Sterne6e244b2009-02-12 14:47:44 -0500921 *pus = us = host_to_us(host);
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100922 mutex_init(&(us->dev_mutex));
Ming Leic825bab2012-03-19 15:20:57 +0800923 us_set_lock_class(&us->dev_mutex, intf);
Alan Stern7119e3c2008-05-01 15:36:13 -0400924 init_completion(&us->cmnd_ready);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 init_completion(&(us->notify));
926 init_waitqueue_head(&us->delay_wait);
Alan Sternbb94a402012-02-21 13:16:32 -0500927 INIT_DELAYED_WORK(&us->scan_dwork, usb_stor_scan_dwork);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928
929 /* Associate the us_data structure with the USB device */
930 result = associate_dev(us, intf);
931 if (result)
932 goto BadDevice;
933
Alan Sterne6e244b2009-02-12 14:47:44 -0500934 /* Get the unusual_devs entries and the descriptors */
935 result = get_device_info(us, id, unusual_dev);
Daniel Drake3c332422006-07-26 13:59:23 +0100936 if (result)
937 goto BadDevice;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938
Alan Sterne6e244b2009-02-12 14:47:44 -0500939 /* Get standard transport and protocol settings */
940 get_transport(us);
941 get_protocol(us);
942
943 /* Give the caller a chance to fill in specialized transport
944 * or protocol settings.
945 */
946 return 0;
947
948BadDevice:
Joe Perches191648d2013-04-19 11:44:00 -0700949 usb_stor_dbg(us, "storage_probe() failed\n");
Alan Sterne6e244b2009-02-12 14:47:44 -0500950 release_everything(us);
951 return result;
952}
953EXPORT_SYMBOL_GPL(usb_stor_probe1);
954
955/* Second part of general USB mass-storage probing */
956int usb_stor_probe2(struct us_data *us)
957{
Alan Sterne6e244b2009-02-12 14:47:44 -0500958 int result;
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300959 struct device *dev = &us->pusb_intf->dev;
Alan Sterne6e244b2009-02-12 14:47:44 -0500960
961 /* Make sure the transport and protocol have both been set */
962 if (!us->transport || !us->proto_handler) {
963 result = -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 goto BadDevice;
Alan Sterne6e244b2009-02-12 14:47:44 -0500965 }
Joe Perches191648d2013-04-19 11:44:00 -0700966 usb_stor_dbg(us, "Transport: %s\n", us->transport_name);
967 usb_stor_dbg(us, "Protocol: %s\n", us->protocol_name);
Alan Sterne6e244b2009-02-12 14:47:44 -0500968
969 /* fix for single-lun devices */
970 if (us->fflags & US_FL_SINGLE_LUN)
971 us->max_lun = 0;
972
Ming Leif4cc1832013-01-19 19:30:30 +0800973 if (!(us->fflags & US_FL_SCM_MULT_TARG))
974 us_to_host(us)->max_id = 1;
975
Alan Sterne6e244b2009-02-12 14:47:44 -0500976 /* Find the endpoints and calculate pipe values */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 result = get_pipes(us);
978 if (result)
979 goto BadDevice;
980
Alan Stern21c13a42011-06-07 11:35:52 -0400981 /*
982 * If the device returns invalid data for the first READ(10)
983 * command, indicate the command should be retried.
984 */
985 if (us->fflags & US_FL_INITIAL_READ10)
986 set_bit(US_FLIDX_REDO_READ10, &us->dflags);
987
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 /* Acquire all the other resources and add the host */
989 result = usb_stor_acquire_resources(us);
990 if (result)
991 goto BadDevice;
Matthew Wilcox00fa43e2009-09-24 16:19:11 -0600992 snprintf(us->scsi_name, sizeof(us->scsi_name), "usb-storage %s",
993 dev_name(&us->pusb_intf->dev));
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300994 result = scsi_add_host(us_to_host(us), dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 if (result) {
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300996 dev_warn(dev,
997 "Unable to add the scsi host\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 goto BadDevice;
999 }
1000
Alan Sternbb94a402012-02-21 13:16:32 -05001001 /* Submit the delayed_work for SCSI-device scanning */
Alan Sternf2839252010-07-28 17:12:39 -04001002 usb_autopm_get_interface_no_resume(us->pusb_intf);
Alan Sternbb94a402012-02-21 13:16:32 -05001003 set_bit(US_FLIDX_SCAN_PENDING, &us->dflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004
Alan Sternbb94a402012-02-21 13:16:32 -05001005 if (delay_use > 0)
1006 dev_dbg(dev, "waiting for device to settle before scanning\n");
1007 queue_delayed_work(system_freezable_wq, &us->scan_dwork,
1008 delay_use * HZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009 return 0;
1010
1011 /* We come here if there are any problems */
1012BadDevice:
Joe Perches191648d2013-04-19 11:44:00 -07001013 usb_stor_dbg(us, "storage_probe() failed\n");
Matthew Dharm77f46322005-07-28 14:44:29 -07001014 release_everything(us);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 return result;
1016}
Alan Sterne6e244b2009-02-12 14:47:44 -05001017EXPORT_SYMBOL_GPL(usb_stor_probe2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018
Alan Sterne6e244b2009-02-12 14:47:44 -05001019/* Handle a USB mass-storage disconnect */
1020void usb_stor_disconnect(struct usb_interface *intf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021{
1022 struct us_data *us = usb_get_intfdata(intf);
1023
Matthew Dharm77f46322005-07-28 14:44:29 -07001024 quiesce_and_remove_host(us);
1025 release_everything(us);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001026}
Alan Sterne6e244b2009-02-12 14:47:44 -05001027EXPORT_SYMBOL_GPL(usb_stor_disconnect);
1028
1029/* The main probe routine for standard devices */
1030static int storage_probe(struct usb_interface *intf,
1031 const struct usb_device_id *id)
1032{
Huajun Lifd7ff362012-01-14 10:16:40 +08001033 struct us_unusual_dev *unusual_dev;
Alan Sterne6e244b2009-02-12 14:47:44 -05001034 struct us_data *us;
1035 int result;
Huajun Lifd7ff362012-01-14 10:16:40 +08001036 int size;
Alan Sterne6e244b2009-02-12 14:47:44 -05001037
1038 /*
Alan Sterne6e244b2009-02-12 14:47:44 -05001039 * If the device isn't standard (is handled by a subdriver
1040 * module) then don't accept it.
1041 */
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +02001042 if (usb_usual_ignore_device(intf))
Alan Sterne6e244b2009-02-12 14:47:44 -05001043 return -ENXIO;
1044
1045 /*
1046 * Call the general probe procedures.
1047 *
1048 * The unusual_dev_list array is parallel to the usb_storage_usb_ids
1049 * table, so we use the index of the id entry to find the
1050 * corresponding unusual_devs entry.
1051 */
Huajun Lifd7ff362012-01-14 10:16:40 +08001052
1053 size = ARRAY_SIZE(us_unusual_dev_list);
1054 if (id >= usb_storage_usb_ids && id < usb_storage_usb_ids + size) {
1055 unusual_dev = (id - usb_storage_usb_ids) + us_unusual_dev_list;
1056 } else {
1057 unusual_dev = &for_dynamic_ids;
1058
Joe Perches191648d2013-04-19 11:44:00 -07001059 dev_dbg(&intf->dev, "Use Bulk-Only transport with the Transparent SCSI protocol for dynamic id: 0x%04x 0x%04x\n",
Huajun Lifd7ff362012-01-14 10:16:40 +08001060 id->idVendor, id->idProduct);
1061 }
1062
1063 result = usb_stor_probe1(&us, intf, id, unusual_dev);
Alan Sterne6e244b2009-02-12 14:47:44 -05001064 if (result)
1065 return result;
1066
1067 /* No special transport or protocol settings in the main module */
1068
1069 result = usb_stor_probe2(us);
1070 return result;
1071}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072
Alan Sternce2596d2005-10-23 19:41:39 -07001073static struct usb_driver usb_storage_driver = {
Alan Sternce2596d2005-10-23 19:41:39 -07001074 .name = "usb-storage",
1075 .probe = storage_probe,
Alan Sterne6e244b2009-02-12 14:47:44 -05001076 .disconnect = usb_stor_disconnect,
1077 .suspend = usb_stor_suspend,
1078 .resume = usb_stor_resume,
1079 .reset_resume = usb_stor_reset_resume,
1080 .pre_reset = usb_stor_pre_reset,
1081 .post_reset = usb_stor_post_reset,
1082 .id_table = usb_storage_usb_ids,
Alan Sternf2839252010-07-28 17:12:39 -04001083 .supports_autosuspend = 1,
Alan Stern543f7812008-05-08 11:55:59 -04001084 .soft_unbind = 1,
Alan Sternce2596d2005-10-23 19:41:39 -07001085};
1086
Greg Kroah-Hartman4601de82013-04-19 11:50:10 -07001087module_usb_driver(usb_storage_driver);