On Wednesday 04 February 2009, Sergei Shtylyov wrote:
> The driver prevents using the same numbered Rx/Tx endpoints simultaneously for
> the periodic transfers -- which would actually be correct unless they share
> the
> same FIFO. Use 'in_qh' and 'out_qh' fields of the 'struct musb_hw_ep' to check
> the endpoint's business and get rid of now completely useless 'periodic' array
> in the 'struct musb'. While at it, optimize the loop induction variable in
> the
> endpoint lookup code and remove duplicate/unneeded code elsewhere...
>
> Signed-off-by: Sergei Shtylyov <[email protected]>
Your patch comments need improvement. This would better be
titled "rewrite endpoint allocation", and the description
should highlight "make better use of resources". Not using
something that's available is sub-optimal, but rarely a bug.
This doesn't seem to fix anything hurtful; so, it's not
for 2.6.29 merge.
What I'm going to do is send a replacement with a better
description and my signoff.
>
> drivers/usb/musb/musb_core.h | 1 -
> drivers/usb/musb/musb_host.c | 27 ++++++++++-----------------
> 2 files changed, 10 insertions(+), 18 deletions(-)
>
> Index: linux-2.6/drivers/usb/musb/musb_core.h
> ===================================================================
> --- linux-2.6.orig/drivers/usb/musb/musb_core.h
> +++ linux-2.6/drivers/usb/musb/musb_core.h
> @@ -331,7 +331,6 @@ struct musb {
> struct list_head control; /* of musb_qh */
> struct list_head in_bulk; /* of musb_qh */
> struct list_head out_bulk; /* of musb_qh */
> - struct musb_qh *periodic[32]; /* tree of interrupt+iso */
> #endif
>
> /* called with IRQs blocked; ON/nonzero implies starting a session,
> Index: linux-2.6/drivers/usb/musb/musb_host.c
> ===================================================================
> --- linux-2.6.orig/drivers/usb/musb/musb_host.c
> +++ linux-2.6/drivers/usb/musb/musb_host.c
> @@ -400,7 +400,6 @@ musb_giveback(struct musb_qh *qh, struct
> * de-allocated if it's tracked and allocated;
> * and where we'd update the schedule tree...
> */
> - musb->periodic[ep->epnum] = NULL;
> kfree(qh);
> qh = NULL;
> break;
> @@ -1716,31 +1715,26 @@ static int musb_schedule(
>
> /* else, periodic transfers get muxed to other endpoints */
>
> - /* FIXME this doesn't consider direction, so it can only
> - * work for one half of the endpoint hardware, and assumes
> - * the previous cases handled all non-shared endpoints...
> - */
> -
> - /* we know this qh hasn't been scheduled, so all we need to do
> + /*
> + * We know this qh hasn't been scheduled, so all we need to do
> * is choose which hardware endpoint to put it on ...
> *
> * REVISIT what we really want here is a regular schedule tree
> - * like e.g. OHCI uses, but for now musb->periodic is just an
> - * array of the _single_ logical endpoint associated with a
> - * given physical one (identity mapping logical->physical).
> - *
> - * that simplistic approach makes TT scheduling a lot simpler;
> - * there is none, and thus none of its complexity...
> + * like e.g. OHCI uses.
> */
> best_diff = 4096;
> best_end = -1;
>
> - for (epnum = 1; epnum < musb->nr_endpoints; epnum++) {
> + for (epnum = 1, hw_ep = musb->endpoints + 1; epnum < musb->nr_endpoints;
> + epnum++, hw_ep++) {
> int diff;
>
> - if (musb->periodic[epnum])
> + if (is_in || hw_ep->is_shared_fifo) {
> + if (hw_ep->in_qh != NULL)
> + continue;
> + } else if (hw_ep->out_qh != NULL)
> continue;
> - hw_ep = &musb->endpoints[epnum];
> +
> if (hw_ep == musb->bulk_ep)
> continue;
>
> @@ -1769,7 +1763,6 @@ static int musb_schedule(
> idle = 1;
> qh->mux = 0;
> hw_ep = musb->endpoints + best_end;
> - musb->periodic[best_end] = qh;
> DBG(4, "qh %p periodic slot %d\n", qh, best_end);
> success:
> if (head) {
>
>
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source