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