[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Mouse not working on the console with the latest Windows Blue
On Wed, 2013-09-11 at 11:05 +0100, Ian Campbell wrote: > On Mon, 2013-08-19 at 13:19 +0100, Frediano Ziglio wrote: > > Windows 8.1 (Blue) on initialization check if usb frame number increase > > after 5 ms. It could happen however that timer function is not run in > > that amount of time so Windows believe that usb controller is not working > > properly. This patch prevent this detecting that timer function was not > > run and run it. > > Is this for qemu-trad? Please mention this in the future. > I'll try to remember. Yes, it apply to traditional. > Is a similar fix needed for upstream qemu? > It's a good question. Unfortunately code is quite different and setting up everything (VM, test environment, etc) with upstream is not that straight forward (at least for me). Frediano > > > > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx> > > --- > > hw/usb-uhci.c | 19 +++++++++++++++---- > > 1 file changed, 15 insertions(+), 4 deletions(-) > > > > diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c > > index d42d394..a255429 100644 > > --- a/hw/usb-uhci.c > > +++ b/hw/usb-uhci.c > > @@ -129,6 +129,7 @@ typedef struct UHCIState { > > uint32_t fl_base_addr; /* frame list base address */ > > uint8_t sof_timing; > > uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */ > > + int64_t expire_time; > > QEMUTimer *frame_timer; > > UHCIPort ports[NB_PORTS]; > > > > @@ -166,6 +167,8 @@ static UHCIAsync *uhci_async_alloc(UHCIState *s) > > return async; > > } > > > > +static void uhci_frame_timer(void *opaque); > > + > > static void uhci_async_free(UHCIState *s, UHCIAsync *async) > > { > > qemu_free(async); > > @@ -398,6 +401,8 @@ static int uhci_load(QEMUFile *f, void *opaque, int > > version_id) > > qemu_get_8s(f, &s->sof_timing); > > qemu_get_8s(f, &s->status2); > > qemu_get_timer(f, s->frame_timer); > > + s->expire_time = qemu_get_clock(vm_clock) + > > + (ticks_per_sec / FRAME_TIMER_FREQ); > > > > return 0; > > } > > @@ -441,8 +446,11 @@ static void uhci_ioport_writew(void *opaque, uint32_t > > addr, uint32_t val) > > switch(addr) { > > case 0x00: > > if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) { > > + int64_t t_now = qemu_get_clock(vm_clock); > > /* start frame processing */ > > - qemu_mod_timer(s->frame_timer, qemu_get_clock(vm_clock)); > > + s->expire_time = t_now + > > + (ticks_per_sec / FRAME_TIMER_FREQ); > > + qemu_mod_timer(s->frame_timer, t_now); > > s->status &= ~UHCI_STS_HCHALTED; > > } else if (!(val & UHCI_CMD_RS)) { > > s->status |= UHCI_STS_HCHALTED; > > @@ -528,6 +536,10 @@ static uint32_t uhci_ioport_readw(void *opaque, > > uint32_t addr) > > val = s->intr; > > break; > > case 0x06: > > + /* keep frame number in sync */ > > + if ((s->status & UHCI_STS_HCHALTED) == 0 && > > + s->expire_time <= qemu_get_clock(vm_clock)) > > + uhci_frame_timer(s); > > val = s->frnum; > > break; > > case 0x10 ... 0x1f: > > @@ -1020,7 +1032,6 @@ static void uhci_process_frame(UHCIState *s) > > static void uhci_frame_timer(void *opaque) > > { > > UHCIState *s = opaque; > > - int64_t expire_time; > > > > if (!(s->cmd & UHCI_CMD_RS)) { > > /* Full stop */ > > @@ -1051,9 +1062,9 @@ static void uhci_frame_timer(void *opaque) > > uhci_async_validate_end(s); > > > > /* prepare the timer for the next frame */ > > - expire_time = qemu_get_clock(vm_clock) + > > + s->expire_time = qemu_get_clock(vm_clock) + > > (ticks_per_sec / FRAME_TIMER_FREQ); > > - qemu_mod_timer(s->frame_timer, expire_time); > > + qemu_mod_timer(s->frame_timer, s->expire_time); > > } > > > > static void uhci_map(PCIDevice *pci_dev, int region_num, > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |