|
@@ -1118,6 +1118,31 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|
*/
|
|
*/
|
|
if (result == USB_STOR_XFER_LONG)
|
|
if (result == USB_STOR_XFER_LONG)
|
|
fake_sense = 1;
|
|
fake_sense = 1;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Sometimes a device will mistakenly skip the data phase
|
|
|
|
+ * and go directly to the status phase without sending a
|
|
|
|
+ * zero-length packet. If we get a 13-byte response here,
|
|
|
|
+ * check whether it really is a CSW.
|
|
|
|
+ */
|
|
|
|
+ if (result == USB_STOR_XFER_SHORT &&
|
|
|
|
+ srb->sc_data_direction == DMA_FROM_DEVICE &&
|
|
|
|
+ transfer_length - scsi_get_resid(srb) ==
|
|
|
|
+ US_BULK_CS_WRAP_LEN) {
|
|
|
|
+ struct scatterlist *sg = NULL;
|
|
|
|
+ unsigned int offset = 0;
|
|
|
|
+
|
|
|
|
+ if (usb_stor_access_xfer_buf((unsigned char *) bcs,
|
|
|
|
+ US_BULK_CS_WRAP_LEN, srb, &sg,
|
|
|
|
+ &offset, FROM_XFER_BUF) ==
|
|
|
|
+ US_BULK_CS_WRAP_LEN &&
|
|
|
|
+ bcs->Signature ==
|
|
|
|
+ cpu_to_le32(US_BULK_CS_SIGN)) {
|
|
|
|
+ usb_stor_dbg(us, "Device skipped data phase\n");
|
|
|
|
+ scsi_set_resid(srb, transfer_length);
|
|
|
|
+ goto skipped_data_phase;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/* See flow chart on pg 15 of the Bulk Only Transport spec for
|
|
/* See flow chart on pg 15 of the Bulk Only Transport spec for
|
|
@@ -1153,6 +1178,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|
if (result != USB_STOR_XFER_GOOD)
|
|
if (result != USB_STOR_XFER_GOOD)
|
|
return USB_STOR_TRANSPORT_ERROR;
|
|
return USB_STOR_TRANSPORT_ERROR;
|
|
|
|
|
|
|
|
+ skipped_data_phase:
|
|
/* check bulk status */
|
|
/* check bulk status */
|
|
residue = le32_to_cpu(bcs->Residue);
|
|
residue = le32_to_cpu(bcs->Residue);
|
|
usb_stor_dbg(us, "Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
|
|
usb_stor_dbg(us, "Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
|