PERFORCE change 175356 for review

Hans Petter Selasky hselasky at FreeBSD.org
Thu Mar 4 20:52:33 UTC 2010


http://p4web.freebsd.org/chv.cgi?CH=175356

Change 175356 by hselasky at hselasky_laptop001 on 2010/03/04 20:51:47

	USB CORE (LibUSB/UGEN):
		- implement kernel driver detach functionality.
		- patch by: HPS @

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/usb_device.c#64 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_device.h#33 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_generic.c#25 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/usb_device.c#64 (text+ko) ====

@@ -80,7 +80,6 @@
 static void	usb_init_endpoint(struct usb_device *, uint8_t,
 		    struct usb_endpoint_descriptor *, struct usb_endpoint *);
 static void	usb_unconfigure(struct usb_device *, uint8_t);
-static void	usb_detach_device(struct usb_device *, uint8_t, uint8_t);
 static void	usb_detach_device_sub(struct usb_device *, device_t *,
 		    uint8_t);
 static uint8_t	usb_probe_and_attach_sub(struct usb_device *,

==== //depot/projects/usb/src/sys/dev/usb/usb_device.h#33 (text+ko) ====

@@ -196,6 +196,7 @@
 		    enum usb_dev_speed speed, enum usb_hc_mode mode);
 usb_error_t	usb_probe_and_attach(struct usb_device *udev,
 		    uint8_t iface_index);
+void		usb_detach_device(struct usb_device *, uint8_t, uint8_t);
 usb_error_t	usb_reset_iface_endpoints(struct usb_device *udev,
 		    uint8_t iface_index);
 usb_error_t	usbd_set_config_index(struct usb_device *udev, uint8_t index);

==== //depot/projects/usb/src/sys/dev/usb/usb_generic.c#25 (text+ko) ====

@@ -2095,17 +2095,32 @@
 		break;
 
 	case USB_IFACE_DRIVER_ACTIVE:
-		/* TODO */
-		*u.pint = 0;
+
+		n = *u.pint & 0xFF;
+
+		iface = usbd_get_iface(f->udev, n);
+
+		if (iface && iface->subdev)
+			error = 0;
+		else
+			error = ENXIO;
 		break;
 
 	case USB_IFACE_DRIVER_DETACH:
-		/* TODO */
+
 		error = priv_check(curthread, PRIV_DRIVER);
-		if (error) {
+
+		if (error)
+			break;
+
+		n = *u.pint & 0xFF;
+
+		if (n == USB_IFACE_INDEX_ANY) {
+			error = EINVAL;
 			break;
 		}
-		error = EINVAL;
+
+		usb_detach_device(f->udev, n, 0);
 		break;
 
 	case USB_SET_POWER_MODE:


More information about the p4-projects mailing list