Re: [PATCH v4 13/24] usb: gadget: ci13xxx: don't use "advance" feature when setting address

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

 



On Thu, 3 May 2012 15:51:56 +0300, Felipe Balbi <balbi@xxxxxx> wrote:
> On Wed, May 02, 2012 at 05:13:42PM +0300, Alexander Shishkin wrote:
> > Newer versions of the chipidea controller support the "advance" setting
> > of usb address, which means instead of setting it immediately, deferring
> > it till the status completion. Unfortunately, older versions of the
> > controller don't have this feature, so in order to support those too, we
> > simply don't use it. It's about 4 lines of extra code, and isn't in any
> > way critical to performance.
> 
> in fact this is what specification asks:
> 
> "The device does not change its device address until after the Status
> stage of this request is completed successfully."
> 
> > With this patch, ci13xxx_udc driver works with the chipidea controller in
> > kirkwood (feroceon SoC), as found in, for example, sheevaplug.
> >
> > Signed-off-by: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx>
> > ---
> >  drivers/usb/gadget/ci13xxx_udc.c |   22 ++++++++++++----------
> >  drivers/usb/gadget/ci13xxx_udc.h |    1 +
> >  2 files changed, 13 insertions(+), 10 deletions(-)
> > 
> > diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c
> > index 8802906..1da415f 100644
> > --- a/drivers/usb/gadget/ci13xxx_udc.c
> > +++ b/drivers/usb/gadget/ci13xxx_udc.c
> > @@ -722,14 +722,13 @@ static int hw_test_and_set_setup_guard(struct ci13xxx *udc)
> >   * hw_usb_set_address: configures USB address (execute without interruption)
> >   * @value: new USB address
> >   *
> > - * This function returns an error code
> > + * This function explicitly sets the address, without the "USBADRA" (advance)
> > + * feature, which is not supported by older versions of the controller.
> >   */
> > -static int hw_usb_set_address(struct ci13xxx *udc, u8 value)
> > +static void hw_usb_set_address(struct ci13xxx *udc, u8 value)
> 
> changing return from int to void isn't part of $SUBJECT.

Do you really think it's worth a separate patch? No problem with me, but
I'm already feeling bad for spamming the list.

> >  {
> > -	/* advance */
> > -	hw_write(udc, OP_DEVICEADDR, DEVICEADDR_USBADR | DEVICEADDR_USBADRA,
> > -		  value << ffs_nr(DEVICEADDR_USBADR) | DEVICEADDR_USBADRA);
> > -	return 0;
> > +	hw_write(udc, OP_DEVICEADDR, DEVICEADDR_USBADR,
> > +		 value << ffs_nr(DEVICEADDR_USBADR));
> >  }
> >  
> >  /**
> > @@ -1831,6 +1830,11 @@ isr_setup_status_complete(struct usb_ep *ep, struct usb_request *req)
> >  
> >  	trace(udc->dev, "%s, %p", ep->name, req);
> >  
> > +	if (udc->addr_to_set) {
> > +		hw_usb_set_address(udc, udc->addr_to_set);
> > +		udc->addr_to_set = 0;
> > +	}
> 
> this won't work always. A SetAddress with address zero is valid and will
> put the device into Default State. This is used at least by USB{20,30}CV
> tools. I guess it's better to use a flag together with a field to hold
> the address.

Ok, thanks, will fix.

Regards,
--
Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

  Powered by Linux