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