USB: EHCI: code rearrangement in iso_stream_schedule()
This patch interchanges the "if" and "else" branches of the big "if" statement in iso_stream_schedule(), in preparation for the next patch in this series. That is, it changes if (likely(!...)) { A } else { B } to if (unlikely(...)) { B } else { A } Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c7ccde6eac
commit
e4e18cbd52
1 changed files with 47 additions and 45 deletions
|
@ -1384,12 +1384,57 @@ iso_stream_schedule (
|
||||||
|
|
||||||
now = ehci_read_frame_index(ehci) & (mod - 1);
|
now = ehci_read_frame_index(ehci) & (mod - 1);
|
||||||
|
|
||||||
/* Typical case: reuse current schedule, stream is still active.
|
/*
|
||||||
|
* Need to schedule; when's the next (u)frame we could start?
|
||||||
|
* This is bigger than ehci->i_thresh allows; scheduling itself
|
||||||
|
* isn't free, the delay should handle reasonably slow cpus. It
|
||||||
|
* can also help high bandwidth if the dma and irq loads don't
|
||||||
|
* jump until after the queue is primed.
|
||||||
|
*/
|
||||||
|
if (unlikely(list_empty(&stream->td_list))) {
|
||||||
|
int done = 0;
|
||||||
|
|
||||||
|
base = now & ~0x07;
|
||||||
|
start = base + SCHEDULING_DELAY;
|
||||||
|
|
||||||
|
/* find a uframe slot with enough bandwidth.
|
||||||
|
* Early uframes are more precious because full-speed
|
||||||
|
* iso IN transfers can't use late uframes,
|
||||||
|
* and therefore they should be allocated last.
|
||||||
|
*/
|
||||||
|
next = start;
|
||||||
|
start += period;
|
||||||
|
do {
|
||||||
|
start--;
|
||||||
|
/* check schedule: enough space? */
|
||||||
|
if (stream->highspeed) {
|
||||||
|
if (itd_slot_ok(ehci, mod, start,
|
||||||
|
stream->usecs, period))
|
||||||
|
done = 1;
|
||||||
|
} else {
|
||||||
|
if ((start % 8) >= 6)
|
||||||
|
continue;
|
||||||
|
if (sitd_slot_ok(ehci, mod, stream,
|
||||||
|
start, sched, period))
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
} while (start > next && !done);
|
||||||
|
|
||||||
|
/* no room in the schedule */
|
||||||
|
if (!done) {
|
||||||
|
ehci_dbg(ehci, "iso sched full %p", urb);
|
||||||
|
status = -ENOSPC;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Typical case: reuse current schedule, stream is still active.
|
||||||
* Hopefully there are no gaps from the host falling behind
|
* Hopefully there are no gaps from the host falling behind
|
||||||
* (irq delays etc). If there are, the behavior depends on
|
* (irq delays etc). If there are, the behavior depends on
|
||||||
* whether URB_ISO_ASAP is set.
|
* whether URB_ISO_ASAP is set.
|
||||||
*/
|
*/
|
||||||
if (likely (!list_empty (&stream->td_list))) {
|
else {
|
||||||
|
|
||||||
/* Take the isochronous scheduling threshold into account */
|
/* Take the isochronous scheduling threshold into account */
|
||||||
if (ehci->i_thresh)
|
if (ehci->i_thresh)
|
||||||
|
@ -1436,49 +1481,6 @@ iso_stream_schedule (
|
||||||
start += base;
|
start += base;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* need to schedule; when's the next (u)frame we could start?
|
|
||||||
* this is bigger than ehci->i_thresh allows; scheduling itself
|
|
||||||
* isn't free, the delay should handle reasonably slow cpus. it
|
|
||||||
* can also help high bandwidth if the dma and irq loads don't
|
|
||||||
* jump until after the queue is primed.
|
|
||||||
*/
|
|
||||||
else {
|
|
||||||
int done = 0;
|
|
||||||
|
|
||||||
base = now & ~0x07;
|
|
||||||
start = base + SCHEDULING_DELAY;
|
|
||||||
|
|
||||||
/* find a uframe slot with enough bandwidth.
|
|
||||||
* Early uframes are more precious because full-speed
|
|
||||||
* iso IN transfers can't use late uframes,
|
|
||||||
* and therefore they should be allocated last.
|
|
||||||
*/
|
|
||||||
next = start;
|
|
||||||
start += period;
|
|
||||||
do {
|
|
||||||
start--;
|
|
||||||
/* check schedule: enough space? */
|
|
||||||
if (stream->highspeed) {
|
|
||||||
if (itd_slot_ok(ehci, mod, start,
|
|
||||||
stream->usecs, period))
|
|
||||||
done = 1;
|
|
||||||
} else {
|
|
||||||
if ((start % 8) >= 6)
|
|
||||||
continue;
|
|
||||||
if (sitd_slot_ok(ehci, mod, stream,
|
|
||||||
start, sched, period))
|
|
||||||
done = 1;
|
|
||||||
}
|
|
||||||
} while (start > next && !done);
|
|
||||||
|
|
||||||
/* no room in the schedule */
|
|
||||||
if (!done) {
|
|
||||||
ehci_dbg(ehci, "iso sched full %p", urb);
|
|
||||||
status = -ENOSPC;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tried to schedule too far into the future? */
|
/* Tried to schedule too far into the future? */
|
||||||
if (unlikely(start - base + span - period >= mod)) {
|
if (unlikely(start - base + span - period >= mod)) {
|
||||||
ehci_dbg(ehci, "request %p would overflow (%u+%u >= %u)\n",
|
ehci_dbg(ehci, "request %p would overflow (%u+%u >= %u)\n",
|
||||||
|
|
Loading…
Add table
Reference in a new issue