Loading hw/usb/hcd-xhci.c +29 −15 Original line number Diff line number Diff line Loading @@ -487,6 +487,8 @@ struct XHCIState { XHCIInterrupter intr[MAXINTRS]; XHCIRing cmd_ring; bool nec_quirks; }; #define TYPE_XHCI "base-xhci" Loading Loading @@ -2745,11 +2747,15 @@ static void xhci_process_commands(XHCIState *xhci) xhci_via_challenge(xhci, trb.parameter); break; case CR_VENDOR_NEC_FIRMWARE_REVISION: if (xhci->nec_quirks) { event.type = 48; /* NEC reply */ event.length = 0x3025; } else { event.ccode = CC_TRB_ERROR; } break; case CR_VENDOR_NEC_CHALLENGE_RESPONSE: { if (xhci->nec_quirks) { uint32_t chi = trb.parameter >> 32; uint32_t clo = trb.parameter; uint32_t val = xhci_nec_challenge(chi, clo); Loading @@ -2757,6 +2763,8 @@ static void xhci_process_commands(XHCIState *xhci) event.epid = val >> 16; slotid = val >> 24; event.type = 48; /* NEC reply */ } else { event.ccode = CC_TRB_ERROR; } break; default: Loading Loading @@ -3265,9 +3273,12 @@ static void xhci_runtime_write(void *ptr, hwaddr reg, intr->erstsz = val & 0xffff; break; case 0x10: /* ERSTBA low */ /* XXX NEC driver bug: it doesn't align this to 64 bytes intr->erstba_low = val & 0xffffffc0; */ if (xhci->nec_quirks) { /* NEC driver bug: it doesn't align this to 64 bytes */ intr->erstba_low = val & 0xfffffff0; } else { intr->erstba_low = val & 0xffffffc0; } break; case 0x14: /* ERSTBA high */ intr->erstba_high = val; Loading Loading @@ -3562,6 +3573,9 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp) dev->config[PCI_CACHE_LINE_SIZE] = 0x10; dev->config[0x60] = 0x30; /* release number */ if (strcmp(object_get_typename(OBJECT(dev)), TYPE_NEC_XHCI) == 0) { xhci->nec_quirks = true; } if (xhci->numintrs > MAXINTRS) { xhci->numintrs = MAXINTRS; } Loading Loading
hw/usb/hcd-xhci.c +29 −15 Original line number Diff line number Diff line Loading @@ -487,6 +487,8 @@ struct XHCIState { XHCIInterrupter intr[MAXINTRS]; XHCIRing cmd_ring; bool nec_quirks; }; #define TYPE_XHCI "base-xhci" Loading Loading @@ -2745,11 +2747,15 @@ static void xhci_process_commands(XHCIState *xhci) xhci_via_challenge(xhci, trb.parameter); break; case CR_VENDOR_NEC_FIRMWARE_REVISION: if (xhci->nec_quirks) { event.type = 48; /* NEC reply */ event.length = 0x3025; } else { event.ccode = CC_TRB_ERROR; } break; case CR_VENDOR_NEC_CHALLENGE_RESPONSE: { if (xhci->nec_quirks) { uint32_t chi = trb.parameter >> 32; uint32_t clo = trb.parameter; uint32_t val = xhci_nec_challenge(chi, clo); Loading @@ -2757,6 +2763,8 @@ static void xhci_process_commands(XHCIState *xhci) event.epid = val >> 16; slotid = val >> 24; event.type = 48; /* NEC reply */ } else { event.ccode = CC_TRB_ERROR; } break; default: Loading Loading @@ -3265,9 +3273,12 @@ static void xhci_runtime_write(void *ptr, hwaddr reg, intr->erstsz = val & 0xffff; break; case 0x10: /* ERSTBA low */ /* XXX NEC driver bug: it doesn't align this to 64 bytes intr->erstba_low = val & 0xffffffc0; */ if (xhci->nec_quirks) { /* NEC driver bug: it doesn't align this to 64 bytes */ intr->erstba_low = val & 0xfffffff0; } else { intr->erstba_low = val & 0xffffffc0; } break; case 0x14: /* ERSTBA high */ intr->erstba_high = val; Loading Loading @@ -3562,6 +3573,9 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp) dev->config[PCI_CACHE_LINE_SIZE] = 0x10; dev->config[0x60] = 0x30; /* release number */ if (strcmp(object_get_typename(OBJECT(dev)), TYPE_NEC_XHCI) == 0) { xhci->nec_quirks = true; } if (xhci->numintrs > MAXINTRS) { xhci->numintrs = MAXINTRS; } Loading