Index: sys/external/bsd/dwc2/dist/dwc2_hcd.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/dwc2/dist/dwc2_hcd.c,v retrieving revision 1.19 diff -u -p -r1.19 dwc2_hcd.c --- sys/external/bsd/dwc2/dist/dwc2_hcd.c 24 Feb 2016 22:17:54 -0000 1.19 +++ sys/external/bsd/dwc2/dist/dwc2_hcd.c 3 Jul 2018 06:36:48 -0000 @@ -714,9 +714,13 @@ static int dwc2_hc_setup_align_buf(struc struct dwc2_host_chan *chan, struct dwc2_hcd_urb *urb, void *bufptr) { - u32 buf_size; + +#if 1 + KASSERT(qh->dw_align_buf); +#else if (!qh->dw_align_buf) { + u32 buf_size; int err; if (chan->ep_type != USB_ENDPOINT_XFER_ISOC) @@ -739,6 +743,7 @@ static int dwc2_hc_setup_align_buf(struc return -ENOMEM; qh->dw_align_buf_size = buf_size; } +#endif if (chan->xfer_len) { dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); Index: sys/external/bsd/dwc2/dist/dwc2_hcdqueue.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/dwc2/dist/dwc2_hcdqueue.c,v retrieving revision 1.14 diff -u -p -r1.14 dwc2_hcdqueue.c --- sys/external/bsd/dwc2/dist/dwc2_hcdqueue.c 14 Feb 2016 10:53:30 -0000 1.14 +++ sys/external/bsd/dwc2/dist/dwc2_hcdqueue.c 3 Jul 2018 06:36:49 -0000 @@ -227,6 +227,31 @@ struct dwc2_qh *dwc2_hcd_qh_create(struc memset(qh, 0, sizeof(*qh)); dwc2_qh_init(hsotg, qh, urb); + if (!qh->dw_align_buf) { + u32 buf_size; + int err; + + if (qh->ep_type != USB_ENDPOINT_XFER_ISOC) + buf_size = hsotg->core_params->max_transfer_size; + else + /* 3072 = 3 max-size Isoc packets */ + buf_size = 3072; + + qh->dw_align_buf = NULL; + qh->dw_align_buf_dma = 0; + err = usb_allocmem(&hsotg->hsotg_sc->sc_bus, buf_size, buf_size, + &qh->dw_align_buf_usbdma); + if (!err) { + usb_dma_t *ud = &qh->dw_align_buf_usbdma; + + qh->dw_align_buf = KERNADDR(ud, 0); + qh->dw_align_buf_dma = DMAADDR(ud, 0); + } + if (!qh->dw_align_buf) + return NULL; + qh->dw_align_buf_size = buf_size; + } + if (hsotg->core_params->dma_desc_enable > 0 && dwc2_hcd_qh_init_ddma(hsotg, qh, mem_flags) < 0) { dwc2_hcd_qh_free(hsotg, qh);