Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Jul 2013 17:24:37 GMT
From:      bguan@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r255271 - soc2013/bguan/head/sys/dev/xen/usbfront
Message-ID:  <201307281724.r6SHObYr093408@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bguan
Date: Sun Jul 28 17:24:37 2013
New Revision: 255271
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255271

Log:
  more initalization for usbfront driver

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

Modified: soc2013/bguan/head/sys/dev/xen/usbfront/xenhci.c
==============================================================================
--- soc2013/bguan/head/sys/dev/xen/usbfront/xenhci.c	Sun Jul 28 17:24:24 2013	(r255270)
+++ soc2013/bguan/head/sys/dev/xen/usbfront/xenhci.c	Sun Jul 28 17:24:37 2013	(r255271)
@@ -51,7 +51,7 @@
 #include <dev/usb/usb.h>
 #include <dev/usb/usbdi.h>
 
-//#define	USB_DEBUG_VAR xhcidebug
+#define	USB_DEBUG_VAR xenhcidebug
 
 #include <dev/usb/usb_core.h>
 #include <dev/usb/usb_debug.h>
@@ -68,8 +68,49 @@
 
 #include <dev/xen/usbfront/xenhci.h>
 
+#define	XENHCI_BUS2SC(bus) \
+   ((struct xenhci_softc *)(((uint8_t *)(bus)) - \
+    ((uint8_t *)&(((struct xenhci_softc *)0)->sc_bus))))
+
+#ifdef USB_DEBUG
+static int xenhcidebug;
+static int xenhciroute;
+static int xenhcipolling;
+
+static SYSCTL_NODE(_hw_usb, OID_AUTO, xenhci, CTLFLAG_RW, 0, "USB XENHCI");
+SYSCTL_INT(_hw_usb_xenhci, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
+    &xenhcidebug, 0, "Debug level");
+TUNABLE_INT("hw.usb.xenhci.debug", &xenhcidebug);
+SYSCTL_INT(_hw_usb_xenhci, OID_AUTO, xenhci_port_route, CTLFLAG_RW | CTLFLAG_TUN,
+    &xenhciroute, 0, "Routing bitmap for switching EHCI ports to XENHCI controller");
+TUNABLE_INT("hw.usb.xenhci.xenhci_port_route", &xenhciroute);
+SYSCTL_INT(_hw_usb_xenhci, OID_AUTO, use_polling, CTLFLAG_RW | CTLFLAG_TUN,
+    &xenhcipolling, 0, "Set to enable software interrupt polling for XENHCI controller");
+TUNABLE_INT("hw.usb.xenhci.use_polling", &xenhcipolling);
+#endif
+
 extern struct usb_bus_methods xenhci_bus_methods;
 
+
+/*
+static void
+xenhci_iterate_hw_softc(struct usb_bus *bus, usb_bus_mem_sub_cb_t *cb)
+{
+	struct xhci_softc *sc = XENHCI_BUS2SC(bus);
+	uint8_t i;
+
+	cb(bus, &sc->sc_hw.root_pc, &sc->sc_hw.root_pg,
+	   sizeof(struct xhci_hw_root), XENHCI_PAGE_SIZE);
+
+	cb(bus, &sc->sc_hw.ctx_pc, &sc->sc_hw.ctx_pg,
+	   sizeof(struct xhci_dev_ctx_addr), XENHCI_PAGE_SIZE);
+
+	for (i = 0; i != XHCI_MAX_SCRATCHPADS; i++) {
+		cb(bus, &sc->sc_hw.scratch_pc[i], &sc->sc_hw.scratch_pg[i],
+		    XENHCI_PAGE_SIZE, XENHCI_PAGE_SIZE);
+	}
+}*/
+
 usb_error_t
 xenhci_init(struct xenhci_softc *sc, device_t dev)
 {
@@ -83,6 +124,14 @@
 	sc->sc_bus.devices = sc->sc_devices;
 	sc->sc_bus.devices_max = XENHCI_MAX_DEVICES;
 
+	/* get all DMA memory */
+	//if (usb_bus_mem_alloc_all(&sc->sc_bus,
+	//    USB_GET_DMA_TAG(dev), &xenhci_iterate_hw_softc)) {
+        if (usb_bus_mem_alloc_all(&sc->sc_bus,
+	    USB_GET_DMA_TAG(dev), NULL)) {
+		return (ENOMEM);
+	}
+
 	return (0);
 }
 
@@ -105,9 +154,6 @@
 xenhci_set_address(struct usb_device *udev, struct mtx *mtx, uint16_t address)
 {
 	printf("[gbtest-pv]xenhci.c: xenhci_set_address()\n");
-	//usb_error_t err;
-
-	//return (err);
 	//TODO
 	return (0);
 }
@@ -132,42 +178,67 @@
 static void
 xenhci_xfer_setup(struct usb_setup_params *parm)
 {
-	printf("[gbtest-pv]xenhci.c: ()\n");
+	printf("[gbtest-pv]xenhci.c: xenhci_xfer_setup()\n");
 	//TODO
 }
 
 static void
 xenhci_xfer_unsetup(struct usb_xfer *xfer)
 {
-	printf("[gbtest-pv]xenhci.c: ()\n");
+	printf("[gbtest-pv]xenhci.c: xenhci_xfer_unsetup()\n");
 	return;
 }
 
 static void
 xenhci_start_dma_delay(struct usb_xfer *xfer)
 {
-	printf("[gbtest-pv]xenhci.c: ()\n");
+	printf("[gbtest-pv]xenhci.c: xenhci_start_dma_delay()\n");
 	//TODO
 }
 
+
+//TODO ???
 static void
 xenhci_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc,
     struct usb_endpoint *ep)
 {
-	printf("[gbtest-pv]xenhci.c: ()\n");
+	printf("[gbtest-pv]xenhci.c: xenhci_ep_init()\n");
+
+	//struct xhci_endpoint_ext *pepext;
+
+	DPRINTFN(2, "endpoint=%p, addr=%d, endpt=%d, mode=%d\n",
+	    ep, udev->address, edesc->bEndpointAddress, udev->flags.usb_mode);
+
+	printf("[gb-test]endpoint=%p, addr=%d, endpt=%d, mode=%d\n",
+	    ep, udev->address, edesc->bEndpointAddress, udev->flags.usb_mode);
+	if (udev->parent_hub == NULL) {
+		/* root HUB has special endpoint handling */
+		printf("[gb-test]xenhci.c: xenhci_ep_init():udev->parent_hub == NULL\n");
+		return;
+	}
+
+	//ep->methods = &xhci_device_generic_methods;
+
+	//pepext = xhci_get_endpoint_ext(udev, edesc);
+
+	//USB_BUS_LOCK(udev->bus);
+	//pepext->trb_halted = 1;
+	//pepext->trb_running = 0;
+	//USB_BUS_UNLOCK(udev->bus);
+
 	//TODO
 }
 
 static void
 xenhci_ep_uninit(struct usb_device *udev, struct usb_endpoint *ep)
 {
-	printf("[gbtest-pv]xenhci.c: ()\n");
+	printf("[gbtest-pv]xenhci.c: xenhci_ep_uninit()\n");
 }
 
 static void
 xenhci_ep_clear_stall(struct usb_device *udev, struct usb_endpoint *ep)
 {
-	printf("[gbtest-pv]xenhci.c: ()\n");
+	printf("[gbtest-pv]xenhci.c: xenhci_ep_clear_stal()\n");
 	//TODO
 }
 
@@ -179,7 +250,7 @@
 	//uint8_t temp;
 
 	//return (err);
-	//TODO
+	//TODO or not??
 	return (0);
 }
 
@@ -211,18 +282,59 @@
 	//TODO
 }
 
+//DONE!
 static void
 xenhci_set_hw_power(struct usb_bus *bus)
 {
 	printf("[gbtest-pv]xenhci.c: xenhci_set_hw_power()\n");
 	//DPRINTF("\n");
-	//TODO??
 }
 
+//TODO or not ??
 static void
 xenhci_device_state_change(struct usb_device *udev)
 {
+	//struct xhci_softc *sc = XHCI_BUS2SC(udev->bus);
+	//struct usb_page_search buf_inp;
+	//usb_error_t err;
+	//uint8_t index;
+
 	printf("[gbtest-pv]xenhci.c: xenhci_device_state_change()\n");
+
+	/* check for root HUB */
+	if (udev->parent_hub == NULL) {
+		printf("[gb-test]xenhci.c: xenhci_device_state_change(): udev->parent_hub == NULL\n");
+		return;
+	}
+
+	//index = udev->controller_slot_id;
+
+	//DPRINTF("\n");
+
+	if (usb_get_device_state(udev) == USB_STATE_CONFIGURED) {
+		printf("[gb-test]state(udev) == USB_STATE_CONFIGURED\n");
+	}
+
+	//XHCI_CMD_LOCK(sc);
+
+	switch (usb_get_device_state(udev)) {
+	case USB_STATE_POWERED:
+		printf("[gb-test]state(udev) == USB_STATE_POWERED\n");
+		break;
+
+	case USB_STATE_ADDRESSED:
+		printf("[gb-test]state(udev) == USB_STATE_ADDRESSED\n");
+		break;
+
+	case USB_STATE_CONFIGURED:
+		printf("[gb-test]state(udev) == USB_STATE_CONFIGURED\n");
+		break;
+
+	default:
+		printf("[gb-test]state(udev) == other!!\n");
+		break;
+	}
+	//XHCI_CMD_UNLOCK(sc);
 	//TODO
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307281724.r6SHObYr093408>