Lines Matching +full:cmd +full:- +full:db
1 // SPDX-License-Identifier: GPL-2.0+
5 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
6 * (c) 2000 David L. Brown, Jr. (usb-storage@davidb.org)
11 * Adapted for U-Boot:
43 #include <dm/device-internal.h>
53 /* direction table -- this indicates the direction of the data
54 * transfer for each command code -- a 1 indicates input
88 unsigned char attention_done; /* force attn on first cmd */
107 #define USB_STOR_TRANSPORT_FAILED -1
108 #define USB_STOR_TRANSPORT_ERROR -2
147 printf(" Device %d: ", desc->devnum); in usb_stor_info()
174 len = usb_control_msg(us->pusb_dev, in usb_get_max_lun()
175 usb_rcvctrlpipe(us->pusb_dev, 0), in usb_get_max_lun()
178 0, us->ifnum, in usb_get_max_lun()
181 debug("Get Max LUN -> len = %i, result = %i\n", len, (int) *result); in usb_get_max_lun()
196 return -ENOENT; /* no more devices available */ in usb_stor_probe_device()
206 data = dev_get_platdata(udev->dev); in usb_stor_probe_device()
216 ret = blk_create_devicef(udev->dev, "usb_storage_blk", str, in usb_stor_probe_device()
225 blkdev->target = 0xff; in usb_stor_probe_device()
226 blkdev->lun = lun; in usb_stor_probe_device()
244 return -ENOSPC; in usb_stor_probe_device()
263 blkdev->if_type = IF_TYPE_USB; in usb_stor_probe_device()
264 blkdev->devnum = usb_max_devs; in usb_stor_probe_device()
265 blkdev->part_type = PART_TYPE_UNKNOWN; in usb_stor_probe_device()
266 blkdev->target = 0xff; in usb_stor_probe_device()
267 blkdev->type = DEV_TYPE_UNKNOWN; in usb_stor_probe_device()
268 blkdev->block_read = usb_stor_read; in usb_stor_probe_device()
269 blkdev->block_write = usb_stor_write; in usb_stor_probe_device()
270 blkdev->lun = lun; in usb_stor_probe_device()
271 blkdev->priv = udev; in usb_stor_probe_device()
275 debug("partype: %d\n", blkdev->part_type); in usb_stor_probe_device()
277 debug("partype: %d\n", blkdev->part_type); in usb_stor_probe_device()
295 * returns current device or -1 if no
322 return -1; in usb_stor_scan()
328 us = (struct us_data *)dev->privptr; in usb_stor_irq()
330 if (us->ip_wanted) in usb_stor_irq()
331 us->ip_wanted = 0; in usb_stor_irq()
341 printf("SRB: len %d datalen 0x%lX\n ", pccb->cmdlen, pccb->datalen); in usb_show_srb()
343 printf("%02X ", pccb->cmd[i]); in usb_show_srb()
373 max_size = usb_maxpacket(us->pusb_dev, pipe) * 16; in us_one_transfer()
378 /* calculate how long this will be -- maximum or a remainder */ in us_one_transfer()
380 length -= this_xfer; in us_one_transfer()
390 11 - maxtry); in us_one_transfer()
391 result = usb_bulk_msg(us->pusb_dev, pipe, buf, in us_one_transfer()
396 if (us->pusb_dev->status != 0) { in us_one_transfer()
401 display_int_status(us->pusb_dev->status); in us_one_transfer()
403 if (us->pusb_dev->status & USB_ST_STALLED) { in us_one_transfer()
404 debug("stalled ->clearing endpoint" \ in us_one_transfer()
406 stat = us->pusb_dev->status; in us_one_transfer()
407 usb_clear_halt(us->pusb_dev, pipe); in us_one_transfer()
408 us->pusb_dev->status = stat; in us_one_transfer()
413 us->pusb_dev->status); in us_one_transfer()
419 if (us->pusb_dev->status & USB_ST_NAK_REC) { in us_one_transfer()
426 us->pusb_dev->status); in us_one_transfer()
431 us->pusb_dev->status, partial); in us_one_transfer()
432 if (!maxtry--) in us_one_transfer()
436 this_xfer -= partial; in us_one_transfer()
455 * a) a Bulk-Only Mass Storage Reset in usb_stor_BBB_reset()
456 * b) a Clear Feature HALT to the Bulk-In endpoint in usb_stor_BBB_reset()
457 * c) a Clear Feature HALT to the Bulk-Out endpoint in usb_stor_BBB_reset()
466 result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0), in usb_stor_BBB_reset()
469 0, us->ifnum, NULL, 0, USB_CNTL_TIMEOUT * 5); in usb_stor_BBB_reset()
471 if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) { in usb_stor_BBB_reset()
473 return -1; in usb_stor_BBB_reset()
479 result, us->pusb_dev->status); in usb_stor_BBB_reset()
480 pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); in usb_stor_BBB_reset()
481 result = usb_clear_halt(us->pusb_dev, pipe); in usb_stor_BBB_reset()
485 result, us->pusb_dev->status); in usb_stor_BBB_reset()
487 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); in usb_stor_BBB_reset()
488 result = usb_clear_halt(us->pusb_dev, pipe); in usb_stor_BBB_reset()
491 result, us->pusb_dev->status); in usb_stor_BBB_reset()
502 unsigned char cmd[12]; in usb_stor_CB_reset() local
506 memset(cmd, 0xff, sizeof(cmd)); in usb_stor_CB_reset()
507 cmd[0] = SCSI_SEND_DIAG; in usb_stor_CB_reset()
508 cmd[1] = 4; in usb_stor_CB_reset()
509 result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0), in usb_stor_CB_reset()
512 0, us->ifnum, cmd, sizeof(cmd), in usb_stor_CB_reset()
518 result, us->pusb_dev->status); in usb_stor_CB_reset()
519 usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_in)); in usb_stor_CB_reset()
520 usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_out)); in usb_stor_CB_reset()
538 dir_in = US_DIRECTION(srb->cmd[0]); in usb_stor_BBB_comdat()
541 printf("dir %d lun %d cmdlen %d cmd %p datalen %lu pdata %p\n", in usb_stor_BBB_comdat()
542 dir_in, srb->lun, srb->cmdlen, srb->cmd, srb->datalen, in usb_stor_BBB_comdat()
543 srb->pdata); in usb_stor_BBB_comdat()
544 if (srb->cmdlen) { in usb_stor_BBB_comdat()
545 for (result = 0; result < srb->cmdlen; result++) in usb_stor_BBB_comdat()
546 printf("cmd[%d] %#x ", result, srb->cmd[result]); in usb_stor_BBB_comdat()
551 if (!(srb->cmdlen <= CBWCDBLENGTH)) { in usb_stor_BBB_comdat()
553 return -1; in usb_stor_BBB_comdat()
557 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); in usb_stor_BBB_comdat()
559 cbw->dCBWSignature = cpu_to_le32(CBWSIGNATURE); in usb_stor_BBB_comdat()
560 cbw->dCBWTag = cpu_to_le32(CBWTag++); in usb_stor_BBB_comdat()
561 cbw->dCBWDataTransferLength = cpu_to_le32(srb->datalen); in usb_stor_BBB_comdat()
562 cbw->bCBWFlags = (dir_in ? CBWFLAGS_IN : CBWFLAGS_OUT); in usb_stor_BBB_comdat()
563 cbw->bCBWLUN = srb->lun; in usb_stor_BBB_comdat()
564 cbw->bCDBLength = srb->cmdlen; in usb_stor_BBB_comdat()
568 memcpy(cbw->CBWCDB, srb->cmd, srb->cmdlen); in usb_stor_BBB_comdat()
569 result = usb_bulk_msg(us->pusb_dev, pipe, cbw, UMASS_BBB_CBW_SIZE, in usb_stor_BBB_comdat()
587 dir_in = US_DIRECTION(srb->cmd[0]); in usb_stor_CB_comdat()
590 pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); in usb_stor_CB_comdat()
592 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); in usb_stor_CB_comdat()
594 while (retry--) { in usb_stor_CB_comdat()
595 debug("CBI gets a command: Try %d\n", 5 - retry); in usb_stor_CB_comdat()
600 result = usb_control_msg(us->pusb_dev, in usb_stor_CB_comdat()
601 usb_sndctrlpipe(us->pusb_dev , 0), in usb_stor_CB_comdat()
604 0, us->ifnum, in usb_stor_CB_comdat()
605 srb->cmd, srb->cmdlen, in usb_stor_CB_comdat()
608 result, us->pusb_dev->status); in usb_stor_CB_comdat()
611 if (us->pusb_dev->status & USB_ST_STALLED) { in usb_stor_CB_comdat()
612 status = us->pusb_dev->status; in usb_stor_CB_comdat()
615 usb_clear_halt(us->pusb_dev, in usb_stor_CB_comdat()
616 usb_sndctrlpipe(us->pusb_dev, 0)); in usb_stor_CB_comdat()
617 us->pusb_dev->status = status; in usb_stor_CB_comdat()
620 " Stat = %lX\n", srb->cmd[0], in usb_stor_CB_comdat()
621 us->pusb_dev->status); in usb_stor_CB_comdat()
628 dir_in ? "IN" : "OUT", srb->datalen); in usb_stor_CB_comdat()
629 if (srb->datalen) { in usb_stor_CB_comdat()
630 result = us_one_transfer(us, pipe, (char *)srb->pdata, in usb_stor_CB_comdat()
631 srb->datalen); in usb_stor_CB_comdat()
634 result, us->pusb_dev->status, in usb_stor_CB_comdat()
635 us->pusb_dev->act_len); in usb_stor_CB_comdat()
636 if (!(us->pusb_dev->status & USB_ST_NAK_REC)) in usb_stor_CB_comdat()
638 } /* if (srb->datalen) */ in usb_stor_CB_comdat()
652 us->ip_wanted = 1; in usb_stor_CBI_get_status()
653 submit_int_msg(us->pusb_dev, us->irqpipe, in usb_stor_CBI_get_status()
654 (void *) &us->ip_data, us->irqmaxp, us->irqinterval); in usb_stor_CBI_get_status()
656 while (timeout--) { in usb_stor_CBI_get_status()
657 if (us->ip_wanted == 0) in usb_stor_CBI_get_status()
661 if (us->ip_wanted) { in usb_stor_CBI_get_status()
663 us->ip_wanted = 0; in usb_stor_CBI_get_status()
667 us->ip_data, us->pusb_dev->irq_act_len, in usb_stor_CBI_get_status()
668 us->pusb_dev->irq_status); in usb_stor_CBI_get_status()
670 if (us->subclass == US_SC_UFI) { in usb_stor_CBI_get_status()
671 if (srb->cmd[0] == SCSI_REQ_SENSE || in usb_stor_CBI_get_status()
672 srb->cmd[0] == SCSI_INQUIRY) in usb_stor_CBI_get_status()
674 else if (us->ip_data) in usb_stor_CBI_get_status()
680 switch (us->ip_data) { in usb_stor_CBI_get_status()
694 /* clear a stall on an endpoint - special for BBB devices */
698 return usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0), in usb_stor_BBB_clear_endpt_stall()
715 dir_in = US_DIRECTION(srb->cmd[0]); in usb_stor_BBB_transport()
722 us->pusb_dev->status); in usb_stor_BBB_transport()
726 if (!(us->flags & USB_READY)) in usb_stor_BBB_transport()
728 pipein = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); in usb_stor_BBB_transport()
729 pipeout = usb_sndbulkpipe(us->pusb_dev, us->ep_out); in usb_stor_BBB_transport()
733 if (srb->datalen == 0) in usb_stor_BBB_transport()
741 result = usb_bulk_msg(us->pusb_dev, pipe, srb->pdata, srb->datalen, in usb_stor_BBB_transport()
744 if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) { in usb_stor_BBB_transport()
748 dir_in ? us->ep_in : us->ep_out); in usb_stor_BBB_transport()
755 us->pusb_dev->status); in usb_stor_BBB_transport()
761 printf("pdata[%d] %#x ", index, srb->pdata[index]); in usb_stor_BBB_transport()
769 result = usb_bulk_msg(us->pusb_dev, pipein, csw, UMASS_BBB_CSW_SIZE, in usb_stor_BBB_transport()
774 (us->pusb_dev->status & USB_ST_STALLED)) { in usb_stor_BBB_transport()
777 result = usb_stor_BBB_clear_endpt_stall(us, us->ep_in); in usb_stor_BBB_transport()
784 us->pusb_dev->status); in usb_stor_BBB_transport()
795 pipe = le32_to_cpu(csw->dCSWDataResidue); in usb_stor_BBB_transport()
796 if (pipe == 0 && srb->datalen != 0 && srb->datalen - data_actlen != 0) in usb_stor_BBB_transport()
797 pipe = srb->datalen - data_actlen; in usb_stor_BBB_transport()
798 if (CSWSIGNATURE != le32_to_cpu(csw->dCSWSignature)) { in usb_stor_BBB_transport()
802 } else if ((CBWTag - 1) != le32_to_cpu(csw->dCSWTag)) { in usb_stor_BBB_transport()
806 } else if (csw->bCSWStatus > CSWSTATUS_PHASE) { in usb_stor_BBB_transport()
810 } else if (csw->bCSWStatus == CSWSTATUS_PHASE) { in usb_stor_BBB_transport()
814 } else if (data_actlen > srb->datalen) { in usb_stor_BBB_transport()
815 debug("transferred %dB instead of %ldB\n", in usb_stor_BBB_transport()
816 data_actlen, srb->datalen); in usb_stor_BBB_transport()
818 } else if (csw->bCSWStatus == CSWSTATUS_FAILED) { in usb_stor_BBB_transport()
841 result, us->pusb_dev->status); in usb_stor_CB_transport()
843 if (us->protocol == US_PR_CBI) { in usb_stor_CB_transport()
850 srb->sense_buf[12] = (unsigned char)(us->ip_data >> 8); in usb_stor_CB_transport()
851 srb->sense_buf[13] = (unsigned char)(us->ip_data & 0xff); in usb_stor_CB_transport()
852 if (!us->ip_data) { in usb_stor_CB_transport()
862 if ((result < 0) && !(us->pusb_dev->status & USB_ST_STALLED)) { in usb_stor_CB_transport()
863 debug("ERROR %lX\n", us->pusb_dev->status); in usb_stor_CB_transport()
864 us->transport_reset(us); in usb_stor_CB_transport()
867 if ((us->protocol == US_PR_CBI) && in usb_stor_CB_transport()
868 ((srb->cmd[0] == SCSI_REQ_SENSE) || in usb_stor_CB_transport()
869 (srb->cmd[0] == SCSI_INQUIRY))) { in usb_stor_CB_transport()
875 memset(&psrb->cmd[0], 0, 12); in usb_stor_CB_transport()
876 psrb->cmd[0] = SCSI_REQ_SENSE; in usb_stor_CB_transport()
877 psrb->cmd[1] = srb->lun << 5; in usb_stor_CB_transport()
878 psrb->cmd[4] = 18; in usb_stor_CB_transport()
879 psrb->datalen = 18; in usb_stor_CB_transport()
880 psrb->pdata = &srb->sense_buf[0]; in usb_stor_CB_transport()
881 psrb->cmdlen = 12; in usb_stor_CB_transport()
886 if (us->protocol == US_PR_CBI) in usb_stor_CB_transport()
889 if ((result < 0) && !(us->pusb_dev->status & USB_ST_STALLED)) { in usb_stor_CB_transport()
891 us->pusb_dev->status); in usb_stor_CB_transport()
895 srb->sense_buf[0], srb->sense_buf[2], in usb_stor_CB_transport()
896 srb->sense_buf[12], srb->sense_buf[13]); in usb_stor_CB_transport()
898 if ((srb->sense_buf[2] == 0) && in usb_stor_CB_transport()
899 (srb->sense_buf[12] == 0) && in usb_stor_CB_transport()
900 (srb->sense_buf[13] == 0)) { in usb_stor_CB_transport()
906 switch (srb->sense_buf[2]) { in usb_stor_CB_transport()
914 printf("cmd 0x%02X returned 0x%02X 0x%02X 0x%02X" in usb_stor_CB_transport()
915 " 0x%02X (NOT READY)\n", srb->cmd[0], in usb_stor_CB_transport()
916 srb->sense_buf[0], srb->sense_buf[2], in usb_stor_CB_transport()
917 srb->sense_buf[12], srb->sense_buf[13]); in usb_stor_CB_transport()
926 printf("cmd 0x%02X returned 0x%02X 0x%02X 0x%02X" in usb_stor_CB_transport()
927 " 0x%02X\n", srb->cmd[0], srb->sense_buf[0], in usb_stor_CB_transport()
928 srb->sense_buf[2], srb->sense_buf[12], in usb_stor_CB_transport()
929 srb->sense_buf[13]); in usb_stor_CB_transport()
948 * The U-Boot EHCI driver can handle any transfer length as long as in usb_stor_set_max_xfer_blk()
968 us->max_xfer_blk = blk; in usb_stor_set_max_xfer_blk()
976 memset(&srb->cmd[0], 0, 12); in usb_inquiry()
977 srb->cmd[0] = SCSI_INQUIRY; in usb_inquiry()
978 srb->cmd[1] = srb->lun << 5; in usb_inquiry()
979 srb->cmd[4] = 36; in usb_inquiry()
980 srb->datalen = 36; in usb_inquiry()
981 srb->cmdlen = 12; in usb_inquiry()
982 i = ss->transport(srb, ss); in usb_inquiry()
986 } while (--retry); in usb_inquiry()
990 return -1; in usb_inquiry()
999 ptr = (char *)srb->pdata; in usb_request_sense()
1000 memset(&srb->cmd[0], 0, 12); in usb_request_sense()
1001 srb->cmd[0] = SCSI_REQ_SENSE; in usb_request_sense()
1002 srb->cmd[1] = srb->lun << 5; in usb_request_sense()
1003 srb->cmd[4] = 18; in usb_request_sense()
1004 srb->datalen = 18; in usb_request_sense()
1005 srb->pdata = &srb->sense_buf[0]; in usb_request_sense()
1006 srb->cmdlen = 12; in usb_request_sense()
1007 ss->transport(srb, ss); in usb_request_sense()
1009 srb->sense_buf[2], srb->sense_buf[12], in usb_request_sense()
1010 srb->sense_buf[13]); in usb_request_sense()
1011 srb->pdata = (uchar *)ptr; in usb_request_sense()
1020 memset(&srb->cmd[0], 0, 12); in usb_test_unit_ready()
1021 srb->cmd[0] = SCSI_TST_U_RDY; in usb_test_unit_ready()
1022 srb->cmd[1] = srb->lun << 5; in usb_test_unit_ready()
1023 srb->datalen = 0; in usb_test_unit_ready()
1024 srb->cmdlen = 12; in usb_test_unit_ready()
1025 if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) { in usb_test_unit_ready()
1026 ss->flags |= USB_READY; in usb_test_unit_ready()
1032 * "Not Ready - medium not present" in usb_test_unit_ready()
1037 if ((srb->sense_buf[2] == 0x02) && in usb_test_unit_ready()
1038 (srb->sense_buf[12] == 0x3a)) in usb_test_unit_ready()
1039 return -1; in usb_test_unit_ready()
1041 } while (retries--); in usb_test_unit_ready()
1043 return -1; in usb_test_unit_ready()
1052 memset(&srb->cmd[0], 0, 12); in usb_read_capacity()
1053 srb->cmd[0] = SCSI_RD_CAPAC; in usb_read_capacity()
1054 srb->cmd[1] = srb->lun << 5; in usb_read_capacity()
1055 srb->datalen = 8; in usb_read_capacity()
1056 srb->cmdlen = 12; in usb_read_capacity()
1057 if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) in usb_read_capacity()
1059 } while (retry--); in usb_read_capacity()
1061 return -1; in usb_read_capacity()
1067 memset(&srb->cmd[0], 0, 12); in usb_read_10()
1068 srb->cmd[0] = SCSI_READ10; in usb_read_10()
1069 srb->cmd[1] = srb->lun << 5; in usb_read_10()
1070 srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff; in usb_read_10()
1071 srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff; in usb_read_10()
1072 srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff; in usb_read_10()
1073 srb->cmd[5] = ((unsigned char) (start)) & 0xff; in usb_read_10()
1074 srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff; in usb_read_10()
1075 srb->cmd[8] = (unsigned char) blocks & 0xff; in usb_read_10()
1076 srb->cmdlen = 12; in usb_read_10()
1078 return ss->transport(srb, ss); in usb_read_10()
1084 memset(&srb->cmd[0], 0, 12); in usb_write_10()
1085 srb->cmd[0] = SCSI_WRITE10; in usb_write_10()
1086 srb->cmd[1] = srb->lun << 5; in usb_write_10()
1087 srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff; in usb_write_10()
1088 srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff; in usb_write_10()
1089 srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff; in usb_write_10()
1090 srb->cmd[5] = ((unsigned char) (start)) & 0xff; in usb_write_10()
1091 srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff; in usb_write_10()
1092 srb->cmd[8] = (unsigned char) blocks & 0xff; in usb_write_10()
1093 srb->cmdlen = 12; in usb_write_10()
1095 return ss->transport(srb, ss); in usb_write_10()
1147 debug("\nusb_read: udev %d\n", block_dev->devnum); in usb_stor_read()
1149 debug("\nusb_read: udev %d\n", block_dev->devnum); in usb_stor_read()
1150 udev = usb_dev_desc[block_dev->devnum].priv; in usb_stor_read()
1156 ss = (struct us_data *)udev->privptr; in usb_stor_read()
1159 srb->lun = block_dev->lun; in usb_stor_read()
1165 block_dev->devnum, start, blks, buf_addr); in usb_stor_read()
1170 srb->pdata = (unsigned char *)buf_addr; in usb_stor_read()
1171 if (blks > ss->max_xfer_blk) in usb_stor_read()
1172 smallblks = ss->max_xfer_blk; in usb_stor_read()
1176 if (smallblks == ss->max_xfer_blk) in usb_stor_read()
1178 srb->datalen = block_dev->blksz * smallblks; in usb_stor_read()
1179 srb->pdata = (unsigned char *)buf_addr; in usb_stor_read()
1183 if (retry--) in usb_stor_read()
1185 blkcnt -= blks; in usb_stor_read()
1189 blks -= smallblks; in usb_stor_read()
1190 buf_addr += srb->datalen; in usb_stor_read()
1192 ss->flags &= ~USB_READY; in usb_stor_read()
1198 if (blkcnt >= ss->max_xfer_blk) in usb_stor_read()
1229 debug("\nusb_read: udev %d\n", block_dev->devnum); in usb_stor_write()
1231 debug("\nusb_read: udev %d\n", block_dev->devnum); in usb_stor_write()
1232 udev = usb_dev_desc[block_dev->devnum].priv; in usb_stor_write()
1238 ss = (struct us_data *)udev->privptr; in usb_stor_write()
1242 srb->lun = block_dev->lun; in usb_stor_write()
1248 block_dev->devnum, start, blks, buf_addr); in usb_stor_write()
1255 srb->pdata = (unsigned char *)buf_addr; in usb_stor_write()
1256 if (blks > ss->max_xfer_blk) in usb_stor_write()
1257 smallblks = ss->max_xfer_blk; in usb_stor_write()
1261 if (smallblks == ss->max_xfer_blk) in usb_stor_write()
1263 srb->datalen = block_dev->blksz * smallblks; in usb_stor_write()
1264 srb->pdata = (unsigned char *)buf_addr; in usb_stor_write()
1268 if (retry--) in usb_stor_write()
1270 blkcnt -= blks; in usb_stor_write()
1274 blks -= smallblks; in usb_stor_write()
1275 buf_addr += srb->datalen; in usb_stor_write()
1277 ss->flags &= ~USB_READY; in usb_stor_write()
1283 if (blkcnt >= ss->max_xfer_blk) in usb_stor_write()
1299 iface = &dev->config.if_desc[ifnum]; in usb_storage_probe()
1301 if (dev->descriptor.bDeviceClass != 0 || in usb_storage_probe()
1302 iface->desc.bInterfaceClass != USB_CLASS_MASS_STORAGE || in usb_storage_probe()
1303 iface->desc.bInterfaceSubClass < US_SC_MIN || in usb_storage_probe()
1304 iface->desc.bInterfaceSubClass > US_SC_MAX) { in usb_storage_probe()
1316 ss->flags = flags; in usb_storage_probe()
1317 ss->ifnum = ifnum; in usb_storage_probe()
1318 ss->pusb_dev = dev; in usb_storage_probe()
1319 ss->attention_done = 0; in usb_storage_probe()
1320 ss->subclass = iface->desc.bInterfaceSubClass; in usb_storage_probe()
1321 ss->protocol = iface->desc.bInterfaceProtocol; in usb_storage_probe()
1325 switch (ss->protocol) { in usb_storage_probe()
1328 ss->transport = usb_stor_CB_transport; in usb_storage_probe()
1329 ss->transport_reset = usb_stor_CB_reset; in usb_storage_probe()
1334 ss->transport = usb_stor_CB_transport; in usb_storage_probe()
1335 ss->transport_reset = usb_stor_CB_reset; in usb_storage_probe()
1339 ss->transport = usb_stor_BBB_transport; in usb_storage_probe()
1340 ss->transport_reset = usb_stor_BBB_reset; in usb_storage_probe()
1349 * We are expecting a minimum of 2 endpoints - in and out (bulk). in usb_storage_probe()
1353 for (i = 0; i < iface->desc.bNumEndpoints; i++) { in usb_storage_probe()
1354 ep_desc = &iface->ep_desc[i]; in usb_storage_probe()
1356 if ((ep_desc->bmAttributes & in usb_storage_probe()
1358 if (ep_desc->bEndpointAddress & USB_DIR_IN) in usb_storage_probe()
1359 ss->ep_in = ep_desc->bEndpointAddress & in usb_storage_probe()
1362 ss->ep_out = in usb_storage_probe()
1363 ep_desc->bEndpointAddress & in usb_storage_probe()
1368 if ((ep_desc->bmAttributes & in usb_storage_probe()
1370 ss->ep_int = ep_desc->bEndpointAddress & in usb_storage_probe()
1372 ss->irqinterval = ep_desc->bInterval; in usb_storage_probe()
1376 ss->ep_in, ss->ep_out, ss->ep_int); in usb_storage_probe()
1379 if (usb_set_interface(dev, iface->desc.bInterfaceNumber, 0) || in usb_storage_probe()
1380 !ss->ep_in || !ss->ep_out || in usb_storage_probe()
1381 (ss->protocol == US_PR_CBI && ss->ep_int == 0)) { in usb_storage_probe()
1388 * The SFF8070 accepts the requests used in u-boot in usb_storage_probe()
1390 if (ss->subclass != US_SC_UFI && ss->subclass != US_SC_SCSI && in usb_storage_probe()
1391 ss->subclass != US_SC_8070) { in usb_storage_probe()
1392 printf("Sorry, protocol %d not yet supported.\n", ss->subclass); in usb_storage_probe()
1395 if (ss->ep_int) { in usb_storage_probe()
1399 ss->irqinterval = (ss->irqinterval > 0) ? ss->irqinterval : 255; in usb_storage_probe()
1400 ss->irqpipe = usb_rcvintpipe(ss->pusb_dev, ss->ep_int); in usb_storage_probe()
1401 ss->irqmaxp = usb_maxpacket(dev, ss->irqpipe); in usb_storage_probe()
1402 dev->irq_handle = usb_stor_irq; in usb_storage_probe()
1408 dev->privptr = (void *)ss; in usb_storage_probe()
1421 pccb->pdata = usb_stor_buf; in usb_stor_get_info()
1423 dev_desc->target = dev->devnum; in usb_stor_get_info()
1424 pccb->lun = dev_desc->lun; in usb_stor_get_info()
1425 debug(" address %d\n", dev_desc->target); in usb_stor_get_info()
1429 return -1; in usb_stor_get_info()
1445 dev_desc->removable = 1; in usb_stor_get_info()
1447 memcpy(dev_desc->vendor, (const void *)&usb_stor_buf[8], 8); in usb_stor_get_info()
1448 memcpy(dev_desc->product, (const void *)&usb_stor_buf[16], 16); in usb_stor_get_info()
1449 memcpy(dev_desc->revision, (const void *)&usb_stor_buf[32], 4); in usb_stor_get_info()
1450 dev_desc->vendor[8] = 0; in usb_stor_get_info()
1451 dev_desc->product[16] = 0; in usb_stor_get_info()
1452 dev_desc->revision[4] = 0; in usb_stor_get_info()
1454 usb_bin_fixup(dev->descriptor, (uchar *)dev_desc->vendor, in usb_stor_get_info()
1455 (uchar *)dev_desc->product); in usb_stor_get_info()
1462 pccb->sense_buf[2], pccb->sense_buf[12], in usb_stor_get_info()
1463 pccb->sense_buf[13]); in usb_stor_get_info()
1464 if (dev_desc->removable == 1) in usb_stor_get_info()
1465 dev_desc->type = perq; in usb_stor_get_info()
1468 pccb->pdata = (unsigned char *)cap; in usb_stor_get_info()
1469 memset(pccb->pdata, 0, 8); in usb_stor_get_info()
1475 ss->flags &= ~USB_READY; in usb_stor_get_info()
1489 dev_desc->lba = capacity; in usb_stor_get_info()
1490 dev_desc->blksz = blksz; in usb_stor_get_info()
1491 dev_desc->log2blksz = LOG2(dev_desc->blksz); in usb_stor_get_info()
1492 dev_desc->type = perq; in usb_stor_get_info()
1493 debug(" address %d\n", dev_desc->target); in usb_stor_get_info()
1513 { .compatible = "usb-mass-storage" },