PERFORCE change 126738 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Sep 23 08:13:07 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126738
Change 126738 by hselasky at hselasky_laptop001 on 2007/09/23 15:12:42
FYI; The comments follow the P4 diff from top to bottom.
- start "usb_driver_added_refcount" at 1
- the "root_port" in "struct usbd_bus" is now gone. Instead we
store the root USB device at "bus->devices[0]". USB_START_ADDR
is 0 for completeness.
- update description of Wireless USB to include the maximum
data rate.
- "usbd_probe_and_attach()" has been factored out from
"usbd_new_device()". This makes the code more clear.
- passing a mutex to "usbd_do_request_flags()" and all
"usbreq_xxx()" functions is now mandatory.
- "usbd_fill_deviceinfo()" does no longer need the last parameter.
- NOTE: the prototype of "usbreq_get_desc()" has changed.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb.c#17 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb.c#17 (text+ko) ====
@@ -83,7 +83,7 @@
#define USB_UCRED
#endif
-uint8_t usb_driver_added_refcount;
+uint8_t usb_driver_added_refcount = 1;
static uint8_t usb_post_init_called = 0;
@@ -165,8 +165,8 @@
bus->is_exploring = 1;
- while(bus->root_port.device &&
- bus->root_port.device->hub &&
+ while(bus->devices[USB_START_ADDR] &&
+ bus->devices[USB_START_ADDR]->hub &&
bus->needs_explore &&
(bus->wait_explore == 0))
{
@@ -177,8 +177,8 @@
* exiting usb_global_lock,
* which is actually Giant)
*/
- (bus->root_port.device->hub->explore)
- (bus->root_port.device);
+ (bus->devices[USB_START_ADDR]->hub->explore)
+ (bus->devices[USB_START_ADDR]);
}
bus->is_exploring = 0;
@@ -200,7 +200,7 @@
while(1)
{
- if(bus->root_port.device == 0)
+ if(bus->devices[USB_START_ADDR] == 0)
{
break;
}
@@ -210,7 +210,7 @@
/* Check if a detach happened
* during discover:
*/
- if(bus->root_port.device == 0)
+ if(bus->devices[USB_START_ADDR] == 0)
{
break;
}
@@ -260,6 +260,10 @@
mtx_lock(&usb_global_lock);
usb_driver_added_refcount++;
+ if (usb_driver_added_refcount == 0) {
+ /* avoid zero, hence that is memory default */
+ usb_driver_added_refcount = 1;
+ }
dc = devclass_find("usb");
@@ -320,8 +324,6 @@
mtx_assert(&usb_global_lock, MA_OWNED);
- bus->root_port.power = USB_MAX_POWER;
-
switch (bus->usbrev) {
case USBREV_1_0:
speed = USB_SPEED_FULL;
@@ -340,7 +342,7 @@
case USBREV_2_5:
speed = USB_SPEED_VARIABLE;
- device_printf(bus->bdev, "Wireless USB v2.5\n");
+ device_printf(bus->bdev, "480MBps Wireless USB v2.5\n");
break;
default:
@@ -348,11 +350,15 @@
return;
}
- err = usbd_new_device(bus->bdev, bus, 0, speed, 0,
- &bus->root_port);
+ err = usbd_new_device(bus->bdev, bus, NULL, 0, speed, 0, 0);
+
+ if (!err) {
+ err = usbd_probe_and_attach(bus->bdev, bus->devices[USB_START_ADDR]);
+ }
+
if(!err)
{
- if(bus->root_port.device->hub == NULL)
+ if(bus->devices[USB_START_ADDR]->hub == NULL)
{
device_printf(bus->bdev,
"root device is not a hub\n");
@@ -476,13 +482,13 @@
/* detach children first */
bus_generic_detach(dev);
- if(bus->root_port.device != NULL)
+ if(bus->devices[USB_START_ADDR] != NULL)
{
/* free device, but not sub-devices,
* hence they are freed by the
* caller of this function
*/
- usbd_free_device(&bus->root_port, 0);
+ usbd_free_device(bus->devices[USB_START_ADDR], 0);
}
/* kill off event thread */
@@ -715,11 +721,11 @@
}
}
- mtx_lock(dev->sc_mtx_ptr);
- error = usbd_do_request_flags_mtx
- (udev, dev->sc_mtx_ptr, &ur->ucr_request, ptr, ur->ucr_flags,
- &ur->ucr_actlen, USBD_DEFAULT_TIMEOUT);
- mtx_unlock(dev->sc_mtx_ptr);
+ error = usbd_do_request_flags
+ (udev, NULL, &ur->ucr_request, ptr, ur->ucr_flags,
+ &len, USBD_DEFAULT_TIMEOUT);
+
+ ur->ucr_actlen = len;
if (error) {
error = EIO;
@@ -752,7 +758,7 @@
goto done;
}
- error = usbd_fill_deviceinfo(udev, di, 1);
+ error = usbd_fill_deviceinfo(udev, di);
usbd_unref_device(udev);
goto done;
@@ -765,7 +771,7 @@
case USB_DEVICEENUMERATE:
{
struct usb_device_enumerate *ude = (void *)addr;
- struct usbd_port *pp;
+ struct usbd_device *parent_hub;
usb_port_status_t ps;
uint8_t old_addr;
uint8_t buf[8];
@@ -777,13 +783,13 @@
}
old_addr = udev->address;
- pp = udev->powersrc;
- if (pp == NULL) {
+ parent_hub = udev->parent_hub;
+ if (parent_hub == NULL) {
error = EINVAL;
goto ret002;
}
- error = usbreq_reset_port(pp->parent, pp->portno, &ps);
+ error = usbreq_reset_port(parent_hub, NULL, &ps, udev->port_no);
if (error) {
error = ENXIO;
goto ret002;
@@ -793,12 +799,13 @@
* our device should be at address
* zero:
*/
- udev->address = 0;
+ udev->address = USB_START_ADDR;
/* It should be allowed to read some descriptors
* from address zero:
*/
- error = usbreq_get_desc(udev, UDESC_DEVICE, 0, 8, buf, 0);
+ error = usbreq_get_desc(udev, NULL, buf,
+ 8, 8, 0, UDESC_DEVICE, 0, 0);
if (error) {
error = ENXIO;
goto ret002;
@@ -806,7 +813,7 @@
/* Restore device address:
*/
- error = usbreq_set_address(udev, old_addr);
+ error = usbreq_set_address(udev, NULL, old_addr);
if (error) {
error = ENXIO;
goto ret002;
More information about the p4-projects
mailing list