|
[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 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.
Is a similar fix needed for upstream qemu?
>
> 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 |