Module Name: src
Committed By: skrll
Date: Tue Jan 3 12:50:51 UTC 2017
Modified Files:
src/sys/dev/usb [nick-nhusb]: usb.c usb.h usb_subr.c usbdivar.h xhci.c
Log Message:
Improve handling of roothub device and free up a bus address for LS/FS/HS
controllers.
To generate a diff of this commit:
cvs rdiff -u -r1.156.2.16 -r1.156.2.17 src/sys/dev/usb/usb.c
cvs rdiff -u -r1.111.2.11 -r1.111.2.12 src/sys/dev/usb/usb.h
cvs rdiff -u -r1.198.2.38 -r1.198.2.39 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.109.2.27 -r1.109.2.28 src/sys/dev/usb/usbdivar.h
cvs rdiff -u -r1.28.2.83 -r1.28.2.84 src/sys/dev/usb/xhci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/usb.c
diff -u src/sys/dev/usb/usb.c:1.156.2.16 src/sys/dev/usb/usb.c:1.156.2.17
--- src/sys/dev/usb/usb.c:1.156.2.16 Sun Jan 1 14:56:25 2017
+++ src/sys/dev/usb/usb.c Tue Jan 3 12:50:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: usb.c,v 1.156.2.16 2017/01/01 14:56:25 skrll Exp $ */
+/* $NetBSD: usb.c,v 1.156.2.17 2017/01/03 12:50:50 skrll Exp $ */
/*
* Copyright (c) 1998, 2002, 2008, 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.156.2.16 2017/01/01 14:56:25 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.156.2.17 2017/01/03 12:50:50 skrll Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -727,8 +727,12 @@ usbioctl(dev_t devt, u_long cmd, void *d
error = EINVAL;
goto fail;
}
- if (addr < 0 || addr >= USB_MAX_DEVICES ||
- sc->sc_bus->ub_devices[addr] == NULL) {
+ if (addr < 0 || addr >= USB_MAX_DEVICES) {
+ error = EINVAL;
+ goto fail;
+ }
+ size_t dindex = usb_addr2dindex(addr);
+ if (sc->sc_bus->ub_devices[dindex] == NULL) {
error = EINVAL;
goto fail;
}
@@ -750,7 +754,7 @@ usbioctl(dev_t devt, u_long cmd, void *d
goto ret;
}
}
- err = usbd_do_request_flags(sc->sc_bus->ub_devices[addr],
+ err = usbd_do_request_flags(sc->sc_bus->ub_devices[dindex],
&ur->ucr_request, ptr, ur->ucr_flags, &ur->ucr_actlen,
USBD_DEFAULT_TIMEOUT);
if (err) {
@@ -783,7 +787,8 @@ usbioctl(dev_t devt, u_long cmd, void *d
error = EINVAL;
goto fail;
}
- if ((dev = sc->sc_bus->ub_devices[addr]) == NULL) {
+ size_t dindex = usb_addr2dindex(addr);
+ if ((dev = sc->sc_bus->ub_devices[dindex]) == NULL) {
error = ENXIO;
goto fail;
}
@@ -802,7 +807,8 @@ usbioctl(dev_t devt, u_long cmd, void *d
error = EINVAL;
goto fail;
}
- if ((dev = sc->sc_bus->ub_devices[addr]) == NULL) {
+ size_t dindex = usb_addr2dindex(addr);
+ if ((dev = sc->sc_bus->ub_devices[dindex]) == NULL) {
error = ENXIO;
goto fail;
}
Index: src/sys/dev/usb/usb.h
diff -u src/sys/dev/usb/usb.h:1.111.2.11 src/sys/dev/usb/usb.h:1.111.2.12
--- src/sys/dev/usb/usb.h:1.111.2.11 Mon Jan 2 16:55:50 2017
+++ src/sys/dev/usb/usb.h Tue Jan 3 12:50:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: usb.h,v 1.111.2.11 2017/01/02 16:55:50 skrll Exp $ */
+/* $NetBSD: usb.h,v 1.111.2.12 2017/01/03 12:50:50 skrll Exp $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -53,9 +53,9 @@
#define USB_STACK_VERSION 2
-#define USB_MAX_DEVICES (128 + 1) /* 0, root, and 1->127 */
-#define USB_MIN_DEVICES 2 /* unused + root HUB */
-#define USB_START_ADDR 0
+#define USB_MAX_DEVICES 128 /* 0, 1-127 */
+#define USB_MIN_DEVICES 2 /* unused + root HUB */
+#define USB_START_ADDR 0
#define USB_CONTROL_ENDPOINT 0
#define USB_MAX_ENDPOINTS 16
Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.198.2.38 src/sys/dev/usb/usb_subr.c:1.198.2.39
--- src/sys/dev/usb/usb_subr.c:1.198.2.38 Thu Dec 29 08:40:27 2016
+++ src/sys/dev/usb/usb_subr.c Tue Jan 3 12:50:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: usb_subr.c,v 1.198.2.38 2016/12/29 08:40:27 skrll Exp $ */
+/* $NetBSD: usb_subr.c,v 1.198.2.39 2017/01/03 12:50:50 skrll Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */
/*
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198.2.38 2016/12/29 08:40:27 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198.2.39 2017/01/03 12:50:50 skrll Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -832,9 +832,11 @@ usbd_getnewaddr(struct usbd_bus *bus)
{
int addr;
- for (addr = 1; addr < USB_MAX_DEVICES; addr++)
- if (bus->ub_devices[addr] == NULL)
+ for (addr = 1; addr < USB_MAX_DEVICES; addr++) {
+ size_t dindex = usb_addr2dindex(addr);
+ if (bus->ub_devices[dindex] == NULL)
return addr;
+ }
return -1;
}
@@ -1336,7 +1338,7 @@ usbd_new_device(device_t parent, struct
/* Allow device time to set new address */
usbd_delay_ms(dev, USB_SET_ADDRESS_SETTLE);
dev->ud_addr = addr; /* new device address now */
- bus->ub_devices[addr] = dev;
+ bus->ub_devices[usb_addr2dindex(addr)] = dev;
/* Re-establish the default pipe with the new address. */
usbd_kill_pipe(dev->ud_pipe0);
@@ -1428,7 +1430,7 @@ usbd_remove_device(struct usbd_device *d
if (dev->ud_pipe0 != NULL)
usbd_kill_pipe(dev->ud_pipe0);
up->up_dev = NULL;
- dev->ud_bus->ub_devices[dev->ud_addr] = NULL;
+ dev->ud_bus->ub_devices[usb_addr2dindex(dev->ud_addr)] = NULL;
kmem_free(dev, sizeof(*dev));
}
@@ -1737,7 +1739,7 @@ usb_disconnect_port(struct usbd_port *up
}
mutex_enter(dev->ud_bus->ub_lock);
- dev->ud_bus->ub_devices[dev->ud_addr] = NULL;
+ dev->ud_bus->ub_devices[usb_addr2dindex(dev->ud_addr)] = NULL;
up->up_dev = NULL;
mutex_exit(dev->ud_bus->ub_lock);
Index: src/sys/dev/usb/usbdivar.h
diff -u src/sys/dev/usb/usbdivar.h:1.109.2.27 src/sys/dev/usb/usbdivar.h:1.109.2.28
--- src/sys/dev/usb/usbdivar.h:1.109.2.27 Sat Apr 30 10:34:14 2016
+++ src/sys/dev/usb/usbdivar.h Tue Jan 3 12:50:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdivar.h,v 1.109.2.27 2016/04/30 10:34:14 skrll Exp $ */
+/* $NetBSD: usbdivar.h,v 1.109.2.28 2017/01/03 12:50:50 skrll Exp $ */
/*
* Copyright (c) 1998, 2012 The NetBSD Foundation, Inc.
@@ -139,6 +139,9 @@ struct usbd_hub {
};
/*****/
+/* 0, root, and 1->127 */
+#define USB_ROOTHUB_INDEX 1
+#define USB_TOTAL_DEVICES (USB_MAX_DEVICES + 1)
struct usbd_bus {
/* Filled by HC driver */
@@ -164,7 +167,7 @@ struct usbd_bus {
struct usbd_device *ub_roothub;
uint8_t ub_rhaddr; /* roothub address */
uint8_t ub_rhconf; /* roothub configuration */
- struct usbd_device *ub_devices[USB_MAX_DEVICES];
+ struct usbd_device *ub_devices[USB_TOTAL_DEVICES];
kcondvar_t ub_needsexplore_cv;
char ub_needsexplore;/* a hub a signalled a change */
char ub_usepolling;
@@ -353,6 +356,13 @@ usbd_xfer_isread(struct usbd_xfer *xfer)
UE_DIR_IN;
}
+static inline size_t
+usb_addr2dindex(int addr)
+{
+
+ return USB_ROOTHUB_INDEX + addr;
+}
+
/*
* These macros reflect the current locking scheme. They might change.
*/
Index: src/sys/dev/usb/xhci.c
diff -u src/sys/dev/usb/xhci.c:1.28.2.83 src/sys/dev/usb/xhci.c:1.28.2.84
--- src/sys/dev/usb/xhci.c:1.28.2.83 Mon Jan 2 16:55:50 2017
+++ src/sys/dev/usb/xhci.c Tue Jan 3 12:50:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: xhci.c,v 1.28.2.83 2017/01/02 16:55:50 skrll Exp $ */
+/* $NetBSD: xhci.c,v 1.28.2.84 2017/01/03 12:50:50 skrll Exp $ */
/*
* Copyright (c) 2013 Jonathan A. Kollasch
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.28.2.83 2017/01/02 16:55:50 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.28.2.84 2017/01/03 12:50:50 skrll Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -2292,9 +2292,8 @@ xhci_new_device(device_t parent, struct
dd = &dev->ud_ddesc;
if (depth == 0 && port == 0) {
-#define XHCI_ROOTHUB_INDEX 128
- KASSERT(bus->ub_devices[XHCI_ROOTHUB_INDEX] == NULL);
- bus->ub_devices[XHCI_ROOTHUB_INDEX] = dev;
+ KASSERT(bus->ub_devices[USB_ROOTHUB_INDEX] == NULL);
+ bus->ub_devices[USB_ROOTHUB_INDEX] = dev;
err = usbd_get_initial_ddesc(dev, dd);
if (err) {
DPRINTFN(1, "get_initial_ddesc %u", err, 0, 0, 0);
@@ -2356,12 +2355,12 @@ xhci_new_device(device_t parent, struct
KASSERTMSG(addr >= 1 && addr <= 127, "addr %d", addr);
dev->ud_addr = addr;
- KASSERTMSG(bus->ub_devices[dev->ud_addr] == NULL,
+ KASSERTMSG(bus->ub_devices[usb_addr2dindex(dev->ud_addr)] == NULL,
"addr %d already allocated", dev->ud_addr);
/*
- * The root hub is given a slot
+ * The root hub is given its own slot
*/
- bus->ub_devices[dev->ud_addr] = dev;
+ bus->ub_devices[usb_addr2dindex(dev->ud_addr)] = dev;
err = usbd_get_initial_ddesc(dev, dd);
if (err) {