socsvn commit: r257639 - in soc2013/syuu/bhyve_usb/usr.sbin/bhyve: . usb usb/gpl

syuu at FreeBSD.org syuu at FreeBSD.org
Mon Sep 23 08:02:36 UTC 2013


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);
 	}


More information about the svn-soc-all mailing list