From 6f0e1ffd076c821819632e0371db2f38434ad02c Mon Sep 17 00:00:00 2001 From: Alfred Perlstein Date: Wed, 19 Nov 2008 08:56:35 +0000 Subject: [PATCH] src/sys/dev/usb2/controller/uss820dci_pccard.c src/sys/dev/usb2/core/usbdevs src/sys/dev/usb2/include/urio2_ioctl.h src/sys/dev/usb2/storage/ustorage2_fs.h These files are not used any more. src/usr.sbin/Makefile src/etc/mtree/BSD.include.dist src/include/Makefile src/lib/Makefile src/share/man/man7/hier.7 src/share/mk/bsd.libnames.mk src/etc/mtree/BSD.include.dist Make "usbconfig" and "libusb20" a part of the default build. src/sys/dev/usb/rio500_usb.h src/sys/dev/usb2/storage/urio2.c Use common include file. src/sys/dev/usb2/bluetooth/ng_ubt2.c Make USB bluetooth depend on "ng_hci" module. src/sys/dev/usb2/controller/ehci2.c src/sys/dev/usb2/controller/ehci2.h Patches for Marvell EHCI. src/sys/dev/usb2/core/usb2_busdma.c Bugfix for 64-bit platforms. Need to unload the previously loaded DMA map and some cleanup regarding some corner cases. src/sys/dev/usb2/core/usb2_core.h src/sys/dev/usb2/core/usb2_dev.c src/sys/dev/usb2/core/usb2_dev.h Bugfix for libusb filesystem interface. New feature: Add support for filtering device data at the expense of the userland process. Add some more comments. Some minor code styling. Remove unused function, usb2_fifo_get_data_next(). Fix an issue about "fifo_index" being used instead of "ep_index". src/sys/dev/usb2/core/usb2_device.c src/sys/dev/usb2/core/usb2_generic.c Bugfix for Linux USB compat layer. Do not free non-generic FIFOs when doing an alternate setting. Cleanup USB IOCTL and USB reference handling. Fix a corner case where USB-FS was left initialised after setting a new configuration or alternate setting. src/sys/dev/usb2/core/usb2_hub.c Improvement: Check all USB HUB ports by default at least one time. src/sys/dev/usb2/core/usb2_request.c Bugfix: Make sure destination ASCII string is properly zero terminated in all cases. Improvement: Skip invalid characters instead of replacing with a dot. src/sys/dev/usb2/core/usb2_util.c src/sys/dev/usb2/image/uscanner2.c Spelling. src/sys/dev/usb2/include/Makefile Share "usbdevs" with the old USB stack. src/sys/dev/usb2/include/usb2_devid.h src/sys/dev/usb2/include/usb2_devtable.h Regenerate files. Alfred: Please fix the RCS tag at the top. src/sys/dev/usb2/include/usb2_ioctl.h Fix compilation of "kdump". src/sys/dev/usb2/serial/ubsa2.c src/sys/dev/usb2/serial/ugensa2.c Remove device ID's which will end up in a new 3G driver. src/sys/dev/usb2/sound/uaudio2.c Correct a debug printout. src/sys/dev/usb2/storage/umass2.c Sync with old USB stack. src/lib/libusb20/libusb20.3 Add more documentation. src/lib/libusb20/libusb20.c Various bugfixes and improvements. src/usr.sbin/usbconfig/dump.c src/usr.sbin/usbconfig/usbconfig.c New commands for dumping strings and doing custom USB requests from the command line. Remove keyword requirements from generated files: "head/sys/dev/usb2/include/usb2_devid.h" "head/sys/dev/usb2/include/usb2_devtable.h" --- etc/mtree/BSD.include.dist | 4 + include/Makefile | 2 +- lib/Makefile | 4 +- lib/libusb20/libusb20.3 | 194 +- lib/libusb20/libusb20.c | 58 +- lib/libusb20/libusb20.h | 3 +- lib/libusb20/libusb20_compat01.c | 69 +- lib/libusb20/libusb20_compat01.h | 2 +- lib/libusb20/libusb20_desc.c | 12 +- lib/libusb20/libusb20_desc.h | 2 +- lib/libusb20/libusb20_ugen20.c | 201 +- share/man/man7/hier.7 | 2 + share/mk/bsd.libnames.mk | 1 + sys/dev/usb/rio500_usb.h | 2 +- sys/dev/usb2/bluetooth/ng_ubt2.c | 1 + sys/dev/usb2/controller/ehci2.c | 16 +- sys/dev/usb2/controller/ehci2.h | 6 + sys/dev/usb2/controller/uss820dci_pccard.c | 266 --- sys/dev/usb2/core/usb2_busdma.c | 51 +- sys/dev/usb2/core/usb2_core.h | 27 +- sys/dev/usb2/core/usb2_dev.c | 423 ++-- sys/dev/usb2/core/usb2_dev.h | 15 +- sys/dev/usb2/core/usb2_device.c | 68 +- sys/dev/usb2/core/usb2_generic.c | 212 +- sys/dev/usb2/core/usb2_generic.h | 1 + sys/dev/usb2/core/usb2_hub.c | 17 +- sys/dev/usb2/core/usb2_request.c | 25 +- sys/dev/usb2/core/usb2_util.c | 2 +- sys/dev/usb2/core/usbdevs | 2482 -------------------- sys/dev/usb2/image/uscanner2.c | 2 +- sys/dev/usb2/include/Makefile | 4 +- sys/dev/usb2/include/urio2_ioctl.h | 41 - sys/dev/usb2/include/usb2_devid.h | 14 +- sys/dev/usb2/include/usb2_devtable.h | 40 +- sys/dev/usb2/include/usb2_ioctl.h | 5 + sys/dev/usb2/serial/ubsa2.c | 20 - sys/dev/usb2/serial/ugensa2.c | 4 +- sys/dev/usb2/sound/uaudio2.c | 6 +- sys/dev/usb2/storage/umass2.c | 4 + sys/dev/usb2/storage/urio2.c | 2 +- usr.sbin/Makefile | 2 + usr.sbin/usbconfig/dump.c | 76 +- usr.sbin/usbconfig/usbconfig.c | 148 +- 43 files changed, 1021 insertions(+), 3515 deletions(-) delete mode 100644 sys/dev/usb2/controller/uss820dci_pccard.c delete mode 100644 sys/dev/usb2/core/usbdevs delete mode 100644 sys/dev/usb2/include/urio2_ioctl.h diff --git a/etc/mtree/BSD.include.dist b/etc/mtree/BSD.include.dist index dfc53b723785..adbb7d84b5cb 100644 --- a/etc/mtree/BSD.include.dist +++ b/etc/mtree/BSD.include.dist @@ -120,6 +120,10 @@ .. usb .. + usb2 + include + .. + .. utopia .. vkbd diff --git a/include/Makefile b/include/Makefile index f03171ac43b7..93292dc11300 100644 --- a/include/Makefile +++ b/include/Makefile @@ -54,7 +54,7 @@ LSUBDIRS= cam/scsi \ security/mac_mls security/mac_partition \ ufs/ffs ufs/ufs -LSUBSUBDIRS= dev/mpt/mpilib +LSUBSUBDIRS= dev/mpt/mpilib dev/usb2/include .if ${MACHINE_ARCH} == "powerpc" _dev_powermac_nvram= dev/powermac_nvram diff --git a/lib/Makefile b/lib/Makefile index 1b5ba44f8a8a..a44335c834eb 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -38,7 +38,8 @@ SUBDIR= ${_csu} libc libbsm libcom_err libcrypt libelf libkvm msun libmd \ ${_libpmc} libproc librt ${_libsdp} ${_libsm} ${_libsmb} \ ${_libsmdb} \ ${_libsmutil} libstand ${_libtelnet} ${_libthr} libthread_db libufs \ - libugidfw ${_libusbhid} ${_libvgl} libwrap liby libz ${_bind} + libugidfw ${_libusbhid} ${_libusb20} ${_libvgl} libwrap liby libz \ + ${_bind} .if exists(${.CURDIR}/csu/${MACHINE_ARCH}-elf) _csu=csu/${MACHINE_ARCH}-elf @@ -136,6 +137,7 @@ _libtelnet= libtelnet .if ${MK_USB} != "no" _libusbhid= libusbhid +_libusb20= libusb20 .endif .include diff --git a/lib/libusb20/libusb20.3 b/lib/libusb20/libusb20.3 index 975bc637ae68..414c81f24706 100644 --- a/lib/libusb20/libusb20.3 +++ b/lib/libusb20/libusb20.3 @@ -60,9 +60,9 @@ USB through the USB file system interface. . .Pp . -.Fn libusb20_tr_close +.Fn libusb20_tr_close pxfer This function will release all kernel resources associated with an USB -.Fa xfer . +.Fa pxfer . . This function returns zero upon success. . @@ -70,13 +70,13 @@ Non-zero return values indicate a LIBUSB20_ERROR value. . .Pp . -.Fn libusb20_tr_open +.Fn libusb20_tr_open pxfer max_buf_size max_frame_count ep_no This function will allocate kernel resources like -.Fa MaxBufSize +.Fa max_buf_size and -.Fa MaxFrameCount +.Fa max_frame_count associated with an USB -.Fa xfer +.Fa pxfer and bind the transfer to the specified .Fa ep_no . . @@ -86,7 +86,7 @@ Non-zero return values indicate a LIBUSB20_ERROR value. . .Pp . -.Fn libusb20_tr_get_pointer +.Fn libusb20_tr_get_pointer pdev tr_index This function will return a pointer to the allocated USB transfer according to the .Fa pdev and @@ -97,32 +97,32 @@ This function returns NULL in case of failure. . .Pp . -.Fn libusb20_tr_get_time_complete +.Fn libusb20_tr_get_time_complete pxfer This function will return the completion time of an USB transfer in millisecond units. This function is most useful for isochronous USB transfers when doing echo cancelling. . .Pp . -.Fn libusb20_tr_get_actual_frames +.Fn libusb20_tr_get_actual_frames pxfer This function will return the actual number of USB frames after an USB transfer completed. A value of zero means that no data was transferred. . .Pp . -.Fn libusb20_tr_get_actual_length +.Fn libusb20_tr_get_actual_length pxfer This function will return the sum of the actual length for all transferred USB frames for the given USB transfer. . .Pp . -.Fn libusb20_tr_get_max_frames +.Fn libusb20_tr_get_max_frames pxfer This function will return the maximum number of USB frames that were allocated when an USB transfer was setup for the given USB transfer. . .Pp . -.Fn libusb20_tr_get_max_packet_length +.Fn libusb20_tr_get_max_packet_length pxfer This function will return the maximum packet length in bytes associated with the given USB transfer. . @@ -132,20 +132,20 @@ packets are avoided for proxy buffers. . .Pp . -.Fn libusb20_tr_get_max_total_length +.Fn libusb20_tr_get_max_total_length pxfer This function will return the maximum value for the length sum of all USB frames associated with an USB transfer. . .Pp . -.Fn libusb20_tr_get_status +.Fn libusb20_tr_get_status pxfer This function will return the status of an USB transfer. . Status values are defined by a set of LIBUSB20_TRANSFER_XXX enums. . .Pp . -.Fn libusb20_tr_pending +.Fn libusb20_tr_pending pxfer This function will return non-zero if the given USB transfer is pending for completion. . @@ -153,12 +153,12 @@ Else this function returns zero. . .Pp . -.Fn libusb20_tr_callback_wrapper +.Fn libusb20_tr_callback_wrapper pxfer This is an internal function used to wrap asynchronous USB callbacks. . .Pp . -.Fn libusb20_tr_clear_stall_sync +.Fn libusb20_tr_clear_stall_sync pxfer This is an internal function used to synchronously clear the stall on the given USB transfer. . @@ -171,13 +171,13 @@ been called. . .Pp . -.Fn libusb20_tr_drain +.Fn libusb20_tr_drain pxfer This function will stop the given USB transfer and will not return until the USB transfer has been stopped in hardware. . .Pp . -.Fn libusb20_tr_set_buffer +.Fn libusb20_tr_set_buffer pxfer pbuf fr_index This function is used to set the .Fa buffer pointer for the given USB transfer and @@ -188,7 +188,7 @@ Typically the frame index is zero. . .Pp . -.Fn libusb20_tr_set_callback +.Fn libusb20_tr_set_callback pxfer pcallback This function is used to set the USB callback for asynchronous USB transfers. . @@ -196,7 +196,7 @@ The callback type is defined by libusb20_tr_callback_t. . .Pp . -.Fn libusb20_tr_set_flags +.Fn libusb20_tr_set_flags pxfer flags This function is used to set various USB flags for the given USB transfer. .Bl -tag .It LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK @@ -211,22 +211,22 @@ Will do a clear-stall before starting the transfer. . .Pp . -.Fn libusb20_tr_set_length +.Fn libusb20_tr_set_length pxfer length fr_index This function sets the length of a given USB transfer and frame index. . .Pp . -.Fn libusb20_tr_set_priv_sc0 +.Fn libusb20_tr_set_priv_sc0 pxfer psc0 This function sets private driver pointer number zero. . .Pp . -.Fn libusb20_tr_set_priv_sc1 +.Fn libusb20_tr_set_priv_sc1 pxfer psc1 This function sets private driver pointer number one. . .Pp . -.Fn libusb20_tr_set_timeout +.Fn libusb20_tr_set_timeout pxfer timeout This function sets the timeout for the given USB transfer. . A timeout value of zero means no timeout. @@ -235,35 +235,35 @@ The timeout is given in milliseconds. . .Pp . -.Fn libusb20_tr_set_total_frames +.Fn libusb20_tr_set_total_frames pxfer nframes This function sets the total number of frames that should be executed when the USB transfer is submitted. . The total number of USB frames must be less than the maximum number of USB frames associated with the given USB transfer. . .Pp . -.Fn libusb20_tr_setup_bulk +.Fn libusb20_tr_setup_bulk pxfer pbuf length timeout This function is a helper function for setting up a single frame USB BULK transfer. . .Pp . -.Fn libusb20_tr_setup_control +.Fn libusb20_tr_setup_control pxfer psetup pbuf timeout This function is a helper function for setting up a single or dual frame USB CONTROL transfer depending on the control transfer length. . .Pp . -.Fn libusb20_tr_setup_intr +.Fn libusb20_tr_setup_intr pxfer pbuf length timeout This function is a helper function for setting up a single frame USB INTERRUPT transfer. . .Pp . -.Fn libusb20_tr_setup_isoc +.Fn libusb20_tr_setup_isoc pxfer pbuf length fr_index This function is a helper function for setting up a multi frame USB ISOCHRONOUS transfer. . .Pp . -.Fn libusb20_tr_start +.Fn libusb20_tr_start pxfer This function will get the USB transfer started, if not already started. . @@ -273,7 +273,7 @@ This function is non-blocking. . .Pp . -.Fn libusb20_tr_stop +.Fn libusb20_tr_stop pxfer This function will get the USB transfer stopped, if not already stopped. . This function is non-blocking, which means that the actual stop can @@ -281,20 +281,20 @@ happen after the return of this function. . .Pp . -.Fn libusb20_tr_submit +.Fn libusb20_tr_submit pxfer This function will get the USB transfer queued in hardware. . . .Pp . -.Fn libusb20_tr_get_priv_sc0 +.Fn libusb20_tr_get_priv_sc0 pxfer This function returns private driver pointer number zero associated with an USB transfer. . . .Pp . -.Fn libusb20_tr_get_priv_sc1 +.Fn libusb20_tr_get_priv_sc1 pxfer This function returns private driver pointer number one associated with an USB transfer. . @@ -303,17 +303,17 @@ with an USB transfer. . .Pp . -.Fn libusb20_dev_get_backend_name +.Fn libusb20_dev_get_backend_name pdev This function returns a zero terminated string describing the backend used. . .Pp . -.Fn libusb20_dev_get_desc +.Fn libusb20_dev_get_desc pdev This function returns a zero terminated string describing the given USB device. . .Pp . -.Fn libusb20_dev_claim_interface +.Fn libusb20_dev_claim_interface pdev iface_index This function will try to claim the given USB interface given by .Fa iface_index . This function returns zero on success else a LIBUSB20_ERROR value is @@ -321,7 +321,7 @@ returned. . .Pp . -.Fn libusb20_dev_close +.Fn libusb20_dev_close pdev This function will close the given USB device. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -329,7 +329,7 @@ returned. . .Pp . -.Fn libusb20_dev_detach_kernel_driver +.Fn libusb20_dev_detach_kernel_driver pdev iface_index This function will try to detach the kernel driver for the USB interface given by .Fa iface_index . . @@ -338,7 +338,7 @@ returned. . .Pp . -.Fn libusb20_dev_set_config_index +.Fn libusb20_dev_set_config_index pdev config_index This function will try to set the configuration index on an USB device. . @@ -350,12 +350,12 @@ This function returns zero on success else a LIBUSB20_ERROR value is returned. . .Pp . -.Fn libusb20_dev_get_debug +.Fn libusb20_dev_get_debug pdev This function returns the debug level of an USB device. . .Pp . -.Fn libusb20_dev_get_fd +.Fn libusb20_dev_get_fd pdev This function returns the file descriptor of the given USB device. . A negative value is returned when no file descriptor is present. @@ -364,7 +364,7 @@ The file descriptor can be used for polling purposes. . .Pp . -.Fn libusb20_dev_kernel_driver_active +.Fn libusb20_dev_kernel_driver_active pdev iface_index This function returns a non-zero value if a kernel driver is active on the given USB interface. . @@ -372,7 +372,7 @@ Else zero is returned. . .Pp . -.Fn libusb20_dev_open +.Fn libusb20_dev_open pdev transfer_max This function opens an USB device so that setting up USB transfers becomes possible. . @@ -387,7 +387,7 @@ opened. . .Pp . -.Fn libusb20_dev_process +.Fn libusb20_dev_process pdev This function is called to sync kernel USB transfers with userland USB transfers. . @@ -397,7 +397,7 @@ detached. . .Pp . -.Fn libusb20_dev_release_interface +.Fn libusb20_dev_release_interface pdev iface_index This function will try to release a claimed USB interface for the specified USB device. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -405,7 +405,7 @@ returned. . .Pp . -.Fn libusb20_dev_request_sync +.Fn libusb20_dev_request_sync pdev psetup pdata pactlen timeout flags This function will perform a synchronous control request on the given USB device. . @@ -428,7 +428,7 @@ returned. . .Pp . -.Fn libusb20_dev_req_string_sync +.Fn libusb20_dev_req_string_sync pdev index lang_id pbuf len This function will synchronously request an USB string by language ID and string index into the given buffer limited by a maximum length. . @@ -437,7 +437,7 @@ returned. . .Pp . -.Fn libusb20_dev_req_string_simple_sync +.Fn libusb20_dev_req_string_simple_sync pdev index pbuf len This function will synchronously request an USB string using the default language ID and convert the string into ASCII before storing the string into the given buffer limited by a maximum length which @@ -449,7 +449,7 @@ returned. . .Pp . -.Fn libusb20_dev_reset +.Fn libusb20_dev_reset pdev This function will try to BUS reset the given USB device and restore the last set USB configuration. . @@ -458,7 +458,7 @@ returned. . .Pp . -.Fn libusb20_dev_set_power_mode +.Fn libusb20_dev_set_power_mode pdev power_mode This function sets the power mode of the USB device. . Valid power modes: @@ -475,13 +475,13 @@ returned. . .Pp . -.Fn libusb20_dev_get_power_mode +.Fn libusb20_dev_get_power_mode pdev This function returns the currently selected power mode for the given USB device. . .Pp . -.Fn libusb20_dev_set_alt_index +.Fn libusb20_dev_set_alt_index pdev iface_index alt_index This function will try to set the given alternate index for the given USB interface index. . @@ -490,7 +490,7 @@ returned. . .Pp . -.Fn libusb20_dev_set_owner +.Fn libusb20_dev_set_owner pdev uid gid This function will set the ownership of the given USB device. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -498,7 +498,7 @@ returned. . .Pp . -.Fn libusb20_dev_set_perm +.Fn libusb20_dev_set_perm pdev mode This function will set the permissions of the given USB device. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -506,7 +506,7 @@ returned. . .Pp . -.Fn libusb20_dev_set_iface_owner +.Fn libusb20_dev_set_iface_owner pdev iface_index uid gid This function will set the ownership of the given USB interface. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -514,7 +514,7 @@ returned. . .Pp . -.Fn libusb20_dev_set_iface_perm +.Fn libusb20_dev_set_iface_perm pdev iface_index mode This function will set the permissions of the given USB interface. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -522,7 +522,7 @@ returned. . .Pp . -.Fn libusb20_dev_get_owner +.Fn libusb20_dev_get_owner pdev puid pgid This function will retrieve the current USB device ownership. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -530,7 +530,7 @@ returned. . .Pp . -.Fn libusb20_dev_get_perm +.Fn libusb20_dev_get_perm pdev pmode This function will retrieve the current USB device permissions. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -538,7 +538,7 @@ returned. . .Pp . -.Fn libusb20_dev_get_iface_owner +.Fn libusb20_dev_get_iface_owner pdev iface_index puid pgid This function will retrieve the current USB interface ownership for the given USB interface. . @@ -547,7 +547,7 @@ returned. . .Pp . -.Fn libusb20_dev_get_iface_perm +.Fn libusb20_dev_get_iface_perm pdev iface_index pmode This function will retrieve the current USB interface permissions for the given USB interface. . @@ -556,7 +556,7 @@ returned. . .Pp . -.Fn libusb20_dev_get_device_desc +.Fn libusb20_dev_get_device_desc pdev This function returns a pointer to the decoded and host endian version of the device descriptor. . @@ -564,7 +564,7 @@ The USB device need not be opened when calling this function. . .Pp . -.Fn libusb20_dev_alloc_config +.Fn libusb20_dev_alloc_config pdev config_index This function will read out and decode the USB config descriptor for the given USB device and config index. This function returns a pointer to the decoded configuration which must eventually be passed to @@ -572,24 +572,24 @@ free(). NULL is returned in case of failure. . .Pp . -.Fn libusb20_dev_alloc(void) +.Fn libusb20_dev_alloc void This is an internal function to allocate a new USB device. . .Pp . -.Fn libusb20_dev_get_address +.Fn libusb20_dev_get_address pdev This function returns the internal and not necessarily the real hardware address of the given USB device. . .Pp . -.Fn libusb20_dev_get_bus_number +.Fn libusb20_dev_get_bus_number pdev This function return the internal bus number which the given USB device belongs to. . .Pp . -.Fn libusb20_dev_get_mode +.Fn libusb20_dev_get_mode pdev This function returns the current operation mode of the USB entity. . Valid return values are: @@ -600,7 +600,7 @@ Valid return values are: . .Pp . -.Fn libusb20_dev_get_speed +.Fn libusb20_dev_get_speed pdev This function returns the current speed of the given USB device. . .Bl -tag @@ -614,24 +614,24 @@ This function returns the current speed of the given USB device. . .Pp . -.Fn libusb20_dev_get_config_index +.Fn libusb20_dev_get_config_index pdev This function returns the currently select config index for the given USB device. . .Pp . -.Fn libusb20_dev_free +.Fn libusb20_dev_free pdev This function will free the given USB device and all associated USB transfers. . .Pp . -.Fn libusb20_dev_set_debug +.Fn libusb20_dev_set_debug pdev debug_level This function will set the debug level for the given USB device. . .Pp . -.Fn libusb20_dev_wait_process +.Fn libusb20_dev_wait_process pdev timeout This function will wait until a pending USB transfer has completed on the given USB device. . @@ -641,7 +641,7 @@ function. . .Sh USB BUS OPERATIONS . -.Fn libusb20_bus_set_owner +.Fn libusb20_bus_set_owner pbackend bus_index uid gid This function will set the ownership for the given USB bus. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -649,7 +649,7 @@ returned. . .Pp . -.Fn libusb20_bus_set_perm +.Fn libusb20_bus_set_perm pbackend bus_index mode This function will set the permissions for the given USB bus. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -657,7 +657,7 @@ returned. . .Pp . -.Fn libusb20_bus_get_owner +.Fn libusb20_bus_get_owner pbackend bus_index puid pgid This function will retrieve the ownership for the given USB bus. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -665,7 +665,7 @@ returned. . .Pp . -.Fn libusb20_bus_get_perm +.Fn libusb20_bus_get_perm pbackend bus_index pmode This function will retrieve the permissions for the given USB bus. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -674,7 +674,7 @@ returned. . .Sh USB BACKEND OPERATIONS . -.Fn libusb20_be_get_dev_quirk +.Fn libusb20_be_get_dev_quirk pbackend index pquirk This function will return the device quirk according to .Fa index into the libusb20_quirk structure pointed to by @@ -687,7 +687,7 @@ returned. . .Pp . -.Fn libusb20_be_get_quirk_name +.Fn libusb20_be_get_quirk_name pbackend index pquirk This function will return the quirk name according to .Fa index into the libusb20_quirk structure pointed to by @@ -700,7 +700,7 @@ returned. . .Pp . -.Fn libusb20_be_add_dev_quirk +.Fn libusb20_be_add_dev_quirk pbackend pquirk This function will add the libusb20_quirk structure pointed to by the .Fa pq argument into the device quirk list. @@ -713,7 +713,7 @@ returned. . .Pp . -.Fn libusb20_be_remove_dev_quirk +.Fn libusb20_be_remove_dev_quirk pbackend pquirk This function will remove the quirk matching the libusb20_quirk structure pointed to by the .Fa pq argument from the device quirk list. @@ -726,7 +726,7 @@ returned. . .Pp . -.Fn libusb20_be_set_owner +.Fn libusb20_be_set_owner pbackend uid gid This function will set the ownership for the given backend. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -734,7 +734,7 @@ returned. . .Pp . -.Fn libusb20_be_set_perm +.Fn libusb20_be_set_perm pbackend mode This function will set the permissions for the given backend. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -742,7 +742,7 @@ returned. . .Pp . -.Fn libusb20_be_get_owner +.Fn libusb20_be_get_owner pbackend puid pgid This function will retrieve the ownership of the given backend. . This function returns zero on success else a LIBUSB20_ERROR value is @@ -750,7 +750,7 @@ returned. . .Pp . -.Fn libusb20_be_get_perm +.Fn libusb20_be_get_perm pbackend pmode This function will retrieve the permissions of the given backend. . . @@ -759,20 +759,20 @@ returned. . .Pp . -.Fn libusb20_be_alloc +.Fn libusb20_be_alloc pmethods This is an internal function to allocate a USB backend. . .Pp -.Fn libusb20_be_alloc_default -.Fn libusb20_be_alloc_freebsd -.Fn libusb20_be_alloc_linux +.Fn libusb20_be_alloc_default void +.Fn libusb20_be_alloc_freebsd void +.Fn libusb20_be_alloc_linux void These functions are used to allocate a specific USB backend or the operating system default USB backend. Allocating a backend is a way to scan for currently present USB devices. . .Pp . -.Fn libusb20_be_device_foreach +.Fn libusb20_be_device_foreach pbackend pdev This function is used to iterate USB devices present in a USB backend. . The starting value of @@ -785,7 +785,7 @@ If NULL is returned the end of the USB device list has been reached. . .Pp . -.Fn libusb20_be_dequeue_device +.Fn libusb20_be_dequeue_device pbackend pdev This function will dequeue the given USB device pointer from the backend USB device list. . @@ -793,20 +793,20 @@ Dequeued USB devices will not be freed when the backend is freed. . .Pp . -.Fn libusb20_be_enqueue_device +.Fn libusb20_be_enqueue_device pbackend pdev This function will enqueue the given USB device pointer in the backend USB device list. . Enqueued USB devices will get freed when the backend is freed. . .Pp . -.Fn libusb20_be_free +.Fn libusb20_be_free pbackend This function will free the given backend and all USB devices in its device list. . . .Sh USB DESCRIPTOR PARSING . -.Fn libusb20_me_get_1 +.Fn libusb20_me_get_1 pie offset This function will return a byte at the given byte offset of a message entity. . @@ -814,7 +814,7 @@ This function is safe against invalid offsets. . .Pp . -.Fn libusb20_me_get_2 +.Fn libusb20_me_get_2 pie offset This function will return a little endian 16-bit value at the given byte offset of a message entity. . @@ -822,7 +822,7 @@ This function is safe against invalid offsets. . .Pp . -.Fn libusb20_me_encode +.Fn libusb20_me_encode pbuf len pdecoded This function will encode a so-called *DECODED structure into binary format. . @@ -834,7 +834,7 @@ location. . .Pp . -.Fn libusb20_me_decode +.Fn libusb20_me_decode pbuf len pdecoded This function will decode a binary structure into a so-called *DECODED structure. . diff --git a/lib/libusb20/libusb20.c b/lib/libusb20/libusb20.c index 432cd993b438..f9c99cbe111c 100644 --- a/lib/libusb20/libusb20.c +++ b/lib/libusb20/libusb20.c @@ -550,6 +550,9 @@ libusb20_dev_open(struct libusb20_device *pdev, uint16_t nTransferMax) xfer->callback = &dummy_callback; } + /* set "nTransfer" early */ + pdev->nTransfer = nTransferMax; + error = (pdev->beMethods->open_device) (pdev, nTransferMax); if (error) { @@ -562,7 +565,6 @@ libusb20_dev_open(struct libusb20_device *pdev, uint16_t nTransferMax) pdev->nTransfer = 0; } else { pdev->is_opened = 1; - pdev->nTransfer = nTransferMax; } return (error); } @@ -647,7 +649,7 @@ libusb20_dev_request_sync(struct libusb20_device *pdev, int libusb20_dev_req_string_sync(struct libusb20_device *pdev, - uint8_t index, uint16_t langid, void *ptr, uint16_t len) + uint8_t str_index, uint16_t langid, void *ptr, uint16_t len) { struct LIBUSB20_CONTROL_SETUP_DECODED req; int error; @@ -667,7 +669,7 @@ libusb20_dev_req_string_sync(struct libusb20_device *pdev, LIBUSB20_RECIPIENT_DEVICE | LIBUSB20_ENDPOINT_IN; req.bRequest = LIBUSB20_REQUEST_GET_DESCRIPTOR; - req.wValue = (LIBUSB20_DT_STRING << 8) | index; + req.wValue = (LIBUSB20_DT_STRING << 8) | str_index; req.wIndex = langid; req.wLength = 4; /* bytes */ @@ -695,7 +697,7 @@ libusb20_dev_req_string_sync(struct libusb20_device *pdev, int libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev, - uint8_t index, void *ptr, uint16_t len) + uint8_t str_index, void *ptr, uint16_t len) { char *buf; int error; @@ -712,26 +714,23 @@ libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev, /* too short buffer */ return (LIBUSB20_ERROR_INVALID_PARAM); } - /* - * Make sure that there is sensible contents in the buffer in case - * of an error: - */ - *(uint8_t *)ptr = 0; - error = libusb20_dev_req_string_sync(pdev, 0, 0, temp, sizeof(temp)); - if (error < 0) + if (error < 0) { + *(uint8_t *)ptr = 0; /* zero terminate */ return (error); - + } langid = temp[2] | (temp[3] << 8); - error = libusb20_dev_req_string_sync(pdev, index, + error = libusb20_dev_req_string_sync(pdev, str_index, langid, temp, sizeof(temp)); - if (error < 0) + if (error < 0) { + *(uint8_t *)ptr = 0; /* zero terminate */ return (error); - + } if (temp[0] < 2) { /* string length is too short */ + *(uint8_t *)ptr = 0; /* zero terminate */ return (LIBUSB20_ERROR_OTHER); } /* reserve one byte for terminating zero */ @@ -762,14 +761,16 @@ libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev, *buf = c >> 8; swap = 2; } else { - *buf = '.'; + /* skip invalid character */ + continue; } /* * Filter by default - we don't allow greater and less than * signs because they might confuse the dmesg printouts! */ if ((*buf == '<') || (*buf == '>') || (!isprint(*buf))) { - *buf = '.'; + /* skip invalid character */ + continue; } buf++; } @@ -836,7 +837,7 @@ uint8_t libusb20_dev_get_config_index(struct libusb20_device *pdev) { int error; - uint8_t index; + uint8_t cfg_index; uint8_t do_close; if (!pdev->is_opened) { @@ -850,16 +851,16 @@ libusb20_dev_get_config_index(struct libusb20_device *pdev) do_close = 0; } - error = (pdev->methods->get_config_index) (pdev, &index); + error = (pdev->methods->get_config_index) (pdev, &cfg_index); if (error) { - index = 0 - 1; /* current config index */ + cfg_index = 0 - 1; /* current config index */ } if (do_close) { if (libusb20_dev_close(pdev)) { /* ignore */ } } - return (index); + return (cfg_index); } uint8_t @@ -887,7 +888,7 @@ libusb20_dev_process(struct libusb20_device *pdev) void libusb20_dev_wait_process(struct libusb20_device *pdev, int timeout) { - struct pollfd pfd[2]; + struct pollfd pfd[1]; if (!pdev->is_opened) { return; @@ -895,11 +896,8 @@ libusb20_dev_wait_process(struct libusb20_device *pdev, int timeout) pfd[0].fd = pdev->file; pfd[0].events = (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM); pfd[0].revents = 0; - pfd[1].fd = 0; /* standard input */ - pfd[1].events = (POLLIN | POLLRDNORM); - pfd[1].revents = 0; - if (poll(pfd, 2, timeout)) { + if (poll(pfd, 1, timeout)) { /* ignore any error */ } return; @@ -1071,16 +1069,16 @@ libusb20_bus_get_perm(struct libusb20_backend *pbe, uint8_t bus, mode_t *mode) int libusb20_be_get_dev_quirk(struct libusb20_backend *pbe, - uint16_t index, struct libusb20_quirk *pq) + uint16_t quirk_index, struct libusb20_quirk *pq) { - return ((pbe->methods->root_get_dev_quirk) (pbe, index, pq)); + return ((pbe->methods->root_get_dev_quirk) (pbe, quirk_index, pq)); } int libusb20_be_get_quirk_name(struct libusb20_backend *pbe, - uint16_t index, struct libusb20_quirk *pq) + uint16_t quirk_index, struct libusb20_quirk *pq) { - return ((pbe->methods->root_get_quirk_name) (pbe, index, pq)); + return ((pbe->methods->root_get_quirk_name) (pbe, quirk_index, pq)); } int diff --git a/lib/libusb20/libusb20.h b/lib/libusb20/libusb20.h index 7fb8e68bae67..d696b634116c 100644 --- a/lib/libusb20/libusb20.h +++ b/lib/libusb20/libusb20.h @@ -199,7 +199,7 @@ struct libusb20_quirk { /* USB transfer operations */ int libusb20_tr_close(struct libusb20_transfer *xfer); -int libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t pMaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no); +int libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no); struct libusb20_transfer *libusb20_tr_get_pointer(struct libusb20_device *pdev, uint16_t tr_index); uint16_t libusb20_tr_get_time_complete(struct libusb20_transfer *xfer); uint32_t libusb20_tr_get_actual_frames(struct libusb20_transfer *xfer); @@ -297,6 +297,7 @@ struct libusb20_backend *libusb20_be_alloc(const struct libusb20_backend_methods struct libusb20_backend *libusb20_be_alloc_default(void); struct libusb20_backend *libusb20_be_alloc_freebsd(void); struct libusb20_backend *libusb20_be_alloc_linux(void); +struct libusb20_backend *libusb20_be_alloc_ugen20(void); struct libusb20_device *libusb20_be_device_foreach(struct libusb20_backend *pbe, struct libusb20_device *pdev); void libusb20_be_dequeue_device(struct libusb20_backend *pbe, struct libusb20_device *pdev); void libusb20_be_enqueue_device(struct libusb20_backend *pbe, struct libusb20_device *pdev); diff --git a/lib/libusb20/libusb20_compat01.c b/lib/libusb20/libusb20_compat01.c index e9d9ebe12a16..b63c5e965d93 100644 --- a/lib/libusb20/libusb20_compat01.c +++ b/lib/libusb20/libusb20_compat01.c @@ -131,7 +131,7 @@ usb_get_transfer_by_ep_no(usb_dev_handle * dev, uint8_t ep_no) x = (ep_no & LIBUSB20_ENDPOINT_ADDRESS_MASK) * 2; if (ep_no & LIBUSB20_ENDPOINT_DIR_MASK) { - /* this is a IN endpoint */ + /* this is an IN endpoint */ x |= 1; } speed = libusb20_dev_get_speed(pdev); @@ -194,13 +194,13 @@ usb_close(usb_dev_handle * dev) } int -usb_get_string(usb_dev_handle * dev, int index, +usb_get_string(usb_dev_handle * dev, int strindex, int langid, char *buf, size_t buflen) { int err; err = libusb20_dev_req_string_sync((void *)dev, - index, langid, buf, buflen); + strindex, langid, buf, buflen); if (err) return (-1); @@ -209,13 +209,13 @@ usb_get_string(usb_dev_handle * dev, int index, } int -usb_get_string_simple(usb_dev_handle * dev, int index, +usb_get_string_simple(usb_dev_handle * dev, int strindex, char *buf, size_t buflen) { int err; err = libusb20_dev_req_string_simple_sync((void *)dev, - index, buf, buflen); + strindex, buf, buflen); if (err) return (-1); @@ -225,23 +225,23 @@ usb_get_string_simple(usb_dev_handle * dev, int index, int usb_get_descriptor_by_endpoint(usb_dev_handle * udev, int ep, uint8_t type, - uint8_t index, void *buf, int size) + uint8_t ep_index, void *buf, int size) { memset(buf, 0, size); return (usb_control_msg(udev, ep | USB_ENDPOINT_IN, - USB_REQ_GET_DESCRIPTOR, (type << 8) + index, 0, + USB_REQ_GET_DESCRIPTOR, (type << 8) + ep_index, 0, buf, size, 1000)); } int -usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t index, +usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t desc_index, void *buf, int size) { memset(buf, 0, size); return (usb_control_msg(udev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, - (type << 8) + index, 0, buf, size, 1000)); + (type << 8) + desc_index, 0, buf, size, 1000)); } int @@ -616,33 +616,37 @@ int usb_bulk_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout) { - return (usb_std_io(dev, ep, bytes, size, timeout, 0)); + return (usb_std_io(dev, ep & ~USB_ENDPOINT_DIR_MASK, + bytes, size, timeout, 0)); } int usb_bulk_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout) { - return (usb_std_io(dev, ep, bytes, size, timeout, 0)); + return (usb_std_io(dev, ep | USB_ENDPOINT_DIR_MASK, + bytes, size, timeout, 0)); } int usb_interrupt_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout) { - return (usb_std_io(dev, ep, bytes, size, timeout, 1)); + return (usb_std_io(dev, ep & ~USB_ENDPOINT_DIR_MASK, + bytes, size, timeout, 1)); } int usb_interrupt_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout) { - return (usb_std_io(dev, ep, bytes, size, timeout, 1)); + return (usb_std_io(dev, ep | USB_ENDPOINT_DIR_MASK, + bytes, size, timeout, 1)); } int usb_control_msg(usb_dev_handle * dev, int requesttype, int request, - int value, int index, char *bytes, int size, int timeout) + int value, int wIndex, char *bytes, int size, int timeout) { struct LIBUSB20_CONTROL_SETUP_DECODED req; int err; @@ -653,7 +657,7 @@ usb_control_msg(usb_dev_handle * dev, int requesttype, int request, req.bmRequestType = requesttype; req.bRequest = request; req.wValue = value; - req.wIndex = index; + req.wIndex = wIndex; req.wLength = size; err = libusb20_dev_request_sync((void *)dev, &req, bytes, @@ -666,11 +670,40 @@ usb_control_msg(usb_dev_handle * dev, int requesttype, int request, } int -usb_set_configuration(usb_dev_handle * dev, int configuration) +usb_set_configuration(usb_dev_handle * udev, int bConfigurationValue) { + struct usb_device *dev; int err; + uint8_t i; - err = libusb20_dev_set_config_index((void *)dev, configuration); + /* + * Need to translate from "bConfigurationValue" to + * configuration index: + */ + + if (bConfigurationValue == 0) { + /* unconfigure */ + i = 255; + } else { + /* lookup configuration index */ + dev = usb_device(udev); + + /* check if the configuration array is not there */ + if (dev->config == NULL) { + return (-1); + } + for (i = 0;; i++) { + if (i == dev->descriptor.bNumConfigurations) { + /* "bConfigurationValue" not found */ + return (-1); + } + if ((dev->config + i)->bConfigurationValue == bConfigurationValue) { + break; + } + } + } + + err = libusb20_dev_set_config_index((void *)udev, i); if (err) return (-1); @@ -754,7 +787,7 @@ usb_reset(usb_dev_handle * dev) return (0); } -char * +const char * usb_strerror(void) { /* TODO */ diff --git a/lib/libusb20/libusb20_compat01.h b/lib/libusb20/libusb20_compat01.h index 333793d5e996..3963a9f0355c 100644 --- a/lib/libusb20/libusb20_compat01.h +++ b/lib/libusb20/libusb20_compat01.h @@ -291,7 +291,7 @@ int usb_set_altinterface(usb_dev_handle * dev, int alternate); int usb_resetep(usb_dev_handle * dev, unsigned int ep); int usb_clear_halt(usb_dev_handle * dev, unsigned int ep); int usb_reset(usb_dev_handle * dev); -char *usb_strerror(void); +const char *usb_strerror(void); void usb_init(void); void usb_set_debug(int level); int usb_find_busses(void); diff --git a/lib/libusb20/libusb20_desc.c b/lib/libusb20/libusb20_desc.c index fbbd96fc980f..bba4d2515796 100644 --- a/lib/libusb20/libusb20_desc.c +++ b/lib/libusb20/libusb20_desc.c @@ -84,8 +84,8 @@ libusb20_parse_config_desc(const void *config_desc) /* get "wTotalLength" and setup "pcdesc" */ pcdesc.ptr = LIBUSB20_ADD_BYTES(config_desc, 0); pcdesc.len = - ((uint8_t *)config_desc)[2] | - (((uint8_t *)config_desc)[3] << 8); + ((const uint8_t *)config_desc)[2] | + (((const uint8_t *)config_desc)[3] << 8); pcdesc.type = LIBUSB20_ME_IS_RAW; /* descriptor pre-scan */ @@ -238,7 +238,7 @@ const uint8_t * libusb20_desc_foreach(const struct libusb20_me_struct *pdesc, const uint8_t *psubdesc) { - void *end; + const void *end; if (pdesc == NULL) { return (NULL); @@ -250,8 +250,8 @@ libusb20_desc_foreach(const struct libusb20_me_struct *pdesc, } else { psubdesc = LIBUSB20_ADD_BYTES(psubdesc, psubdesc[0]); } - return (((((void *)psubdesc) >= ((void *)(pdesc->ptr))) && - (((void *)psubdesc) < end) && + return (((((const void *)psubdesc) >= ((void *)(pdesc->ptr))) && + (((const void *)psubdesc) < end) && (LIBUSB20_ADD_BYTES(psubdesc, psubdesc[0]) >= ((void *)(pdesc->ptr))) && (LIBUSB20_ADD_BYTES(psubdesc, psubdesc[0]) <= end) && (psubdesc[0] >= 3)) ? psubdesc : NULL); @@ -306,7 +306,7 @@ libusb20_me_encode(void *ptr, uint16_t len, const void *pd) len_old = len; buf = ptr; pd_offset = sizeof(void *); - pf = (*((struct libusb20_me_format **)pd))->format; + pf = (*((struct libusb20_me_format *const *)pd))->format; /* scan */ diff --git a/lib/libusb20/libusb20_desc.h b/lib/libusb20/libusb20_desc.h index 76bcca8fd991..e5e7c94d30a5 100644 --- a/lib/libusb20/libusb20_desc.h +++ b/lib/libusb20/libusb20_desc.h @@ -63,7 +63,7 @@ extern "C" { #define LIBUSB20_MIN(a,b) (((a) < (b)) ? (a) : (b)) #define LIBUSB20_ADD_BYTES(ptr,off) \ - ((void *)(((const uint8_t *)(ptr)) + (off))) + ((void *)(((const uint8_t *)(ptr)) + (off) - ((const uint8_t *)0))) /* basic message elements */ enum { diff --git a/lib/libusb20/libusb20_ugen20.c b/lib/libusb20/libusb20_ugen20.c index ffbd861de5c2..0ef556218ba3 100644 --- a/lib/libusb20/libusb20_ugen20.c +++ b/lib/libusb20/libusb20_ugen20.c @@ -307,12 +307,57 @@ ugen20_init_backend(struct libusb20_backend *pbe) return (0); /* success */ } +static int +ugen20_tr_renew(struct libusb20_device *pdev) +{ + struct usb2_fs_uninit fs_uninit; + struct usb2_fs_init fs_init; + struct usb2_fs_endpoint *pfse; + int error; + uint32_t size; + uint16_t nMaxTransfer; + + nMaxTransfer = pdev->nTransfer; + error = 0; + + if (nMaxTransfer == 0) { + goto done; + } + size = nMaxTransfer * sizeof(*pfse); + + if (pdev->privBeData != NULL) { + memset(&fs_uninit, 0, sizeof(fs_uninit)); + if (ioctl(pdev->file, USB_FS_UNINIT, &fs_uninit)) { + /* ignore any errors of this kind */ + } + } else { + pfse = malloc(size); + if (pfse == NULL) { + error = LIBUSB20_ERROR_NO_MEM; + goto done; + } + pdev->privBeData = pfse; + } + + /* reset endpoint data */ + memset(pdev->privBeData, 0, size); + + memset(&fs_init, 0, sizeof(fs_init)); + + fs_init.pEndpoints = pdev->privBeData; + fs_init.ep_index_max = nMaxTransfer; + + if (ioctl(pdev->file, USB_FS_INIT, &fs_init)) { + error = LIBUSB20_ERROR_OTHER; + goto done; + } +done: + return (error); +} + static int ugen20_open_device(struct libusb20_device *pdev, uint16_t nMaxTransfer) { - struct usb2_fs_endpoint *pfse = NULL; - struct usb2_fs_init fs_init = { /* zero */ }; - uint32_t size; uint32_t plugtime; char buf[64]; int f; @@ -345,36 +390,27 @@ ugen20_open_device(struct libusb20_device *pdev, uint16_t nMaxTransfer) error = LIBUSB20_ERROR_NO_DEVICE; goto done; } - if (nMaxTransfer != 0) { + /* need to set this before "tr_renew()" */ + pdev->file = f; + pdev->file_ctrl = g; - size = nMaxTransfer * sizeof(*pfse); - - pfse = malloc(size); - if (!pfse) { - error = LIBUSB20_ERROR_NO_MEM; - goto done; - } - memset(pfse, 0, size); - - fs_init.pEndpoints = pfse; - fs_init.ep_index_max = nMaxTransfer; - - if (ioctl(f, USB_FS_INIT, &fs_init)) { - error = LIBUSB20_ERROR_OTHER; - goto done; - } + /* renew all USB transfers */ + error = ugen20_tr_renew(pdev); + if (error) { + goto done; } /* set methods */ pdev->methods = &libusb20_ugen20_device_methods; - pdev->privBeData = pfse; - pdev->file = f; - pdev->file_ctrl = g; - error = 0; + done: if (error) { - if (pfse) { - free(pfse); + if (pdev->privBeData) { + /* cleanup after "tr_renew()" */ + free(pdev->privBeData); + pdev->privBeData = NULL; } + pdev->file = -1; + pdev->file_ctrl = -1; close(f); close(g); } @@ -384,10 +420,11 @@ ugen20_open_device(struct libusb20_device *pdev, uint16_t nMaxTransfer) static int ugen20_close_device(struct libusb20_device *pdev) { - struct usb2_fs_uninit fs_uninit = { /* zero */ }; + struct usb2_fs_uninit fs_uninit; int error = 0; if (pdev->privBeData) { + memset(&fs_uninit, 0, sizeof(fs_uninit)); if (ioctl(pdev->file, USB_FS_UNINIT, &fs_uninit)) { error = LIBUSB20_ERROR_OTHER; } @@ -410,17 +447,19 @@ ugen20_exit_backend(struct libusb20_backend *pbe) static int ugen20_get_config_desc_full(struct libusb20_device *pdev, - uint8_t **ppbuf, uint16_t *plen, uint8_t index) + uint8_t **ppbuf, uint16_t *plen, uint8_t cfg_index) { - struct usb2_gen_descriptor gen_desc = { /* zero */ }; + struct usb2_gen_descriptor gen_desc; struct usb2_config_descriptor cdesc; uint8_t *ptr; uint16_t len; int error; + memset(&gen_desc, 0, sizeof(gen_desc)); + gen_desc.ugd_data = &cdesc; gen_desc.ugd_maxlen = sizeof(cdesc); - gen_desc.ugd_config_index = index; + gen_desc.ugd_config_index = cfg_index; error = ioctl(pdev->file_ctrl, USB_GET_FULL_DESC, &gen_desc); if (error) { @@ -466,14 +505,14 @@ ugen20_get_config_index(struct libusb20_device *pdev, uint8_t *pindex) } static int -ugen20_set_config_index(struct libusb20_device *pdev, uint8_t index) +ugen20_set_config_index(struct libusb20_device *pdev, uint8_t cfg_index) { - int temp = index; + int temp = cfg_index; if (ioctl(pdev->file_ctrl, USB_SET_CONFIG, &temp)) { return (LIBUSB20_ERROR_OTHER); } - return (0); + return (ugen20_tr_renew(pdev)); } static int @@ -502,7 +541,9 @@ static int ugen20_set_alt_index(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index) { - struct usb2_alt_interface alt_iface = { /* zero */ }; + struct usb2_alt_interface alt_iface; + + memset(&alt_iface, 0, sizeof(alt_iface)); alt_iface.uai_interface_index = iface_index; alt_iface.uai_alt_index = alt_index; @@ -510,7 +551,7 @@ ugen20_set_alt_index(struct libusb20_device *pdev, if (ioctl(pdev->file_ctrl, USB_SET_ALTINTERFACE, &alt_iface)) { return (LIBUSB20_ERROR_OTHER); } - return (0); + return (ugen20_tr_renew(pdev)); } static int @@ -521,7 +562,7 @@ ugen20_reset_device(struct libusb20_device *pdev) if (ioctl(pdev->file_ctrl, USB_DEVICEENUMERATE, &temp)) { return (LIBUSB20_ERROR_OTHER); } - return (0); + return (ugen20_tr_renew(pdev)); } static int @@ -615,7 +656,9 @@ ugen20_do_request_sync(struct libusb20_device *pdev, struct LIBUSB20_CONTROL_SETUP_DECODED *setup, void *data, uint16_t *pactlen, uint32_t timeout, uint8_t flags) { - struct usb2_ctl_request req = { /* zero */ }; + struct usb2_ctl_request req; + + memset(&req, 0, sizeof(req)); req.ucr_data = data; if (!(flags & LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK)) { @@ -689,9 +732,11 @@ static int ugen20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no) { - struct usb2_fs_open temp = { /* zero */ }; + struct usb2_fs_open temp; struct usb2_fs_endpoint *fsep; + memset(&temp, 0, sizeof(temp)); + fsep = xfer->pdev->privBeData; fsep += xfer->trIndex; @@ -720,7 +765,9 @@ ugen20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize, static int ugen20_tr_close(struct libusb20_transfer *xfer) { - struct usb2_fs_close temp = { /* zero */ }; + struct usb2_fs_close temp; + + memset(&temp, 0, sizeof(temp)); temp.ep_index = xfer->trIndex; @@ -733,7 +780,9 @@ ugen20_tr_close(struct libusb20_transfer *xfer) static int ugen20_tr_clear_stall_sync(struct libusb20_transfer *xfer) { - struct usb2_fs_clear_stall_sync temp = { /* zero */ }; + struct usb2_fs_clear_stall_sync temp; + + memset(&temp, 0, sizeof(temp)); /* if the transfer is active, an error will be returned */ @@ -748,9 +797,11 @@ ugen20_tr_clear_stall_sync(struct libusb20_transfer *xfer) static void ugen20_tr_submit(struct libusb20_transfer *xfer) { - struct usb2_fs_start temp = { /* zero */ }; + struct usb2_fs_start temp; struct usb2_fs_endpoint *fsep; + memset(&temp, 0, sizeof(temp)); + fsep = xfer->pdev->privBeData; fsep += xfer->trIndex; @@ -781,7 +832,9 @@ ugen20_tr_submit(struct libusb20_transfer *xfer) static void ugen20_tr_cancel_async(struct libusb20_transfer *xfer) { - struct usb2_fs_stop temp = { /* zero */ }; + struct usb2_fs_stop temp; + + memset(&temp, 0, sizeof(temp)); temp.ep_index = xfer->trIndex; @@ -795,21 +848,21 @@ static int ugen20_be_ioctl(uint32_t cmd, void *data) { int f; - int err; + int error; f = open("/dev/usb", O_RDONLY); if (f < 0) return (LIBUSB20_ERROR_OTHER); - err = ioctl(f, cmd, data); - if (err == -1) { + error = ioctl(f, cmd, data); + if (error == -1) { if (errno == EPERM) { - err = LIBUSB20_ERROR_ACCESS; + error = LIBUSB20_ERROR_ACCESS; } else { - err = LIBUSB20_ERROR_OTHER; + error = LIBUSB20_ERROR_OTHER; } } close(f); - return (err); + return (error); } static int @@ -817,16 +870,18 @@ ugen20_be_do_perm(uint32_t get_cmd, uint32_t set_cmd, uint8_t bus, uint8_t dev, uint8_t iface, uid_t *uid, gid_t *gid, mode_t *mode) { - struct usb2_dev_perm perm = { /* zero */ }; - int err; + struct usb2_dev_perm perm; + int error; + + memset(&perm, 0, sizeof(perm)); perm.bus_index = bus; perm.dev_index = dev; perm.iface_index = iface; - err = ugen20_be_ioctl(get_cmd, &perm); - if (err) - return (err); + error = ugen20_be_ioctl(get_cmd, &perm); + if (error) + return (error); if (set_cmd == 0) { if (uid) @@ -934,18 +989,18 @@ ugen20_dev_set_iface_perm(struct libusb20_device *pdev, static int ugen20_root_get_dev_quirk(struct libusb20_backend *pbe, - uint16_t index, struct libusb20_quirk *pq) + uint16_t quirk_index, struct libusb20_quirk *pq) { struct usb2_gen_quirk q; - int err; + int error; memset(&q, 0, sizeof(q)); - q.index = index; + q.index = quirk_index; - err = ugen20_be_ioctl(USB_DEV_QUIRK_GET, &q); + error = ugen20_be_ioctl(USB_DEV_QUIRK_GET, &q); - if (err) { + if (error) { if (errno == EINVAL) { return (LIBUSB20_ERROR_NOT_FOUND); } @@ -956,30 +1011,30 @@ ugen20_root_get_dev_quirk(struct libusb20_backend *pbe, pq->bcdDeviceHigh = q.bcdDeviceHigh; strlcpy(pq->quirkname, q.quirkname, sizeof(pq->quirkname)); } - return (err); + return (error); } static int -ugen20_root_get_quirk_name(struct libusb20_backend *pbe, uint16_t index, +ugen20_root_get_quirk_name(struct libusb20_backend *pbe, uint16_t quirk_index, struct libusb20_quirk *pq) { struct usb2_gen_quirk q; - int err; + int error; memset(&q, 0, sizeof(q)); - q.index = index; + q.index = quirk_index; - err = ugen20_be_ioctl(USB_QUIRK_NAME_GET, &q); + error = ugen20_be_ioctl(USB_QUIRK_NAME_GET, &q); - if (err) { + if (error) { if (errno == EINVAL) { return (LIBUSB20_ERROR_NOT_FOUND); } } else { strlcpy(pq->quirkname, q.quirkname, sizeof(pq->quirkname)); } - return (err); + return (error); } static int @@ -987,7 +1042,7 @@ ugen20_root_add_dev_quirk(struct libusb20_backend *pbe, struct libusb20_quirk *pq) { struct usb2_gen_quirk q; - int err; + int error; memset(&q, 0, sizeof(q)); @@ -997,13 +1052,13 @@ ugen20_root_add_dev_quirk(struct libusb20_backend *pbe, q.bcdDeviceHigh = pq->bcdDeviceHigh; strlcpy(q.quirkname, pq->quirkname, sizeof(q.quirkname)); - err = ugen20_be_ioctl(USB_DEV_QUIRK_ADD, &q); - if (err) { + error = ugen20_be_ioctl(USB_DEV_QUIRK_ADD, &q); + if (error) { if (errno == ENOMEM) { return (LIBUSB20_ERROR_NO_MEM); } } - return (err); + return (error); } static int @@ -1011,7 +1066,7 @@ ugen20_root_remove_dev_quirk(struct libusb20_backend *pbe, struct libusb20_quirk *pq) { struct usb2_gen_quirk q; - int err; + int error; memset(&q, 0, sizeof(q)); @@ -1021,13 +1076,13 @@ ugen20_root_remove_dev_quirk(struct libusb20_backend *pbe, q.bcdDeviceHigh = pq->bcdDeviceHigh; strlcpy(q.quirkname, pq->quirkname, sizeof(q.quirkname)); - err = ugen20_be_ioctl(USB_DEV_QUIRK_REMOVE, &q); - if (err) { + error = ugen20_be_ioctl(USB_DEV_QUIRK_REMOVE, &q); + if (error) { if (errno == EINVAL) { return (LIBUSB20_ERROR_NOT_FOUND); } } - return (err); + return (error); } static int diff --git a/share/man/man7/hier.7 b/share/man/man7/hier.7 index 40c2d0c378ab..2ca54b3bc604 100644 --- a/share/man/man7/hier.7 +++ b/share/man/man7/hier.7 @@ -232,6 +232,8 @@ see .Xr ppbus 4 .It Pa usb/ The USB subsystem +.It Pa usb2/include +The USB subsystem .It Pa utopia/ Physical chip driver for ATM interfaces; see diff --git a/share/mk/bsd.libnames.mk b/share/mk/bsd.libnames.mk index 1a30c59bf1c4..ebcc60f57acf 100644 --- a/share/mk/bsd.libnames.mk +++ b/share/mk/bsd.libnames.mk @@ -148,6 +148,7 @@ LIBUFS?= ${DESTDIR}${LIBDIR}/libufs.a LIBUGIDFW?= ${DESTDIR}${LIBDIR}/libugidfw.a LIBUMEM?= ${DESTDIR}${LIBDIR}/libumem.a LIBUSBHID?= ${DESTDIR}${LIBDIR}/libusbhid.a +LIBUSB20?= ${DESTDIR}${LIBDIR}/libusb20.a LIBUTIL?= ${DESTDIR}${LIBDIR}/libutil.a LIBUUTIL?= ${DESTDIR}${LIBDIR}/libuutil.a LIBVGL?= ${DESTDIR}${LIBDIR}/libvgl.a diff --git a/sys/dev/usb/rio500_usb.h b/sys/dev/usb/rio500_usb.h index 363e0e9b116d..5b53e2c24924 100644 --- a/sys/dev/usb/rio500_usb.h +++ b/sys/dev/usb/rio500_usb.h @@ -32,7 +32,7 @@ struct RioCommand { - u_int16_t length; + uint16_t length; int request; int requesttype; int value; diff --git a/sys/dev/usb2/bluetooth/ng_ubt2.c b/sys/dev/usb2/bluetooth/ng_ubt2.c index 1522ac9d2999..a0de736ce9f8 100644 --- a/sys/dev/usb2/bluetooth/ng_ubt2.c +++ b/sys/dev/usb2/bluetooth/ng_ubt2.c @@ -365,6 +365,7 @@ static const struct usb2_config DRIVER_MODULE(ng_ubt, ushub, ubt_driver, ubt_devclass, ubt_modevent, 0); MODULE_VERSION(ng_ubt, NG_BLUETOOTH_VERSION); MODULE_DEPEND(ng_ubt, netgraph, NG_ABI_VERSION, NG_ABI_VERSION, NG_ABI_VERSION); +MODULE_DEPEND(ng_ubt, ng_hci, NG_BLUETOOTH_VERSION, NG_BLUETOOTH_VERSION, NG_BLUETOOTH_VERSION); MODULE_DEPEND(ng_ubt, usb2_bluetooth, 1, 1, 1); MODULE_DEPEND(ng_ubt, usb2_core, 1, 1, 1); diff --git a/sys/dev/usb2/controller/ehci2.c b/sys/dev/usb2/controller/ehci2.c index 57975001bcb4..f84f5ad66a97 100644 --- a/sys/dev/usb2/controller/ehci2.c +++ b/sys/dev/usb2/controller/ehci2.c @@ -183,6 +183,8 @@ ehci_hc_reset(ehci_softc_t *sc) usb2_pause_mtx(&sc->sc_bus.bus_mtx, 1); hcr = EOREAD4(sc, EHCI_USBCMD); if (!(hcr & EHCI_CMD_HCRESET)) { + if (sc->sc_flags & EHCI_SCFLG_SETMODE) + EOWRITE4(sc, 0x68, 0x3); hcr = 0; break; } @@ -3301,7 +3303,16 @@ ehci_root_ctrl_done(struct usb2_xfer *xfer, } v = EOREAD4(sc, EHCI_PORTSC(index)); DPRINTFN(9, "port status=0x%04x\n", v); - i = UPS_HIGH_SPEED; + if (sc->sc_flags & EHCI_SCFLG_FORCESPEED) { + if ((v & 0xc000000) == 0x8000000) + i = UPS_HIGH_SPEED; + else if ((v & 0xc000000) == 0x4000000) + i = UPS_LOW_SPEED; + else + i = 0; + } else { + i = UPS_HIGH_SPEED; + } if (v & EHCI_PS_CS) i |= UPS_CURRENT_CONNECT_STATUS; if (v & EHCI_PS_PE) @@ -3378,7 +3389,8 @@ ehci_root_ctrl_done(struct usb2_xfer *xfer, } /* Terminate reset sequence. */ - EOWRITE4(sc, port, v); + if (!(sc->sc_flags & EHCI_SCFLG_NORESTERM)) + EOWRITE4(sc, port, v); if (use_polling) { /* polling */ diff --git a/sys/dev/usb2/controller/ehci2.h b/sys/dev/usb2/controller/ehci2.h index f002d55119ae..6765aceb6247 100644 --- a/sys/dev/usb2/controller/ehci2.h +++ b/sys/dev/usb2/controller/ehci2.h @@ -468,6 +468,12 @@ typedef struct ehci_softc { uint16_t sc_intr_stat[EHCI_VIRTUAL_FRAMELIST_COUNT]; uint16_t sc_id_vendor; /* vendor ID for root hub */ + uint16_t sc_flags; /* chip specific flags */ +#define EHCI_SCFLG_SETMODE 0x0001 /* set bridge mode again after init + * (Marvell) */ +#define EHCI_SCFLG_FORCESPEED 0x0002 /* force speed (Marvell) */ +#define EHCI_SCFLG_NORESTERM 0x0004 /* don't terminate reset sequence + * (Marvell) */ uint8_t sc_offs; /* offset to operational registers */ uint8_t sc_doorbell_disable; /* set on doorbell failure */ diff --git a/sys/dev/usb2/controller/uss820dci_pccard.c b/sys/dev/usb2/controller/uss820dci_pccard.c deleted file mode 100644 index dde423d9aedc..000000000000 --- a/sys/dev/usb2/controller/uss820dci_pccard.c +++ /dev/null @@ -1,266 +0,0 @@ -#include -__FBSDID("$FreeBSD$"); - -/*- - * Copyright (c) 2008 Hans Petter Selasky - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -static device_probe_t uss820_pccard_probe; -static device_attach_t uss820_pccard_attach; -static device_detach_t uss820_pccard_detach; -static device_suspend_t uss820_pccard_suspend; -static device_resume_t uss820_pccard_resume; -static device_shutdown_t uss820_pccard_shutdown; - -static uint8_t uss820_pccard_lookup(device_t dev); - -static device_method_t uss820dci_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, uss820_pccard_probe), - DEVMETHOD(device_attach, uss820_pccard_attach), - DEVMETHOD(device_detach, uss820_pccard_detach), - DEVMETHOD(device_suspend, uss820_pccard_suspend), - DEVMETHOD(device_resume, uss820_pccard_resume), - DEVMETHOD(device_shutdown, uss820_pccard_shutdown), - - /* Bus interface */ - DEVMETHOD(bus_print_child, bus_generic_print_child), - - {0, 0} -}; - -static driver_t uss820dci_driver = { - .name = "uss820", - .methods = uss820dci_methods, - .size = sizeof(struct uss820dci_softc), -}; - -static devclass_t uss820dci_devclass; - -DRIVER_MODULE(uss820, pccard, uss820dci_driver, uss820dci_devclass, 0, 0); -MODULE_DEPEND(uss820, usb2_core, 1, 1, 1); - -static const char *const uss820_desc = "USS820 USB Device Controller"; - -static int -uss820_pccard_suspend(device_t dev) -{ - struct uss820dci_softc *sc = device_get_softc(dev); - int err; - - err = bus_generic_suspend(dev); - if (err == 0) { - uss820dci_suspend(sc); - } - return (err); -} - -static int -uss820_pccard_resume(device_t dev) -{ - struct uss820dci_softc *sc = device_get_softc(dev); - int err; - - uss820dci_resume(sc); - - err = bus_generic_resume(dev); - - return (err); -} - -static int -uss820_pccard_shutdown(device_t dev) -{ - struct uss820dci_softc *sc = device_get_softc(dev); - int err; - - err = bus_generic_shutdown(dev); - if (err) - return (err); - - uss820dci_uninit(sc); - - return (0); -} - -static uint8_t -uss820_pccard_lookup(device_t dev) -{ - uint32_t prod; - uint32_t vend; - - pccard_get_vendor(dev, &vend); - pccard_get_product(dev, &prod); - - /* ID's will be added later */ - return (0); -} - -static int -uss820_pccard_probe(device_t dev) -{ - if (uss820_pccard_lookup(dev)) { - device_set_desc(dev, uss820_desc); - return (0); - } - return (ENXIO); -} -static int -uss820_pccard_attach(device_t dev) -{ - struct uss820dci_softc *sc = device_get_softc(dev); - int err; - int rid; - - if (sc == NULL) { - return (ENXIO); - } - /* get all DMA memory */ - - if (usb2_bus_mem_alloc_all(&sc->sc_bus, - USB_GET_DMA_TAG(dev), NULL)) { - return (ENOMEM); - } - rid = 0; - sc->sc_io_res = - bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE); - - if (!sc->sc_io_res) { - goto error; - } - sc->sc_io_tag = rman_get_bustag(sc->sc_io_res); - sc->sc_io_hdl = rman_get_bushandle(sc->sc_io_res); - sc->sc_io_size = rman_get_size(sc->sc_io_res); - - /* multiply all addresses by 4 */ - sc->sc_reg_shift = 2; - - rid = 0; - sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_SHAREABLE | RF_ACTIVE); - if (sc->sc_irq_res == NULL) { - goto error; - } - sc->sc_bus.bdev = device_add_child(dev, "usbus", -1); - if (!(sc->sc_bus.bdev)) { - goto error; - } - device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); - - err = usb2_config_td_setup(&sc->sc_config_td, sc, - &sc->sc_bus.bus_mtx, NULL, 0, 4); - if (err) { - device_printf(dev, "could not setup config thread!\n"); - goto error; - } -#if (__FreeBSD_version >= 700031) - err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, - NULL, (void *)uss820dci_interrupt, sc, &sc->sc_intr_hdl); -#else - err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, - (void *)uss820dci_interrupt, sc, &sc->sc_intr_hdl); -#endif - if (err) { - sc->sc_intr_hdl = NULL; - goto error; - } - err = uss820dci_init(sc); - if (err) { - device_printf(dev, "Init failed\n"); - goto error; - } - err = device_probe_and_attach(sc->sc_bus.bdev); - if (err) { - device_printf(dev, "USB probe and attach failed\n"); - goto error; - } - return (0); - -error: - uss820_pccard_detach(dev); - return (ENXIO); -} - -static int -uss820_pccard_detach(device_t dev) -{ - struct uss820dci_softc *sc = device_get_softc(dev); - device_t bdev; - int err; - - if (sc->sc_bus.bdev) { - bdev = sc->sc_bus.bdev; - device_detach(bdev); - device_delete_child(dev, bdev); - } - /* during module unload there are lots of children leftover */ - device_delete_all_children(dev); - - if (sc->sc_irq_res && sc->sc_intr_hdl) { - /* - * only call at91_udp_uninit() after at91_udp_init() - */ - uss820dci_uninit(sc); - - err = bus_teardown_intr(dev, sc->sc_irq_res, - sc->sc_intr_hdl); - sc->sc_intr_hdl = NULL; - } - if (sc->sc_irq_res) { - bus_release_resource(dev, SYS_RES_IRQ, 0, - sc->sc_irq_res); - sc->sc_irq_res = NULL; - } - if (sc->sc_io_res) { - bus_release_resource(dev, SYS_RES_IOPORT, 0, - sc->sc_io_res); - sc->sc_io_res = NULL; - } - usb2_config_td_unsetup(&sc->sc_config_td); - - usb2_bus_mem_free_all(&sc->sc_bus, NULL); - - return (0); -} diff --git a/sys/dev/usb2/core/usb2_busdma.c b/sys/dev/usb2/core/usb2_busdma.c index b5fbc7f8053b..df7978199430 100644 --- a/sys/dev/usb2/core/usb2_busdma.c +++ b/sys/dev/usb2/core/usb2_busdma.c @@ -601,6 +601,12 @@ usb2_pc_load_mem(struct usb2_page_cache *pc, uint32_t size, uint8_t sync) uptag = pc->tag_parent; + /* + * We have to unload the previous loaded DMA + * pages before trying to load a new one! + */ + bus_dmamap_unload(pc->tag, pc->map); + /* * Try to load memory into DMA. */ @@ -616,6 +622,12 @@ usb2_pc_load_mem(struct usb2_page_cache *pc, uint32_t size, uint8_t sync) } } else { + /* + * We have to unload the previous loaded DMA + * pages before trying to load a new one! + */ + bus_dmamap_unload(pc->tag, pc->map); + /* * Try to load memory into DMA. The callback * will be called in all cases: @@ -644,6 +656,10 @@ usb2_pc_load_mem(struct usb2_page_cache *pc, uint32_t size, uint8_t sync) void usb2_pc_cpu_invalidate(struct usb2_page_cache *pc) { + if (pc->page_offset_end == pc->page_offset_buf) { + /* nothing has been loaded into this page cache! */ + return; + } bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); return; @@ -655,6 +671,10 @@ usb2_pc_cpu_invalidate(struct usb2_page_cache *pc) void usb2_pc_cpu_flush(struct usb2_page_cache *pc) { + if (pc->page_offset_end == pc->page_offset_buf) { + /* nothing has been loaded into this page cache! */ + return; + } bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); return; @@ -958,6 +978,12 @@ usb2_pc_load_mem(struct usb2_page_cache *pc, uint32_t size, uint8_t sync) if (size > 0) { + /* + * We have to unload the previous loaded DMA + * pages before trying to load a new one! + */ + bus_dmamap_unload(pc->tag, pc->map); + /* try to load memory into DMA using using no wait option */ if (bus_dmamap_load(pc->tag, pc->map, pc->buffer, size, NULL, BUS_DMA_NOWAIT)) { @@ -995,6 +1021,10 @@ usb2_pc_cpu_invalidate(struct usb2_page_cache *pc) len = pc->page_offset_end - pc->page_offset_buf; + if (len == 0) { + /* nothing has been loaded into this page cache */ + return; + } bus_dmamap_sync(pc->tag, pc->map, 0, len, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); return; @@ -1010,6 +1040,10 @@ usb2_pc_cpu_flush(struct usb2_page_cache *pc) len = pc->page_offset_end - pc->page_offset_buf; + if (len == 0) { + /* nothing has been loaded into this page cache */ + return; + } bus_dmamap_sync(pc->tag, pc->map, 0, len, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); return; @@ -1358,12 +1392,10 @@ usb2_bdma_pre_sync(struct usb2_xfer *xfer) while (nframes--) { - if (pc->page_offset_buf != pc->page_offset_end) { - if (pc->isread) { - usb2_pc_cpu_invalidate(pc); - } else { - usb2_pc_cpu_flush(pc); - } + if (pc->isread) { + usb2_pc_cpu_invalidate(pc); + } else { + usb2_pc_cpu_flush(pc); } pc++; } @@ -1394,11 +1426,8 @@ usb2_bdma_post_sync(struct usb2_xfer *xfer) pc = xfer->frbuffers; while (nframes--) { - - if (pc->page_offset_buf != pc->page_offset_end) { - if (pc->isread) { - usb2_pc_cpu_invalidate(pc); - } + if (pc->isread) { + usb2_pc_cpu_invalidate(pc); } pc++; } diff --git a/sys/dev/usb2/core/usb2_core.h b/sys/dev/usb2/core/usb2_core.h index d8b886045b13..08372e59c746 100644 --- a/sys/dev/usb2/core/usb2_core.h +++ b/sys/dev/usb2/core/usb2_core.h @@ -159,12 +159,12 @@ #define usb2_callout_drain(c) callout_drain(&(c)->co) #define usb2_callout_pending(c) callout_pending(&(c)->co) -#define USB_BUS_LOCK(_b) mtx_lock(&(_b)->bus_mtx) -#define USB_BUS_UNLOCK(_b) mtx_unlock(&(_b)->bus_mtx) -#define USB_BUS_LOCK_ASSERT(_b, _t) mtx_assert(&(_b)->bus_mtx, _t) -#define USB_XFER_LOCK(_x) mtx_lock((_x)->xfer_mtx) -#define USB_XFER_UNLOCK(_x) mtx_unlock((_x)->xfer_mtx) -#define USB_XFER_LOCK_ASSERT(_x, _t) mtx_assert((_x)->xfer_mtx, _t) +#define USB_BUS_LOCK(_b) mtx_lock(&(_b)->bus_mtx) +#define USB_BUS_UNLOCK(_b) mtx_unlock(&(_b)->bus_mtx) +#define USB_BUS_LOCK_ASSERT(_b, _t) mtx_assert(&(_b)->bus_mtx, _t) +#define USB_XFER_LOCK(_x) mtx_lock((_x)->xfer_mtx) +#define USB_XFER_UNLOCK(_x) mtx_unlock((_x)->xfer_mtx) +#define USB_XFER_LOCK_ASSERT(_x, _t) mtx_assert((_x)->xfer_mtx, _t) /* structure prototypes */ struct file; @@ -401,13 +401,14 @@ struct usb2_location { struct usb2_fifo *rxfifo; struct usb2_fifo *txfifo; uint32_t devloc; /* original devloc */ - uint16_t bus_index; - uint8_t dev_index; - uint8_t iface_index; - uint8_t ep_index; - uint8_t is_read; - uint8_t is_write; - uint8_t is_uref; + uint16_t bus_index; /* bus index */ + uint8_t dev_index; /* device index */ + uint8_t iface_index; /* interface index */ + uint8_t fifo_index; /* FIFO index */ + uint8_t is_read; /* set if location has read access */ + uint8_t is_write; /* set if location has write access */ + uint8_t is_uref; /* set if USB refcount decr. needed */ + uint8_t is_usbfs; /* set if USB-FS is active */ }; /* external variables */ diff --git a/sys/dev/usb2/core/usb2_dev.c b/sys/dev/usb2/core/usb2_dev.c index 1afe83e1f9ee..7e0a17ee8f06 100644 --- a/sys/dev/usb2/core/usb2_dev.c +++ b/sys/dev/usb2/core/usb2_dev.c @@ -464,21 +464,16 @@ usb2_ref_device(struct file *fp, struct usb2_location *ploc, uint32_t devloc) struct usb2_fifo **ppf; struct usb2_fifo *f; int fflags; - uint8_t need_uref; + uint8_t dev_ep_index; if (fp) { - /* check if we need uref hint */ - need_uref = devloc ? 0 : 1; + /* check if we need uref */ + ploc->is_uref = devloc ? 0 : 1; /* get devloc - already verified */ devloc = USB_P2U(fp->f_data); /* get file flags */ fflags = fp->f_flag; - /* only ref FIFO */ - ploc->is_uref = 0; - /* devloc should be valid */ } else { - /* we need uref */ - need_uref = 1; /* only ref device */ fflags = 0; /* search for FIFO */ @@ -496,7 +491,7 @@ usb2_ref_device(struct file *fp, struct usb2_location *ploc, uint32_t devloc) ploc->dev_index = (devloc / USB_BUS_MAX) % USB_DEV_MAX; ploc->iface_index = (devloc / (USB_BUS_MAX * USB_DEV_MAX)) % USB_IFACE_MAX; - ploc->ep_index = (devloc / (USB_BUS_MAX * USB_DEV_MAX * + ploc->fifo_index = (devloc / (USB_BUS_MAX * USB_DEV_MAX * USB_IFACE_MAX)); mtx_lock(&usb2_ref_lock); @@ -518,8 +513,75 @@ usb2_ref_device(struct file *fp, struct usb2_location *ploc, uint32_t devloc) DPRINTFN(2, "no dev ref\n"); goto error; } + /* check if we are doing an open */ + if (fp == NULL) { + /* set defaults */ + ploc->txfifo = NULL; + ploc->rxfifo = NULL; + ploc->is_write = 0; + ploc->is_read = 0; + ploc->is_usbfs = 0; + /* NOTE: variable overloading: */ + dev_ep_index = ploc->fifo_index; + } else { + /* initialise "is_usbfs" flag */ + ploc->is_usbfs = 0; + dev_ep_index = 255; /* dummy */ + + /* check for write */ + if (fflags & FWRITE) { + ppf = ploc->udev->fifo; + f = ppf[ploc->fifo_index + USB_FIFO_TX]; + ploc->txfifo = f; + ploc->is_write = 1; /* ref */ + if ((f == NULL) || + (f->refcount == USB_FIFO_REF_MAX) || + (f->curr_file != fp)) { + goto error; + } + /* check if USB-FS is active */ + if (f->fs_ep_max != 0) { + ploc->is_usbfs = 1; + } + /* + * Get real endpoint index associated with + * this FIFO: + */ + dev_ep_index = f->dev_ep_index; + } else { + ploc->txfifo = NULL; + ploc->is_write = 0; /* no ref */ + } + + /* check for read */ + if (fflags & FREAD) { + ppf = ploc->udev->fifo; + f = ppf[ploc->fifo_index + USB_FIFO_RX]; + ploc->rxfifo = f; + ploc->is_read = 1; /* ref */ + if ((f == NULL) || + (f->refcount == USB_FIFO_REF_MAX) || + (f->curr_file != fp)) { + goto error; + } + /* check if USB-FS is active */ + if (f->fs_ep_max != 0) { + ploc->is_usbfs = 1; + } + /* + * Get real endpoint index associated with + * this FIFO: + */ + dev_ep_index = f->dev_ep_index; + } else { + ploc->rxfifo = NULL; + ploc->is_read = 0; /* no ref */ + } + } + + /* check if we require an interface */ ploc->iface = usb2_get_iface(ploc->udev, ploc->iface_index); - if (ploc->ep_index != 0) { + if (dev_ep_index != 0) { /* non control endpoint - we need an interface */ if (ploc->iface == NULL) { DPRINTFN(2, "no iface\n"); @@ -530,72 +592,18 @@ usb2_ref_device(struct file *fp, struct usb2_location *ploc, uint32_t devloc) goto error; } } - /* check if we are doing an open */ - if (fp == NULL) { - /* set defaults */ - ploc->txfifo = NULL; - ploc->rxfifo = NULL; - ploc->is_write = 0; - ploc->is_read = 0; - } else { - /* check for write */ - if (fflags & FWRITE) { - ppf = ploc->udev->fifo; - f = ppf[ploc->ep_index + USB_FIFO_TX]; - ploc->txfifo = f; - ploc->is_write = 1; /* ref */ - if ((f == NULL) || - (f->refcount == USB_FIFO_REF_MAX) || - (f->curr_file != fp)) { - goto error; - } - } else { - ploc->txfifo = NULL; - ploc->is_write = 0; /* no ref */ - } - - /* check for read */ - if (fflags & FREAD) { - ppf = ploc->udev->fifo; - f = ppf[ploc->ep_index + USB_FIFO_RX]; - ploc->rxfifo = f; - ploc->is_read = 1; /* ref */ - if ((f == NULL) || - (f->refcount == USB_FIFO_REF_MAX) || - (f->curr_file != fp)) { - goto error; - } - } else { - ploc->rxfifo = NULL; - ploc->is_read = 0; /* no ref */ - } - } - /* when everything is OK we increment the refcounts */ if (ploc->is_write) { DPRINTFN(2, "ref write\n"); ploc->txfifo->refcount++; - if (ploc->txfifo->flag_no_uref == 0) { - /* we need extra locking */ - ploc->is_uref = 1; - } } if (ploc->is_read) { DPRINTFN(2, "ref read\n"); ploc->rxfifo->refcount++; - if (ploc->rxfifo->flag_no_uref == 0) { - /* we need extra locking */ - ploc->is_uref = 1; - } } if (ploc->is_uref) { - if (need_uref) { - DPRINTFN(2, "ref udev - needed\n"); - ploc->udev->refcount++; - } else { - DPRINTFN(2, "ref udev - not needed\n"); - ploc->is_uref = 0; - } + DPRINTFN(2, "ref udev - needed\n"); + ploc->udev->refcount++; } mtx_unlock(&usb2_ref_lock); @@ -615,6 +623,59 @@ usb2_ref_device(struct file *fp, struct usb2_location *ploc, uint32_t devloc) return (USB_ERR_INVAL); } +/*------------------------------------------------------------------------* + * usb2_uref_location + * + * This function is used to upgrade an USB reference to include the + * USB device reference on a USB location. + * + * Return values: + * 0: Success, refcount incremented on the given USB device. + * Else: Failure. + *------------------------------------------------------------------------*/ +static usb2_error_t +usb2_uref_location(struct usb2_location *ploc) +{ + /* + * Check if we already got an USB reference on this location: + */ + if (ploc->is_uref) { + return (0); /* success */ + } + mtx_lock(&usb2_ref_lock); + if (ploc->bus != devclass_get_softc(usb2_devclass_ptr, ploc->bus_index)) { + DPRINTFN(2, "bus changed at %u\n", ploc->bus_index); + goto error; + } + if (ploc->udev != ploc->bus->devices[ploc->dev_index]) { + DPRINTFN(2, "device changed at %u\n", ploc->dev_index); + goto error; + } + if (ploc->udev->refcount == USB_DEV_REF_MAX) { + DPRINTFN(2, "no dev ref\n"); + goto error; + } + DPRINTFN(2, "ref udev\n"); + ploc->udev->refcount++; + mtx_unlock(&usb2_ref_lock); + + /* set "uref" */ + ploc->is_uref = 1; + + /* + * We are about to alter the bus-state. Apply the + * required locks. + */ + sx_xlock(ploc->udev->default_sx + 1); + mtx_lock(&Giant); /* XXX */ + return (0); + +error: + mtx_unlock(&usb2_ref_lock); + DPRINTFN(2, "fail\n"); + return (USB_ERR_INVAL); +} + /*------------------------------------------------------------------------* * usb2_unref_device * @@ -672,7 +733,9 @@ usb2_fifo_create(struct usb2_location *ploc, uint32_t *pdevloc, int fflags) struct usb2_fifo *f; struct usb2_pipe *pipe; uint8_t iface_index = ploc->iface_index; - uint8_t dev_ep_index = ploc->ep_index; + + /* NOTE: variable overloading: */ + uint8_t dev_ep_index = ploc->fifo_index; uint8_t n; uint8_t is_tx; uint8_t is_rx; @@ -770,9 +833,6 @@ usb2_fifo_create(struct usb2_location *ploc, uint32_t *pdevloc, int fflags) f->methods = &usb2_ugen_methods; f->iface_index = iface_index; f->udev = udev; - if (dev_ep_index != 0) { - f->flag_no_uref = 1; - } mtx_lock(&usb2_ref_lock); udev->fifo[n + USB_FIFO_TX] = f; mtx_unlock(&usb2_ref_lock); @@ -798,9 +858,6 @@ usb2_fifo_create(struct usb2_location *ploc, uint32_t *pdevloc, int fflags) f->methods = &usb2_ugen_methods; f->iface_index = iface_index; f->udev = udev; - if (dev_ep_index != 0) { - f->flag_no_uref = 1; - } mtx_lock(&usb2_ref_lock); udev->fifo[n + USB_FIFO_RX] = f; mtx_unlock(&usb2_ref_lock); @@ -1113,15 +1170,23 @@ usb2_check_thread_perm(struct usb2_device *udev, struct thread *td, struct usb2_interface *iface; int err; - iface = usb2_get_iface(udev, iface_index); - if (iface == NULL) { - return (EINVAL); - } - if (iface->idesc == NULL) { - return (EINVAL); + if (ep_index != 0) { + /* + * Non-control endpoints are always + * associated with an interface: + */ + iface = usb2_get_iface(udev, iface_index); + if (iface == NULL) { + return (EINVAL); + } + if (iface->idesc == NULL) { + return (EINVAL); + } + } else { + iface = NULL; } /* scan down the permissions tree */ - if ((ep_index != 0) && iface && + if ((iface != NULL) && (usb2_check_access(fflags, &iface->perm) == 0)) { /* we got access through the interface */ err = 0; @@ -1198,8 +1263,14 @@ usb2_fdopen(struct cdev *dev, int xxx_oflags, struct thread *td, DPRINTFN(2, "cannot ref device\n"); return (ENXIO); } + /* + * NOTE: Variable overloading. "usb2_fifo_create" will update + * the FIFO index. Right here we can assume that the + * "fifo_index" is the same like the endpoint number without + * direction mask, if the "fifo_index" is less than 16. + */ err = usb2_check_thread_perm(loc.udev, td, fflags, - loc.iface_index, loc.ep_index); + loc.iface_index, loc.fifo_index); /* check for error */ if (err) { @@ -1447,7 +1518,7 @@ usb2_close_f(struct file *fp, struct thread *td) DPRINTFN(2, "fflags=%u\n", fflags); - err = usb2_ref_device(fp, &loc, 0);; + err = usb2_ref_device(fp, &loc, 0 /* need uref */ );; /* restore some file variables */ fp->f_ops = usb2_old_f_ops; @@ -1512,7 +1583,7 @@ usb2_ioctl_f_sub(struct usb2_fifo *f, u_long cmd, void *addr, } break; default: - return (ENOTTY); + return (ENOIOCTL); } return (error); } @@ -1522,13 +1593,11 @@ usb2_ioctl_f(struct file *fp, u_long cmd, void *addr, struct ucred *cred, struct thread *td) { struct usb2_location loc; + struct usb2_fifo *f; int fflags; - int err_rx; - int err_tx; int err; - uint8_t is_common = 0; - err = usb2_ref_device(fp, &loc, 0);; + err = usb2_ref_device(fp, &loc, 1 /* no uref */ );; if (err) { return (ENXIO); } @@ -1536,43 +1605,31 @@ usb2_ioctl_f(struct file *fp, u_long cmd, void *addr, DPRINTFN(2, "fflags=%u, cmd=0x%lx\n", fflags, cmd); - if (fflags & FREAD) { - if (fflags & FWRITE) { - /* - * Make sure that the IOCTL is not - * duplicated: - */ - is_common = 1; - } - err_rx = usb2_ioctl_f_sub(loc.rxfifo, cmd, addr, td); - if (err_rx == ENOTTY) { - err_rx = (loc.rxfifo->methods->f_ioctl) ( - loc.rxfifo, cmd, addr, - is_common ? fflags : (fflags & ~FWRITE), td); - } - } else { - err_rx = 0; - } - if (fflags & FWRITE) { - err_tx = usb2_ioctl_f_sub(loc.txfifo, cmd, addr, td); - if (err_tx == ENOTTY) { - if (is_common) - err_tx = 0; /* already handled this IOCTL */ - else - err_tx = (loc.txfifo->methods->f_ioctl) ( - loc.txfifo, cmd, addr, fflags & ~FREAD, td); - } - } else { - err_tx = 0; - } + f = NULL; /* set default value */ + err = ENOIOCTL; /* set default value */ - if (err_rx) { - err = err_rx; - } else if (err_tx) { - err = err_tx; - } else { - err = 0; /* no error */ + if (fflags & FWRITE) { + f = loc.txfifo; + err = usb2_ioctl_f_sub(f, cmd, addr, td); } + if (fflags & FREAD) { + f = loc.rxfifo; + err = usb2_ioctl_f_sub(f, cmd, addr, td); + } + if (err == ENOIOCTL) { + err = (f->methods->f_ioctl) (f, cmd, addr, fflags, td); + if (err == ENOIOCTL) { + if (usb2_uref_location(&loc)) { + err = ENXIO; + goto done; + } + err = (f->methods->f_ioctl_post) (f, cmd, addr, fflags, td); + } + } + if (err == ENOIOCTL) { + err = ENOTTY; + } +done: usb2_unref_device(&loc); return (err); } @@ -1594,7 +1651,6 @@ usb2_poll_f(struct file *fp, int events, struct usb2_mbuf *m; int fflags; int revents; - uint8_t usbfs_active = 0; revents = usb2_ref_device(fp, &loc, 1 /* no uref */ );; if (revents) { @@ -1602,20 +1658,6 @@ usb2_poll_f(struct file *fp, int events, } fflags = fp->f_flag; - /* figure out if the USB File System is active */ - - if (fflags & FWRITE) { - f = loc.txfifo; - if (f->fs_ep_max != 0) { - usbfs_active = 1; - } - } - if (fflags & FREAD) { - f = loc.rxfifo; - if (f->fs_ep_max != 0) { - usbfs_active = 1; - } - } /* Figure out who needs service */ if ((events & (POLLOUT | POLLWRNORM)) && @@ -1625,7 +1667,7 @@ usb2_poll_f(struct file *fp, int events, mtx_lock(f->priv_mtx); - if (!usbfs_active) { + if (!loc.is_usbfs) { if (f->flag_iserror) { /* we got an error */ m = (void *)1; @@ -1664,7 +1706,7 @@ usb2_poll_f(struct file *fp, int events, mtx_lock(f->priv_mtx); - if (!usbfs_active) { + if (!loc.is_usbfs) { if (f->flag_iserror) { /* we have and error */ m = (void *)1; @@ -1693,8 +1735,10 @@ usb2_poll_f(struct file *fp, int events, f->flag_isselect = 1; selrecord(td, &f->selinfo); - /* start reading data */ - (f->methods->f_start_read) (f); + if (!loc.is_usbfs) { + /* start reading data */ + (f->methods->f_start_read) (f); + } } mtx_unlock(f->priv_mtx); @@ -1739,22 +1783,23 @@ usb2_read_f(struct file *fp, struct uio *uio, struct ucred *cred, mtx_lock(f->priv_mtx); + /* check for permanent read error */ if (f->flag_iserror) { err = EIO; goto done; } + /* check if USB-FS interface is active */ + if (loc.is_usbfs) { + /* + * The queue is used for events that should be + * retrieved using the "USB_FS_COMPLETE" ioctl. + */ + err = EINVAL; + goto done; + } while (uio->uio_resid > 0) { - if (f->fs_ep_max == 0) { - USB_IF_DEQUEUE(&f->used_q, m); - } else { - /* - * The queue is used for events that should be - * retrieved using the "USB_FS_COMPLETE" - * ioctl. - */ - m = NULL; - } + USB_IF_DEQUEUE(&f->used_q, m); if (m == NULL) { @@ -1777,9 +1822,16 @@ usb2_read_f(struct file *fp, struct uio *uio, struct ucred *cred, break; } continue; - } else { - tr_data = 1; } + if (f->methods->f_filter_read) { + /* + * Sometimes it is convenient to process data at the + * expense of a userland process instead of a kernel + * process. + */ + (f->methods->f_filter_read) (f, m); + } + tr_data = 1; io_len = MIN(m->cur_data_len, uio->uio_resid); @@ -1876,26 +1928,27 @@ usb2_write_f(struct file *fp, struct uio *uio, struct ucred *cred, mtx_lock(f->priv_mtx); + /* check for permanent write error */ if (f->flag_iserror) { err = EIO; goto done; } - if ((f->queue_data == NULL) && (f->fs_ep_max == 0)) { + /* check if USB-FS interface is active */ + if (loc.is_usbfs) { + /* + * The queue is used for events that should be + * retrieved using the "USB_FS_COMPLETE" ioctl. + */ + err = EINVAL; + goto done; + } + if (f->queue_data == NULL) { /* start write transfer, if not already started */ (f->methods->f_start_write) (f); } /* we allow writing zero length data */ do { - if (f->fs_ep_max == 0) { - USB_IF_DEQUEUE(&f->free_q, m); - } else { - /* - * The queue is used for events that should be - * retrieved using the "USB_FS_COMPLETE" - * ioctl. - */ - m = NULL; - } + USB_IF_DEQUEUE(&f->free_q, m); if (m == NULL) { @@ -1914,9 +1967,8 @@ usb2_write_f(struct file *fp, struct uio *uio, struct ucred *cred, break; } continue; - } else { - tr_data = 1; } + tr_data = 1; USB_MBUF_RESET(m); @@ -1933,10 +1985,19 @@ usb2_write_f(struct file *fp, struct uio *uio, struct ucred *cred, if (err) { USB_IF_ENQUEUE(&f->free_q, m); break; - } else { - USB_IF_ENQUEUE(&f->used_q, m); - (f->methods->f_start_write) (f); } + if (f->methods->f_filter_write) { + /* + * Sometimes it is convenient to process data at the + * expense of a userland process instead of a kernel + * process. + */ + (f->methods->f_filter_write) (f, m); + } + USB_IF_ENQUEUE(&f->used_q, m); + + (f->methods->f_start_write) (f); + } while (uio->uio_resid > 0); done: mtx_unlock(f->priv_mtx); @@ -2066,7 +2127,7 @@ static int usb2_fifo_dummy_ioctl(struct usb2_fifo *fifo, u_long cmd, void *addr, int fflags, struct thread *td) { - return (ENOTTY); + return (ENOIOCTL); } static void @@ -2090,6 +2151,9 @@ usb2_fifo_check_methods(struct usb2_fifo_methods *pm) if (pm->f_ioctl == NULL) pm->f_ioctl = &usb2_fifo_dummy_ioctl; + if (pm->f_ioctl_post == NULL) + pm->f_ioctl_post = &usb2_fifo_dummy_ioctl; + if (pm->f_start_read == NULL) pm->f_start_read = &usb2_fifo_dummy_cmd; @@ -2173,7 +2237,6 @@ usb2_fifo_attach(struct usb2_device *udev, void *priv_sc, f_tx->methods = pm; f_tx->iface_index = iface_index; f_tx->udev = udev; - f_tx->flag_no_uref = 1; f_rx->fifo_index = n + USB_FIFO_RX; f_rx->dev_ep_index = (n / 2) + (USB_EP_MAX / 2); @@ -2182,7 +2245,6 @@ usb2_fifo_attach(struct usb2_device *udev, void *priv_sc, f_rx->methods = pm; f_rx->iface_index = iface_index; f_rx->udev = udev; - f_rx->flag_no_uref = 1; f_sc->fp[USB_FIFO_TX] = f_tx; f_sc->fp[USB_FIFO_RX] = f_rx; @@ -2561,32 +2623,17 @@ usb2_fifo_get_data_buffer(struct usb2_fifo *f, void **pptr, uint32_t *plen) { struct usb2_mbuf *m; - USB_IF_DEQUEUE(&f->used_q, m); + USB_IF_POLL(&f->used_q, m); if (m) { *plen = m->cur_data_len; *pptr = m->cur_data_ptr; - USB_IF_PREPEND(&f->used_q, m); return (1); } return (0); } -void -usb2_fifo_get_data_next(struct usb2_fifo *f) -{ - struct usb2_mbuf *m; - - USB_IF_DEQUEUE(&f->used_q, m); - - if (m) { - USB_IF_ENQUEUE(&f->free_q, m); - usb2_fifo_wakeup(f); - } - return; -} - void usb2_fifo_get_data_error(struct usb2_fifo *f) { diff --git a/sys/dev/usb2/core/usb2_dev.h b/sys/dev/usb2/core/usb2_dev.h index 859dd4ebb728..102b2f6fd883 100644 --- a/sys/dev/usb2/core/usb2_dev.h +++ b/sys/dev/usb2/core/usb2_dev.h @@ -39,11 +39,13 @@ #define USB_FIFO_RX 1 struct usb2_fifo; +struct usb2_mbuf; typedef int (usb2_fifo_open_t)(struct usb2_fifo *fifo, int fflags, struct thread *td); typedef void (usb2_fifo_close_t)(struct usb2_fifo *fifo, int fflags, struct thread *td); typedef int (usb2_fifo_ioctl_t)(struct usb2_fifo *fifo, u_long cmd, void *addr, int fflags, struct thread *td); typedef void (usb2_fifo_cmd_t)(struct usb2_fifo *fifo); +typedef void (usb2_fifo_filter_t)(struct usb2_fifo *fifo, struct usb2_mbuf *m); struct usb2_symlink { TAILQ_ENTRY(usb2_symlink) sym_entry; @@ -57,17 +59,24 @@ struct usb2_symlink { /* * Locking note for the following functions. All the - * "usb2_fifo_cmd_t" functions are called locked. The others are - * called unlocked. + * "usb2_fifo_cmd_t" and "usb2_fifo_filter_t" functions are called + * locked. The others are called unlocked. */ struct usb2_fifo_methods { usb2_fifo_open_t *f_open; usb2_fifo_close_t *f_close; usb2_fifo_ioctl_t *f_ioctl; + /* + * NOTE: The post-ioctl callback is called after the USB reference + * gets locked in the IOCTL handler: + */ + usb2_fifo_ioctl_t *f_ioctl_post; usb2_fifo_cmd_t *f_start_read; usb2_fifo_cmd_t *f_stop_read; usb2_fifo_cmd_t *f_start_write; usb2_fifo_cmd_t *f_stop_write; + usb2_fifo_filter_t *f_filter_read; + usb2_fifo_filter_t *f_filter_write; const char *basename[4]; const char *postfix[4]; }; @@ -98,7 +107,6 @@ struct usb2_fifo { uint32_t bufsize; /* BULK and INTERRUPT buffer size */ uint16_t nframes; /* for isochronous mode */ uint16_t dev_ep_index; /* our device endpoint index */ - uint8_t flag_no_uref; /* set if FIFO is not control endpoint */ uint8_t flag_sleeping; /* set if FIFO is sleeping */ uint8_t flag_iscomplete; /* set if a USB transfer is complete */ uint8_t flag_iserror; /* set if FIFO error happened */ @@ -134,7 +142,6 @@ void usb2_fifo_put_data_error(struct usb2_fifo *fifo); uint8_t usb2_fifo_get_data(struct usb2_fifo *fifo, struct usb2_page_cache *pc, uint32_t offset, uint32_t len, uint32_t *actlen, uint8_t what); uint8_t usb2_fifo_get_data_linear(struct usb2_fifo *fifo, void *ptr, uint32_t len, uint32_t *actlen, uint8_t what); uint8_t usb2_fifo_get_data_buffer(struct usb2_fifo *f, void **pptr, uint32_t *plen); -void usb2_fifo_get_data_next(struct usb2_fifo *f); void usb2_fifo_get_data_error(struct usb2_fifo *fifo); uint8_t usb2_fifo_opened(struct usb2_fifo *fifo); void usb2_fifo_free(struct usb2_fifo *f); diff --git a/sys/dev/usb2/core/usb2_device.c b/sys/dev/usb2/core/usb2_device.c index 10ac7f19da50..2c52ae70849d 100644 --- a/sys/dev/usb2/core/usb2_device.c +++ b/sys/dev/usb2/core/usb2_device.c @@ -47,6 +47,7 @@ #include #include #include +#include #include @@ -66,7 +67,7 @@ static void usb2_clear_stall_proc(struct usb2_proc_msg *_pm); static void usb2_check_strings(struct usb2_device *udev); static usb2_error_t usb2_fill_iface_data(struct usb2_device *udev, uint8_t iface_index, uint8_t alt_index); static void usb2_notify_addq(const char *type, struct usb2_device *udev); -static void usb2_fifo_free_wrap(struct usb2_device *udev, uint8_t iface_index, uint8_t free_all); +static void usb2_fifo_free_wrap(struct usb2_device *udev, uint8_t iface_index, uint8_t flag); /* static structures */ @@ -672,7 +673,10 @@ usb2_set_alt_interface_index(struct usb2_device *udev, if (udev->flags.usb2_mode == USB_MODE_DEVICE) { usb2_detach_device(udev, iface_index, 1); } - /* free all FIFOs for this interface */ + /* + * Free all generic FIFOs for this interface, except control + * endpoint FIFOs: + */ usb2_fifo_free_wrap(udev, iface_index, 0); err = usb2_fill_iface_data(udev, iface_index, alt_index); @@ -2077,14 +2081,20 @@ usb2_notify_addq(const char *type, struct usb2_device *udev) /*------------------------------------------------------------------------* * usb2_fifo_free_wrap * - * The function will free the FIFOs. + * This function will free the FIFOs. + * + * Flag values, if "iface_index" is equal to "USB_IFACE_INDEX_ANY". + * 0: Free all FIFOs except generic control endpoints. + * 1: Free all FIFOs. + * + * Flag values, if "iface_index" is not equal to "USB_IFACE_INDEX_ANY". + * Not used. *------------------------------------------------------------------------*/ static void usb2_fifo_free_wrap(struct usb2_device *udev, - uint8_t iface_index, uint8_t free_all) + uint8_t iface_index, uint8_t flag) { struct usb2_fifo *f; - struct usb2_pipe *pipe; uint16_t i; /* @@ -2095,16 +2105,48 @@ usb2_fifo_free_wrap(struct usb2_device *udev, if (f == NULL) { continue; } - pipe = f->priv_sc0; - if ((pipe == &udev->default_pipe) && (free_all == 0)) { - /* don't free UGEN control endpoint yet */ + /* Check if the interface index matches */ + if (iface_index == f->iface_index) { + if (f->methods != &usb2_ugen_methods) { + /* + * Don't free any non-generic FIFOs in + * this case. + */ + continue; + } + if (f->dev_ep_index == 0) { + /* + * Don't free the generic control endpoint + * yet and make sure that any USB-FS + * activity is stopped! + */ + if (ugen_fs_uninit(f)) { + /* ignore any failures */ + DPRINTFN(10, "udev=%p ugen_fs_uninit() " + "failed! (ignored)\n", udev); + } + continue; + } + } else if (iface_index == USB_IFACE_INDEX_ANY) { + if ((f->methods == &usb2_ugen_methods) && + (f->dev_ep_index == 0) && (flag == 0)) { + /* + * Don't free the generic control endpoint + * yet, but make sure that any USB-FS + * activity is stopped! + */ + if (ugen_fs_uninit(f)) { + /* ignore any failures */ + DPRINTFN(10, "udev=%p ugen_fs_uninit() " + "failed! (ignored)\n", udev); + } + continue; + } + } else { continue; } - /* Check if the interface index matches */ - if ((iface_index == f->iface_index) || - (iface_index == USB_IFACE_INDEX_ANY)) { - usb2_fifo_free(f); - } + /* free the FIFO */ + usb2_fifo_free(f); } return; } diff --git a/sys/dev/usb2/core/usb2_generic.c b/sys/dev/usb2/core/usb2_generic.c index 56ada335bad6..43b9c3c8e251 100644 --- a/sys/dev/usb2/core/usb2_generic.c +++ b/sys/dev/usb2/core/usb2_generic.c @@ -67,6 +67,7 @@ static usb2_callback_t ugen_default_fs_callback; static usb2_fifo_open_t ugen_open; static usb2_fifo_close_t ugen_close; static usb2_fifo_ioctl_t ugen_ioctl; +static usb2_fifo_ioctl_t ugen_ioctl_post; static usb2_fifo_cmd_t ugen_start_read; static usb2_fifo_cmd_t ugen_start_write; static usb2_fifo_cmd_t ugen_stop_io; @@ -81,8 +82,6 @@ static int ugen_get_sdesc(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd); static int usb2_gen_fill_deviceinfo(struct usb2_fifo *f, struct usb2_device_info *di); static int ugen_re_enumerate(struct usb2_fifo *f); static int ugen_iface_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags); -static int ugen_ctrl_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags); -static int ugen_fs_uninit(struct usb2_fifo *f); static uint8_t ugen_fs_get_complete(struct usb2_fifo *f, uint8_t *pindex); @@ -92,6 +91,7 @@ struct usb2_fifo_methods usb2_ugen_methods = { .f_open = &ugen_open, .f_close = &ugen_close, .f_ioctl = &ugen_ioctl, + .f_ioctl_post = &ugen_ioctl_post, .f_start_read = &ugen_start_read, .f_stop_read = &ugen_stop_io, .f_start_write = &ugen_start_write, @@ -209,10 +209,6 @@ ugen_open_pipe_write(struct usb2_fifo *f) /* transfers are already opened */ return (0); } - if (f->fs_xfer) { - /* should not happen */ - return (EINVAL); - } bzero(usb2_config, sizeof(usb2_config)); usb2_config[1].type = UE_CONTROL; @@ -281,10 +277,6 @@ ugen_open_pipe_read(struct usb2_fifo *f) /* transfers are already opened */ return (0); } - if (f->fs_xfer) { - /* should not happen */ - return (EINVAL); - } bzero(usb2_config, sizeof(usb2_config)); usb2_config[1].type = UE_CONTROL; @@ -591,10 +583,6 @@ ugen_set_config(struct usb2_fifo *f, uint8_t index) { DPRINTFN(2, "index %u\n", index); - if (f->flag_no_uref) { - /* not the control endpoint - just forget it */ - return (EINVAL); - } if (f->udev->flags.usb2_mode != USB_MODE_HOST) { /* not possible in device side mode */ return (ENOTTY); @@ -620,10 +608,6 @@ ugen_set_interface(struct usb2_fifo *f, { DPRINTFN(2, "%u, %u\n", iface_index, alt_index); - if (f->flag_no_uref) { - /* not the control endpoint - just forget it */ - return (EINVAL); - } if (f->udev->flags.usb2_mode != USB_MODE_HOST) { /* not possible in device side mode */ return (ENOTTY); @@ -656,10 +640,6 @@ ugen_get_cdesc(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd) DPRINTFN(6, "\n"); - if (f->flag_no_uref) { - /* control endpoint only */ - return (EINVAL); - } if (ugd->ugd_data == NULL) { /* userland pointer should not be zero */ return (EINVAL); @@ -705,10 +685,6 @@ ugen_get_sdesc(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd) uint16_t size = sizeof(f->udev->bus->scratch[0].data); int error; - if (f->flag_no_uref) { - /* control endpoint only */ - return (EINVAL); - } if (usb2_req_get_string_desc(f->udev, &Giant, ptr, size, ugd->ugd_lang_id, ugd->ugd_string_index)) { error = EINVAL; @@ -751,10 +727,6 @@ usb2_gen_fill_devicenames(struct usb2_fifo *f, struct usb2_device_names *dn) uint8_t i; uint8_t first = 1; - if (f->flag_no_uref) { - /* control endpoint only */ - return (EINVAL); - } max_len = dn->udn_devnames_len; dst = dn->udn_devnames_ptr; @@ -813,10 +785,6 @@ usb2_gen_fill_deviceinfo(struct usb2_fifo *f, struct usb2_device_info *di) struct usb2_device *udev; struct usb2_device *hub; - if (f->flag_no_uref) { - /* control endpoint only */ - return (EINVAL); - } udev = f->udev; bzero(di, sizeof(di[0])); @@ -919,10 +887,6 @@ ugen_do_request(struct usb2_fifo *f, struct usb2_ctl_request *ur) uint16_t len; uint16_t actlen; - if (f->flag_no_uref) { - /* control endpoint only */ - return (EINVAL); - } if (ugen_check_request(f->udev, &ur->ucr_request)) { return (EPERM); } @@ -958,10 +922,6 @@ ugen_re_enumerate(struct usb2_fifo *f) struct usb2_device *udev = f->udev; int error; - if (f->flag_no_uref) { - /* control endpoint only */ - return (EINVAL); - } /* * This request can be useful for testing USB drivers: */ @@ -969,6 +929,12 @@ ugen_re_enumerate(struct usb2_fifo *f) if (error) { return (error); } + /* get the device unconfigured */ + error = ugen_set_config(f, USB_UNCONFIG_INDEX); + if (error) { + return (error); + } + /* do a bus-reset */ mtx_lock(f->priv_mtx); error = usb2_req_re_enumerate(udev, f->priv_mtx); mtx_unlock(f->priv_mtx); @@ -976,10 +942,15 @@ ugen_re_enumerate(struct usb2_fifo *f) if (error) { return (ENXIO); } + /* restore configuration to index 0 */ + error = ugen_set_config(f, 0); + if (error) { + return (error); + } return (0); } -static int +int ugen_fs_uninit(struct usb2_fifo *f) { if (f->fs_xfer == NULL) { @@ -991,7 +962,6 @@ ugen_fs_uninit(struct usb2_fifo *f) f->fs_ep_max = 0; f->fs_ep_ptr = NULL; f->flag_iscomplete = 0; - f->flag_no_uref = 0; /* restore operation */ usb2_fifo_free_buffer(f); return (0); } @@ -1393,7 +1363,8 @@ ugen_fifo_in_use(struct usb2_fifo *f, int fflags) } static int -ugen_fs_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) +ugen_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags, + struct thread *td) { struct usb2_config usb2_config[1]; struct usb2_device_request req; @@ -1401,8 +1372,6 @@ ugen_fs_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) struct usb2_fs_complete *pcomp; struct usb2_fs_start *pstart; struct usb2_fs_stop *pstop; - struct usb2_fs_init *pinit; - struct usb2_fs_uninit *puninit; struct usb2_fs_open *popen; struct usb2_fs_close *pclose; struct usb2_fs_clear_stall_sync *pstall; @@ -1417,6 +1386,8 @@ ugen_fs_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) u.addr = addr; + DPRINTFN(6, "cmd=0x%08lx\n", cmd); + switch (cmd) { case USB_FS_COMPLETE: mtx_lock(f->priv_mtx); @@ -1451,59 +1422,6 @@ ugen_fs_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) mtx_unlock(f->priv_mtx); break; - case USB_FS_INIT: - /* verify input parameters */ - if (u.pinit->pEndpoints == NULL) { - error = EINVAL; - break; - } - if (u.pinit->ep_index_max > 127) { - error = EINVAL; - break; - } - if (u.pinit->ep_index_max == 0) { - error = EINVAL; - break; - } - if (f->fs_xfer != NULL) { - error = EBUSY; - break; - } - if (f->flag_no_uref) { - error = EINVAL; - break; - } - if (f->dev_ep_index != 0) { - error = EINVAL; - break; - } - if (ugen_fifo_in_use(f, fflags)) { - error = EBUSY; - break; - } - error = usb2_fifo_alloc_buffer(f, 1, u.pinit->ep_index_max); - if (error) { - break; - } - f->fs_xfer = malloc(sizeof(f->fs_xfer[0]) * - u.pinit->ep_index_max, M_USB, M_WAITOK | M_ZERO); - if (f->fs_xfer == NULL) { - usb2_fifo_free_buffer(f); - error = ENOMEM; - break; - } - f->fs_ep_max = u.pinit->ep_index_max; - f->fs_ep_ptr = u.pinit->pEndpoints; - break; - - case USB_FS_UNINIT: - if (u.puninit->dummy != 0) { - error = EINVAL; - break; - } - error = ugen_fs_uninit(f); - break; - case USB_FS_OPEN: if (u.popen->ep_index >= f->fs_ep_max) { error = EINVAL; @@ -1591,11 +1509,6 @@ ugen_fs_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) f->fs_xfer[u.popen->ep_index]->max_data_length; f->fs_xfer[u.popen->ep_index]->priv_fifo = ((uint8_t *)0) + u.popen->ep_index; - /* - * Increase performance by dropping locks we - * don't need: - */ - f->flag_no_uref = 1; } else { error = ENOMEM; } @@ -1652,9 +1565,12 @@ ugen_fs_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) break; default: - error = ENOTTY; + error = ENOIOCTL; break; } + + DPRINTFN(6, "error=%d\n", error); + return (error); } @@ -2007,14 +1923,15 @@ ugen_iface_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) break; default: - error = ENOTTY; + error = ENOIOCTL; break; } return (error); } static int -ugen_ctrl_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) +ugen_ioctl_post(struct usb2_fifo *f, u_long cmd, void *addr, int fflags, + struct thread *td) { union { struct usb2_interface_descriptor *idesc; @@ -2022,6 +1939,8 @@ ugen_ctrl_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) struct usb2_device_descriptor *ddesc; struct usb2_config_descriptor *cdesc; struct usb2_device_stats *stat; + struct usb2_fs_init *pinit; + struct usb2_fs_uninit *puninit; uint32_t *ptime; void *addr; int *pint; @@ -2034,6 +1953,8 @@ ugen_ctrl_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) u.addr = addr; + DPRINTFN(6, "cmd=0x%08lx\n", cmd); + switch (cmd) { case USB_DISCOVER: usb2_needs_explore_all(); @@ -2178,29 +2099,60 @@ ugen_ctrl_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags) *u.pint, 0, UHF_PORT_ENABLE); break; - default: - error = EINVAL; - break; - } - return (error); -} - -static int -ugen_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags, - struct thread *td) -{ - int error; - - DPRINTFN(6, "cmd=%08lx\n", cmd); - error = ugen_fs_ioctl(f, cmd, addr, fflags); - if (error == ENOTTY) { - if (f->flag_no_uref) { - mtx_lock(f->priv_mtx); - error = ugen_iface_ioctl(f, cmd, addr, fflags); - mtx_unlock(f->priv_mtx); - } else { - error = ugen_ctrl_ioctl(f, cmd, addr, fflags); + case USB_FS_INIT: + /* verify input parameters */ + if (u.pinit->pEndpoints == NULL) { + error = EINVAL; + break; } + if (u.pinit->ep_index_max > 127) { + error = EINVAL; + break; + } + if (u.pinit->ep_index_max == 0) { + error = EINVAL; + break; + } + if (f->fs_xfer != NULL) { + error = EBUSY; + break; + } + if (f->dev_ep_index != 0) { + error = EINVAL; + break; + } + if (ugen_fifo_in_use(f, fflags)) { + error = EBUSY; + break; + } + error = usb2_fifo_alloc_buffer(f, 1, u.pinit->ep_index_max); + if (error) { + break; + } + f->fs_xfer = malloc(sizeof(f->fs_xfer[0]) * + u.pinit->ep_index_max, M_USB, M_WAITOK | M_ZERO); + if (f->fs_xfer == NULL) { + usb2_fifo_free_buffer(f); + error = ENOMEM; + break; + } + f->fs_ep_max = u.pinit->ep_index_max; + f->fs_ep_ptr = u.pinit->pEndpoints; + break; + + case USB_FS_UNINIT: + if (u.puninit->dummy != 0) { + error = EINVAL; + break; + } + error = ugen_fs_uninit(f); + break; + + default: + mtx_lock(f->priv_mtx); + error = ugen_iface_ioctl(f, cmd, addr, fflags); + mtx_unlock(f->priv_mtx); + break; } DPRINTFN(6, "error=%d\n", error); return (error); diff --git a/sys/dev/usb2/core/usb2_generic.h b/sys/dev/usb2/core/usb2_generic.h index 3a4e7c940ea4..93b341a4bd17 100644 --- a/sys/dev/usb2/core/usb2_generic.h +++ b/sys/dev/usb2/core/usb2_generic.h @@ -29,5 +29,6 @@ extern struct usb2_fifo_methods usb2_ugen_methods; int ugen_do_request(struct usb2_fifo *f, struct usb2_ctl_request *ur); +int ugen_fs_uninit(struct usb2_fifo *f); #endif /* _USB2_GENERIC_H_ */ diff --git a/sys/dev/usb2/core/usb2_hub.c b/sys/dev/usb2/core/usb2_hub.c index 7cc23cc32b92..b5336a9a3476 100644 --- a/sys/dev/usb2/core/usb2_hub.c +++ b/sys/dev/usb2/core/usb2_hub.c @@ -72,6 +72,7 @@ struct uhub_softc { struct usb2_device *sc_udev; /* USB device */ struct usb2_xfer *sc_xfer[2]; /* interrupt xfer */ uint8_t sc_flags; +#define UHUB_FLAG_DID_EXPLORE 0x01 #define UHUB_FLAG_INTR_STALL 0x02 char sc_name[32]; }; @@ -511,6 +512,14 @@ uhub_explore(struct usb2_device *udev) /* most likely the HUB is gone */ break; } + if (!(sc->sc_flags & UHUB_FLAG_DID_EXPLORE)) { + /* + * Fake a connect status change so that the + * status gets checked initially! + */ + sc->sc_st.port_change |= + UPS_C_CONNECT_STATUS; + } if (sc->sc_st.port_change & UPS_C_PORT_ENABLED) { err = usb2_req_clear_port_feature( udev, &Giant, portno, UHF_C_PORT_ENABLE); @@ -533,7 +542,8 @@ uhub_explore(struct usb2_device *udev) DPRINTFN(0, "port error, giving up " "port %d\n", portno); } else { - sc->sc_st.port_change |= UPS_C_CONNECT_STATUS; + sc->sc_st.port_change |= + UPS_C_CONNECT_STATUS; up->restartcnt++; } } @@ -560,6 +570,11 @@ uhub_explore(struct usb2_device *udev) /* explore succeeded - reset restart counter */ up->restartcnt = 0; } + + /* initial status checked */ + sc->sc_flags |= UHUB_FLAG_DID_EXPLORE; + + /* return success */ return (USB_ERR_NORMAL_COMPLETION); } diff --git a/sys/dev/usb2/core/usb2_request.c b/sys/dev/usb2/core/usb2_request.c index e91d27da326d..bfb3bbbf3013 100644 --- a/sys/dev/usb2/core/usb2_request.c +++ b/sys/dev/usb2/core/usb2_request.c @@ -686,24 +686,26 @@ usb2_req_get_string_any(struct usb2_device *udev, struct mtx *mtx, char *buf, /* should not happen */ return (USB_ERR_NORMAL_COMPLETION); } - buf[0] = 0; - if (string_index == 0) { /* this is the language table */ + buf[0] = 0; return (USB_ERR_INVAL); } if (udev->flags.no_strings) { + buf[0] = 0; return (USB_ERR_STALLED); } err = usb2_req_get_string_desc (udev, mtx, buf, len, udev->langid, string_index); if (err) { + buf[0] = 0; return (err); } temp = (uint8_t *)buf; if (temp[0] < 2) { /* string length is too short */ + buf[0] = 0; return (USB_ERR_INVAL); } /* reserve one byte for terminating zero */ @@ -735,7 +737,8 @@ usb2_req_get_string_any(struct usb2_device *udev, struct mtx *mtx, char *buf, *s = c >> 8; swap = 2; } else { - *s = '.'; + /* silently skip bad character */ + continue; } /* @@ -743,11 +746,12 @@ usb2_req_get_string_any(struct usb2_device *udev, struct mtx *mtx, char *buf, * signs because they might confuse the dmesg printouts! */ if ((*s == '<') || (*s == '>') || (!isprint(*s))) { - *s = '.'; + /* silently skip bad character */ + continue; } s++; } - *s = 0; + *s = 0; /* zero terminate resulting string */ return (USB_ERR_NORMAL_COMPLETION); } @@ -1310,6 +1314,10 @@ usb2_req_get_config(struct usb2_device *udev, struct mtx *mtx, uint8_t *pconf) /*------------------------------------------------------------------------* * usb2_req_re_enumerate * + * NOTE: After this function returns the hardware is in the + * unconfigured state! The application is responsible for setting a + * new configuration. + * * Returns: * 0: Success * Else: Failure @@ -1365,12 +1373,5 @@ usb2_req_re_enumerate(struct usb2_device *udev, struct mtx *mtx) done: /* restore address */ udev->address = old_addr; - - if (err == 0) { - /* restore configuration */ - err = usb2_req_set_config(udev, mtx, udev->curr_config_no); - /* wait a little bit, just in case */ - usb2_pause_mtx(mtx, 10); - } return (err); } diff --git a/sys/dev/usb2/core/usb2_util.c b/sys/dev/usb2/core/usb2_util.c index d944e441abb7..7edb9a56f820 100644 --- a/sys/dev/usb2/core/usb2_util.c +++ b/sys/dev/usb2/core/usb2_util.c @@ -89,7 +89,7 @@ device_set_usb2_desc(device_t dev) } uaa = device_get_ivars(dev); if (uaa == NULL) { - /* can happend if called at the wrong time */ + /* can happen if called at the wrong time */ return; } udev = uaa->device; diff --git a/sys/dev/usb2/core/usbdevs b/sys/dev/usb2/core/usbdevs deleted file mode 100644 index 8fa1cf1f14c2..000000000000 --- a/sys/dev/usb2/core/usbdevs +++ /dev/null @@ -1,2482 +0,0 @@ -$FreeBSD$ -/* $NetBSD: usbdevs,v 1.392 2004/12/29 08:38:44 imp Exp $ */ - -/*- - * Copyright (c) 1998-2004 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Lennart Augustsson (lennart@augustsson.net) at - * Carlstedt Research & Technology. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * List of known USB vendors - * - * USB.org publishes a VID list of USB-IF member companies at - * http://www.usb.org/developers/tools - * Note that it does not show companies that have obtained a Vendor ID - * without becoming full members. - * - * Please note that these IDs do not do anything. Adding an ID here and - * regenerating the usbdevs.h and usbdevs_data.h only makes a symbolic name - * available to the source code and does not change any functionality, nor - * does it make your device available to a specific driver. - * It will however make the descriptive string available if a device does not - * provide the string itself. - * - * After adding a vendor ID VNDR and a product ID PRDCT you will have the - * following extra defines: - * #define USB_VENDOR_VNDR 0x???? - * #define USB_PRODUCT_VNDR_PRDCT 0x???? - * - * You may have to add these defines to the respective probe routines to - * make the device recognised by the appropriate device driver. - */ - -vendor UNKNOWN1 0x0053 Unknown vendor -vendor UNKNOWN2 0x0105 Unknown vendor -vendor EGALAX2 0x0123 eGalax, Inc. -vendor HUMAX 0x02ad HUMAX -vendor LTS 0x0386 LTS -vendor BWCT 0x03da Bernd Walter Computer Technology -vendor AOX 0x03e8 AOX -vendor THESYS 0x03e9 Thesys -vendor DATABROADCAST 0x03ea Data Broadcasting -vendor ATMEL 0x03eb Atmel -vendor IWATSU 0x03ec Iwatsu America -vendor MITSUMI 0x03ee Mitsumi -vendor HP 0x03f0 Hewlett Packard -vendor GENOA 0x03f1 Genoa -vendor OAK 0x03f2 Oak -vendor ADAPTEC 0x03f3 Adaptec -vendor DIEBOLD 0x03f4 Diebold -vendor SIEMENSELECTRO 0x03f5 Siemens Electromechanical -vendor EPSONIMAGING 0x03f8 Epson Imaging -vendor KEYTRONIC 0x03f9 KeyTronic -vendor OPTI 0x03fb OPTi -vendor ELITEGROUP 0x03fc Elitegroup -vendor XILINX 0x03fd Xilinx -vendor FARALLON 0x03fe Farallon Communications -vendor NATIONAL 0x0400 National Semiconductor -vendor NATIONALREG 0x0401 National Registry -vendor ACERLABS 0x0402 Acer Labs -vendor FTDI 0x0403 Future Technology Devices -vendor NCR 0x0404 NCR -vendor SYNOPSYS2 0x0405 Synopsys -vendor FUJITSUICL 0x0406 Fujitsu-ICL -vendor FUJITSU2 0x0407 Fujitsu Personal Systems -vendor QUANTA 0x0408 Quanta -vendor NEC 0x0409 NEC -vendor KODAK 0x040a Eastman Kodak -vendor WELTREND 0x040b Weltrend -vendor VIA 0x040d VIA -vendor MCCI 0x040e MCCI -vendor MELCO 0x0411 Melco -vendor LEADTEK 0x0413 Leadtek -vendor WINBOND 0x0416 Winbond -vendor PHOENIX 0x041a Phoenix -vendor CREATIVE 0x041e Creative Labs -vendor NOKIA 0x0421 Nokia -vendor ADI 0x0422 ADI Systems -vendor CATC 0x0423 Computer Access Technology -vendor SMC2 0x0424 Standard Microsystems -vendor MOTOROLA_HK 0x0425 Motorola HK -vendor GRAVIS 0x0428 Advanced Gravis Computer -vendor CIRRUSLOGIC 0x0429 Cirrus Logic -vendor INNOVATIVE 0x042c Innovative Semiconductors -vendor MOLEX 0x042f Molex -vendor SUN 0x0430 Sun Microsystems -vendor UNISYS 0x0432 Unisys -vendor TAUGA 0x0436 Taugagreining HF -vendor AMD 0x0438 Advanced Micro Devices -vendor LEXMARK 0x043d Lexmark International -vendor LG 0x043e LG Electronics -vendor NANAO 0x0440 NANAO -vendor GATEWAY 0x0443 Gateway 2000 -vendor NMB 0x0446 NMB -vendor ALPS 0x044e Alps Electric -vendor THRUST 0x044f Thrustmaster -vendor TI 0x0451 Texas Instruments -vendor ANALOGDEVICES 0x0456 Analog Devices -vendor SIS 0x0457 Silicon Integrated Systems Corp. -vendor KYE 0x0458 KYE Systems -vendor DIAMOND2 0x045a Diamond (Supra) -vendor RENESAS 0x045b Renesas -vendor MICROSOFT 0x045e Microsoft -vendor PRIMAX 0x0461 Primax Electronics -vendor MGE 0x0463 MGE UPS Systems -vendor AMP 0x0464 AMP -vendor CHERRY 0x046a Cherry Mikroschalter -vendor MEGATRENDS 0x046b American Megatrends -vendor LOGITECH 0x046d Logitech -vendor BTC 0x046e Behavior Tech. Computer -vendor PHILIPS 0x0471 Philips -vendor SUN2 0x0472 Sun Microsystems (offical) -vendor SANYO 0x0474 Sanyo Electric -vendor SEAGATE 0x0477 Seagate -vendor CONNECTIX 0x0478 Connectix -vendor SEMTECH 0x047a Semtech -vendor KENSINGTON 0x047d Kensington -vendor LUCENT 0x047e Lucent -vendor PLANTRONICS 0x047f Plantronics -vendor KYOCERA 0x0482 Kyocera Wireless Corp. -vendor STMICRO 0x0483 STMicroelectronics -vendor FOXCONN 0x0489 Foxconn -vendor YAMAHA 0x0499 YAMAHA -vendor COMPAQ 0x049f Compaq -vendor HITACHI 0x04a4 Hitachi -vendor ACERP 0x04a5 Acer Peripherals -vendor DAVICOM 0x04a6 Davicom -vendor VISIONEER 0x04a7 Visioneer -vendor CANON 0x04a9 Canon -vendor NIKON 0x04b0 Nikon -vendor PAN 0x04b1 Pan International -vendor IBM 0x04b3 IBM -vendor CYPRESS 0x04b4 Cypress Semiconductor -vendor ROHM 0x04b5 ROHM -vendor COMPAL 0x04b7 Compal -vendor EPSON 0x04b8 Seiko Epson -vendor RAINBOW 0x04b9 Rainbow Technologies -vendor IODATA 0x04bb I-O Data -vendor TDK 0x04bf TDK -vendor 3COMUSR 0x04c1 U.S. Robotics -vendor METHODE 0x04c2 Methode Electronics Far East -vendor MAXISWITCH 0x04c3 Maxi Switch -vendor LOCKHEEDMER 0x04c4 Lockheed Martin Energy Research -vendor FUJITSU 0x04c5 Fujitsu -vendor TOSHIBAAM 0x04c6 Toshiba America -vendor MICROMACRO 0x04c7 Micro Macro Technologies -vendor KONICA 0x04c8 Konica -vendor LITEON 0x04ca Lite-On Technology -vendor FUJIPHOTO 0x04cb Fuji Photo Film -vendor PHILIPSSEMI 0x04cc Philips Semiconductors -vendor TATUNG 0x04cd Tatung Co. Of America -vendor SCANLOGIC 0x04ce ScanLogic -vendor MYSON 0x04cf Myson Technology -vendor DIGI2 0x04d0 Digi -vendor ITTCANON 0x04d1 ITT Canon -vendor ALTEC 0x04d2 Altec Lansing -vendor LSI 0x04d4 LSI -vendor MENTORGRAPHICS 0x04d6 Mentor Graphics -vendor ITUNERNET 0x04d8 I-Tuner Networks -vendor HOLTEK 0x04d9 Holtek Semiconductor, Inc. -vendor PANASONIC 0x04da Panasonic (Matsushita) -vendor HUANHSIN 0x04dc Huan Hsin -vendor SHARP 0x04dd Sharp -vendor IIYAMA 0x04e1 Iiyama -vendor SHUTTLE 0x04e6 Shuttle Technology -vendor ELO 0x04e7 Elo TouchSystems -vendor SAMSUNG 0x04e8 Samsung Electronics -vendor NORTHSTAR 0x04eb Northstar -vendor TOKYOELECTRON 0x04ec Tokyo Electron -vendor ANNABOOKS 0x04ed Annabooks -vendor JVC 0x04f1 JVC -vendor CHICONY 0x04f2 Chicony Electronics -vendor ELAN 0x04f3 Elan -vendor NEWNEX 0x04f7 Newnex -vendor BROTHER 0x04f9 Brother Industries -vendor DALLAS 0x04fa Dallas Semiconductor -vendor SUNPLUS 0x04fc Sunplus -vendor PFU 0x04fe PFU -vendor FUJIKURA 0x0501 Fujikura/DDK -vendor ACER 0x0502 Acer -vendor 3COM 0x0506 3Com -vendor HOSIDEN 0x0507 Hosiden Corporation -vendor AZTECH 0x0509 Aztech Systems -vendor BELKIN 0x050d Belkin Components -vendor KAWATSU 0x050f Kawatsu Semiconductor -vendor FCI 0x0514 FCI -vendor LONGWELL 0x0516 Longwell -vendor COMPOSITE 0x0518 Composite -vendor STAR 0x0519 Star Micronics -vendor APC 0x051d American Power Conversion -vendor SCIATLANTA 0x051e Scientific Atlanta -vendor TSM 0x0520 TSM -vendor CONNECTEK 0x0522 Advanced Connectek USA -vendor NETCHIP 0x0525 NetChip Technology -vendor ALTRA 0x0527 ALTRA -vendor ATI 0x0528 ATI Technologies -vendor AKS 0x0529 Aladdin Knowledge Systems -vendor TEKOM 0x052b Tekom -vendor CANONDEV 0x052c Canon -vendor WACOMTECH 0x0531 Wacom -vendor INVENTEC 0x0537 Inventec -vendor SHYHSHIUN 0x0539 Shyh Shiun Terminals -vendor PREHWERKE 0x053a Preh Werke Gmbh & Co. KG -vendor SYNOPSYS 0x053f Synopsys -vendor UNIACCESS 0x0540 Universal Access -vendor VIEWSONIC 0x0543 ViewSonic -vendor XIRLINK 0x0545 Xirlink -vendor ANCHOR 0x0547 Anchor Chips -vendor SONY 0x054c Sony -vendor FUJIXEROX 0x0550 Fuji Xerox -vendor VISION 0x0553 VLSI Vision -vendor ASAHIKASEI 0x0556 Asahi Kasei Microsystems -vendor ATEN 0x0557 ATEN International -vendor SAMSUNG2 0x055d Samsung Electronics -vendor MUSTEK 0x055f Mustek Systems -vendor TELEX 0x0562 Telex Communications -vendor CHINON 0x0564 Chinon -vendor PERACOM 0x0565 Peracom Networks -vendor ALCOR2 0x0566 Alcor Micro -vendor XYRATEX 0x0567 Xyratex -vendor WACOM 0x056a WACOM -vendor ETEK 0x056c e-TEK Labs -vendor EIZO 0x056d EIZO -vendor ELECOM 0x056e Elecom -vendor CONEXANT 0x0572 Conexant -vendor HAUPPAUGE 0x0573 Hauppauge Computer Works -vendor BAFO 0x0576 BAFO/Quality Computer Accessories -vendor YEDATA 0x057b Y-E Data -vendor AVM 0x057c AVM -vendor QUICKSHOT 0x057f Quickshot -vendor ROLAND 0x0582 Roland -vendor ROCKFIRE 0x0583 Rockfire -vendor RATOC 0x0584 RATOC Systems -vendor ZYXEL 0x0586 ZyXEL Communication -vendor INFINEON 0x058b Infineon -vendor MICREL 0x058d Micrel -vendor ALCOR 0x058f Alcor Micro -vendor OMRON 0x0590 OMRON -vendor ZORAN 0x0595 Zoran Microelectronics -vendor NIIGATA 0x0598 Niigata -vendor IOMEGA 0x059b Iomega -vendor ATREND 0x059c A-Trend Technology -vendor AID 0x059d Advanced Input Devices -vendor LACIE 0x059f LaCie -vendor FUJIFILM 0x05a2 Fuji Film -vendor ARC 0x05a3 ARC -vendor ORTEK 0x05a4 Ortek -vendor BOSE 0x05a7 Bose -vendor OMNIVISION 0x05a9 OmniVision -vendor INSYSTEM 0x05ab In-System Design -vendor APPLE 0x05ac Apple Computer -vendor YCCABLE 0x05ad Y.C. Cable -vendor DIGITALPERSONA 0x05ba DigitalPersona -vendor 3G 0x05bc 3G Green Green Globe -vendor RAFI 0x05bd RAFI -vendor TYCO 0x05be Tyco -vendor KAWASAKI 0x05c1 Kawasaki -vendor DIGI 0x05c5 Digi International -vendor QUALCOMM2 0x05c6 Qualcomm -vendor QTRONIX 0x05c7 Qtronix -vendor FOXLINK 0x05c8 Foxlink -vendor RICOH 0x05ca Ricoh -vendor ELSA 0x05cc ELSA -vendor SCIWORX 0x05ce sci-worx -vendor BRAINBOXES 0x05d1 Brainboxes Limited -vendor ULTIMA 0x05d8 Ultima -vendor AXIOHM 0x05d9 Axiohm Transaction Solutions -vendor MICROTEK 0x05da Microtek -vendor SUNTAC 0x05db SUN Corporation -vendor LEXAR 0x05dc Lexar Media -vendor ADDTRON 0x05dd Addtron -vendor SYMBOL 0x05e0 Symbol Technologies -vendor SYNTEK 0x05e1 Syntek -vendor GENESYS 0x05e3 Genesys Logic -vendor FUJI 0x05e5 Fuji Electric -vendor KEITHLEY 0x05e6 Keithley Instruments -vendor EIZONANAO 0x05e7 EIZO Nanao -vendor KLSI 0x05e9 Kawasaki LSI -vendor FFC 0x05eb FFC -vendor ANKO 0x05ef Anko Electronic -vendor PIENGINEERING 0x05f3 P.I. Engineering -vendor AOC 0x05f6 AOC International -vendor CHIC 0x05fe Chic Technology -vendor BARCO 0x0600 Barco Display Systems -vendor BRIDGE 0x0607 Bridge Information -vendor SOLIDYEAR 0x060b Solid Year -vendor BIORAD 0x0614 Bio-Rad Laboratories -vendor MACALLY 0x0618 Macally -vendor ACTLABS 0x061c Act Labs -vendor ALARIS 0x0620 Alaris -vendor APEX 0x0624 Apex -vendor CREATIVE3 0x062a Creative Labs -vendor VIVITAR 0x0636 Vivitar -vendor GUNZE 0x0637 Gunze Electronics USA -vendor AVISION 0x0638 Avision -vendor TEAC 0x0644 TEAC -vendor SGI 0x065e Silicon Graphics -vendor SANWASUPPLY 0x0663 Sanwa Supply -vendor LINKSYS 0x066b Linksys -vendor ACERSA 0x066e Acer Semiconductor America -vendor SIGMATEL 0x066f Sigmatel -vendor DRAYTEK 0x0675 DrayTek -vendor AIWA 0x0677 Aiwa -vendor ACARD 0x0678 ACARD Technology -vendor PROLIFIC 0x067b Prolific Technology -vendor SIEMENS 0x067c Siemens -vendor AVANCELOGIC 0x0680 Avance Logic -vendor SIEMENS2 0x0681 Siemens -vendor MINOLTA 0x0686 Minolta -vendor CHPRODUCTS 0x068e CH Products -vendor HAGIWARA 0x0693 Hagiwara Sys-Com -vendor CTX 0x0698 Chuntex -vendor ASKEY 0x069a Askey Computer -vendor SAITEK 0x06a3 Saitek -vendor ALCATELT 0x06b9 Alcatel Telecom -vendor AGFA 0x06bd AGFA-Gevaert -vendor ASIAMD 0x06be Asia Microelectronic Development -vendor BIZLINK 0x06c4 Bizlink International -vendor KEYSPAN 0x06cd Keyspan / InnoSys Inc. -vendor AASHIMA 0x06d6 Aashima Technology -vendor MULTITECH 0x06e0 MultiTech -vendor ADS 0x06e1 ADS Technologies -vendor ALCATELM 0x06e4 Alcatel Microelectronics -vendor SIRIUS 0x06ea Sirius Technologies -vendor GUILLEMOT 0x06f8 Guillemot -vendor BOSTON 0x06fd Boston Acoustics -vendor SMC 0x0707 Standard Microsystems -vendor PUTERCOM 0x0708 Putercom -vendor MCT 0x0711 MCT -vendor IMATION 0x0718 Imation -vendor SONYERICSSON 0x0731 Sony Ericsson -vendor EICON 0x0734 Eicon Networks -vendor SYNTECH 0x0745 Syntech Information -vendor DIGITALSTREAM 0x074e Digital Stream -vendor AUREAL 0x0755 Aureal Semiconductor -vendor MIDIMAN 0x0763 Midiman -vendor CYBERPOWER 0x0764 Cyber Power Systems, Inc. -vendor SURECOM 0x0769 Surecom Technology -vendor LINKSYS2 0x077b Linksys -vendor GRIFFIN 0x077d Griffin Technology -vendor SANDISK 0x0781 SanDisk -vendor JENOPTIK 0x0784 Jenoptik -vendor LOGITEC 0x0789 Logitec -vendor BRIMAX 0x078e Brimax -vendor AXIS 0x0792 Axis Communications -vendor ABL 0x0794 ABL Electronics -vendor SAGEM 0x079b Sagem -vendor SUNCOMM 0x079c Sun Communications, Inc. -vendor ALFADATA 0x079d Alfadata Computer -vendor NATIONALTECH 0x07a2 National Technical Systems -vendor ONNTO 0x07a3 Onnto -vendor BE 0x07a4 Be -vendor ADMTEK 0x07a6 ADMtek -vendor COREGA 0x07aa Corega -vendor FREECOM 0x07ab Freecom -vendor MICROTECH 0x07af Microtech -vendor GENERALINSTMNTS 0x07b2 General Instruments (Motorola) -vendor OLYMPUS 0x07b4 Olympus -vendor ABOCOM 0x07b8 AboCom Systems -vendor KEISOKUGIKEN 0x07c1 Keisokugiken -vendor ONSPEC 0x07c4 OnSpec -vendor APG 0x07c5 APG Cash Drawer -vendor BUG 0x07c8 B.U.G. -vendor ALLIEDTELESYN 0x07c9 Allied Telesyn International -vendor AVERMEDIA 0x07ca AVerMedia Technologies -vendor SIIG 0x07cc SIIG -vendor CASIO 0x07cf CASIO -vendor DLINK2 0x07d1 D-Link -vendor APTIO 0x07d2 Aptio Products -vendor ARASAN 0x07da Arasan Chip Systems -vendor ALLIEDCABLE 0x07e6 Allied Cable -vendor STSN 0x07ef STSN -vendor CENTURY 0x07f7 Century Corp -vendor ZOOM 0x0803 Zoom Telephonics -vendor PCS 0x0810 Personal Communication Systems -vendor BROADLOGIC 0x0827 BroadLogic -vendor HANDSPRING 0x082d Handspring -vendor PALM 0x0830 Palm Computing -vendor SOURCENEXT 0x0833 SOURCENEXT -vendor ACTIONSTAR 0x0835 Action Star Enterprise -vendor SAMSUNG_TECHWIN 0x0839 Samsung Techwin -vendor ACCTON 0x083a Accton Technology -vendor DIAMOND 0x0841 Diamond -vendor NETGEAR 0x0846 BayNETGEAR -vendor TOPRE 0x0853 Topre Corporation -vendor ACTIVEWIRE 0x0854 ActiveWire -vendor BBELECTRONICS 0x0856 B&B Electronics -vendor PORTGEAR 0x085a PortGear -vendor NETGEAR2 0x0864 Netgear -vendor SYSTEMTALKS 0x086e System Talks -vendor METRICOM 0x0870 Metricom -vendor ADESSOKBTEK 0x087c ADESSO/Kbtek America -vendor JATON 0x087d Jaton -vendor APT 0x0880 APT Technologies -vendor BOCARESEARCH 0x0885 Boca Research -vendor ANDREA 0x08a8 Andrea Electronics -vendor BURRBROWN 0x08bb Burr-Brown Japan -vendor 2WIRE 0x08c8 2Wire -vendor AIPTEK 0x08ca AIPTEK International -vendor SMARTBRIDGES 0x08d1 SmartBridges -vendor BILLIONTON 0x08dd Billionton Systems -vendor EXTENDED 0x08e9 Extended Systems -vendor MSYSTEMS 0x08ec M-Systems -vendor AUTHENTEC 0x08ff AuthenTec -vendor AUDIOTECHNICA 0x0909 Audio-Technica -vendor TRUMPION 0x090a Trumpion Microelectronics -vendor FEIYA 0x090c Feiya -vendor ALATION 0x0910 Alation Systems -vendor GLOBESPAN 0x0915 Globespan -vendor CONCORDCAMERA 0x0919 Concord Camera -vendor GARMIN 0x091e Garmin International -vendor GOHUBS 0x0921 GoHubs -vendor XEROX 0x0924 Xerox -vendor BIOMETRIC 0x0929 American Biometric Company -vendor TOSHIBA 0x0930 Toshiba -vendor PLEXTOR 0x093b Plextor -vendor INTREPIDCS 0x093c Intrepid -vendor YANO 0x094f Yano -vendor KINGSTON 0x0951 Kingston Technology -vendor BLUEWATER 0x0956 BlueWater Systems -vendor AGILENT 0x0957 Agilent Technologies -vendor GUDE 0x0959 Gude ADS -vendor PORTSMITH 0x095a Portsmith -vendor ACERW 0x0967 Acer -vendor ADIRONDACK 0x0976 Adirondack Wire & Cable -vendor BECKHOFF 0x0978 Beckhoff -vendor MINDSATWORK 0x097a Minds At Work -vendor POINTCHIPS 0x09a6 PointChips -vendor INTERSIL 0x09aa Intersil -vendor ALTIUS 0x09b3 Altius Solutions -vendor ARRIS 0x09c1 Arris Interactive -vendor ACTIVCARD 0x09c3 ACTIVCARD -vendor ACTISYS 0x09c4 ACTiSYS -vendor NOVATEL2 0x09d7 Novatel Wireless -vendor AFOURTECH 0x09da A-FOUR TECH -vendor AIMEX 0x09dc AIMEX -vendor ADDONICS 0x09df Addonics Technologies -vendor AKAI 0x09e8 AKAI professional M.I. -vendor ARESCOM 0x09f5 ARESCOM -vendor BAY 0x09f9 Bay Associates -vendor ALTERA 0x09fb Altera -vendor CSR 0x0a12 Cambridge Silicon Radio -vendor TREK 0x0a16 Trek Technology -vendor ASAHIOPTICAL 0x0a17 Asahi Optical -vendor BOCASYSTEMS 0x0a43 Boca Systems -vendor SHANTOU 0x0a46 ShanTou -vendor MEDIAGEAR 0x0a48 MediaGear -vendor BROADCOM 0x0a5c Broadcom -vendor GREENHOUSE 0x0a6b GREENHOUSE -vendor GEOCAST 0x0a79 Geocast Network Systems -vendor IDQUANTIQUE 0x0aba id Quantique -vendor ZYDAS 0x0ace Zydas Technology Corporation -vendor NEODIO 0x0aec Neodio -vendor OPTION 0x0af0 Option N.V: -vendor ASUS 0x0b05 ASUSTeK Computer -vendor TODOS 0x0b0c Todos Data System -vendor SIIG2 0x0b39 SIIG -vendor TEKRAM 0x0b3b Tekram Technology -vendor HAL 0x0b41 HAL Corporation -vendor EMS 0x0b43 EMS Production -vendor NEC2 0x0b62 NEC -vendor ATI2 0x0b6f ATI -vendor ZEEVO 0x0b7a Zeevo, Inc. -vendor KURUSUGAWA 0x0b7e Kurusugawa Electronics, Inc. -vendor ASIX 0x0b95 ASIX Electronics -vendor O2MICRO 0x0b97 O2 Micro, Inc. -vendor USR 0x0baf U.S. Robotics -vendor AMBIT 0x0bb2 Ambit Microsystems -vendor HTC 0x0bb4 HTC -vendor REALTEK 0x0bda Realtek -vendor ADDONICS2 0x0bf6 Addonics Technology -vendor FSC 0x0bf8 Fujitsu Siemens Computers -vendor AGATE 0x0c08 Agate Technologies -vendor DMI 0x0c0b DMI -vendor MICRODIA 0x0c45 Chicony -vendor SEALEVEL 0x0c52 Sealevel System -vendor LUWEN 0x0c76 Luwen -vendor KYOCERA2 0x0c88 Kyocera Wireless Corp. -vendor ZCOM 0x0cde Z-Com -vendor ATHEROS2 0x0cf3 Atheros Communications -vendor TANGTOP 0x0d3d Tangtop -vendor SMC3 0x0d5c Standard Microsystems -vendor ADDON 0x0d7d Add-on Technology -vendor ACDC 0x0d7e American Computer & Digital Components -vendor ABC 0x0d8c ABC -vendor CONCEPTRONIC 0x0d8e Conceptronic -vendor SKANHEX 0x0d96 Skanhex Technology, Inc. -vendor MSI 0x0db0 Micro Star International -vendor ELCON 0x0db7 ELCON Systemtechnik -vendor NETAC 0x0dd8 Netac -vendor SITECOMEU 0x0df6 Sitecom Europe -vendor MOBILEACTION 0x0df7 Mobile Action -vendor SPEEDDRAGON 0x0e55 Speed Dragon Multimedia -vendor HAWKING 0x0e66 Hawking -vendor FOSSIL 0x0e67 Fossil, Inc -vendor GMATE 0x0e7e G.Mate, Inc -vendor OTI 0x0ea0 Ours Technology -vendor PILOTECH 0x0eaf Pilotech -vendor NOVATECH 0x0eb0 NovaTech -vendor ITEGNO 0x0eba iTegno -vendor WINMAXGROUP 0x0ed1 WinMaxGroup -vendor TOD 0x0ede TOD -vendor EGALAX 0x0eef eGalax, Inc. -vendor AIRPRIME 0x0f3d AirPrime, Inc. -vendor MICROTUNE 0x0f4d Microtune -vendor VTECH 0x0f88 VTech -vendor FALCOM 0x0f94 Falcom Wireless Communications GmbH -vendor RIM 0x0fca Research In Motion -vendor DYNASTREAM 0x0fcf Dynastream Innovations -vendor QUALCOMM 0x1004 Qualcomm -vendor DESKNOTE 0x1019 Desknote -vendor GIGABYTE 0x1044 GIGABYTE -vendor WESTERN 0x1058 Western Digital -vendor MOTOROLA 0x1063 Motorola -vendor CCYU 0x1065 CCYU Technology -vendor CURITEL 0x106c Curitel Communications Inc -vendor SILABS2 0x10a6 SILABS2 -vendor USI 0x10ab USI -vendor PLX 0x10b5 PLX -vendor ASANTE 0x10bd Asante -vendor SILABS 0x10c4 Silicon Labs -vendor ANALOG 0x1110 Analog Devices -vendor TENX 0x1130 Ten X Technology, Inc. -vendor ISSC 0x1131 Integrated System Solution Corp. -vendor JRC 0x1145 Japan Radio Company -vendor SPHAIRON 0x114b Sphairon Access Systems GmbH -vendor DELORME 0x1163 DeLorme -vendor SERVERWORKS 0x1166 ServerWorks -vendor ACERCM 0x1189 Acer Communications & Multimedia -vendor SIERRA 0x1199 Sierra Wireless -vendor TOPFIELD 0x11db Topfield Co., Ltd -vendor SIEMENS3 0x11f5 Siemens -vendor PROLIFIC2 0x11f6 Prolific -vendor ALCATEL 0x11f7 Alcatel -vendor UNKNOWN3 0x1233 Unknown vendor -vendor TSUNAMI 0x1241 Tsunami -vendor PHEENET 0x124a Pheenet -vendor TARGUS 0x1267 Targus -vendor TWINMOS 0x126f TwinMOS -vendor TENDA 0x1286 Tenda -vendor CREATIVE2 0x1292 Creative Labs -vendor BELKIN2 0x1293 Belkin Components -vendor CYBERTAN 0x129b CyberTAN Technology -vendor HUAWEI 0x12d1 Huawei Technologies -vendor ARANEUS 0x12d8 Araneus Information Systems -vendor TAPWAVE 0x12ef Tapwave -vendor AINCOMM 0x12fd Aincomm -vendor MOBILITY 0x1342 Mobility -vendor DICKSMITH 0x1371 Dick Smith Electronics -vendor NETGEAR3 0x1385 Netgear -vendor BALTECH 0x13ad Baltech -vendor CISCOLINKSYS 0x13b1 Cisco-Linksys -vendor SHARK 0x13d2 Shark -vendor NOVATEL 0x1410 Novatel Wireless -vendor MERLIN 0x1416 Merlin -vendor WISTRONNEWEB 0x1435 Wistron NeWeb -vendor RADIOSHACK 0x1453 Radio Shack -vendor HUAWEI3COM 0x1472 Huawei-3Com -vendor SILICOM 0x1485 Silicom -vendor RALINK 0x148f Ralink Technology -vendor IMAGINATION 0x149a Imagination Technologies -vendor CONCEPTRONIC2 0x14b2 Conceptronic -vendor PLANEX3 0x14ea Planex Communications -vendor SILICONPORTALS 0x1527 Silicon Portals -vendor UBIQUAM 0x1529 UBIQUAM Co., Ltd. -vendor UBLOX 0x1546 U-blox -vendor PNY 0x154b PNY -vendor OQO 0x1557 OQO -vendor UMEDIA 0x157e U-MEDIA Communications -vendor FIBERLINE 0x1582 Fiberline -vendor SPARKLAN 0x15a9 SparkLAN -vendor SOHOWARE 0x15e8 SOHOware -vendor UMAX 0x1606 UMAX Data Systems -vendor INSIDEOUT 0x1608 Inside Out Networks -vendor GOODWAY 0x1631 Good Way Technology -vendor ENTREGA 0x1645 Entrega -vendor ACTIONTEC 0x1668 Actiontec Electronics -vendor ATHEROS 0x168c Atheros Communications -vendor GIGASET 0x1690 Gigaset -vendor GLOBALSUN 0x16ab Global Sun Technology -vendor ANYDATA 0x16d5 AnyDATA Corporation -vendor JABLOTRON 0x16d6 Jablotron -vendor CMOTECH 0x16d8 CMOTECH Co., Ltd. -vendor AXESSTEL 0x1726 Axesstel Co., Ltd. -vendor LINKSYS4 0x1737 Linksys -vendor SENAO 0x1740 Senao -vendor METAGEEK 0x1781 MetaGeek -vendor AMIT 0x18c5 AMIT -vendor QCOM 0x18e8 Qcom -vendor LINKSYS3 0x1915 Linksys -vendor QUALCOMMINC 0x19d2 Qualcomm, Incorporated -vendor DLINK 0x2001 D-Link -vendor PLANEX2 0x2019 Planex Communications -vendor ERICSSON 0x2282 Ericsson -vendor MOTOROLA2 0x22b8 Motorola -vendor TRIPPLITE 0x2478 Tripp-Lite -vendor HIROSE 0x2631 Hirose Electric -vendor NHJ 0x2770 NHJ -vendor PLANEX 0x2c02 Planex Communications -vendor VIDZMEDIA 0x3275 VidzMedia Pte Ltd -vendor AEI 0x3334 AEI -vendor HANK 0x3353 Hank Connection -vendor PQI 0x3538 PQI -vendor DAISY 0x3579 Daisy Technology -vendor NI 0x3923 National Instruments -vendor MICRONET 0x3980 Micronet Communications -vendor IODATA2 0x40bb I-O Data -vendor IRIVER 0x4102 iRiver -vendor DELL 0x413c Dell -vendor WCH 0x4348 QinHeng Electronics -vendor ACEECA 0x4766 Aceeca -vendor AVERATEC 0x50c2 Averatec -vendor SWEEX 0x5173 Sweex -vendor ONSPEC2 0x55aa OnSpec Electronic Inc. -vendor ZINWELL 0x5a57 Zinwell -vendor SITECOM 0x6189 Sitecom -vendor ARKMICRO 0x6547 Arkmicro Technologies Inc. -vendor 3COM2 0x6891 3Com -vendor INTEL 0x8086 Intel -vendor SITECOM2 0x9016 Sitecom -vendor MOSCHIP 0x9710 MosChip Semiconductor -vendor 3COM3 0xa727 3Com -vendor HP2 0xf003 Hewlett Packard -vendor USRP 0xfffe GNU Radio USRP - -/* - * List of known products. Grouped by vendor. - */ - -/* 3Com products */ -product 3COM HOMECONN 0x009d HomeConnect Camera -product 3COM 3CREB96 0x00a0 Bluetooth USB Adapter -product 3COM 3C19250 0x03e8 3C19250 Ethernet Adapter -product 3COM 3CRSHEW696 0x0a01 3CRSHEW696 Wireless Adapter -product 3COM 3C460 0x11f8 HomeConnect 3C460 -product 3COM USR56K 0x3021 U.S.Robotics 56000 Voice FaxModem Pro -product 3COM 3C460B 0x4601 HomeConnect 3C460B -product 3COM2 3CRUSB10075 0xa727 3CRUSB10075 -product 3COM3 AR5523_1 0x6893 AR5523 -product 3COM3 AR5523_2 0x6895 AR5523 -product 3COM3 AR5523_3 0x6897 AR5523 - -product 3COMUSR OFFICECONN 0x0082 3Com OfficeConnect Analog Modem -product 3COMUSR USRISDN 0x008f 3Com U.S. Robotics Pro ISDN TA -product 3COMUSR HOMECONN 0x009d 3Com HomeConnect Camera -product 3COMUSR USR56K 0x3021 U.S. Robotics 56000 Voice FaxModem Pro - -/* AboCom products */ -product ABOCOM XX1 0x110c XX1 -product ABOCOM XX2 0x200c XX2 -product ABOCOM URE450 0x4000 URE450 Ethernet Adapter -product ABOCOM UFE1000 0x4002 UFE1000 Fast Ethernet Adapter -product ABOCOM DSB650TX_PNA 0x4003 1/10/100 Ethernet Adapter -product ABOCOM XX4 0x4004 XX4 -product ABOCOM XX5 0x4007 XX5 -product ABOCOM XX6 0x400b XX6 -product ABOCOM XX7 0x400c XX7 -product ABOCOM RTL8151 0x401a RTL8151 -product ABOCOM XX8 0x4102 XX8 -product ABOCOM XX9 0x4104 XX9 -product ABOCOM UF200 0x420a UF200 Ethernet -product ABOCOM WL54 0x6001 WL54 -product ABOCOM XX10 0xabc1 XX10 -product ABOCOM BWU613 0xb000 BWU613 -product ABOCOM HWU54DM 0xb21b HWU54DM -product ABOCOM RT2573_2 0xb21c RT2573 -product ABOCOM RT2573_3 0xb21d RT2573 -product ABOCOM RT2573_4 0xb21e RT2573 -product ABOCOM WUG2700 0xb21f WUG2700 - -/* Accton products */ -product ACCTON USB320_EC 0x1046 USB320-EC Ethernet Adapter -product ACCTON 2664W 0x3501 2664W -product ACCTON 111 0x3503 T-Sinus 111 Wireless Adapter -product ACCTON SMCWUSBG 0x4505 SMCWUSB-G -product ACCTON PRISM_GT 0x4521 PrismGT USB 2.0 WLAN -product ACCTON SS1001 0x5046 SpeedStream Ethernet Adapter -product ACCTON ZD1211B 0xe501 ZD1211B - -/* Aceeca products */ -product ACEECA MEZ1000 0x0001 MEZ1000 RDA - -/* Acer Communications & Multimedia (oemd by Surecom) */ -product ACERCM EP1427X2 0x0893 EP-1427X-2 Ethernet Adapter - -/* Acer Labs products */ -product ACERLABS M5632 0x5632 USB 2.0 Data Link - -/* Acer Peripherals, Inc. products */ -product ACERP ACERSCAN_C310U 0x12a6 Acerscan C310U -product ACERP ACERSCAN_320U 0x2022 Acerscan 320U -product ACERP ACERSCAN_640U 0x2040 Acerscan 640U -product ACERP ACERSCAN_620U 0x2060 Acerscan 620U -product ACERP ACERSCAN_4300U 0x20b0 Benq 3300U/4300U -product ACERP ACERSCAN_640BT 0x20be Acerscan 640BT -product ACERP ACERSCAN_1240U 0x20c0 Acerscan 1240U -product ACERP ATAPI 0x6003 ATA/ATAPI Adapter -product ACERP AWL300 0x9000 AWL300 Wireless Adapter -product ACERP AWL400 0x9001 AWL400 Wireless Adapter - -/* Acer Warp products */ -product ACERW WARPLINK 0x0204 Warplink - -/* Actiontec, Inc. products */ -product ACTIONTEC PRISM_25 0x0408 Prism2.5 Wireless Adapter -product ACTIONTEC PRISM_25A 0x0421 Prism2.5 Wireless Adapter A -product ACTIONTEC FREELAN 0x6106 ROPEX FreeLan 802.11b -product ACTIONTEC UAT1 0x7605 UAT1 Wireless Ethernet Adapter - -/* ACTiSYS products */ -product ACTISYS IR2000U 0x0011 ACT-IR2000U FIR - -/* ActiveWire, Inc. products */ -product ACTIVEWIRE IOBOARD 0x0100 I/O Board -product ACTIVEWIRE IOBOARD_FW1 0x0101 I/O Board, rev. 1 firmware - -/* Adaptec products */ -product ADAPTEC AWN8020 0x0020 AWN-8020 WLAN - -/* Addtron products */ -product ADDTRON AWU120 0xff31 AWU-120 - -/* ADMtek products */ -product ADMTEK PEGASUSII_4 0x07c2 AN986A Ethernet -product ADMTEK PEGASUS 0x0986 AN986 Ethernet -product ADMTEK PEGASUSII 0x8511 AN8511 Ethernet -product ADMTEK PEGASUSII_2 0x8513 AN8513 Ethernet -product ADMTEK PEGASUSII_3 0x8515 AN8515 Ethernet - -/* ADDON products */ -/* PNY OEMs these */ -product ADDON ATTACHE 0x1300 USB 2.0 Flash Drive -product ADDON ATTACHE 0x1300 USB 2.0 Flash Drive -product ADDON A256MB 0x1400 Attache 256MB USB 2.0 Flash Drive -product ADDON DISKPRO512 0x1420 USB 2.0 Flash Drive (DANE-ELEC zMate 512MB USB flash drive) - -/* Addonics products */ -product ADDONICS2 CABLE_205 0xa001 Cable 205 - -/* ADS products */ -product ADS UBS10BT 0x0008 UBS-10BT Ethernet -product ADS UBS10BTX 0x0009 UBS-10BT Ethernet - -/* AEI products */ -product AEI FASTETHERNET 0x1701 Fast Ethernet - -/* Agate Technologies products */ -product AGATE QDRIVE 0x0378 Q-Drive - -/* AGFA products */ -product AGFA SNAPSCAN1212U 0x0001 SnapScan 1212U -product AGFA SNAPSCAN1236U 0x0002 SnapScan 1236U -product AGFA SNAPSCANTOUCH 0x0100 SnapScan Touch -product AGFA SNAPSCAN1212U2 0x2061 SnapScan 1212U -product AGFA SNAPSCANE40 0x208d SnapScan e40 -product AGFA SNAPSCANE50 0x208f SnapScan e50 -product AGFA SNAPSCANE20 0x2091 SnapScan e20 -product AGFA SNAPSCANE25 0x2095 SnapScan e25 -product AGFA SNAPSCANE26 0x2097 SnapScan e26 -product AGFA SNAPSCANE52 0x20fd SnapScan e52 - -/* Ain Communication Technology products */ -product AINCOMM AWU2000B 0x1001 AWU2000B Wireless Adapter - -/* AIPTEK products */ -product AIPTEK POCKETCAM3M 0x2011 PocketCAM 3Mega -product SUNPLUS PENCAM_MEGA_1_3 0x504a PenCam Mega 1.3 - -/* AirPrime products */ -product AIRPRIME PC5220 0x0112 CDMA Wireless PC Card - -/* AKS products */ -product AKS USBHASP 0x0001 USB-HASP 0.06 - -/* Alcor Micro, Inc. products */ -product ALCOR2 KBD_HUB 0x2802 Kbd Hub - -product ALCOR MA_KBD_HUB 0x9213 MacAlly Kbd Hub -product ALCOR AU9814 0x9215 AU9814 Hub -product ALCOR UMCR_9361 0x9361 USB Multimedia Card Reader -product ALCOR SM_KBD 0x9410 MicroConnectors/StrongMan Keyboard -product ALCOR NEC_KBD_HUB 0x9472 NEC Kbd Hub - -/* Altec Lansing products */ -product ALTEC ADA70 0x0070 ADA70 Speakers -product ALTEC ASC495 0xff05 ASC495 Speakers - -/* Allied Telesyn International products */ -product ALLIEDTELESYN ATUSB100 0xb100 AT-USB100 - -/* American Power Conversion products */ -product APC UPS 0x0002 Uninterruptible Power Supply - -/* Ambit Microsystems products */ -product AMBIT WLAN 0x0302 WLAN -product AMBIT NTL_250 0x6098 NTL 250 cable modem - -/* AMIT products */ -product AMIT CGWLUSB2GO 0x0002 CG-WLUSB2GO - -/* Anchor products */ -product ANCHOR EZUSB 0x2131 EZUSB -product ANCHOR EZLINK 0x2720 EZLINK - -/* AnyData products */ -product ANYDATA ADU_E100X 0x6501 CDMA 2000 1xRTT/EV-DO USB Modem -product ANYDATA ADU_500A 0x6502 CDMA 2000 EV-DO USB Modem - -/* AOX, Inc. products */ -product AOX USB101 0x0008 Ethernet - -/* American Power Conversion products */ -product APC UPS 0x0002 Uninterruptible Power Supply - -/* Apple Computer products */ -product APPLE EXT_KBD 0x020c Apple Extended USB Keyboard -product APPLE OPTMOUSE 0x0302 Optical mouse -product APPLE MIGHTYMOUSE 0x0304 Mighty Mouse -product APPLE EXT_KBD_HUB 0x1003 Hub in Apple Extended USB Keyboard -product APPLE SPEAKERS 0x1101 Speakers -product APPLE IPOD 0x1201 iPod -product APPLE IPOD2G 0x1202 iPod 2G -product APPLE IPOD3G 0x1203 iPod 3G -product APPLE IPOD_04 0x1204 iPod '04' -product APPLE IPODMINI 0x1205 iPod Mini -product APPLE IPOD_06 0x1206 iPod '06' -product APPLE IPOD_07 0x1207 iPod '07' -product APPLE IPOD_08 0x1208 iPod '08' -product APPLE IPODVIDEO 0x1209 iPod Video -product APPLE IPODNANO 0x120a iPod Nano -product APPLE IPHONE 0x1290 iPhone -product APPLE IPHONE_3G 0x1292 iPhone 3G -product APPLE ETHERNET 0x1402 Ethernet A1277 - -/* Arkmicro Technologies */ -product ARKMICRO ARK3116 0x0232 ARK3116 Serial - -/* Asahi Optical products */ -product ASAHIOPTICAL OPTIO230 0x0004 Digital camera -product ASAHIOPTICAL OPTIO330 0x0006 Digital camera - -/* Asante products */ -product ASANTE EA 0x1427 Ethernet - -/* ASIX Electronics products */ -product ASIX AX88172 0x1720 10/100 Ethernet -product ASIX AX88178 0x1780 AX88178 -product ASIX AX88772 0x7720 AX88772 - -/* ASUS products */ -product ASUS WL167G 0x1707 WL-167g Wireless Adapter -product ASUS WL159G 0x170c WL-159g -product ASUS A9T_WIFI 0x171b A9T wireless -product ASUS RT2573_1 0x1723 RT2573 -product ASUS RT2573_2 0x1724 RT2573 -product ASUS LCM 0x1726 LCM display -product ASUS P535 0x420f ASUS P535 PDA - -/* ATen products */ -product ATEN UC1284 0x2001 Parallel printer -product ATEN UC10T 0x2002 10Mbps Ethernet -product ATEN UC110T 0x2007 UC-110T Ethernet -product ATEN UC232A 0x2008 Serial -product ATEN UC210T 0x2009 UC-210T Ethernet -product ATEN DSB650C 0x4000 DSB-650C - -/* Atheros Communications products */ -product ATHEROS AR5523 0x0001 AR5523 -product ATHEROS AR5523_NF 0x0002 AR5523 (no firmware) -product ATHEROS2 AR5523_1 0x0001 AR5523 -product ATHEROS2 AR5523_1_NF 0x0002 AR5523 (no firmware) -product ATHEROS2 AR5523_2 0x0003 AR5523 -product ATHEROS2 AR5523_2_NF 0x0004 AR5523 (no firmware) -product ATHEROS2 AR5523_3 0x0005 AR5523 -product ATHEROS2 AR5523_3_NF 0x0006 AR5523 (no firmware) - -/* Atmel Comp. products */ -product ATMEL UHB124 0x3301 UHB124 hub -product ATMEL DWL120 0x7603 DWL-120 Wireless Adapter -product ATMEL BW002 0x7605 BW002 Wireless Adapter -product ATMEL WL1130USB 0x7613 WL-1130 USB -product ATMEL AT76C505A 0x7614 AT76c505a Wireless Adapter - -/* Avision products */ -product AVISION 1200U 0x0268 1200U scanner - -/* Axesstel products */ -product AXESSTEL DATAMODEM 0x1000 Data Modem - -/* Baltech products */ -product BALTECH CARDREADER 0x9999 Card reader - -/* B&B Electronics products */ -product BBELECTRONICS USOTL4 0xAC01 RS-422/485 - -/* Belkin products */ -/*product BELKIN F5U111 0x???? F5U111 Ethernet*/ -product BELKIN F5D6050 0x0050 F5D6050 802.11b Wireless Adapter -product BELKIN FBT001V 0x0081 FBT001v2 Bluetooth -product BELKIN FBT003V 0x0084 FBT003v2 Bluetooth -product BELKIN F5U103 0x0103 F5U103 Serial -product BELKIN F5U109 0x0109 F5U109 Serial -product BELKIN USB2SCSI 0x0115 USB to SCSI -product BELKIN USB2LAN 0x0121 USB to LAN -product BELKIN F5U208 0x0208 F5U208 VideoBus II -product BELKIN F5U237 0x0237 F5U237 USB 2.0 7-Port Hub -product BELKIN F5U257 0x0257 F5U257 Serial -product BELKIN F5U409 0x0409 F5U409 Serial -product BELKIN F6C550AVR 0x0551 F6C550-AVR UPS -product BELKIN F5U120 0x1203 F5U120-PC Hub -product BELKIN ZD1211B 0x4050 ZD1211B -product BELKIN F5D5055 0x5055 F5D5055 -product BELKIN F5D7050 0x7050 F5D7050 Wireless Adapter -product BELKIN F5D7051 0x7051 F5D7051 54g USB Network Adapter -product BELKIN F5D7050A 0x705a F5D7050A Wireless Adapter -product BELKIN F5D7050_V4000 0x705c F5D7050 v4000 Wireless Adapter -product BELKIN F5D9050V3 0x905b F5D9050 ver 3 Wireless Adapter -product BELKIN2 F5U002 0x0002 F5U002 Parallel printer - -/* Billionton products */ -product BILLIONTON USB100 0x0986 USB100N 10/100 FastEthernet -product BILLIONTON USBLP100 0x0987 USB100LP -product BILLIONTON USBEL100 0x0988 USB100EL -product BILLIONTON USBE100 0x8511 USBE100 -product BILLIONTON USB2AR 0x90ff USB2AR Ethernet - -/* Broadcom products */ -product BROADCOM BCM2033 0x2033 BCM2033 Bluetooth USB dongle - -/* Brother Industries products */ -product BROTHER HL1050 0x0002 HL-1050 laser printer - -/* Behavior Technology Computer products */ -product BTC BTC7932 0x6782 Keyboard with mouse port - -/* Canon, Inc. products */ -product CANON N656U 0x2206 CanoScan N656U -product CANON N1220U 0x2207 CanoScan N1220U -product CANON D660U 0x2208 CanoScan D660U -product CANON N676U 0x220d CanoScan N676U -product CANON N1240U 0x220e CanoScan N1240U -product CANON LIDE25 0x2220 CanoScan LIDE 25 -product CANON S10 0x3041 PowerShot S10 -product CANON S100 0x3045 PowerShot S100 -product CANON S200 0x3065 PowerShot S200 -product CANON REBELXT 0x30ef Digital Rebel XT - -/* CATC products */ -product CATC NETMATE 0x000a Netmate Ethernet -product CATC NETMATE2 0x000c Netmate2 Ethernet -product CATC CHIEF 0x000d USB Chief Bus & Protocol Analyzer -product CATC ANDROMEDA 0x1237 Andromeda hub - -/* CASIO products */ -product CASIO QV_DIGICAM 0x1001 QV DigiCam -product CASIO EXS880 0x1105 Exilim EX-S880 -product CASIO BE300 0x2002 BE-300 PDA -product CASIO NAMELAND 0x4001 CASIO Nameland EZ-USB - -/* CCYU products */ -product CCYU ED1064 0x2136 EasyDisk ED1064 - -/* Century products */ -product CENTURY EX35QUAT 0x011e Century USB Disk Enclosure - -/* Cherry products */ -product CHERRY MY3000KBD 0x0001 My3000 keyboard -product CHERRY MY3000HUB 0x0003 My3000 hub -product CHERRY CYBOARD 0x0004 CyBoard Keyboard - -/* Chic Technology products */ -product CHIC MOUSE1 0x0001 mouse -product CHIC CYPRESS 0x0003 Cypress USB Mouse - -/* Chicony products */ -product CHICONY KB8933 0x0001 KB-8933 keyboard -product MICRODIA TWINKLECAM 0x600d TwinkleCam USB camera - -/* CH Products */ -product CHPRODUCTS PROTHROTTLE 0x00f1 Pro Throttle -product CHPRODUCTS PROPEDALS 0x00f2 Pro Pedals -product CHPRODUCTS FIGHTERSTICK 0x00f3 Fighterstick -product CHPRODUCTS FLIGHTYOKE 0x00ff Flight Sim Yoke - -/* Cisco-Linksys products */ -product CISCOLINKSYS WUSB54G 0x000d WUSB54G Wireless Adapter -product CISCOLINKSYS WUSB54GP 0x0011 WUSB54GP Wireless Adapter -product CISCOLINKSYS USB200MV2 0x0018 USB200M v2 -product CISCOLINKSYS HU200TS 0x001a HU200TS Wireless Adapter -product CISCOLINKSYS WUSB54GC 0x0020 WUSB54GC -product CISCOLINKSYS WUSB54GR 0x0023 WUSB54GR -product CISCOLINKSYS WUSBF54G 0x0024 WUSBF54G - -/* CMOTECH products */ -product CMOTECH CNU510 0x5141 CMOTECH CDMA Technologies USB modem -product CMOTECH CNU550 0x5543 CDMA 2000 1xRTT/1xEVDO USB modem -product CMOTECH CDMA_MODEM1 0x6280 CMOTECH CDMA Technologies USB modem - -/* Compaq products */ -product COMPAQ IPAQPOCKETPC 0x0003 iPAQ PocketPC -product COMPAQ PJB100 0x504a Personal Jukebox PJB100 -product COMPAQ IPAQLINUX 0x505a iPAQ Linux - -/* Composite Corp products looks the same as "TANGTOP" */ -product COMPOSITE USBPS2 0x0001 USB to PS2 Adaptor - -/* Conceptronic products */ -product CONCEPTRONIC PRISM_GT 0x3762 PrismGT USB 2.0 WLAN -product CONCEPTRONIC C11U 0x7100 C11U -product CONCEPTRONIC WL210 0x7110 WL-210 -product CONCEPTRONIC AR5523_1 0x7801 AR5523 -product CONCEPTRONIC AR5523_1_NF 0x7802 AR5523 (no firmware) -product CONCEPTRONIC AR5523_2 0x7811 AR5523 -product CONCEPTRONIC AR5523_2_NF 0x7812 AR5523 (no firmware) -product CONCEPTRONIC2 C54RU 0x3c02 C54RU WLAN -product CONCEPTRONIC2 C54RU2 0x3c22 C54RU - -/* Connectix products */ -product CONNECTIX QUICKCAM 0x0001 QuickCam - -/* Corega products */ -product COREGA ETHER_USB_T 0x0001 Ether USB-T -product COREGA FETHER_USB_TX 0x0004 FEther USB-TX -product COREGA WLAN_USB_USB_11 0x000c WirelessLAN USB-11 -product COREGA FETHER_USB_TXS 0x000d FEther USB-TXS -product COREGA WLANUSB 0x0012 Wireless LAN Stick-11 -product COREGA FETHER_USB2_TX 0x0017 FEther USB2-TX -product COREGA WLUSB_11_KEY 0x001a ULUSB-11 Key -product COREGA CGWLUSB2GL 0x002d CG-WLUSB2GL -product COREGA CGWLUSB2GPX 0x002e CG-WLUSB2GPX -product COREGA WLUSB_11_STICK 0x7613 WLAN USB Stick 11 -product COREGA FETHER_USB_TXC 0x9601 FEther USB-TXC - -/* Creative products */ -product CREATIVE NOMAD_II 0x1002 Nomad II MP3 player -product CREATIVE NOMAD_IIMG 0x4004 Nomad II MG -product CREATIVE NOMAD 0x4106 Nomad -product CREATIVE2 VOIP_BLASTER 0x0258 Voip Blaster -product CREATIVE3 OPTICAL_MOUSE 0x0001 Notebook Optical Mouse - -/* Cambridge Silicon Radio Ltd. products */ -product CSR BT_DONGLE 0x0001 Bluetooth USB dongle -product CSR CSRDFU 0xffff USB Bluetooth Device in DFU State - -/* CTX products */ -product CTX EX1300 0x9999 Ex1300 hub - -/* Curitel products */ -product CURITEL HX550C 0x1101 CDMA 2000 1xRTT USB modem (HX-550C) -product CURITEL HX57XB 0x2101 CDMA 2000 1xRTT USB modem (HX-570/575B/PR-600) -product CURITEL PC5740 0x3701 Broadband Wireless modem - -/* CyberPower products */ -product CYBERPOWER 1500CAVRLCD 0x0501 1500CAVRLCD - -/* CyberTAN Technology products */ -product CYBERTAN TG54USB 0x1666 TG54USB - -/* Cypress Semiconductor products */ -product CYPRESS MOUSE 0x0001 mouse -product CYPRESS THERMO 0x0002 thermometer -product CYPRESS WISPY1A 0x0bad MetaGeek Wi-Spy -product CYPRESS KBDHUB 0x0101 Keyboard/Hub -product CYPRESS FMRADIO 0x1002 FM Radio -product CYPRESS USBRS232 0x5500 USB-RS232 Interface -product CYPRESS SLIM_HUB 0x6560 Slim Hub - -/* Daisy Technology products */ -product DAISY DMC 0x6901 USB MultiMedia Reader - -/* Dallas Semiconductor products */ -product DALLAS J6502 0x4201 J-6502 speakers - -/* Dell products */ -product DELL PORT 0x0058 Port Replicator -product DELL AIO926 0x5115 Photo AIO Printer 926 -product DELL BC02 0x8000 BC02 Bluetooth USB Adapter -product DELL PRISM_GT_1 0x8102 PrismGT USB 2.0 WLAN -product DELL TM350 0x8103 TrueMobile 350 Bluetooth USB Adapter -product DELL PRISM_GT_2 0x8104 PrismGT USB 2.0 WLAN -product DELL U740 0x8135 Dell U740 CDMA - -/* Delorme Paublishing products */ -product DELORME EARTHMATE 0x0100 Earthmate GPS - -/* Desknote products */ -product DESKNOTE UCR_61S2B 0x0c55 UCR-61S2B - -/* Diamond products */ -product DIAMOND RIO500USB 0x0001 Rio 500 USB - -/* Dick Smith Electronics (really C-Net) products */ -product DICKSMITH RT2573 0x9022 RT2573 -product DICKSMITH CWD854F 0x9032 C-Net CWD-854 rev F - -/* Digi International products */ -product DIGI ACCELEPORT2 0x0002 AccelePort USB 2 -product DIGI ACCELEPORT4 0x0004 AccelePort USB 4 -product DIGI ACCELEPORT8 0x0008 AccelePort USB 8 - -/* D-Link products */ -/*product DLINK DSBS25 0x0100 DSB-S25 serial*/ -product DLINK DUBE100 0x1a00 10/100 Ethernet -product DLINK DSB650TX4 0x200c 10/100 Ethernet -product DLINK DWL120E 0x3200 DWL-120 rev E -product DLINK DWL122 0x3700 DWL-122 -product DLINK DWLG120 0x3701 DWL-G120 -product DLINK DWL120F 0x3702 DWL-120 rev F -product DLINK DWLAG132 0x3a00 DWL-AG132 -product DLINK DWLAG132_NF 0x3a01 DWL-AG132 (no firmware) -product DLINK DWLG132 0x3a02 DWL-G132 -product DLINK DWLG132_NF 0x3a03 DWL-G132 (no firmware) -product DLINK DWLAG122 0x3a04 DWL-AG122 -product DLINK DWLAG122_NF 0x3a05 DWL-AG122 (no firmware) -product DLINK DWLG122 0x3c00 DWL-G122 b1 Wireless Adapter -product DLINK DUBE100B1 0x3c05 DUB-E100 rev B1 -product DLINK DSB650C 0x4000 10Mbps Ethernet -product DLINK DSB650TX1 0x4001 10/100 Ethernet -product DLINK DSB650TX 0x4002 10/100 Ethernet -product DLINK DSB650TX_PNA 0x4003 1/10/100 Ethernet -product DLINK DSB650TX3 0x400b 10/100 Ethernet -product DLINK DSB650TX2 0x4102 10/100 Ethernet -product DLINK DSB650 0xabc1 10/100 Ethernet -product DLINK2 DWLG122C1 0x3c03 DWL-G122 c1 -product DLINK2 WUA1340 0x3c04 WUA-1340 -product DLINK2 DWA111 0x3c06 DWA-111 -product DLINK2 DWA110 0x3c07 DWA-110 - -/* DMI products */ -product DMI CFSM_RW 0xa109 CF/SM Reader/Writer - -/* DrayTek products */ -product DRAYTEK VIGOR550 0x0550 Vigor550 - -/* Dynastream Innovations */ -product DYNASTREAM ANTDEVBOARD 0x1003 ANT dev board - -/* EIZO products */ -product EIZO HUB 0x0000 hub -product EIZO MONITOR 0x0001 monitor - -/* ELCON Systemtechnik products */ -product ELCON PLAN 0x0002 Goldpfeil P-LAN - -/* Elecom products */ -product ELECOM MOUSE29UO 0x0002 mouse 29UO -product ELECOM LDUSBTX0 0x200c LD-USB/TX -product ELECOM LDUSBTX1 0x4002 LD-USB/TX -product ELECOM LDUSBLTX 0x4005 LD-USBL/TX -product ELECOM LDUSBTX2 0x400b LD-USB/TX -product ELECOM LDUSB20 0x4010 LD-USB20 -product ELECOM UCSGT 0x5003 UC-SGT -product ELECOM UCSGT0 0x5004 UC-SGT -product ELECOM LDUSBTX3 0xabc1 LD-USB/TX - -/* Elsa products */ -product ELSA MODEM1 0x2265 ELSA Modem Board -product ELSA USB2ETHERNET 0x3000 Microlink USB2Ethernet - -/* EMS products */ -product EMS DUAL_SHOOTER 0x0003 PSX gun controller converter - -/* Entrega products */ -product ENTREGA 1S 0x0001 1S serial -product ENTREGA 2S 0x0002 2S serial -product ENTREGA 1S25 0x0003 1S25 serial -product ENTREGA 4S 0x0004 4S serial -product ENTREGA E45 0x0005 E45 Ethernet -product ENTREGA CENTRONICS 0x0006 Parallel Port -product ENTREGA XX1 0x0008 Ethernet -product ENTREGA 1S9 0x0093 1S9 serial -product ENTREGA EZUSB 0x8000 EZ-USB -/*product ENTREGA SERIAL 0x8001 DB25 Serial*/ -product ENTREGA 2U4S 0x8004 2U4S serial/usb hub -product ENTREGA XX2 0x8005 Ethernet -/*product ENTREGA SERIAL_DB9 0x8093 DB9 Serial*/ - -/* Epson products */ -product EPSON PRINTER1 0x0001 USB Printer -product EPSON PRINTER2 0x0002 ISD USB Smart Cable for Mac -product EPSON PRINTER3 0x0003 ISD USB Smart Cable -product EPSON PRINTER5 0x0005 USB Printer -product EPSON 636 0x0101 Perfection 636U / 636Photo scanner -product EPSON 610 0x0103 Perfection 610 scanner -product EPSON 1200 0x0104 Perfection 1200U / 1200Photo scanner -product EPSON 1600 0x0107 Expression 1600 scanner -product EPSON 1640 0x010a Perfection 1640SU scanner -product EPSON 1240 0x010b Perfection 1240U / 1240Photo scanner -product EPSON 640U 0x010c Perfection 640U scanner -product EPSON 1250 0x010f Perfection 1250U / 1250Photo scanner -product EPSON 1650 0x0110 Perfection 1650 scanner -product EPSON GT9700F 0x0112 GT-9700F scanner -product EPSON GT9300UF 0x011b GT-9300UF scanner -product EPSON 3200 0x011c Perfection 3200 scanner -product EPSON 1260 0x011d Perfection 1260 scanner -product EPSON 1660 0x011e Perfection 1660 scanner -product EPSON 1670 0x011f Perfection 1670 scanner -product EPSON 1270 0x0120 Perfection 1270 scanner -product EPSON 2480 0x0121 Perfection 2480 scanner -product EPSON 3590 0x0122 Perfection 3590 scanner -product EPSON 4990 0x012a Perfection 4990 Photo scanner -product EPSON STYLUS_875DC 0x0601 Stylus Photo 875DC Card Reader -product EPSON STYLUS_895 0x0602 Stylus Photo 895 Card Reader -product EPSON CX5400 0x0808 CX5400 scanner -product EPSON 3500 0x080e CX-3500/3600/3650 MFP -product EPSON RX425 0x080f Stylus Photo RX425 scanner -product EPSON 4800 0x0819 CX4800 MP scanner -product EPSON 4200 0x0820 CX4200 MP scanner -product EPSON 5000 0x082b DX-50x0 MFP scanner -product EPSON 6000 0x082e DX-60x0 MFP scanner -product EPSON DX7400 0x0838 DX7400/CX7300 scanner -product EPSON DX8400 0x0839 DX8400 scanner - -/* e-TEK Labs products */ -product ETEK 1COM 0x8007 Serial - -/* Extended Systems products */ -product EXTENDED XTNDACCESS 0x0100 XTNDAccess IrDA - -/* FEIYA products */ -product FEIYA 5IN1 0x1132 5-in-1 Card Reader - -/* Fiberline */ -product FIBERLINE WL430U 0x6003 WL-430U - -/* Fossil, Inc products */ -product FOSSIL WRISTPDA 0x0002 Wrist PDA - -/* Freecom products */ -product FREECOM DVD 0xfc01 DVD drive - -/* Fujitsu Siemens Computers products */ -product FSC E5400 0x1009 PrismGT USB 2.0 WLAN - -/* Future Technology Devices products */ -product FTDI SERIAL_8U100AX 0x8372 8U100AX Serial -product FTDI SERIAL_8U232AM 0x6001 8U232AM Serial -product FTDI SERIAL_2232C 0x6010 FT2232C Dual port Serial -/* Gude Analog- und Digitalsysteme products also uses FTDI's id: */ -product FTDI TACTRIX_OPENPORT_13M 0xcc48 OpenPort 1.3 Mitsubishi -product FTDI TACTRIX_OPENPORT_13S 0xcc49 OpenPort 1.3 Subaru -product FTDI TACTRIX_OPENPORT_13U 0xcc4a OpenPort 1.3 Universal -product FTDI EISCOU 0xe888 Expert ISDN Control USB -product FTDI UOPTBR 0xe889 USB-RS232 OptoBridge -product FTDI EMCU2D 0xe88a Expert mouseCLOCK USB II -product FTDI PCMSFU 0xe88b Precision Clock MSF USB -product FTDI EMCU2H 0xe88c Expert mouseCLOCK USB II HBG -product FTDI USBSERIAL 0xfa00 Matrix Orbital USB Serial -product FTDI MX2_3 0xfa01 Matrix Orbital MX2 or MX3 -product FTDI MX4_5 0xfa02 Matrix Orbital MX4 or MX5 -product FTDI LK202 0xfa03 Matrix Orbital VK/LK202 Family -product FTDI LK204 0xfa04 Matrix Orbital VK/LK204 Family -product FTDI CFA_632 0xfc08 Crystalfontz CFA-632 USB LCD -product FTDI CFA_634 0xfc09 Crystalfontz CFA-634 USB LCD -product FTDI CFA_633 0xfc0b Crystalfontz CFA-633 USB LCD -product FTDI CFA_631 0xfc0c Crystalfontz CFA-631 USB LCD -product FTDI CFA_635 0xfc0d Crystalfontz CFA-635 USB LCD -product FTDI SEMC_DSS20 0xfc82 SEMC DSS-20 SyncStation - -/* Fuji photo products */ -product FUJIPHOTO MASS0100 0x0100 Mass Storage - -/* Fujitsu protducts */ -product FUJITSU AH_F401U 0x105b AH-F401U Air H device - -/* Garmin products */ -product GARMIN IQUE_3600 0x0004 iQue 3600 - -/* General Instruments (Motorola) products */ -product GENERALINSTMNTS SB5100 0x5100 SURFboard SB5100 Cable modem - -/* Genesys Logic products */ -product GENESYS GL620USB 0x0501 GL620USB Host-Host interface -product GENESYS GL650 0x0604 GL650 Hub -product GENESYS GL641USB 0x0700 GL641USB CompactFlash Card Reader -product GENESYS GL641USB2IDE_2 0x0701 GL641USB USB-IDE Bridge No 2 -product GENESYS GL641USB2IDE 0x0702 GL641USB USB-IDE Bridge -product GENESYS GL641USB_2 0x0760 GL641USB 6-in-1 Card Reader - -/* GIGABYTE products */ -product GIGABYTE GN54G 0x8001 GN-54G -product GIGABYTE GNBR402W 0x8002 GN-BR402W -product GIGABYTE GNWLBM101 0x8003 GN-WLBM101 -product GIGABYTE GNWBKG 0x8007 GN-WBKG -product GIGABYTE GNWB01GS 0x8008 GN-WB01GS -product GIGABYTE GNWI05GS 0x800a GN-WI05GS - -/* Gigaset products */ -product GIGASET WLAN 0x0701 WLAN -product GIGASET SMCWUSBTG 0x0710 SMCWUSBT-G -product GIGASET SMCWUSBTG_NF 0x0711 SMCWUSBT-G (no firmware) -product GIGASET AR5523 0x0712 AR5523 -product GIGASET AR5523_NF 0x0713 AR5523 (no firmware) -product GIGASET RT2573 0x0722 RT2573 - -/* Global Sun Technology product */ -product GLOBALSUN AR5523_1 0x7801 AR5523 -product GLOBALSUN AR5523_1_NF 0x7802 AR5523 (no firmware) -product GLOBALSUN AR5523_2 0x7811 AR5523 -product GLOBALSUN AR5523_2_NF 0x7812 AR5523 (no firmware) - -/* Globespan products */ -product GLOBESPAN PRISM_GT_1 0x2000 PrismGT USB 2.0 WLAN -product GLOBESPAN PRISM_GT_2 0x2002 PrismGT USB 2.0 WLAN - -/* G.Mate, Inc products */ -product GMATE YP3X00 0x1001 YP3X00 PDA - -/* GoHubs products */ -product GOHUBS GOCOM232 0x1001 GoCOM232 Serial - -/* Good Way Technology products */ -product GOODWAY GWUSB2E 0x6200 GWUSB2E -product GOODWAY RT2573 0xc019 RT2573 - -/* Gravis products */ -product GRAVIS GAMEPADPRO 0x4001 GamePad Pro - -/* GREENHOUSE products */ -product GREENHOUSE KANA21 0x0001 CF-writer with MP3 - -/* Griffin Technology */ -product GRIFFIN IMATE 0x0405 iMate, ADB Adapter - -/* Guillemot Corporation */ -product GUILLEMOT DALEADER 0xa300 DA Leader -product GUILLEMOT HWGUSB254 0xe000 HWGUSB2-54 WLAN -product GUILLEMOT HWGUSB254LB 0xe010 HWGUSB2-54-LB -product GUILLEMOT HWGUSB254V2AP 0xe020 HWGUSB2-54V2-AP - -/* Hagiwara products */ -product HAGIWARA FGSM 0x0002 FlashGate SmartMedia Card Reader -product HAGIWARA FGCF 0x0003 FlashGate CompactFlash Card Reader -product HAGIWARA FG 0x0005 FlashGate - -/* HAL Corporation products */ -product HAL IMR001 0x0011 Crossam2+USB IR commander - -/* Handspring, Inc. */ -product HANDSPRING VISOR 0x0100 Handspring Visor -product HANDSPRING TREO 0x0200 Handspring Treo -product HANDSPRING TREO600 0x0300 Handspring Treo 600 - -/* Hauppauge Computer Works */ -product HAUPPAUGE WINTV_USB_FM 0x4d12 WinTV USB FM - -/* Hawking Technologies products */ -product HAWKING UF100 0x400c 10/100 USB Ethernet - -/* Hitachi, Ltd. products */ -product HITACHI DVDCAM_DZ_MV100A 0x0004 DVD-CAM DZ-MV100A Camcorder -product HITACHI DVDCAM_USB 0x001e DVDCAM USB HS Interface - -/* HP products */ -product HP 895C 0x0004 DeskJet 895C -product HP 4100C 0x0101 Scanjet 4100C -product HP S20 0x0102 Photosmart S20 -product HP 880C 0x0104 DeskJet 880C -product HP 4200C 0x0105 ScanJet 4200C -product HP CDWRITERPLUS 0x0107 CD-Writer Plus -product HP KBDHUB 0x010c Multimedia Keyboard Hub -product HP G55XI 0x0111 OfficeJet G55xi -product HP HN210W 0x011c HN210W 802.11b WLAN -product HP 49GPLUS 0x0121 49g+ graphing calculator -product HP 6200C 0x0201 ScanJet 6200C -product HP S20b 0x0202 PhotoSmart S20 -product HP 815C 0x0204 DeskJet 815C -product HP 3300C 0x0205 ScanJet 3300C -product HP CDW8200 0x0207 CD-Writer Plus 8200e -product HP MMKEYB 0x020c Multimedia keyboard -product HP 1220C 0x0212 DeskJet 1220C -product HP 810C 0x0304 DeskJet 810C/812C -product HP 4300C 0x0305 Scanjet 4300C -product HP CDW4E 0x0307 CD-Writer+ CD-4e -product HP G85XI 0x0311 OfficeJet G85xi -product HP 1200 0x0317 LaserJet 1200 -product HP 5200C 0x0401 Scanjet 5200C -product HP 830C 0x0404 DeskJet 830C -product HP 3400CSE 0x0405 ScanJet 3400cse -product HP 6300C 0x0601 Scanjet 6300C -product HP 840C 0x0604 DeskJet 840c -product HP 2200C 0x0605 ScanJet 2200C -product HP 5300C 0x0701 Scanjet 5300C -product HP 4400C 0x0705 Scanjet 4400C -product HP 82x0C 0x0b01 Scanjet 82x0C -product HP 2300D 0x0b17 Laserjet 2300d -product HP 970CSE 0x1004 Deskjet 970Cse -product HP 5400C 0x1005 Scanjet 5400C -product HP 2215 0x1016 iPAQ 22xx/Jornada 548 -product HP 568J 0x1116 Jornada 568 -product HP 930C 0x1204 DeskJet 930c -product HP P2000U 0x1801 Inkjet P-2000U -product HP 640C 0x2004 DeskJet 640c -product HP 4670V 0x3005 ScanJet 4670v -product HP P1100 0x3102 Photosmart P1100 -product HP HN210E 0x811c Ethernet HN210E -product HP2 C500 0x6002 PhotoSmart C500 - -/* HTC products */ -product HTC WINMOBILE 0x00ce HTC USB Sync -product HTC PPC6700MODEM 0x00cf PPC6700 Modem -product HTC SMARTPHONE 0x0a51 SmartPhone USB Sync - -/* HUAWEI products */ -product HUAWEI MOBILE 0x1001 Huawei Mobile -product HUAWEI E270 0x1003 Huawei HSPA modem - -/* HUAWEI 3com products */ -product HUAWEI3COM WUB320G 0x0009 Aolynk WUB320g - -/* IBM Corporation */ -product IBM USBCDROMDRIVE 0x4427 USB CD-ROM Drive - -/* Imagination Technologies products */ -product IMAGINATION DBX1 0x2107 DBX1 DSP core - -/* Inside Out Networks products */ -product INSIDEOUT EDGEPORT4 0x0001 EdgePort/4 serial ports - -/* In-System products */ -product INSYSTEM F5U002 0x0002 Parallel printer -product INSYSTEM ATAPI 0x0031 ATAPI Adapter -product INSYSTEM ISD110 0x0200 IDE Adapter ISD110 -product INSYSTEM ISD105 0x0202 IDE Adapter ISD105 -product INSYSTEM USBCABLE 0x081a USB cable -product INSYSTEM STORAGE_V2 0x5701 USB Storage Adapter V2 - -/* Intel products */ -product INTEL EASYPC_CAMERA 0x0110 Easy PC Camera -product INTEL TESTBOARD 0x9890 82930 test board - -/* Intersil products */ -product INTERSIL PRISM_GT 0x1000 PrismGT USB 2.0 WLAN -product INTERSIL PRISM_2X 0x3642 Prism2.x or Atmel WLAN - -/* Interpid Control Systems products */ -product INTREPIDCS VALUECAN 0x0601 ValueCAN CAN bus interface -product INTREPIDCS NEOVI 0x0701 NeoVI Blue vehicle bus interface - -/* I/O DATA products */ -product IODATA IU_CD2 0x0204 DVD Multi-plus unit iU-CD2 -product IODATA DVR_UEH8 0x0206 DVD Multi-plus unit DVR-UEH8 -product IODATA USBSSMRW 0x0314 USB-SSMRW SD-card -product IODATA USBSDRW 0x031e USB-SDRW SD-card -product IODATA USBETT 0x0901 USB ETT -product IODATA USBETTX 0x0904 USB ETTX -product IODATA USBETTXS 0x0913 USB ETTX -product IODATA USBWNB11A 0x0919 USB WN-B11 -product IODATA USBWNB11 0x0922 USB Airport WN-B11 -product IODATA ETGUS2 0x0930 ETG-US2 -product IODATA USBRSAQ 0x0a03 Serial USB-RSAQ1 -product IODATA2 USB2SC 0x0a09 USB2.0-SCSI Bridge USB2-SC - -/* Iomega products */ -product IOMEGA ZIP100 0x0001 Zip 100 -product IOMEGA ZIP250 0x0030 Zip 250 - -/* Ituner networks products */ -product ITUNERNET USBLCD2X20 0x0002 USB-LCD 2x20 - -/* Jablotron products */ -product JABLOTRON PC60B 0x0001 PC-60B - -/* Jaton products */ -product JATON EDA 0x5704 Ethernet - -/* JVC products */ -product JVC GR_DX95 0x000a GR-DX95 -product JVC MP_PRX1 0x3008 MP-PRX1 Ethernet - -/* JRC products */ -product JRC AH_J3001V_J3002V 0x0001 AirH PHONE AH-J3001V/J3002V - -/* Kawatsu products */ -product KAWATSU MH4000P 0x0003 MiniHub 4000P - -/* Keisokugiken Corp. products */ -product KEISOKUGIKEN USBDAQ 0x0068 HKS-0200 USBDAQ - -/* Kensington products */ -product KENSINGTON ORBIT 0x1003 Orbit USB/PS2 trackball -product KENSINGTON TURBOBALL 0x1005 TurboBall - -/* Keyspan products */ -product KEYSPAN USA28_NF 0x0101 USA-28 serial Adapter (no firmware) -product KEYSPAN USA28X_NF 0x0102 USA-28X serial Adapter (no firmware) -product KEYSPAN USA19_NF 0x0103 USA-19 serial Adapter (no firmware) -product KEYSPAN USA18_NF 0x0104 USA-18 serial Adapter (no firmware) -product KEYSPAN USA18X_NF 0x0105 USA-18X serial Adapter (no firmware) -product KEYSPAN USA19W_NF 0x0106 USA-19W serial Adapter (no firmware) -product KEYSPAN USA19 0x0107 USA-19 serial Adapter -product KEYSPAN USA19W 0x0108 USA-19W serial Adapter -product KEYSPAN USA49W_NF 0x0109 USA-49W serial Adapter (no firmware) -product KEYSPAN USA49W 0x010a USA-49W serial Adapter -product KEYSPAN USA19QI_NF 0x010b USA-19QI serial Adapter (no firmware) -product KEYSPAN USA19QI 0x010c USA-19QI serial Adapter -product KEYSPAN USA19Q_NF 0x010d USA-19Q serial Adapter (no firmware) -product KEYSPAN USA19Q 0x010e USA-19Q serial Adapter -product KEYSPAN USA28 0x010f USA-28 serial Adapter -product KEYSPAN USA28XXB 0x0110 USA-28X/XB serial Adapter -product KEYSPAN USA18 0x0111 USA-18 serial Adapter -product KEYSPAN USA18X 0x0112 USA-18X serial Adapter -product KEYSPAN USA28XB_NF 0x0113 USA-28XB serial Adapter (no firmware) -product KEYSPAN USA28XA_NF 0x0114 USA-28XB serial Adapter (no firmware) -product KEYSPAN USA28XA 0x0115 USA-28XA serial Adapter -product KEYSPAN USA18XA_NF 0x0116 USA-18XA serial Adapter (no firmware) -product KEYSPAN USA18XA 0x0117 USA-18XA serial Adapter -product KEYSPAN USA19QW_NF 0x0118 USA-19WQ serial Adapter (no firmware) -product KEYSPAN USA19QW 0x0119 USA-19WQ serial Adapter -product KEYSPAN USA19HA 0x0121 USA-19HS serial Adapter -product KEYSPAN UIA10 0x0201 UIA-10 remote control -product KEYSPAN UIA11 0x0202 UIA-11 remote control - -/* Kingston products */ -product KINGSTON XX1 0x0008 Ethernet -product KINGSTON KNU101TX 0x000a KNU101TX USB Ethernet - -/* Kawasaki products */ -product KLSI DUH3E10BT 0x0008 USB Ethernet -product KLSI DUH3E10BTN 0x0009 USB Ethernet - -/* Kodak products */ -product KODAK DC220 0x0100 Digital Science DC220 -product KODAK DC260 0x0110 Digital Science DC260 -product KODAK DC265 0x0111 Digital Science DC265 -product KODAK DC290 0x0112 Digital Science DC290 -product KODAK DC240 0x0120 Digital Science DC240 -product KODAK DC280 0x0130 Digital Science DC280 - -/* Konica Corp. Products */ -product KONICA CAMERA 0x0720 Digital Color Camera - -/* KYE products */ -product KYE NICHE 0x0001 Niche mouse -product KYE NETSCROLL 0x0003 Genius NetScroll mouse -product KYE FLIGHT2000 0x1004 Flight 2000 joystick -product KYE VIVIDPRO 0x2001 ColorPage Vivid-Pro scanner - -/* Kyocera products */ -product KYOCERA FINECAM_S3X 0x0100 Finecam S3x -product KYOCERA FINECAM_S4 0x0101 Finecam S4 -product KYOCERA FINECAM_S5 0x0103 Finecam S5 -product KYOCERA FINECAM_L3 0x0105 Finecam L3 -product KYOCERA AHK3001V 0x0203 AH-K3001V -product KYOCERA2 CDMA_MSM_K 0x17da Qualcomm Kyocera CDMA Technologies MSM - -/* LaCie products */ -product LACIE HD 0xa601 Hard Disk -product LACIE CDRW 0xa602 CD R/W - -/* Lexar products */ -product LEXAR JUMPSHOT 0x0001 jumpSHOT CompactFlash Reader -product LEXAR CF_READER 0xb002 USB CF Reader - -/* Lexmark products */ -product LEXMARK S2450 0x0009 Optra S 2450 - -/* Linksys products */ -product LINKSYS MAUSB2 0x0105 Camedia MAUSB-2 -product LINKSYS USB10TX1 0x200c USB10TX -product LINKSYS USB10T 0x2202 USB10T Ethernet -product LINKSYS USB100TX 0x2203 USB100TX Ethernet -product LINKSYS USB100H1 0x2204 USB100H1 Ethernet/HPNA -product LINKSYS USB10TA 0x2206 USB10TA Ethernet -product LINKSYS USB10TX2 0x400b USB10TX -product LINKSYS2 WUSB11 0x2219 WUSB11 Wireless Adapter -product LINKSYS2 USB200M 0x2226 USB 2.0 10/100 Ethernet -product LINKSYS3 WUSB11v28 0x2233 WUSB11 v2.8 Wireless Adapter -product LINKSYS4 USB1000 0x0039 USB1000 - -/* Logitech products */ -product LOGITECH M2452 0x0203 M2452 keyboard -product LOGITECH M4848 0x0301 M4848 mouse -product LOGITECH PAGESCAN 0x040f PageScan -product LOGITECH QUICKCAMWEB 0x0801 QuickCam Web -product LOGITECH QUICKCAMPRO 0x0810 QuickCam Pro -product LOGITECH QUICKCAMEXP 0x0840 QuickCam Express -product LOGITECH QUICKCAM 0x0850 QuickCam -product LOGITECH N43 0xc000 N43 -product LOGITECH N48 0xc001 N48 mouse -product LOGITECH MBA47 0xc002 M-BA47 mouse -product LOGITECH WMMOUSE 0xc004 WingMan Gaming Mouse -product LOGITECH BD58 0xc00c BD58 mouse -product LOGITECH UN58A 0xc030 iFeel Mouse -product LOGITECH UN53B 0xc032 iFeel MouseMan -product LOGITECH WMPAD 0xc208 WingMan GamePad Extreme -product LOGITECH WMRPAD 0xc20a WingMan RumblePad -product LOGITECH WMJOY 0xc281 WingMan Force joystick -product LOGITECH BB13 0xc401 USB-PS/2 Trackball -product LOGITECH RK53 0xc501 Cordless mouse -product LOGITECH RB6 0xc503 Cordless keyboard -product LOGITECH MX700 0xc506 Cordless optical mouse -product LOGITECH QUICKCAMPRO2 0xd001 QuickCam Pro - -/* Logitec Corp. products */ -product LOGITEC LDR_H443SU2 0x0033 DVD Multi-plus unit LDR-H443SU2 -product LOGITEC LDR_H443U2 0x00b3 DVD Multi-plus unit LDR-H443U2 - -/* Lucent products */ -product LUCENT EVALKIT 0x1001 USS-720 evaluation kit - -/* Luwen products */ -product LUWEN EASYDISK 0x0005 EasyDisc - -/* Macally products */ -product MACALLY MOUSE1 0x0101 mouse - -/* MCT Corp. */ -product MCT HUB0100 0x0100 Hub -product MCT DU_H3SP_USB232 0x0200 D-Link DU-H3SP USB BAY Hub -product MCT USB232 0x0210 USB-232 Interface -product MCT SITECOM_USB232 0x0230 Sitecom USB-232 Products - -/* Melco, Inc products */ -product MELCO LUATX1 0x0001 LUA-TX Ethernet -product MELCO LUATX5 0x0005 LUA-TX Ethernet -product MELCO LUA2TX5 0x0009 LUA2-TX Ethernet -product MELCO LUAKTX 0x0012 LUA-KTX Ethernet -product MELCO DUBPXXG 0x001c USB-IDE Bridge: DUB-PxxG -product MELCO LUAU2KTX 0x003d LUA-U2-KTX Ethernet -product MELCO KG54YB 0x005e WLI-U2-KG54-YB WLAN -product MELCO KG54 0x0066 WLI-U2-KG54 WLAN -product MELCO KG54AI 0x0067 WLI-U2-KG54-AI WLAN -product MELCO NINWIFI 0x008b Nintendo Wi-Fi -product MELCO PCOPRS1 0x00b3 PC-OP-RS1 RemoteStation -product MELCO SG54HP 0x00d8 WLI-U2-SG54HP -product MELCO G54HP 0x00d9 WLI-U2-G54HP -product MELCO KG54L 0x00da WLI-U2-KG54L - -/* Merlin products */ -product MERLIN V620 0x1110 Merlin V620 - -/* MetaGeek products */ -product METAGEEK WISPY1B 0x083e MetaGeek Wi-Spy -product METAGEEK WISPY24X 0x083f MetaGeek Wi-Spy 2.4x - -/* Metricom products */ -product METRICOM RICOCHET_GS 0x0001 Ricochet GS - -/* MGE UPS Systems */ -product MGE UPS1 0x0001 MGE UPS SYSTEMS PROTECTIONCENTER 1 -product MGE UPS2 0xffff MGE UPS SYSTEMS PROTECTIONCENTER 2 - -/* Micro Star International products */ -product MSI BT_DONGLE 0x1967 Bluetooth USB dongle -product MSI UB11B 0x6823 UB11B -product MSI RT2570 0x6861 RT2570 -product MSI RT2570_2 0x6865 RT2570 -product MSI RT2570_3 0x6869 RT2570 -product MSI RT2573_1 0x6874 RT2573 -product MSI RT2573_2 0x6877 RT2573 -product MSI RT2573_3 0xa861 RT2573 -product MSI RT2573_4 0xa874 RT2573 - -/* Microdia products */ -product MICRODIA TWINKLECAM 0x600d TwinkleCam USB camera - -/* Microsoft products */ -product MICROSOFT SIDEPREC 0x0008 SideWinder Precision Pro -product MICROSOFT INTELLIMOUSE 0x0009 IntelliMouse -product MICROSOFT NATURALKBD 0x000b Natural Keyboard Elite -product MICROSOFT DDS80 0x0014 Digital Sound System 80 -product MICROSOFT SIDEWINDER 0x001a Sidewinder Precision Racing Wheel -product MICROSOFT INETPRO 0x001c Internet Keyboard Pro -product MICROSOFT TBEXPLORER 0x0024 Trackball Explorer -product MICROSOFT INTELLIEYE 0x0025 IntelliEye mouse -product MICROSOFT INETPRO2 0x002b Internet Keyboard Pro -product MICROSOFT MN510 0x006e MN510 Wireless -product MICROSOFT MN110 0x007a 10/100 USB NIC -product MICROSOFT WLINTELLIMOUSE 0x008c Wireless Optical IntelliMouse -product MICROSOFT WLNOTEBOOK 0x00b9 Wireless Optical Mouse (Model 1023) -product MICROSOFT WLNOTEBOOK2 0x00e1 Wireless Optical Mouse 3000 (Model 1056) -product MICROSOFT WLNOTEBOOK3 0x00d2 Wireless Optical Mouse 3000 (Model 1049) -product MICROSOFT WLUSBMOUSE 0x00b9 Wireless USB Mouse -product MICROSOFT XBOX360 0x0292 XBOX 360 WLAN - -/* Microtech products */ -product MICROTECH SCSIDB25 0x0004 USB-SCSI-DB25 -product MICROTECH SCSIHD50 0x0005 USB-SCSI-HD50 -product MICROTECH DPCM 0x0006 USB CameraMate -product MICROTECH FREECOM 0xfc01 Freecom USB-IDE - -/* Microtek products */ -product MICROTEK 336CX 0x0094 Phantom 336CX - C3 scanner -product MICROTEK X6U 0x0099 ScanMaker X6 - X6U -product MICROTEK C6 0x009a Phantom C6 scanner -product MICROTEK 336CX2 0x00a0 Phantom 336CX - C3 scanner -product MICROTEK V6USL 0x00a3 ScanMaker V6USL -product MICROTEK V6USL2 0x80a3 ScanMaker V6USL -product MICROTEK V6UL 0x80ac ScanMaker V6UL - -/* Microtune, Inc. products */ -product MICROTUNE BT_DONGLE 0x1000 Bluetooth USB dongle - -/* Midiman products */ -product MIDIMAN MIDISPORT2X2 0x1001 Midisport 2x2 - -/* MindsAtWork products */ -product MINDSATWORK WALLET 0x0001 Digital Wallet - -/* Minolta Co., Ltd. */ -product MINOLTA 2300 0x4001 Dimage 2300 -product MINOLTA S304 0x4007 Dimage S304 -product MINOLTA X 0x4009 Dimage X -product MINOLTA 5400 0x400e Dimage 5400 -product MINOLTA F300 0x4011 Dimage F300 -product MINOLTA E223 0x4017 Dimage E223 - -/* Mitsumi products */ -product MITSUMI CDRRW 0x0000 CD-R/RW Drive -product MITSUMI BT_DONGLE 0x641f Bluetooth USB dongle -product MITSUMI FDD 0x6901 USB FDD - -/* Mobility products */ -product MOBILITY EA 0x0204 Ethernet -product MOBILITY EASIDOCK 0x0304 EasiDock Ethernet - -/* MosChip products */ -product MOSCHIP MCS7703 0x7703 MCS7703 Serial Port Adapter -product MOSCHIP MCS7830 0x7830 MCS7830 Ethernet - -/* Motorola products */ -product MOTOROLA MC141555 0x1555 MC141555 hub controller -product MOTOROLA SB4100 0x4100 SB4100 USB Cable Modem -product MOTOROLA2 A41XV32X 0x2a22 A41x/V32x Mobile Phones -product MOTOROLA2 E398 0x4810 E398 Mobile Phone -product MOTOROLA2 USBLAN 0x600c USBLAN -product MOTOROLA2 USBLAN2 0x6027 USBLAN - -/* MultiTech products */ -product MULTITECH ATLAS 0xf101 MT5634ZBA-USB modem - -/* Mustek products */ -product MUSTEK 1200CU 0x0001 1200 CU scanner -product MUSTEK 600CU 0x0002 600 CU scanner -product MUSTEK 1200USB 0x0003 1200 USB scanner -product MUSTEK 1200UB 0x0006 1200 UB scanner -product MUSTEK 1200USBPLUS 0x0007 1200 USB Plus scanner -product MUSTEK 1200CUPLUS 0x0008 1200 CU Plus scanner -product MUSTEK BEARPAW1200F 0x0010 BearPaw 1200F scanner -product MUSTEK BEARPAW1200TA 0x021e BearPaw 1200TA scanner -product MUSTEK 600USB 0x0873 600 USB scanner -product MUSTEK MDC800 0xa800 MDC-800 digital camera - -/* M-Systems products */ -product MSYSTEMS DISKONKEY 0x0010 DiskOnKey -product MSYSTEMS DISKONKEY2 0x0011 DiskOnKey - -/* Myson products */ -product MYSON HEDEN 0x8818 USB-IDE - -/* National Semiconductor */ -product NATIONAL BEARPAW1200 0x1000 BearPaw 1200 -product NATIONAL BEARPAW2400 0x1001 BearPaw 2400 - -/* NEC products */ -product NEC HUB 0x55aa hub -product NEC HUB_B 0x55ab hub - -/* NEODIO products */ -product NEODIO ND3260 0x3260 8-in-1 Multi-format Flash Controller -product NEODIO ND5010 0x5010 Multi-format Flash Controller - -/* Netac products */ -product NETAC CF_CARD 0x1060 USB-CF-Card -product NETAC ONLYDISK 0x0003 OnlyDisk - -/* NetChip Technology Products */ -product NETCHIP TURBOCONNECT 0x1080 Turbo-Connect -product NETCHIP CLIK_40 0xa140 USB Clik! 40 -product NETCHIP ETHERNETGADGET 0xa4a2 Linux Ethernet/RNDIS gadget on pxa210/25x/26x - -/* Netgear products */ -product NETGEAR EA101 0x1001 Ethernet -product NETGEAR EA101X 0x1002 Ethernet -product NETGEAR FA101 0x1020 Ethernet 10/100, USB1.1 -product NETGEAR FA120 0x1040 USB 2.0 Ethernet -product NETGEAR WG111V2_2 0x4240 PrismGT USB 2.0 WLAN -product NETGEAR WG111U 0x4300 WG111U -product NETGEAR WG111U_NF 0x4301 WG111U (no firmware) -product NETGEAR2 MA101 0x4100 MA101 -product NETGEAR2 MA101B 0x4102 MA101 Rev B -product NETGEAR3 WG111T 0x4250 WG111T -product NETGEAR3 WG111T_NF 0x4251 WG111T (no firmware) -product NETGEAR3 WPN111 0x5f00 WPN111 -product NETGEAR3 WPN111_NF 0x5f01 WPN111 (no firmware) - -/* Nikon products */ -product NIKON E990 0x0102 Digital Camera E990 -product NIKON LS40 0x4000 CoolScan LS40 ED -product NIKON D300 0x041a Digital Camera D300 - -/* NovaTech Products */ -product NOVATECH NV902 0x9020 NovaTech NV-902W -product NOVATECH RT2573 0x9021 RT2573 - -/* Novatel Wireless products */ -product NOVATEL V640 0x1100 Merlin V620 -product NOVATEL CDMA_MODEM 0x1110 Novatel Wireless Merlin CDMA -product NOVATEL V620 0x1110 Merlin V620 -product NOVATEL V740 0x1120 Merlin V740 -product NOVATEL V720 0x1130 Merlin V720 -product NOVATEL U740 0x1400 Merlin U740 -product NOVATEL U740_2 0x1410 Merlin U740 -product NOVATEL U870 0x1420 Merlin U870 -product NOVATEL XU870 0x1430 Merlin XU870 -product NOVATEL X950D 0x1450 Merlin X950D -product NOVATEL ES620 0x2100 ES620 CDMA -product NOVATEL U720 0x2110 Merlin U720 -product NOVATEL U727 0x4100 Merlin U727 CDMA -product NOVATEL U950D 0x4400 Novatel MC950D HSUPA -product NOVATEL ZEROCD 0x5010 Novatel ZeroCD -product NOVATEL2 FLEXPACKGPS 0x0100 NovAtel FlexPack GPS receiver - -/* Merlin products */ -product MERLIN V620 0x1110 Merlin V620 - -/* Olympus products */ -product OLYMPUS C1 0x0102 C-1 Digital Camera -product OLYMPUS C700 0x0105 C-700 Ultra Zoom - -/* OmniVision Technologies, Inc. products */ -product OMNIVISION OV511 0x0511 OV511 Camera -product OMNIVISION OV511PLUS 0xa511 OV511+ Camera - -/* OnSpec Electronic, Inc. */ -product ONSPEC MDCFE_B_CF_READER 0xa000 MDCFE-B USB CF Reader -product ONSPEC CFMS_RW 0xa001 SIIG/Datafab Memory Stick+CF Reader/Writer -product ONSPEC READER 0xa003 Datafab-based Reader -product ONSPEC CFSM_READER 0xa005 PNY/Datafab CF+SM Reader -product ONSPEC CFSM_READER2 0xa006 Simple Tech/Datafab CF+SM Reader -product ONSPEC MDSM_B_READER 0xa103 MDSM-B reader -product ONSPEC CFSM_COMBO 0xa109 USB to CF + SM Combo (LC1) -product ONSPEC UCF100 0xa400 FlashLink UCF-100 CompactFlash Reader -product ONSPEC2 IMAGEMATE_SDDR55 0xa103 ImageMate SDDR55 - -/* Option products */ -product OPTION VODAFONEMC3G 0x5000 Vodafone Mobile Connect 3G datacard -product OPTION GT3G 0x6000 GlobeTrotter 3G datacard -product OPTION GT3GQUAD 0x6300 GlobeTrotter 3G QUAD datacard -product OPTION GT3GPLUS 0x6600 GlobeTrotter 3G+ datacard -product OPTION GTMAX36 0x6701 GlobeTrotter Max 3.6 Modem - -/* OQO */ -product OQO WIFI01 0x0002 model 01 WiFi interface -product OQO BT01 0x0003 model 01 Bluetooth interface -product OQO ETHER01PLUS 0x7720 model 01+ Ethernet -product OQO ETHER01 0x8150 model 01 Ethernet interface - -/* Palm Computing, Inc. product */ -product PALM SERIAL 0x0080 USB Serial -product PALM M500 0x0001 Palm m500 -product PALM M505 0x0002 Palm m505 -product PALM M515 0x0003 Palm m515 -product PALM I705 0x0020 Palm i705 -product PALM TUNGSTEN_Z 0x0031 Palm Tungsten Z -product PALM M125 0x0040 Palm m125 -product PALM M130 0x0050 Palm m130 -product PALM TUNGSTEN_T 0x0060 Palm Tungsten T -product PALM ZIRE31 0x0061 Palm Zire 31 -product PALM ZIRE 0x0070 Palm Zire - -/* Panasonic products */ -product PANASONIC LS120CAM 0x0901 LS-120 Camera -product PANASONIC KXL840AN 0x0d01 CD-R Drive KXL-840AN -product PANASONIC KXLRW32AN 0x0d09 CD-R Drive KXL-RW32AN -product PANASONIC KXLCB20AN 0x0d0a CD-R Drive KXL-CB20AN -product PANASONIC KXLCB35AN 0x0d0e DVD-ROM & CD-R/RW -product PANASONIC SDCAAE 0x1b00 MultiMediaCard - -/* Peracom products */ -product PERACOM SERIAL1 0x0001 Serial -product PERACOM ENET 0x0002 Ethernet -product PERACOM ENET3 0x0003 At Home Ethernet -product PERACOM ENET2 0x0005 Ethernet - -/* Philips products */ -product PHILIPS DSS350 0x0101 DSS 350 Digital Speaker System -product PHILIPS DSS 0x0104 DSS XXX Digital Speaker System -product PHILIPS HUB 0x0201 hub -product PHILIPS PCA646VC 0x0303 PCA646VC PC Camera -product PHILIPS PCVC680K 0x0308 PCVC680K Vesta Pro PC Camera -product PHILIPS DSS150 0x0471 DSS 150 Digital Speaker System -product PHILIPS SNU5600 0x1236 SNU5600 -product PHILIPS UM10016 0x1552 ISP 1581 Hi-Speed USB MPEG2 Encoder Reference Kit -product PHILIPS DIVAUSB 0x1801 DIVA USB mp3 player - -/* Philips Semiconductor products */ -product PHILIPSSEMI HUB1122 0x1122 hub - -/* P.I. Engineering products */ -product PIENGINEERING PS2USB 0x020b PS2 to Mac USB Adapter - -/* Planex Communications products */ -product PLANEX GW_US11H 0x14ea GW-US11H WLAN -product PLANEX2 GW_US11S 0x3220 GW-US11S WLAN -product PLANEX2 GW_US54GXS 0x5303 GW-US54GXS WLAN -product PLANEX2 GWUS54HP 0xab01 GW-US54HP -product PLANEX2 GWUS54MINI2 0xab50 GW-US54Mini2 -product PLANEX2 GWUS54SG 0xc002 GW-US54SG -product PLANEX2 GWUS54GZL 0xc007 GW-US54GZL -product PLANEX2 GWUS54GD 0xed01 GW-US54GD -product PLANEX2 GWUSMM 0xed02 GW-USMM -product PLANEX3 GWUS54GZ 0xab10 GW-US54GZ -product PLANEX3 GU1000T 0xab11 GU-1000T -product PLANEX3 GWUS54MINI 0xab13 GW-US54Mini - -/* Plextor Corp. */ -product PLEXTOR 40_12_40U 0x0011 PlexWriter 40/12/40U - -/* PLX products */ -product PLX TESTBOARD 0x9060 test board - -/* PNY products */ -product PNY ATTACHE2 0x0010 USB 2.0 Flash Drive - -/* PortGear products */ -product PORTGEAR EA8 0x0008 Ethernet -product PORTGEAR EA9 0x0009 Ethernet - -/* Portsmith products */ -product PORTSMITH EEA 0x3003 Express Ethernet - -/* Primax products */ -product PRIMAX G2X300 0x0300 G2-200 scanner -product PRIMAX G2E300 0x0301 G2E-300 scanner -product PRIMAX G2300 0x0302 G2-300 scanner -product PRIMAX G2E3002 0x0303 G2E-300 scanner -product PRIMAX 9600 0x0340 Colorado USB 9600 scanner -product PRIMAX 600U 0x0341 Colorado 600u scanner -product PRIMAX 6200 0x0345 Visioneer 6200 scanner -product PRIMAX 19200 0x0360 Colorado USB 19200 scanner -product PRIMAX 1200U 0x0361 Colorado 1200u scanner -product PRIMAX G600 0x0380 G2-600 scanner -product PRIMAX 636I 0x0381 ReadyScan 636i -product PRIMAX G2600 0x0382 G2-600 scanner -product PRIMAX G2E600 0x0383 G2E-600 scanner -product PRIMAX COMFORT 0x4d01 Comfort -product PRIMAX MOUSEINABOX 0x4d02 Mouse-in-a-Box -product PRIMAX PCGAUMS1 0x4d04 Sony PCGA-UMS1 - -/* Prolific products */ -product PROLIFIC PL2301 0x0000 PL2301 Host-Host interface -product PROLIFIC PL2302 0x0001 PL2302 Host-Host interface -product PROLIFIC RSAQ2 0x04bb PL2303 Serial (IODATA USB-RSAQ2) -product PROLIFIC PL2303 0x2303 PL2303 Serial (ATEN/IOGEAR UC232A) -product PROLIFIC PL2305 0x2305 Parallel printer -product PROLIFIC ATAPI4 0x2307 ATAPI-4 Controller -product PROLIFIC PL2501 0x2501 PL2501 Host-Host interface -product PROLIFIC PHAROS 0xaaa0 Prolific Pharos -product PROLIFIC RSAQ3 0xaaa2 PL2303 Serial Adapter (IODATA USB-RSAQ3) -product PROLIFIC2 WSIM 0x2001 Willcom WSIM - -/* Putercom products */ -product PUTERCOM UPA100 0x047e USB-1284 BRIDGE - -/* Qcom products */ -product QCOM RT2573 0x6196 RT2573 -product QCOM RT2573_2 0x6229 RT2573 - -/* Qualcomm products */ -product QUALCOMM CDMA_MSM 0x6000 CDMA Technologies MSM phone -product QUALCOMM2 RWT_FCT 0x3100 RWT FCT-CDMA 2000 1xRTT modem -product QUALCOMM2 CDMA_MSM 0x3196 CDMA Technologies MSM modem -product QUALCOMMINC CDMA_MSM 0x0001 CDMA Technologies MSM modem - -/* Qtronix products */ -product QTRONIX 980N 0x2011 Scorpion-980N keyboard - -/* Quickshot products */ -product QUICKSHOT STRIKEPAD 0x6238 USB StrikePad - -/* Radio Shack */ -product RADIOSHACK USBCABLE 0x4026 USB to Serial Cable - -/* Rainbow Technologies products */ -product RAINBOW IKEY2000 0x1200 i-Key 2000 - -/* Ralink Technology products */ -product RALINK RT2570 0x1706 RT2500USB Wireless Adapter -product RALINK RT2570_2 0x2570 RT2500USB Wireless Adapter -product RALINK RT2573 0x2573 RT2501USB Wireless Adapter -product RALINK RT2671 0x2671 RT2601USB Wireless Adapter -product RALINK RT2570_3 0x9020 RT2500USB Wireless Adapter -product RALINK RT2573_2 0x9021 RT2501USB Wireless Adapter - -/* ReakTek products */ -/* Green House and CompUSA OEM this part */ -product REALTEK USBKR100 0x8150 USBKR100 USB Ethernet - -/* Ricoh products */ -product RICOH VGPVCC2 0x1830 VGP-VCC2 Camera -product RICOH VGPVCC3 0x1832 VGP-VCC3 Camera -product RICOH VGPVCC2_2 0x1833 VGP-VCC2 Camera -product RICOH VGPVCC2_3 0x1834 VGP-VCC2 Camera -product RICOH VGPVCC7 0x183a VGP-VCC7 Camera -product RICOH VGPVCC8 0x183b VGP-VCC8 Camera - -/* Roland products */ -product ROLAND UM1 0x0009 UM-1 MIDI I/F -product ROLAND UM880N 0x0014 EDIROL UM-880 MIDI I/F (native) -product ROLAND UM880G 0x0015 EDIROL UM-880 MIDI I/F (generic) - -/* Rockfire products */ -product ROCKFIRE GAMEPAD 0x2033 gamepad 203USB - -/* RATOC Systems products */ -product RATOC REXUSB60 0xb000 REX-USB60 - -/* Sagem products */ -product SAGEM USBSERIAL 0x0027 USB-Serial Controller -product SAGEM XG760A 0x004a XG-760A -product SAGEM XG76NA 0x0062 XG-76NA - -/* Samsung products */ -product SAMSUNG ML6060 0x3008 ML-6060 laser printer -product SAMSUNG YP_U2 0x5050 YP-U2 MP3 Player -product SAMSUNG I500 0x6601 I500 Palm USB Phone - -/* Samsung Techwin products */ -product SAMSUNG_TECHWIN DIGIMAX_410 0x000a Digimax 410 - -/* SanDisk products */ -product SANDISK SDDR05A 0x0001 ImageMate SDDR-05a -product SANDISK SDDR31 0x0002 ImageMate SDDR-31 -product SANDISK SDDR05 0x0005 ImageMate SDDR-05 -product SANDISK SDDR12 0x0100 ImageMate SDDR-12 -product SANDISK SDDR09 0x0200 ImageMate SDDR-09 -product SANDISK SDDR75 0x0810 ImageMate SDDR-75 -product SANDISK SDCZ2_256 0x7104 Cruzer Mini 256MB -product SANDISK SDCZ4_128 0x7112 Cruzer Micro 128MB -product SANDISK SDCZ4_256 0x7113 Cruzer Micro 256MB - -/* Sanyo Electric products */ -product SANYO SCP4900 0x0701 Sanyo SCP-4900 USB Phone - -/* ScanLogic products */ -product SCANLOGIC SL11R 0x0002 SL11R IDE Adapter -product SCANLOGIC 336CX 0x0300 Phantom 336CX - C3 scanner - -/* Senao products */ -product SENAO NUB8301 0x2000 NUB-8301 - -/* ShanTou products */ -product SHANTOU ST268 0x0268 ST268 -product SHANTOU DM9601 0x9601 DM 9601 - -/* Shark products */ -product SHARK PA 0x0400 Pocket Adapter - -/* Sharp products */ -product SHARP SL5500 0x8004 Zaurus SL-5500 PDA -product SHARP SLA300 0x8005 Zaurus SL-A300 PDA -product SHARP SL5600 0x8006 Zaurus SL-5600 PDA -product SHARP SLC700 0x8007 Zaurus SL-C700 PDA -product SHARP SLC750 0x9031 Zaurus SL-C750 PDA -product SHARP WZERO3ES 0x9123 W-ZERO3 ES Smartphone - -/* Shuttle Technology products */ -product SHUTTLE EUSB 0x0001 E-USB Bridge -product SHUTTLE EUSCSI 0x0002 eUSCSI Bridge -product SHUTTLE SDDR09 0x0003 ImageMate SDDR09 -product SHUTTLE EUSBCFSM 0x0005 eUSB SmartMedia / CompactFlash Adapter -product SHUTTLE ZIOMMC 0x0006 eUSB MultiMediaCard Adapter -product SHUTTLE HIFD 0x0007 Sony Hifd -product SHUTTLE EUSBATAPI 0x0009 eUSB ATA/ATAPI Adapter -product SHUTTLE CF 0x000a eUSB CompactFlash Adapter -product SHUTTLE EUSCSI_B 0x000b eUSCSI Bridge -product SHUTTLE EUSCSI_C 0x000c eUSCSI Bridge -product SHUTTLE CDRW 0x0101 CD-RW Device -product SHUTTLE EUSBORCA 0x0325 eUSB ORCA Quad Reader - -/* Siemens products */ -product SIEMENS SPEEDSTREAM 0x1001 SpeedStream -product SIEMENS SPEEDSTREAM22 0x1022 SpeedStream 1022 -product SIEMENS2 WLL013 0x001b WLL013 -product SIEMENS2 ES75 0x0034 GSM module MC35 -product SIEMENS2 WL54G 0x3c06 54g USB Network Adapter -product SIEMENS3 SX1 0x0001 SX1 -product SIEMENS3 X65 0x0003 X65 -product SIEMENS3 X75 0x0004 X75 - -/* Sierra Wireless products */ -product SIERRA AIRCARD580 0x0112 Sierra Wireless AirCard 580 -product SIERRA AIRCARD595 0x0019 Sierra Wireless AirCard 595 -product SIERRA AC595U 0x0120 Sierra Wireless AirCard 595U -product SIERRA AC597E 0x0021 Sierra Wireless AirCard 597E -product SIERRA C597 0x0023 Sierra Wireless Compass 597 -product SIERRA AC880 0x6850 Sierra Wireless AirCard 880 -product SIERRA AC881 0x6851 Sierra Wireless AirCard 881 -product SIERRA AC880E 0x6852 Sierra Wireless AirCard 880E -product SIERRA AC881E 0x6853 Sierra Wireless AirCard 881E -product SIERRA AC880U 0x6855 Sierra Wireless AirCard 880U -product SIERRA AC881U 0x6856 Sierra Wireless AirCard 881U -product SIERRA EM5625 0x0017 EM5625 -product SIERRA MC5720 0x0218 MC5720 Wireless Modem -product SIERRA MC5720_2 0x0018 MC5720 -product SIERRA MC5725 0x0020 MC5725 -product SIERRA MINI5725 0x0220 Sierra Wireless miniPCI 5275 -product SIERRA MC8755_2 0x6802 MC8755 -product SIERRA MC8765 0x6803 MC8765 -product SIERRA MC8755 0x6804 MC8755 -product SIERRA AC875U 0x6812 AC875U HSDPA USB Modem -product SIERRA MC8755_3 0x6813 MC8755 HSDPA -product SIERRA MC8775_2 0x6815 MC8775 -product SIERRA AIRCARD875 0x6820 Aircard 875 HSDPA -product SIERRA MC8780 0x6832 MC8780 -product SIERRA MC8781 0x6833 MC8781 -product SIERRA TRUINSTALL 0x0fff Aircard Tru Installer - -/* Sigmatel products */ -product SIGMATEL I_BEAD100 0x8008 i-Bead 100 MP3 Player - -/* SIIG products */ -/* Also: Omnidirectional Control Technology products */ -product SIIG DIGIFILMREADER 0x0004 DigiFilm-Combo Reader -product SIIG WINTERREADER 0x0330 WINTERREADER Reader -product SIIG2 USBTOETHER 0x0109 USB TO Ethernet -product SIIG2 US2308 0x0421 Serial - -/* Silicom products */ -product SILICOM U2E 0x0001 U2E -product SILICOM GPE 0x0002 Psion Gold Port Ethernet - -/* SI Labs */ -product SILABS POLOLU 0x803b Pololu Serial -product SILABS ARGUSISP 0x8066 Argussoft ISP -product SILABS CRUMB128 0x807a Crumb128 board -product SILABS DEGREE 0x80ca Degree Controls Inc -product SILABS TRAQMATE 0x80ed Track Systems Traqmate -product SILABS SUUNTO 0x80f6 Suunto Sports Instrument -product SILABS BURNSIDE 0x813d Burnside Telecon Deskmobile -product SILABS HELICOM 0x815e Helicomm IP-Link 1220-DVM -product SILABS CP2102 0xea60 SILABS USB UART -product SILABS LIPOWSKY_JTAG 0x81c8 Lipowsky Baby-JTAG -product SILABS LIPOWSKY_LIN 0x81e2 Lipowsky Baby-LIN -product SILABS LIPOWSKY_HARP 0x8218 Lipowsky HARP-1 -product SILABS CP2102 0xea60 SILABS USB UARTa -product SILABS CP210X_2 0xea61 CP210x Serial -product SILABS2 DCU11CLONE 0xaa26 DCU-11 clone - -/* Silicon Portals Inc. */ -product SILICONPORTALS YAPPH_NF 0x0200 YAP Phone (no firmware) -product SILICONPORTALS YAPPHONE 0x0201 YAP Phone - -/* Sirius Technologies products */ -product SIRIUS ROADSTER 0x0001 NetComm Roadster II 56 USB - -/* Sitecom products */ -product SITECOM LN029 0x182d USB 2.0 Ethernet -product SITECOM SERIAL 0x2068 USB to serial cable (v2) -product SITECOM2 WL022 0x182d WL-022 - -/* Sitecom Europe products */ -product SITECOMEU LN028 0x061c LN-028 -product SITECOMEU WL113 0x9071 WL-113 -product SITECOMEU ZD1211B 0x9075 ZD1211B -product SITECOMEU WL172 0x90ac WL-172 -product SITECOMEU WL113R2 0x9712 WL-113 rev 2 - -/* Skanhex Technology products */ -product SKANHEX MD_7425 0x410a MD 7425 Camera -product SKANHEX SX_520Z 0x5200 SX 520z Camera - -/* SmartBridges products */ -product SMARTBRIDGES SMARTLINK 0x0001 SmartLink USB Ethernet -product SMARTBRIDGES SMARTNIC 0x0003 smartNIC 2 PnP Ethernet - -/* SMC products */ -product SMC 2102USB 0x0100 10Mbps Ethernet -product SMC 2202USB 0x0200 10/100 Ethernet -product SMC 2206USB 0x0201 EZ Connect USB Ethernet -product SMC 2862WG 0xee13 EZ Connect Wireless Adapter -product SMC2 2020HUB 0x2020 USB Hub -product SMC3 2662WUSB 0xa002 2662W-AR Wireless - -/* SOHOware products */ -product SOHOWARE NUB100 0x9100 10/100 USB Ethernet -product SOHOWARE NUB110 0x9110 10/100 USB Ethernet - -/* SOLID YEAR products */ -product SOLIDYEAR KEYBOARD 0x2101 Solid Year USB keyboard - -/* SONY products */ -product SONY DSC 0x0010 DSC cameras -product SONY MS_NW_MS7 0x0025 Memorystick NW-MS7 -product SONY PORTABLE_HDD_V2 0x002b Portable USB Harddrive V2 -product SONY MSACUS1 0x002d Memorystick MSAC-US1 -product SONY HANDYCAM 0x002e Handycam -product SONY MSC 0x0032 MSC memory stick slot -product SONY CLIE_35 0x0038 Sony Clie v3.5 -product SONY MS_PEG_N760C 0x0058 PEG N760c Memorystick -product SONY CLIE_40 0x0066 Sony Clie v4.0 -product SONY MS_MSC_U03 0x0069 Memorystick MSC-U03 -product SONY CLIE_40_MS 0x006d Sony Clie v4.0 Memory Stick slot -product SONY CLIE_S360 0x0095 Sony Clie s360 -product SONY CLIE_41_MS 0x0099 Sony Clie v4.1 Memory Stick slot -product SONY CLIE_41 0x009a Sony Clie v4.1 -product SONY CLIE_NX60 0x00da Sony Clie nx60 -product SONY CLIE_TH55 0x0144 Sony Clie th55 -product SONY CLIE_TJ37 0x0169 Sony Clie tj37 - -/* Sony Ericsson products */ -product SONYERICSSON DCU10 0x0528 USB Cable - -/* SOURCENEXT products */ -product SOURCENEXT KEIKAI8 0x039f KeikaiDenwa 8 -product SOURCENEXT KEIKAI8_CHG 0x012e KeikaiDenwa 8 with charger - -/* SparkLAN products */ -product SPARKLAN RT2573 0x0004 RT2573 - -/* Sphairon Access Systems GmbH products */ -product SPHAIRON UB801R 0x0110 UB801R - -/* STMicroelectronics products */ -product STMICRO BIOCPU 0x2016 Biometric Coprocessor -product STMICRO COMMUNICATOR 0x7554 USB Communicator - -/* STSN products */ -product STSN STSN0001 0x0001 Internet Access Device - -/* SUN Corporation products */ -product SUNTAC DS96L 0x0003 SUNTAC U-Cable type D2 -product SUNTAC PS64P1 0x0005 SUNTAC U-Cable type P1 -product SUNTAC VS10U 0x0009 SUNTAC Slipper U -product SUNTAC IS96U 0x000a SUNTAC Ir-Trinity -product SUNTAC AS64LX 0x000b SUNTAC U-Cable type A3 -product SUNTAC AS144L4 0x0011 SUNTAC U-Cable type A4 - -/* Sun Microsystems products */ -product SUN KEYBOARD 0x0005 Type 6 USB keyboard -/* XXX The above is a North American PC style keyboard possibly */ -product SUN MOUSE 0x0100 Type 6 USB mouse - -/* Supra products */ -product DIAMOND2 SUPRAEXPRESS56K 0x07da Supra Express 56K modem -product DIAMOND2 SUPRA2890 0x0b4a SupraMax 2890 56K Modem -product DIAMOND2 RIO600USB 0x5001 Rio 600 USB -product DIAMOND2 RIO800USB 0x5002 Rio 800 USB - -/* Surecom Technology products */ -product SURECOM RT2570 0x11f3 RT2570 -product SURECOM RT2573 0x31f3 RT2573 - -/* Sweex products */ -product SWEEX ZD1211 0x1809 ZD1211 - -/* System TALKS, Inc. */ -product SYSTEMTALKS SGCX2UL 0x1920 SGC-X2UL - -/* Tapwave products */ -product TAPWAVE ZODIAC 0x0100 Zodiac - -/* Taugagreining products */ -product TAUGA CAMERAMATE 0x0005 CameraMate (DPCM_USB) - -/* TDK products */ -product TDK UPA9664 0x0115 USB-PDC Adapter UPA9664 -product TDK UCA1464 0x0116 USB-cdmaOne Adapter UCA1464 -product TDK UHA6400 0x0117 USB-PHS Adapter UHA6400 -product TDK UPA6400 0x0118 USB-PHS Adapter UPA6400 -product TDK BT_DONGLE 0x0309 Bluetooth USB dongle - -/* TEAC products */ -product TEAC FD05PUB 0x0000 FD-05PUB floppy - -/* Tekram Technology products */ -product TEKRAM QUICKWLAN 0x1630 QuickWLAN -product TEKRAM ZD1211_1 0x5630 ZD1211 -product TEKRAM ZD1211_2 0x6630 ZD1211 - -/* Telex Communications products */ -product TELEX MIC1 0x0001 Enhanced USB Microphone - -/* Ten X Technology, Inc. */ -product TENX UAUDIO0 0xf211 USB audio headset - -/* Texas Intel products */ -product TI UTUSB41 0x1446 UT-USB41 hub -product TI TUSB2046 0x2046 TUSB2046 hub - -/* Thrustmaster products */ -product THRUST FUSION_PAD 0xa0a3 Fusion Digital Gamepad - -/* Topre Corporation products */ -product TOPRE HHKB 0x0100 HHKB Professional - -/* Toshiba Corporation products */ -product TOSHIBA POCKETPC_E740 0x0706 PocketPC e740 - -/* Trek Technology products */ -product TREK THUMBDRIVE 0x1111 ThumbDrive -product TREK MEMKEY 0x8888 IBM USB Memory Key -product TREK THUMBDRIVE_8MB 0x9988 ThumbDrive_8MB - -/* Tripp-Lite products */ -product TRIPPLITE U209 0x2008 Serial - -/* Trumpion products */ -product TRUMPION T33520 0x1001 T33520 USB Flash Card Controller -product TRUMPION C3310 0x1100 Comotron C3310 MP3 player -product TRUMPION MP3 0x1200 MP3 player - -/* TwinMOS */ -product TWINMOS G240 0xa006 G240 -product TWINMOS MDIV 0x1325 Memory Disk IV - -/* Ubiquam products */ -product UBIQUAM UALL 0x3100 CDMA 1xRTT USB Modem (U-100/105/200/300/520) - -/* Ultima products */ -product ULTIMA 1200UBPLUS 0x4002 1200 UB Plus scanner - -/* UMAX products */ -product UMAX ASTRA1236U 0x0002 Astra 1236U Scanner -product UMAX ASTRA1220U 0x0010 Astra 1220U Scanner -product UMAX ASTRA2000U 0x0030 Astra 2000U Scanner -product UMAX ASTRA2100U 0x0130 Astra 2100U Scanner -product UMAX ASTRA2200U 0x0230 Astra 2200U Scanner -product UMAX ASTRA3400 0x0060 Astra 3400 Scanner - -/* U-MEDIA Communications products */ -product UMEDIA TEW444UBEU 0x3006 TEW-444UB EU -product UMEDIA TEW444UBEU_NF 0x3007 TEW-444UB EU (no firmware) -product UMEDIA TEW429UB_A 0x300a TEW-429UB_A -product UMEDIA TEW429UB 0x300b TEW-429UB -product UMEDIA TEW429UBC1 0x300d TEW-429UB C1 -product UMEDIA ALL0298V2 0x3204 ALL0298 v2 -product UMEDIA AR5523_2 0x3205 AR5523 -product UMEDIA AR5523_2_NF 0x3206 AR5523 (no firmware) - -/* Universal Access products */ -product UNIACCESS PANACHE 0x0101 Panache Surf USB ISDN Adapter - -/* U.S. Robotics products */ -product USR USR5423 0x0121 USR5423 WLAN - -/* VIA Technologies products */ -product VIA USB2IDEBRIDGE 0x6204 USB 2.0 IDE Bridge - -/* USI products */ -product USI MC60 0x10c5 MC60 Serial - -/* VidzMedia products */ -product VIDZMEDIA MONSTERTV 0x4fb1 MonsterTV P2H - -/* Vision products */ -product VISION VC6452V002 0x0002 CPiA Camera - -/* Visioneer products */ -product VISIONEER 7600 0x0211 OneTouch 7600 -product VISIONEER 5300 0x0221 OneTouch 5300 -product VISIONEER 3000 0x0224 Scanport 3000 -product VISIONEER 6100 0x0231 OneTouch 6100 -product VISIONEER 6200 0x0311 OneTouch 6200 -product VISIONEER 8100 0x0321 OneTouch 8100 -product VISIONEER 8600 0x0331 OneTouch 8600 - -/* Vivitar products */ -product VIVITAR 35XX 0x0003 Vivicam 35Xx - -/* VTech products */ -product VTECH RT2570 0x3012 RT2570 -product VTECH ZD1211B 0x3014 ZD1211B - -/* Wacom products */ -product WACOM CT0405U 0x0000 CT-0405-U Tablet -product WACOM GRAPHIRE 0x0010 Graphire -product WACOM GRAPHIRE3_4X5 0x0013 Graphire 3 4x5 -product WACOM INTUOSA5 0x0021 Intuos A5 -product WACOM GD0912U 0x0022 Intuos 9x12 Graphics Tablet -/* WCH products*/ -product WCH CH341SER 0x5523 CH341/CH340 USB-Serial Bridge -/* Western Digital products */ -product WESTERN COMBO 0x0200 Firewire USB Combo -product WESTERN EXTHDD 0x0400 External HDD -product WESTERN HUB 0x0500 USB HUB -product WESTERN MYBOOK 0x0901 MyBook External HDD - -/* Windbond Electronics */ -product WINBOND UH104 0x5518 4-port USB Hub - -/* WinMaxGroup products */ -product WINMAXGROUP FLASH64MC 0x6660 USB Flash Disk 64M-C - -/* Wistron NeWeb products */ -product WISTRONNEWEB UR045G 0x0427 PrismGT USB 2.0 WLAN -product WISTRONNEWEB UR055G 0x0711 UR055G -product WISTRONNEWEB AR5523_1 0x0826 AR5523 -product WISTRONNEWEB AR5523_1_NF 0x0827 AR5523 (no firmware) -product WISTRONNEWEB AR5523_2 0x082a AR5523 -product WISTRONNEWEB AR5523_2_NF 0x0829 AR5523 (no firmware) - -/* Xerox products */ -product XEROX WCM15 0xffef WorkCenter M15 - -/* Xirlink products */ -product XIRLINK PCCAM 0x8080 IBM PC Camera - -/* Xyratex products */ -product XYRATEX PRISM_GT_1 0x2000 PrismGT USB 2.0 WLAN -product XYRATEX PRISM_GT_2 0x2002 PrismGT USB 2.0 WLAN - -/* Y-E Data products */ -product YEDATA FLASHBUSTERU 0x0000 Flashbuster-U - -/* Yamaha products */ -product YAMAHA UX256 0x1000 UX256 MIDI I/F -product YAMAHA UX96 0x1008 UX96 MIDI I/F -product YAMAHA RTA54I 0x4000 NetVolante RTA54i Broadband&ISDN Router -product YAMAHA RTA55I 0x4004 NetVolante RTA55i Broadband VoIP Router -product YAMAHA RTW65B 0x4001 NetVolante RTW65b Broadband Wireless Router -product YAMAHA RTW65I 0x4002 NetVolante RTW65i Broadband&ISDN Wireless Router - -/* Yano products */ -product YANO U640MO 0x0101 U640MO-03 -product YANO FW800HD 0x05fc METALWEAR-HDD - -/* Z-Com products */ -product ZCOM M4Y750 0x0001 M4Y-750 -product ZCOM XI725 0x0002 XI-725/726 -product ZCOM XI735 0x0005 XI-735 -product ZCOM XG703A 0x0008 PrismGT USB 2.0 WLAN -product ZCOM ZD1211 0x0011 ZD1211 -product ZCOM AR5523 0x0012 AR5523 -product ZCOM AR5523_NF 0x0013 AR5523 driver (no firmware) -product ZCOM ZD1211B 0x001a ZD1211B - -/* Zinwell products */ -product ZINWELL RT2570 0x0260 RT2570 - -/* Zoom Telephonics, Inc. products */ -product ZOOM 2986L 0x9700 2986L Fax modem - -/* Zoran Microelectronics products */ -product ZORAN EX20DSC 0x4343 Digital Camera EX-20 DSC - -/* Zydas Technology Corporation products */ -product ZYDAS ZD1211 0x1211 ZD1211 WLAN abg -product ZYDAS ZD1211B 0x1215 ZD1211B - -/* ZyXEL Communication Co. products */ -product ZYXEL OMNI56K 0x1500 Omni 56K Plus -product ZYXEL 980N 0x2011 Scorpion-980N keyboard -product ZYXEL ZYAIRG220 0x3401 ZyAIR G-220 -product ZYXEL G200V2 0x3407 G-200 v2 -product ZYXEL AG225H 0x3409 AG-225H -product ZYXEL M202 0x340a M-202 -product ZYXEL G220V2 0x340f G-220 v2 -product ZYXEL G202 0x3410 G-202 diff --git a/sys/dev/usb2/image/uscanner2.c b/sys/dev/usb2/image/uscanner2.c index 4dcdde3636f6..89056ea0f342 100644 --- a/sys/dev/usb2/image/uscanner2.c +++ b/sys/dev/usb2/image/uscanner2.c @@ -67,7 +67,7 @@ __FBSDID("$FreeBSD$"); static int uscanner_debug = 0; SYSCTL_NODE(_hw_usb2, OID_AUTO, uscanner, CTLFLAG_RW, 0, "USB uscanner"); -SYSCTL_INT(_hw_usb2_uscanner, OID_AUTO, uscanner, CTLFLAG_RW, &uscanner_debug, +SYSCTL_INT(_hw_usb2_uscanner, OID_AUTO, debug, CTLFLAG_RW, &uscanner_debug, 0, "uscanner debug level"); #endif diff --git a/sys/dev/usb2/include/Makefile b/sys/dev/usb2/include/Makefile index a8f35009ea6d..02ac29f8392c 100644 --- a/sys/dev/usb2/include/Makefile +++ b/sys/dev/usb2/include/Makefile @@ -6,8 +6,8 @@ S=${.CURDIR}/../../.. all: - awk -f $S/tools/usbdevs2h.awk $S/dev/usb2/core/usbdevs -d ; mv usbdevs_data.h usb2_devtable.h - awk -f $S/tools/usbdevs2h.awk $S/dev/usb2/core/usbdevs -h ; mv usbdevs.h usb2_devid.h + awk -f $S/tools/usbdevs2h.awk $S/dev/usb/usbdevs -d ; mv usbdevs_data.h usb2_devtable.h + awk -f $S/tools/usbdevs2h.awk $S/dev/usb/usbdevs -h ; mv usbdevs.h usb2_devid.h clean: rm -f usb2_devtable.h usb2_devid.h diff --git a/sys/dev/usb2/include/urio2_ioctl.h b/sys/dev/usb2/include/urio2_ioctl.h deleted file mode 100644 index 713647cf9773..000000000000 --- a/sys/dev/usb2/include/urio2_ioctl.h +++ /dev/null @@ -1,41 +0,0 @@ -/*- - ---------------------------------------------------------------------- - - Copyright (C) 2000 Cesar Miquel (miquel@df.uba.ar) - - Redistribution and use in source and binary forms, with or without - modification, are permitted under any licence of your choise which - meets the open source licence definiton - http://www.opensource.org/opd.html such as the GNU licence or the - BSD licence. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License or the BSD license for more details. - - ---------------------------------------------------------------------- - - Modified for FreeBSD by Iwasa Kazmi - - ---------------------------------------------------------------------- */ - -/* $FreeBSD$ */ - -#include - -struct RioCommand { - uint16_t length; - int request; - int requesttype; - int value; - int index; - void *buffer; - int timeout; -}; - -#define RIO_SEND_COMMAND _IOWR('U', 200, struct RioCommand) -#define RIO_RECV_COMMAND _IOWR('U', 201, struct RioCommand) - -#define RIO_DIR_OUT 0x0 -#define RIO_DIR_IN 0x1 diff --git a/sys/dev/usb2/include/usb2_devid.h b/sys/dev/usb2/include/usb2_devid.h index 7f59f5465e06..f64882265ff8 100644 --- a/sys/dev/usb2/include/usb2_devid.h +++ b/sys/dev/usb2/include/usb2_devid.h @@ -1,10 +1,10 @@ -/* $FreeBSD$ */ +/* ??? */ /* * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * FreeBSD: src/sys/dev/usb/usbdevs,v 1.372 2008/09/19 09:04:06 kevlo Exp + * FreeBSD: src/sys/dev/usb/usbdevs,v 1.381 2008/11/02 03:00:36 imp Exp */ /* $NetBSD: usbdevs,v 1.392 2004/12/29 08:38:44 imp Exp $ */ @@ -951,6 +951,7 @@ #define USB_PRODUCT_BELKIN_F5D7050 0x7050 /* F5D7050 Wireless Adapter */ #define USB_PRODUCT_BELKIN_F5D7051 0x7051 /* F5D7051 54g USB Network Adapter */ #define USB_PRODUCT_BELKIN_F5D7050A 0x705a /* F5D7050A Wireless Adapter */ +/* Also sold as 'Ativa 802.11g wireless card' */ #define USB_PRODUCT_BELKIN_F5D7050_V4000 0x705c /* F5D7050 v4000 Wireless Adapter */ #define USB_PRODUCT_BELKIN_F5D9050V3 0x905b /* F5D9050 ver 3 Wireless Adapter */ #define USB_PRODUCT_BELKIN2_F5U002 0x0002 /* F5U002 Parallel printer */ @@ -1431,6 +1432,7 @@ #define USB_PRODUCT_HP_640C 0x2004 /* DeskJet 640c */ #define USB_PRODUCT_HP_4670V 0x3005 /* ScanJet 4670v */ #define USB_PRODUCT_HP_P1100 0x3102 /* Photosmart P1100 */ +#define USB_PRODUCT_HP_OJ4215 0x3d11 /* OfficeJet 4215 */ #define USB_PRODUCT_HP_HN210E 0x811c /* Ethernet HN210E */ #define USB_PRODUCT_HP2_C500 0x6002 /* PhotoSmart C500 */ @@ -1441,7 +1443,7 @@ /* HUAWEI products */ #define USB_PRODUCT_HUAWEI_MOBILE 0x1001 /* Huawei Mobile */ -#define USB_PRODUCT_HUAWEI_E270 0x1003 /* Huawei HSPA modem */ +#define USB_PRODUCT_HUAWEI_E220 0x1003 /* Huawei HSDPA modem */ /* HUAWEI 3com products */ #define USB_PRODUCT_HUAWEI3COM_WUB320G 0x0009 /* Aolynk WUB320g */ @@ -1846,7 +1848,7 @@ #define USB_PRODUCT_NOVATEL_ES620 0x2100 /* ES620 CDMA */ #define USB_PRODUCT_NOVATEL_U720 0x2110 /* Merlin U720 */ #define USB_PRODUCT_NOVATEL_U727 0x4100 /* Merlin U727 CDMA */ -#define USB_PRODUCT_NOVATEL_U950D 0x4400 /* Novatel MC950D HSUPA */ +#define USB_PRODUCT_NOVATEL_MC950D 0x4400 /* Novatel MC950D HSUPA */ #define USB_PRODUCT_NOVATEL_ZEROCD 0x5010 /* Novatel ZeroCD */ #define USB_PRODUCT_NOVATEL2_FLEXPACKGPS 0x0100 /* NovAtel FlexPack GPS receiver */ @@ -1862,6 +1864,7 @@ #define USB_PRODUCT_OMNIVISION_OV511PLUS 0xa511 /* OV511+ Camera */ /* OnSpec Electronic, Inc. */ +#define USB_PRODUCT_ONSPEC_SDS_HOTFIND_D 0x0400 /* SDS-infrared.com Hotfind-D Infrared Camera */ #define USB_PRODUCT_ONSPEC_MDCFE_B_CF_READER 0xa000 /* MDCFE-B USB CF Reader */ #define USB_PRODUCT_ONSPEC_CFMS_RW 0xa001 /* SIIG/Datafab Memory Stick+CF Reader/Writer */ #define USB_PRODUCT_ONSPEC_READER 0xa003 /* Datafab-based Reader */ @@ -1878,6 +1881,7 @@ #define USB_PRODUCT_OPTION_GT3GQUAD 0x6300 /* GlobeTrotter 3G QUAD datacard */ #define USB_PRODUCT_OPTION_GT3GPLUS 0x6600 /* GlobeTrotter 3G+ datacard */ #define USB_PRODUCT_OPTION_GTMAX36 0x6701 /* GlobeTrotter Max 3.6 Modem */ +#define USB_PRODUCT_OPTION_GTMAXHSUPA 0x7001 /* GlobeTrotter HSUPA */ /* OQO */ #define USB_PRODUCT_OQO_WIFI01 0x0002 /* model 01 WiFi interface */ @@ -2001,6 +2005,7 @@ #define USB_PRODUCT_QUALCOMM2_RWT_FCT 0x3100 /* RWT FCT-CDMA 2000 1xRTT modem */ #define USB_PRODUCT_QUALCOMM2_CDMA_MSM 0x3196 /* CDMA Technologies MSM modem */ #define USB_PRODUCT_QUALCOMMINC_CDMA_MSM 0x0001 /* CDMA Technologies MSM modem */ +#define USB_PRODUCT_QUALCOMMINC_ZTE_STOR 0x2000 /* USB ZTE Storage */ /* Qtronix products */ #define USB_PRODUCT_QTRONIX_980N 0x2011 /* Scorpion-980N keyboard */ @@ -2237,6 +2242,7 @@ #define USB_PRODUCT_SONY_CLIE_NX60 0x00da /* Sony Clie nx60 */ #define USB_PRODUCT_SONY_CLIE_TH55 0x0144 /* Sony Clie th55 */ #define USB_PRODUCT_SONY_CLIE_TJ37 0x0169 /* Sony Clie tj37 */ +#define USB_PRODUCT_SONY_RF_RECEIVER 0x01db /* Sony RF mouse/kbd Receiver VGP-WRC1 */ /* Sony Ericsson products */ #define USB_PRODUCT_SONYERICSSON_DCU10 0x0528 /* USB Cable */ diff --git a/sys/dev/usb2/include/usb2_devtable.h b/sys/dev/usb2/include/usb2_devtable.h index 168457261ae9..dcbf4f195c07 100644 --- a/sys/dev/usb2/include/usb2_devtable.h +++ b/sys/dev/usb2/include/usb2_devtable.h @@ -1,10 +1,10 @@ -/* $FreeBSD$ */ +/* ??? */ /* * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * FreeBSD: src/sys/dev/usb/usbdevs,v 1.372 2008/09/19 09:04:06 kevlo Exp + * FreeBSD: src/sys/dev/usb/usbdevs,v 1.381 2008/11/02 03:00:36 imp Exp */ /* $NetBSD: usbdevs,v 1.392 2004/12/29 08:38:44 imp Exp $ */ @@ -3100,6 +3100,12 @@ const struct usb_knowndev usb_knowndevs[] = { "Hewlett Packard", "Photosmart P1100", }, + { + USB_VENDOR_HP, USB_PRODUCT_HP_OJ4215, + 0, + "Hewlett Packard", + "OfficeJet 4215", + }, { USB_VENDOR_HP, USB_PRODUCT_HP_HN210E, 0, @@ -3137,10 +3143,10 @@ const struct usb_knowndev usb_knowndevs[] = { "Huawei Mobile", }, { - USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E270, + USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220, 0, "Huawei Technologies", - "Huawei HSPA modem", + "Huawei HSDPA modem", }, { USB_VENDOR_HUAWEI3COM, USB_PRODUCT_HUAWEI3COM_WUB320G, @@ -4775,7 +4781,7 @@ const struct usb_knowndev usb_knowndevs[] = { "Merlin U727 CDMA", }, { - USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U950D, + USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_MC950D, 0, "Novatel Wireless", "Novatel MC950D HSUPA", @@ -4822,6 +4828,12 @@ const struct usb_knowndev usb_knowndevs[] = { "OmniVision", "OV511+ Camera", }, + { + USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_SDS_HOTFIND_D, + 0, + "OnSpec", + "SDS-infrared.com Hotfind-D Infrared Camera", + }, { USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDCFE_B_CF_READER, 0, @@ -4906,6 +4918,12 @@ const struct usb_knowndev usb_knowndevs[] = { "Option N.V:", "GlobeTrotter Max 3.6 Modem", }, + { + USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAXHSUPA, + 0, + "Option N.V:", + "GlobeTrotter HSUPA", + }, { USB_VENDOR_OQO, USB_PRODUCT_OQO_WIFI01, 0, @@ -5428,6 +5446,12 @@ const struct usb_knowndev usb_knowndevs[] = { "Qualcomm, Incorporated", "CDMA Technologies MSM modem", }, + { + USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_ZTE_STOR, + 0, + "Qualcomm, Incorporated", + "USB ZTE Storage", + }, { USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0, @@ -6388,6 +6412,12 @@ const struct usb_knowndev usb_knowndevs[] = { "Sony", "Sony Clie tj37", }, + { + USB_VENDOR_SONY, USB_PRODUCT_SONY_RF_RECEIVER, + 0, + "Sony", + "Sony RF mouse/kbd Receiver VGP-WRC1", + }, { USB_VENDOR_SONYERICSSON, USB_PRODUCT_SONYERICSSON_DCU10, 0, diff --git a/sys/dev/usb2/include/usb2_ioctl.h b/sys/dev/usb2/include/usb2_ioctl.h index 0cab67a4b08b..2a679c9ad236 100644 --- a/sys/dev/usb2/include/usb2_ioctl.h +++ b/sys/dev/usb2/include/usb2_ioctl.h @@ -31,6 +31,11 @@ #include +/* Building "kdump" depends on these includes */ + +#include +#include + #define USB_DEVICE_NAME "usb" #define USB_GENERIC_NAME "ugen" diff --git a/sys/dev/usb2/serial/ubsa2.c b/sys/dev/usb2/serial/ubsa2.c index 68fd8821ac35..6a25bc3fbd5c 100644 --- a/sys/dev/usb2/serial/ubsa2.c +++ b/sys/dev/usb2/serial/ubsa2.c @@ -273,26 +273,6 @@ static const struct usb2_device_id ubsa_devs[] = { {USB_VPI(USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232, 0)}, /* Peracom */ {USB_VPI(USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1, 0)}, - /* Novatel Wireless Merlin cards */ - {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740, 0)}, - /* Dell version of the above */ - {USB_VPI(USB_VENDOR_DELL, USB_PRODUCT_DELL_U740, 0)}, - /* Novatel Wireless Merlin v740 */ - {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_V740, 0)}, - /* Option Vodafone MC3G */ - {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G, 0)}, - /* Option GlobeTrotter 3G */ - {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3G, 0)}, - /* Option GlobeTrotter 3G+ */ - {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GPLUS, 0)}, - /* Option GlobeTrotter Max 3.6 */ - {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAX36, 0)}, - /* Option GlobeTrotter 3G QUAD */ - {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GQUAD, 0)}, - /* Sierra Wireless LENOVO UMTS card */ - {USB_VPI(USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC8755_3, 0)}, - /* Qualcomm, Inc. ZTE CDMA */ - {USB_VPI(USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM, 0)}, }; static device_method_t ubsa_methods[] = { diff --git a/sys/dev/usb2/serial/ugensa2.c b/sys/dev/usb2/serial/ugensa2.c index ccbd8a997a93..29952e66be15 100644 --- a/sys/dev/usb2/serial/ugensa2.c +++ b/sys/dev/usb2/serial/ugensa2.c @@ -178,7 +178,7 @@ static const struct usb2_device_id ugensa_devs[] = { {USB_VPI(USB_VENDOR_CMOTECH, USB_PRODUCT_CMOTECH_CDMA_MODEM1, 0)}, {USB_VPI(USB_VENDOR_KYOCERA2, USB_PRODUCT_KYOCERA2_CDMA_MSM_K, 0)}, {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_49GPLUS, 0)}, - {USB_VPI(USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E270, 0)}, +/* {USB_VPI(USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E270, 0)}, */ {USB_VPI(USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE, 0)}, {USB_VPI(USB_VENDOR_MERLIN, USB_PRODUCT_MERLIN_V620, 0)}, {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_CDMA_MODEM, 0)}, @@ -187,7 +187,7 @@ static const struct usb2_device_id ugensa_devs[] = { {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U727, 0)}, {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740, 0)}, {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740_2, 0)}, - {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U950D, 0)}, +/* {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U950D, 0)}, */ {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_V620, 0)}, {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_V640, 0)}, {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_V720, 0)}, diff --git a/sys/dev/usb2/sound/uaudio2.c b/sys/dev/usb2/sound/uaudio2.c index d6e3878f8de4..9144a93a4069 100644 --- a/sys/dev/usb2/sound/uaudio2.c +++ b/sys/dev/usb2/sound/uaudio2.c @@ -3049,9 +3049,6 @@ uaudio_mixer_signext(uint8_t type, int val) static int uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val) { - DPRINTFN(6, "type=%03x val=%d min=%d max=%d ", - mc->type, val, mc->minval, mc->maxval); - if (mc->type == MIX_ON_OFF) { val = (val != 0); } else if (mc->type == MIX_SELECTOR) { @@ -3063,7 +3060,8 @@ uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val) val = (((val + (mc->delta / 2)) * mc->mul) / 255) + mc->minval; } - DPRINTFN(6, "val=%d\n", val); + DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n", + mc->type, val, mc->minval, mc->maxval, val); return (val); } diff --git a/sys/dev/usb2/storage/umass2.c b/sys/dev/usb2/storage/umass2.c index f998cf1cb2cd..6a284a06800c 100644 --- a/sys/dev/usb2/storage/umass2.c +++ b/sys/dev/usb2/storage/umass2.c @@ -636,6 +636,10 @@ static const struct umass_devdescr umass_devdescr[] = { UMASS_PROTO_SCSI, NO_GETMAXLUN }, + { USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_SDS_HOTFIND_D, RID_WILDCARD, + UMASS_PROTO_SCSI | UMASS_PROTO_BBB, + NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE + }, {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFMS_RW, RID_WILDCARD, UMASS_PROTO_SCSI, NO_QUIRKS diff --git a/sys/dev/usb2/storage/urio2.c b/sys/dev/usb2/storage/urio2.c index 775c3cb4d8b3..adf70bc9d570 100644 --- a/sys/dev/usb2/storage/urio2.c +++ b/sys/dev/usb2/storage/urio2.c @@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #define USB_DEBUG_VAR urio_debug diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 83a16f15f7c5..bb4525dd30e2 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -182,6 +182,7 @@ SUBDIR= ${_ac} \ tzsetup \ ugidfw \ ${_usbdevs} \ + ${_usbconfig} \ ${_vidcontrol} \ vipw \ watch \ @@ -402,6 +403,7 @@ _crunch= crunch .if ${MK_USB} != "no" _usbdevs= usbdevs +_usbconfig= usbconfig .endif .if ${MK_WIRELESS} != "no" diff --git a/usr.sbin/usbconfig/dump.c b/usr.sbin/usbconfig/dump.c index 89a47ac3f79e..ffa8b2c8d9fd 100644 --- a/usr.sbin/usbconfig/dump.c +++ b/usr.sbin/usbconfig/dump.c @@ -96,9 +96,6 @@ static void dump_field(struct libusb20_device *pdev, const char *plevel, const char *field, uint32_t value) { - struct LIBUSB20_CONTROL_SETUP_DECODED req; - uint16_t lang_id; - uint8_t index; uint8_t temp_string[256]; printf("%s%s = 0x%04x ", plevel, field, value); @@ -108,64 +105,15 @@ dump_field(struct libusb20_device *pdev, const char *plevel, return; } if (value == 0) { - printf(" \n"); + printf(" \n"); return; } - LIBUSB20_INIT(LIBUSB20_CONTROL_SETUP, &req); - - lang_id = 0; - index = 0; - - req.bmRequestType = - LIBUSB20_REQUEST_TYPE_STANDARD | - LIBUSB20_RECIPIENT_DEVICE | - LIBUSB20_ENDPOINT_IN; - req.bRequest = LIBUSB20_REQUEST_GET_DESCRIPTOR; - req.wValue = (256 * LIBUSB20_DT_STRING) | index; - req.wIndex = lang_id; - req.wLength = 4; /* bytes */ - - if (libusb20_dev_request_sync(pdev, &req, - temp_string, NULL, 1000, 0)) { - goto done; + if (libusb20_dev_req_string_simple_sync(pdev, value, + temp_string, sizeof(temp_string))) { + printf(" \n"); + return; } - lang_id = temp_string[2] | (temp_string[3] << 8); - - printf(" LangId:0x%04x <", lang_id); - - index = value; - - req.wValue = (256 * LIBUSB20_DT_STRING) | index; - req.wIndex = lang_id; - req.wLength = 4; /* bytes */ - - if (libusb20_dev_request_sync(pdev, &req, - temp_string, NULL, 1000, 0)) { - printf("ERROR>\n"); - goto done; - } - req.wValue = (256 * LIBUSB20_DT_STRING) | index; - req.wIndex = lang_id; - req.wLength = temp_string[0]; /* bytes */ - - if (libusb20_dev_request_sync(pdev, &req, - temp_string, NULL, 1000, 0)) { - printf("ERROR>\n"); - goto done; - } - req.wLength /= 2; - - for (index = 1; index != req.wLength; index++) { - if (isprint(temp_string[(2 * index) + 0])) { - printf("%c", temp_string[(2 * index) + 0]); - } else if (isprint(temp_string[(2 * index) + 1])) { - printf("%c", temp_string[(2 * index) + 1]); - } else { - printf("?"); - } - } - printf(">\n"); -done: + printf(" <%s>\n", temp_string); return; } @@ -244,7 +192,7 @@ dump_be_quirk_names(struct libusb20_backend *pbe) { struct libusb20_quirk q; uint16_t x; - int err; + int error; memset(&q, 0, sizeof(q)); @@ -252,8 +200,8 @@ dump_be_quirk_names(struct libusb20_backend *pbe) for (x = 0; x != 0xFFFF; x++) { - err = libusb20_be_get_quirk_name(pbe, x, &q); - if (err) { + error = libusb20_be_get_quirk_name(pbe, x, &q); + if (error) { if (x == 0) { printf("No quirk names - maybe the USB quirk " "module has not been loaded.\n"); @@ -272,7 +220,7 @@ dump_be_dev_quirks(struct libusb20_backend *pbe) { struct libusb20_quirk q; uint16_t x; - int err; + int error; memset(&q, 0, sizeof(q)); @@ -280,8 +228,8 @@ dump_be_dev_quirks(struct libusb20_backend *pbe) for (x = 0; x != 0xFFFF; x++) { - err = libusb20_be_get_dev_quirk(pbe, x, &q); - if (err) { + error = libusb20_be_get_dev_quirk(pbe, x, &q); + if (error) { if (x == 0) { printf("No device quirks - maybe the USB quirk " "module has not been loaded.\n"); diff --git a/usr.sbin/usbconfig/usbconfig.c b/usr.sbin/usbconfig/usbconfig.c index eb10b5f59bfc..5aa9102860a0 100644 --- a/usr.sbin/usbconfig/usbconfig.c +++ b/usr.sbin/usbconfig/usbconfig.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -40,10 +41,12 @@ struct options { const char *quirkname; + void *buffer; gid_t gid; uid_t uid; mode_t mode; uint32_t got_any; + struct LIBUSB20_CONTROL_SETUP_DECODED setup; uint16_t bus; uint16_t addr; uint16_t iface; @@ -51,6 +54,7 @@ struct options { uint16_t pid; uint16_t lo_rev; /* inclusive */ uint16_t hi_rev; /* inclusive */ + uint8_t string_index; uint8_t config_index; uint8_t alt_index; uint8_t got_list:1; @@ -76,6 +80,8 @@ struct options { uint8_t got_dump_access:1; uint8_t got_remove_device_quirk:1; uint8_t got_add_device_quirk:1; + uint8_t got_dump_string:1; + uint8_t got_do_request:1; }; struct token { @@ -99,6 +105,7 @@ enum { T_DUMP_DEVICE_DESC, T_DUMP_CURR_CONFIG_DESC, T_DUMP_ALL_CONFIG_DESC, + T_DUMP_STRING, T_DUMP_ACCESS, T_DUMP_INFO, T_SUSPEND, @@ -108,6 +115,7 @@ enum { T_POWER_ON, T_RESET, T_LIST, + T_DO_REQUEST, }; static struct options options; @@ -127,6 +135,7 @@ static const struct token token[] = { {"dump_device_desc", T_DUMP_DEVICE_DESC, 0}, {"dump_curr_config_desc", T_DUMP_CURR_CONFIG_DESC, 0}, {"dump_all_config_desc", T_DUMP_ALL_CONFIG_DESC, 0}, + {"dump_string", T_DUMP_STRING, 1}, {"dump_access", T_DUMP_ACCESS, 0}, {"dump_info", T_DUMP_INFO, 0}, {"suspend", T_SUSPEND, 0}, @@ -136,6 +145,7 @@ static const struct token token[] = { {"power_on", T_POWER_ON, 0}, {"reset", T_RESET, 0}, {"list", T_LIST, 0}, + {"do_request", T_DO_REQUEST, 5}, }; static void @@ -144,7 +154,7 @@ be_dev_remove_quirk(struct libusb20_backend *pbe, const char *str) { struct libusb20_quirk q; - int err; + int error; memset(&q, 0, sizeof(q)); @@ -154,8 +164,8 @@ be_dev_remove_quirk(struct libusb20_backend *pbe, q.bcdDeviceHigh = hirev; strlcpy(q.quirkname, str, sizeof(q.quirkname)); - err = libusb20_be_remove_dev_quirk(pbe, &q); - if (err) { + error = libusb20_be_remove_dev_quirk(pbe, &q); + if (error) { printf("Removing quirk '%s' failed, continuing.\n", str); } return; @@ -167,7 +177,7 @@ be_dev_add_quirk(struct libusb20_backend *pbe, const char *str) { struct libusb20_quirk q; - int err; + int error; memset(&q, 0, sizeof(q)); @@ -177,8 +187,8 @@ be_dev_add_quirk(struct libusb20_backend *pbe, q.bcdDeviceHigh = hirev; strlcpy(q.quirkname, str, sizeof(q.quirkname)); - err = libusb20_be_add_dev_quirk(pbe, &q); - if (err) { + error = libusb20_be_add_dev_quirk(pbe, &q); + if (error) { printf("Adding quirk '%s' failed, continuing.\n", str); } return; @@ -192,7 +202,7 @@ get_token(const char *str, uint8_t narg) for (n = 0; n != (sizeof(token) / sizeof(token[0])); n++) { if (strcasecmp(str, token[n].name) == 0) { if (token[n].narg > narg) { - /* to little arguments */ + /* too few arguments */ break; } return (token[n].value); @@ -266,8 +276,8 @@ usage(void) "usbconfig - configure the USB subsystem" "\n" "usage: usbconfig -u -a -i [cmds...]" "\n" "commands:" "\n" - " set_config " "\n" - " set_alt " "\n" + " set_config " "\n" + " set_alt " "\n" " set_owner " "\n" " set_perm " "\n" " add_dev_quirk_vplh " "\n" @@ -277,6 +287,7 @@ usage(void) " dump_device_desc" "\n" " dump_curr_config_desc" "\n" " dump_all_config_desc" "\n" + " dump_string " "\n" " dump_access" "\n" " dump_info" "\n" " suspend" "\n" @@ -286,6 +297,7 @@ usage(void) " power_on" "\n" " reset" "\n" " list" "\n" + " do_request " "\n" ); exit(1); } @@ -293,6 +305,8 @@ usage(void) static void reset_options(struct options *opt) { + if (opt->buffer) + free(opt->buffer); memset(opt, 0, sizeof(*opt)); return; } @@ -418,6 +432,54 @@ flush_command(struct libusb20_backend *pbe, struct options *opt) if (libusb20_dev_open(pdev, 0)) { err(1, "could not open device"); } + if (opt->got_dump_string) { + char *pbuf; + + pbuf = malloc(256); + if (pbuf == NULL) { + err(1, "out of memory"); + } + if (libusb20_dev_req_string_simple_sync(pdev, + opt->string_index, pbuf, 256)) { + printf("STRING_0x%02x = \n", + opt->string_index); + } else { + printf("STRING_0x%02x = <%s>\n", + opt->string_index, pbuf); + } + free(pbuf); + } + if (opt->got_do_request) { + uint16_t actlen; + uint16_t t; + + if (libusb20_dev_request_sync(pdev, &opt->setup, + opt->buffer, &actlen, 5000 /* 5 seconds */ , 0)) { + printf("REQUEST = \n"); + } else if (!(opt->setup.bmRequestType & + LIBUSB20_ENDPOINT_IN)) { + printf("REQUEST = \n"); + } else { + t = actlen; + printf("REQUEST = <"); + for (t = 0; t != actlen; t++) { + printf("0x%02x%s", + ((uint8_t *)opt->buffer)[t], + (t == (actlen - 1)) ? "" : " "); + } + printf("><"); + for (t = 0; t != actlen; t++) { + char c; + + c = ((uint8_t *)opt->buffer)[t]; + if ((c != '<') && + (c != '>') && isprint(c)) { + putchar(c); + } + } + printf(">\n"); + } + } if (opt->got_set_config) { if (libusb20_dev_set_config_index(pdev, opt->config_index)) { @@ -425,7 +487,8 @@ flush_command(struct libusb20_backend *pbe, struct options *opt) } } if (opt->got_set_alt) { - if (libusb20_dev_set_alt_index(pdev, opt->iface, opt->alt_index)) { + if (libusb20_dev_set_alt_index(pdev, opt->iface, + opt->alt_index)) { err(1, "could not set alternate setting"); } } @@ -435,27 +498,32 @@ flush_command(struct libusb20_backend *pbe, struct options *opt) } } if (opt->got_suspend) { - if (libusb20_dev_set_power_mode(pdev, LIBUSB20_POWER_SUSPEND)) { + if (libusb20_dev_set_power_mode(pdev, + LIBUSB20_POWER_SUSPEND)) { err(1, "could not set suspend"); } } if (opt->got_resume) { - if (libusb20_dev_set_power_mode(pdev, LIBUSB20_POWER_RESUME)) { + if (libusb20_dev_set_power_mode(pdev, + LIBUSB20_POWER_RESUME)) { err(1, "could not set resume"); } } if (opt->got_power_off) { - if (libusb20_dev_set_power_mode(pdev, LIBUSB20_POWER_OFF)) { + if (libusb20_dev_set_power_mode(pdev, + LIBUSB20_POWER_OFF)) { err(1, "could not set power OFF"); } } if (opt->got_power_save) { - if (libusb20_dev_set_power_mode(pdev, LIBUSB20_POWER_SAVE)) { + if (libusb20_dev_set_power_mode(pdev, + LIBUSB20_POWER_SAVE)) { err(1, "could not set power SAVE"); } } if (opt->got_power_on) { - if (libusb20_dev_set_power_mode(pdev, LIBUSB20_POWER_ON)) { + if (libusb20_dev_set_power_mode(pdev, + LIBUSB20_POWER_ON)) { err(1, "could not set power ON"); } } @@ -584,13 +652,13 @@ main(int argc, char **argv) n++; break; case T_SET_CONFIG: - opt->config_index = num_id(argv[n + 1], "confindex"); + opt->config_index = num_id(argv[n + 1], "cfg_index"); opt->got_set_config = 1; opt->got_any++; n++; break; case T_SET_ALT: - opt->alt_index = num_id(argv[n + 1], "confindex"); + opt->alt_index = num_id(argv[n + 1], "cfg_index"); opt->got_set_alt = 1; opt->got_any++; n++; @@ -630,9 +698,18 @@ main(int argc, char **argv) opt->got_dump_info = 1; opt->got_any++; break; + case T_DUMP_STRING: + if (opt->got_dump_string) { + flush_command(pbe, opt); + } + opt->string_index = num_id(argv[n + 1], "str_index"); + opt->got_dump_string = 1; + opt->got_any++; + n++; + break; case T_DUMP_ACCESS: opt->got_dump_access = 1; - opt->got_any++; + opt->got_any += 2; break; case T_SUSPEND: opt->got_suspend = 1; @@ -662,6 +739,41 @@ main(int argc, char **argv) opt->got_list = 1; opt->got_any++; break; + case T_DO_REQUEST: + if (opt->got_do_request) { + flush_command(pbe, opt); + } + LIBUSB20_INIT(LIBUSB20_CONTROL_SETUP, &opt->setup); + opt->setup.bmRequestType = num_id(argv[n + 1], "bmReqTyp"); + opt->setup.bRequest = num_id(argv[n + 2], "bReq"); + opt->setup.wValue = num_id(argv[n + 3], "wVal"); + opt->setup.wIndex = num_id(argv[n + 4], "wIndex"); + opt->setup.wLength = num_id(argv[n + 5], "wLen"); + if (opt->setup.wLength != 0) { + opt->buffer = malloc(opt->setup.wLength); + } else { + opt->buffer = NULL; + } + + n += 5; + + if (!(opt->setup.bmRequestType & + LIBUSB20_ENDPOINT_IN)) { + /* copy in data */ + t = (argc - n - 1); + if (t < opt->setup.wLength) { + err(1, "request data missing"); + } + t = opt->setup.wLength; + while (t--) { + ((uint8_t *)opt->buffer)[t] = + num_id(argv[n + t + 1], "req_data"); + } + n += opt->setup.wLength; + } + opt->got_do_request = 1; + opt->got_any++; + break; default: usage(); break;