uas.c 32.6 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
M
Matthew Wilcox 已提交
2 3 4 5
/*
 * USB Attached SCSI
 * Note that this is not the same as the USB Mass Storage driver
 *
6
 * Copyright Hans de Goede <hdegoede@redhat.com> for Red Hat, Inc. 2013 - 2016
M
Matthew Wilcox 已提交
7 8 9 10 11 12 13
 * Copyright Matthew Wilcox for Intel Corp, 2010
 * Copyright Sarah Sharp for Intel Corp, 2010
 */

#include <linux/blkdev.h>
#include <linux/slab.h>
#include <linux/types.h>
14
#include <linux/module.h>
M
Matthew Wilcox 已提交
15
#include <linux/usb.h>
16
#include <linux/usb_usual.h>
17
#include <linux/usb/hcd.h>
M
Matthew Wilcox 已提交
18
#include <linux/usb/storage.h>
19
#include <linux/usb/uas.h>
M
Matthew Wilcox 已提交
20 21

#include <scsi/scsi.h>
22
#include <scsi/scsi_eh.h>
M
Matthew Wilcox 已提交
23 24 25 26 27 28
#include <scsi/scsi_dbg.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_tcq.h>

29
#include "uas-detect.h"
30
#include "scsiglue.h"
31

32
#define MAX_CMNDS 256
M
Matthew Wilcox 已提交
33 34 35 36

struct uas_dev_info {
	struct usb_interface *intf;
	struct usb_device *udev;
37
	struct usb_anchor cmd_urbs;
38 39
	struct usb_anchor sense_urbs;
	struct usb_anchor data_urbs;
40
	unsigned long flags;
G
Gerd Hoffmann 已提交
41
	int qdepth, resetting;
M
Matthew Wilcox 已提交
42 43
	unsigned cmd_pipe, status_pipe, data_in_pipe, data_out_pipe;
	unsigned use_streams:1;
H
Hans de Goede 已提交
44
	unsigned shutdown:1;
45
	struct scsi_cmnd *cmnd[MAX_CMNDS];
G
Gerd Hoffmann 已提交
46
	spinlock_t lock;
G
Gerd Hoffmann 已提交
47
	struct work_struct work;
M
Matthew Wilcox 已提交
48 49 50
};

enum {
O
Oliver Neukum 已提交
51 52 53 54 55 56 57 58 59 60 61 62
	SUBMIT_STATUS_URB	= BIT(1),
	ALLOC_DATA_IN_URB	= BIT(2),
	SUBMIT_DATA_IN_URB	= BIT(3),
	ALLOC_DATA_OUT_URB	= BIT(4),
	SUBMIT_DATA_OUT_URB	= BIT(5),
	ALLOC_CMD_URB		= BIT(6),
	SUBMIT_CMD_URB		= BIT(7),
	COMMAND_INFLIGHT        = BIT(8),
	DATA_IN_URB_INFLIGHT    = BIT(9),
	DATA_OUT_URB_INFLIGHT   = BIT(10),
	COMMAND_ABORTED         = BIT(11),
	IS_IN_WORK_LIST         = BIT(12),
M
Matthew Wilcox 已提交
63 64 65 66 67
};

/* Overrides scsi_pointer */
struct uas_cmd_info {
	unsigned int state;
H
Hans de Goede 已提交
68
	unsigned int uas_tag;
M
Matthew Wilcox 已提交
69 70 71 72 73 74 75
	struct urb *cmd_urb;
	struct urb *data_in_urb;
	struct urb *data_out_urb;
};

/* I hate forward declarations, but I actually have a loop */
static int uas_submit_urbs(struct scsi_cmnd *cmnd,
76
				struct uas_dev_info *devinfo);
77
static void uas_do_work(struct work_struct *work);
G
Gerd Hoffmann 已提交
78
static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller);
79
static void uas_free_streams(struct uas_dev_info *devinfo);
80 81
static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix,
				int status);
82

M
Matthew Wilcox 已提交
83 84
static void uas_do_work(struct work_struct *work)
{
G
Gerd Hoffmann 已提交
85 86
	struct uas_dev_info *devinfo =
		container_of(work, struct uas_dev_info, work);
M
Matthew Wilcox 已提交
87
	struct uas_cmd_info *cmdinfo;
H
Hans de Goede 已提交
88
	struct scsi_cmnd *cmnd;
G
Gerd Hoffmann 已提交
89
	unsigned long flags;
H
Hans de Goede 已提交
90
	int i, err;
M
Matthew Wilcox 已提交
91

G
Gerd Hoffmann 已提交
92
	spin_lock_irqsave(&devinfo->lock, flags);
H
Hans de Goede 已提交
93 94 95 96

	if (devinfo->resetting)
		goto out;

H
Hans de Goede 已提交
97 98 99 100 101 102
	for (i = 0; i < devinfo->qdepth; i++) {
		if (!devinfo->cmnd[i])
			continue;

		cmnd = devinfo->cmnd[i];
		cmdinfo = (void *)&cmnd->SCp;
103 104 105 106

		if (!(cmdinfo->state & IS_IN_WORK_LIST))
			continue;

107
		err = uas_submit_urbs(cmnd, cmnd->device->hostdata);
108
		if (!err)
G
Gerd Hoffmann 已提交
109
			cmdinfo->state &= ~IS_IN_WORK_LIST;
110
		else
G
Gerd Hoffmann 已提交
111
			schedule_work(&devinfo->work);
M
Matthew Wilcox 已提交
112
	}
H
Hans de Goede 已提交
113
out:
G
Gerd Hoffmann 已提交
114 115 116
	spin_unlock_irqrestore(&devinfo->lock, flags);
}

G
Gerd Hoffmann 已提交
117 118 119 120 121 122
static void uas_add_work(struct uas_cmd_info *cmdinfo)
{
	struct scsi_pointer *scp = (void *)cmdinfo;
	struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, SCp);
	struct uas_dev_info *devinfo = cmnd->device->hostdata;

123
	lockdep_assert_held(&devinfo->lock);
G
Gerd Hoffmann 已提交
124 125 126 127
	cmdinfo->state |= IS_IN_WORK_LIST;
	schedule_work(&devinfo->work);
}

128
static void uas_zap_pending(struct uas_dev_info *devinfo, int result)
G
Gerd Hoffmann 已提交
129 130
{
	struct uas_cmd_info *cmdinfo;
H
Hans de Goede 已提交
131
	struct scsi_cmnd *cmnd;
G
Gerd Hoffmann 已提交
132
	unsigned long flags;
H
Hans de Goede 已提交
133
	int i, err;
G
Gerd Hoffmann 已提交
134 135

	spin_lock_irqsave(&devinfo->lock, flags);
H
Hans de Goede 已提交
136 137 138 139 140 141
	for (i = 0; i < devinfo->qdepth; i++) {
		if (!devinfo->cmnd[i])
			continue;

		cmnd = devinfo->cmnd[i];
		cmdinfo = (void *)&cmnd->SCp;
142
		uas_log_cmd_state(cmnd, __func__, 0);
143 144
		/* Sense urbs were killed, clear COMMAND_INFLIGHT manually */
		cmdinfo->state &= ~COMMAND_INFLIGHT;
145
		cmnd->result = result << 16;
146 147
		err = uas_try_complete(cmnd, __func__);
		WARN_ON(err != 0);
G
Gerd Hoffmann 已提交
148 149 150 151
	}
	spin_unlock_irqrestore(&devinfo->lock, flags);
}

M
Matthew Wilcox 已提交
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd)
{
	struct sense_iu *sense_iu = urb->transfer_buffer;
	struct scsi_device *sdev = cmnd->device;

	if (urb->actual_length > 16) {
		unsigned len = be16_to_cpup(&sense_iu->len);
		if (len + 16 != urb->actual_length) {
			int newlen = min(len + 16, urb->actual_length) - 16;
			if (newlen < 0)
				newlen = 0;
			sdev_printk(KERN_INFO, sdev, "%s: urb length %d "
				"disagrees with IU sense data length %d, "
				"using %d bytes of sense data\n", __func__,
					urb->actual_length, len, newlen);
			len = newlen;
		}
		memcpy(cmnd->sense_buffer, sense_iu->sense, len);
	}

	cmnd->result = sense_iu->status;
}

175 176
static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix,
			      int status)
177 178
{
	struct uas_cmd_info *ci = (void *)&cmnd->SCp;
H
Hans de Goede 已提交
179
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
180

181
	scmd_printk(KERN_INFO, cmnd,
H
Hans de Goede 已提交
182 183
		    "%s %d uas-tag %d inflight:%s%s%s%s%s%s%s%s%s%s%s%s ",
		    prefix, status, cmdinfo->uas_tag,
184 185 186 187 188 189 190 191 192 193
		    (ci->state & SUBMIT_STATUS_URB)     ? " s-st"  : "",
		    (ci->state & ALLOC_DATA_IN_URB)     ? " a-in"  : "",
		    (ci->state & SUBMIT_DATA_IN_URB)    ? " s-in"  : "",
		    (ci->state & ALLOC_DATA_OUT_URB)    ? " a-out" : "",
		    (ci->state & SUBMIT_DATA_OUT_URB)   ? " s-out" : "",
		    (ci->state & ALLOC_CMD_URB)         ? " a-cmd" : "",
		    (ci->state & SUBMIT_CMD_URB)        ? " s-cmd" : "",
		    (ci->state & COMMAND_INFLIGHT)      ? " CMD"   : "",
		    (ci->state & DATA_IN_URB_INFLIGHT)  ? " IN"    : "",
		    (ci->state & DATA_OUT_URB_INFLIGHT) ? " OUT"   : "",
G
Gerd Hoffmann 已提交
194
		    (ci->state & COMMAND_ABORTED)       ? " abort" : "",
G
Gerd Hoffmann 已提交
195
		    (ci->state & IS_IN_WORK_LIST)       ? " work"  : "");
H
Hans de Goede 已提交
196
	scsi_print_command(cmnd);
197 198
}

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
static void uas_free_unsubmitted_urbs(struct scsi_cmnd *cmnd)
{
	struct uas_cmd_info *cmdinfo;

	if (!cmnd)
		return;

	cmdinfo = (void *)&cmnd->SCp;

	if (cmdinfo->state & SUBMIT_CMD_URB)
		usb_free_urb(cmdinfo->cmd_urb);

	/* data urbs may have never gotten their submit flag set */
	if (!(cmdinfo->state & DATA_IN_URB_INFLIGHT))
		usb_free_urb(cmdinfo->data_in_urb);
	if (!(cmdinfo->state & DATA_OUT_URB_INFLIGHT))
		usb_free_urb(cmdinfo->data_out_urb);
216 217 218 219 220
}

static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
{
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
G
Gerd Hoffmann 已提交
221
	struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
222

223
	lockdep_assert_held(&devinfo->lock);
224 225
	if (cmdinfo->state & (COMMAND_INFLIGHT |
			      DATA_IN_URB_INFLIGHT |
G
Gerd Hoffmann 已提交
226
			      DATA_OUT_URB_INFLIGHT |
227
			      COMMAND_ABORTED))
228
		return -EBUSY;
H
Hans de Goede 已提交
229
	devinfo->cmnd[cmdinfo->uas_tag - 1] = NULL;
230
	uas_free_unsubmitted_urbs(cmnd);
231
	cmnd->scsi_done(cmnd);
232
	return 0;
M
Matthew Wilcox 已提交
233 234 235
}

static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd,
236
			  unsigned direction)
M
Matthew Wilcox 已提交
237 238 239 240
{
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
	int err;

241
	cmdinfo->state |= direction | SUBMIT_STATUS_URB;
242
	err = uas_submit_urbs(cmnd, cmnd->device->hostdata);
M
Matthew Wilcox 已提交
243
	if (err) {
G
Gerd Hoffmann 已提交
244
		uas_add_work(cmdinfo);
M
Matthew Wilcox 已提交
245 246 247
	}
}

248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
static bool uas_evaluate_response_iu(struct response_iu *riu, struct scsi_cmnd *cmnd)
{
	u8 response_code = riu->response_code;

	switch (response_code) {
	case RC_INCORRECT_LUN:
		cmnd->result = DID_BAD_TARGET << 16;
		break;
	case RC_TMF_SUCCEEDED:
		cmnd->result = DID_OK << 16;
		break;
	case RC_TMF_NOT_SUPPORTED:
		cmnd->result = DID_TARGET_FAILURE << 16;
		break;
	default:
		uas_log_cmd_state(cmnd, "response iu", response_code);
		cmnd->result = DID_ERROR << 16;
		break;
	}

	return response_code == RC_TMF_SUCCEEDED;
}

M
Matthew Wilcox 已提交
271 272 273
static void uas_stat_cmplt(struct urb *urb)
{
	struct iu *iu = urb->transfer_buffer;
274
	struct Scsi_Host *shost = urb->context;
H
Hans de Goede 已提交
275
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
276 277
	struct urb *data_in_urb = NULL;
	struct urb *data_out_urb = NULL;
M
Matthew Wilcox 已提交
278
	struct scsi_cmnd *cmnd;
279
	struct uas_cmd_info *cmdinfo;
G
Gerd Hoffmann 已提交
280
	unsigned long flags;
281
	unsigned int idx;
282
	int status = urb->status;
283
	bool success;
M
Matthew Wilcox 已提交
284

H
Hans de Goede 已提交
285 286 287 288
	spin_lock_irqsave(&devinfo->lock, flags);

	if (devinfo->resetting)
		goto out;
M
Matthew Wilcox 已提交
289

290 291 292
	if (status) {
		if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
			dev_err(&urb->dev->dev, "stat urb: status %d\n", status);
H
Hans de Goede 已提交
293
		goto out;
M
Matthew Wilcox 已提交
294 295
	}

296 297 298
	idx = be16_to_cpup(&iu->tag) - 1;
	if (idx >= MAX_CMNDS || !devinfo->cmnd[idx]) {
		dev_err(&urb->dev->dev,
H
Hans de Goede 已提交
299
			"stat urb: no pending cmd for uas-tag %d\n", idx + 1);
H
Hans de Goede 已提交
300
		goto out;
G
Gerd Hoffmann 已提交
301 302
	}

303
	cmnd = devinfo->cmnd[idx];
G
Gerd Hoffmann 已提交
304
	cmdinfo = (void *)&cmnd->SCp;
305 306

	if (!(cmdinfo->state & COMMAND_INFLIGHT)) {
307
		uas_log_cmd_state(cmnd, "unexpected status cmplt", 0);
308
		goto out;
309
	}
M
Matthew Wilcox 已提交
310 311 312

	switch (iu->iu_id) {
	case IU_ID_STATUS:
313
		uas_sense(urb, cmnd);
G
Gerd Hoffmann 已提交
314 315
		if (cmnd->result != 0) {
			/* cancel data transfers on error */
316 317
			data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
			data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
G
Gerd Hoffmann 已提交
318
		}
319 320
		cmdinfo->state &= ~COMMAND_INFLIGHT;
		uas_try_complete(cmnd, __func__);
M
Matthew Wilcox 已提交
321 322
		break;
	case IU_ID_READ_READY:
323 324
		if (!cmdinfo->data_in_urb ||
				(cmdinfo->state & DATA_IN_URB_INFLIGHT)) {
325
			uas_log_cmd_state(cmnd, "unexpected read rdy", 0);
326 327
			break;
		}
M
Matthew Wilcox 已提交
328 329 330
		uas_xfer_data(urb, cmnd, SUBMIT_DATA_IN_URB);
		break;
	case IU_ID_WRITE_READY:
331 332
		if (!cmdinfo->data_out_urb ||
				(cmdinfo->state & DATA_OUT_URB_INFLIGHT)) {
333
			uas_log_cmd_state(cmnd, "unexpected write rdy", 0);
334 335
			break;
		}
M
Matthew Wilcox 已提交
336 337
		uas_xfer_data(urb, cmnd, SUBMIT_DATA_OUT_URB);
		break;
H
Hans de Goede 已提交
338 339
	case IU_ID_RESPONSE:
		cmdinfo->state &= ~COMMAND_INFLIGHT;
340 341 342 343 344 345
		success = uas_evaluate_response_iu((struct response_iu *)iu, cmnd);
		if (!success) {
			/* Error, cancel data transfers */
			data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
			data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
		}
H
Hans de Goede 已提交
346 347
		uas_try_complete(cmnd, __func__);
		break;
M
Matthew Wilcox 已提交
348
	default:
349
		uas_log_cmd_state(cmnd, "bogus IU", iu->iu_id);
M
Matthew Wilcox 已提交
350
	}
H
Hans de Goede 已提交
351
out:
G
Gerd Hoffmann 已提交
352
	usb_free_urb(urb);
G
Gerd Hoffmann 已提交
353
	spin_unlock_irqrestore(&devinfo->lock, flags);
354 355 356 357 358 359 360 361 362 363

	/* Unlinking of data urbs must be done without holding the lock */
	if (data_in_urb) {
		usb_unlink_urb(data_in_urb);
		usb_put_urb(data_in_urb);
	}
	if (data_out_urb) {
		usb_unlink_urb(data_out_urb);
		usb_put_urb(data_out_urb);
	}
M
Matthew Wilcox 已提交
364 365
}

366
static void uas_data_cmplt(struct urb *urb)
M
Matthew Wilcox 已提交
367
{
368 369
	struct scsi_cmnd *cmnd = urb->context;
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
G
Gerd Hoffmann 已提交
370
	struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
371
	struct scsi_data_buffer *sdb = NULL;
G
Gerd Hoffmann 已提交
372
	unsigned long flags;
373
	int status = urb->status;
374

G
Gerd Hoffmann 已提交
375
	spin_lock_irqsave(&devinfo->lock, flags);
H
Hans de Goede 已提交
376

377 378 379
	if (cmdinfo->data_in_urb == urb) {
		sdb = scsi_in(cmnd);
		cmdinfo->state &= ~DATA_IN_URB_INFLIGHT;
380
		cmdinfo->data_in_urb = NULL;
381 382 383
	} else if (cmdinfo->data_out_urb == urb) {
		sdb = scsi_out(cmnd);
		cmdinfo->state &= ~DATA_OUT_URB_INFLIGHT;
384
		cmdinfo->data_out_urb = NULL;
385
	}
386 387
	if (sdb == NULL) {
		WARN_ON_ONCE(1);
H
Hans de Goede 已提交
388 389 390 391 392 393
		goto out;
	}

	if (devinfo->resetting)
		goto out;

394 395
	/* Data urbs should not complete before the cmd urb is submitted */
	if (cmdinfo->state & SUBMIT_CMD_URB) {
396
		uas_log_cmd_state(cmnd, "unexpected data cmplt", 0);
397 398 399
		goto out;
	}

400 401 402
	if (status) {
		if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
			uas_log_cmd_state(cmnd, "data cmplt err", status);
G
Gerd Hoffmann 已提交
403 404 405 406 407
		/* error: no data transfered */
		sdb->resid = sdb->length;
	} else {
		sdb->resid = sdb->length - urb->actual_length;
	}
408
	uas_try_complete(cmnd, __func__);
H
Hans de Goede 已提交
409
out:
410
	usb_free_urb(urb);
G
Gerd Hoffmann 已提交
411
	spin_unlock_irqrestore(&devinfo->lock, flags);
M
Matthew Wilcox 已提交
412 413
}

H
Hans de Goede 已提交
414 415
static void uas_cmd_cmplt(struct urb *urb)
{
416 417
	if (urb->status)
		dev_err(&urb->dev->dev, "cmd cmplt err %d\n", urb->status);
H
Hans de Goede 已提交
418 419 420 421

	usb_free_urb(urb);
}

M
Matthew Wilcox 已提交
422
static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp,
423 424
				      struct scsi_cmnd *cmnd,
				      enum dma_data_direction dir)
M
Matthew Wilcox 已提交
425 426
{
	struct usb_device *udev = devinfo->udev;
427
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
M
Matthew Wilcox 已提交
428
	struct urb *urb = usb_alloc_urb(0, gfp);
429 430
	struct scsi_data_buffer *sdb = (dir == DMA_FROM_DEVICE)
		? scsi_in(cmnd) : scsi_out(cmnd);
431 432
	unsigned int pipe = (dir == DMA_FROM_DEVICE)
		? devinfo->data_in_pipe : devinfo->data_out_pipe;
M
Matthew Wilcox 已提交
433 434 435

	if (!urb)
		goto out;
436 437
	usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length,
			  uas_data_cmplt, cmnd);
H
Hans de Goede 已提交
438 439
	if (devinfo->use_streams)
		urb->stream_id = cmdinfo->uas_tag;
M
Matthew Wilcox 已提交
440 441 442 443 444 445 446
	urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0;
	urb->sg = sdb->table.sgl;
 out:
	return urb;
}

static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp,
447
				       struct scsi_cmnd *cmnd)
M
Matthew Wilcox 已提交
448 449
{
	struct usb_device *udev = devinfo->udev;
450
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
M
Matthew Wilcox 已提交
451 452 453 454 455 456
	struct urb *urb = usb_alloc_urb(0, gfp);
	struct sense_iu *iu;

	if (!urb)
		goto out;

457
	iu = kzalloc(sizeof(*iu), gfp);
M
Matthew Wilcox 已提交
458 459 460 461
	if (!iu)
		goto free;

	usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu),
462
			  uas_stat_cmplt, cmnd->device->host);
H
Hans de Goede 已提交
463 464
	if (devinfo->use_streams)
		urb->stream_id = cmdinfo->uas_tag;
M
Matthew Wilcox 已提交
465 466 467 468 469 470 471 472 473
	urb->transfer_flags |= URB_FREE_BUFFER;
 out:
	return urb;
 free:
	usb_free_urb(urb);
	return NULL;
}

static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp,
474
					struct scsi_cmnd *cmnd)
M
Matthew Wilcox 已提交
475 476 477
{
	struct usb_device *udev = devinfo->udev;
	struct scsi_device *sdev = cmnd->device;
H
Hans de Goede 已提交
478
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
M
Matthew Wilcox 已提交
479 480 481 482 483 484 485 486 487 488 489
	struct urb *urb = usb_alloc_urb(0, gfp);
	struct command_iu *iu;
	int len;

	if (!urb)
		goto out;

	len = cmnd->cmd_len - 16;
	if (len < 0)
		len = 0;
	len = ALIGN(len, 4);
490
	iu = kzalloc(sizeof(*iu) + len, gfp);
M
Matthew Wilcox 已提交
491 492 493 494
	if (!iu)
		goto free;

	iu->iu_id = IU_ID_COMMAND;
H
Hans de Goede 已提交
495
	iu->tag = cpu_to_be16(cmdinfo->uas_tag);
C
Christoph Hellwig 已提交
496
	iu->prio_attr = UAS_SIMPLE_TAG;
M
Matthew Wilcox 已提交
497 498 499 500 501
	iu->len = len;
	int_to_scsilun(sdev->lun, &iu->lun);
	memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len);

	usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu) + len,
502
							uas_cmd_cmplt, NULL);
M
Matthew Wilcox 已提交
503 504 505 506 507 508 509 510 511 512 513 514 515 516
	urb->transfer_flags |= URB_FREE_BUFFER;
 out:
	return urb;
 free:
	usb_free_urb(urb);
	return NULL;
}

/*
 * Why should I request the Status IU before sending the Command IU?  Spec
 * says to, but also says the device may receive them in any order.  Seems
 * daft to me.
 */

517
static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp)
M
Matthew Wilcox 已提交
518
{
519
	struct uas_dev_info *devinfo = cmnd->device->hostdata;
G
Gerd Hoffmann 已提交
520
	struct urb *urb;
H
Hans de Goede 已提交
521
	int err;
M
Matthew Wilcox 已提交
522

523
	urb = uas_alloc_sense_urb(devinfo, gfp, cmnd);
G
Gerd Hoffmann 已提交
524
	if (!urb)
525
		return NULL;
526
	usb_anchor_urb(urb, &devinfo->sense_urbs);
H
Hans de Goede 已提交
527 528
	err = usb_submit_urb(urb, gfp);
	if (err) {
529
		usb_unanchor_urb(urb);
530
		uas_log_cmd_state(cmnd, "sense submit err", err);
G
Gerd Hoffmann 已提交
531
		usb_free_urb(urb);
532
		return NULL;
M
Matthew Wilcox 已提交
533
	}
534
	return urb;
G
Gerd Hoffmann 已提交
535 536 537
}

static int uas_submit_urbs(struct scsi_cmnd *cmnd,
538
			   struct uas_dev_info *devinfo)
G
Gerd Hoffmann 已提交
539 540
{
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
541
	struct urb *urb;
H
Hans de Goede 已提交
542
	int err;
M
Matthew Wilcox 已提交
543

544
	lockdep_assert_held(&devinfo->lock);
545
	if (cmdinfo->state & SUBMIT_STATUS_URB) {
546
		urb = uas_submit_sense_urb(cmnd, GFP_ATOMIC);
547 548
		if (!urb)
			return SCSI_MLQUEUE_DEVICE_BUSY;
549
		cmdinfo->state &= ~SUBMIT_STATUS_URB;
M
Matthew Wilcox 已提交
550 551 552
	}

	if (cmdinfo->state & ALLOC_DATA_IN_URB) {
553
		cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC,
554
							cmnd, DMA_FROM_DEVICE);
M
Matthew Wilcox 已提交
555 556 557 558 559 560
		if (!cmdinfo->data_in_urb)
			return SCSI_MLQUEUE_DEVICE_BUSY;
		cmdinfo->state &= ~ALLOC_DATA_IN_URB;
	}

	if (cmdinfo->state & SUBMIT_DATA_IN_URB) {
561
		usb_anchor_urb(cmdinfo->data_in_urb, &devinfo->data_urbs);
562
		err = usb_submit_urb(cmdinfo->data_in_urb, GFP_ATOMIC);
H
Hans de Goede 已提交
563
		if (err) {
564
			usb_unanchor_urb(cmdinfo->data_in_urb);
565
			uas_log_cmd_state(cmnd, "data in submit err", err);
M
Matthew Wilcox 已提交
566 567 568
			return SCSI_MLQUEUE_DEVICE_BUSY;
		}
		cmdinfo->state &= ~SUBMIT_DATA_IN_URB;
569
		cmdinfo->state |= DATA_IN_URB_INFLIGHT;
M
Matthew Wilcox 已提交
570 571 572
	}

	if (cmdinfo->state & ALLOC_DATA_OUT_URB) {
573
		cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC,
574
							cmnd, DMA_TO_DEVICE);
M
Matthew Wilcox 已提交
575 576 577 578 579 580
		if (!cmdinfo->data_out_urb)
			return SCSI_MLQUEUE_DEVICE_BUSY;
		cmdinfo->state &= ~ALLOC_DATA_OUT_URB;
	}

	if (cmdinfo->state & SUBMIT_DATA_OUT_URB) {
581
		usb_anchor_urb(cmdinfo->data_out_urb, &devinfo->data_urbs);
582
		err = usb_submit_urb(cmdinfo->data_out_urb, GFP_ATOMIC);
H
Hans de Goede 已提交
583
		if (err) {
584
			usb_unanchor_urb(cmdinfo->data_out_urb);
585
			uas_log_cmd_state(cmnd, "data out submit err", err);
M
Matthew Wilcox 已提交
586 587 588
			return SCSI_MLQUEUE_DEVICE_BUSY;
		}
		cmdinfo->state &= ~SUBMIT_DATA_OUT_URB;
589
		cmdinfo->state |= DATA_OUT_URB_INFLIGHT;
M
Matthew Wilcox 已提交
590 591 592
	}

	if (cmdinfo->state & ALLOC_CMD_URB) {
593
		cmdinfo->cmd_urb = uas_alloc_cmd_urb(devinfo, GFP_ATOMIC, cmnd);
M
Matthew Wilcox 已提交
594 595 596 597 598 599
		if (!cmdinfo->cmd_urb)
			return SCSI_MLQUEUE_DEVICE_BUSY;
		cmdinfo->state &= ~ALLOC_CMD_URB;
	}

	if (cmdinfo->state & SUBMIT_CMD_URB) {
600
		usb_anchor_urb(cmdinfo->cmd_urb, &devinfo->cmd_urbs);
601
		err = usb_submit_urb(cmdinfo->cmd_urb, GFP_ATOMIC);
H
Hans de Goede 已提交
602
		if (err) {
603
			usb_unanchor_urb(cmdinfo->cmd_urb);
604
			uas_log_cmd_state(cmnd, "cmd submit err", err);
M
Matthew Wilcox 已提交
605 606
			return SCSI_MLQUEUE_DEVICE_BUSY;
		}
607
		cmdinfo->cmd_urb = NULL;
M
Matthew Wilcox 已提交
608
		cmdinfo->state &= ~SUBMIT_CMD_URB;
609
		cmdinfo->state |= COMMAND_INFLIGHT;
M
Matthew Wilcox 已提交
610 611 612 613 614
	}

	return 0;
}

J
Jeff Garzik 已提交
615
static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
M
Matthew Wilcox 已提交
616 617 618 619 620
					void (*done)(struct scsi_cmnd *))
{
	struct scsi_device *sdev = cmnd->device;
	struct uas_dev_info *devinfo = sdev->hostdata;
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
G
Gerd Hoffmann 已提交
621
	unsigned long flags;
H
Hans de Goede 已提交
622
	int idx, err;
M
Matthew Wilcox 已提交
623 624 625

	BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer));

626 627 628 629
	/* Re-check scsi_block_requests now that we've the host-lock */
	if (cmnd->device->host->host_self_blocked)
		return SCSI_MLQUEUE_DEVICE_BUSY;

630 631 632 633 634 635 636 637 638
	if ((devinfo->flags & US_FL_NO_ATA_1X) &&
			(cmnd->cmnd[0] == ATA_12 || cmnd->cmnd[0] == ATA_16)) {
		memcpy(cmnd->sense_buffer, usb_stor_sense_invalidCDB,
		       sizeof(usb_stor_sense_invalidCDB));
		cmnd->result = SAM_STAT_CHECK_CONDITION;
		cmnd->scsi_done(cmnd);
		return 0;
	}

639 640
	spin_lock_irqsave(&devinfo->lock, flags);

641 642 643
	if (devinfo->resetting) {
		cmnd->result = DID_ERROR << 16;
		cmnd->scsi_done(cmnd);
644
		spin_unlock_irqrestore(&devinfo->lock, flags);
645 646 647
		return 0;
	}

H
Hans de Goede 已提交
648 649 650 651 652 653
	/* Find a free uas-tag */
	for (idx = 0; idx < devinfo->qdepth; idx++) {
		if (!devinfo->cmnd[idx])
			break;
	}
	if (idx == devinfo->qdepth) {
G
Gerd Hoffmann 已提交
654
		spin_unlock_irqrestore(&devinfo->lock, flags);
M
Matthew Wilcox 已提交
655
		return SCSI_MLQUEUE_DEVICE_BUSY;
G
Gerd Hoffmann 已提交
656
	}
M
Matthew Wilcox 已提交
657 658 659

	cmnd->scsi_done = done;

660
	memset(cmdinfo, 0, sizeof(*cmdinfo));
H
Hans de Goede 已提交
661
	cmdinfo->uas_tag = idx + 1; /* uas-tag == usb-stream-id, so 1 based */
662
	cmdinfo->state = SUBMIT_STATUS_URB | ALLOC_CMD_URB | SUBMIT_CMD_URB;
M
Matthew Wilcox 已提交
663 664 665 666 667 668 669

	switch (cmnd->sc_data_direction) {
	case DMA_FROM_DEVICE:
		cmdinfo->state |= ALLOC_DATA_IN_URB | SUBMIT_DATA_IN_URB;
		break;
	case DMA_BIDIRECTIONAL:
		cmdinfo->state |= ALLOC_DATA_IN_URB | SUBMIT_DATA_IN_URB;
670
		/* fall through */
M
Matthew Wilcox 已提交
671 672 673 674 675 676
	case DMA_TO_DEVICE:
		cmdinfo->state |= ALLOC_DATA_OUT_URB | SUBMIT_DATA_OUT_URB;
	case DMA_NONE:
		break;
	}

H
Hans de Goede 已提交
677
	if (!devinfo->use_streams)
678
		cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB);
M
Matthew Wilcox 已提交
679

680
	err = uas_submit_urbs(cmnd, devinfo);
M
Matthew Wilcox 已提交
681 682
	if (err) {
		/* If we did nothing, give up now */
683
		if (cmdinfo->state & SUBMIT_STATUS_URB) {
G
Gerd Hoffmann 已提交
684
			spin_unlock_irqrestore(&devinfo->lock, flags);
M
Matthew Wilcox 已提交
685 686
			return SCSI_MLQUEUE_DEVICE_BUSY;
		}
G
Gerd Hoffmann 已提交
687
		uas_add_work(cmdinfo);
M
Matthew Wilcox 已提交
688 689
	}

H
Hans de Goede 已提交
690
	devinfo->cmnd[idx] = cmnd;
G
Gerd Hoffmann 已提交
691
	spin_unlock_irqrestore(&devinfo->lock, flags);
M
Matthew Wilcox 已提交
692 693 694
	return 0;
}

J
Jeff Garzik 已提交
695 696
static DEF_SCSI_QCMD(uas_queuecommand)

697 698 699 700 701 702
/*
 * For now we do not support actually sending an abort to the device, so
 * this eh always fails. Still we must define it to make sure that we've
 * dropped all references to the cmnd in question once this function exits.
 */
static int uas_eh_abort_handler(struct scsi_cmnd *cmnd)
M
Matthew Wilcox 已提交
703
{
704 705 706 707
	struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
	struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
	struct urb *data_in_urb = NULL;
	struct urb *data_out_urb = NULL;
G
Gerd Hoffmann 已提交
708
	unsigned long flags;
M
Matthew Wilcox 已提交
709

G
Gerd Hoffmann 已提交
710
	spin_lock_irqsave(&devinfo->lock, flags);
711

712
	uas_log_cmd_state(cmnd, __func__, 0);
713

714 715
	/* Ensure that try_complete does not call scsi_done */
	cmdinfo->state |= COMMAND_ABORTED;
716

717
	/* Drop all refs to this cmnd, kill data urbs to break their ref */
H
Hans de Goede 已提交
718
	devinfo->cmnd[cmdinfo->uas_tag - 1] = NULL;
719 720 721 722
	if (cmdinfo->state & DATA_IN_URB_INFLIGHT)
		data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
	if (cmdinfo->state & DATA_OUT_URB_INFLIGHT)
		data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
G
Gerd Hoffmann 已提交
723

724
	uas_free_unsubmitted_urbs(cmnd);
725 726 727

	spin_unlock_irqrestore(&devinfo->lock, flags);

728 729 730
	if (data_in_urb) {
		usb_kill_urb(data_in_urb);
		usb_put_urb(data_in_urb);
731
	}
732 733 734
	if (data_out_urb) {
		usb_kill_urb(data_out_urb);
		usb_put_urb(data_out_urb);
G
Gerd Hoffmann 已提交
735
	}
M
Matthew Wilcox 已提交
736

737
	return FAILED;
M
Matthew Wilcox 已提交
738 739
}

740
static int uas_eh_device_reset_handler(struct scsi_cmnd *cmnd)
M
Matthew Wilcox 已提交
741 742 743 744
{
	struct scsi_device *sdev = cmnd->device;
	struct uas_dev_info *devinfo = sdev->hostdata;
	struct usb_device *udev = devinfo->udev;
H
Hans de Goede 已提交
745
	unsigned long flags;
G
Gerd Hoffmann 已提交
746
	int err;
M
Matthew Wilcox 已提交
747

H
Hans de Goede 已提交
748 749 750 751 752 753 754
	err = usb_lock_device_for_reset(udev, devinfo->intf);
	if (err) {
		shost_printk(KERN_ERR, sdev->host,
			     "%s FAILED to get lock err %d\n", __func__, err);
		return FAILED;
	}

G
Gerd Hoffmann 已提交
755
	shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__);
H
Hans de Goede 已提交
756 757

	spin_lock_irqsave(&devinfo->lock, flags);
G
Gerd Hoffmann 已提交
758
	devinfo->resetting = 1;
H
Hans de Goede 已提交
759 760
	spin_unlock_irqrestore(&devinfo->lock, flags);

761
	usb_kill_anchored_urbs(&devinfo->cmd_urbs);
G
Gerd Hoffmann 已提交
762 763
	usb_kill_anchored_urbs(&devinfo->sense_urbs);
	usb_kill_anchored_urbs(&devinfo->data_urbs);
764 765
	uas_zap_pending(devinfo, DID_RESET);

G
Gerd Hoffmann 已提交
766
	err = usb_reset_device(udev);
H
Hans de Goede 已提交
767 768

	spin_lock_irqsave(&devinfo->lock, flags);
G
Gerd Hoffmann 已提交
769
	devinfo->resetting = 0;
H
Hans de Goede 已提交
770
	spin_unlock_irqrestore(&devinfo->lock, flags);
M
Matthew Wilcox 已提交
771

H
Hans de Goede 已提交
772 773
	usb_unlock_device(udev);

G
Gerd Hoffmann 已提交
774
	if (err) {
775 776
		shost_printk(KERN_INFO, sdev->host, "%s FAILED err %d\n",
			     __func__, err);
G
Gerd Hoffmann 已提交
777 778
		return FAILED;
	}
M
Matthew Wilcox 已提交
779

G
Gerd Hoffmann 已提交
780 781
	shost_printk(KERN_INFO, sdev->host, "%s success\n", __func__);
	return SUCCESS;
M
Matthew Wilcox 已提交
782 783
}

784 785 786 787 788 789 790 791 792 793 794
static int uas_target_alloc(struct scsi_target *starget)
{
	struct uas_dev_info *devinfo = (struct uas_dev_info *)
			dev_to_shost(starget->dev.parent)->hostdata;

	if (devinfo->flags & US_FL_NO_REPORT_LUNS)
		starget->no_report_luns = 1;

	return 0;
}

M
Matthew Wilcox 已提交
795 796
static int uas_slave_alloc(struct scsi_device *sdev)
{
797 798
	struct uas_dev_info *devinfo =
		(struct uas_dev_info *)sdev->host->hostdata;
799
	int maxp;
800 801

	sdev->hostdata = devinfo;
802

803
	/*
804 805 806 807
	 * We have two requirements here. We must satisfy the requirements
	 * of the physical HC and the demands of the protocol, as we
	 * definitely want no additional memory allocation in this path
	 * ruling out using bounce buffers.
808
	 *
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
	 * For a transmission on USB to continue we must never send
	 * a package that is smaller than maxpacket. Hence the length of each
         * scatterlist element except the last must be divisible by the
         * Bulk maxpacket value.
	 * If the HC does not ensure that through SG,
	 * the upper layer must do that. We must assume nothing
	 * about the capabilities off the HC, so we use the most
	 * pessimistic requirement.
	 */

	maxp = usb_maxpacket(devinfo->udev, devinfo->data_in_pipe, 0);
	blk_queue_virt_boundary(sdev->request_queue, maxp - 1);

	/*
	 * The protocol has no requirements on alignment in the strict sense.
	 * Controllers may or may not have alignment restrictions.
	 * As this is not exported, we use an extremely conservative guess.
826 827 828
	 */
	blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1));

829 830 831 832 833
	if (devinfo->flags & US_FL_MAX_SECTORS_64)
		blk_queue_max_hw_sectors(sdev->request_queue, 64);
	else if (devinfo->flags & US_FL_MAX_SECTORS_240)
		blk_queue_max_hw_sectors(sdev->request_queue, 240);

M
Matthew Wilcox 已提交
834 835 836 837 838 839
	return 0;
}

static int uas_slave_configure(struct scsi_device *sdev)
{
	struct uas_dev_info *devinfo = sdev->hostdata;
H
Hans de Goede 已提交
840 841 842 843

	if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
		sdev->no_report_opcodes = 1;

844 845 846 847
	/* A few buggy USB-ATA bridges don't understand FUA */
	if (devinfo->flags & US_FL_BROKEN_FUA)
		sdev->broken_fua = 1;

848 849 850 851 852 853
	/* UAS also needs to support FL_ALWAYS_SYNC */
	if (devinfo->flags & US_FL_ALWAYS_SYNC) {
		sdev->skip_ms_page_3f = 1;
		sdev->skip_ms_page_8 = 1;
		sdev->wce_default_on = 1;
	}
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874

	/*
	 * Some disks return the total number of blocks in response
	 * to READ CAPACITY rather than the highest block number.
	 * If this device makes that mistake, tell the sd driver.
	 */
	if (devinfo->flags & US_FL_FIX_CAPACITY)
		sdev->fix_capacity = 1;

	/*
	 * Some devices don't like MODE SENSE with page=0x3f,
	 * which is the command used for checking if a device
	 * is write-protected.  Now that we tell the sd driver
	 * to do a 192-byte transfer with this command the
	 * majority of devices work fine, but a few still can't
	 * handle it.  The sd driver will simply assume those
	 * devices are write-enabled.
	 */
	if (devinfo->flags & US_FL_NO_WP_DETECT)
		sdev->skip_ms_page_3f = 1;

875
	scsi_change_queue_depth(sdev, devinfo->qdepth - 2);
M
Matthew Wilcox 已提交
876 877 878 879 880 881 882
	return 0;
}

static struct scsi_host_template uas_host_template = {
	.module = THIS_MODULE,
	.name = "uas",
	.queuecommand = uas_queuecommand,
883
	.target_alloc = uas_target_alloc,
M
Matthew Wilcox 已提交
884 885 886
	.slave_alloc = uas_slave_alloc,
	.slave_configure = uas_slave_configure,
	.eh_abort_handler = uas_eh_abort_handler,
887
	.eh_device_reset_handler = uas_eh_device_reset_handler,
M
Matthew Wilcox 已提交
888 889 890 891 892
	.this_id = -1,
	.sg_tablesize = SG_NONE,
	.skip_settle_delay = 1,
};

893 894 895 896 897 898
#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
		    vendorName, productName, useProtocol, useTransport, \
		    initFunction, flags) \
{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
	.driver_info = (flags) }

M
Matthew Wilcox 已提交
899
static struct usb_device_id uas_usb_ids[] = {
900
#	include "unusual_uas.h"
M
Matthew Wilcox 已提交
901 902 903 904 905 906
	{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, USB_SC_SCSI, USB_PR_BULK) },
	{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, USB_SC_SCSI, USB_PR_UAS) },
	{ }
};
MODULE_DEVICE_TABLE(usb, uas_usb_ids);

907 908
#undef UNUSUAL_DEV

909 910 911
static int uas_switch_interface(struct usb_device *udev,
				struct usb_interface *intf)
{
912
	struct usb_host_interface *alt;
913 914

	alt = uas_find_uas_alt_setting(intf);
915 916
	if (!alt)
		return -ENODEV;
917

918 919
	return usb_set_interface(udev, alt->desc.bInterfaceNumber,
			alt->desc.bAlternateSetting);
920 921
}

922
static int uas_configure_endpoints(struct uas_dev_info *devinfo)
923 924 925 926 927 928
{
	struct usb_host_endpoint *eps[4] = { };
	struct usb_device *udev = devinfo->udev;
	int r;

	r = uas_find_endpoints(devinfo->intf->cur_altsetting, eps);
929 930 931 932 933 934 935 936 937 938 939
	if (r)
		return r;

	devinfo->cmd_pipe = usb_sndbulkpipe(udev,
					    usb_endpoint_num(&eps[0]->desc));
	devinfo->status_pipe = usb_rcvbulkpipe(udev,
					    usb_endpoint_num(&eps[1]->desc));
	devinfo->data_in_pipe = usb_rcvbulkpipe(udev,
					    usb_endpoint_num(&eps[2]->desc));
	devinfo->data_out_pipe = usb_sndbulkpipe(udev,
					    usb_endpoint_num(&eps[3]->desc));
M
Matthew Wilcox 已提交
940

941
	if (udev->speed < USB_SPEED_SUPER) {
942
		devinfo->qdepth = 32;
M
Matthew Wilcox 已提交
943 944
		devinfo->use_streams = 0;
	} else {
945
		devinfo->qdepth = usb_alloc_streams(devinfo->intf, eps + 1,
946
						    3, MAX_CMNDS, GFP_NOIO);
947 948
		if (devinfo->qdepth < 0)
			return devinfo->qdepth;
M
Matthew Wilcox 已提交
949 950
		devinfo->use_streams = 1;
	}
951 952

	return 0;
M
Matthew Wilcox 已提交
953 954
}

955 956 957 958 959 960 961 962
static void uas_free_streams(struct uas_dev_info *devinfo)
{
	struct usb_device *udev = devinfo->udev;
	struct usb_host_endpoint *eps[3];

	eps[0] = usb_pipe_endpoint(udev, devinfo->status_pipe);
	eps[1] = usb_pipe_endpoint(udev, devinfo->data_in_pipe);
	eps[2] = usb_pipe_endpoint(udev, devinfo->data_out_pipe);
963
	usb_free_streams(devinfo->intf, eps, 3, GFP_NOIO);
964 965
}

M
Matthew Wilcox 已提交
966 967
static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
968 969
	int result = -ENOMEM;
	struct Scsi_Host *shost = NULL;
M
Matthew Wilcox 已提交
970 971
	struct uas_dev_info *devinfo;
	struct usb_device *udev = interface_to_usbdev(intf);
972
	unsigned long dev_flags;
M
Matthew Wilcox 已提交
973

974
	if (!uas_use_uas_driver(intf, id, &dev_flags))
975 976
		return -ENODEV;

977 978
	if (uas_switch_interface(udev, intf))
		return -ENODEV;
M
Matthew Wilcox 已提交
979

H
Hans de Goede 已提交
980 981
	shost = scsi_host_alloc(&uas_host_template,
				sizeof(struct uas_dev_info));
M
Matthew Wilcox 已提交
982
	if (!shost)
983
		goto set_alt0;
M
Matthew Wilcox 已提交
984 985 986

	shost->max_cmd_len = 16 + 252;
	shost->max_id = 1;
987 988
	shost->max_lun = 256;
	shost->max_channel = 0;
M
Matthew Wilcox 已提交
989 990
	shost->sg_tablesize = udev->bus->sg_tablesize;

H
Hans de Goede 已提交
991
	devinfo = (struct uas_dev_info *)shost->hostdata;
M
Matthew Wilcox 已提交
992 993
	devinfo->intf = intf;
	devinfo->udev = udev;
G
Gerd Hoffmann 已提交
994
	devinfo->resetting = 0;
H
Hans de Goede 已提交
995
	devinfo->shutdown = 0;
996
	devinfo->flags = dev_flags;
997
	init_usb_anchor(&devinfo->cmd_urbs);
998 999
	init_usb_anchor(&devinfo->sense_urbs);
	init_usb_anchor(&devinfo->data_urbs);
G
Gerd Hoffmann 已提交
1000
	spin_lock_init(&devinfo->lock);
G
Gerd Hoffmann 已提交
1001
	INIT_WORK(&devinfo->work, uas_do_work);
1002 1003 1004 1005

	result = uas_configure_endpoints(devinfo);
	if (result)
		goto set_alt0;
M
Matthew Wilcox 已提交
1006

1007 1008 1009 1010 1011 1012
	/*
	 * 1 tag is reserved for untagged commands +
	 * 1 tag to avoid off by one errors in some bridge firmwares
	 */
	shost->can_queue = devinfo->qdepth - 2;

1013
	usb_set_intfdata(intf, shost);
1014 1015
	result = scsi_add_host(shost, &intf->dev);
	if (result)
1016
		goto free_streams;
1017

M
Matthew Wilcox 已提交
1018 1019
	scsi_scan_host(shost);
	return result;
1020

1021
free_streams:
1022
	uas_free_streams(devinfo);
1023
	usb_set_intfdata(intf, NULL);
1024 1025
set_alt0:
	usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
M
Matthew Wilcox 已提交
1026 1027 1028 1029 1030
	if (shost)
		scsi_host_put(shost);
	return result;
}

1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
static int uas_cmnd_list_empty(struct uas_dev_info *devinfo)
{
	unsigned long flags;
	int i, r = 1;

	spin_lock_irqsave(&devinfo->lock, flags);

	for (i = 0; i < devinfo->qdepth; i++) {
		if (devinfo->cmnd[i]) {
			r = 0; /* Not empty */
			break;
		}
	}

	spin_unlock_irqrestore(&devinfo->lock, flags);

	return r;
}

/*
 * Wait for any pending cmnds to complete, on usb-2 sense_urbs may temporarily
 * get empty while there still is more work to do due to sense-urbs completing
 * with a READ/WRITE_READY iu code, so keep waiting until the list gets empty.
 */
static int uas_wait_for_pending_cmnds(struct uas_dev_info *devinfo)
{
	unsigned long start_time;
	int r;

	start_time = jiffies;
	do {
		flush_work(&devinfo->work);

		r = usb_wait_anchor_empty_timeout(&devinfo->sense_urbs, 5000);
		if (r == 0)
			return -ETIME;

		r = usb_wait_anchor_empty_timeout(&devinfo->data_urbs, 500);
		if (r == 0)
			return -ETIME;

		if (time_after(jiffies, start_time + 5 * HZ))
			return -ETIME;
	} while (!uas_cmnd_list_empty(devinfo));

	return 0;
}

M
Matthew Wilcox 已提交
1079 1080
static int uas_pre_reset(struct usb_interface *intf)
{
1081
	struct Scsi_Host *shost = usb_get_intfdata(intf);
H
Hans de Goede 已提交
1082
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1083 1084
	unsigned long flags;

H
Hans de Goede 已提交
1085 1086 1087
	if (devinfo->shutdown)
		return 0;

1088 1089 1090 1091 1092
	/* Block new requests */
	spin_lock_irqsave(shost->host_lock, flags);
	scsi_block_requests(shost);
	spin_unlock_irqrestore(shost->host_lock, flags);

1093
	if (uas_wait_for_pending_cmnds(devinfo) != 0) {
1094
		shost_printk(KERN_ERR, shost, "%s: timed out\n", __func__);
1095
		scsi_unblock_requests(shost);
1096 1097 1098 1099 1100
		return 1;
	}

	uas_free_streams(devinfo);

M
Matthew Wilcox 已提交
1101 1102 1103 1104 1105
	return 0;
}

static int uas_post_reset(struct usb_interface *intf)
{
1106
	struct Scsi_Host *shost = usb_get_intfdata(intf);
H
Hans de Goede 已提交
1107
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1108
	unsigned long flags;
1109
	int err;
1110

H
Hans de Goede 已提交
1111 1112 1113
	if (devinfo->shutdown)
		return 0;

1114
	err = uas_configure_endpoints(devinfo);
1115
	if (err && err != -ENODEV)
1116
		shost_printk(KERN_ERR, shost,
1117 1118
			     "%s: alloc streams error %d after reset",
			     __func__, err);
1119

1120
	/* we must unblock the host in every case lest we deadlock */
1121 1122 1123 1124 1125 1126
	spin_lock_irqsave(shost->host_lock, flags);
	scsi_report_bus_reset(shost, 0);
	spin_unlock_irqrestore(shost->host_lock, flags);

	scsi_unblock_requests(shost);

1127
	return err ? 1 : 0;
M
Matthew Wilcox 已提交
1128 1129
}

H
Hans de Goede 已提交
1130 1131 1132
static int uas_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct Scsi_Host *shost = usb_get_intfdata(intf);
H
Hans de Goede 已提交
1133
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
H
Hans de Goede 已提交
1134

1135
	if (uas_wait_for_pending_cmnds(devinfo) != 0) {
H
Hans de Goede 已提交
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
		shost_printk(KERN_ERR, shost, "%s: timed out\n", __func__);
		return -ETIME;
	}

	return 0;
}

static int uas_resume(struct usb_interface *intf)
{
	return 0;
}

static int uas_reset_resume(struct usb_interface *intf)
{
	struct Scsi_Host *shost = usb_get_intfdata(intf);
H
Hans de Goede 已提交
1151
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
H
Hans de Goede 已提交
1152
	unsigned long flags;
1153
	int err;
H
Hans de Goede 已提交
1154

1155 1156
	err = uas_configure_endpoints(devinfo);
	if (err) {
H
Hans de Goede 已提交
1157
		shost_printk(KERN_ERR, shost,
1158 1159
			     "%s: alloc streams error %d after reset",
			     __func__, err);
H
Hans de Goede 已提交
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
		return -EIO;
	}

	spin_lock_irqsave(shost->host_lock, flags);
	scsi_report_bus_reset(shost, 0);
	spin_unlock_irqrestore(shost->host_lock, flags);

	return 0;
}

M
Matthew Wilcox 已提交
1170 1171 1172
static void uas_disconnect(struct usb_interface *intf)
{
	struct Scsi_Host *shost = usb_get_intfdata(intf);
H
Hans de Goede 已提交
1173
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
H
Hans de Goede 已提交
1174
	unsigned long flags;
M
Matthew Wilcox 已提交
1175

H
Hans de Goede 已提交
1176
	spin_lock_irqsave(&devinfo->lock, flags);
G
Gerd Hoffmann 已提交
1177
	devinfo->resetting = 1;
H
Hans de Goede 已提交
1178 1179
	spin_unlock_irqrestore(&devinfo->lock, flags);

G
Gerd Hoffmann 已提交
1180
	cancel_work_sync(&devinfo->work);
1181
	usb_kill_anchored_urbs(&devinfo->cmd_urbs);
1182 1183
	usb_kill_anchored_urbs(&devinfo->sense_urbs);
	usb_kill_anchored_urbs(&devinfo->data_urbs);
1184 1185
	uas_zap_pending(devinfo, DID_NO_CONNECT);

G
Gerd Hoffmann 已提交
1186
	scsi_remove_host(shost);
1187
	uas_free_streams(devinfo);
H
Hans de Goede 已提交
1188
	scsi_host_put(shost);
M
Matthew Wilcox 已提交
1189 1190
}

H
Hans de Goede 已提交
1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
/*
 * Put the device back in usb-storage mode on shutdown, as some BIOS-es
 * hang on reboot when the device is still in uas mode. Note the reset is
 * necessary as some devices won't revert to usb-storage mode without it.
 */
static void uas_shutdown(struct device *dev)
{
	struct usb_interface *intf = to_usb_interface(dev);
	struct usb_device *udev = interface_to_usbdev(intf);
	struct Scsi_Host *shost = usb_get_intfdata(intf);
H
Hans de Goede 已提交
1201
	struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
H
Hans de Goede 已提交
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211

	if (system_state != SYSTEM_RESTART)
		return;

	devinfo->shutdown = 1;
	uas_free_streams(devinfo);
	usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
	usb_reset_device(udev);
}

M
Matthew Wilcox 已提交
1212 1213 1214 1215 1216 1217
static struct usb_driver uas_driver = {
	.name = "uas",
	.probe = uas_probe,
	.disconnect = uas_disconnect,
	.pre_reset = uas_pre_reset,
	.post_reset = uas_post_reset,
H
Hans de Goede 已提交
1218 1219 1220
	.suspend = uas_suspend,
	.resume = uas_resume,
	.reset_resume = uas_reset_resume,
H
Hans de Goede 已提交
1221
	.drvwrap.driver.shutdown = uas_shutdown,
M
Matthew Wilcox 已提交
1222 1223 1224
	.id_table = uas_usb_ids,
};

1225
module_usb_driver(uas_driver);
M
Matthew Wilcox 已提交
1226 1227

MODULE_LICENSE("GPL");
1228 1229
MODULE_AUTHOR(
	"Hans de Goede <hdegoede@redhat.com>, Matthew Wilcox and Sarah Sharp");