From 06cb24638139743df16d5a9df84a70d7249fb68c Mon Sep 17 00:00:00 2001 From: Markus Pfeiffer Date: Thu, 8 Jan 2015 21:38:39 +0000 Subject: [PATCH] usb4bsd: Sync with FreeBSD r276791 * update usb_transfer.{c,h} so uaudio can be ported and tested --- sys/bus/u4b/usb_core.h | 4 +++- sys/bus/u4b/usb_dragonfly.h | 3 +++ sys/bus/u4b/usb_transfer.c | 42 ++++++++++++++++++++++++++++++------- sys/bus/u4b/usb_transfer.h | 1 + sys/bus/u4b/usbdi.h | 3 ++- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/sys/bus/u4b/usb_core.h b/sys/bus/u4b/usb_core.h index 6f7d11fb0c..5fef4fc304 100644 --- a/sys/bus/u4b/usb_core.h +++ b/sys/bus/u4b/usb_core.h @@ -1,4 +1,4 @@ -/* $FreeBSD$ */ +/* $FreeBSD: head/sys/dev/usb/usb_core.h 266394 2014-05-18 09:13:29Z hselasky $ */ /*- * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. * @@ -116,6 +116,8 @@ struct usb_xfer_flags_int { uint8_t can_cancel_immed:1; /* set if USB transfer can be * cancelled immediately */ uint8_t doing_callback:1; /* set if executing the callback */ + uint8_t maxp_was_clamped:1; /* set if the max packet size + * was outside its allowed range */ uint8_t onhwqueue:1; /* on a hardware queue */ uint8_t doorbell_wait:1; /* structure being reused */ }; diff --git a/sys/bus/u4b/usb_dragonfly.h b/sys/bus/u4b/usb_dragonfly.h index cc5ce137bf..332d44f9b3 100644 --- a/sys/bus/u4b/usb_dragonfly.h +++ b/sys/bus/u4b/usb_dragonfly.h @@ -49,6 +49,9 @@ #define USB_HAVE_FIXED_CONFIG 0 #define USB_HAVE_FIXED_PORT 0 +/* define zero ticks callout value */ +#define USB_CALLOUT_ZERO_TICKS 1 + #define USB_TD_GET_PROC(td) (td)->td_proc #define USB_PROC_GET_GID(td) (td)->p_pgid diff --git a/sys/bus/u4b/usb_transfer.c b/sys/bus/u4b/usb_transfer.c index 8ea4e01d60..0f3b1b403f 100644 --- a/sys/bus/u4b/usb_transfer.c +++ b/sys/bus/u4b/usb_transfer.c @@ -1,3 +1,4 @@ +/* $FreeBSD: head/sys/dev/usb/usb_transfer.c 276717 2015-01-05 20:22:18Z hselasky $ */ /*- * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. * @@ -343,6 +344,7 @@ usbd_transfer_setup_sub(struct usb_setup_params *parm) usb_frcount_t n_frlengths; usb_frcount_t n_frbuffers; usb_frcount_t x; + uint16_t maxp_old; uint8_t type; uint8_t zmps; @@ -430,6 +432,11 @@ usbd_transfer_setup_sub(struct usb_setup_params *parm) if (xfer->max_packet_count > parm->hc_max_packet_count) { xfer->max_packet_count = parm->hc_max_packet_count; } + + /* store max packet size value before filtering */ + + maxp_old = xfer->max_packet_size; + /* filter "wMaxPacketSize" according to HC capabilities */ if ((xfer->max_packet_size > parm->hc_max_packet_size) || @@ -462,6 +469,13 @@ usbd_transfer_setup_sub(struct usb_setup_params *parm) } } + /* + * Check if the max packet size was outside its allowed range + * and clamped to a valid value: + */ + if (maxp_old != xfer->max_packet_size) + xfer->flags_int.maxp_was_clamped = 1; + /* compute "max_frame_size" */ usbd_update_max_frame_size(xfer); @@ -2485,7 +2499,9 @@ usbd_transfer_enqueue(struct usb_xfer_queue *pq, struct usb_xfer *xfer) void usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error) { - USB_BUS_LOCK_ASSERT(xfer->xroot->bus); + struct usb_xfer_root *info = xfer->xroot; + + USB_BUS_LOCK_ASSERT(info->bus); DPRINTF("err=%s\n", usbd_errstr(error)); @@ -2499,10 +2515,10 @@ usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error) xfer->flags_int.control_act = 0; return; } - /* only set transfer error if not already set */ - if (!xfer->error) { + /* only set transfer error, if not already set */ + if (xfer->error == USB_ERR_NORMAL_COMPLETION) xfer->error = error; - } + /* stop any callouts */ usb_callout_stop(&xfer->timeout_handle); @@ -2521,7 +2537,7 @@ usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error) * If the private USB lock is not locked, then we assume * that the BUS-DMA load stage has been passed: */ - pq = &xfer->xroot->dma_q; + pq = &info->dma_q; if (pq->curr == xfer) { /* start the next BUS-DMA load, if any */ @@ -2531,10 +2547,10 @@ usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error) #endif /* keep some statistics */ if (xfer->error) { - xfer->xroot->bus->stats_err.uds_requests + info->bus->stats_err.uds_requests [xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE]++; } else { - xfer->xroot->bus->stats_ok.uds_requests + info->bus->stats_ok.uds_requests [xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE]++; } @@ -2774,7 +2790,7 @@ usbd_transfer_timeout_ms(struct usb_xfer *xfer, /* defer delay */ usb_callout_reset(&xfer->timeout_handle, - USB_MS_TO_TICKS(ms), cb, xfer); + USB_MS_TO_TICKS(ms) + USB_CALLOUT_ZERO_TICKS, cb, xfer); } /*------------------------------------------------------------------------* @@ -3467,3 +3483,13 @@ usbd_xfer_get_timestamp(struct usb_xfer *xfer) { return (xfer->isoc_time_complete); } + +/* + * The following function returns non-zero if the max packet size + * field was clamped to a valid value. Else it returns zero. + */ +uint8_t +usbd_xfer_maxp_was_clamped(struct usb_xfer *xfer) +{ + return (xfer->flags_int.maxp_was_clamped); +} diff --git a/sys/bus/u4b/usb_transfer.h b/sys/bus/u4b/usb_transfer.h index ab9c2c02d3..20be2bf0c4 100644 --- a/sys/bus/u4b/usb_transfer.h +++ b/sys/bus/u4b/usb_transfer.h @@ -1,3 +1,4 @@ +/* $FreeBSD: head/sys/dev/usb/usb_transfer.h 228056 2011-11-28 09:54:41Z hselasky $ */ /*- * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. * diff --git a/sys/bus/u4b/usbdi.h b/sys/bus/u4b/usbdi.h index 5b53e6a7b8..c259d238cf 100644 --- a/sys/bus/u4b/usbdi.h +++ b/sys/bus/u4b/usbdi.h @@ -21,7 +21,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD: head/sys/dev/usb/usbdi.h 267240 2014-06-08 20:10:29Z hselasky $ */ #ifndef _USB_USBDI_H_ #define _USB_USBDI_H_ @@ -579,6 +579,7 @@ int usbd_xfer_is_stalled(struct usb_xfer *xfer); void usbd_xfer_set_flag(struct usb_xfer *xfer, int flag); void usbd_xfer_clr_flag(struct usb_xfer *xfer, int flag); uint16_t usbd_xfer_get_timestamp(struct usb_xfer *xfer); +uint8_t usbd_xfer_maxp_was_clamped(struct usb_xfer *xfer); void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len); -- 2.41.0