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