socsvn commit: r255381 - soc2013/bguan/head/sys/dev/xen/usbfront

bguan at FreeBSD.org bguan at FreeBSD.org
Wed Jul 31 07:50:32 UTC 2013


Author: bguan
Date: Wed Jul 31 07:50:32 2013
New Revision: 255381
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255381

Log:
  debug xen usb root hub

Modified:
  soc2013/bguan/head/sys/dev/xen/usbfront/usbfront.c

Modified: soc2013/bguan/head/sys/dev/xen/usbfront/usbfront.c
==============================================================================
--- soc2013/bguan/head/sys/dev/xen/usbfront/usbfront.c	Wed Jul 31 06:23:10 2013	(r255380)
+++ soc2013/bguan/head/sys/dev/xen/usbfront/usbfront.c	Wed Jul 31 07:50:32 2013	(r255381)
@@ -82,7 +82,6 @@
 #include "xenbus_if.h"
 
 
-
 static int usbfront_probe(device_t dev);
 static int usbfront_attach(device_t dev);
 static int usbfront_detach(device_t dev);
@@ -107,7 +106,7 @@
 usbfront_probe(device_t dev)
 {
 
-	printf("[gbdebug-pvusb]probe:xenbus_get_type: %s\n", xenbus_get_type(dev));
+	printf("[gbdebug-pvusb]usbfront_probe:xenbus_get_type: %s\n", xenbus_get_type(dev));
 	if (!strcmp(xenbus_get_type(dev), "vusb")) {
 		device_set_desc(dev, "Virtual PV USB Device");
 		//device_quiet(dev);
@@ -128,7 +127,6 @@
 {
 	struct 			xenhci_softc *sc;
 	int 			err;
-	//int 			rid;
 
 	int 			i;
 	int 			num_ports;
@@ -152,7 +150,7 @@
 		xenbus_dev_fatal(dev, err, "reading usb-ver");
 		return (err);
 	}
-	printf("[gbdebug-pvusb]usbfront_attach:usb_version=%d\n", usb_version);
+	DPRINTK("xen usb_version=%d\n", usb_version);
 
 	switch (usb_version) {
 		case USB_VER_USB11:
@@ -184,7 +182,7 @@
 		xenbus_dev_fatal(dev, err, "reading num-ports");
 		goto error;
 	}
-	printf("[gbdebug-pvusb]create_hcdev_1:num_ports=%d\n", num_ports);
+	DPRINTK("xen num_ports=%d\n", num_ports);
 
 	if (num_ports < 1 || num_ports > USB_MAXCHILDREN) {
 		xenbus_dev_fatal(dev, err, "invalid num-ports");
@@ -193,6 +191,8 @@
 
 	sc->xb_dev = dev;
 	sc->rh_numports = num_ports;
+	sc->sc_noport = num_ports;
+	sprintf(sc->sc_vendor, "0x%04x", pci_get_vendor(dev));
 
 	for (i = 0; i < USB_URB_RING_SIZE; i++) {
 		sc->shadow[i].req.id = i + 1;
@@ -247,7 +247,7 @@
 	struct xenhci_softc *sc = device_get_softc(dev);
 
 	mtx_destroy(&sc->lock);
-	DPRINTK("usbfront_remove: %s removed\n", xenbus_get_node(dev));
+	DPRINTK("usbfront_detach: %s removed\n", xenbus_get_node(dev));
 
 	//TODO
 	//usbfront_free(sc);
@@ -261,7 +261,6 @@
 usbfront_connect(device_t dev)
 {
 	struct xenhci_softc *sc = device_get_softc(dev);
-	//struct usbfront_info *info = dev->dev.driver_data;
 
 	usbif_conn_request_t *req;
 	int i, idx, err;
@@ -272,6 +271,7 @@
 	//hcd = info_to_hcd(info);
 	//snprintf(name, TASK_COMM_LEN, "xenhcd.%d", sc->sc_bus.busnum);
 
+
 	err = talk_to_backend(dev, sc);
 	if (err)
 		return err;
@@ -302,10 +302,28 @@
 static void 
 usbfront_disconnect(device_t dev)
 {
+	//struct xenhci_softc *sc = device_get_softc(dev);
+
+	//struct usbfront_info *info = dev->dev.driver_data;
+	//struct usb_hcd *hcd = info_to_hcd(info);
+
+	//usb_remove_hcd(hcd);
+	//if (info->kthread) {
+	//	kthread_stop(info->kthread);
+	//	info->kthread = NULL;
+	//}
+	//xenbus_frontend_closed(dev);
+
         xenbus_set_state(dev, XenbusStateClosing);
 
         DPRINTK("xusb_closing: %s removed\n", xenbus_get_node(dev));
 	
+	//TODO!!
+        //if (sc->xbd_disk != NULL) {
+        //        disk_destroy(sc->xbd_disk);
+        //        sc->xbd_disk = NULL;
+        //}
+
         xenbus_set_state(dev, XenbusStateClosed);
 }
 
@@ -319,41 +337,39 @@
 
 	//struct xenhci_softc *sc = device_get_softc(dev);
 
-	//DPRINTK("backend_state=%d\n", backend_state);
+	DPRINTK("backend_state=%d\n", backend_state);
 
 	switch (backend_state) {
-		case XenbusStateInitialised:
-		case XenbusStateInitialising:
-		case XenbusStateConnected:
-		case XenbusStateReconfigured:
-		case XenbusStateReconfiguring:
-		case XenbusStateUnknown:
-		case XenbusStateClosed:
+		case XenbusStateInitialised://3
+		case XenbusStateInitialising://1
+		case XenbusStateConnected://4
+		case XenbusStateReconfigured://8
+		case XenbusStateReconfiguring://7
+		case XenbusStateUnknown://0
+		case XenbusStateClosed://6
 			break;
 
-		case XenbusStateInitWait:
-			printf("[gbdebug-pvusb]usbfront_backend_changed: XenbusStateInitWait\n");
+		case XenbusStateInitWait://2
 			if (xenbus_get_state(dev) != XenbusStateInitialising)
 				break;
-			//if (usbfront_connect(sc) != 0)
 			if (usbfront_connect(dev) != 0) {
-				printf("[gbdebug-pvusb]usbfront_connect(dev) error.\n");
+				printf("[gbdebug-pvusb]usbfront_connect() error.\n");
 				break;
 			}
-			xenbus_set_state(dev, XenbusStateConnected); //???
-			printf("[gbdebug-pvusb]xenbus_set_state finished!\n");
+			xenbus_set_state(dev, XenbusStateConnected);
+			printf("[gbdebug-pvusb]xenbus_set_state() exit!\n");
 			break;
 
-		case XenbusStateClosing:
+		case XenbusStateClosing://5
 			usbfront_disconnect(dev);
+			printf("[gbdebug-pvusb]usbfront_disconnect() exit!\n");
 			break;
 
 		default:
-                	xenbus_dev_fatal(dev, EINVAL, "get state %d at usb frontend",
+                	xenbus_dev_fatal(dev, EINVAL, "get backend state %d at usb frontend",
 					 backend_state);
 			break;
 	}
-	printf("[gbdebug-pvusb]usbfront_backend_changed finished!\n");
 }
 
 /* Common code used when first setting up, and when resuming. */
@@ -365,7 +381,7 @@
 	const char *node = xenbus_get_node(dev);
 	int err;
 
-	printf("[gbdebug-pvusb]takl_to_backend()\n");
+	printf("[gbdebug-pvusb]talk_to_backend()\n");
 	/* Create shared ring, alloc event channel. */
 	err = setup_rings(dev, sc);
 	if (err)
@@ -449,14 +465,11 @@
 {
 	usbif_urb_sring_t *urb_sring;
 	usbif_conn_sring_t *conn_sring;
-	int otherend_id = 0;
 	int err;
 
-	printf("[gbdebug-pvusb]setup_rings()\n");
 	sc->urb_ring_ref = GRANT_INVALID_REF;
 	sc->conn_ring_ref = GRANT_INVALID_REF;
 
-	//urb_sring = (usbif_urb_sring_t *)get_zeroed_page(GFP_NOIO|__GFP_HIGH);
 	urb_sring = (usbif_urb_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO);
 	if (!urb_sring) {
 		xenbus_dev_fatal(dev, ENOMEM, "allocating urb ring");
@@ -466,14 +479,13 @@
 	FRONT_RING_INIT(&sc->urb_ring, urb_sring, PAGE_SIZE);
 
 	err = xenbus_grant_ring(dev, virt_to_mfn(urb_sring), &sc->urb_ring_ref);
-	if (err < 0) {
+	if (err) {
 		//free_page((unsigned long)urb_sring);//TODO
 		//sc->urb_ring.sring = NULL;
 		goto fail;
 	}
 	sc->urb_ring_ref = err;
 
-	//conn_sring = (usbif_conn_sring_t *)get_zeroed_page(GFP_NOIO|__GFP_HIGH);
 	conn_sring = (usbif_conn_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO);
 	if (!conn_sring) {
 		xenbus_dev_fatal(dev, ENOMEM, "allocating conn ring");
@@ -483,17 +495,17 @@
 	FRONT_RING_INIT(&sc->conn_ring, conn_sring, PAGE_SIZE);
 
 	err = xenbus_grant_ring(dev, virt_to_mfn(conn_sring), &sc->conn_ring_ref);
-	if (err < 0) {
+	if (err) {
 		//free_page((unsigned long)conn_sring);//TODO
 		//sc->conn_ring.sring = NULL;
 		goto fail;
 	}
 	sc->conn_ring_ref = err;
 
-	otherend_id = xenbus_get_otherend_id(dev);
-	err = bind_listening_port_to_irqhandler(otherend_id, "xu", xu_intr, 
-					sc, INTR_TYPE_BIO | INTR_MPSAFE, &sc->irq);
-	if (err <= 0) {
+	err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev),
+	    	"xu", xu_intr, sc, INTR_TYPE_BIO | INTR_MPSAFE, &sc->irq);
+
+	if (err) {
 		xenbus_dev_fatal(dev, err,
 				 "bind_listening_port_to_irqhandler");
 		goto fail;
@@ -509,6 +521,7 @@
 static void 
 xenhci_notify_work(struct xenhci_softc *sc)
 {       
+	printf("[gbdebug-pvusb]xenhci_notify_work()\n");
         sc->waiting_resp = 1;
         wakeup(&sc->wait_taskqueue);
 }                          
@@ -516,6 +529,7 @@
 static void
 xu_intr(void *xsc)
 {
+	printf("[gbdebug-pvusb]xu_intr()\n");
 	struct xenhci_softc *sc = xsc;
         xenhci_notify_work(sc);
 }       


More information about the svn-soc-all mailing list