usb4bsd: Sync with FreeBSD r276791
authorMarkus Pfeiffer <markus.pfeiffer@morphism.de>
Thu, 8 Jan 2015 21:38:39 +0000 (21:38 +0000)
committerMarkus Pfeiffer <markus.pfeiffer@morphism.de>
Fri, 9 Jan 2015 11:42:07 +0000 (11:42 +0000)
* update usb_transfer.{c,h} so uaudio can be ported and tested

sys/bus/u4b/usb_core.h
sys/bus/u4b/usb_dragonfly.h
sys/bus/u4b/usb_transfer.c
sys/bus/u4b/usb_transfer.h
sys/bus/u4b/usbdi.h

index 6f7d11f..5fef4fc 100644 (file)
@@ -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 */
 };
index cc5ce13..332d44f 100644 (file)
@@ -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
 
index 8ea4e01..0f3b1b4 100644 (file)
@@ -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);
+}
index ab9c2c0..20be2bf 100644 (file)
@@ -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.
  *
index 5b53e6a..c259d23 100644 (file)
@@ -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);