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