Re: [RFC/PATCH 27/45] usb: musb: make use of new usb_endpoint_maxp_mult()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Bin Liu <b-liu@xxxxxx> writes:
> On Wed, Sep 28, 2016 at 04:05:36PM +0300, Felipe Balbi wrote:
>> We have introduced a helper to calculate multiplier
>> value from wMaxPacketSize. Start using it.
>> 
>> Cc: Bin Liu <b-liu@xxxxxx>
>> Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
>> ---
>>  drivers/usb/musb/musb_gadget.c | 6 +++---
>>  drivers/usb/musb/musb_host.c   | 2 +-
>>  2 files changed, 4 insertions(+), 4 deletions(-)
>> 
>> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
>> index bff4869a57cd..8a0882cc446d 100644
>> --- a/drivers/usb/musb/musb_gadget.c
>> +++ b/drivers/usb/musb/musb_gadget.c
>> @@ -974,8 +974,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
>>  		goto fail;
>>  
>>  	/* REVISIT this rules out high bandwidth periodic transfers */
>> -	tmp = usb_endpoint_maxp(desc);
>
> The bit 10~0 in tmp is also needed in the original code, 

no it's not

>> -	if (tmp & ~0x07ff) {
>> +	tmp = usb_endpoint_maxp_mult(desc) - 1;
>
> but here bit 10~0 is lost.

here's the whole thing unpatched:

	> /* REVISIT this rules out high bandwidth periodic transfers */
	> tmp = usb_endpoint_maxp(desc);
	> if (tmp & ~0x07ff) {

so, if we have a mult setting

	> 	int ok;
	>
	> 	if (usb_endpoint_dir_in(desc))
	> 		ok = musb->hb_iso_tx;
	> 	else
	> 		ok = musb->hb_iso_rx;
	>
	> 	if (!ok) {
	> 		musb_dbg(musb, "no support for high bandwidth ISO");
	> 		goto fail;
	> 	}
	> 	musb_ep->hb_mult = (tmp >> 11) & 3;

then we save the zero-based value in hb_mult

	> } else {
	> 	musb_ep->hb_mult = 0;

otherwise, set it to 0.

IOW, this could be rewritten as:

	int ok;

[...]
	
	/* REVISIT this rules out high bandwidth periodic transfers */
	tmp = usb_endpoint_maxp_mult(desc) - 1;
	if (usb_endpoint_dir_in(desc))
		ok = musb->hb_iso_tx & tmp;
	else
		ok = musb->hb_iso_rx & tmp;

	if (!ok) {
		musb_dbg(musb, "no support for high bandwidth ISO");
		goto fail;
	}
	musb_ep->hb_mult = tmp;

And nothing would change. There is, however, one small problem with this
patch, but that's a few lines after this chunk. Here's the incremental
patch to fix it:

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 0e3404ce9465..47304560f105 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -992,7 +992,7 @@ static int musb_gadget_enable(struct usb_ep *ep,
                musb_ep->hb_mult = 0;
        }
 
-       musb_ep->packet_sz = tmp & 0x7ff;
+       musb_ep->packet_sz = usb_endpoint_maxp(desc);
        tmp = musb_ep->packet_sz * (musb_ep->hb_mult + 1);
 
        /* enable the interrupts for the endpoint, set the endpoint

And here's an entire new version:

8<------------------------------------------------------------------------------
From 9eec4692ab28bfd4336e2a5846f7fc5d90cd66e8 Mon Sep 17 00:00:00 2001
From: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
Date: Wed, 28 Sep 2016 13:40:40 +0300
Subject: [PATCH] usb: musb: make use of new usb_endpoint_maxp_mult()

We have introduced a helper to calculate multiplier
value from wMaxPacketSize. Start using it.

Cc: Bin Liu <b-liu@xxxxxx>
Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
---
 drivers/usb/musb/musb_gadget.c | 8 ++++----
 drivers/usb/musb/musb_host.c   | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 4042ea017985..47304560f105 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -974,8 +974,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
 		goto fail;
 
 	/* REVISIT this rules out high bandwidth periodic transfers */
-	tmp = usb_endpoint_maxp(desc);
-	if (tmp & ~0x07ff) {
+	tmp = usb_endpoint_maxp_mult(desc) - 1;
+	if (tmp) {
 		int ok;
 
 		if (usb_endpoint_dir_in(desc))
@@ -987,12 +987,12 @@ static int musb_gadget_enable(struct usb_ep *ep,
 			musb_dbg(musb, "no support for high bandwidth ISO");
 			goto fail;
 		}
-		musb_ep->hb_mult = (tmp >> 11) & 3;
+		musb_ep->hb_mult = tmp;
 	} else {
 		musb_ep->hb_mult = 0;
 	}
 
-	musb_ep->packet_sz = tmp & 0x7ff;
+	musb_ep->packet_sz = usb_endpoint_maxp(desc);
 	tmp = musb_ep->packet_sz * (musb_ep->hb_mult + 1);
 
 	/* enable the interrupts for the endpoint, set the endpoint
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 53bc4ceefe89..f6cdbad00dac 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -2237,7 +2237,7 @@ static int musb_urb_enqueue(
 	 * Some musb cores don't support high bandwidth ISO transfers; and
 	 * we don't (yet!) support high bandwidth interrupt transfers.
 	 */
-	qh->hb_mult = 1 + ((qh->maxpacket >> 11) & 0x03);
+	qh->hb_mult = usb_endpoint_maxp_mult(epd);
 	if (qh->hb_mult > 1) {
 		int ok = (qh->type == USB_ENDPOINT_XFER_ISOC);
 
-- 
2.10.1


-- 
balbi

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux