From: Anthony Liguori Date: Tue, 31 May 2011 13:20:56 +0000 (-0500) Subject: Merge remote-tracking branch 'bonzini/scsi.2' into staging X-Git-Tag: v0.15.0-rc0~237 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=ed7ec8400707fe42f4a0f40db2f2d5827ecea789;p=qemu.git Merge remote-tracking branch 'bonzini/scsi.2' into staging Conflicts: hw/usb-msd.c --- ed7ec8400707fe42f4a0f40db2f2d5827ecea789 diff --cc hw/usb-msd.c index 141da2ce8,6ec2255bc..c59797b27 --- a/hw/usb-msd.c +++ b/hw/usb-msd.c @@@ -213,47 -208,21 +210,21 @@@ static void usb_msd_send_status(MSDStat memcpy(p->data, &csw, len); } - static void usb_msd_command_complete(SCSIBus *bus, int reason, uint32_t tag, - uint32_t arg) + static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len) { - MSDState *s = DO_UPCAST(MSDState, dev.qdev, bus->qbus.parent); + MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p = s->packet; - if (tag != s->tag) { - fprintf(stderr, "usb-msd: Unexpected SCSI Tag 0x%x\n", tag); - } - if (reason == SCSI_REASON_DONE) { - DPRINTF("Command complete %d\n", arg); - s->residue = s->data_len; - s->result = arg != 0; - if (s->packet) { - if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) { - /* A deferred packet with no write data remaining must be - the status read packet. */ - usb_msd_send_status(s, p); - s->mode = USB_MSDM_CBW; - } else { - if (s->data_len) { - s->data_len -= s->usb_len; - if (s->mode == USB_MSDM_DATAIN) - memset(s->usb_buf, 0, s->usb_len); - s->usb_len = 0; - } - if (s->data_len == 0) - s->mode = USB_MSDM_CSW; - } - s->packet = NULL; - usb_packet_complete(&s->dev, p); - } else if (s->data_len == 0) { - s->mode = USB_MSDM_CSW; - } - return; + if (req->tag != s->tag) { + fprintf(stderr, "usb-msd: Unexpected SCSI Tag 0x%x\n", req->tag); } - s->scsi_len = arg; - s->scsi_buf = s->scsi_dev->info->get_buf(s->scsi_dev, tag); + + assert((s->mode == USB_MSDM_DATAOUT) == (req->cmd.mode == SCSI_XFER_TO_DEV)); + s->scsi_len = len; + s->scsi_buf = scsi_req_get_buf(req); if (p) { usb_msd_copy_data(s); - if (s->usb_len == 0) { + if (s->packet && s->usb_len == 0) { /* Set s->packet to NULL before calling usb_packet_complete because another request may be issued before usb_packet_complete returns. */ @@@ -315,12 -334,10 +336,10 @@@ static int usb_msd_handle_control(USBDe return ret; } -static void usb_msd_cancel_io(USBPacket *p, void *opaque) +static void usb_msd_cancel_io(USBDevice *dev, USBPacket *p) { - MSDState *s = opaque; + MSDState *s = DO_UPCAST(MSDState, dev, dev); - s->scsi_dev->info->cancel_io(s->scsi_dev, s->tag); - s->packet = NULL; - s->scsi_len = 0; + scsi_req_cancel(s->req); } static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)