Date: Mon, 23 Sep 2013 08:02:36 GMT From: syuu@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r257639 - in soc2013/syuu/bhyve_usb/usr.sbin/bhyve: . usb usb/gpl Message-ID: <201309230802.r8N82aq7029023@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: syuu Date: Mon Sep 23 08:02:36 2013 New Revision: 257639 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257639 Log: quick hack for enabling UHCI interrupt Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c ============================================================================== --- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c Mon Sep 23 07:53:58 2013 (r257638) +++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/ioapic.c Mon Sep 23 08:02:36 2013 (r257639) @@ -106,10 +106,14 @@ */ low = ioapic->redtbl[pin]; high = ioapic->redtbl[pin] >> 32; +#if 0 if ((low & IOART_INTMASK) == IOART_INTMCLR && (low & IOART_TRGRMOD) == IOART_TRGREDG && (low & IOART_DESTMOD) == IOART_DESTPHY && (low & IOART_DELMOD) == IOART_DELFIXED) { +#else + { +#endif vector = low & IOART_INTVEC; apicid = high >> APIC_ID_SHIFT; if (apicid != 0xff) { Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c ============================================================================== --- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c Mon Sep 23 07:53:58 2013 (r257638) +++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c Mon Sep 23 08:02:36 2013 (r257639) @@ -123,8 +123,8 @@ static int usb_device_init(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p klass=%p\n", -// __func__, __LINE__, dev, klass); + fprintf(usblog, "%s:%d dev=%p klass=%p\n", + __func__, __LINE__, dev, klass); if (klass->init) { return klass->init(dev); } @@ -134,8 +134,8 @@ USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p addr=%x klass=%p\n", -// __func__, __LINE__, dev, addr, klass); + fprintf(usblog, "%s:%d dev=%p addr=%x klass=%p\n", + __func__, __LINE__, dev, addr, klass); if (klass->find_device) { return klass->find_device(dev, addr); } @@ -145,8 +145,8 @@ static void usb_device_handle_destroy(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p klass=%p\n", -// __func__, __LINE__, dev, klass); + fprintf(usblog, "%s:%d dev=%p klass=%p\n", + __func__, __LINE__, dev, klass); if (klass->handle_destroy) { klass->handle_destroy(dev); } @@ -155,8 +155,8 @@ void usb_device_cancel_packet(USBDevice *dev, USBPacket *p) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n", -// __func__, __LINE__, dev, p, klass); + fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n", + __func__, __LINE__, dev, p, klass); if (klass->cancel_packet) { klass->cancel_packet(dev, p); } @@ -165,8 +165,8 @@ void usb_device_handle_attach(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p klass=%p\n", -// __func__, __LINE__, dev, klass); + fprintf(usblog, "%s:%d dev=%p klass=%p\n", + __func__, __LINE__, dev, klass); if (klass->handle_attach) { klass->handle_attach(dev); } @@ -175,8 +175,8 @@ void usb_device_handle_reset(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p klass=%p\n", -// __func__, __LINE__, dev, klass); + fprintf(usblog, "%s:%d dev=%p klass=%p\n", + __func__, __LINE__, dev, klass); if (klass->handle_reset) { klass->handle_reset(dev); } @@ -186,8 +186,8 @@ int value, int index, int length, uint8_t *data) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p p=%p request=%d value=%d index=%d length=%d data=%p klass=%p\n", -// __func__, __LINE__, dev, p, request, value, index, length, data, klass); + fprintf(usblog, "%s:%d dev=%p p=%p request=%d value=%d index=%d length=%d data=%p klass=%p klass->handle_control:%p\n", + __func__, __LINE__, dev, p, request, value, index, length, data, klass, klass->handle_control); if (klass->handle_control) { klass->handle_control(dev, p, request, value, index, length, data); } @@ -196,8 +196,8 @@ void usb_device_handle_data(USBDevice *dev, USBPacket *p) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n", -// __func__, __LINE__, dev, p, klass); + fprintf(usblog, "%s:%d dev=%p p=%p klass=%p\n", + __func__, __LINE__, dev, p, klass); if (klass->handle_data) { klass->handle_data(dev, p); } @@ -206,16 +206,16 @@ const char *usb_device_get_product_desc(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p klass=%p\n", -// __func__, __LINE__, dev, klass); + fprintf(usblog, "%s:%d dev=%p klass=%p\n", + __func__, __LINE__, dev, klass); return klass->product_desc; } const USBDesc *usb_device_get_usb_desc(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p klass=%p\n", -// __func__, __LINE__, dev, klass); + fprintf(usblog, "%s:%d dev=%p klass=%p\n", + __func__, __LINE__, dev, klass); if (dev->usb_desc) { return dev->usb_desc; } @@ -236,8 +236,8 @@ void usb_device_flush_ep_queue(USBDevice *dev, USBEndpoint *ep) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n", -// __func__, __LINE__, dev, ep, klass); + fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n", + __func__, __LINE__, dev, ep, klass); if (klass->flush_ep_queue) { klass->flush_ep_queue(dev, ep); } @@ -246,8 +246,8 @@ void usb_device_ep_stopped(USBDevice *dev, USBEndpoint *ep) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); -// fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n", -// __func__, __LINE__, dev, ep, klass); + fprintf(usblog, "%s:%d dev=%p ep=%p klass=%p\n", + __func__, __LINE__, dev, ep, klass); if (klass->ep_stopped) { klass->ep_stopped(dev, ep); } @@ -363,8 +363,8 @@ USBBus *bus; int i; -// fprintf(usblog, "%s:%d masterbus:%s ports:%p portcount:%d firstport:%d opaqueue:%p ops:%p speedmask:%x\n", -// __func__, __LINE__, masterbus, ports, portcount, firstport, opaque, ops, speedmask); + fprintf(usblog, "%s:%d masterbus:%s ports:%p portcount:%d firstport:%d opaqueue:%p ops:%p speedmask:%x\n", + __func__, __LINE__, masterbus, ports, portcount, firstport, opaque, ops, speedmask); QTAILQ_FOREACH(bus, &busses, next) { if (strcmp(bus->name, masterbus) == 0) { break; @@ -391,8 +391,8 @@ void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr) { -// fprintf(usblog, "%s:%d downstream:%p upstream:%p portnr:%d\n", -// __func__, __LINE__, downstream, upstream, portnr); + fprintf(usblog, "%s:%d downstream:%p upstream:%p portnr:%d\n", + __func__, __LINE__, downstream, upstream, portnr); if (upstream) { snprintf(downstream->path, sizeof(downstream->path), "%s.%d", upstream->path, portnr); Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c ============================================================================== --- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Mon Sep 23 07:53:58 2013 (r257638) +++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Mon Sep 23 08:02:36 2013 (r257639) @@ -299,7 +299,7 @@ static int64_t get_clock_ns(void) { struct timespec ts; - if (clock_gettime(CLOCK_REALTIME, &ts)) { + if (clock_gettime(CLOCK_MONOTONIC, &ts)) { perror("clock_gettime"); exit(1); } @@ -342,7 +342,8 @@ struct itimerspec its; // fprintf(usblog, "%s:%d timer:%p ns:%ld\n", __func__, __LINE__, timer, ns); - its.it_value = its.it_interval = ns_to_timerspec(ns); + memset(&its, 0, sizeof(its)); + its.it_value = ns_to_timerspec(ns); timer_settime(timer->timerid, 0, &its, 0); } @@ -374,8 +375,8 @@ queue = (UHCIQueue *)calloc(sizeof(*queue), 1); queue->uhci = s; queue->qh_addr = qh_addr; - fprintf(usblog, "%s:%d qh_addr:0x%x\n", - __func__, __LINE__, qh_addr); +// fprintf(usblog, "%s:%d qh_addr:0x%x\n", +// __func__, __LINE__, qh_addr); queue->token = uhci_queue_token(td); queue->ep = ep; QTAILQ_INIT(&queue->asyncs); @@ -543,6 +544,7 @@ (s->status & UHCI_STS_HSERR) || (s->status & UHCI_STS_HCPERR)) { level = 1; + fprintf(usblog, "%s:%d irq=1\n", __func__, __LINE__); } else { level = 0; } @@ -565,9 +567,9 @@ pci_set_cfgdata8(sc->sc_pi, 0x6b, 0x00); s->cmd = 0; s->status = 0; -// fprintf(usblog, "%s s->status = 0\n", __func__); s->status2 = 0; s->intr = 0; + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); s->fl_base_addr = 0; s->sof_timing = 64; s->firstport = 0; @@ -655,15 +657,12 @@ s->expire_time = get_clock_ns() + (get_ticks_per_sec() / FRAME_TIMER_FREQ); // fprintf(usblog, "%s s->expire_time:%ld\n", __func__, s->expire_time); -// mod_timer(s->frame_timer, s->expire_time); - mod_timer(s->frame_timer, get_ticks_per_sec() / FRAME_TIMER_FREQ); + mod_timer(s->frame_timer, (get_ticks_per_sec() / FRAME_TIMER_FREQ)); s->status &= ~UHCI_STS_HCHALTED; -// fprintf(usblog, "%s status &= ~UHCI_STS_HCHALTED\n", __func__); -// fprintf(usblog, "%s status = %x\n", __func__, s->status); + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); } else if (!(val & UHCI_CMD_RS)) { s->status |= UHCI_STS_HCHALTED; -// fprintf(usblog, "%s status |= UHCI_STS_HCHALTED\n", __func__); -// fprintf(usblog, "%s status = %x\n", __func__, s->status); + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); } if (val & UHCI_CMD_GRESET) { UHCIPort *port; @@ -688,17 +687,17 @@ case 0x02: // fprintf(usblog, "%s USBSTS val:%lx\n", __func__, val); s->status &= ~val; -// fprintf(usblog, "%s s->status &= ~%lx\n", __func__, val); -// fprintf(usblog, "%s s->status = %x\n", __func__, s->status); /* XXX: the chip spec is not coherent, so we add a hidden register to distinguish between IOC and SPD */ if (val & UHCI_STS_USBINT) s->status2 = 0; + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); uhci_update_irq(s); break; case 0x04: // fprintf(usblog, "%s USBINTR val:%lx\n", __func__, val); s->intr = val; + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); uhci_update_irq(s); break; case 0x06: @@ -820,8 +819,7 @@ if (s->cmd & UHCI_CMD_EGSM) { s->cmd |= UHCI_CMD_FGR; s->status |= UHCI_STS_RD; -// fprintf(usblog, "%s s->status |= UHCI_STS_RD\n", __func__); -// fprintf(usblog, "%s s->status = %x\n", __func__, s->status); + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); uhci_update_irq(s); } } @@ -905,13 +903,14 @@ static void uhci_read_td(UHCIState *s, UHCI_TD *td, uint32_t link) { -// fprintf(usblog, "%s:%d s=%p td=%p link=%x\n", -// __func__, __LINE__, s, td, link); + fprintf(usblog, "%s:%d s=%p td=%p link=%x\n", + __func__, __LINE__, s, td, link); pci_dma_read(STATE_TO_SC(s), link & ~0xf, td, sizeof(*td)); le32_to_cpus(&td->link); le32_to_cpus(&td->ctrl); le32_to_cpus(&td->token); le32_to_cpus(&td->buffer); + fprintf(usblog, "%s:%d td->link:%x td->ctrl:%x td->token:%x td->buffer:%x\n", __func__, __LINE__, td->link, td->ctrl, td->token, td->buffer); } static int uhci_handle_td_error(UHCIState *s, UHCI_TD *td, uint32_t td_addr, @@ -922,54 +921,48 @@ switch (status) { case USB_RET_NAK: -// fprintf(usblog, "%s:%d USB_RET_NAK\n", __func__, __LINE__); + fprintf(usblog, "%s:%d USB_RET_NAK\n", __func__, __LINE__); td->ctrl |= TD_CTRL_NAK; -// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__); return TD_RESULT_NEXT_QH; case USB_RET_STALL: -// fprintf(usblog, "%s:%d USB_RET_STALL\n", __func__, __LINE__); + fprintf(usblog, "%s:%d USB_RET_STALL\n", __func__, __LINE__); td->ctrl |= TD_CTRL_STALL; trace_usb_uhci_packet_complete_stall(queue_token, td_addr); -// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__); ret = TD_RESULT_NEXT_QH; break; case USB_RET_BABBLE: -// fprintf(usblog, "%s:%d USB_RET_BABBLE\n", __func__, __LINE__); + fprintf(usblog, "%s:%d USB_RET_BABBLE\n", __func__, __LINE__); td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL; /* frame interrupted */ trace_usb_uhci_packet_complete_babble(queue_token, td_addr); -// fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__); ret = TD_RESULT_STOP_FRAME; break; case USB_RET_IOERROR: case USB_RET_NODEV: default: -#if 0 if (status == USB_RET_IOERROR) fprintf(usblog, "%s:%d USB_RET_IOERROR\n", __func__, __LINE__); else if (status == USB_RET_NODEV) fprintf(usblog, "%s:%d USB_RET_NODEV\n", __func__, __LINE__); else fprintf(usblog, "%s:%d invalid\n", __func__, __LINE__); -#endif td->ctrl |= TD_CTRL_TIMEOUT; td->ctrl &= ~(3 << TD_CTRL_ERROR_SHIFT); trace_usb_uhci_packet_complete_error(queue_token, td_addr); -// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__); ret = TD_RESULT_NEXT_QH; break; } td->ctrl &= ~TD_CTRL_ACTIVE; s->status |= UHCI_STS_USBERR; -// fprintf(usblog, "%s s->status |= UHCI_STS_USBERR\n", __func__); -// fprintf(usblog, "%s s->status = %x\n", __func__, s->status); if (td->ctrl & TD_CTRL_IOC) { *int_mask |= 0x01; + fprintf(usblog, "%s:%d int_mask |= 1\n", __func__, __LINE__); } + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); uhci_update_irq(s); return ret; } @@ -997,17 +990,19 @@ here. The docs are somewhat unclear, but win2k relies on this behavior. */ td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK); - if (td->ctrl & TD_CTRL_IOC) + if (td->ctrl & TD_CTRL_IOC) { *int_mask |= 0x01; + fprintf(usblog, "%s:%d int_mask |= 1\n", __func__, __LINE__); + } if (pid == USB_TOKEN_IN) { pci_dma_write(STATE_TO_SC(s), td->buffer, async->buf, len); if ((td->ctrl & TD_CTRL_SPD) && len < max_len) { *int_mask |= 0x02; + fprintf(usblog, "%s:%d int_mask |= 2\n", __func__, __LINE__); /* short packet: do not update QH */ trace_usb_uhci_packet_complete_shortxfer(async->queue->token, async->td_addr); -// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__); return TD_RESULT_NEXT_QH; } } @@ -1015,7 +1010,6 @@ /* success */ trace_usb_uhci_packet_complete_success(async->queue->token, async->td_addr); -// fprintf(usblog, "%s:%d TD_RESULT_COMPLETE\n", __func__, __LINE__); return TD_RESULT_COMPLETE; } @@ -1029,7 +1023,7 @@ UHCIAsync *async = uhci_async_find_td(s, td_addr); if (async) { -// fprintf(usblog, "%s:%d async\n", __func__, __LINE__); + fprintf(usblog, "%s:%d async\n", __func__, __LINE__); if (uhci_queue_verify(async->queue, qh_addr, td, td_addr, queuing)) { assert(q == NULL || q == async->queue); q = async->queue; @@ -1040,7 +1034,7 @@ } if (q == NULL) { -// fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__); + fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__); q = uhci_queue_find(s, td); if (q && !uhci_queue_verify(q, qh_addr, td, td_addr, queuing)) { uhci_queue_free(q, "guest re-used qh"); @@ -1049,13 +1043,13 @@ } if (q) { -// fprintf(usblog, "%s:%d q\n", __func__, __LINE__); + fprintf(usblog, "%s:%d q\n", __func__, __LINE__); q->valid = QH_VALID; } /* Is active ? */ if (!(td->ctrl & TD_CTRL_ACTIVE)) { -// fprintf(usblog, "%s:%d !TD_CTRL_ACTIVE\n", __func__, __LINE__); + fprintf(usblog, "%s:%d !TD_CTRL_ACTIVE\n", __func__, __LINE__); if (async) { /* Guest marked a pending td non-active, cancel the queue */ uhci_queue_free(async->queue, "pending td non-active"); @@ -1066,25 +1060,24 @@ */ if (td->ctrl & TD_CTRL_IOC) { *int_mask |= 0x01; + fprintf(usblog, "%s:%d int_mask |= 1\n", __func__, __LINE__); } -// fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__); return TD_RESULT_NEXT_QH; } if (async) { -// fprintf(usblog, "%s:%d async\n", __func__, __LINE__); + fprintf(usblog, "%s:%d async\n", __func__, __LINE__); if (queuing) { -// fprintf(usblog, "%s:%d queueing\n", __func__, __LINE__); + fprintf(usblog, "%s:%d queueing\n", __func__, __LINE__); /* we are busy filling the queue, we are not prepared to consume completed packages then, just leave them in async state */ -// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__); return TD_RESULT_ASYNC_CONT; } if (!async->done) { UHCI_TD last_td; UHCIAsync *last = QTAILQ_LAST(&async->queue->asyncs, asyncs_head); -// fprintf(usblog, "%s:%d !async->done\n", __func__, __LINE__); + fprintf(usblog, "%s:%d !async->done\n", __func__, __LINE__); /* * While we are waiting for the current td to complete, the guest * may have added more tds to the queue. Note we re-read the td @@ -1093,7 +1086,6 @@ uhci_read_td(s, &last_td, last->td_addr); uhci_queue_fill(async->queue, &last_td); -// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__); return TD_RESULT_ASYNC_CONT; } uhci_async_unlink(async); @@ -1101,8 +1093,7 @@ } if (s->completions_only) { -// fprintf(usblog, "%s:%d completions_only\n", __func__, __LINE__); -// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__); + fprintf(usblog, "%s:%d completions_only\n", __func__, __LINE__); return TD_RESULT_ASYNC_CONT; } @@ -1110,10 +1101,10 @@ if (q == NULL) { USBDevice *dev = uhci_find_device(s, (td->token >> 8) & 0x7f); USBEndpoint *ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf); -// fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__); + fprintf(usblog, "%s:%d q == NULL\n", __func__, __LINE__); if (ep == NULL) { -// fprintf(usblog, "%s:%d eq == NULL\n", __func__, __LINE__); + fprintf(usblog, "%s:%d eq == NULL\n", __func__, __LINE__); return uhci_handle_td_error(s, td, td_addr, USB_RET_NODEV, int_mask); } @@ -1153,25 +1144,22 @@ /* invalid pid : frame interrupted */ uhci_async_free(async); s->status |= UHCI_STS_HCPERR; -// fprintf(usblog, "%s s->status |= UHCI_STS_USBERR\n", __func__); -// fprintf(usblog, "%s s->status = %x\n", __func__, s->status); + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); uhci_update_irq(s); -// fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__); return TD_RESULT_STOP_FRAME; } if (async->packet.status == USB_RET_ASYNC) { -// fprintf(usblog, "%s:%d USB_RET_ASYNC\n", __func__, __LINE__); + fprintf(usblog, "%s:%d USB_RET_ASYNC\n", __func__, __LINE__); uhci_async_link(async); if (!queuing) { uhci_queue_fill(q, td); } -// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__); return TD_RESULT_ASYNC_START; } done: -// fprintf(usblog, "%s:%d done\n", __func__, __LINE__); + fprintf(usblog, "%s:%d done\n", __func__, __LINE__); ret = uhci_complete_td(s, td, async, int_mask); uhci_async_free(async); return ret; @@ -1276,10 +1264,10 @@ frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2); -// fprintf(usblog, "%s:%d s:%p frame_addr:0x%x\n", __func__, __LINE__, s, frame_addr); + fprintf(usblog, "%s:%d s:%p frame_addr:0x%x\n", __func__, __LINE__, s, frame_addr); pci_dma_read(STATE_TO_SC(s), frame_addr, &link, 4); -// fprintf(usblog, "%s:%d link:%x\n", __func__, __LINE__, link); le32_to_cpus(&link); + fprintf(usblog, "%s:%d link:%x\n", __func__, __LINE__, link); int_mask = 0; curr_qh = 0; @@ -1287,7 +1275,7 @@ qhdb_reset(&qhdb); for (cnt = FRAME_MAX_LOOPS; is_valid(link) && cnt; cnt--) { -// fprintf(usblog, "%s:%d cnt:%d is_valid(link):%d is_qh(link):%d\n", __func__, __LINE__, cnt, is_valid(link), is_qh(link)); + fprintf(usblog, "%s:%d cnt:%d is_valid(link):%d is_qh(link):%d\n", __func__, __LINE__, cnt, is_valid(link), is_qh(link)); if (!s->completions_only && s->frame_bytes >= s->frame_bandwidth) { /* We've reached the usb 1.1 bandwidth, which is 1280 bytes/frame, stop processing */ @@ -1354,24 +1342,24 @@ switch (ret) { case TD_RESULT_STOP_FRAME: /* interrupted frame */ -// fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__); + fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__); goto out; case TD_RESULT_NEXT_QH: case TD_RESULT_ASYNC_CONT: -// fprintf(usblog, "%s:%d %s\n", __func__, __LINE__, ret == TD_RESULT_NEXT_QH ? "TD_RESULT_NEXT_QH" : "TD_RESULT_ASYNC_CONT"); + fprintf(usblog, "%s:%d %s\n", __func__, __LINE__, ret == TD_RESULT_NEXT_QH ? "TD_RESULT_NEXT_QH" : "TD_RESULT_ASYNC_CONT"); trace_usb_uhci_td_nextqh(curr_qh & ~0xf, link & ~0xf); link = curr_qh ? qh.link : td.link; continue; case TD_RESULT_ASYNC_START: -// fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__); + fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__); trace_usb_uhci_td_async(curr_qh & ~0xf, link & ~0xf); link = curr_qh ? qh.link : td.link; continue; case TD_RESULT_COMPLETE: -// fprintf(usblog, "%s:%d TD_RESULT_COMPLETE\n", __func__, __LINE__); + fprintf(usblog, "%s:%d TD_RESULT_COMPLETE\n", __func__, __LINE__); trace_usb_uhci_td_complete(curr_qh & ~0xf, link & ~0xf); link = td.link; td_count++; @@ -1402,6 +1390,7 @@ out: s->pending_int_mask |= int_mask; + fprintf(usblog, "%s:%d pending_int_mask(%x) |= %x\n", __func__, __LINE__, s->pending_int_mask, int_mask); } static void uhci_bh(void *opaque) @@ -1413,10 +1402,12 @@ static void uhci_frame_timer(void *opaque) { UHCIState *s = opaque; + struct pci_uhci_softc *sc = STATE_TO_SC(s); uint64_t t_now, t_last_run; int i, frames; const uint64_t frame_t = get_ticks_per_sec() / FRAME_TIMER_FREQ; + pthread_mutex_lock(&sc->sc_mtx); s->completions_only = false; // qemu_bh_cancel(s->bh); @@ -1427,8 +1418,8 @@ uhci_async_cancel_all(s); /* set hchalted bit in status - UHCI11D 2.1.2 */ s->status |= UHCI_STS_HCHALTED; -// fprintf(usblog, "%s s->status |= UHCI_STS_HCHALTED\n", __func__); -// fprintf(usblog, "%s s->status = %x\n", __func__, s->status); + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); + pthread_mutex_unlock(&sc->sc_mtx); return; } @@ -1438,20 +1429,17 @@ /* Process up to MAX_FRAMES_PER_TICK frames */ frames = (t_now - t_last_run) / frame_t; -// fprintf(usblog, "%s:%d frame_t:%ld s->expire_time:%ld t_last_run:%ld t_now:%ld frames:%d\n", __func__, __LINE__, frame_t, s->expire_time, t_last_run, t_now, frames); if (frames > s->maxframes) { int skipped = frames - s->maxframes; s->expire_time += skipped * frame_t; s->frnum = (s->frnum + skipped) & 0x7ff; frames -= skipped; -// fprintf(usblog, "%s frames > s->maxframes skipped:%d s->expire_time:%ld frames:%d\n", __func__, skipped, s->expire_time, frames); } if (frames > MAX_FRAMES_PER_TICK) { frames = MAX_FRAMES_PER_TICK; } for (i = 0; i < frames; i++) { -// fprintf(usblog, "%s:%d %d\n", __func__, __LINE__, i); s->frame_bytes = 0; trace_usb_uhci_frame_start(s->frnum); uhci_async_validate_begin(s); @@ -1461,20 +1449,20 @@ * the guest must look at frnum - 1 on interrupt, so inc frnum now */ s->frnum = (s->frnum + 1) & 0x7ff; s->expire_time += frame_t; -// fprintf(usblog, "%s s->expire_time:%ld\n", __func__, s->expire_time); } /* Complete the previous frame(s) */ if (s->pending_int_mask) { s->status2 |= s->pending_int_mask; s->status |= UHCI_STS_USBINT; -// fprintf(usblog, "%s s->status |= UHCI_STS_USBINT\n", __func__); -// fprintf(usblog, "%s s->status = %x\n", __func__, s->status); + fprintf(usblog, "%s:%d status:%x status2:%x intr:%x\n", __func__, __LINE__, s->status, s->status2, s->intr); uhci_update_irq(s); } s->pending_int_mask = 0; + fprintf(usblog, "%s:%d pending_int_mask = 0\n", __func__, __LINE__); -// mod_timer(s->frame_timer, t_now + frame_t); + mod_timer(s->frame_timer, frame_t); + pthread_mutex_unlock(&sc->sc_mtx); } /* @@ -1744,7 +1732,7 @@ pci_set_cfgdata8(pi, PCI_USBREV, PCI_USB_REV_1_0); if (!pci_is_legacy(pi)) { - fprintf(stderr, "hcd-uhci works only in legacy mode\n"); + fprintf(usblog, "hcd-uhci works only in legacy mode\n"); } else { pci_lintr_request(pi, 9); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309230802.r8N82aq7029023>