aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2011-11-21 14:01:26 +0100
committerGerd Hoffmann <kraxel@redhat.com>2011-11-21 15:32:42 +0100
commit59310659073d85745854f2f10c4292555c5a1c51 (patch)
treea229c7e82d8ab143db85517e57962ef4aa840843
parent414c460431036bdadea8120d056c7e493bb60fb9 (diff)
downloadqemu-59310659073d85745854f2f10c4292555c5a1c51.zip
qemu-59310659073d85745854f2f10c4292555c5a1c51.tar.gz
qemu-59310659073d85745854f2f10c4292555c5a1c51.tar.bz2
usb-storage: don't try to send the status early.
Until recently all scsi commands sent to scsi-disk did either transfer data or finished instantly. The correct implementation of SYNCRONIZE_CACHE changed the picture though, and usb-storage needs a fix to handle that case correctly.
-rw-r--r--hw/usb-msd.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/hw/usb-msd.c b/hw/usb-msd.c
index 6f32a0e..68e3756 100644
--- a/hw/usb-msd.c
+++ b/hw/usb-msd.c
@@ -378,9 +378,7 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
s->scsi_len = 0;
s->req = scsi_req_new(s->scsi_dev, tag, 0, cbw.cmd, NULL);
scsi_req_enqueue(s->req);
- /* ??? Should check that USB and SCSI data transfer
- directions match. */
- if (s->mode != USB_MSDM_CSW && s->residue == 0) {
+ if (s->req && s->req->cmd.xfer != SCSI_XFER_NONE) {
scsi_req_continue(s->req);
}
ret = p->result;
@@ -439,9 +437,15 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
goto fail;
}
- usb_msd_send_status(s, p);
- s->mode = USB_MSDM_CBW;
- ret = 13;
+ if (s->req) {
+ /* still in flight */
+ s->packet = p;
+ ret = USB_RET_ASYNC;
+ } else {
+ usb_msd_send_status(s, p);
+ s->mode = USB_MSDM_CBW;
+ ret = 13;
+ }
break;
case USB_MSDM_DATAIN: