diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/usb/storage/transport.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 39 |
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; |