changeset 10316:d68e26bd3bfd

PSARC 2009/422 VirtualBox USB Device Capture 6849326 USB filtered capture in Virtual Box is not supported on Solaris
author Strony Zhang - Solaris China Team <Strony.Zhang@Sun.COM>
date Sat, 15 Aug 2009 09:43:34 +0800
parents 3cdfd72593ca
children 0a8cd85041eb
files usr/src/uts/common/io/usb/usba/usba.c usr/src/uts/common/io/usb/usba/usbai.c usr/src/uts/common/io/warlock/hid_with_usba.wlcmd usr/src/uts/common/io/warlock/scsa2usb_with_usba.wlcmd usr/src/uts/common/io/warlock/ugen_with_usba.wlcmd usr/src/uts/common/io/warlock/usb_ia_with_usba.wlcmd usr/src/uts/common/io/warlock/usb_mid_with_usba.wlcmd usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd usr/src/uts/common/io/warlock/usbprn_with_usba.wlcmd usr/src/uts/common/io/warlock/usbsacm_with_usba.wlcmd usr/src/uts/common/io/warlock/usbser_edge_with_usba.wlcmd usr/src/uts/common/io/warlock/usbser_keyspan_with_usba.wlcmd usr/src/uts/common/io/warlock/usbskel_with_usba.wlcmd usr/src/uts/common/io/warlock/usbsprl_with_usba.wlcmd usr/src/uts/common/io/warlock/usbvc_with_usba.wlcmd usr/src/uts/common/sys/usb/usba/usba_impl.h usr/src/uts/common/sys/usb/usbai.h
diffstat 17 files changed, 167 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/usb/usba/usba.c	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/usb/usba/usba.c	Sat Aug 15 09:43:34 2009 +0800
@@ -73,8 +73,11 @@
 /*
  * compatible name handling
  */
-/* allowing for 15 compat names, plus one force bind name */
-#define	USBA_MAX_COMPAT_NAMES		16
+/*
+ * allowing for 15 compat names, plus one force bind name and
+ * one possible specified client driver name
+ */
+#define	USBA_MAX_COMPAT_NAMES		17
 #define	USBA_MAX_COMPAT_NAME_LEN	64
 
 /* double linked list for usba_devices */
@@ -1841,7 +1844,7 @@
 	usb_dev_descr_t	*usb_dev_descr;
 	uint_t		n_cfgs;	/* number of configs */
 	uint_t		n_ifs;	/* number of interfaces */
-	uint_t		port;
+	uint_t		port, bus_num;
 	size_t		usb_config_length;
 	uchar_t 	*usb_config;
 	int		reg[1];
@@ -1867,7 +1870,7 @@
 	usb_dev_descr = usba_device->usb_dev_descr;
 	n_cfgs = usba_device->usb_n_cfgs;
 	n_ifs = usba_device->usb_n_ifs;
-
+	bus_num = usba_device->usb_addr;
 
 	if (address != ROOT_HUB_ADDR) {
 		size = usb_parse_if_descr(
@@ -1974,6 +1977,35 @@
 		    USBA_MAX_COMPAT_NAME_LEN);
 	}
 
+	/*
+	 * If the callback function of specified driver is registered,
+	 * it will be called here to check whether to take over the device.
+	 */
+	if (usb_cap.usba_dev_driver_cb != NULL) {
+		char		*dev_drv = NULL;
+		usb_dev_str_t	dev_str;
+		char		*pathname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+
+		dev_str.usb_mfg = usba_device->usb_mfg_str;
+		dev_str.usb_product = usba_device->usb_product_str;
+		dev_str.usb_serialno = usba_device->usb_serialno_str;
+
+		(void) ddi_pathname(child_dip, pathname);
+
+		if ((usb_cap.usba_dev_driver_cb(usb_dev_descr, &dev_str,
+		    pathname, bus_num, port, &dev_drv, NULL) == USB_SUCCESS) &&
+		    (dev_drv != NULL)) {
+			USB_DPRINTF_L3(DPRINT_MASK_USBA, usba_log_handle,
+			    "usba_ready_device_node: dev_driver=%s, port =%d,"
+			    "bus =%d, path=%s\n\t",
+			    dev_drv, port, bus_num, pathname);
+
+			(void) strncpy(usba_name[n++], dev_drv,
+			    USBA_MAX_COMPAT_NAME_LEN);
+		}
+		kmem_free(pathname, MAXPATHLEN);
+	}
+
 	/* create compatible names */
 	if (combined_node) {
 
--- a/usr/src/uts/common/io/usb/usba/usbai.c	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/usb/usba/usbai.c	Sat Aug 15 09:43:34 2009 +0800
@@ -18,7 +18,7 @@
  *
  * CDDL HEADER END
  *
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -82,7 +82,6 @@
  */
 int usb_force_enable_pm = 0;
 
-
 /* USBA framework initializations */
 void
 usba_usbai_initialization()
@@ -1288,3 +1287,38 @@
 {
 	return (usba_hubdi_reset_device(dip, reset_level));
 }
+
+/*
+ * usb device driver registration
+ */
+int
+usb_register_dev_driver(dev_info_t *dip, usb_dev_driver_callback_t cb)
+{
+	USB_DPRINTF_L4(DPRINT_MASK_USBAI, usbai_log_handle,
+	    "usb_register_dev_driver: register the specified driver "
+	    "in usba: dip = 0x%p", (void *)dip);
+
+	if (cb != NULL) {
+		usb_cap.dip = dip;
+		usb_cap.usba_dev_driver_cb = cb;
+
+		return (USB_SUCCESS);
+	}
+
+	return (USB_FAILURE);
+}
+
+/*
+ * usb device driver unregistration
+ */
+void
+usb_unregister_dev_driver(dev_info_t *dip)
+{
+	USB_DPRINTF_L4(DPRINT_MASK_USBAI, usbai_log_handle,
+	    "usb_unregister_dev_driver: unregister the registered "
+	    "driver: dip =0x%p", (void *)dip);
+
+	ASSERT(dip == usb_cap.dip);
+	usb_cap.dip = NULL;
+	usb_cap.usba_dev_driver_cb = NULL;
+}
--- a/usr/src/uts/common/io/warlock/hid_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/hid_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -86,6 +86,8 @@
 root	usb_get_current_cfgidx
 root	usb_register_client
 root	usb_reset_device
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root	usba_common_power
 root	usba_common_register_events
--- a/usr/src/uts/common/io/warlock/scsa2usb_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/scsa2usb_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -101,6 +101,8 @@
 root	usb_register_client
 root	usb_ugen_power
 root	usb_reset_device
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root	usba_common_power
 root	usba_common_register_events
--- a/usr/src/uts/common/io/warlock/ugen_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/ugen_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -75,6 +75,8 @@
 root	usb_is_pm_enabled
 root    usb_register_client
 root	usb_reset_device
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root	usba_common_power
 root	usba_common_register_events
--- a/usr/src/uts/common/io/warlock/usb_ia_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usb_ia_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -128,7 +128,8 @@
 root	usb_ugen_reconnect_ev_cb
 root	usb_ugen_write
 root	usba_ready_interface_association_node
-
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root    hubd_root_hub_cleanup_thread
 root	hubd_restore_state_cb
--- a/usr/src/uts/common/io/warlock/usb_mid_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usb_mid_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -120,6 +120,8 @@
 root    usb_register_client
 root	usb_reset_device
 root	usb_ugen_power
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root    hubd_root_hub_cleanup_thread
 root	hubd_restore_state_cb
--- a/usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbftdi_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -95,6 +95,8 @@
 root usb_get_current_cfgidx
 root usb_register_client
 root usb_reset_device
+root usb_register_dev_driver
+root usb_unregister_dev_driver
 
 root usb_ugen_attach
 root usb_ugen_close
--- a/usr/src/uts/common/io/warlock/usbprn_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbprn_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -89,6 +89,8 @@
 root    usb_register_client
 root	usb_reset_device
 root	usb_ugen_power
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root	hcdi_autoclearing
 root	hcdi_cb_thread
--- a/usr/src/uts/common/io/warlock/usbsacm_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbsacm_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -17,10 +17,9 @@
 #
 # CDDL HEADER END
 #
-# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
-# ident	"%Z%%M%	%I%	%E% SMI"
 
 one ohci_state
 one ehci_state
@@ -99,6 +98,8 @@
 root usb_get_current_cfgidx
 root usb_register_client
 root usb_reset_device
+root usb_register_dev_driver
+root usb_unregister_dev_driver
 
 root usb_ugen_attach
 root usb_ugen_close
--- a/usr/src/uts/common/io/warlock/usbser_edge_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbser_edge_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -79,6 +79,8 @@
 root	usb_get_current_cfgidx
 root    usb_register_client
 root	usb_reset_device
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root    usb_ugen_attach
 root    usb_ugen_close
--- a/usr/src/uts/common/io/warlock/usbser_keyspan_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbser_keyspan_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -100,6 +100,8 @@
 root	usb_get_current_cfgidx
 root    usb_register_client
 root	usb_reset_device
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root    usb_ugen_attach
 root    usb_ugen_close
--- a/usr/src/uts/common/io/warlock/usbskel_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbskel_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -84,6 +84,8 @@
 root	usb_get_current_cfgidx
 root    usb_register_client
 root	usb_reset_device
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root    usb_ugen_attach
 root    usb_ugen_close
--- a/usr/src/uts/common/io/warlock/usbsprl_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbsprl_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -94,6 +94,8 @@
 root usb_get_current_cfgidx
 root usb_register_client
 root usb_reset_device
+root usb_register_dev_driver
+root usb_unregister_dev_driver
 
 root usb_ugen_attach
 root usb_ugen_close
--- a/usr/src/uts/common/io/warlock/usbvc_with_usba.wlcmd	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/io/warlock/usbvc_with_usba.wlcmd	Sat Aug 15 09:43:34 2009 +0800
@@ -100,7 +100,8 @@
 root	usb_ugen_read
 root	usb_ugen_reconnect_ev_cb
 root	usb_ugen_write
-
+root	usb_register_dev_driver
+root	usb_unregister_dev_driver
 
 root	hcdi_autoclearing
 root	hcdi_cb_thread
--- a/usr/src/uts/common/sys/usb/usba/usba_impl.h	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/sys/usb/usba/usba_impl.h	Sat Aug 15 09:43:34 2009 +0800
@@ -435,6 +435,15 @@
 /* free request wrappers */
 void	usba_req_wrapper_free(usba_req_wrapper_t *);
 
+/* usb device capture for the specific client driver */
+typedef struct usb_dev_cap {
+	dev_info_t			*dip;
+	usb_dev_driver_callback_t	usba_dev_driver_cb;
+} usb_dev_cap_t;
+
+usb_dev_cap_t usb_cap;
+_NOTE(SCHEME_PROTECTS_DATA("unique device capture data", usb_cap))
+
 #ifdef __cplusplus
 }
 #endif
--- a/usr/src/uts/common/sys/usb/usbai.h	Fri Aug 14 15:52:27 2009 -0700
+++ b/usr/src/uts/common/sys/usb/usbai.h	Sat Aug 15 09:43:34 2009 +0800
@@ -2555,6 +2555,65 @@
 
 
 /*
+ * **************************************************************************
+ * USB device driver registration and callback functions remaining
+ * Contracted Project Private (for VirtualBox USB Device Capture)
+ * **************************************************************************
+ */
+
+/*
+ * getting the device strings of manufacturer, product and serial number
+ */
+typedef struct usb_dev_str {
+	char	*usb_mfg;	/* manufacturer string */
+	char	*usb_product;	/* product string */
+	char	*usb_serialno;	/* serial number string */
+} usb_dev_str_t;
+
+/*
+ * It is the callback function type for capture driver.
+ * Arguments:
+ *	dev_descr	- pointer to device descriptor
+ *	dev_str		- pointer to device strings
+ *	path		- pointer to device physical path
+ *	bus		- USB bus address
+ *	port		- USB port number
+ *	drv		- capture driver name.
+ *			  It is returned by the callback func.
+ * Return Values:
+ *      USB_SUCCESS     - VirtualBox will capture the device
+ *      USB_FAILURE     - VirtualBox will not capture the device
+ */
+typedef int (*usb_dev_driver_callback_t)(
+	usb_dev_descr_t	*dev_descr,
+	usb_dev_str_t	*dev_str,
+	char		*path,
+	int		bus,
+	int		port,
+	char		**drv,
+	void		*reserved);
+
+/*
+ * Register the callback function in the usba.
+ * Argument:
+ *	dip		- client driver's devinfo pointer
+ *	cb		- callback function
+ *
+ * Return Values:
+ *	USB_SUCCESS	- the registeration was successful
+ *	USB_FAILURE	- the registeration failed
+ */
+int usb_register_dev_driver(
+	dev_info_t			*dip,
+	usb_dev_driver_callback_t	cb);
+
+/*
+ * Unregister the callback function in the usba.
+ */
+void usb_unregister_dev_driver(dev_info_t *dip);
+
+
+/*
  * ***************************************************************************
  * USB Device and interface class, subclass and protocol codes
  * ***************************************************************************