summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/usb/usb_transfer.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/dev/usb/usb_transfer.c')
-rw-r--r--freebsd/sys/dev/usb/usb_transfer.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/freebsd/sys/dev/usb/usb_transfer.c b/freebsd/sys/dev/usb/usb_transfer.c
index 205a72f7..ab5558e1 100644
--- a/freebsd/sys/dev/usb/usb_transfer.c
+++ b/freebsd/sys/dev/usb/usb_transfer.c
@@ -945,7 +945,8 @@ usbd_transfer_setup(struct usb_device *udev,
#if USB_HAVE_BUSDMA
usb_dma_tag_setup(&info->dma_parent_tag,
parm->dma_tag_p, udev->bus->dma_parent_tag[0].tag,
- xfer_mtx, &usb_bdma_done_event, 32, parm->dma_tag_max);
+ xfer_mtx, &usb_bdma_done_event, udev->bus->dma_bits,
+ parm->dma_tag_max);
#endif
info->bus = udev->bus;
@@ -1374,6 +1375,29 @@ usbd_control_transfer_init(struct usb_xfer *xfer)
}
/*------------------------------------------------------------------------*
+ * usbd_control_transfer_did_data
+ *
+ * This function returns non-zero if a control endpoint has
+ * transferred the first DATA packet after the SETUP packet.
+ * Else it returns zero.
+ *------------------------------------------------------------------------*/
+static uint8_t
+usbd_control_transfer_did_data(struct usb_xfer *xfer)
+{
+ struct usb_device_request req;
+
+ /* SETUP packet is not yet sent */
+ if (xfer->flags_int.control_hdr != 0)
+ return (0);
+
+ /* copy out the USB request header */
+ usbd_copy_out(xfer->frbuffers, 0, &req, sizeof(req));
+
+ /* compare remainder to the initial value */
+ return (xfer->flags_int.control_rem != UGETW(req.wLength));
+}
+
+/*------------------------------------------------------------------------*
* usbd_setup_ctrl_transfer
*
* This function handles initialisation of control transfers. Control
@@ -1478,6 +1502,11 @@ usbd_setup_ctrl_transfer(struct usb_xfer *xfer)
len = (xfer->sumlen - sizeof(struct usb_device_request));
}
+ /* update did data flag */
+
+ xfer->flags_int.control_did_data =
+ usbd_control_transfer_did_data(xfer);
+
/* check if there is a length mismatch */
if (len > xfer->flags_int.control_rem) {