Mercurial > illumos > illumos-gate
changeset 10316:d68e26bd3bfd
PSARC 2009/422 VirtualBox USB Device Capture
6849326 USB filtered capture in Virtual Box is not supported on Solaris
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 * ***************************************************************************