PERFORCE change 144287 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Jun 29 16:25:09 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=144287
Change 144287 by hselasky at 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) <<<
More information about the p4-projects
mailing list