diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2011-11-21 14:01:26 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2011-11-21 15:32:42 +0100 |
commit | 59310659073d85745854f2f10c4292555c5a1c51 (patch) | |
tree | a229c7e82d8ab143db85517e57962ef4aa840843 /hw | |
parent | 414c460431036bdadea8120d056c7e493bb60fb9 (diff) |
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.
Diffstat (limited to 'hw')
-rw-r--r-- | hw/usb-msd.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/hw/usb-msd.c b/hw/usb-msd.c index 6f32a0ecc7..68e3756783 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: |