aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/storage/transport.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/usb/storage/transport.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/usb/storage/transport.c')
-rw-r--r--drivers/usb/storage/transport.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index 64ec073e89de..e8ae21b2d387 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -642,7 +642,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
642 * unless the operation involved a data-in transfer. Devices 642 * unless the operation involved a data-in transfer. Devices
643 * can signal most data-in errors by stalling the bulk-in pipe. 643 * can signal most data-in errors by stalling the bulk-in pipe.
644 */ 644 */
645 if ((us->protocol == US_PR_CB || us->protocol == US_PR_DPCM_USB) && 645 if ((us->protocol == USB_PR_CB || us->protocol == USB_PR_DPCM_USB) &&
646 srb->sc_data_direction != DMA_FROM_DEVICE) { 646 srb->sc_data_direction != DMA_FROM_DEVICE) {
647 US_DEBUGP("-- CB transport device requiring auto-sense\n"); 647 US_DEBUGP("-- CB transport device requiring auto-sense\n");
648 need_auto_sense = 1; 648 need_auto_sense = 1;
@@ -701,8 +701,8 @@ Retry_Sense:
701 scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sense_size); 701 scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sense_size);
702 702
703 /* FIXME: we must do the protocol translation here */ 703 /* FIXME: we must do the protocol translation here */
704 if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI || 704 if (us->subclass == USB_SC_RBC || us->subclass == USB_SC_SCSI ||
705 us->subclass == US_SC_CYP_ATACB) 705 us->subclass == USB_SC_CYP_ATACB)
706 srb->cmd_len = 6; 706 srb->cmd_len = 6;
707 else 707 else
708 srb->cmd_len = 12; 708 srb->cmd_len = 12;
@@ -819,6 +819,35 @@ Retry_Sense:
819 } 819 }
820 } 820 }
821 821
822 /*
823 * Some devices don't work or return incorrect data the first
824 * time they get a READ(10) command, or for the first READ(10)
825 * after a media change. If the INITIAL_READ10 flag is set,
826 * keep track of whether READ(10) commands succeed. If the
827 * previous one succeeded and this one failed, set the REDO_READ10
828 * flag to force a retry.
829 */
830 if (unlikely((us->fflags & US_FL_INITIAL_READ10) &&
831 srb->cmnd[0] == READ_10)) {
832 if (srb->result == SAM_STAT_GOOD) {
833 set_bit(US_FLIDX_READ10_WORKED, &us->dflags);
834 } else if (test_bit(US_FLIDX_READ10_WORKED, &us->dflags)) {
835 clear_bit(US_FLIDX_READ10_WORKED, &us->dflags);
836 set_bit(US_FLIDX_REDO_READ10, &us->dflags);
837 }
838
839 /*
840 * Next, if the REDO_READ10 flag is set, return a result
841 * code that will cause the SCSI core to retry the READ(10)
842 * command immediately.
843 */
844 if (test_bit(US_FLIDX_REDO_READ10, &us->dflags)) {
845 clear_bit(US_FLIDX_REDO_READ10, &us->dflags);
846 srb->result = DID_IMM_RETRY << 16;
847 srb->sense_buffer[0] = 0;
848 }
849 }
850
822 /* Did we transfer less than the minimum amount required? */ 851 /* Did we transfer less than the minimum amount required? */
823 if ((srb->result == SAM_STAT_GOOD || srb->sense_buffer[2] == 0) && 852 if ((srb->result == SAM_STAT_GOOD || srb->sense_buffer[2] == 0) &&
824 scsi_bufflen(srb) - scsi_get_resid(srb) < srb->underflow) 853 scsi_bufflen(srb) - scsi_get_resid(srb) < srb->underflow)
@@ -926,7 +955,7 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
926 /* NOTE: CB does not have a status stage. Silly, I know. So 955 /* NOTE: CB does not have a status stage. Silly, I know. So
927 * we have to catch this at a higher level. 956 * we have to catch this at a higher level.
928 */ 957 */
929 if (us->protocol != US_PR_CBI) 958 if (us->protocol != USB_PR_CBI)
930 return USB_STOR_TRANSPORT_GOOD; 959 return USB_STOR_TRANSPORT_GOOD;
931 960
932 result = usb_stor_intr_transfer(us, us->iobuf, 2); 961 result = usb_stor_intr_transfer(us, us->iobuf, 2);
@@ -942,7 +971,7 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
942 * that this means we could be ignoring a real error on these 971 * that this means we could be ignoring a real error on these
943 * commands, but that can't be helped. 972 * commands, but that can't be helped.
944 */ 973 */
945 if (us->subclass == US_SC_UFI) { 974 if (us->subclass == USB_SC_UFI) {
946 if (srb->cmnd[0] == REQUEST_SENSE || 975 if (srb->cmnd[0] == REQUEST_SENSE ||
947 srb->cmnd[0] == INQUIRY) 976 srb->cmnd[0] == INQUIRY)
948 return USB_STOR_TRANSPORT_GOOD; 977 return USB_STOR_TRANSPORT_GOOD;