Make sure the EHCI bandwidth allocation algorithm
for FULL speed SPLIT transactions works fully. MFC after: 1 week
This commit is contained in:
parent
bdaa925cc7
commit
7e66ab7cb6
@ -2638,11 +2638,29 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer)
|
||||
/* update isoc_next */
|
||||
xfer->endpoint->isoc_next = (pp_last - &sc->sc_isoc_fs_p_last[0]) &
|
||||
(EHCI_VIRTUAL_FRAMELIST_COUNT - 1);
|
||||
|
||||
/*
|
||||
* We don't allow cancelling of the SPLIT transaction USB FULL
|
||||
* speed transfer, because it disturbs the bandwidth
|
||||
* computation algorithm.
|
||||
*/
|
||||
xfer->flags_int.can_cancel_immed = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ehci_device_isoc_fs_start(struct usb_xfer *xfer)
|
||||
{
|
||||
/*
|
||||
* We don't allow cancelling of the SPLIT transaction USB FULL
|
||||
* speed transfer, because it disturbs the bandwidth
|
||||
* computation algorithm.
|
||||
*/
|
||||
xfer->flags_int.can_cancel_immed = 0;
|
||||
|
||||
/* set a default timeout */
|
||||
if (xfer->timeout == 0)
|
||||
xfer->timeout = 500; /* ms */
|
||||
|
||||
/* put transfer on interrupt queue */
|
||||
ehci_transfer_intr_enqueue(xfer);
|
||||
}
|
||||
|
@ -1681,11 +1681,12 @@ usbd_pipe_enter(struct usb_xfer *xfer)
|
||||
|
||||
DPRINTF("enter\n");
|
||||
|
||||
/* the transfer can now be cancelled */
|
||||
xfer->flags_int.can_cancel_immed = 1;
|
||||
|
||||
/* enter the transfer */
|
||||
(ep->methods->enter) (xfer);
|
||||
|
||||
xfer->flags_int.can_cancel_immed = 1;
|
||||
|
||||
/* check for transfer error */
|
||||
if (xfer->error) {
|
||||
/* some error has happened */
|
||||
@ -2418,13 +2419,15 @@ usbd_transfer_start_cb(void *arg)
|
||||
#if USB_HAVE_PF
|
||||
usbpf_xfertap(xfer, USBPF_XFERTAP_SUBMIT);
|
||||
#endif
|
||||
|
||||
/* the transfer can now be cancelled */
|
||||
xfer->flags_int.can_cancel_immed = 1;
|
||||
|
||||
/* start USB transfer, if no error */
|
||||
if (xfer->error == 0)
|
||||
(ep->methods->start) (xfer);
|
||||
|
||||
xfer->flags_int.can_cancel_immed = 1;
|
||||
|
||||
/* check for error */
|
||||
/* check for transfer error */
|
||||
if (xfer->error) {
|
||||
/* some error has happened */
|
||||
usbd_transfer_done(xfer, 0);
|
||||
@ -2599,13 +2602,14 @@ usbd_pipe_start(struct usb_xfer_queue *pq)
|
||||
#if USB_HAVE_PF
|
||||
usbpf_xfertap(xfer, USBPF_XFERTAP_SUBMIT);
|
||||
#endif
|
||||
/* the transfer can now be cancelled */
|
||||
xfer->flags_int.can_cancel_immed = 1;
|
||||
|
||||
/* start USB transfer, if no error */
|
||||
if (xfer->error == 0)
|
||||
(ep->methods->start) (xfer);
|
||||
|
||||
xfer->flags_int.can_cancel_immed = 1;
|
||||
|
||||
/* check for error */
|
||||
/* check for transfer error */
|
||||
if (xfer->error) {
|
||||
/* some error has happened */
|
||||
usbd_transfer_done(xfer, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user