summaryrefslogtreecommitdiffstats
path: root/hw
diff options
context:
space:
mode:
authorPeter Maydell2018-10-01 13:33:18 +0200
committerPeter Maydell2018-10-01 13:33:18 +0200
commit24c3833717d2528b98833bb5ebf4397a5512043f (patch)
treec0061b7a88fc8b059544ec122119b1ad808d0aad /hw
parentMerge remote-tracking branch 'remotes/kraxel/tags/vga-20180927-pull-request' ... (diff)
parentohci: set effectively usb frame rate to 1kHz (diff)
downloadqemu-24c3833717d2528b98833bb5ebf4397a5512043f.tar.gz
qemu-24c3833717d2528b98833bb5ebf4397a5512043f.tar.xz
qemu-24c3833717d2528b98833bb5ebf4397a5512043f.zip
Merge remote-tracking branch 'remotes/kraxel/tags/usb-20181001-pull-request' into staging
usb: fixes for mtp, hub and ohci. # gpg: Signature made Mon 01 Oct 2018 10:28:36 BST # gpg: using RSA key 4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/usb-20181001-pull-request: ohci: set effectively usb frame rate to 1kHz usb-hub: clear suspend on detach usb-mtp: reset ObjectInfo dataset size on cleanup doc: replace x-root with rootdir for usb-mtp usb-mtp: fix error conditions for write operation Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r--hw/usb/dev-hub.c4
-rw-r--r--hw/usb/dev-mtp.c9
-rw-r--r--hw/usb/hcd-ohci.c6
3 files changed, 15 insertions, 4 deletions
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c
index 5d9743ef93..dc368179d1 100644
--- a/hw/usb/dev-hub.c
+++ b/hw/usb/dev-hub.c
@@ -191,6 +191,10 @@ static void usb_hub_detach(USBPort *port1)
port->wPortStatus &= ~PORT_STAT_ENABLE;
port->wPortChange |= PORT_STAT_C_ENABLE;
}
+ if (port->wPortStatus & PORT_STAT_SUSPEND) {
+ port->wPortStatus &= ~PORT_STAT_SUSPEND;
+ port->wPortChange |= PORT_STAT_C_SUSPEND;
+ }
usb_wakeup(s->intr, 0);
}
diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
index 3fdc4b0da1..00a3691bae 100644
--- a/hw/usb/dev-mtp.c
+++ b/hw/usb/dev-mtp.c
@@ -1568,6 +1568,7 @@ static void usb_mtp_handle_control(USBDevice *dev, USBPacket *p,
if (s->write_pending) {
g_free(s->dataset.filename);
s->write_pending = false;
+ s->dataset.size = 0;
}
usb_mtp_data_free(s->data_out);
s->data_out = NULL;
@@ -1665,13 +1666,14 @@ static void usb_mtp_write_data(MTPState *s)
goto success;
}
- rc = write_retry(d->fd, d->data, s->dataset.size);
- if (!rc) {
+ rc = write_retry(d->fd, d->data, d->offset);
+ if (rc != d->offset) {
usb_mtp_queue_result(s, RES_STORE_FULL, d->trans,
0, 0, 0, 0);
goto done;
}
- if (rc != s->dataset.size) {
+ /* Only for < 4G file sizes */
+ if (s->dataset.size != 0xFFFFFFFF && rc != s->dataset.size) {
usb_mtp_queue_result(s, RES_INCOMPLETE_TRANSFER, d->trans,
0, 0, 0, 0);
goto done;
@@ -1692,6 +1694,7 @@ done:
}
free:
g_free(s->dataset.filename);
+ s->dataset.size = 0;
g_free(path);
s->write_pending = false;
}
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 98da5f0f04..66656a1133 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1253,12 +1253,12 @@ static int ohci_service_ed_list(OHCIState *ohci, uint32_t head, int completion)
/* set a timer for EOF */
static void ohci_eof_timer(OHCIState *ohci)
{
- ohci->sof_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
timer_mod(ohci->eof_timer, ohci->sof_time + usb_frame_time);
}
/* Set a timer for EOF and generate a SOF event */
static void ohci_sof(OHCIState *ohci)
{
+ ohci->sof_time += usb_frame_time;
ohci_eof_timer(ohci);
ohci_set_interrupt(ohci, OHCI_INTR_SF);
}
@@ -1362,6 +1362,7 @@ static int ohci_bus_start(OHCIState *ohci)
* can meet some race conditions
*/
+ ohci->sof_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
ohci_eof_timer(ohci);
return 1;
@@ -1476,6 +1477,9 @@ static uint32_t ohci_get_frame_remaining(OHCIState *ohci)
* set already.
*/
tks = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - ohci->sof_time;
+ if (tks < 0) {
+ tks = 0;
+ }
/* avoid muldiv if possible */
if (tks >= usb_frame_time)