Date: Sun, 29 Jun 2008 16:25:08 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144287 for review Message-ID: <200806291625.m5TGP8N0067502@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144287 Change 144287 by hselasky@hselasky_laptop001 on 2008/06/29 16:24:43 Here is the new USB core split into parts. There are some minor things left like I have to change the USB bus name to something non "usb". If anyone has any good suggestions I am open to that. Some bugfixes and improvements have been made. Mostly symbol substitution has been simplified with the help of the following script: sed -E "s/usbd_|usb_/usb2_/g"| sed -E "s/USBD_/USB_/g"| sed -e "s/USBVERBOSE/USB_VERBOSE/g" | sed -e "s/__KASSERT/USB_ASSERT/g" | sed -e "s/USBREV_/USB_REV_/g" | sed -e "s/device_get_dma_tag/USB_GET_DMA_TAG/g" | sed -e "s/POINTER_TO_UNSIGNED/USB_P2U/g" | sed -e "s/UMATCH_VENDOR_PRODUCT_REV/(0)/g" | sed -e "s/UMATCH_VENDOR_PRODUCT/(0)/g" | sed -e "s/UMATCH_VENDOR_DEVCLASS_DEVPROTO/(0)/g" | sed -e "s/UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO/(0)/g" | sed -e "s/UMATCH_DEVCLASS_DEVSUBCLASS/(0)/g" | sed -e "s/UMATCH_VENDOR_PRODUCT_REV_CONF_IFACE/(0)/g" | sed -e "s/UMATCH_VENDOR_PRODUCT_CONF_IFACE/(0)/g" | sed -e "s/UMATCH_VENDOR_IFACESUBCLASS_IFACEPROTO/(0)/g" | sed -e "s/UMATCH_VENDOR_IFACESUBCLASS/(0)/g" | sed -e "s/UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO/(0)/g" | sed -e "s/UMATCH_IFACECLASS_IFACESUBCLASS/(0)/g" | sed -e "s/UMATCH_IFACECLASS/(0)/g" | sed -e "s/UMATCH_IFACECLASS_GENERIC/(0)/g" | sed -e "s/UMATCH_GENERIC/(0)/g" | sed -e "s/UMATCH_NONE/(ENXIO)/g" | sed -e "s/_hw_usb[,]/_hw_usb2,/g" | sed -e "s/_hw_usb_/_hw_usb2_/g" | sed -e "s/_std_root_/_sw_/g" | sed -e "s/_STD_ROOT_/_SW_/g" | sed -e "s/usb2_status_t/usb2_error_t/g" | sed -e "s/usb2_device_request_t/struct usb2_device_request/g" | sed -e "s/usb2_descriptor_t/struct usb2_descriptor/g" | sed -e "s/usb2_device_descriptor_t/struct usb2_device_descriptor/g" | sed -e "s/usb2_config_descriptor_t/struct usb2_config_descriptor/g" | sed -e "s/usb2_interface_descriptor_t/struct usb2_interface_descriptor/g" | sed -e "s/usb2_endpoint_descriptor_t/struct usb2_endpoint_descriptor/g" | sed -e "s/usb2_string_descriptor_t/struct usb2_string_descriptor/g" | sed -e "s/usb2_hub_descriptor_t/struct usb2_hub_descriptor/g" | sed -e "s/usb2_device_qualifier_t/struct usb2_device_qualifier/g" | sed -e "s/usb2_otg_descriptor_t/struct usb2_otg_descriptor/g" | sed -e "s/usb2_hub_status_t/struct usb2_hub_status/g" | sed -e "s/usb2_port_status_t/struct usb2_port_status/g" | sed -e "s/usbreq_/usb2_req_/g" | sed -e "s/usb2_memory_info/usb2_xfer_root/g" | sed -e "s/usb2_find_best_slot/usb2_intr_find_best_slot/g" | sed -e "s/usb2_set_device_desc/device_set_usb_desc/g" | sed -e "s/usb2_finish_vp_info/usb2_check_strings/g" | sed -e "s/usb2_driver_load/NULL/g" | sed -e "s/usb2_cdev/usb2_fifo/g" | sed -e "s/usb2_cdev_/usb2_fifo_/g" | sed -e "s/USB_MAX_ENDPOINTS/USB_EP_MAX/g" | sed -e "s/USB_MAX_INTERFACES/USB_IFACE_MAX/g" | Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_busdma.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_busdma.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_compat_linux.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_compat_linux.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_config_td.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_config_td.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_debug.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_debug.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dynamic.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dynamic.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_error.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_handle_request.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_handle_request.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_hub.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_hub.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_lookup.c#3 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_lookup.h#3 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_mbuf.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_mbuf.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_parse.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_parse.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_port.h#2 delete .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_process.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_process.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_sw_transfer.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_sw_transfer.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_transfer.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_transfer.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_util.c#1 add .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_util.h#1 add .. //depot/projects/usb/src/sys/dev/usb2/include/usb2_hid.h#2 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_compat_linux.c#2 (text+ko) ==== @@ -1,4 +1,4 @@ -/* +/*- * Copyright (c) 2007 Luigi Rizzo - Universita` di Pisa. All rights reserved. * Copyright (c) 2007 Hans Petter Selasky. All rights reserved. * @@ -24,25 +24,28 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/usb/usb_compat_linux.c $"); +#include <dev/usb2/include/usb2_defs.h> +#include <dev/usb2/include/usb2_mfunc.h> +#include <dev/usb2/include/usb2_standard.h> +#include <dev/usb2/include/usb2_error.h> +#include <dev/usb2/include/usb2_revision.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/endian.h> +#include <dev/usb2/core/usb2_core.h> +#include <dev/usb2/core/usb2_compat_linux.h> +#include <dev/usb2/core/usb2_process.h> +#include <dev/usb2/core/usb2_device.h> +#include <dev/usb2/core/usb2_util.h> +#include <dev/usb2/core/usb2_busdma.h> +#include <dev/usb2/core/usb2_transfer.h> +#include <dev/usb2/core/usb2_parse.h> -#include <dev/usb/usb_port.h> -#include <dev/usb/usb.h> -#include <dev/usb/usb_subr.h> - -#include <dev/usb/usb_compat_linux.h> +#include <dev/usb2/controller/usb2_controller.h> struct usb_linux_softc { LIST_ENTRY(usb_linux_softc) sc_attached_list; device_t sc_fbsd_dev; - struct usbd_device *sc_fbsd_udev; + struct usb2_device *sc_fbsd_udev; struct usb_interface *sc_ui; struct usb_driver *sc_udrv; }; @@ -55,18 +58,18 @@ static device_resume_t usb_linux_resume; static device_shutdown_t usb_linux_shutdown; -static usbd_callback_t usb_linux_isoc_callback; -static usbd_callback_t usb_linux_non_isoc_callback; +static usb2_callback_t usb_linux_isoc_callback; +static usb2_callback_t usb_linux_non_isoc_callback; static usb_complete_t usb_linux_wait_complete; static uint16_t usb_max_isoc_frames(struct usb_device *dev); -static int32_t usb_start_wait_urb(struct urb *urb, uint32_t timeout, uint32_t *p_actlen); -static const struct usb_device_id *usb_linux_lookup_id(const struct usb_device_id *id, struct usb_attach_arg *uaa); +static int usb_start_wait_urb(struct urb *urb, uint32_t timeout, uint32_t *p_actlen); +static const struct usb_device_id *usb_linux_lookup_id(const struct usb_device_id *id, struct usb2_attach_arg *uaa); static struct usb_driver *usb_linux_get_usb_driver(struct usb_linux_softc *sc); -static struct usb_device *usb_linux_create_usb_device(struct usbd_device *udev, device_t dev); +static struct usb_device *usb_linux_create_usb_device(struct usb2_device *udev, device_t dev); static void usb_linux_cleanup_interface(struct usb_device *dev, struct usb_interface *iface); -static void usb_linux_complete(struct usbd_xfer *xfer); +static void usb_linux_complete(struct usb2_xfer *xfer); /*------------------------------------------------------------------------* * FreeBSD USB interface @@ -95,31 +98,23 @@ static devclass_t usb_linux_devclass; -DRIVER_MODULE(usb_linux, uhub, usb_linux_driver, usb_linux_devclass, usbd_driver_load, 0); +DRIVER_MODULE(usb_linux, uhub, usb_linux_driver, usb_linux_devclass, NULL, 0); MODULE_DEPEND(usb_linux, usb, 1, 1, 1); /*------------------------------------------------------------------------* * usb_linux_lookup_id * * This functions takes an array of "struct usb_device_id" and tries - * to match the entries with the information in "struct usb_attach_arg". + * to match the entries with the information in "struct usb2_attach_arg". * If it finds a match the matching entry will be returned. * Else "NULL" will be returned. *------------------------------------------------------------------------*/ static const struct usb_device_id * -usb_linux_lookup_id(const struct usb_device_id *id, struct usb_attach_arg *uaa) +usb_linux_lookup_id(const struct usb_device_id *id, struct usb2_attach_arg *uaa) { - usb_interface_descriptor_t *idesc; - usb_device_descriptor_t *dd; - if (id == NULL) { goto done; } - idesc = usbd_get_interface_descriptor(uaa->iface); - if (idesc == NULL) { - goto done; - } - dd = &(uaa->device->ddesc); /* * Keep on matching array entries until we find one with @@ -129,34 +124,34 @@ for (; id->match_flags; id++) { if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && - (id->idVendor != uaa->vendor)) { + (id->idVendor != uaa->info.idVendor)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && - (id->idProduct != uaa->product)) { + (id->idProduct != uaa->info.idProduct)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && - (id->bcdDevice_lo > uaa->release)) { + (id->bcdDevice_lo > uaa->info.bcdDevice)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && - (id->bcdDevice_hi < uaa->release)) { + (id->bcdDevice_hi < uaa->info.bcdDevice)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && - (id->bDeviceClass != dd->bDeviceClass)) { + (id->bDeviceClass != uaa->info.bDeviceClass)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) && - (id->bDeviceSubClass != dd->bDeviceSubClass)) { + (id->bDeviceSubClass != uaa->info.bDeviceSubClass)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && - (id->bDeviceProtocol != dd->bDeviceProtocol)) { + (id->bDeviceProtocol != uaa->info.bDeviceProtocol)) { continue; } - if ((dd->bDeviceClass == 0xFF) && + if ((uaa->info.bDeviceClass == 0xFF) && !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && (id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | @@ -164,15 +159,15 @@ continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && - (id->bInterfaceClass != idesc->bInterfaceClass)) { + (id->bInterfaceClass != uaa->info.bInterfaceClass)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && - (id->bInterfaceSubClass != idesc->bInterfaceSubClass)) { + (id->bInterfaceSubClass != uaa->info.bInterfaceSubClass)) { continue; } if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && - (id->bInterfaceProtocol != idesc->bInterfaceProtocol)) { + (id->bInterfaceProtocol != uaa->info.bInterfaceProtocol)) { continue; } /* we found a match! */ @@ -192,24 +187,21 @@ static int usb_linux_probe(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); + struct usb2_attach_arg *uaa = device_get_ivars(dev); struct usb_driver *udrv; - int err = UMATCH_NONE; + int err = ENXIO; - if (uaa->usb_mode != USB_MODE_HOST) { - return (UMATCH_NONE); + if (uaa->usb2_mode != USB_MODE_HOST) { + return (ENXIO); } - if (uaa->iface == NULL) { - return (UMATCH_NONE); - } - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) { if (usb_linux_lookup_id(udrv->id_table, uaa)) { err = 0; break; } } - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); return (err); } @@ -226,9 +218,9 @@ { struct usb_driver *udrv; - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); udrv = sc->sc_udrv; - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); return (udrv); } @@ -242,7 +234,7 @@ static int usb_linux_attach(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); + struct usb2_attach_arg *uaa = device_get_ivars(dev); struct usb_linux_softc *sc = device_get_softc(dev); struct usb_driver *udrv; struct usb_device *p_dev; @@ -251,13 +243,13 @@ if (sc == NULL) { return (ENOMEM); } - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) { id = usb_linux_lookup_id(udrv->id_table, uaa); if (id) break; } - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); if (id == NULL) { return (ENXIO); @@ -274,12 +266,12 @@ } uaa->device->linux_dev = p_dev; } - usbd_set_device_desc(dev); + device_set_usb2_desc(dev); sc->sc_fbsd_udev = uaa->device; sc->sc_fbsd_dev = dev; sc->sc_udrv = udrv; - sc->sc_ui = usb_ifnum_to_if(p_dev, uaa->iface->idesc->bInterfaceNumber); + sc->sc_ui = usb_ifnum_to_if(p_dev, uaa->info.bIfaceNum); if (sc->sc_ui == NULL) { return (EINVAL); } @@ -288,9 +280,9 @@ return (ENXIO); } } - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); LIST_INSERT_HEAD(&usb_linux_attached_list, sc, sc_attached_list); - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); /* success */ return (0); @@ -308,14 +300,14 @@ struct usb_linux_softc *sc = device_get_softc(dev); struct usb_driver *udrv = NULL; - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); if (sc->sc_attached_list.le_prev) { LIST_REMOVE(sc, sc_attached_list); sc->sc_attached_list.le_prev = NULL; udrv = sc->sc_udrv; sc->sc_udrv = NULL; } - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); if (udrv && udrv->disconnect) { (udrv->disconnect) (sc->sc_ui); @@ -395,7 +387,7 @@ static uint16_t usb_max_isoc_frames(struct usb_device *dev) { - return ((usbd_get_speed(dev->bsd_udev) == USB_SPEED_HIGH) ? + return ((usb2_get_speed(dev->bsd_udev) == USB_SPEED_HIGH) ? USB_MAX_HIGH_SPEED_ISOC_FRAMES : USB_MAX_FULL_SPEED_ISOC_FRAMES); } @@ -406,7 +398,7 @@ * initialized. If it returns non-zero, it means that the URB was not * queued. *------------------------------------------------------------------------*/ -int32_t +int usb_submit_urb(struct urb *urb, uint16_t mem_flags) { struct usb_host_endpoint *uhe; @@ -414,7 +406,7 @@ if (urb == NULL) { return (-EINVAL); } - mtx_assert(&usb_global_lock, MA_OWNED); + mtx_assert(&Giant, MA_OWNED); if (urb->pipe == NULL) { return (-EINVAL); @@ -434,8 +426,8 @@ urb->status = -EINPROGRESS; - usbd_transfer_start(uhe->bsd_xfer[0]); - usbd_transfer_start(uhe->bsd_xfer[1]); + usb2_transfer_start(uhe->bsd_xfer[0]); + usb2_transfer_start(uhe->bsd_xfer[1]); } else { /* no pipes have been setup yet! */ urb->status = -EINVAL; @@ -452,7 +444,7 @@ * FreeBSD this function is always non-blocking, and will always call * the "complete" callback with an error before it returns. *------------------------------------------------------------------------*/ -int32_t +int usb_unlink_urb(struct urb *urb) { struct usb_host_endpoint *uhe; @@ -461,7 +453,7 @@ if (urb == NULL) { return (-EINVAL); } - mtx_assert(&usb_global_lock, MA_OWNED); + mtx_assert(&Giant, MA_OWNED); if (urb->pipe == NULL) { return (-EINVAL); @@ -494,13 +486,13 @@ if (uhe->bsd_xfer[0] && (uhe->bsd_xfer[0]->priv_fifo == (void *)urb)) { - usbd_transfer_stop(uhe->bsd_xfer[0]); - usbd_transfer_start(uhe->bsd_xfer[0]); + usb2_transfer_stop(uhe->bsd_xfer[0]); + usb2_transfer_start(uhe->bsd_xfer[0]); } if (uhe->bsd_xfer[1] && (uhe->bsd_xfer[1]->priv_fifo == (void *)urb)) { - usbd_transfer_stop(uhe->bsd_xfer[1]); - usbd_transfer_start(uhe->bsd_xfer[1]); + usb2_transfer_stop(uhe->bsd_xfer[1]); + usb2_transfer_start(uhe->bsd_xfer[1]); } } return (0); @@ -513,11 +505,11 @@ * an USB endpoint returns a stall message to the USB host controller. * Until the stall is cleared, no data can be transferred. *------------------------------------------------------------------------*/ -int32_t +int usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe) { - struct usbd_config cfg[1]; - struct usbd_pipe *pipe; + struct usb2_config cfg[1]; + struct usb2_pipe *pipe; uint8_t type; uint8_t addr; @@ -533,11 +525,11 @@ cfg[0].endpoint = addr & UE_ADDR; cfg[0].direction = addr & (UE_DIR_OUT | UE_DIR_IN); - pipe = usbd_get_pipe(dev->bsd_udev, uhe->bsd_iface_index, cfg); + pipe = usb2_get_pipe(dev->bsd_udev, uhe->bsd_iface_index, cfg); if (pipe == NULL) return (-EINVAL); - usbd_clear_data_toggle(dev->bsd_udev, pipe); + usb2_clear_data_toggle(dev->bsd_udev, pipe); return (usb_control_msg(dev, &(dev->ep0), UR_CLEAR_FEATURE, UT_WRITE_ENDPOINT, @@ -550,10 +542,10 @@ * This is an internal function that is used to perform synchronous * Linux USB transfers. *------------------------------------------------------------------------*/ -static int32_t +static int usb_start_wait_urb(struct urb *urb, uint32_t timeout, uint32_t *p_actlen) { - int32_t err; + int err; /* you must have a timeout! */ if (timeout == 0) { @@ -574,7 +566,7 @@ */ while (urb->transfer_flags & URB_WAIT_WAKEUP) { urb->transfer_flags |= URB_IS_SLEEPING; - err = mtx_sleep(urb, &usb_global_lock, 0, "USB Linux Wait", 0); + err = mtx_sleep(urb, &Giant, 0, "USB Linux Wait", 0); urb->transfer_flags &= ~URB_IS_SLEEPING; if (err) goto done; @@ -605,17 +597,17 @@ * < 0: Failure * > 0: Acutal length *------------------------------------------------------------------------*/ -int32_t +int usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *uhe, uint8_t request, uint8_t requesttype, uint16_t value, uint16_t index, void *data, uint16_t size, uint32_t timeout) { struct urb *urb; - usb_device_request_t *req; + struct usb2_device_request *req; struct usb_host_endpoint *uhe_write; struct usb_host_endpoint *uhe_read; uint32_t actlen; - int32_t err; + int err; uint8_t type; uint8_t addr; @@ -673,7 +665,7 @@ if (size && (req->bmRequestType & UT_WRITE)) { /* move the data to a real buffer */ - bcopy(data, req->bData, size); + bcopy(data, req+1, size); } if (type == UE_CONTROL) { urb->pipe = uhe; @@ -696,7 +688,7 @@ if (req->bmRequestType & UT_READ) { urb->pipe = uhe_read; } - urb->transfer_buffer = req->bData; + urb->transfer_buffer = req+1; urb->transfer_buffer_length = size; err = usb_start_wait_urb(urb, timeout, &actlen); @@ -713,7 +705,7 @@ bzero(((uint8_t *)data) + actlen, size - actlen); } if (actlen) { - bcopy(req->bData, data, actlen); + bcopy(req+1, data, actlen); } } usb_free_urb(urb); @@ -732,18 +724,19 @@ * index zero is selected. Note that "iface_no" is not the interface * index, but rather the value of "bInterfaceNumber". *------------------------------------------------------------------------*/ -int32_t +int usb_set_interface(struct usb_device *dev, uint8_t iface_no, uint8_t alt_index) { struct usb_interface *p_ui = usb_ifnum_to_if(dev, iface_no); - int32_t err; + int err; if (p_ui == NULL) return (-EINVAL); if (alt_index >= p_ui->num_altsetting) return (-EINVAL); usb_linux_cleanup_interface(dev, p_ui); - err = -usbd_set_config_index(dev->bsd_udev, p_ui->bsd_iface_index, alt_index); + err = -usb2_set_alt_interface_index(dev->bsd_udev, + p_ui->bsd_iface_index, alt_index); if (err == 0) { p_ui->cur_altsetting = p_ui->altsetting + alt_index; } @@ -761,10 +754,10 @@ * a non-zero dummy, hence this function will base the maximum buffer * size on "wMaxPacketSize". *------------------------------------------------------------------------*/ -int32_t +int usb_setup_endpoint(struct usb_device *dev, struct usb_host_endpoint *uhe, uint32_t bufsize) { - struct usbd_config cfg[2]; + struct usb2_config cfg[2]; uint8_t type = uhe->desc.bmAttributes & UE_XFERTYPE; uint8_t addr = uhe->desc.bEndpointAddress; @@ -772,7 +765,7 @@ /* optimize */ return (0); } - usbd_transfer_unsetup(uhe->bsd_xfer, 2); + usb2_transfer_unsetup(uhe->bsd_xfer, 2); uhe->fbsd_buf_size = bufsize; @@ -811,8 +804,8 @@ /* Allocate and setup two generic FreeBSD USB transfers */ - if (usbd_transfer_setup(dev->bsd_udev, &(uhe->bsd_iface_index), - uhe->bsd_xfer, cfg, 2, uhe, &usb_global_lock)) { + if (usb2_transfer_setup(dev->bsd_udev, &(uhe->bsd_iface_index), + uhe->bsd_xfer, cfg, 2, uhe, &Giant)) { return (-EINVAL); } } else { @@ -831,8 +824,8 @@ cfg[0].mh.flags.proxy_buffer = 1; cfg[0].mh.flags.short_xfer_ok = 1; - if (usbd_transfer_setup(dev->bsd_udev, &(uhe->bsd_iface_index), - uhe->bsd_xfer, cfg, 1, uhe, &usb_global_lock)) { + if (usb2_transfer_setup(dev->bsd_udev, &(uhe->bsd_iface_index), + uhe->bsd_xfer, cfg, 1, uhe, &Giant)) { return (-EINVAL); } } @@ -847,13 +840,13 @@ * is returned by this function. *------------------------------------------------------------------------*/ static struct usb_device * -usb_linux_create_usb_device(struct usbd_device *udev, device_t dev) +usb_linux_create_usb_device(struct usb2_device *udev, device_t dev) { - usb_config_descriptor_t *cd = usbd_get_config_descriptor(udev); - usb_descriptor_t *desc; - usb_interface_descriptor_t *id; - usb_endpoint_descriptor_t *ed; - usb_device_descriptor_t *dd; + struct usb2_config_descriptor *cd = usb2_get_config_descriptor(udev); + struct usb2_descriptor *desc; + struct usb2_interface_descriptor *id; + struct usb2_endpoint_descriptor *ed; + struct usb2_device_descriptor *dd; struct usb_device *p_ud = NULL; struct usb_interface *p_ui = NULL; struct usb_host_interface *p_uhi = NULL; @@ -882,7 +875,7 @@ * Iterate over all the USB descriptors. Use the USB config * descriptor pointer provided by the FreeBSD USB stack. */ - while ((desc = usbd_desc_foreach(cd, desc))) { + while ((desc = usb2_desc_foreach(cd, desc))) { /* * Build up a tree according to the descriptors we @@ -968,7 +961,7 @@ p_ud->product = ""; p_ud->manufacturer = ""; p_ud->serial = ""; - p_ud->speed = usbd_get_speed(udev); + p_ud->speed = usb2_get_speed(udev); p_ud->bsd_udev = udev; p_ud->bsd_iface_start = p_ui; p_ud->bsd_iface_end = p_ui + iface_index; @@ -980,7 +973,7 @@ sizeof(p_ud->ep0.desc)); if (usb_setup_endpoint(p_ud, &(p_ud->ep0), 1024 /* bytes */ )) { - usb_linux_free_usb_device(p_ud); + usb_linux_free_device(p_ud); p_ud = NULL; goto done; } @@ -1010,7 +1003,7 @@ * FreeBSD specific magic value to ask for control transfer * memory allocation: */ - size = sizeof(*urb) + sizeof(usb_device_request_t) + mem_flags; + size = sizeof(*urb) + sizeof(struct usb2_device_request) + mem_flags; } else { size = sizeof(*urb) + (iso_packets * sizeof(urb->iso_frame_desc[0])); } @@ -1020,7 +1013,7 @@ if (iso_packets == 0xFFFF) { urb->setup_packet = (void *)(urb + 1); urb->transfer_buffer = (void *)(urb->setup_packet + - sizeof(usb_device_request_t)); + sizeof(struct usb2_device_request)); urb->transfer_buffer_length = mem_flags; } else { urb->number_of_packets = iso_packets; @@ -1162,11 +1155,11 @@ { struct usb_driver *drv = arg; - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); LIST_INSERT_HEAD(&usb_linux_driver_list, drv, linux_driver_list); - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); - usb_needs_probe_and_attach(); + usb2_needs_explore_all(); return; } @@ -1187,31 +1180,31 @@ struct usb_linux_softc *sc; repeat: - mtx_lock(&usb_global_lock); + mtx_lock(&Giant); LIST_FOREACH(sc, &usb_linux_attached_list, sc_attached_list) { if (sc->sc_udrv == drv) { - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); device_detach(sc->sc_fbsd_dev); goto repeat; } } LIST_REMOVE(drv, linux_driver_list); - mtx_unlock(&usb_global_lock); + mtx_unlock(&Giant); return; } /*------------------------------------------------------------------------* - * usb_linux_free_usb_device + * usb_linux_free_device * * The following function is only used by the FreeBSD USB stack, to * cleanup and free memory after that a Linux USB device was attached. *------------------------------------------------------------------------*/ void -usb_linux_free_usb_device(struct usb_device *dev) +usb_linux_free_device(struct usb_device *dev) { struct usb_host_endpoint *uhe; struct usb_host_endpoint *uhe_end; - int32_t err; + int err; uhe = dev->bsd_endpoint_start; uhe_end = dev->bsd_endpoint_end; @@ -1275,7 +1268,7 @@ void usb_kill_urb(struct urb *urb) { - int32_t err; + int err; err = usb_unlink_urb(urb); return; @@ -1307,7 +1300,7 @@ struct usb_host_interface *uhi_end; struct usb_host_endpoint *uhe; struct usb_host_endpoint *uhe_end; - int32_t err; + int err; uhi = iface->altsetting; uhi_end = iface->altsetting + iface->num_altsetting; @@ -1343,7 +1336,7 @@ * usb_linux_complete *------------------------------------------------------------------------*/ static void -usb_linux_complete(struct usbd_xfer *xfer) +usb_linux_complete(struct usb2_xfer *xfer) { struct urb *urb; @@ -1364,7 +1357,7 @@ * used. *------------------------------------------------------------------------*/ static void -usb_linux_isoc_callback(struct usbd_xfer *xfer) +usb_linux_isoc_callback(struct usb2_xfer *xfer) { uint32_t max_frame = xfer->max_frame_size; uint32_t offset; @@ -1373,8 +1366,8 @@ struct usb_host_endpoint *uhe = xfer->priv_sc; struct usb_iso_packet_descriptor *uipd; - switch (USBD_GET_STATE(xfer)) { - case USBD_ST_TRANSFERRED: + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: if (urb->bsd_isread) { @@ -1387,8 +1380,8 @@ uipd->actual_length = xfer->frlengths[x]; uipd->status = 0; if (!xfer->flags.ext_buffer) { - usbd_copy_out(xfer->frbuffers, offset, - USBD_ADD_BYTES(urb->transfer_buffer, + usb2_copy_out(xfer->frbuffers, offset, + USB_ADD_BYTES(urb->transfer_buffer, uipd->offset), uipd->actual_length); } offset += max_frame; @@ -1420,7 +1413,7 @@ /* call callback */ usb_linux_complete(xfer); - case USBD_ST_SETUP: + case USB_ST_SETUP: tr_setup: if (xfer->priv_fifo == NULL) { @@ -1457,8 +1450,8 @@ uipd = urb->iso_frame_desc + x; xfer->frlengths[x] = uipd->length; if (!xfer->flags.ext_buffer) { - usbd_copy_in(xfer->frbuffers, offset, - USBD_ADD_BYTES(urb->transfer_buffer, + usb2_copy_in(xfer->frbuffers, offset, + USB_ADD_BYTES(urb->transfer_buffer, uipd->offset), uipd->length); } offset += uipd->length; @@ -1482,18 +1475,18 @@ if (xfer->flags.ext_buffer) { /* set virtual address to load */ - usbd_set_frame_data(xfer, + usb2_set_frame_data(xfer, urb->transfer_buffer, 0); } xfer->priv_fifo = urb; xfer->flags.force_short_xfer = 0; xfer->timeout = urb->timeout; xfer->nframes = urb->number_of_packets; - usbd_start_hardware(xfer); + usb2_start_hardware(xfer); return; default: /* Error */ - if (xfer->error == USBD_ERR_CANCELLED) { + if (xfer->error == USB_ERR_CANCELLED) { urb->status = -ECONNRESET; } else { urb->status = -EPIPE; /* stalled */ @@ -1510,7 +1503,7 @@ /* call callback */ usb_linux_complete(xfer); - if (xfer->error == USBD_ERR_CANCELLED) { + if (xfer->error == USB_ERR_CANCELLED) { /* we need to return in this case */ return; } @@ -1529,18 +1522,18 @@ * callback is called. *------------------------------------------------------------------------*/ static void -usb_linux_non_isoc_callback(struct usbd_xfer *xfer) +usb_linux_non_isoc_callback(struct usb2_xfer *xfer) { enum { - REQ_SIZE = sizeof(usb_device_request_t) + REQ_SIZE = sizeof(struct usb2_device_request) }; struct urb *urb = xfer->priv_fifo; struct usb_host_endpoint *uhe = xfer->priv_sc; uint32_t max_bulk = xfer->max_data_length; uint8_t data_frame = xfer->flags_int.control_xfr ? 1 : 0; - switch (USBD_GET_STATE(xfer)) { - case USBD_ST_TRANSFERRED: + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: if (xfer->flags_int.control_xfr) { @@ -1555,7 +1548,7 @@ } if (urb->bsd_isread && (!xfer->flags.ext_buffer)) { /* copy in data with regard to the URB */ - usbd_copy_out(xfer->frbuffers + data_frame, 0, + usb2_copy_out(xfer->frbuffers + data_frame, 0, urb->bsd_data_ptr, xfer->frlengths[data_frame]); } urb->bsd_length_rem -= xfer->frlengths[data_frame]; @@ -1585,7 +1578,7 @@ /* call callback */ usb_linux_complete(xfer); - case USBD_ST_SETUP: + case USB_ST_SETUP: tr_setup: /* get next transfer */ @@ -1608,11 +1601,11 @@ * First copy in the header, then copy in data! */ if (!xfer->flags.ext_buffer) { - usbd_copy_in(xfer->frbuffers, 0, + usb2_copy_in(xfer->frbuffers, 0, urb->setup_packet, REQ_SIZE); } else { /* set virtual address to load */ - usbd_set_frame_data(xfer, + usb2_set_frame_data(xfer, urb->setup_packet, 0); } @@ -1648,11 +1641,11 @@ if (xfer->flags.ext_buffer) { /* set virtual address to load */ - usbd_set_frame_data(xfer, urb->bsd_data_ptr, + usb2_set_frame_data(xfer, urb->bsd_data_ptr, data_frame); } else if (!urb->bsd_isread) { /* copy out data with regard to the URB */ - usbd_copy_in(xfer->frbuffers + data_frame, 0, + usb2_copy_in(xfer->frbuffers + data_frame, 0, urb->bsd_data_ptr, max_bulk); } xfer->frlengths[data_frame] = max_bulk; @@ -1665,12 +1658,12 @@ } else { xfer->nframes = 1; } - usbd_start_hardware(xfer); + usb2_start_hardware(xfer); return; default: tr_error: - if (xfer->error == USBD_ERR_CANCELLED) { + if (xfer->error == USB_ERR_CANCELLED) { urb->status = -ECONNRESET; } else { urb->status = -EPIPE; @@ -1682,7 +1675,7 @@ /* call callback */ usb_linux_complete(xfer); - if (xfer->error == USBD_ERR_CANCELLED) { + if (xfer->error == USB_ERR_CANCELLED) { /* we need to return in this case */ return; } ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_compat_linux.h#2 (text+ko) ==== @@ -1,4 +1,4 @@ -/* +/*- * Copyright (c) 2007 Luigi Rizzo - Universita` di Pisa. All rights reserved. * Copyright (c) 2007 Hans Petter Selasky. All rights reserved. * @@ -27,16 +27,6 @@ #ifndef _USB_COMPAT_LINUX_H #define _USB_COMPAT_LINUX_H -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/endian.h> -#include <sys/queue.h> -#include <sys/types.h> -#include <sys/kernel.h> - -#include <dev/usb/usb.h> - struct usb_device; struct usb_interface; struct usb_driver; @@ -327,7 +317,7 @@ TAILQ_HEAD(, urb) bsd_urb_list; - struct usbd_xfer *bsd_xfer[2]; + struct usb2_xfer *bsd_xfer[2]; uint8_t *extra; /* Extra descriptors */ @@ -365,7 +355,7 @@ struct usb_device_descriptor descriptor; struct usb_host_endpoint ep0; - struct usbd_device *bsd_udev; + struct usb2_device *bsd_udev; struct usb_interface *bsd_iface_start; struct usb_interface *bsd_iface_end; struct usb_host_endpoint *bsd_endpoint_start; @@ -443,12 +433,12 @@ /* various prototypes */ >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200806291625.m5TGP8N0067502>