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