socsvn commit: r257234 - in soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb: . gpl include/hw

syuu at FreeBSD.org syuu at FreeBSD.org
Thu Sep 12 08:06:20 UTC 2013


Author: syuu
Date: Thu Sep 12 08:06:19 2013
New Revision: 257234
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257234

Log:
  USBBus handling fix, initializer for dev-hub

Modified:
  soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c
  soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c
  soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/desc.c
  soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c
  soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c
  soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h

Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c	Thu Sep 12 02:31:32 2013	(r257233)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c	Thu Sep 12 08:06:19 2013	(r257234)
@@ -605,3 +605,21 @@
 
 type_init(usb_hub_register_types)
 */
+
+USBDevice *usb_hub_init(USBBus *bus)
+{
+    USBDevice *dev;
+    char label[32];
+    static int index;
+
+    snprintf(label, sizeof(label), "usbhub%d", index++);
+
+    dev = usb_create(bus, "usb-hub", sizeof(USBHubState));
+    if (!dev) {
+        return NULL;
+    }
+
+    return dev;
+}
+
+

Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c	Thu Sep 12 02:31:32 2013	(r257233)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c	Thu Sep 12 08:06:19 2013	(r257234)
@@ -10,6 +10,8 @@
 
 #define trace_usb_port_claim(a, b)
 #define trace_usb_port_attach(a,b,c,d)
+#define trace_usb_port_detach(a,b)
+#define trace_usb_port_release(a,b)
 
 void pstrcpy(char *buf, int buf_size, const char *str)
 {
@@ -192,6 +194,7 @@
         klass->handle_data(dev, p);
     }
 }
+#endif
 
 const char *usb_device_get_product_desc(USBDevice *dev)
 {
@@ -208,6 +211,7 @@
     return klass->usb_desc;
 }
 
+#if 0
 void usb_device_set_interface(USBDevice *dev, int interface,
                               int alt_old, int alt_new)
 {
@@ -234,7 +238,7 @@
     }
 }
 
-static int usb_qdev_init(USBDevice *dev)
+int usb_qdev_init(USBDevice *dev)
 {
     int rc;
 
@@ -303,6 +307,7 @@
     USBDevice *dev;
 
     dev = (USBDevice *)calloc(1, len);
+    dev->bus = bus;
     strncpy(dev->name, name, sizeof(dev->name));
     return dev;
 }
@@ -430,7 +435,6 @@
     return 0;
 }
 
-#if 0
 void usb_release_port(USBDevice *dev)
 {
     USBBus *bus = usb_bus_from_device(dev);
@@ -448,7 +452,6 @@
     QTAILQ_INSERT_TAIL(&bus->free, port, next);
     bus->nfree++;
 }
-#endif
 
 static void usb_mask_to_str(char *dest, size_t size,
                             unsigned int speedmask)
@@ -500,10 +503,9 @@
     return 0;
 }
 
-#if 0
 int usb_device_detach(USBDevice *dev)
 {
-    USBBus *bus = usb_bus_from_device(dev);
+//    USBBus *bus = usb_bus_from_device(dev);
     USBPort *port = dev->port;
 
     assert(port != NULL);
@@ -515,6 +517,7 @@
     return 0;
 }
 
+#if 0
 int usb_device_delete_addr(int busnr, int addr)
 {
     USBBus *bus;

Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/desc.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/desc.c	Thu Sep 12 02:31:32 2013	(r257233)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/desc.c	Thu Sep 12 08:06:19 2013	(r257234)
@@ -18,11 +18,6 @@
 #define trace_usb_set_interface(a,b,c,d)
 #define trace_usb_desc_bos(a,b,c)
 
-const USBDesc *usb_device_get_usb_desc(USBDevice *dev)
-{
-	return NULL;
-}
-
 void usb_device_set_interface(USBDevice *dev, int interface,
                               int alt_old, int alt_new)
 {
@@ -587,9 +582,9 @@
 //    DeviceState *hcd = dev->qdev.parent_bus->parent;
     const USBDesc *desc = usb_device_get_usb_desc(dev);
     int index = desc->id.iSerialNumber;
-    char serial[64];
-    char *path = NULL;
-    int dst;
+//    char serial[64];
+//    char *path = NULL;
+//    int dst;
 
     if (dev->serial) {
         /* 'serial' usb bus property has priority if present */
@@ -598,6 +593,7 @@
     }
 
     assert(index != 0 && desc->str[index] != NULL);
+#if 0
     dst = snprintf(serial, sizeof(serial), "%s", desc->str[index]);
 //    path = qdev_get_dev_path(hcd);
     if (path) {
@@ -605,6 +601,7 @@
     }
     dst += snprintf(serial+dst, sizeof(serial)-dst, "-%s", dev->port->path);
     usb_desc_set_string(dev, index, serial);
+#endif
 }
 
 const char *usb_desc_get_string(USBDevice *dev, uint8_t index)

Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c	Thu Sep 12 02:31:32 2013	(r257233)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c	Thu Sep 12 08:06:19 2013	(r257234)
@@ -498,7 +498,7 @@
     }
 }
 
-int usb_serial_initfn(USBDevice *dev)
+static int usb_serial_initfn(USBDevice *dev)
 {
     USBSerialState *s = DO_UPCAST(USBSerialState, dev, dev);
 
@@ -611,7 +611,7 @@
 };
 #endif
 
-static void usb_serial_class_initfn(USBDeviceClass *uc, void *data)
+void usb_serial_class_initfn(USBDeviceClass *uc, void *data)
 {
     uc->init = usb_serial_initfn;
     uc->product_desc   = "QEMU USB Serial";

Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c	Thu Sep 12 02:31:32 2013	(r257233)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c	Thu Sep 12 08:06:19 2013	(r257234)
@@ -361,6 +361,8 @@
 	struct timespec ts;
 	ts.tv_sec = ns / SECINNS;
 	ts.tv_nsec = ns % SECINNS;
+	fprintf(usblog, "%s:%d tv_sec:%lu tv_nsec:%lu\n",
+		__func__, __LINE__, ts.tv_sec, ts.tv_nsec);
 	return ts;
 }
 
@@ -397,7 +399,8 @@
 	timer->se.sigev_notify_function = timer_handler;
 	timer->func = func;
 	timer->arg = arg;
-	if (timer_create(CLOCK_REALTIME, &timer->se, &timer->timerid)) {
+	fprintf(usblog, "%s:%d timer:%p\n", __func__, __LINE__, timer);
+	if (timer_create(CLOCK_MONOTONIC, &timer->se, &timer->timerid)) {
 		perror("timer_create");
 		exit(1);
 	}
@@ -408,6 +411,7 @@
 {
 	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);
 	timer_settime(timer->timerid, 0, &its, 0);
 }
@@ -418,6 +422,7 @@
 
 	memset(&its, 0, sizeof(its));
 	timer_settime(timer->timerid, 0, &its, 0);
+	fprintf(usblog, "%s:%d timer:%p\n", __func__, __LINE__, timer);
 }
 
 static inline int32_t uhci_queue_token(UHCI_TD *td)
@@ -667,6 +672,7 @@
     if (version_id < 2) {
         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);
     }
     return 0;
 }
@@ -713,7 +719,9 @@
             trace_usb_uhci_schedule_start();
             s->expire_time = get_clock_ns() +
                 (get_ticks_per_sec() / FRAME_TIMER_FREQ);
-            mod_timer(s->frame_timer, s->expire_time);
+            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);
             s->status &= ~UHCI_STS_HCHALTED;
             fprintf(usblog, "%s status &= ~UHCI_STS_HCHALTED\n", __func__);
             fprintf(usblog, "%s status = %x\n", __func__, s->status);
@@ -975,28 +983,41 @@
 
     switch (status) {
     case USB_RET_NAK:
+	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__);
         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__);
         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 (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__);
         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;
     }
@@ -1045,6 +1066,7 @@
             /* 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;
         }
     }
@@ -1052,6 +1074,7 @@
     /* 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;
 }
 
@@ -1099,6 +1122,7 @@
         if (td->ctrl & TD_CTRL_IOC) {
                 *int_mask |= 0x01;
         }
+	fprintf(usblog, "%s:%d TD_RESULT_NEXT_QH\n", __func__, __LINE__);
         return TD_RESULT_NEXT_QH;
     }
 
@@ -1107,6 +1131,7 @@
             /* 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) {
@@ -1120,6 +1145,7 @@
             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);
@@ -1127,6 +1153,7 @@
     }
 
     if (s->completions_only) {
+        fprintf(usblog, "%s:%d TD_RESULT_ASYNC_CONT\n", __func__, __LINE__);
         return TD_RESULT_ASYNC_CONT;
     }
 
@@ -1157,6 +1184,7 @@
     switch(pid) {
     case USB_TOKEN_OUT:
     case USB_TOKEN_SETUP:
+	fprintf(usblog, "%s:%d %s\n", __func__, __LINE__, pid == USB_TOKEN_OUT ? "USB_TOKEN_OUT" : "USB_TOKEN_SETUP");
         pci_dma_read(STATE_TO_SC(s), td->buffer, async->buf, max_len);
         usb_handle_packet(q->ep->dev, &async->packet);
         if (async->packet.status == USB_RET_SUCCESS) {
@@ -1165,16 +1193,19 @@
         break;
 
     case USB_TOKEN_IN:
+	fprintf(usblog, "%s:%d USB_TOKEN_IN\n", __func__, __LINE__);
         usb_handle_packet(q->ep->dev, &async->packet);
         break;
 
     default:
+	fprintf(usblog, "%s:%d invalid\n", __func__, __LINE__);
         /* 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);
         uhci_update_irq(s);
+        fprintf(usblog, "%s:%d TD_RESULT_STOP_FRAME\n", __func__, __LINE__);
         return TD_RESULT_STOP_FRAME;
     }
 
@@ -1183,6 +1214,7 @@
         if (!queuing) {
             uhci_queue_fill(q, td);
         }
+        fprintf(usblog, "%s:%d TD_RESULT_ASYNC_START\n", __func__, __LINE__);
         return TD_RESULT_ASYNC_START;
     }
 
@@ -1287,6 +1319,7 @@
     UHCI_QH qh;
     QhDb qhdb;
 
+    fprintf(usblog, "%s:%d s:%p\n", __func__, __LINE__, s);
     frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
 
     pci_dma_read(STATE_TO_SC(s), frame_addr, &link, 4);
@@ -1298,6 +1331,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));
         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 */
@@ -1357,20 +1391,24 @@
 
         switch (ret) {
         case TD_RESULT_STOP_FRAME: /* interrupted frame */
+	    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");
             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__);
             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__);
             trace_usb_uhci_td_complete(curr_qh & ~0xf, link & ~0xf);
             link = td.link;
             td_count++;
@@ -1435,9 +1473,11 @@
 
     /* 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;
+        fprintf(usblog, "%s s->expire_time:%ld\n", __func__, s->expire_time);
         s->frnum = (s->frnum + skipped) & 0x7ff;
         frames -= skipped;
     }
@@ -1446,6 +1486,7 @@
     }
 
     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);
@@ -1455,6 +1496,7 @@
          * 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) */
@@ -1467,7 +1509,7 @@
     }
     s->pending_int_mask = 0;
 
-    mod_timer(s->frame_timer, t_now + frame_t);
+//    mod_timer(s->frame_timer, t_now + frame_t);
 }
 
 /*
@@ -1702,8 +1744,11 @@
 	return (value);
 }
 
+extern int usb_qdev_init(USBDevice *dev);
 extern USBDevice *usb_serial_init(USBBus *bus /*, const char *filename */);
-extern int usb_serial_initfn(USBDevice *dev);
+extern void usb_serial_class_initfn(USBDeviceClass *uc, void *data);
+extern USBDevice *usb_hub_init(USBBus *bus);
+void usb_hub_class_initfn(USBDeviceClass *uc, void *data);
 static int
 pci_uhci_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
 {
@@ -1764,8 +1809,14 @@
 	
 	pci_emul_alloc_bar(pi, 4, PCIBAR_IO, 0x20);
 	{
+		USBDevice *dev = usb_hub_init(&sc->sc_st.bus);
+		usb_hub_class_initfn(&dev->klass, NULL);
+		usb_qdev_init(dev);
+	}
+	{
 		USBDevice *dev = usb_serial_init(&sc->sc_st.bus);
-		usb_serial_initfn(dev);
+		usb_serial_class_initfn(&dev->klass, NULL);
+		usb_qdev_init(dev);
 	}
 
 	return (0);

Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h	Thu Sep 12 02:31:32 2013	(r257233)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h	Thu Sep 12 08:06:19 2013	(r257234)
@@ -294,6 +294,7 @@
 
 /* definition of a USB device */
 struct USBDevice {
+    USBBus *bus;
 //    DeviceState qdev;
     USBDeviceClass klass;
     USBPort *port;
@@ -546,7 +547,7 @@
 static inline USBBus *usb_bus_from_device(USBDevice *d)
 {
 //    return DO_UPCAST(USBBus, qbus, d->qdev.parent_bus);
-    return NULL;
+	return d->bus;
 }
 
 //extern const VMStateDescription vmstate_usb_device;


More information about the svn-soc-all mailing list