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