Make sure the EHCI bandwidth allocation algorithm

for FULL speed SPLIT transactions works fully.

MFC after:	1 week
This commit is contained in:
Hans Petter Selasky 2012-05-03 16:06:22 +00:00
parent bdaa925cc7
commit 7e66ab7cb6
2 changed files with 30 additions and 8 deletions

View File

@ -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);
}

View File

@ -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);