blob: b4c63fcf7b0b7dcaaa387402996845f0031f1ec7 [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>
56#include <linux/init.h>
57#include <linux/slab.h>
Alan Stern3f13e662005-10-23 19:43:36 -070058#include <linux/kthread.h>
Arjan van de Ven4186ecf2006-01-11 15:55:29 +010059#include <linux/mutex.h>
Sam Ravnborg00f8b0c12007-03-05 00:30:55 -080060#include <linux/utsname.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
62#include <scsi/scsi.h>
63#include <scsi/scsi_cmnd.h>
64#include <scsi/scsi_device.h>
65
66#include "usb.h"
67#include "scsiglue.h"
68#include "transport.h"
69#include "protocol.h"
70#include "debug.h"
71#include "initializers.h"
72
Kevin Lloyd32fe5e32008-07-10 14:14:57 -070073#include "sierra_ms.h"
Dan Williams281b0642008-12-14 12:39:22 -050074#include "option_ms.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070075
76/* Some informational data */
77MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>");
78MODULE_DESCRIPTION("USB Mass Storage driver for Linux");
79MODULE_LICENSE("GPL");
80
Linus Torvaldsa4a47bc2010-02-26 10:03:22 -080081static unsigned int delay_use = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -070082module_param(delay_use, uint, S_IRUGO | S_IWUSR);
83MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device");
84
Alan Sternc838ea42008-12-15 10:40:06 -050085static char quirks[128];
86module_param_string(quirks, quirks, sizeof(quirks), S_IRUGO | S_IWUSR);
Alan Sternd4f373e2008-11-10 14:07:45 -050087MODULE_PARM_DESC(quirks, "supplemental list of device IDs and their quirks");
88
Linus Torvalds1da177e2005-04-16 15:20:36 -070089
Pete Zaitceva00828e2005-10-22 20:15:09 -070090/*
91 * The entries in this table correspond, line for line,
Alan Sterne6e244b2009-02-12 14:47:44 -050092 * with the entries in usb_storage_usb_ids[], defined in usual-tables.c.
Linus Torvalds1da177e2005-04-16 15:20:36 -070093 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070094
95/* The vendor name should be kept at eight characters or less, and
96 * the product name should be kept at 16 characters or less. If a device
97 * has the US_FL_FIX_INQUIRY flag, then the vendor and product names
98 * normally generated by a device thorugh the INQUIRY response will be
99 * taken from this list, and this is the reason for the above size
100 * restriction. However, if the flag is not present, then you
101 * are free to use as many characters as you like.
102 */
103
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
105 vendor_name, product_name, use_protocol, use_transport, \
106 init_function, Flags) \
107{ \
108 .vendorName = vendor_name, \
109 .productName = product_name, \
110 .useProtocol = use_protocol, \
111 .useTransport = use_transport, \
112 .initFunction = init_function, \
Pete Zaitceva00828e2005-10-22 20:15:09 -0700113}
114
Alan Stern25ff1c32008-12-15 12:43:41 -0500115#define COMPLIANT_DEV UNUSUAL_DEV
116
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +0200117#define USUAL_DEV(use_protocol, use_transport) \
Pete Zaitceva00828e2005-10-22 20:15:09 -0700118{ \
119 .useProtocol = use_protocol, \
120 .useTransport = use_transport, \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121}
122
fangxiaozhi07c7be32013-02-04 15:14:46 +0800123#define UNUSUAL_VENDOR_INTF(idVendor, cl, sc, pr, \
124 vendor_name, product_name, use_protocol, use_transport, \
125 init_function, Flags) \
126{ \
127 .vendorName = vendor_name, \
128 .productName = product_name, \
129 .useProtocol = use_protocol, \
130 .useTransport = use_transport, \
131 .initFunction = init_function, \
132}
133
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134static struct us_unusual_dev us_unusual_dev_list[] = {
Jeffrin Josea1631062012-05-17 00:33:36 +0530135# include "unusual_devs.h"
Alan Sterne6e244b2009-02-12 14:47:44 -0500136 { } /* Terminating entry */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137};
138
Huajun Lifd7ff362012-01-14 10:16:40 +0800139static struct us_unusual_dev for_dynamic_ids =
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +0200140 USUAL_DEV(USB_SC_SCSI, USB_PR_BULK);
Huajun Lifd7ff362012-01-14 10:16:40 +0800141
Alan Sterne6e244b2009-02-12 14:47:44 -0500142#undef UNUSUAL_DEV
143#undef COMPLIANT_DEV
144#undef USUAL_DEV
fangxiaozhi07c7be32013-02-04 15:14:46 +0800145#undef UNUSUAL_VENDOR_INTF
Alan Sterne6e244b2009-02-12 14:47:44 -0500146
Ming Leic825bab2012-03-19 15:20:57 +0800147#ifdef CONFIG_LOCKDEP
148
149static struct lock_class_key us_interface_key[USB_MAXINTERFACES];
150
151static void us_set_lock_class(struct mutex *mutex,
152 struct usb_interface *intf)
153{
154 struct usb_device *udev = interface_to_usbdev(intf);
155 struct usb_host_config *config = udev->actconfig;
156 int i;
157
158 for (i = 0; i < config->desc.bNumInterfaces; i++) {
159 if (config->interface[i] == intf)
160 break;
161 }
162
163 BUG_ON(i == config->desc.bNumInterfaces);
164
165 lockdep_set_class(mutex, &us_interface_key[i]);
166}
167
168#else
169
170static void us_set_lock_class(struct mutex *mutex,
171 struct usb_interface *intf)
172{
173}
174
175#endif
Alan Sternce2596d2005-10-23 19:41:39 -0700176
177#ifdef CONFIG_PM /* Minimal support for suspend and resume */
178
Alan Sterne6e244b2009-02-12 14:47:44 -0500179int usb_stor_suspend(struct usb_interface *iface, pm_message_t message)
Alan Sternce2596d2005-10-23 19:41:39 -0700180{
181 struct us_data *us = usb_get_intfdata(iface);
182
183 /* Wait until no command is running */
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100184 mutex_lock(&us->dev_mutex);
Alan Sternce2596d2005-10-23 19:41:39 -0700185
Matthew Dharm7931e1c2005-12-04 21:56:51 -0800186 if (us->suspend_resume_hook)
187 (us->suspend_resume_hook)(us, US_SUSPEND);
Alan Sternce2596d2005-10-23 19:41:39 -0700188
Greg Kroah-Hartmand5268752007-09-13 06:01:24 -0700189 /* When runtime PM is working, we'll set a flag to indicate
190 * whether we should autoresume when a SCSI request arrives. */
191
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100192 mutex_unlock(&us->dev_mutex);
Alan Sternce2596d2005-10-23 19:41:39 -0700193 return 0;
194}
Alan Sterne6e244b2009-02-12 14:47:44 -0500195EXPORT_SYMBOL_GPL(usb_stor_suspend);
Alan Sternce2596d2005-10-23 19:41:39 -0700196
Alan Sterne6e244b2009-02-12 14:47:44 -0500197int usb_stor_resume(struct usb_interface *iface)
Alan Sternce2596d2005-10-23 19:41:39 -0700198{
199 struct us_data *us = usb_get_intfdata(iface);
200
Greg Kroah-Hartmand5268752007-09-13 06:01:24 -0700201 mutex_lock(&us->dev_mutex);
Alan Stern8dfe4b12007-07-06 14:24:27 -0400202
Matthew Dharm7931e1c2005-12-04 21:56:51 -0800203 if (us->suspend_resume_hook)
204 (us->suspend_resume_hook)(us, US_RESUME);
Alan Sternce2596d2005-10-23 19:41:39 -0700205
Greg Kroah-Hartmand5268752007-09-13 06:01:24 -0700206 mutex_unlock(&us->dev_mutex);
Alan Sternce2596d2005-10-23 19:41:39 -0700207 return 0;
208}
Alan Sterne6e244b2009-02-12 14:47:44 -0500209EXPORT_SYMBOL_GPL(usb_stor_resume);
Alan Sternce2596d2005-10-23 19:41:39 -0700210
Alan Sterne6e244b2009-02-12 14:47:44 -0500211int usb_stor_reset_resume(struct usb_interface *iface)
Alan Sternf07600c2007-05-30 15:38:16 -0400212{
213 struct us_data *us = usb_get_intfdata(iface);
214
Alan Sternf07600c2007-05-30 15:38:16 -0400215 /* Report the reset to the SCSI core */
216 usb_stor_report_bus_reset(us);
217
218 /* FIXME: Notify the subdrivers that they need to reinitialize
219 * the device */
220 return 0;
221}
Alan Sterne6e244b2009-02-12 14:47:44 -0500222EXPORT_SYMBOL_GPL(usb_stor_reset_resume);
Alan Sternf07600c2007-05-30 15:38:16 -0400223
Alan Sternce2596d2005-10-23 19:41:39 -0700224#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225
226/*
Alan Stern47104b02006-06-01 13:52:56 -0400227 * The next two routines get called just before and just after
228 * a USB port reset, whether from this driver or a different one.
229 */
230
Alan Sterne6e244b2009-02-12 14:47:44 -0500231int usb_stor_pre_reset(struct usb_interface *iface)
Alan Stern47104b02006-06-01 13:52:56 -0400232{
233 struct us_data *us = usb_get_intfdata(iface);
234
Alan Stern47104b02006-06-01 13:52:56 -0400235 /* Make sure no command runs during the reset */
236 mutex_lock(&us->dev_mutex);
Alan Sternf07600c2007-05-30 15:38:16 -0400237 return 0;
Alan Stern47104b02006-06-01 13:52:56 -0400238}
Alan Sterne6e244b2009-02-12 14:47:44 -0500239EXPORT_SYMBOL_GPL(usb_stor_pre_reset);
Alan Stern47104b02006-06-01 13:52:56 -0400240
Alan Sterne6e244b2009-02-12 14:47:44 -0500241int usb_stor_post_reset(struct usb_interface *iface)
Alan Stern47104b02006-06-01 13:52:56 -0400242{
243 struct us_data *us = usb_get_intfdata(iface);
244
Alan Stern47104b02006-06-01 13:52:56 -0400245 /* Report the reset to the SCSI core */
Alan Stern47104b02006-06-01 13:52:56 -0400246 usb_stor_report_bus_reset(us);
Alan Stern47104b02006-06-01 13:52:56 -0400247
248 /* FIXME: Notify the subdrivers that they need to reinitialize
249 * the device */
Alan Stern0458d5b2007-05-04 11:52:20 -0400250
Alan Sternf07600c2007-05-30 15:38:16 -0400251 mutex_unlock(&us->dev_mutex);
252 return 0;
Alan Stern47104b02006-06-01 13:52:56 -0400253}
Alan Sterne6e244b2009-02-12 14:47:44 -0500254EXPORT_SYMBOL_GPL(usb_stor_post_reset);
Alan Stern47104b02006-06-01 13:52:56 -0400255
256/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257 * fill_inquiry_response takes an unsigned char array (which must
258 * be at least 36 characters) and populates the vendor name,
259 * product name, and revision fields. Then the array is copied
260 * into the SCSI command's response buffer (oddly enough
261 * called request_buffer). data_len contains the length of the
262 * data array, which again must be at least 36.
263 */
264
265void fill_inquiry_response(struct us_data *us, unsigned char *data,
266 unsigned int data_len)
267{
Jeffrin Josea1631062012-05-17 00:33:36 +0530268 if (data_len < 36) /* You lose. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 return;
270
Alan Sternf3f6faa2009-12-07 16:47:43 -0500271 memset(data+8, ' ', 28);
Jeffrin Josedb2c8622012-05-17 00:34:28 +0530272 if (data[0]&0x20) { /* USB device currently not connected. Return
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 peripheral qualifier 001b ("...however, the
274 physical device is not currently connected
275 to this logical unit") and leave vendor and
276 product identification empty. ("If the target
277 does store some of the INQUIRY data on the
Jeffrin Josea1631062012-05-17 00:33:36 +0530278 device, it may return zeros or ASCII spaces
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279 (20h) in those fields until the data is
280 available from the device."). */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281 } else {
282 u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice);
Alan Sternf3f6faa2009-12-07 16:47:43 -0500283 int n;
284
285 n = strlen(us->unusual_dev->vendorName);
286 memcpy(data+8, us->unusual_dev->vendorName, min(8, n));
287 n = strlen(us->unusual_dev->productName);
288 memcpy(data+16, us->unusual_dev->productName, min(16, n));
289
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290 data[32] = 0x30 + ((bcdDevice>>12) & 0x0F);
291 data[33] = 0x30 + ((bcdDevice>>8) & 0x0F);
292 data[34] = 0x30 + ((bcdDevice>>4) & 0x0F);
293 data[35] = 0x30 + ((bcdDevice) & 0x0F);
294 }
295
296 usb_stor_set_xfer_buf(data, data_len, us->srb);
297}
Alan Sterne6e244b2009-02-12 14:47:44 -0500298EXPORT_SYMBOL_GPL(fill_inquiry_response);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299
300static int usb_stor_control_thread(void * __us)
301{
302 struct us_data *us = (struct us_data *)__us;
303 struct Scsi_Host *host = us_to_host(us);
304
Jeffrin Josedb2c8622012-05-17 00:34:28 +0530305 for (;;) {
Joe Perches191648d2013-04-19 11:44:00 -0700306 usb_stor_dbg(us, "*** thread sleeping\n");
Alan Stern7119e3c2008-05-01 15:36:13 -0400307 if (wait_for_completion_interruptible(&us->cmnd_ready))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308 break;
Alan Stern7119e3c2008-05-01 15:36:13 -0400309
Joe Perches191648d2013-04-19 11:44:00 -0700310 usb_stor_dbg(us, "*** thread awakened\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311
312 /* lock the device pointers */
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100313 mutex_lock(&(us->dev_mutex));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 /* lock access to the state */
316 scsi_lock(host);
317
Alan Stern543f7812008-05-08 11:55:59 -0400318 /* When we are called with no command pending, we're done */
319 if (us->srb == NULL) {
320 scsi_unlock(host);
321 mutex_unlock(&us->dev_mutex);
Joe Perches191648d2013-04-19 11:44:00 -0700322 usb_stor_dbg(us, "-- exiting\n");
Alan Stern543f7812008-05-08 11:55:59 -0400323 break;
324 }
325
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 /* has the command timed out *already* ? */
Alan Stern7e4d6c32008-05-01 15:35:18 -0400327 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328 us->srb->result = DID_ABORT << 16;
329 goto SkipForAbort;
330 }
331
332 scsi_unlock(host);
333
Jeffrin Josea1631062012-05-17 00:33:36 +0530334 /* reject the command if the direction indicator
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335 * is UNKNOWN
336 */
337 if (us->srb->sc_data_direction == DMA_BIDIRECTIONAL) {
Joe Perches191648d2013-04-19 11:44:00 -0700338 usb_stor_dbg(us, "UNKNOWN data direction\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 us->srb->result = DID_ERROR << 16;
340 }
341
342 /* reject if target != 0 or if LUN is higher than
343 * the maximum known LUN
344 */
Jeffrin Josea1631062012-05-17 00:33:36 +0530345 else if (us->srb->device->id &&
Alan Stern7e4d6c32008-05-01 15:35:18 -0400346 !(us->fflags & US_FL_SCM_MULT_TARG)) {
Joe Perches191648d2013-04-19 11:44:00 -0700347 usb_stor_dbg(us, "Bad target number (%d:%d)\n",
348 us->srb->device->id, us->srb->device->lun);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349 us->srb->result = DID_BAD_TARGET << 16;
350 }
351
352 else if (us->srb->device->lun > us->max_lun) {
Joe Perches191648d2013-04-19 11:44:00 -0700353 usb_stor_dbg(us, "Bad LUN (%d:%d)\n",
354 us->srb->device->id, us->srb->device->lun);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 us->srb->result = DID_BAD_TARGET << 16;
356 }
357
Jeffrin Josea1631062012-05-17 00:33:36 +0530358 /* Handle those devices which need us to fake
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 * their inquiry data */
360 else if ((us->srb->cmnd[0] == INQUIRY) &&
Alan Stern7e4d6c32008-05-01 15:35:18 -0400361 (us->fflags & US_FL_FIX_INQUIRY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362 unsigned char data_ptr[36] = {
363 0x00, 0x80, 0x02, 0x02,
364 0x1F, 0x00, 0x00, 0x00};
365
Joe Perches191648d2013-04-19 11:44:00 -0700366 usb_stor_dbg(us, "Faking INQUIRY command\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 fill_inquiry_response(us, data_ptr, 36);
368 us->srb->result = SAM_STAT_GOOD;
369 }
370
371 /* we've got a command, let's do it! */
372 else {
Joe Perches191648d2013-04-19 11:44:00 -0700373 US_DEBUG(usb_stor_show_command(us, us->srb));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 us->proto_handler(us->srb, us);
Alan Sternf2839252010-07-28 17:12:39 -0400375 usb_mark_last_busy(us->pusb_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376 }
377
378 /* lock access to the state */
379 scsi_lock(host);
380
381 /* indicate that the command is done */
Alan Stern543f7812008-05-08 11:55:59 -0400382 if (us->srb->result != DID_ABORT << 16) {
Joe Perches191648d2013-04-19 11:44:00 -0700383 usb_stor_dbg(us, "scsi cmd done, result=0x%x\n",
384 us->srb->result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 us->srb->scsi_done(us->srb);
386 } else {
387SkipForAbort:
Joe Perches191648d2013-04-19 11:44:00 -0700388 usb_stor_dbg(us, "scsi command aborted\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 }
390
391 /* If an abort request was received we need to signal that
392 * the abort has finished. The proper test for this is
393 * the TIMED_OUT flag, not srb->result == DID_ABORT, because
Matthew Dharm226173e2005-08-25 20:03:50 -0700394 * the timeout might have occurred after the command had
395 * already completed with a different result code. */
Alan Stern7e4d6c32008-05-01 15:35:18 -0400396 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 complete(&(us->notify));
398
Matthew Dharm226173e2005-08-25 20:03:50 -0700399 /* Allow USB transfers to resume */
Alan Stern7e4d6c32008-05-01 15:35:18 -0400400 clear_bit(US_FLIDX_ABORTING, &us->dflags);
401 clear_bit(US_FLIDX_TIMED_OUT, &us->dflags);
Matthew Dharm226173e2005-08-25 20:03:50 -0700402 }
403
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 /* finished working on this command */
405 us->srb = NULL;
406 scsi_unlock(host);
407
408 /* unlock the device pointers */
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100409 mutex_unlock(&us->dev_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410 } /* for (;;) */
411
Alan Sterned76cac2007-06-07 17:12:25 -0400412 /* Wait until we are told to stop */
413 for (;;) {
414 set_current_state(TASK_INTERRUPTIBLE);
415 if (kthread_should_stop())
416 break;
417 schedule();
418 }
419 __set_current_state(TASK_RUNNING);
420 return 0;
Jeffrin Josea1631062012-05-17 00:33:36 +0530421}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422
423/***********************************************************************
424 * Device probing and disconnecting
425 ***********************************************************************/
426
427/* Associate our private data with the USB device */
428static int associate_dev(struct us_data *us, struct usb_interface *intf)
429{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430 /* Fill in the device-related fields */
431 us->pusb_dev = interface_to_usbdev(intf);
432 us->pusb_intf = intf;
433 us->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
Joe Perches191648d2013-04-19 11:44:00 -0700434 usb_stor_dbg(us, "Vendor: 0x%04x, Product: 0x%04x, Revision: 0x%04x\n",
435 le16_to_cpu(us->pusb_dev->descriptor.idVendor),
436 le16_to_cpu(us->pusb_dev->descriptor.idProduct),
437 le16_to_cpu(us->pusb_dev->descriptor.bcdDevice));
438 usb_stor_dbg(us, "Interface Subclass: 0x%02x, Protocol: 0x%02x\n",
439 intf->cur_altsetting->desc.bInterfaceSubClass,
440 intf->cur_altsetting->desc.bInterfaceProtocol);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441
442 /* Store our private data in the interface */
443 usb_set_intfdata(intf, us);
444
Alan Stern0ede76f2010-03-05 15:10:17 -0500445 /* Allocate the control/setup and DMA-mapped buffers */
446 us->cr = kmalloc(sizeof(*us->cr), GFP_KERNEL);
Joe Perches191648d2013-04-19 11:44:00 -0700447 if (!us->cr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449
Daniel Mack997ea582010-04-12 13:17:25 +0200450 us->iobuf = usb_alloc_coherent(us->pusb_dev, US_IOBUF_SIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 GFP_KERNEL, &us->iobuf_dma);
452 if (!us->iobuf) {
Joe Perches191648d2013-04-19 11:44:00 -0700453 usb_stor_dbg(us, "I/O buffer allocation failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 return -ENOMEM;
455 }
456 return 0;
457}
458
Alan Sternc838ea42008-12-15 10:40:06 -0500459/* Works only for digits and letters, but small and fast */
460#define TOLOWER(x) ((x) | 0x20)
461
Alan Sternd4f373e2008-11-10 14:07:45 -0500462/* Adjust device flags based on the "quirks=" module parameter */
463static void adjust_quirks(struct us_data *us)
464{
Alan Sternc838ea42008-12-15 10:40:06 -0500465 char *p;
466 u16 vid = le16_to_cpu(us->pusb_dev->descriptor.idVendor);
467 u16 pid = le16_to_cpu(us->pusb_dev->descriptor.idProduct);
468 unsigned f = 0;
Alan Sterna91b5932009-12-22 23:16:32 -0500469 unsigned int mask = (US_FL_SANE_SENSE | US_FL_BAD_SENSE |
470 US_FL_FIX_CAPACITY |
Alan Sternc838ea42008-12-15 10:40:06 -0500471 US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE |
Alan Sternd4f373e2008-11-10 14:07:45 -0500472 US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 |
Alan Sternc838ea42008-12-15 10:40:06 -0500473 US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE |
Karl Relton51169012011-05-18 21:42:34 +0100474 US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT |
Alan Stern21c13a42011-06-07 11:35:52 -0400475 US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 |
Namjae Jeoneaa05df2012-07-07 23:05:28 -0400476 US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE);
Alan Sternd4f373e2008-11-10 14:07:45 -0500477
Alan Sternc838ea42008-12-15 10:40:06 -0500478 p = quirks;
479 while (*p) {
480 /* Each entry consists of VID:PID:flags */
481 if (vid == simple_strtoul(p, &p, 16) &&
482 *p == ':' &&
483 pid == simple_strtoul(p+1, &p, 16) &&
484 *p == ':')
Alan Sternd4f373e2008-11-10 14:07:45 -0500485 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500486
487 /* Move forward to the next entry */
488 while (*p) {
489 if (*p++ == ',')
490 break;
Alan Sternd4f373e2008-11-10 14:07:45 -0500491 }
492 }
Alan Sternc838ea42008-12-15 10:40:06 -0500493 if (!*p) /* No match */
494 return;
495
496 /* Collect the flags */
497 while (*++p && *p != ',') {
498 switch (TOLOWER(*p)) {
499 case 'a':
500 f |= US_FL_SANE_SENSE;
501 break;
Alan Sterna0bb1082009-12-07 16:39:16 -0500502 case 'b':
503 f |= US_FL_BAD_SENSE;
504 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500505 case 'c':
506 f |= US_FL_FIX_CAPACITY;
507 break;
Karl Relton51169012011-05-18 21:42:34 +0100508 case 'd':
509 f |= US_FL_NO_READ_DISC_INFO;
510 break;
511 case 'e':
512 f |= US_FL_NO_READ_CAPACITY_16;
513 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500514 case 'h':
515 f |= US_FL_CAPACITY_HEURISTICS;
516 break;
517 case 'i':
518 f |= US_FL_IGNORE_DEVICE;
519 break;
520 case 'l':
521 f |= US_FL_NOT_LOCKABLE;
522 break;
523 case 'm':
524 f |= US_FL_MAX_SECTORS_64;
525 break;
Alan Stern21c13a42011-06-07 11:35:52 -0400526 case 'n':
527 f |= US_FL_INITIAL_READ10;
528 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500529 case 'o':
530 f |= US_FL_CAPACITY_OK;
531 break;
Namjae Jeoneaa05df2012-07-07 23:05:28 -0400532 case 'p':
533 f |= US_FL_WRITE_CACHE;
534 break;
Alan Sternc838ea42008-12-15 10:40:06 -0500535 case 'r':
536 f |= US_FL_IGNORE_RESIDUE;
537 break;
538 case 's':
539 f |= US_FL_SINGLE_LUN;
540 break;
541 case 'w':
542 f |= US_FL_NO_WP_DETECT;
543 break;
544 /* Ignore unrecognized flag characters */
545 }
546 }
547 us->fflags = (us->fflags & ~mask) | f;
Alan Sternd4f373e2008-11-10 14:07:45 -0500548}
549
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550/* Get the unusual_devs entries and the string descriptors */
Alan Sterne6e244b2009-02-12 14:47:44 -0500551static int get_device_info(struct us_data *us, const struct usb_device_id *id,
552 struct us_unusual_dev *unusual_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553{
554 struct usb_device *dev = us->pusb_dev;
555 struct usb_interface_descriptor *idesc =
556 &us->pusb_intf->cur_altsetting->desc;
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300557 struct device *pdev = &us->pusb_intf->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558
559 /* Store the entries */
560 us->unusual_dev = unusual_dev;
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200561 us->subclass = (unusual_dev->useProtocol == USB_SC_DEVICE) ?
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 idesc->bInterfaceSubClass :
563 unusual_dev->useProtocol;
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200564 us->protocol = (unusual_dev->useTransport == USB_PR_DEVICE) ?
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 idesc->bInterfaceProtocol :
566 unusual_dev->useTransport;
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +0200567 us->fflags = id->driver_info;
Alan Sternd4f373e2008-11-10 14:07:45 -0500568 adjust_quirks(us);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
Alan Stern7e4d6c32008-05-01 15:35:18 -0400570 if (us->fflags & US_FL_IGNORE_DEVICE) {
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300571 dev_info(pdev, "device ignored\n");
Daniel Drake3c332422006-07-26 13:59:23 +0100572 return -ENODEV;
573 }
574
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 /*
576 * This flag is only needed when we're in high-speed, so let's
577 * disable it if we're in full-speed
578 */
579 if (dev->speed != USB_SPEED_HIGH)
Alan Stern7e4d6c32008-05-01 15:35:18 -0400580 us->fflags &= ~US_FL_GO_SLOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581
Felipe Contreras39f2f082010-05-16 23:31:07 +0300582 if (us->fflags)
583 dev_info(pdev, "Quirks match for vid %04x pid %04x: %lx\n",
584 le16_to_cpu(dev->descriptor.idVendor),
585 le16_to_cpu(dev->descriptor.idProduct),
586 us->fflags);
587
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 /* Log a message if a non-generic unusual_dev entry contains an
589 * unnecessary subclass or protocol override. This may stimulate
590 * reports from users that will help us remove unneeded entries
591 * from the unusual_devs.h table.
592 */
593 if (id->idVendor || id->idProduct) {
Arjan van de Ven4c4c9432005-11-29 09:43:42 +0100594 static const char *msgs[3] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 "an unneeded SubClass entry",
596 "an unneeded Protocol entry",
597 "unneeded SubClass and Protocol entries"};
598 struct usb_device_descriptor *ddesc = &dev->descriptor;
599 int msg = -1;
600
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200601 if (unusual_dev->useProtocol != USB_SC_DEVICE &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 us->subclass == idesc->bInterfaceSubClass)
603 msg += 1;
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200604 if (unusual_dev->useTransport != USB_PR_DEVICE &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 us->protocol == idesc->bInterfaceProtocol)
606 msg += 2;
Alan Stern7e4d6c32008-05-01 15:35:18 -0400607 if (msg >= 0 && !(us->fflags & US_FL_NEED_OVERRIDE))
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300608 dev_notice(pdev, "This device "
609 "(%04x,%04x,%04x S %02x P %02x)"
610 " has %s in unusual_devs.h (kernel"
611 " %s)\n"
612 " Please send a copy of this message to "
613 "<linux-usb@vger.kernel.org> and "
614 "<usb-storage@lists.one-eyed-alien.net>\n",
615 le16_to_cpu(ddesc->idVendor),
616 le16_to_cpu(ddesc->idProduct),
617 le16_to_cpu(ddesc->bcdDevice),
618 idesc->bInterfaceSubClass,
619 idesc->bInterfaceProtocol,
620 msgs[msg],
621 utsname()->release);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622 }
Daniel Drake3c332422006-07-26 13:59:23 +0100623
624 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625}
626
627/* Get the transport settings */
Alan Sterne6e244b2009-02-12 14:47:44 -0500628static void get_transport(struct us_data *us)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629{
630 switch (us->protocol) {
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200631 case USB_PR_CB:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 us->transport_name = "Control/Bulk";
633 us->transport = usb_stor_CB_transport;
634 us->transport_reset = usb_stor_CB_reset;
635 us->max_lun = 7;
636 break;
637
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200638 case USB_PR_CBI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639 us->transport_name = "Control/Bulk/Interrupt";
Alan Stern64648a92008-11-20 14:20:03 -0500640 us->transport = usb_stor_CB_transport;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641 us->transport_reset = usb_stor_CB_reset;
642 us->max_lun = 7;
643 break;
644
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200645 case USB_PR_BULK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 us->transport_name = "Bulk";
647 us->transport = usb_stor_Bulk_transport;
648 us->transport_reset = usb_stor_Bulk_reset;
649 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651}
652
653/* Get the protocol settings */
Alan Sterne6e244b2009-02-12 14:47:44 -0500654static void get_protocol(struct us_data *us)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655{
656 switch (us->subclass) {
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200657 case USB_SC_RBC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 us->protocol_name = "Reduced Block Commands (RBC)";
659 us->proto_handler = usb_stor_transparent_scsi_command;
660 break;
661
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200662 case USB_SC_8020:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663 us->protocol_name = "8020i";
Alan Stern3dae5342008-11-20 14:22:18 -0500664 us->proto_handler = usb_stor_pad12_command;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665 us->max_lun = 0;
666 break;
667
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200668 case USB_SC_QIC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 us->protocol_name = "QIC-157";
Alan Stern3dae5342008-11-20 14:22:18 -0500670 us->proto_handler = usb_stor_pad12_command;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 us->max_lun = 0;
672 break;
673
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200674 case USB_SC_8070:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 us->protocol_name = "8070i";
Alan Stern3dae5342008-11-20 14:22:18 -0500676 us->proto_handler = usb_stor_pad12_command;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 us->max_lun = 0;
678 break;
679
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200680 case USB_SC_SCSI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 us->protocol_name = "Transparent SCSI";
682 us->proto_handler = usb_stor_transparent_scsi_command;
683 break;
684
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200685 case USB_SC_UFI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 us->protocol_name = "Uniform Floppy Interface (UFI)";
687 us->proto_handler = usb_stor_ufi_command;
688 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690}
691
692/* Get the pipe settings */
693static int get_pipes(struct us_data *us)
694{
695 struct usb_host_interface *altsetting =
696 us->pusb_intf->cur_altsetting;
697 int i;
698 struct usb_endpoint_descriptor *ep;
699 struct usb_endpoint_descriptor *ep_in = NULL;
700 struct usb_endpoint_descriptor *ep_out = NULL;
701 struct usb_endpoint_descriptor *ep_int = NULL;
702
703 /*
Alan Stern1096f782007-01-22 11:58:34 -0500704 * Find the first endpoint of each type we need.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705 * We are expecting a minimum of 2 endpoints - in and out (bulk).
Alan Stern1096f782007-01-22 11:58:34 -0500706 * An optional interrupt-in is OK (necessary for CBI protocol).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707 * We will ignore any others.
708 */
709 for (i = 0; i < altsetting->desc.bNumEndpoints; i++) {
710 ep = &altsetting->endpoint[i].desc;
711
Luiz Fernando N. Capitulino04720742006-10-26 13:03:03 -0300712 if (usb_endpoint_xfer_bulk(ep)) {
Alan Stern1096f782007-01-22 11:58:34 -0500713 if (usb_endpoint_dir_in(ep)) {
714 if (!ep_in)
715 ep_in = ep;
716 } else {
717 if (!ep_out)
718 ep_out = ep;
719 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 }
721
Alan Stern1096f782007-01-22 11:58:34 -0500722 else if (usb_endpoint_is_int_in(ep)) {
723 if (!ep_int)
724 ep_int = ep;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 }
726 }
727
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +0200728 if (!ep_in || !ep_out || (us->protocol == USB_PR_CBI && !ep_int)) {
Joe Perches191648d2013-04-19 11:44:00 -0700729 usb_stor_dbg(us, "Endpoint sanity check failed! Rejecting dev.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730 return -EIO;
731 }
732
733 /* Calculate and store the pipe values */
734 us->send_ctrl_pipe = usb_sndctrlpipe(us->pusb_dev, 0);
735 us->recv_ctrl_pipe = usb_rcvctrlpipe(us->pusb_dev, 0);
736 us->send_bulk_pipe = usb_sndbulkpipe(us->pusb_dev,
Julia Lawall2e0fe702008-12-29 11:22:14 +0100737 usb_endpoint_num(ep_out));
Jeffrin Josea1631062012-05-17 00:33:36 +0530738 us->recv_bulk_pipe = usb_rcvbulkpipe(us->pusb_dev,
Julia Lawall2e0fe702008-12-29 11:22:14 +0100739 usb_endpoint_num(ep_in));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740 if (ep_int) {
741 us->recv_intr_pipe = usb_rcvintpipe(us->pusb_dev,
Julia Lawall2e0fe702008-12-29 11:22:14 +0100742 usb_endpoint_num(ep_int));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 us->ep_bInterval = ep_int->bInterval;
744 }
745 return 0;
746}
747
748/* Initialize all the dynamic resources we need */
749static int usb_stor_acquire_resources(struct us_data *us)
750{
751 int p;
Alan Stern3f13e662005-10-23 19:43:36 -0700752 struct task_struct *th;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753
754 us->current_urb = usb_alloc_urb(0, GFP_KERNEL);
755 if (!us->current_urb) {
Joe Perches191648d2013-04-19 11:44:00 -0700756 usb_stor_dbg(us, "URB allocation failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757 return -ENOMEM;
758 }
759
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760 /* Just before we start our control thread, initialize
761 * the device if it needs initialization */
Alan Sternb876aef2005-10-23 19:38:56 -0700762 if (us->unusual_dev->initFunction) {
763 p = us->unusual_dev->initFunction(us);
764 if (p)
765 return p;
766 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767
768 /* Start up our control thread */
Alan Sterned76cac2007-06-07 17:12:25 -0400769 th = kthread_run(usb_stor_control_thread, us, "usb-storage");
Alan Stern3f13e662005-10-23 19:43:36 -0700770 if (IS_ERR(th)) {
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300771 dev_warn(&us->pusb_intf->dev,
772 "Unable to start control thread\n");
Alan Stern3f13e662005-10-23 19:43:36 -0700773 return PTR_ERR(th);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 }
Alan Sterned76cac2007-06-07 17:12:25 -0400775 us->ctl_thread = th;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776
777 return 0;
778}
779
780/* Release all our dynamic resources */
781static void usb_stor_release_resources(struct us_data *us)
782{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700783 /* Tell the control thread to exit. The SCSI host must
Alan Stern543f7812008-05-08 11:55:59 -0400784 * already have been removed and the DISCONNECTING flag set
785 * so that we won't accept any more commands.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786 */
Joe Perches191648d2013-04-19 11:44:00 -0700787 usb_stor_dbg(us, "-- sending exit command to thread\n");
Alan Stern7119e3c2008-05-01 15:36:13 -0400788 complete(&us->cmnd_ready);
Alan Sterned76cac2007-06-07 17:12:25 -0400789 if (us->ctl_thread)
790 kthread_stop(us->ctl_thread);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791
792 /* Call the destructor routine, if it exists */
793 if (us->extra_destructor) {
Joe Perches191648d2013-04-19 11:44:00 -0700794 usb_stor_dbg(us, "-- calling extra_destructor()\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 us->extra_destructor(us->extra);
796 }
797
798 /* Free the extra data and the URB */
799 kfree(us->extra);
800 usb_free_urb(us->current_urb);
801}
802
803/* Dissociate from the USB device */
804static void dissociate_dev(struct us_data *us)
805{
Alan Stern0ede76f2010-03-05 15:10:17 -0500806 /* Free the buffers */
807 kfree(us->cr);
Daniel Mack997ea582010-04-12 13:17:25 +0200808 usb_free_coherent(us->pusb_dev, US_IOBUF_SIZE, us->iobuf, us->iobuf_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809
810 /* Remove our private data from the interface */
811 usb_set_intfdata(us->pusb_intf, NULL);
812}
813
Alan Stern543f7812008-05-08 11:55:59 -0400814/* First stage of disconnect processing: stop SCSI scanning,
815 * remove the host, and stop accepting new commands
816 */
Matthew Dharm77f46322005-07-28 14:44:29 -0700817static void quiesce_and_remove_host(struct us_data *us)
818{
Alan Sterneecd11e2006-06-19 14:50:15 -0400819 struct Scsi_Host *host = us_to_host(us);
820
Alan Stern543f7812008-05-08 11:55:59 -0400821 /* If the device is really gone, cut short reset delays */
Alan Sternbb94a402012-02-21 13:16:32 -0500822 if (us->pusb_dev->state == USB_STATE_NOTATTACHED) {
Alan Stern543f7812008-05-08 11:55:59 -0400823 set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
Alan Sternbb94a402012-02-21 13:16:32 -0500824 wake_up(&us->delay_wait);
825 }
Alan Stern543f7812008-05-08 11:55:59 -0400826
Alan Sternbb94a402012-02-21 13:16:32 -0500827 /* Prevent SCSI scanning (if it hasn't started yet)
828 * or wait for the SCSI-scanning routine to stop.
Alan Stern543f7812008-05-08 11:55:59 -0400829 */
Alan Sternbb94a402012-02-21 13:16:32 -0500830 cancel_delayed_work_sync(&us->scan_dwork);
831
832 /* Balance autopm calls if scanning was cancelled */
833 if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags))
834 usb_autopm_put_interface_no_suspend(us->pusb_intf);
Alan Stern543f7812008-05-08 11:55:59 -0400835
836 /* Removing the host will perform an orderly shutdown: caches
837 * synchronized, disks spun down, etc.
838 */
839 scsi_remove_host(host);
840
841 /* Prevent any new commands from being accepted and cut short
842 * reset delays.
843 */
Alan Sterneecd11e2006-06-19 14:50:15 -0400844 scsi_lock(host);
Alan Stern7e4d6c32008-05-01 15:35:18 -0400845 set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
Alan Sterneecd11e2006-06-19 14:50:15 -0400846 scsi_unlock(host);
Matthew Dharm77f46322005-07-28 14:44:29 -0700847 wake_up(&us->delay_wait);
Matthew Dharm77f46322005-07-28 14:44:29 -0700848}
849
850/* Second stage of disconnect processing: deallocate all resources */
851static void release_everything(struct us_data *us)
852{
853 usb_stor_release_resources(us);
854 dissociate_dev(us);
855
856 /* Drop our reference to the host; the SCSI core will free it
857 * (and "us" along with it) when the refcount becomes 0. */
858 scsi_host_put(us_to_host(us));
859}
860
Alan Sternbb94a402012-02-21 13:16:32 -0500861/* Delayed-work routine to carry out SCSI-device scanning */
862static void usb_stor_scan_dwork(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863{
Alan Sternbb94a402012-02-21 13:16:32 -0500864 struct us_data *us = container_of(work, struct us_data,
865 scan_dwork.work);
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300866 struct device *dev = &us->pusb_intf->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867
Alan Sternbb94a402012-02-21 13:16:32 -0500868 dev_dbg(dev, "starting scan\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869
Alan Sternbb94a402012-02-21 13:16:32 -0500870 /* For bulk-only devices, determine the max LUN value */
871 if (us->protocol == USB_PR_BULK && !(us->fflags & US_FL_SINGLE_LUN)) {
872 mutex_lock(&us->dev_mutex);
873 us->max_lun = usb_stor_Bulk_max_lun(us);
874 mutex_unlock(&us->dev_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 }
Alan Sternbb94a402012-02-21 13:16:32 -0500876 scsi_scan_host(us_to_host(us));
877 dev_dbg(dev, "scan complete\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878
Alan Sternbb94a402012-02-21 13:16:32 -0500879 /* Should we unbind if no devices were detected? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880
Alan Sternf2839252010-07-28 17:12:39 -0400881 usb_autopm_put_interface(us->pusb_intf);
Alan Sternbb94a402012-02-21 13:16:32 -0500882 clear_bit(US_FLIDX_SCAN_PENDING, &us->dflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700883}
884
David Vrabel4c1bd3d2009-08-24 14:44:30 +0100885static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf)
886{
887 struct usb_device *usb_dev = interface_to_usbdev(intf);
888
889 if (usb_dev->bus->sg_tablesize) {
890 return usb_dev->bus->sg_tablesize;
891 }
892 return SG_ALL;
893}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894
Alan Sterne6e244b2009-02-12 14:47:44 -0500895/* First part of general USB mass-storage probing */
896int usb_stor_probe1(struct us_data **pus,
897 struct usb_interface *intf,
898 const struct usb_device_id *id,
899 struct us_unusual_dev *unusual_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900{
901 struct Scsi_Host *host;
902 struct us_data *us;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 int result;
Pete Zaitceva00828e2005-10-22 20:15:09 -0700904
Joe Perches191648d2013-04-19 11:44:00 -0700905 dev_info(&intf->dev, "USB Mass Storage device detected\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906
907 /*
908 * Ask the SCSI layer to allocate a host structure, with extra
909 * space at the end for our private us_data structure.
910 */
911 host = scsi_host_alloc(&usb_stor_host_template, sizeof(*us));
912 if (!host) {
Joe Perches191648d2013-04-19 11:44:00 -0700913 dev_warn(&intf->dev, "Unable to allocate the scsi host\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 return -ENOMEM;
915 }
916
Richard Sharpe17f060222007-10-10 10:56:28 -0700917 /*
918 * Allow 16-byte CDBs and thus > 2TB
919 */
920 host->max_cmd_len = 16;
David Vrabel4c1bd3d2009-08-24 14:44:30 +0100921 host->sg_tablesize = usb_stor_sg_tablesize(intf);
Alan Sterne6e244b2009-02-12 14:47:44 -0500922 *pus = us = host_to_us(host);
Arjan van de Ven4186ecf2006-01-11 15:55:29 +0100923 mutex_init(&(us->dev_mutex));
Ming Leic825bab2012-03-19 15:20:57 +0800924 us_set_lock_class(&us->dev_mutex, intf);
Alan Stern7119e3c2008-05-01 15:36:13 -0400925 init_completion(&us->cmnd_ready);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 init_completion(&(us->notify));
927 init_waitqueue_head(&us->delay_wait);
Alan Sternbb94a402012-02-21 13:16:32 -0500928 INIT_DELAYED_WORK(&us->scan_dwork, usb_stor_scan_dwork);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700929
930 /* Associate the us_data structure with the USB device */
931 result = associate_dev(us, intf);
932 if (result)
933 goto BadDevice;
934
Alan Sterne6e244b2009-02-12 14:47:44 -0500935 /* Get the unusual_devs entries and the descriptors */
936 result = get_device_info(us, id, unusual_dev);
Daniel Drake3c332422006-07-26 13:59:23 +0100937 if (result)
938 goto BadDevice;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939
Alan Sterne6e244b2009-02-12 14:47:44 -0500940 /* Get standard transport and protocol settings */
941 get_transport(us);
942 get_protocol(us);
943
944 /* Give the caller a chance to fill in specialized transport
945 * or protocol settings.
946 */
947 return 0;
948
949BadDevice:
Joe Perches191648d2013-04-19 11:44:00 -0700950 usb_stor_dbg(us, "storage_probe() failed\n");
Alan Sterne6e244b2009-02-12 14:47:44 -0500951 release_everything(us);
952 return result;
953}
954EXPORT_SYMBOL_GPL(usb_stor_probe1);
955
956/* Second part of general USB mass-storage probing */
957int usb_stor_probe2(struct us_data *us)
958{
Alan Sterne6e244b2009-02-12 14:47:44 -0500959 int result;
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300960 struct device *dev = &us->pusb_intf->dev;
Alan Sterne6e244b2009-02-12 14:47:44 -0500961
962 /* Make sure the transport and protocol have both been set */
963 if (!us->transport || !us->proto_handler) {
964 result = -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700965 goto BadDevice;
Alan Sterne6e244b2009-02-12 14:47:44 -0500966 }
Joe Perches191648d2013-04-19 11:44:00 -0700967 usb_stor_dbg(us, "Transport: %s\n", us->transport_name);
968 usb_stor_dbg(us, "Protocol: %s\n", us->protocol_name);
Alan Sterne6e244b2009-02-12 14:47:44 -0500969
970 /* fix for single-lun devices */
971 if (us->fflags & US_FL_SINGLE_LUN)
972 us->max_lun = 0;
973
Ming Leif4cc1832013-01-19 19:30:30 +0800974 if (!(us->fflags & US_FL_SCM_MULT_TARG))
975 us_to_host(us)->max_id = 1;
976
Alan Sterne6e244b2009-02-12 14:47:44 -0500977 /* Find the endpoints and calculate pipe values */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 result = get_pipes(us);
979 if (result)
980 goto BadDevice;
981
Alan Stern21c13a42011-06-07 11:35:52 -0400982 /*
983 * If the device returns invalid data for the first READ(10)
984 * command, indicate the command should be retried.
985 */
986 if (us->fflags & US_FL_INITIAL_READ10)
987 set_bit(US_FLIDX_REDO_READ10, &us->dflags);
988
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 /* Acquire all the other resources and add the host */
990 result = usb_stor_acquire_resources(us);
991 if (result)
992 goto BadDevice;
Matthew Wilcox00fa43e2009-09-24 16:19:11 -0600993 snprintf(us->scsi_name, sizeof(us->scsi_name), "usb-storage %s",
994 dev_name(&us->pusb_intf->dev));
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300995 result = scsi_add_host(us_to_host(us), dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996 if (result) {
Felipe Contrerascbd3af52010-05-16 23:31:06 +0300997 dev_warn(dev,
998 "Unable to add the scsi host\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999 goto BadDevice;
1000 }
1001
Alan Sternbb94a402012-02-21 13:16:32 -05001002 /* Submit the delayed_work for SCSI-device scanning */
Alan Sternf2839252010-07-28 17:12:39 -04001003 usb_autopm_get_interface_no_resume(us->pusb_intf);
Alan Sternbb94a402012-02-21 13:16:32 -05001004 set_bit(US_FLIDX_SCAN_PENDING, &us->dflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005
Alan Sternbb94a402012-02-21 13:16:32 -05001006 if (delay_use > 0)
1007 dev_dbg(dev, "waiting for device to settle before scanning\n");
1008 queue_delayed_work(system_freezable_wq, &us->scan_dwork,
1009 delay_use * HZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010 return 0;
1011
1012 /* We come here if there are any problems */
1013BadDevice:
Joe Perches191648d2013-04-19 11:44:00 -07001014 usb_stor_dbg(us, "storage_probe() failed\n");
Matthew Dharm77f46322005-07-28 14:44:29 -07001015 release_everything(us);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 return result;
1017}
Alan Sterne6e244b2009-02-12 14:47:44 -05001018EXPORT_SYMBOL_GPL(usb_stor_probe2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019
Alan Sterne6e244b2009-02-12 14:47:44 -05001020/* Handle a USB mass-storage disconnect */
1021void usb_stor_disconnect(struct usb_interface *intf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022{
1023 struct us_data *us = usb_get_intfdata(intf);
1024
Matthew Dharm77f46322005-07-28 14:44:29 -07001025 quiesce_and_remove_host(us);
1026 release_everything(us);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027}
Alan Sterne6e244b2009-02-12 14:47:44 -05001028EXPORT_SYMBOL_GPL(usb_stor_disconnect);
1029
1030/* The main probe routine for standard devices */
1031static int storage_probe(struct usb_interface *intf,
1032 const struct usb_device_id *id)
1033{
Huajun Lifd7ff362012-01-14 10:16:40 +08001034 struct us_unusual_dev *unusual_dev;
Alan Sterne6e244b2009-02-12 14:47:44 -05001035 struct us_data *us;
1036 int result;
Huajun Lifd7ff362012-01-14 10:16:40 +08001037 int size;
Alan Sterne6e244b2009-02-12 14:47:44 -05001038
1039 /*
Alan Sterne6e244b2009-02-12 14:47:44 -05001040 * If the device isn't standard (is handled by a subdriver
1041 * module) then don't accept it.
1042 */
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +02001043 if (usb_usual_ignore_device(intf))
Alan Sterne6e244b2009-02-12 14:47:44 -05001044 return -ENXIO;
1045
1046 /*
1047 * Call the general probe procedures.
1048 *
1049 * The unusual_dev_list array is parallel to the usb_storage_usb_ids
1050 * table, so we use the index of the id entry to find the
1051 * corresponding unusual_devs entry.
1052 */
Huajun Lifd7ff362012-01-14 10:16:40 +08001053
1054 size = ARRAY_SIZE(us_unusual_dev_list);
1055 if (id >= usb_storage_usb_ids && id < usb_storage_usb_ids + size) {
1056 unusual_dev = (id - usb_storage_usb_ids) + us_unusual_dev_list;
1057 } else {
1058 unusual_dev = &for_dynamic_ids;
1059
Joe Perches191648d2013-04-19 11:44:00 -07001060 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 +08001061 id->idVendor, id->idProduct);
1062 }
1063
1064 result = usb_stor_probe1(&us, intf, id, unusual_dev);
Alan Sterne6e244b2009-02-12 14:47:44 -05001065 if (result)
1066 return result;
1067
1068 /* No special transport or protocol settings in the main module */
1069
1070 result = usb_stor_probe2(us);
1071 return result;
1072}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073
1074/***********************************************************************
1075 * Initialization and registration
1076 ***********************************************************************/
1077
Alan Sternce2596d2005-10-23 19:41:39 -07001078static struct usb_driver usb_storage_driver = {
Alan Sternce2596d2005-10-23 19:41:39 -07001079 .name = "usb-storage",
1080 .probe = storage_probe,
Alan Sterne6e244b2009-02-12 14:47:44 -05001081 .disconnect = usb_stor_disconnect,
1082 .suspend = usb_stor_suspend,
1083 .resume = usb_stor_resume,
1084 .reset_resume = usb_stor_reset_resume,
1085 .pre_reset = usb_stor_pre_reset,
1086 .post_reset = usb_stor_post_reset,
1087 .id_table = usb_storage_usb_ids,
Alan Sternf2839252010-07-28 17:12:39 -04001088 .supports_autosuspend = 1,
Alan Stern543f7812008-05-08 11:55:59 -04001089 .soft_unbind = 1,
Alan Sternce2596d2005-10-23 19:41:39 -07001090};
1091
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092static int __init usb_stor_init(void)
1093{
1094 int retval;
Alan Sternd4f373e2008-11-10 14:07:45 -05001095
Felipe Contrerascbd3af52010-05-16 23:31:06 +03001096 pr_info("Initializing USB Mass Storage driver...\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097
1098 /* register the driver, return usb_register return code if error */
1099 retval = usb_register(&usb_storage_driver);
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +02001100 if (retval == 0)
Joe Perches191648d2013-04-19 11:44:00 -07001101 pr_info("USB Mass Storage support registered\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 return retval;
1103}
1104
1105static void __exit usb_stor_exit(void)
1106{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 /* Deregister the driver
1108 * This will cause disconnect() to be called for each
1109 * attached unit
1110 */
Joe Perches191648d2013-04-19 11:44:00 -07001111 pr_info("Deregistering USB Mass Storage driver...\n");
1112 usb_deregister(&usb_storage_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113}
1114
1115module_init(usb_stor_init);
1116module_exit(usb_stor_exit);