]> git.ipfire.org Git - people/ms/u-boot.git/blame - common/usb_storage.c
scsi: move the partition initialization out of the scsi detection
[people/ms/u-boot.git] / common / usb_storage.c
CommitLineData
affae2bf 1/*
460c322f
WD
2 * Most of this source has been derived from the Linux USB
3 * project:
4 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
5 * (c) 2000 David L. Brown, Jr. (usb-storage@davidb.org)
6 * (c) 1999 Michael Gee (michael@linuxspecific.com)
7 * (c) 2000 Yggdrasil Computing, Inc.
8 *
9 *
10 * Adapted for U-Boot:
11 * (C) Copyright 2001 Denis Peter, MPL AG Switzerland
acf277af
SG
12 * Driver model conversion:
13 * (C) Copyright 2015 Google, Inc
affae2bf 14 *
149dded2 15 * For BBB support (C) Copyright 2003
792a09eb 16 * Gary Jennejohn, DENX Software Engineering <garyj@denx.de>
149dded2 17 *
460c322f 18 * BBB support based on /sys/dev/usb/umass.c from
149dded2 19 * FreeBSD.
affae2bf 20 *
1a459660 21 * SPDX-License-Identifier: GPL-2.0+
affae2bf
WD
22 */
23
24/* Note:
25 * Currently only the CBI transport protocoll has been implemented, and it
26 * is only tested with a TEAC USB Floppy. Other Massstorages with CBI or CB
27 * transport protocoll may work as well.
28 */
149dded2
WD
29/*
30 * New Note:
31 * Support for USB Mass Storage Devices (BBB) has been added. It has
32 * only been tested with USB memory sticks.
149dded2 33 */
affae2bf
WD
34
35
affae2bf
WD
36#include <common.h>
37#include <command.h>
acf277af 38#include <dm.h>
91557579 39#include <errno.h>
4fd074de 40#include <inttypes.h>
05108132 41#include <mapmem.h>
cf92e05c 42#include <memalign.h>
c918261c 43#include <asm/byteorder.h>
affae2bf 44#include <asm/processor.h>
acf277af 45#include <dm/device-internal.h>
07b2b78c 46#include <dm/lists.h>
affae2bf 47
735dd97b 48#include <part.h>
affae2bf
WD
49#include <usb.h>
50
80885a9d
WD
51#undef BBB_COMDAT_TRACE
52#undef BBB_XPORT_TRACE
affae2bf 53
affae2bf
WD
54#include <scsi.h>
55/* direction table -- this indicates the direction of the data
56 * transfer for each command code -- a 1 indicates input
57 */
2ff12285 58static const unsigned char us_direction[256/8] = {
affae2bf
WD
59 0x28, 0x81, 0x14, 0x14, 0x20, 0x01, 0x90, 0x77,
60 0x0C, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
63};
64#define US_DIRECTION(x) ((us_direction[x>>3] >> (x & 7)) & 1)
65
f5766139 66static ccb usb_ccb __attribute__((aligned(ARCH_DMA_MINALIGN)));
a0cb3fc3 67static __u32 CBWTag;
149dded2 68
a0cb3fc3 69static int usb_max_devs; /* number of highest available usb device */
affae2bf 70
07b2b78c 71#ifndef CONFIG_BLK
4101f687 72static struct blk_desc usb_dev_desc[USB_MAX_STOR_DEV];
07b2b78c 73#endif
affae2bf
WD
74
75struct us_data;
a0cb3fc3
MT
76typedef int (*trans_cmnd)(ccb *cb, struct us_data *data);
77typedef int (*trans_reset)(struct us_data *data);
affae2bf
WD
78
79struct us_data {
a0cb3fc3
MT
80 struct usb_device *pusb_dev; /* this usb_device */
81
82 unsigned int flags; /* from filter initially */
3e8581bb 83# define USB_READY (1 << 0)
a0cb3fc3
MT
84 unsigned char ifnum; /* interface number */
85 unsigned char ep_in; /* in endpoint */
86 unsigned char ep_out; /* out ....... */
87 unsigned char ep_int; /* interrupt . */
88 unsigned char subclass; /* as in overview */
89 unsigned char protocol; /* .............. */
90 unsigned char attention_done; /* force attn on first cmd */
91 unsigned short ip_data; /* interrupt data */
92 int action; /* what to do */
93 int ip_wanted; /* needed */
94 int *irq_handle; /* for USB int requests */
95 unsigned int irqpipe; /* pipe for release_irq */
96 unsigned char irqmaxp; /* max packed for irq Pipe */
97 unsigned char irqinterval; /* Intervall for IRQ Pipe */
98 ccb *srb; /* current srb */
99 trans_reset transport_reset; /* reset routine */
100 trans_cmnd transport; /* transport routine */
affae2bf
WD
101};
102
cffcc503 103#ifdef CONFIG_USB_EHCI
1b4bd0e6 104/*
4bee5c83
BT
105 * The U-Boot EHCI driver can handle any transfer length as long as there is
106 * enough free heap space left, but the SCSI READ(10) and WRITE(10) commands are
107 * limited to 65535 blocks.
1b4bd0e6 108 */
4bee5c83 109#define USB_MAX_XFER_BLK 65535
cffcc503 110#else
4bee5c83 111#define USB_MAX_XFER_BLK 20
cffcc503 112#endif
1b4bd0e6 113
07b2b78c 114#ifndef CONFIG_BLK
affae2bf 115static struct us_data usb_stor[USB_MAX_STOR_DEV];
07b2b78c 116#endif
affae2bf 117
80885a9d 118#define USB_STOR_TRANSPORT_GOOD 0
affae2bf
WD
119#define USB_STOR_TRANSPORT_FAILED -1
120#define USB_STOR_TRANSPORT_ERROR -2
121
a0cb3fc3 122int usb_stor_get_info(struct usb_device *dev, struct us_data *us,
4101f687 123 struct blk_desc *dev_desc);
a0cb3fc3
MT
124int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
125 struct us_data *ss);
07b2b78c
SG
126#ifdef CONFIG_BLK
127static unsigned long usb_stor_read(struct udevice *dev, lbaint_t blknr,
128 lbaint_t blkcnt, void *buffer);
129static unsigned long usb_stor_write(struct udevice *dev, lbaint_t blknr,
130 lbaint_t blkcnt, const void *buffer);
131#else
4101f687 132static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
7c4213f6 133 lbaint_t blkcnt, void *buffer);
4101f687 134static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
7c4213f6 135 lbaint_t blkcnt, const void *buffer);
07b2b78c 136#endif
affae2bf
WD
137void uhci_show_temp_int_td(void);
138
199adb60 139static void usb_show_progress(void)
affae2bf 140{
226fa9bb 141 debug(".");
affae2bf
WD
142}
143
a0cb3fc3 144/*******************************************************************************
9c998aa8
WD
145 * show info on storage devices; 'usb start/init' must be invoked earlier
146 * as we only retrieve structures populated during devices initialization
147 */
f6b44e0e 148int usb_stor_info(void)
9c998aa8 149{
9807c3b7 150 int count = 0;
07b2b78c
SG
151#ifdef CONFIG_BLK
152 struct udevice *dev;
153
154 for (blk_first_device(IF_TYPE_USB, &dev);
155 dev;
156 blk_next_device(&dev)) {
157 struct blk_desc *desc = dev_get_uclass_platdata(dev);
158
159 printf(" Device %d: ", desc->devnum);
160 dev_print(desc);
161 count++;
162 }
163#else
9c998aa8
WD
164 int i;
165
f6b44e0e 166 if (usb_max_devs > 0) {
9c998aa8 167 for (i = 0; i < usb_max_devs; i++) {
a0cb3fc3 168 printf(" Device %d: ", i);
9c998aa8
WD
169 dev_print(&usb_dev_desc[i]);
170 }
b9e749e9 171 return 0;
f6b44e0e 172 }
07b2b78c 173#endif
9807c3b7
SG
174 if (!count) {
175 printf("No storage devices, perhaps not 'usb start'ed..?\n");
176 return 1;
177 }
178
b94fc851 179 return 0;
9c998aa8
WD
180}
181
99e9ed1f
LC
182static unsigned int usb_get_max_lun(struct us_data *us)
183{
184 int len;
f5766139 185 ALLOC_CACHE_ALIGN_BUFFER(unsigned char, result, 1);
99e9ed1f
LC
186 len = usb_control_msg(us->pusb_dev,
187 usb_rcvctrlpipe(us->pusb_dev, 0),
188 US_BBB_GET_MAX_LUN,
189 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
190 0, us->ifnum,
f5766139 191 result, sizeof(char),
99e9ed1f 192 USB_CNTL_TIMEOUT * 5);
ceb4972a 193 debug("Get Max LUN -> len = %i, result = %i\n", len, (int) *result);
f5766139 194 return (len > 0) ? *result : 0;
99e9ed1f
LC
195}
196
9807c3b7 197static int usb_stor_probe_device(struct usb_device *udev)
91557579 198{
9807c3b7 199 int lun, max_lun;
07b2b78c
SG
200
201#ifdef CONFIG_BLK
202 struct us_data *data;
07b2b78c
SG
203 int ret;
204#else
9807c3b7
SG
205 int start;
206
207 if (udev == NULL)
91557579 208 return -ENOENT; /* no more devices available */
07b2b78c
SG
209#endif
210
211 debug("\n\nProbing for storage\n");
212#ifdef CONFIG_BLK
213 /*
214 * We store the us_data in the mass storage device's platdata. It
215 * is shared by all LUNs (block devices) attached to this mass storage
216 * device.
217 */
218 data = dev_get_platdata(udev->dev);
219 if (!usb_storage_probe(udev, 0, data))
220 return 0;
221 max_lun = usb_get_max_lun(data);
222 for (lun = 0; lun <= max_lun; lun++) {
223 struct blk_desc *blkdev;
224 struct udevice *dev;
9107c973 225 char str[10];
07b2b78c 226
9107c973
SG
227 snprintf(str, sizeof(str), "lun%d", lun);
228 ret = blk_create_devicef(udev->dev, "usb_storage_blk", str,
229 IF_TYPE_USB, usb_max_devs, 512, 0,
230 &dev);
07b2b78c
SG
231 if (ret) {
232 debug("Cannot bind driver\n");
233 return ret;
234 }
235
236 blkdev = dev_get_uclass_platdata(dev);
237 blkdev->target = 0xff;
238 blkdev->lun = lun;
91557579 239
07b2b78c
SG
240 ret = usb_stor_get_info(udev, data, blkdev);
241 if (ret == 1)
242 ret = blk_prepare_device(dev);
243 if (!ret) {
244 usb_max_devs++;
245 debug("%s: Found device %p\n", __func__, udev);
246 } else {
247 debug("usb_stor_get_info: Invalid device\n");
248 ret = device_unbind(dev);
249 if (ret)
250 return ret;
251 }
252 }
253#else
c89e79d4
SG
254 /* We don't have space to even probe if we hit the maximum */
255 if (usb_max_devs == USB_MAX_STOR_DEV) {
256 printf("max USB Storage Device reached: %d stopping\n",
257 usb_max_devs);
258 return -ENOSPC;
259 }
260
9807c3b7
SG
261 if (!usb_storage_probe(udev, 0, &usb_stor[usb_max_devs]))
262 return 0;
263
264 /*
265 * OK, it's a storage device. Iterate over its LUNs and populate
266 * usb_dev_desc'
267 */
268 start = usb_max_devs;
269
270 max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
271 for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
272 lun++) {
273 struct blk_desc *blkdev;
274
275 blkdev = &usb_dev_desc[usb_max_devs];
276 memset(blkdev, '\0', sizeof(struct blk_desc));
277 blkdev->if_type = IF_TYPE_USB;
278 blkdev->devnum = usb_max_devs;
279 blkdev->part_type = PART_TYPE_UNKNOWN;
280 blkdev->target = 0xff;
281 blkdev->type = DEV_TYPE_UNKNOWN;
282 blkdev->block_read = usb_stor_read;
283 blkdev->block_write = usb_stor_write;
284 blkdev->lun = lun;
285 blkdev->priv = udev;
286
287 if (usb_stor_get_info(udev, &usb_stor[start],
288 &usb_dev_desc[usb_max_devs]) == 1) {
07b2b78c
SG
289 debug("partype: %d\n", blkdev->part_type);
290 part_init(blkdev);
291 debug("partype: %d\n", blkdev->part_type);
9807c3b7
SG
292 usb_max_devs++;
293 debug("%s: Found device %p\n", __func__, udev);
91557579
SG
294 }
295 }
07b2b78c 296#endif
91557579 297
91557579
SG
298 return 0;
299}
300
301void usb_stor_reset(void)
302{
303 usb_max_devs = 0;
304}
305
a0cb3fc3 306/*******************************************************************************
9c998aa8 307 * scan the usb and reports device info
affae2bf
WD
308 * to the user if mode = 1
309 * returns current device or -1 if no
310 */
311int usb_stor_scan(int mode)
312{
a0cb3fc3 313 if (mode == 1)
93c2582f 314 printf(" scanning usb for storage devices... ");
a0cb3fc3 315
b984700c
MS
316#ifndef CONFIG_DM_USB
317 unsigned char i;
318
affae2bf
WD
319 usb_disable_asynch(1); /* asynch transfer not allowed */
320
91557579 321 usb_stor_reset();
a0cb3fc3 322 for (i = 0; i < USB_MAX_DEVICE; i++) {
91557579
SG
323 struct usb_device *dev;
324
a0cb3fc3 325 dev = usb_get_dev_index(i); /* get device */
ceb4972a 326 debug("i=%d\n", i);
91557579 327 if (usb_stor_probe_device(dev))
affae2bf 328 break;
affae2bf 329 } /* for */
095b8a37 330
affae2bf 331 usb_disable_asynch(0); /* asynch transfer allowed */
b984700c 332#endif
9c998aa8 333 printf("%d Storage Device(s) found\n", usb_max_devs);
a0cb3fc3 334 if (usb_max_devs > 0)
affae2bf 335 return 0;
a0cb3fc3 336 return -1;
affae2bf
WD
337}
338
339static int usb_stor_irq(struct usb_device *dev)
340{
341 struct us_data *us;
a0cb3fc3 342 us = (struct us_data *)dev->privptr;
affae2bf 343
a0cb3fc3
MT
344 if (us->ip_wanted)
345 us->ip_wanted = 0;
affae2bf
WD
346 return 0;
347}
348
349
ceb4972a 350#ifdef DEBUG
affae2bf 351
a0cb3fc3 352static void usb_show_srb(ccb *pccb)
affae2bf
WD
353{
354 int i;
a0cb3fc3
MT
355 printf("SRB: len %d datalen 0x%lX\n ", pccb->cmdlen, pccb->datalen);
356 for (i = 0; i < 12; i++)
357 printf("%02X ", pccb->cmd[i]);
affae2bf
WD
358 printf("\n");
359}
360
361static void display_int_status(unsigned long tmp)
362{
363 printf("Status: %s %s %s %s %s %s %s\n",
364 (tmp & USB_ST_ACTIVE) ? "Active" : "",
365 (tmp & USB_ST_STALLED) ? "Stalled" : "",
366 (tmp & USB_ST_BUF_ERR) ? "Buffer Error" : "",
367 (tmp & USB_ST_BABBLE_DET) ? "Babble Det" : "",
368 (tmp & USB_ST_NAK_REC) ? "NAKed" : "",
369 (tmp & USB_ST_CRC_ERR) ? "CRC Error" : "",
370 (tmp & USB_ST_BIT_ERR) ? "Bitstuff Error" : "");
371}
372#endif
373/***********************************************************************
374 * Data transfer routines
375 ***********************************************************************/
376
377static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length)
378{
379 int max_size;
380 int this_xfer;
381 int result;
382 int partial;
383 int maxtry;
384 int stat;
385
386 /* determine the maximum packet size for these transfers */
387 max_size = usb_maxpacket(us->pusb_dev, pipe) * 16;
388
389 /* while we have data left to transfer */
390 while (length) {
391
392 /* calculate how long this will be -- maximum or a remainder */
393 this_xfer = length > max_size ? max_size : length;
394 length -= this_xfer;
395
396 /* setup the retry counter */
397 maxtry = 10;
398
399 /* set up the transfer loop */
400 do {
401 /* transfer the data */
05108132
SG
402 debug("Bulk xfer 0x%lx(%d) try #%d\n",
403 (ulong)map_to_sysmem(buf), this_xfer,
404 11 - maxtry);
affae2bf 405 result = usb_bulk_msg(us->pusb_dev, pipe, buf,
a0cb3fc3
MT
406 this_xfer, &partial,
407 USB_CNTL_TIMEOUT * 5);
ceb4972a
VG
408 debug("bulk_msg returned %d xferred %d/%d\n",
409 result, partial, this_xfer);
a0cb3fc3
MT
410 if (us->pusb_dev->status != 0) {
411 /* if we stall, we need to clear it before
412 * we go on
413 */
ceb4972a 414#ifdef DEBUG
affae2bf
WD
415 display_int_status(us->pusb_dev->status);
416#endif
417 if (us->pusb_dev->status & USB_ST_STALLED) {
ceb4972a
VG
418 debug("stalled ->clearing endpoint" \
419 "halt for pipe 0x%x\n", pipe);
affae2bf
WD
420 stat = us->pusb_dev->status;
421 usb_clear_halt(us->pusb_dev, pipe);
a0cb3fc3
MT
422 us->pusb_dev->status = stat;
423 if (this_xfer == partial) {
ceb4972a
VG
424 debug("bulk transferred" \
425 "with error %lX," \
426 " but data ok\n",
427 us->pusb_dev->status);
affae2bf
WD
428 return 0;
429 }
430 else
431 return result;
432 }
433 if (us->pusb_dev->status & USB_ST_NAK_REC) {
ceb4972a 434 debug("Device NAKed bulk_msg\n");
affae2bf
WD
435 return result;
436 }
ceb4972a 437 debug("bulk transferred with error");
a0cb3fc3 438 if (this_xfer == partial) {
ceb4972a
VG
439 debug(" %ld, but data ok\n",
440 us->pusb_dev->status);
affae2bf
WD
441 return 0;
442 }
443 /* if our try counter reaches 0, bail out */
ceb4972a
VG
444 debug(" %ld, data %d\n",
445 us->pusb_dev->status, partial);
affae2bf
WD
446 if (!maxtry--)
447 return result;
448 }
449 /* update to show what data was transferred */
450 this_xfer -= partial;
451 buf += partial;
452 /* continue until this transfer is done */
a0cb3fc3 453 } while (this_xfer);
affae2bf
WD
454 }
455
456 /* if we get here, we're done and successful */
457 return 0;
458}
459
149dded2
WD
460static int usb_stor_BBB_reset(struct us_data *us)
461{
462 int result;
463 unsigned int pipe;
464
465 /*
466 * Reset recovery (5.3.4 in Universal Serial Bus Mass Storage Class)
467 *
468 * For Reset Recovery the host shall issue in the following order:
469 * a) a Bulk-Only Mass Storage Reset
470 * b) a Clear Feature HALT to the Bulk-In endpoint
471 * c) a Clear Feature HALT to the Bulk-Out endpoint
472 *
473 * This is done in 3 steps.
474 *
475 * If the reset doesn't succeed, the device should be port reset.
476 *
477 * This comment stolen from FreeBSD's /sys/dev/usb/umass.c.
478 */
ceb4972a 479 debug("BBB_reset\n");
a0cb3fc3
MT
480 result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0),
481 US_BBB_RESET,
482 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
199adb60 483 0, us->ifnum, NULL, 0, USB_CNTL_TIMEOUT * 5);
9c998aa8 484
a0cb3fc3 485 if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) {
ceb4972a 486 debug("RESET:stall\n");
149dded2
WD
487 return -1;
488 }
9c998aa8 489
149dded2 490 /* long wait for reset */
5b84dd67 491 mdelay(150);
ceb4972a
VG
492 debug("BBB_reset result %d: status %lX reset\n",
493 result, us->pusb_dev->status);
149dded2
WD
494 pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
495 result = usb_clear_halt(us->pusb_dev, pipe);
496 /* long wait for reset */
5b84dd67 497 mdelay(150);
ceb4972a
VG
498 debug("BBB_reset result %d: status %lX clearing IN endpoint\n",
499 result, us->pusb_dev->status);
149dded2
WD
500 /* long wait for reset */
501 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
502 result = usb_clear_halt(us->pusb_dev, pipe);
5b84dd67 503 mdelay(150);
ceb4972a
VG
504 debug("BBB_reset result %d: status %lX clearing OUT endpoint\n",
505 result, us->pusb_dev->status);
506 debug("BBB_reset done\n");
149dded2
WD
507 return 0;
508}
509
affae2bf
WD
510/* FIXME: this reset function doesn't really reset the port, and it
511 * should. Actually it should probably do what it's doing here, and
512 * reset the port physically
513 */
514static int usb_stor_CB_reset(struct us_data *us)
515{
516 unsigned char cmd[12];
517 int result;
518
ceb4972a 519 debug("CB_reset\n");
a0cb3fc3 520 memset(cmd, 0xff, sizeof(cmd));
affae2bf
WD
521 cmd[0] = SCSI_SEND_DIAG;
522 cmd[1] = 4;
a0cb3fc3
MT
523 result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0),
524 US_CBI_ADSC,
525 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
526 0, us->ifnum, cmd, sizeof(cmd),
527 USB_CNTL_TIMEOUT * 5);
affae2bf
WD
528
529 /* long wait for reset */
5b84dd67 530 mdelay(1500);
ceb4972a
VG
531 debug("CB_reset result %d: status %lX clearing endpoint halt\n",
532 result, us->pusb_dev->status);
affae2bf
WD
533 usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_in));
534 usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_out));
535
ceb4972a 536 debug("CB_reset done\n");
affae2bf
WD
537 return 0;
538}
539
149dded2
WD
540/*
541 * Set up the command for a BBB device. Note that the actual SCSI
542 * command is copied into cbw.CBWCDB.
543 */
199adb60 544static int usb_stor_BBB_comdat(ccb *srb, struct us_data *us)
149dded2
WD
545{
546 int result;
547 int actlen;
548 int dir_in;
549 unsigned int pipe;
2e17c87e 550 ALLOC_CACHE_ALIGN_BUFFER(struct umass_bbb_cbw, cbw, 1);
149dded2
WD
551
552 dir_in = US_DIRECTION(srb->cmd[0]);
553
554#ifdef BBB_COMDAT_TRACE
605bd75a 555 printf("dir %d lun %d cmdlen %d cmd %p datalen %lu pdata %p\n",
a0cb3fc3
MT
556 dir_in, srb->lun, srb->cmdlen, srb->cmd, srb->datalen,
557 srb->pdata);
149dded2 558 if (srb->cmdlen) {
a0cb3fc3 559 for (result = 0; result < srb->cmdlen; result++)
149dded2
WD
560 printf("cmd[%d] %#x ", result, srb->cmd[result]);
561 printf("\n");
562 }
563#endif
564 /* sanity checks */
565 if (!(srb->cmdlen <= CBWCDBLENGTH)) {
ceb4972a 566 debug("usb_stor_BBB_comdat:cmdlen too large\n");
149dded2
WD
567 return -1;
568 }
569
570 /* always OUT to the ep */
571 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
572
f5766139
PS
573 cbw->dCBWSignature = cpu_to_le32(CBWSIGNATURE);
574 cbw->dCBWTag = cpu_to_le32(CBWTag++);
575 cbw->dCBWDataTransferLength = cpu_to_le32(srb->datalen);
576 cbw->bCBWFlags = (dir_in ? CBWFLAGS_IN : CBWFLAGS_OUT);
577 cbw->bCBWLUN = srb->lun;
578 cbw->bCDBLength = srb->cmdlen;
149dded2
WD
579 /* copy the command data into the CBW command data buffer */
580 /* DST SRC LEN!!! */
f6570871 581
f5766139
PS
582 memcpy(cbw->CBWCDB, srb->cmd, srb->cmdlen);
583 result = usb_bulk_msg(us->pusb_dev, pipe, cbw, UMASS_BBB_CBW_SIZE,
a0cb3fc3 584 &actlen, USB_CNTL_TIMEOUT * 5);
149dded2 585 if (result < 0)
ceb4972a 586 debug("usb_stor_BBB_comdat:usb_bulk_msg error\n");
149dded2
WD
587 return result;
588}
589
affae2bf
WD
590/* FIXME: we also need a CBI_command which sets up the completion
591 * interrupt, and waits for it
592 */
199adb60 593static int usb_stor_CB_comdat(ccb *srb, struct us_data *us)
affae2bf 594{
77ddac94 595 int result = 0;
a0cb3fc3 596 int dir_in, retry;
affae2bf
WD
597 unsigned int pipe;
598 unsigned long status;
599
a0cb3fc3
MT
600 retry = 5;
601 dir_in = US_DIRECTION(srb->cmd[0]);
affae2bf 602
a0cb3fc3
MT
603 if (dir_in)
604 pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
605 else
606 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
607
608 while (retry--) {
ceb4972a
VG
609 debug("CBI gets a command: Try %d\n", 5 - retry);
610#ifdef DEBUG
affae2bf
WD
611 usb_show_srb(srb);
612#endif
613 /* let's send the command via the control pipe */
a0cb3fc3
MT
614 result = usb_control_msg(us->pusb_dev,
615 usb_sndctrlpipe(us->pusb_dev , 0),
616 US_CBI_ADSC,
617 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
affae2bf 618 0, us->ifnum,
a0cb3fc3
MT
619 srb->cmd, srb->cmdlen,
620 USB_CNTL_TIMEOUT * 5);
ceb4972a
VG
621 debug("CB_transport: control msg returned %d, status %lX\n",
622 result, us->pusb_dev->status);
affae2bf
WD
623 /* check the return code for the command */
624 if (result < 0) {
a0cb3fc3
MT
625 if (us->pusb_dev->status & USB_ST_STALLED) {
626 status = us->pusb_dev->status;
ceb4972a
VG
627 debug(" stall during command found," \
628 " clear pipe\n");
a0cb3fc3
MT
629 usb_clear_halt(us->pusb_dev,
630 usb_sndctrlpipe(us->pusb_dev, 0));
631 us->pusb_dev->status = status;
affae2bf 632 }
ceb4972a
VG
633 debug(" error during command %02X" \
634 " Stat = %lX\n", srb->cmd[0],
635 us->pusb_dev->status);
affae2bf
WD
636 return result;
637 }
638 /* transfer the data payload for this command, if one exists*/
639
ceb4972a
VG
640 debug("CB_transport: control msg returned %d," \
641 " direction is %s to go 0x%lx\n", result,
642 dir_in ? "IN" : "OUT", srb->datalen);
affae2bf 643 if (srb->datalen) {
a0cb3fc3
MT
644 result = us_one_transfer(us, pipe, (char *)srb->pdata,
645 srb->datalen);
ceb4972a
VG
646 debug("CBI attempted to transfer data," \
647 " result is %d status %lX, len %d\n",
648 result, us->pusb_dev->status,
649 us->pusb_dev->act_len);
a0cb3fc3 650 if (!(us->pusb_dev->status & USB_ST_NAK_REC))
affae2bf
WD
651 break;
652 } /* if (srb->datalen) */
653 else
654 break;
655 }
656 /* return result */
657
658 return result;
659}
660
661
199adb60 662static int usb_stor_CBI_get_status(ccb *srb, struct us_data *us)
affae2bf
WD
663{
664 int timeout;
665
80885a9d 666 us->ip_wanted = 1;
a0cb3fc3 667 submit_int_msg(us->pusb_dev, us->irqpipe,
80885a9d
WD
668 (void *) &us->ip_data, us->irqmaxp, us->irqinterval);
669 timeout = 1000;
670 while (timeout--) {
f6570871 671 if (us->ip_wanted == 0)
affae2bf 672 break;
5b84dd67 673 mdelay(10);
affae2bf
WD
674 }
675 if (us->ip_wanted) {
a0cb3fc3 676 printf(" Did not get interrupt on CBI\n");
affae2bf
WD
677 us->ip_wanted = 0;
678 return USB_STOR_TRANSPORT_ERROR;
679 }
a6f70a3d 680 debug("Got interrupt data 0x%x, transferred %d status 0x%lX\n",
ceb4972a
VG
681 us->ip_data, us->pusb_dev->irq_act_len,
682 us->pusb_dev->irq_status);
affae2bf
WD
683 /* UFI gives us ASC and ASCQ, like a request sense */
684 if (us->subclass == US_SC_UFI) {
685 if (srb->cmd[0] == SCSI_REQ_SENSE ||
686 srb->cmd[0] == SCSI_INQUIRY)
687 return USB_STOR_TRANSPORT_GOOD; /* Good */
80885a9d
WD
688 else if (us->ip_data)
689 return USB_STOR_TRANSPORT_FAILED;
affae2bf 690 else
80885a9d 691 return USB_STOR_TRANSPORT_GOOD;
affae2bf
WD
692 }
693 /* otherwise, we interpret the data normally */
694 switch (us->ip_data) {
80885a9d
WD
695 case 0x0001:
696 return USB_STOR_TRANSPORT_GOOD;
697 case 0x0002:
698 return USB_STOR_TRANSPORT_FAILED;
699 default:
700 return USB_STOR_TRANSPORT_ERROR;
701 } /* switch */
affae2bf
WD
702 return USB_STOR_TRANSPORT_ERROR;
703}
704
705#define USB_TRANSPORT_UNKNOWN_RETRY 5
706#define USB_TRANSPORT_NOT_READY_RETRY 10
707
149dded2 708/* clear a stall on an endpoint - special for BBB devices */
199adb60 709static int usb_stor_BBB_clear_endpt_stall(struct us_data *us, __u8 endpt)
149dded2 710{
149dded2 711 /* ENDPOINT_HALT = 0, so set value to 0 */
8319aeb1
MY
712 return usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0),
713 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
714 endpt, NULL, 0, USB_CNTL_TIMEOUT * 5);
149dded2
WD
715}
716
199adb60 717static int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
149dded2
WD
718{
719 int result, retry;
720 int dir_in;
721 int actlen, data_actlen;
722 unsigned int pipe, pipein, pipeout;
2e17c87e 723 ALLOC_CACHE_ALIGN_BUFFER(struct umass_bbb_csw, csw, 1);
149dded2
WD
724#ifdef BBB_XPORT_TRACE
725 unsigned char *ptr;
726 int index;
727#endif
728
729 dir_in = US_DIRECTION(srb->cmd[0]);
730
731 /* COMMAND phase */
ceb4972a 732 debug("COMMAND phase\n");
149dded2
WD
733 result = usb_stor_BBB_comdat(srb, us);
734 if (result < 0) {
ceb4972a
VG
735 debug("failed to send CBW status %ld\n",
736 us->pusb_dev->status);
149dded2
WD
737 usb_stor_BBB_reset(us);
738 return USB_STOR_TRANSPORT_FAILED;
739 }
3e8581bb
BT
740 if (!(us->flags & USB_READY))
741 mdelay(5);
149dded2
WD
742 pipein = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
743 pipeout = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
744 /* DATA phase + error handling */
149dded2
WD
745 data_actlen = 0;
746 /* no data, go immediately to the STATUS phase */
747 if (srb->datalen == 0)
748 goto st;
ceb4972a 749 debug("DATA phase\n");
149dded2
WD
750 if (dir_in)
751 pipe = pipein;
752 else
753 pipe = pipeout;
f6570871 754
a0cb3fc3
MT
755 result = usb_bulk_msg(us->pusb_dev, pipe, srb->pdata, srb->datalen,
756 &data_actlen, USB_CNTL_TIMEOUT * 5);
149dded2 757 /* special handling of STALL in DATA phase */
a0cb3fc3 758 if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) {
ceb4972a 759 debug("DATA:stall\n");
149dded2 760 /* clear the STALL on the endpoint */
a0cb3fc3
MT
761 result = usb_stor_BBB_clear_endpt_stall(us,
762 dir_in ? us->ep_in : us->ep_out);
149dded2
WD
763 if (result >= 0)
764 /* continue on to STATUS phase */
765 goto st;
766 }
767 if (result < 0) {
ceb4972a
VG
768 debug("usb_bulk_msg error status %ld\n",
769 us->pusb_dev->status);
149dded2
WD
770 usb_stor_BBB_reset(us);
771 return USB_STOR_TRANSPORT_FAILED;
772 }
773#ifdef BBB_XPORT_TRACE
774 for (index = 0; index < data_actlen; index++)
775 printf("pdata[%d] %#x ", index, srb->pdata[index]);
776 printf("\n");
777#endif
778 /* STATUS phase + error handling */
a0cb3fc3 779st:
149dded2 780 retry = 0;
a0cb3fc3 781again:
ceb4972a 782 debug("STATUS phase\n");
f5766139 783 result = usb_bulk_msg(us->pusb_dev, pipein, csw, UMASS_BBB_CSW_SIZE,
9c998aa8
WD
784 &actlen, USB_CNTL_TIMEOUT*5);
785
149dded2 786 /* special handling of STALL in STATUS phase */
a0cb3fc3
MT
787 if ((result < 0) && (retry < 1) &&
788 (us->pusb_dev->status & USB_ST_STALLED)) {
ceb4972a 789 debug("STATUS:stall\n");
149dded2
WD
790 /* clear the STALL on the endpoint */
791 result = usb_stor_BBB_clear_endpt_stall(us, us->ep_in);
792 if (result >= 0 && (retry++ < 1))
793 /* do a retry */
794 goto again;
795 }
796 if (result < 0) {
ceb4972a
VG
797 debug("usb_bulk_msg error status %ld\n",
798 us->pusb_dev->status);
149dded2
WD
799 usb_stor_BBB_reset(us);
800 return USB_STOR_TRANSPORT_FAILED;
801 }
802#ifdef BBB_XPORT_TRACE
f5766139 803 ptr = (unsigned char *)csw;
149dded2
WD
804 for (index = 0; index < UMASS_BBB_CSW_SIZE; index++)
805 printf("ptr[%d] %#x ", index, ptr[index]);
806 printf("\n");
807#endif
808 /* misuse pipe to get the residue */
f5766139 809 pipe = le32_to_cpu(csw->dCSWDataResidue);
149dded2
WD
810 if (pipe == 0 && srb->datalen != 0 && srb->datalen - data_actlen != 0)
811 pipe = srb->datalen - data_actlen;
f5766139 812 if (CSWSIGNATURE != le32_to_cpu(csw->dCSWSignature)) {
ceb4972a 813 debug("!CSWSIGNATURE\n");
149dded2
WD
814 usb_stor_BBB_reset(us);
815 return USB_STOR_TRANSPORT_FAILED;
f5766139 816 } else if ((CBWTag - 1) != le32_to_cpu(csw->dCSWTag)) {
ceb4972a 817 debug("!Tag\n");
149dded2
WD
818 usb_stor_BBB_reset(us);
819 return USB_STOR_TRANSPORT_FAILED;
f5766139 820 } else if (csw->bCSWStatus > CSWSTATUS_PHASE) {
ceb4972a 821 debug(">PHASE\n");
149dded2
WD
822 usb_stor_BBB_reset(us);
823 return USB_STOR_TRANSPORT_FAILED;
f5766139 824 } else if (csw->bCSWStatus == CSWSTATUS_PHASE) {
ceb4972a 825 debug("=PHASE\n");
149dded2
WD
826 usb_stor_BBB_reset(us);
827 return USB_STOR_TRANSPORT_FAILED;
828 } else if (data_actlen > srb->datalen) {
ceb4972a
VG
829 debug("transferred %dB instead of %ldB\n",
830 data_actlen, srb->datalen);
149dded2 831 return USB_STOR_TRANSPORT_FAILED;
f5766139 832 } else if (csw->bCSWStatus == CSWSTATUS_FAILED) {
ceb4972a 833 debug("FAILED\n");
149dded2
WD
834 return USB_STOR_TRANSPORT_FAILED;
835 }
836
837 return result;
838}
839
199adb60 840static int usb_stor_CB_transport(ccb *srb, struct us_data *us)
affae2bf 841{
a0cb3fc3 842 int result, status;
affae2bf
WD
843 ccb *psrb;
844 ccb reqsrb;
a0cb3fc3 845 int retry, notready;
affae2bf 846
d0ff51ba 847 psrb = &reqsrb;
a0cb3fc3
MT
848 status = USB_STOR_TRANSPORT_GOOD;
849 retry = 0;
850 notready = 0;
affae2bf
WD
851 /* issue the command */
852do_retry:
a0cb3fc3 853 result = usb_stor_CB_comdat(srb, us);
ceb4972a
VG
854 debug("command / Data returned %d, status %lX\n",
855 result, us->pusb_dev->status);
affae2bf 856 /* if this is an CBI Protocol, get IRQ */
a0cb3fc3
MT
857 if (us->protocol == US_PR_CBI) {
858 status = usb_stor_CBI_get_status(srb, us);
affae2bf 859 /* if the status is error, report it */
a0cb3fc3 860 if (status == USB_STOR_TRANSPORT_ERROR) {
ceb4972a 861 debug(" USB CBI Command Error\n");
affae2bf
WD
862 return status;
863 }
a0cb3fc3
MT
864 srb->sense_buf[12] = (unsigned char)(us->ip_data >> 8);
865 srb->sense_buf[13] = (unsigned char)(us->ip_data & 0xff);
866 if (!us->ip_data) {
867 /* if the status is good, report it */
868 if (status == USB_STOR_TRANSPORT_GOOD) {
ceb4972a 869 debug(" USB CBI Command Good\n");
affae2bf
WD
870 return status;
871 }
872 }
873 }
874 /* do we have to issue an auto request? */
875 /* HERE we have to check the result */
a0cb3fc3 876 if ((result < 0) && !(us->pusb_dev->status & USB_ST_STALLED)) {
ceb4972a 877 debug("ERROR %lX\n", us->pusb_dev->status);
affae2bf
WD
878 us->transport_reset(us);
879 return USB_STOR_TRANSPORT_ERROR;
880 }
a0cb3fc3
MT
881 if ((us->protocol == US_PR_CBI) &&
882 ((srb->cmd[0] == SCSI_REQ_SENSE) ||
883 (srb->cmd[0] == SCSI_INQUIRY))) {
884 /* do not issue an autorequest after request sense */
ceb4972a 885 debug("No auto request and good\n");
affae2bf
WD
886 return USB_STOR_TRANSPORT_GOOD;
887 }
888 /* issue an request_sense */
a0cb3fc3
MT
889 memset(&psrb->cmd[0], 0, 12);
890 psrb->cmd[0] = SCSI_REQ_SENSE;
891 psrb->cmd[1] = srb->lun << 5;
892 psrb->cmd[4] = 18;
893 psrb->datalen = 18;
d0ff51ba 894 psrb->pdata = &srb->sense_buf[0];
a0cb3fc3 895 psrb->cmdlen = 12;
affae2bf 896 /* issue the command */
a0cb3fc3 897 result = usb_stor_CB_comdat(psrb, us);
ceb4972a 898 debug("auto request returned %d\n", result);
affae2bf 899 /* if this is an CBI Protocol, get IRQ */
a0cb3fc3
MT
900 if (us->protocol == US_PR_CBI)
901 status = usb_stor_CBI_get_status(psrb, us);
902
903 if ((result < 0) && !(us->pusb_dev->status & USB_ST_STALLED)) {
ceb4972a
VG
904 debug(" AUTO REQUEST ERROR %ld\n",
905 us->pusb_dev->status);
affae2bf
WD
906 return USB_STOR_TRANSPORT_ERROR;
907 }
ceb4972a
VG
908 debug("autorequest returned 0x%02X 0x%02X 0x%02X 0x%02X\n",
909 srb->sense_buf[0], srb->sense_buf[2],
910 srb->sense_buf[12], srb->sense_buf[13]);
affae2bf 911 /* Check the auto request result */
a0cb3fc3
MT
912 if ((srb->sense_buf[2] == 0) &&
913 (srb->sense_buf[12] == 0) &&
914 (srb->sense_buf[13] == 0)) {
915 /* ok, no sense */
affae2bf 916 return USB_STOR_TRANSPORT_GOOD;
a0cb3fc3
MT
917 }
918
affae2bf 919 /* Check the auto request result */
a0cb3fc3
MT
920 switch (srb->sense_buf[2]) {
921 case 0x01:
922 /* Recovered Error */
149dded2 923 return USB_STOR_TRANSPORT_GOOD;
80885a9d 924 break;
a0cb3fc3
MT
925 case 0x02:
926 /* Not Ready */
927 if (notready++ > USB_TRANSPORT_NOT_READY_RETRY) {
928 printf("cmd 0x%02X returned 0x%02X 0x%02X 0x%02X"
929 " 0x%02X (NOT READY)\n", srb->cmd[0],
930 srb->sense_buf[0], srb->sense_buf[2],
931 srb->sense_buf[12], srb->sense_buf[13]);
149dded2
WD
932 return USB_STOR_TRANSPORT_FAILED;
933 } else {
5b84dd67 934 mdelay(100);
149dded2
WD
935 goto do_retry;
936 }
937 break;
938 default:
a0cb3fc3
MT
939 if (retry++ > USB_TRANSPORT_UNKNOWN_RETRY) {
940 printf("cmd 0x%02X returned 0x%02X 0x%02X 0x%02X"
941 " 0x%02X\n", srb->cmd[0], srb->sense_buf[0],
942 srb->sense_buf[2], srb->sense_buf[12],
943 srb->sense_buf[13]);
149dded2 944 return USB_STOR_TRANSPORT_FAILED;
a0cb3fc3 945 } else
149dded2 946 goto do_retry;
149dded2 947 break;
affae2bf
WD
948 }
949 return USB_STOR_TRANSPORT_FAILED;
950}
951
952
a0cb3fc3 953static int usb_inquiry(ccb *srb, struct us_data *ss)
affae2bf 954{
a0cb3fc3
MT
955 int retry, i;
956 retry = 5;
affae2bf 957 do {
a0cb3fc3
MT
958 memset(&srb->cmd[0], 0, 12);
959 srb->cmd[0] = SCSI_INQUIRY;
99e9ed1f 960 srb->cmd[1] = srb->lun << 5;
a0cb3fc3
MT
961 srb->cmd[4] = 36;
962 srb->datalen = 36;
963 srb->cmdlen = 12;
964 i = ss->transport(srb, ss);
ceb4972a 965 debug("inquiry returns %d\n", i);
a0cb3fc3 966 if (i == 0)
affae2bf 967 break;
fac71cc4 968 } while (--retry);
149dded2 969
a0cb3fc3 970 if (!retry) {
affae2bf
WD
971 printf("error in inquiry\n");
972 return -1;
973 }
974 return 0;
975}
976
a0cb3fc3 977static int usb_request_sense(ccb *srb, struct us_data *ss)
affae2bf
WD
978{
979 char *ptr;
80885a9d 980
a0cb3fc3
MT
981 ptr = (char *)srb->pdata;
982 memset(&srb->cmd[0], 0, 12);
983 srb->cmd[0] = SCSI_REQ_SENSE;
99e9ed1f 984 srb->cmd[1] = srb->lun << 5;
a0cb3fc3
MT
985 srb->cmd[4] = 18;
986 srb->datalen = 18;
d0ff51ba 987 srb->pdata = &srb->sense_buf[0];
a0cb3fc3
MT
988 srb->cmdlen = 12;
989 ss->transport(srb, ss);
ceb4972a
VG
990 debug("Request Sense returned %02X %02X %02X\n",
991 srb->sense_buf[2], srb->sense_buf[12],
992 srb->sense_buf[13]);
a0cb3fc3 993 srb->pdata = (uchar *)ptr;
affae2bf
WD
994 return 0;
995}
996
a0cb3fc3 997static int usb_test_unit_ready(ccb *srb, struct us_data *ss)
affae2bf 998{
9c998aa8 999 int retries = 10;
149dded2 1000
affae2bf 1001 do {
a0cb3fc3
MT
1002 memset(&srb->cmd[0], 0, 12);
1003 srb->cmd[0] = SCSI_TST_U_RDY;
99e9ed1f 1004 srb->cmd[1] = srb->lun << 5;
a0cb3fc3
MT
1005 srb->datalen = 0;
1006 srb->cmdlen = 12;
3e8581bb
BT
1007 if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) {
1008 ss->flags |= USB_READY;
affae2bf 1009 return 0;
3e8581bb 1010 }
a0cb3fc3 1011 usb_request_sense(srb, ss);
8b57e2f0
VP
1012 /*
1013 * Check the Key Code Qualifier, if it matches
1014 * "Not Ready - medium not present"
1015 * (the sense Key equals 0x2 and the ASC is 0x3a)
1016 * return immediately as the medium being absent won't change
1017 * unless there is a user action.
1018 */
1019 if ((srb->sense_buf[2] == 0x02) &&
1020 (srb->sense_buf[12] == 0x3a))
1021 return -1;
5b84dd67 1022 mdelay(100);
a0cb3fc3 1023 } while (retries--);
149dded2 1024
affae2bf
WD
1025 return -1;
1026}
1027
a0cb3fc3 1028static int usb_read_capacity(ccb *srb, struct us_data *ss)
affae2bf
WD
1029{
1030 int retry;
a0cb3fc3
MT
1031 /* XXX retries */
1032 retry = 3;
affae2bf 1033 do {
a0cb3fc3
MT
1034 memset(&srb->cmd[0], 0, 12);
1035 srb->cmd[0] = SCSI_RD_CAPAC;
99e9ed1f 1036 srb->cmd[1] = srb->lun << 5;
a0cb3fc3
MT
1037 srb->datalen = 8;
1038 srb->cmdlen = 12;
1039 if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD)
affae2bf 1040 return 0;
a0cb3fc3 1041 } while (retry--);
149dded2 1042
affae2bf
WD
1043 return -1;
1044}
1045
a0cb3fc3
MT
1046static int usb_read_10(ccb *srb, struct us_data *ss, unsigned long start,
1047 unsigned short blocks)
affae2bf 1048{
a0cb3fc3
MT
1049 memset(&srb->cmd[0], 0, 12);
1050 srb->cmd[0] = SCSI_READ10;
99e9ed1f 1051 srb->cmd[1] = srb->lun << 5;
a0cb3fc3
MT
1052 srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
1053 srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
1054 srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
1055 srb->cmd[5] = ((unsigned char) (start)) & 0xff;
1056 srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
1057 srb->cmd[8] = (unsigned char) blocks & 0xff;
1058 srb->cmdlen = 12;
ceb4972a 1059 debug("read10: start %lx blocks %x\n", start, blocks);
a0cb3fc3 1060 return ss->transport(srb, ss);
affae2bf
WD
1061}
1062
127e1084
MJ
1063static int usb_write_10(ccb *srb, struct us_data *ss, unsigned long start,
1064 unsigned short blocks)
1065{
1066 memset(&srb->cmd[0], 0, 12);
1067 srb->cmd[0] = SCSI_WRITE10;
99e9ed1f 1068 srb->cmd[1] = srb->lun << 5;
127e1084
MJ
1069 srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
1070 srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
1071 srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
1072 srb->cmd[5] = ((unsigned char) (start)) & 0xff;
1073 srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
1074 srb->cmd[8] = (unsigned char) blocks & 0xff;
1075 srb->cmdlen = 12;
ceb4972a 1076 debug("write10: start %lx blocks %x\n", start, blocks);
127e1084
MJ
1077 return ss->transport(srb, ss);
1078}
1079
affae2bf 1080
ddde6b7c
BS
1081#ifdef CONFIG_USB_BIN_FIXUP
1082/*
1083 * Some USB storage devices queried for SCSI identification data respond with
1084 * binary strings, which if output to the console freeze the terminal. The
1085 * workaround is to modify the vendor and product strings read from such
1086 * device with proper values (as reported by 'usb info').
1087 *
1088 * Vendor and product length limits are taken from the definition of
4101f687 1089 * struct blk_desc in include/part.h.
ddde6b7c
BS
1090 */
1091static void usb_bin_fixup(struct usb_device_descriptor descriptor,
1092 unsigned char vendor[],
1093 unsigned char product[]) {
1094 const unsigned char max_vendor_len = 40;
1095 const unsigned char max_product_len = 20;
1096 if (descriptor.idVendor == 0x0424 && descriptor.idProduct == 0x223a) {
a0cb3fc3
MT
1097 strncpy((char *)vendor, "SMSC", max_vendor_len);
1098 strncpy((char *)product, "Flash Media Cntrller",
1099 max_product_len);
ddde6b7c
BS
1100 }
1101}
1102#endif /* CONFIG_USB_BIN_FIXUP */
1103
07b2b78c
SG
1104#ifdef CONFIG_BLK
1105static unsigned long usb_stor_read(struct udevice *dev, lbaint_t blknr,
1106 lbaint_t blkcnt, void *buffer)
1107#else
4101f687 1108static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
7c4213f6 1109 lbaint_t blkcnt, void *buffer)
07b2b78c 1110#endif
affae2bf 1111{
e81e79ed
GB
1112 lbaint_t start, blks;
1113 uintptr_t buf_addr;
affae2bf 1114 unsigned short smallblks;
9807c3b7 1115 struct usb_device *udev;
5dd95cf9 1116 struct us_data *ss;
84073b6f 1117 int retry;
f8d813e3 1118 ccb *srb = &usb_ccb;
07b2b78c
SG
1119#ifdef CONFIG_BLK
1120 struct blk_desc *block_dev;
1121#endif
f8d813e3
WD
1122
1123 if (blkcnt == 0)
1124 return 0;
a0cb3fc3 1125 /* Setup device */
07b2b78c
SG
1126#ifdef CONFIG_BLK
1127 block_dev = dev_get_uclass_platdata(dev);
1128 udev = dev_get_parent_priv(dev_get_parent(dev));
1129 debug("\nusb_read: udev %d\n", block_dev->devnum);
1130#else
9807c3b7
SG
1131 debug("\nusb_read: udev %d\n", block_dev->devnum);
1132 udev = usb_dev_desc[block_dev->devnum].priv;
1133 if (!udev) {
84073b6f
SG
1134 debug("%s: No device\n", __func__);
1135 return 0;
affae2bf 1136 }
07b2b78c 1137#endif
9807c3b7 1138 ss = (struct us_data *)udev->privptr;
affae2bf
WD
1139
1140 usb_disable_asynch(1); /* asynch transfer not allowed */
9807c3b7 1141 srb->lun = block_dev->lun;
f6570871 1142 buf_addr = (uintptr_t)buffer;
a0cb3fc3
MT
1143 start = blknr;
1144 blks = blkcnt;
a0cb3fc3 1145
9807c3b7
SG
1146 debug("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF " buffer %"
1147 PRIxPTR "\n", block_dev->devnum, start, blks, buf_addr);
a0cb3fc3 1148
affae2bf 1149 do {
a0cb3fc3
MT
1150 /* XXX need some comment here */
1151 retry = 2;
1152 srb->pdata = (unsigned char *)buf_addr;
4bee5c83
BT
1153 if (blks > USB_MAX_XFER_BLK)
1154 smallblks = USB_MAX_XFER_BLK;
a0cb3fc3
MT
1155 else
1156 smallblks = (unsigned short) blks;
affae2bf 1157retry_it:
4bee5c83 1158 if (smallblks == USB_MAX_XFER_BLK)
affae2bf 1159 usb_show_progress();
9807c3b7 1160 srb->datalen = block_dev->blksz * smallblks;
a0cb3fc3 1161 srb->pdata = (unsigned char *)buf_addr;
5dd95cf9 1162 if (usb_read_10(srb, ss, start, smallblks)) {
ceb4972a 1163 debug("Read ERROR\n");
5dd95cf9 1164 usb_request_sense(srb, ss);
a0cb3fc3 1165 if (retry--)
affae2bf 1166 goto retry_it;
a0cb3fc3 1167 blkcnt -= blks;
affae2bf
WD
1168 break;
1169 }
a0cb3fc3
MT
1170 start += smallblks;
1171 blks -= smallblks;
1172 buf_addr += srb->datalen;
1173 } while (blks != 0);
3e8581bb 1174 ss->flags &= ~USB_READY;
a0cb3fc3 1175
ceb4972a 1176 debug("usb_read: end startblk " LBAF
4fd074de 1177 ", blccnt %x buffer %" PRIxPTR "\n",
ceb4972a 1178 start, smallblks, buf_addr);
a0cb3fc3 1179
affae2bf 1180 usb_disable_asynch(0); /* asynch transfer allowed */
4bee5c83 1181 if (blkcnt >= USB_MAX_XFER_BLK)
226fa9bb 1182 debug("\n");
a0cb3fc3 1183 return blkcnt;
affae2bf
WD
1184}
1185
07b2b78c
SG
1186#ifdef CONFIG_BLK
1187static unsigned long usb_stor_write(struct udevice *dev, lbaint_t blknr,
1188 lbaint_t blkcnt, const void *buffer)
1189#else
4101f687 1190static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
7c4213f6 1191 lbaint_t blkcnt, const void *buffer)
07b2b78c 1192#endif
127e1084 1193{
e81e79ed
GB
1194 lbaint_t start, blks;
1195 uintptr_t buf_addr;
127e1084 1196 unsigned short smallblks;
9807c3b7 1197 struct usb_device *udev;
5dd95cf9 1198 struct us_data *ss;
84073b6f 1199 int retry;
127e1084 1200 ccb *srb = &usb_ccb;
07b2b78c
SG
1201#ifdef CONFIG_BLK
1202 struct blk_desc *block_dev;
1203#endif
127e1084
MJ
1204
1205 if (blkcnt == 0)
1206 return 0;
1207
127e1084 1208 /* Setup device */
07b2b78c
SG
1209#ifdef CONFIG_BLK
1210 block_dev = dev_get_uclass_platdata(dev);
1211 udev = dev_get_parent_priv(dev_get_parent(dev));
1212 debug("\nusb_read: udev %d\n", block_dev->devnum);
1213#else
9807c3b7
SG
1214 debug("\nusb_read: udev %d\n", block_dev->devnum);
1215 udev = usb_dev_desc[block_dev->devnum].priv;
1216 if (!udev) {
1217 debug("%s: No device\n", __func__);
84073b6f 1218 return 0;
9807c3b7 1219 }
07b2b78c 1220#endif
9807c3b7 1221 ss = (struct us_data *)udev->privptr;
127e1084
MJ
1222
1223 usb_disable_asynch(1); /* asynch transfer not allowed */
1224
9807c3b7 1225 srb->lun = block_dev->lun;
f6570871 1226 buf_addr = (uintptr_t)buffer;
127e1084
MJ
1227 start = blknr;
1228 blks = blkcnt;
127e1084 1229
9807c3b7
SG
1230 debug("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF " buffer %"
1231 PRIxPTR "\n", block_dev->devnum, start, blks, buf_addr);
127e1084
MJ
1232
1233 do {
1234 /* If write fails retry for max retry count else
1235 * return with number of blocks written successfully.
1236 */
1237 retry = 2;
1238 srb->pdata = (unsigned char *)buf_addr;
4bee5c83
BT
1239 if (blks > USB_MAX_XFER_BLK)
1240 smallblks = USB_MAX_XFER_BLK;
127e1084
MJ
1241 else
1242 smallblks = (unsigned short) blks;
1243retry_it:
4bee5c83 1244 if (smallblks == USB_MAX_XFER_BLK)
127e1084 1245 usb_show_progress();
9807c3b7 1246 srb->datalen = block_dev->blksz * smallblks;
127e1084 1247 srb->pdata = (unsigned char *)buf_addr;
5dd95cf9 1248 if (usb_write_10(srb, ss, start, smallblks)) {
ceb4972a 1249 debug("Write ERROR\n");
5dd95cf9 1250 usb_request_sense(srb, ss);
127e1084
MJ
1251 if (retry--)
1252 goto retry_it;
1253 blkcnt -= blks;
1254 break;
1255 }
1256 start += smallblks;
1257 blks -= smallblks;
1258 buf_addr += srb->datalen;
1259 } while (blks != 0);
3e8581bb 1260 ss->flags &= ~USB_READY;
127e1084 1261
4fd074de
SG
1262 debug("usb_write: end startblk " LBAF ", blccnt %x buffer %"
1263 PRIxPTR "\n", start, smallblks, buf_addr);
127e1084
MJ
1264
1265 usb_disable_asynch(0); /* asynch transfer allowed */
4bee5c83 1266 if (blkcnt >= USB_MAX_XFER_BLK)
226fa9bb 1267 debug("\n");
127e1084
MJ
1268 return blkcnt;
1269
1270}
affae2bf
WD
1271
1272/* Probe to see if a new device is actually a Storage device */
a0cb3fc3
MT
1273int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
1274 struct us_data *ss)
affae2bf 1275{
8f8bd565 1276 struct usb_interface *iface;
affae2bf 1277 int i;
605bd75a 1278 struct usb_endpoint_descriptor *ep_desc;
affae2bf
WD
1279 unsigned int flags = 0;
1280
affae2bf
WD
1281 /* let's examine the device now */
1282 iface = &dev->config.if_desc[ifnum];
1283
affae2bf 1284 if (dev->descriptor.bDeviceClass != 0 ||
8f8bd565
TR
1285 iface->desc.bInterfaceClass != USB_CLASS_MASS_STORAGE ||
1286 iface->desc.bInterfaceSubClass < US_SC_MIN ||
1287 iface->desc.bInterfaceSubClass > US_SC_MAX) {
1d5827a1 1288 debug("Not mass storage\n");
affae2bf
WD
1289 /* if it's not a mass storage, we go no further */
1290 return 0;
1291 }
1292
9c998aa8
WD
1293 memset(ss, 0, sizeof(struct us_data));
1294
affae2bf 1295 /* At this point, we know we've got a live one */
ceb4972a 1296 debug("\n\nUSB Mass Storage device detected\n");
affae2bf
WD
1297
1298 /* Initialize the us_data structure with some useful info */
1299 ss->flags = flags;
1300 ss->ifnum = ifnum;
1301 ss->pusb_dev = dev;
1302 ss->attention_done = 0;
f5fb78a2
TR
1303 ss->subclass = iface->desc.bInterfaceSubClass;
1304 ss->protocol = iface->desc.bInterfaceProtocol;
affae2bf
WD
1305
1306 /* set the handler pointers based on the protocol */
ceb4972a 1307 debug("Transport: ");
affae2bf
WD
1308 switch (ss->protocol) {
1309 case US_PR_CB:
ceb4972a 1310 debug("Control/Bulk\n");
affae2bf
WD
1311 ss->transport = usb_stor_CB_transport;
1312 ss->transport_reset = usb_stor_CB_reset;
1313 break;
1314
1315 case US_PR_CBI:
ceb4972a 1316 debug("Control/Bulk/Interrupt\n");
affae2bf
WD
1317 ss->transport = usb_stor_CB_transport;
1318 ss->transport_reset = usb_stor_CB_reset;
1319 break;
149dded2 1320 case US_PR_BULK:
ceb4972a 1321 debug("Bulk/Bulk/Bulk\n");
149dded2
WD
1322 ss->transport = usb_stor_BBB_transport;
1323 ss->transport_reset = usb_stor_BBB_reset;
1324 break;
affae2bf 1325 default:
80885a9d 1326 printf("USB Storage Transport unknown / not yet implemented\n");
affae2bf
WD
1327 return 0;
1328 break;
1329 }
1330
1331 /*
1332 * We are expecting a minimum of 2 endpoints - in and out (bulk).
1333 * An optional interrupt is OK (necessary for CBI protocol).
1334 * We will ignore any others.
1335 */
8f8bd565 1336 for (i = 0; i < iface->desc.bNumEndpoints; i++) {
605bd75a 1337 ep_desc = &iface->ep_desc[i];
affae2bf 1338 /* is it an BULK endpoint? */
605bd75a 1339 if ((ep_desc->bmAttributes &
a0cb3fc3 1340 USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
605bd75a
VG
1341 if (ep_desc->bEndpointAddress & USB_DIR_IN)
1342 ss->ep_in = ep_desc->bEndpointAddress &
1343 USB_ENDPOINT_NUMBER_MASK;
affae2bf 1344 else
a0cb3fc3 1345 ss->ep_out =
605bd75a 1346 ep_desc->bEndpointAddress &
affae2bf
WD
1347 USB_ENDPOINT_NUMBER_MASK;
1348 }
1349
1350 /* is it an interrupt endpoint? */
605bd75a
VG
1351 if ((ep_desc->bmAttributes &
1352 USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
1353 ss->ep_int = ep_desc->bEndpointAddress &
1354 USB_ENDPOINT_NUMBER_MASK;
1355 ss->irqinterval = ep_desc->bInterval;
affae2bf
WD
1356 }
1357 }
ceb4972a
VG
1358 debug("Endpoints In %d Out %d Int %d\n",
1359 ss->ep_in, ss->ep_out, ss->ep_int);
affae2bf
WD
1360
1361 /* Do some basic sanity checks, and bail if we find a problem */
8f8bd565 1362 if (usb_set_interface(dev, iface->desc.bInterfaceNumber, 0) ||
affae2bf
WD
1363 !ss->ep_in || !ss->ep_out ||
1364 (ss->protocol == US_PR_CBI && ss->ep_int == 0)) {
ceb4972a 1365 debug("Problems with device\n");
affae2bf
WD
1366 return 0;
1367 }
1368 /* set class specific stuff */
149dded2
WD
1369 /* We only handle certain protocols. Currently, these are
1370 * the only ones.
80885a9d 1371 * The SFF8070 accepts the requests used in u-boot
affae2bf 1372 */
80885a9d
WD
1373 if (ss->subclass != US_SC_UFI && ss->subclass != US_SC_SCSI &&
1374 ss->subclass != US_SC_8070) {
a0cb3fc3 1375 printf("Sorry, protocol %d not yet supported.\n", ss->subclass);
affae2bf
WD
1376 return 0;
1377 }
a0cb3fc3
MT
1378 if (ss->ep_int) {
1379 /* we had found an interrupt endpoint, prepare irq pipe
1380 * set up the IRQ pipe and handler
1381 */
affae2bf
WD
1382 ss->irqinterval = (ss->irqinterval > 0) ? ss->irqinterval : 255;
1383 ss->irqpipe = usb_rcvintpipe(ss->pusb_dev, ss->ep_int);
1384 ss->irqmaxp = usb_maxpacket(dev, ss->irqpipe);
a0cb3fc3 1385 dev->irq_handle = usb_stor_irq;
affae2bf 1386 }
a0cb3fc3 1387 dev->privptr = (void *)ss;
affae2bf
WD
1388 return 1;
1389}
1390
a0cb3fc3 1391int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
4101f687 1392 struct blk_desc *dev_desc)
affae2bf 1393{
a0cb3fc3 1394 unsigned char perq, modi;
f6570871
ST
1395 ALLOC_CACHE_ALIGN_BUFFER(u32, cap, 2);
1396 ALLOC_CACHE_ALIGN_BUFFER(u8, usb_stor_buf, 36);
1397 u32 capacity, blksz;
9c998aa8
WD
1398 ccb *pccb = &usb_ccb;
1399
9c998aa8
WD
1400 pccb->pdata = usb_stor_buf;
1401
1402 dev_desc->target = dev->devnum;
1403 pccb->lun = dev_desc->lun;
ceb4972a 1404 debug(" address %d\n", dev_desc->target);
affae2bf 1405
1d5827a1
SG
1406 if (usb_inquiry(pccb, ss)) {
1407 debug("%s: usb_inquiry() failed\n", __func__);
affae2bf 1408 return -1;
1d5827a1 1409 }
095b8a37 1410
9c998aa8
WD
1411 perq = usb_stor_buf[0];
1412 modi = usb_stor_buf[1];
a0cb3fc3 1413
6a559bbe
SM
1414 /*
1415 * Skip unknown devices (0x1f) and enclosure service devices (0x0d),
1416 * they would not respond to test_unit_ready .
1417 */
1418 if (((perq & 0x1f) == 0x1f) || ((perq & 0x1f) == 0x0d)) {
1d5827a1 1419 debug("%s: unknown/unsupported device\n", __func__);
a0cb3fc3 1420 return 0;
affae2bf 1421 }
a0cb3fc3
MT
1422 if ((modi&0x80) == 0x80) {
1423 /* drive is removable */
9c998aa8 1424 dev_desc->removable = 1;
affae2bf 1425 }
f6570871
ST
1426 memcpy(dev_desc->vendor, (const void *)&usb_stor_buf[8], 8);
1427 memcpy(dev_desc->product, (const void *)&usb_stor_buf[16], 16);
1428 memcpy(dev_desc->revision, (const void *)&usb_stor_buf[32], 4);
9c998aa8
WD
1429 dev_desc->vendor[8] = 0;
1430 dev_desc->product[16] = 0;
1431 dev_desc->revision[4] = 0;
ddde6b7c 1432#ifdef CONFIG_USB_BIN_FIXUP
a0cb3fc3
MT
1433 usb_bin_fixup(dev->descriptor, (uchar *)dev_desc->vendor,
1434 (uchar *)dev_desc->product);
ddde6b7c 1435#endif /* CONFIG_USB_BIN_FIXUP */
ceb4972a
VG
1436 debug("ISO Vers %X, Response Data %X\n", usb_stor_buf[2],
1437 usb_stor_buf[3]);
a0cb3fc3
MT
1438 if (usb_test_unit_ready(pccb, ss)) {
1439 printf("Device NOT ready\n"
1440 " Request Sense returned %02X %02X %02X\n",
1441 pccb->sense_buf[2], pccb->sense_buf[12],
1442 pccb->sense_buf[13]);
1e5eca7d 1443 if (dev_desc->removable == 1)
9c998aa8 1444 dev_desc->type = perq;
a0cb3fc3 1445 return 0;
affae2bf 1446 }
f6570871 1447 pccb->pdata = (unsigned char *)cap;
a0cb3fc3
MT
1448 memset(pccb->pdata, 0, 8);
1449 if (usb_read_capacity(pccb, ss) != 0) {
affae2bf 1450 printf("READ_CAP ERROR\n");
9c998aa8
WD
1451 cap[0] = 2880;
1452 cap[1] = 0x200;
affae2bf 1453 }
3e8581bb 1454 ss->flags &= ~USB_READY;
f6570871 1455 debug("Read Capacity returns: 0x%08x, 0x%08x\n", cap[0], cap[1]);
affae2bf 1456#if 0
a0cb3fc3
MT
1457 if (cap[0] > (0x200000 * 10)) /* greater than 10 GByte */
1458 cap[0] >>= 16;
f6570871 1459
c918261c
CE
1460 cap[0] = cpu_to_be32(cap[0]);
1461 cap[1] = cpu_to_be32(cap[1]);
f6570871
ST
1462#endif
1463
1464 capacity = be32_to_cpu(cap[0]) + 1;
1465 blksz = be32_to_cpu(cap[1]);
c918261c 1466
f6570871
ST
1467 debug("Capacity = 0x%08x, blocksz = 0x%08x\n", capacity, blksz);
1468 dev_desc->lba = capacity;
1469 dev_desc->blksz = blksz;
0472fbfd 1470 dev_desc->log2blksz = LOG2(dev_desc->blksz);
9c998aa8 1471 dev_desc->type = perq;
ceb4972a 1472 debug(" address %d\n", dev_desc->target);
affae2bf 1473
affae2bf
WD
1474 return 1;
1475}
acf277af
SG
1476
1477#ifdef CONFIG_DM_USB
1478
1479static int usb_mass_storage_probe(struct udevice *dev)
1480{
bcbe3d15 1481 struct usb_device *udev = dev_get_parent_priv(dev);
acf277af
SG
1482 int ret;
1483
1484 usb_disable_asynch(1); /* asynch transfer not allowed */
1485 ret = usb_stor_probe_device(udev);
1486 usb_disable_asynch(0); /* asynch transfer allowed */
1487
1488 return ret;
1489}
1490
1491static const struct udevice_id usb_mass_storage_ids[] = {
1492 { .compatible = "usb-mass-storage" },
1493 { }
1494};
1495
1496U_BOOT_DRIVER(usb_mass_storage) = {
1497 .name = "usb_mass_storage",
1498 .id = UCLASS_MASS_STORAGE,
1499 .of_match = usb_mass_storage_ids,
1500 .probe = usb_mass_storage_probe,
07b2b78c
SG
1501#ifdef CONFIG_BLK
1502 .platdata_auto_alloc_size = sizeof(struct us_data),
1503#endif
acf277af
SG
1504};
1505
1506UCLASS_DRIVER(usb_mass_storage) = {
1507 .id = UCLASS_MASS_STORAGE,
1508 .name = "usb_mass_storage",
1509};
1510
1511static const struct usb_device_id mass_storage_id_table[] = {
1512 {
1513 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
1514 .bInterfaceClass = USB_CLASS_MASS_STORAGE
1515 },
1516 { } /* Terminating entry */
1517};
1518
abb59cff 1519U_BOOT_USB_DEVICE(usb_mass_storage, mass_storage_id_table);
07b2b78c 1520#endif
acf277af 1521
07b2b78c
SG
1522#ifdef CONFIG_BLK
1523static const struct blk_ops usb_storage_ops = {
1524 .read = usb_stor_read,
1525 .write = usb_stor_write,
1526};
1527
1528U_BOOT_DRIVER(usb_storage_blk) = {
1529 .name = "usb_storage_blk",
1530 .id = UCLASS_BLK,
1531 .ops = &usb_storage_ops,
1532};
c0543bf6
SG
1533#else
1534U_BOOT_LEGACY_BLK(usb) = {
1535 .if_typename = "usb",
1536 .if_type = IF_TYPE_USB,
1537 .max_devs = USB_MAX_STOR_DEV,
1538 .desc = usb_dev_desc,
1539};
acf277af 1540#endif