svn commit: r242775 - in stable/9/sys/dev/usb: . controller input serial storage wlan
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Nov 8 16:13:53 UTC 2012
Author: hselasky
Date: Thu Nov 8 16:13:51 2012
New Revision: 242775
URL: http://svnweb.freebsd.org/changeset/base/242775
Log:
MFC r240750, r241987 and r242126:
Add missing CTLFLAG_TUN flag to tunable sysctls in the USB stack.
Adjust timing parameters of FULL/LOW/HIGH speed USB enumeration
and make these timing parameters tunable. This patch will fix
enumeration with some USB devices.
Fix a typo.
Modified:
stable/9/sys/dev/usb/controller/ehci.c
stable/9/sys/dev/usb/controller/ohci.c
stable/9/sys/dev/usb/controller/uhci.c
stable/9/sys/dev/usb/controller/usb_controller.c
stable/9/sys/dev/usb/controller/xhci.c
stable/9/sys/dev/usb/input/ukbd.c
stable/9/sys/dev/usb/serial/usb_serial.c
stable/9/sys/dev/usb/storage/umass.c
stable/9/sys/dev/usb/usb.h
stable/9/sys/dev/usb/usb_debug.c
stable/9/sys/dev/usb/usb_debug.h
stable/9/sys/dev/usb/usb_dev.c
stable/9/sys/dev/usb/usb_device.c
stable/9/sys/dev/usb/usb_generic.c
stable/9/sys/dev/usb/usb_hub.c
stable/9/sys/dev/usb/usb_process.c
stable/9/sys/dev/usb/usb_request.c
stable/9/sys/dev/usb/wlan/if_uath.c
stable/9/sys/dev/usb/wlan/if_upgt.c
stable/9/sys/dev/usb/wlan/if_urtw.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/dev/ (props changed)
Modified: stable/9/sys/dev/usb/controller/ehci.c
==============================================================================
--- stable/9/sys/dev/usb/controller/ehci.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/controller/ehci.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -95,20 +95,20 @@ static int ehciiaadbug = 0;
static int ehcilostintrbug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, ehci, CTLFLAG_RW, 0, "USB ehci");
-SYSCTL_INT(_hw_usb_ehci, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_ehci, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&ehcidebug, 0, "Debug level");
-SYSCTL_INT(_hw_usb_ehci, OID_AUTO, no_hs, CTLFLAG_RW,
- &ehcinohighspeed, 0, "Disable High Speed USB");
-SYSCTL_INT(_hw_usb_ehci, OID_AUTO, iaadbug, CTLFLAG_RW,
- &ehciiaadbug, 0, "Enable doorbell bug workaround");
-SYSCTL_INT(_hw_usb_ehci, OID_AUTO, lostintrbug, CTLFLAG_RW,
- &ehcilostintrbug, 0, "Enable lost interrupt bug workaround");
-
TUNABLE_INT("hw.usb.ehci.debug", &ehcidebug);
+SYSCTL_INT(_hw_usb_ehci, OID_AUTO, no_hs, CTLFLAG_RW | CTLFLAG_TUN,
+ &ehcinohighspeed, 0, "Disable High Speed USB");
TUNABLE_INT("hw.usb.ehci.no_hs", &ehcinohighspeed);
+SYSCTL_INT(_hw_usb_ehci, OID_AUTO, iaadbug, CTLFLAG_RW | CTLFLAG_TUN,
+ &ehciiaadbug, 0, "Enable doorbell bug workaround");
TUNABLE_INT("hw.usb.ehci.iaadbug", &ehciiaadbug);
+SYSCTL_INT(_hw_usb_ehci, OID_AUTO, lostintrbug, CTLFLAG_RW | CTLFLAG_TUN,
+ &ehcilostintrbug, 0, "Enable lost interrupt bug workaround");
TUNABLE_INT("hw.usb.ehci.lostintrbug", &ehcilostintrbug);
+
static void ehci_dump_regs(ehci_softc_t *sc);
static void ehci_dump_sqh(ehci_softc_t *sc, ehci_qh_t *sqh);
@@ -3369,7 +3369,7 @@ ehci_roothub_exec(struct usb_device *ude
/* Wait for reset to complete. */
usb_pause_mtx(&sc->sc_bus.bus_mtx,
- USB_MS_TO_TICKS(USB_PORT_ROOT_RESET_DELAY));
+ USB_MS_TO_TICKS(usb_port_root_reset_delay));
/* Terminate reset sequence. */
if (!(sc->sc_flags & EHCI_SCFLG_NORESTERM))
Modified: stable/9/sys/dev/usb/controller/ohci.c
==============================================================================
--- stable/9/sys/dev/usb/controller/ohci.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/controller/ohci.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -81,9 +81,8 @@ __FBSDID("$FreeBSD$");
static int ohcidebug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, ohci, CTLFLAG_RW, 0, "USB ohci");
-SYSCTL_INT(_hw_usb_ohci, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_ohci, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&ohcidebug, 0, "ohci debug level");
-
TUNABLE_INT("hw.usb.ohci.debug", &ohcidebug);
static void ohci_dumpregs(ohci_softc_t *);
@@ -2344,7 +2343,7 @@ ohci_roothub_exec(struct usb_device *ude
for (v = 0;; v++) {
if (v < 12) {
usb_pause_mtx(&sc->sc_bus.bus_mtx,
- USB_MS_TO_TICKS(USB_PORT_ROOT_RESET_DELAY));
+ USB_MS_TO_TICKS(usb_port_root_reset_delay));
if ((OREAD4(sc, port) & UPS_RESET) == 0) {
break;
Modified: stable/9/sys/dev/usb/controller/uhci.c
==============================================================================
--- stable/9/sys/dev/usb/controller/uhci.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/controller/uhci.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -86,12 +86,11 @@ static int uhcidebug = 0;
static int uhcinoloop = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, uhci, CTLFLAG_RW, 0, "USB uhci");
-SYSCTL_INT(_hw_usb_uhci, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_uhci, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&uhcidebug, 0, "uhci debug level");
-SYSCTL_INT(_hw_usb_uhci, OID_AUTO, loop, CTLFLAG_RW,
- &uhcinoloop, 0, "uhci noloop");
-
TUNABLE_INT("hw.usb.uhci.debug", &uhcidebug);
+SYSCTL_INT(_hw_usb_uhci, OID_AUTO, loop, CTLFLAG_RW | CTLFLAG_TUN,
+ &uhcinoloop, 0, "uhci noloop");
TUNABLE_INT("hw.usb.uhci.loop", &uhcinoloop);
static void uhci_dumpregs(uhci_softc_t *sc);
@@ -2393,7 +2392,7 @@ uhci_portreset(uhci_softc_t *sc, uint16_
UWRITE2(sc, port, x | UHCI_PORTSC_PR);
usb_pause_mtx(&sc->sc_bus.bus_mtx,
- USB_MS_TO_TICKS(USB_PORT_ROOT_RESET_DELAY));
+ USB_MS_TO_TICKS(usb_port_root_reset_delay));
DPRINTFN(4, "uhci port %d reset, status0 = 0x%04x\n",
index, UREAD2(sc, port));
@@ -2421,7 +2420,7 @@ uhci_portreset(uhci_softc_t *sc, uint16_
for (lim = 0; lim < 12; lim++) {
usb_pause_mtx(&sc->sc_bus.bus_mtx,
- USB_MS_TO_TICKS(USB_PORT_RESET_DELAY));
+ USB_MS_TO_TICKS(usb_port_reset_delay));
x = UREAD2(sc, port);
Modified: stable/9/sys/dev/usb/controller/usb_controller.c
==============================================================================
--- stable/9/sys/dev/usb/controller/usb_controller.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/controller/usb_controller.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -86,7 +86,7 @@ SYSCTL_INT(_hw_usb_ctrl, OID_AUTO, debug
static int usb_no_boot_wait = 0;
TUNABLE_INT("hw.usb.no_boot_wait", &usb_no_boot_wait);
-SYSCTL_INT(_hw_usb, OID_AUTO, no_boot_wait, CTLFLAG_RDTUN, &usb_no_boot_wait, 0,
+SYSCTL_INT(_hw_usb, OID_AUTO, no_boot_wait, CTLFLAG_RD|CTLFLAG_TUN, &usb_no_boot_wait, 0,
"No USB device enumerate waiting at boot.");
static int usb_no_suspend_wait = 0;
Modified: stable/9/sys/dev/usb/controller/xhci.c
==============================================================================
--- stable/9/sys/dev/usb/controller/xhci.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/controller/xhci.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -88,12 +88,11 @@ static int xhcidebug;
static int xhciroute;
SYSCTL_NODE(_hw_usb, OID_AUTO, xhci, CTLFLAG_RW, 0, "USB XHCI");
-SYSCTL_INT(_hw_usb_xhci, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_xhci, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&xhcidebug, 0, "Debug level");
-SYSCTL_INT(_hw_usb_xhci, OID_AUTO, xhci_port_route, CTLFLAG_RW,
- &xhciroute, 0, "Routing bitmap for switching EHCI ports to XHCI controller");
-
TUNABLE_INT("hw.usb.xhci.debug", &xhcidebug);
+SYSCTL_INT(_hw_usb_xhci, OID_AUTO, xhci_port_route, CTLFLAG_RW | CTLFLAG_TUN,
+ &xhciroute, 0, "Routing bitmap for switching EHCI ports to XHCI controller");
TUNABLE_INT("hw.usb.xhci.xhci_port_route", &xhciroute);
#endif
Modified: stable/9/sys/dev/usb/input/ukbd.c
==============================================================================
--- stable/9/sys/dev/usb/input/ukbd.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/input/ukbd.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -94,12 +94,11 @@ static int ukbd_debug = 0;
static int ukbd_no_leds = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd");
-SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&ukbd_debug, 0, "Debug level");
-SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW,
- &ukbd_no_leds, 0, "Disables setting of keyboard leds");
-
TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
+SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
+ &ukbd_no_leds, 0, "Disables setting of keyboard leds");
TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
#endif
Modified: stable/9/sys/dev/usb/serial/usb_serial.c
==============================================================================
--- stable/9/sys/dev/usb/serial/usb_serial.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/serial/usb_serial.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -127,13 +127,13 @@ static int ucom_cons_baud = 9600;
static struct ucom_softc *ucom_cons_softc = NULL;
TUNABLE_INT("hw.usb.ucom.cons_unit", &ucom_cons_unit);
-SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_unit, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_unit, CTLFLAG_RW | CTLFLAG_TUN,
&ucom_cons_unit, 0, "console unit number");
TUNABLE_INT("hw.usb.ucom.cons_subunit", &ucom_cons_subunit);
-SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_subunit, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_subunit, CTLFLAG_RW | CTLFLAG_TUN,
&ucom_cons_subunit, 0, "console subunit number");
TUNABLE_INT("hw.usb.ucom.cons_baud", &ucom_cons_baud);
-SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_baud, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_baud, CTLFLAG_RW | CTLFLAG_TUN,
&ucom_cons_baud, 0, "console baud rate");
static usb_proc_callback_t ucom_cfg_start_transfers;
Modified: stable/9/sys/dev/usb/storage/umass.c
==============================================================================
--- stable/9/sys/dev/usb/storage/umass.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/storage/umass.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -166,9 +166,8 @@ __FBSDID("$FreeBSD$");
static int umass_debug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, umass, CTLFLAG_RW, 0, "USB umass");
-SYSCTL_INT(_hw_usb_umass, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_umass, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&umass_debug, 0, "umass debug level");
-
TUNABLE_INT("hw.usb.umass.debug", &umass_debug);
#else
#define DIF(...) do { } while (0)
Modified: stable/9/sys/dev/usb/usb.h
==============================================================================
--- stable/9/sys/dev/usb/usb.h Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb.h Thu Nov 8 16:13:51 2012 (r242775)
@@ -93,31 +93,29 @@ MALLOC_DECLARE(M_USBHC);
#define USB_POWER_MODE_SUSPEND 3 /* force suspend */
#define USB_POWER_MODE_RESUME 4 /* force resume */
-#if 0
/* These are the values from the USB specification. */
-#define USB_PORT_RESET_DELAY 10 /* ms */
-#define USB_PORT_ROOT_RESET_DELAY 50 /* ms */
-#define USB_PORT_RESET_RECOVERY 10 /* ms */
-#define USB_PORT_POWERUP_DELAY 100 /* ms */
-#define USB_PORT_RESUME_DELAY 20 /* ms */
-#define USB_SET_ADDRESS_SETTLE 2 /* ms */
-#define USB_RESUME_DELAY (20*5) /* ms */
-#define USB_RESUME_WAIT 10 /* ms */
-#define USB_RESUME_RECOVERY 10 /* ms */
-#define USB_EXTRA_POWER_UP_TIME 0 /* ms */
-#else
+#define USB_PORT_RESET_DELAY_SPEC 10 /* ms */
+#define USB_PORT_ROOT_RESET_DELAY_SPEC 50 /* ms */
+#define USB_PORT_RESET_RECOVERY_SPEC 10 /* ms */
+#define USB_PORT_POWERUP_DELAY_SPEC 100 /* ms */
+#define USB_PORT_RESUME_DELAY_SPEC 20 /* ms */
+#define USB_SET_ADDRESS_SETTLE_SPEC 2 /* ms */
+#define USB_RESUME_DELAY_SPEC (20*5) /* ms */
+#define USB_RESUME_WAIT_SPEC 10 /* ms */
+#define USB_RESUME_RECOVERY_SPEC 10 /* ms */
+#define USB_EXTRA_POWER_UP_TIME_SPEC 0 /* ms */
+
/* Allow for marginal and non-conforming devices. */
-#define USB_PORT_RESET_DELAY 50 /* ms */
-#define USB_PORT_ROOT_RESET_DELAY 250 /* ms */
-#define USB_PORT_RESET_RECOVERY 250 /* ms */
-#define USB_PORT_POWERUP_DELAY 300 /* ms */
-#define USB_PORT_RESUME_DELAY (20*2) /* ms */
-#define USB_SET_ADDRESS_SETTLE 10 /* ms */
-#define USB_RESUME_DELAY (50*5) /* ms */
-#define USB_RESUME_WAIT 50 /* ms */
-#define USB_RESUME_RECOVERY 50 /* ms */
-#define USB_EXTRA_POWER_UP_TIME 20 /* ms */
-#endif
+#define USB_PORT_RESET_DELAY 50 /* ms */
+#define USB_PORT_ROOT_RESET_DELAY 250 /* ms */
+#define USB_PORT_RESET_RECOVERY 250 /* ms */
+#define USB_PORT_POWERUP_DELAY 300 /* ms */
+#define USB_PORT_RESUME_DELAY (20*2) /* ms */
+#define USB_SET_ADDRESS_SETTLE 10 /* ms */
+#define USB_RESUME_DELAY (50*5) /* ms */
+#define USB_RESUME_WAIT 50 /* ms */
+#define USB_RESUME_RECOVERY 50 /* ms */
+#define USB_EXTRA_POWER_UP_TIME 20 /* ms */
#define USB_MIN_POWER 100 /* mA */
#define USB_MAX_POWER 500 /* mA */
Modified: stable/9/sys/dev/usb/usb_debug.c
==============================================================================
--- stable/9/sys/dev/usb/usb_debug.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_debug.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -63,11 +63,59 @@
int usb_debug = 0;
SYSCTL_NODE(_hw, OID_AUTO, usb, CTLFLAG_RW, 0, "USB debugging");
-SYSCTL_INT(_hw_usb, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&usb_debug, 0, "Debug level");
-
TUNABLE_INT("hw.usb.debug", &usb_debug);
+#ifdef USB_DEBUG
+/*
+ * Sysctls to modify timings/delays
+ */
+static SYSCTL_NODE(_hw_usb, OID_AUTO, timings, CTLFLAG_RW, 0, "Timings");
+static int usb_timings_sysctl_handler(SYSCTL_HANDLER_ARGS);
+
+TUNABLE_INT("hw.usb.timings.port_reset_delay", (int *)&usb_port_reset_delay);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, port_reset_delay, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_port_reset_delay, sizeof(usb_port_reset_delay),
+ usb_timings_sysctl_handler, "IU", "Port Reset Delay");
+TUNABLE_INT("hw.usb.timings.port_root_reset_delay", (int *)&usb_port_root_reset_delay);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, port_root_reset_delay, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_port_root_reset_delay, sizeof(usb_port_root_reset_delay),
+ usb_timings_sysctl_handler, "IU", "Root Port Reset Delay");
+TUNABLE_INT("hw.usb.timings.port_reset_recovery", (int *)&usb_port_reset_recovery);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, port_reset_recovery, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_port_reset_recovery, sizeof(usb_port_reset_recovery),
+ usb_timings_sysctl_handler, "IU", "Port Reset Recovery");
+TUNABLE_INT("hw.usb.timings.port_powerup_delay", (int *)&usb_port_powerup_delay);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, port_powerup_delay, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_port_powerup_delay, sizeof(usb_port_powerup_delay),
+ usb_timings_sysctl_handler, "IU", "Port PowerUp Delay");
+TUNABLE_INT("hw.usb.timings.port_resume_delay", (int *)&usb_port_resume_delay);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, port_resume_delay, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_port_resume_delay, sizeof(usb_port_resume_delay),
+ usb_timings_sysctl_handler, "IU", "Port Resume Delay");
+TUNABLE_INT("hw.usb.timings.set_address_settle", (int *)&usb_set_address_settle);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, set_address_settle, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_set_address_settle, sizeof(usb_set_address_settle),
+ usb_timings_sysctl_handler, "IU", "Set Address Settle");
+TUNABLE_INT("hw.usb.timings.resume_delay", (int *)&usb_resume_delay);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, resume_delay, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_resume_delay, sizeof(usb_resume_delay),
+ usb_timings_sysctl_handler, "IU", "Resume Delay");
+TUNABLE_INT("hw.usb.timings.resume_wait", (int *)&usb_resume_wait);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, resume_wait, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_resume_wait, sizeof(usb_resume_wait),
+ usb_timings_sysctl_handler, "IU", "Resume Wait");
+TUNABLE_INT("hw.usb.timings.resume_recovery", (int *)&usb_resume_recovery);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, resume_recovery, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_resume_recovery, sizeof(usb_resume_recovery),
+ usb_timings_sysctl_handler, "IU", "Resume Recovery");
+TUNABLE_INT("hw.usb.timings.extra_power_up_time", (int *)&usb_extra_power_up_time);
+SYSCTL_PROC(_hw_usb_timings, OID_AUTO, extra_power_up_time, CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_TUN,
+ &usb_extra_power_up_time, sizeof(usb_extra_power_up_time),
+ usb_timings_sysctl_handler, "IU", "Extra PowerUp Time");
+#endif
+
/*------------------------------------------------------------------------*
* usb_dump_iface
*
@@ -174,3 +222,87 @@ usb_dump_xfer(struct usb_xfer *xfer)
xfer->endpoint->edesc->bEndpointAddress,
xfer->endpoint->edesc->bmAttributes);
}
+
+#ifdef USB_DEBUG
+unsigned int usb_port_reset_delay = USB_PORT_RESET_DELAY;
+unsigned int usb_port_root_reset_delay = USB_PORT_ROOT_RESET_DELAY;
+unsigned int usb_port_reset_recovery = USB_PORT_RESET_RECOVERY;
+unsigned int usb_port_powerup_delay = USB_PORT_POWERUP_DELAY;
+unsigned int usb_port_resume_delay = USB_PORT_RESUME_DELAY;
+unsigned int usb_set_address_settle = USB_SET_ADDRESS_SETTLE;
+unsigned int usb_resume_delay = USB_RESUME_DELAY;
+unsigned int usb_resume_wait = USB_RESUME_WAIT;
+unsigned int usb_resume_recovery = USB_RESUME_RECOVERY;
+unsigned int usb_extra_power_up_time = USB_EXTRA_POWER_UP_TIME;
+
+/*------------------------------------------------------------------------*
+ * usb_timings_sysctl_handler
+ *
+ * This function updates timings variables, adjusting them where necessary.
+ *------------------------------------------------------------------------*/
+static int usb_timings_sysctl_handler(SYSCTL_HANDLER_ARGS)
+{
+ int error = 0;
+ unsigned int val;
+
+ /*
+ * Attempt to get a coherent snapshot by making a copy of the data.
+ */
+ if (arg1)
+ val = *(unsigned int *)arg1;
+ else
+ val = arg2;
+ error = SYSCTL_OUT(req, &val, sizeof(int));
+ if (error || !req->newptr)
+ return (error);
+
+ if (!arg1)
+ return EPERM;
+
+ error = SYSCTL_IN(req, &val, sizeof(unsigned int));
+ if (error)
+ return (error);
+
+ /*
+ * Now make sure the values are decent, and certainly no lower than
+ * what the USB spec prescribes.
+ */
+ unsigned int *p = (unsigned int *)arg1;
+ if (p == &usb_port_reset_delay) {
+ if (val < USB_PORT_RESET_DELAY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_port_root_reset_delay) {
+ if (val < USB_PORT_ROOT_RESET_DELAY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_port_reset_recovery) {
+ if (val < USB_PORT_RESET_RECOVERY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_port_powerup_delay) {
+ if (val < USB_PORT_POWERUP_DELAY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_port_resume_delay) {
+ if (val < USB_PORT_RESUME_DELAY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_set_address_settle) {
+ if (val < USB_SET_ADDRESS_SETTLE_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_resume_delay) {
+ if (val < USB_RESUME_DELAY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_resume_wait) {
+ if (val < USB_RESUME_WAIT_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_resume_recovery) {
+ if (val < USB_RESUME_RECOVERY_SPEC)
+ return (EINVAL);
+ } else if (p == &usb_extra_power_up_time) {
+ if (val < USB_EXTRA_POWER_UP_TIME_SPEC)
+ return (EINVAL);
+ } else {
+ /* noop */
+ }
+
+ *p = val;
+ return 0;
+}
+#endif
Modified: stable/9/sys/dev/usb/usb_debug.h
==============================================================================
--- stable/9/sys/dev/usb/usb_debug.h Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_debug.h Thu Nov 8 16:13:51 2012 (r242775)
@@ -59,4 +59,28 @@ void usb_dump_queue(struct usb_endpoint
void usb_dump_endpoint(struct usb_endpoint *ep);
void usb_dump_xfer(struct usb_xfer *xfer);
+#ifdef USB_DEBUG
+extern unsigned int usb_port_reset_delay;
+extern unsigned int usb_port_root_reset_delay;
+extern unsigned int usb_port_reset_recovery;
+extern unsigned int usb_port_powerup_delay;
+extern unsigned int usb_port_resume_delay;
+extern unsigned int usb_set_address_settle;
+extern unsigned int usb_resume_delay;
+extern unsigned int usb_resume_wait;
+extern unsigned int usb_resume_recovery;
+extern unsigned int usb_extra_power_up_time;
+#else
+#define usb_port_reset_delay USB_PORT_RESET_DELAY
+#define usb_port_root_reset_delay USB_PORT_ROOT_RESET_DELAY
+#define usb_port_reset_recovery USB_PORT_RESET_RECOVERY
+#define usb_port_powerup_delay USB_PORT_POWERUP_DELAY
+#define usb_port_resume_delay USB_PORT_RESUME_DELAY
+#define usb_set_address_settle USB_SET_ADDRESS_SETTLE
+#define usb_resume_delay USB_RESUME_DELAY
+#define usb_resume_wait USB_RESUME_WAIT
+#define usb_resume_recovery USB_RESUME_RECOVERY
+#define usb_extra_power_up_time USB_EXTRA_POWER_UP_TIME
+#endif
+
#endif /* _USB_DEBUG_H_ */
Modified: stable/9/sys/dev/usb/usb_dev.c
==============================================================================
--- stable/9/sys/dev/usb/usb_dev.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_dev.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -82,9 +82,8 @@
static int usb_fifo_debug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, dev, CTLFLAG_RW, 0, "USB device");
-SYSCTL_INT(_hw_usb_dev, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_dev, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&usb_fifo_debug, 0, "Debug Level");
-
TUNABLE_INT("hw.usb.dev.debug", &usb_fifo_debug);
#endif
Modified: stable/9/sys/dev/usb/usb_device.c
==============================================================================
--- stable/9/sys/dev/usb/usb_device.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_device.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -111,7 +111,7 @@ static void usb_cdev_free(struct usb_dev
int usb_template = 0;
TUNABLE_INT("hw.usb.usb_template", &usb_template);
-SYSCTL_INT(_hw_usb, OID_AUTO, template, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb, OID_AUTO, template, CTLFLAG_RW | CTLFLAG_TUN,
&usb_template, 0, "Selected USB device side template");
/* English is default language */
@@ -120,11 +120,11 @@ static int usb_lang_id = 0x0009;
static int usb_lang_mask = 0x00FF;
TUNABLE_INT("hw.usb.usb_lang_id", &usb_lang_id);
-SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_id, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_id, CTLFLAG_RW | CTLFLAG_TUN,
&usb_lang_id, 0, "Preferred USB language ID");
TUNABLE_INT("hw.usb.usb_lang_mask", &usb_lang_mask);
-SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_mask, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_mask, CTLFLAG_RW | CTLFLAG_TUN,
&usb_lang_mask, 0, "Preferred USB language mask");
static const char* statestr[USB_STATE_MAX] = {
Modified: stable/9/sys/dev/usb/usb_generic.c
==============================================================================
--- stable/9/sys/dev/usb/usb_generic.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_generic.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -127,9 +127,8 @@ struct usb_fifo_methods usb_ugen_methods
static int ugen_debug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, ugen, CTLFLAG_RW, 0, "USB generic");
-SYSCTL_INT(_hw_usb_ugen, OID_AUTO, debug, CTLFLAG_RW, &ugen_debug,
+SYSCTL_INT(_hw_usb_ugen, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &ugen_debug,
0, "Debug level");
-
TUNABLE_INT("hw.usb.ugen.debug", &ugen_debug);
#endif
Modified: stable/9/sys/dev/usb/usb_hub.c
==============================================================================
--- stable/9/sys/dev/usb/usb_hub.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_hub.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -77,9 +77,8 @@
static int uhub_debug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, uhub, CTLFLAG_RW, 0, "USB HUB");
-SYSCTL_INT(_hw_usb_uhub, OID_AUTO, debug, CTLFLAG_RW, &uhub_debug, 0,
+SYSCTL_INT(_hw_usb_uhub, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &uhub_debug, 0,
"Debug level");
-
TUNABLE_INT("hw.usb.uhub.debug", &uhub_debug);
#endif
@@ -415,7 +414,7 @@ repeat:
/* wait for maximum device power up time */
usb_pause_mtx(NULL,
- USB_MS_TO_TICKS(USB_PORT_POWERUP_DELAY));
+ USB_MS_TO_TICKS(usb_port_powerup_delay));
/* reset port, which implies enabling it */
@@ -979,7 +978,7 @@ uhub_attach(device_t dev)
/* get power delay */
pwrdly = ((hubdesc20.bPwrOn2PwrGood * UHD_PWRON_FACTOR) +
- USB_EXTRA_POWER_UP_TIME);
+ usb_extra_power_up_time);
/* get complete HUB descriptor */
if (nports >= 8) {
@@ -1024,7 +1023,7 @@ uhub_attach(device_t dev)
/* get power delay */
pwrdly = ((hubdesc30.bPwrOn2PwrGood * UHD_PWRON_FACTOR) +
- USB_EXTRA_POWER_UP_TIME);
+ usb_extra_power_up_time);
/* get complete HUB descriptor */
if (nports >= 8) {
@@ -1053,7 +1052,7 @@ uhub_attach(device_t dev)
/* default number of ports */
nports = 1;
/* default power delay */
- pwrdly = ((10 * UHD_PWRON_FACTOR) + USB_EXTRA_POWER_UP_TIME);
+ pwrdly = ((10 * UHD_PWRON_FACTOR) + usb_extra_power_up_time);
break;
}
if (nports == 0) {
@@ -2261,7 +2260,7 @@ usb_dev_resume_peer(struct usb_device *u
}
/* resume settle time */
- usb_pause_mtx(NULL, USB_MS_TO_TICKS(USB_PORT_RESUME_DELAY));
+ usb_pause_mtx(NULL, USB_MS_TO_TICKS(usb_port_resume_delay));
if (bus->methods->device_resume != NULL) {
/* resume USB device on the USB controller */
@@ -2414,7 +2413,7 @@ repeat:
NULL, udev->port_no, UHF_PORT_SUSPEND);
/* resume settle time */
- usb_pause_mtx(NULL, USB_MS_TO_TICKS(USB_PORT_RESUME_DELAY));
+ usb_pause_mtx(NULL, USB_MS_TO_TICKS(usb_port_resume_delay));
}
DPRINTF("Suspend was cancelled!\n");
return;
Modified: stable/9/sys/dev/usb/usb_process.c
==============================================================================
--- stable/9/sys/dev/usb/usb_process.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_process.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -82,9 +82,8 @@ static int usb_pcount;
static int usb_proc_debug;
SYSCTL_NODE(_hw_usb, OID_AUTO, proc, CTLFLAG_RW, 0, "USB process");
-SYSCTL_INT(_hw_usb_proc, OID_AUTO, debug, CTLFLAG_RW, &usb_proc_debug, 0,
+SYSCTL_INT(_hw_usb_proc, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &usb_proc_debug, 0,
"Debug level");
-
TUNABLE_INT("hw.usb.proc.debug", &usb_proc_debug);
#endif
Modified: stable/9/sys/dev/usb/usb_request.c
==============================================================================
--- stable/9/sys/dev/usb/usb_request.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/usb_request.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -73,21 +73,13 @@ SYSCTL_INT(_hw_usb, OID_AUTO, no_cs_fail
&usb_no_cs_fail, 0, "USB clear stall failures are ignored, if set");
#ifdef USB_DEBUG
-static int usb_pr_poll_delay = USB_PORT_RESET_DELAY;
-static int usb_pr_recovery_delay = USB_PORT_RESET_RECOVERY;
-
-SYSCTL_INT(_hw_usb, OID_AUTO, pr_poll_delay, CTLFLAG_RW,
- &usb_pr_poll_delay, 0, "USB port reset poll delay in ms");
-SYSCTL_INT(_hw_usb, OID_AUTO, pr_recovery_delay, CTLFLAG_RW,
- &usb_pr_recovery_delay, 0, "USB port reset recovery delay in ms");
-
#ifdef USB_REQ_DEBUG
/* The following structures are used in connection to fault injection. */
struct usb_ctrl_debug {
int bus_index; /* target bus */
int dev_index; /* target address */
int ds_fail; /* fail data stage */
- int ss_fail; /* fail data stage */
+ int ss_fail; /* fail status stage */
int ds_delay; /* data stage delay in ms */
int ss_delay; /* status stage delay in ms */
int bmRequestType_value;
@@ -788,12 +780,6 @@ usbd_req_reset_port(struct usb_device *u
uint16_t status;
uint16_t change;
-#ifdef USB_DEBUG
- uint16_t pr_poll_delay;
- uint16_t pr_recovery_delay;
-
-#endif
-
DPRINTF("\n");
/* clear any leftover port reset changes first */
@@ -808,29 +794,12 @@ usbd_req_reset_port(struct usb_device *u
if (err)
goto done;
#ifdef USB_DEBUG
- /* range check input parameters */
- pr_poll_delay = usb_pr_poll_delay;
- if (pr_poll_delay < 1) {
- pr_poll_delay = 1;
- } else if (pr_poll_delay > 1000) {
- pr_poll_delay = 1000;
- }
- pr_recovery_delay = usb_pr_recovery_delay;
- if (pr_recovery_delay > 1000) {
- pr_recovery_delay = 1000;
- }
#endif
n = 0;
while (1) {
-#ifdef USB_DEBUG
- /* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(pr_poll_delay));
- n += pr_poll_delay;
-#else
/* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(USB_PORT_RESET_DELAY));
- n += USB_PORT_RESET_DELAY;
-#endif
+ usb_pause_mtx(mtx, USB_MS_TO_TICKS(usb_port_reset_delay));
+ n += usb_port_reset_delay;
err = usbd_req_get_port_status(udev, mtx, &ps, port);
if (err)
goto done;
@@ -872,13 +841,8 @@ usbd_req_reset_port(struct usb_device *u
err = USB_ERR_TIMEOUT;
goto done;
}
-#ifdef USB_DEBUG
- /* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(pr_recovery_delay));
-#else
/* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(USB_PORT_RESET_RECOVERY));
-#endif
+ usb_pause_mtx(mtx, USB_MS_TO_TICKS(usb_port_reset_recovery));
done:
DPRINTFN(2, "port %d reset returning error=%s\n",
@@ -909,12 +873,6 @@ usbd_req_warm_reset_port(struct usb_devi
uint16_t status;
uint16_t change;
-#ifdef USB_DEBUG
- uint16_t pr_poll_delay;
- uint16_t pr_recovery_delay;
-
-#endif
-
DPRINTF("\n");
err = usbd_req_get_port_status(udev, mtx, &ps, port);
@@ -944,30 +902,11 @@ usbd_req_warm_reset_port(struct usb_devi
if (err)
goto done;
-#ifdef USB_DEBUG
- /* range check input parameters */
- pr_poll_delay = usb_pr_poll_delay;
- if (pr_poll_delay < 1) {
- pr_poll_delay = 1;
- } else if (pr_poll_delay > 1000) {
- pr_poll_delay = 1000;
- }
- pr_recovery_delay = usb_pr_recovery_delay;
- if (pr_recovery_delay > 1000) {
- pr_recovery_delay = 1000;
- }
-#endif
n = 0;
while (1) {
-#ifdef USB_DEBUG
- /* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(pr_poll_delay));
- n += pr_poll_delay;
-#else
/* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(USB_PORT_RESET_DELAY));
- n += USB_PORT_RESET_DELAY;
-#endif
+ usb_pause_mtx(mtx, USB_MS_TO_TICKS(usb_port_reset_delay));
+ n += usb_port_reset_delay;
err = usbd_req_get_port_status(udev, mtx, &ps, port);
if (err)
goto done;
@@ -1001,13 +940,8 @@ usbd_req_warm_reset_port(struct usb_devi
err = USB_ERR_TIMEOUT;
goto done;
}
-#ifdef USB_DEBUG
- /* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(pr_recovery_delay));
-#else
/* wait for the device to recover from reset */
- usb_pause_mtx(mtx, USB_MS_TO_TICKS(USB_PORT_RESET_RECOVERY));
-#endif
+ usb_pause_mtx(mtx, USB_MS_TO_TICKS(usb_port_reset_recovery));
done:
DPRINTFN(2, "port %d warm reset returning error=%s\n",
@@ -1566,7 +1500,7 @@ usbd_req_set_address(struct usb_device *
done:
/* allow device time to set new address */
usb_pause_mtx(mtx,
- USB_MS_TO_TICKS(USB_SET_ADDRESS_SETTLE));
+ USB_MS_TO_TICKS(usb_set_address_settle));
return (err);
}
Modified: stable/9/sys/dev/usb/wlan/if_uath.c
==============================================================================
--- stable/9/sys/dev/usb/wlan/if_uath.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/wlan/if_uath.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -114,7 +114,7 @@ __FBSDID("$FreeBSD$");
SYSCTL_NODE(_hw_usb, OID_AUTO, uath, CTLFLAG_RW, 0, "USB Atheros");
static int uath_countrycode = CTRY_DEFAULT; /* country code */
-SYSCTL_INT(_hw_usb_uath, OID_AUTO, countrycode, CTLFLAG_RW, &uath_countrycode,
+SYSCTL_INT(_hw_usb_uath, OID_AUTO, countrycode, CTLFLAG_RW | CTLFLAG_TUN, &uath_countrycode,
0, "country code");
TUNABLE_INT("hw.usb.uath.countrycode", &uath_countrycode);
static int uath_regdomain = 0; /* regulatory domain */
@@ -123,7 +123,7 @@ SYSCTL_INT(_hw_usb_uath, OID_AUTO, regdo
#ifdef UATH_DEBUG
int uath_debug = 0;
-SYSCTL_INT(_hw_usb_uath, OID_AUTO, debug, CTLFLAG_RW, &uath_debug, 0,
+SYSCTL_INT(_hw_usb_uath, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &uath_debug, 0,
"uath debug level");
TUNABLE_INT("hw.usb.uath.debug", &uath_debug);
enum {
Modified: stable/9/sys/dev/usb/wlan/if_upgt.c
==============================================================================
--- stable/9/sys/dev/usb/wlan/if_upgt.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/wlan/if_upgt.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -75,7 +75,7 @@ SYSCTL_NODE(_hw, OID_AUTO, upgt, CTLFLAG
#ifdef UPGT_DEBUG
int upgt_debug = 0;
-SYSCTL_INT(_hw_upgt, OID_AUTO, debug, CTLFLAG_RW, &upgt_debug,
+SYSCTL_INT(_hw_upgt, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &upgt_debug,
0, "control debugging printfs");
TUNABLE_INT("hw.upgt.debug", &upgt_debug);
enum {
Modified: stable/9/sys/dev/usb/wlan/if_urtw.c
==============================================================================
--- stable/9/sys/dev/usb/wlan/if_urtw.c Thu Nov 8 16:04:32 2012 (r242774)
+++ stable/9/sys/dev/usb/wlan/if_urtw.c Thu Nov 8 16:13:51 2012 (r242775)
@@ -64,7 +64,7 @@ __FBSDID("$FreeBSD$");
SYSCTL_NODE(_hw_usb, OID_AUTO, urtw, CTLFLAG_RW, 0, "USB Realtek 8187L");
#ifdef URTW_DEBUG
int urtw_debug = 0;
-SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RW, &urtw_debug, 0,
+SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &urtw_debug, 0,
"control debugging printfs");
TUNABLE_INT("hw.usb.urtw.debug", &urtw_debug);
enum {
@@ -89,7 +89,7 @@ enum {
} while (0)
#endif
static int urtw_preamble_mode = URTW_PREAMBLE_MODE_LONG;
-SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RW,
+SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RW | CTLFLAG_TUN,
&urtw_preamble_mode, 0, "set the preable mode (long or short)");
TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode);
More information about the svn-src-stable
mailing list