Date: Wed, 31 Jul 2013 07:50:32 GMT From: bguan@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r255381 - soc2013/bguan/head/sys/dev/xen/usbfront Message-ID: <201307310750.r6V7oWlV017799@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307310750.r6V7oWlV017799>