|
[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 |