USB: UHCI: improve scheduling of interrupt URBs
This patch (as1140) adds a little intelligence to the interrupt-URB scheduler in uhci-hcd. Right now the scheduler is stupid; every URB having the same period is assigned to the same slot. Thus a large group of period-N URBs can fill their slot and cause -ENOSPC errors even when all the lower-period slots are empty. With the patch, if an URB doesn't fit in its assigned slot then the scheduler will try using lower-period slots. This will provide greater flexibility. As an example, the driver will be able to handle more than just three or four mice, which the current driver cannot. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
925dff5dee
commit
e58dcebcd8
@@ -1065,13 +1065,18 @@ static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb,
|
|||||||
}
|
}
|
||||||
if (exponent < 0)
|
if (exponent < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
qh->period = 1 << exponent;
|
|
||||||
qh->skel = SKEL_INDEX(exponent);
|
|
||||||
|
|
||||||
/* For now, interrupt phase is fixed by the layout
|
/* If the slot is full, try a lower period */
|
||||||
* of the QH lists. */
|
do {
|
||||||
qh->phase = (qh->period / 2) & (MAX_PHASE - 1);
|
qh->period = 1 << exponent;
|
||||||
ret = uhci_check_bandwidth(uhci, qh);
|
qh->skel = SKEL_INDEX(exponent);
|
||||||
|
|
||||||
|
/* For now, interrupt phase is fixed by the layout
|
||||||
|
* of the QH lists.
|
||||||
|
*/
|
||||||
|
qh->phase = (qh->period / 2) & (MAX_PHASE - 1);
|
||||||
|
ret = uhci_check_bandwidth(uhci, qh);
|
||||||
|
} while (ret != 0 && --exponent >= 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
} else if (qh->period > urb->interval)
|
} else if (qh->period > urb->interval)
|
||||||
|
Reference in New Issue
Block a user