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