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