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