All of lore.kernel.org
 help / color / mirror / Atom feed
From: T Karthik Reddy <tkarthik@xilinx.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework
Date: Fri, 25 Oct 2019 11:47:20 +0000	[thread overview]
Message-ID: <MN2PR02MB6367D6993632787603B3A409A5650@MN2PR02MB6367.namprd02.prod.outlook.com> (raw)
In-Reply-To: <7bc9e380-6813-1f94-8024-8ce77d291902@ti.com>

Hi Vignesh,

> -----Original Message-----
> From: Vignesh Raghavendra <vigneshr@ti.com>
> Sent: Friday, October 25, 2019 10:13 AM
> To: Michal Simek <michals@xilinx.com>; u-boot at lists.denx.de; git
> <git@xilinx.com>
> Cc: Marek Vasut <marex@denx.de>; T Karthik Reddy <tkarthik@xilinx.com>
> Subject: Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to
> composite framework
> 
> Hi Michal,
> 
> On 14/10/19 6:22 PM, Michal Simek wrote:
> > From: T Karthik Reddy <t.karthik.reddy@xilinx.com>
> >
> > To add usb-3.0 support to peripheral device add BOS & SS capability
> > descriptors to gadget composite framework.
> >
> 
> How was this patch tested? With what gadget function driver was this
> tested?
> I don't see *any* function drivers claiming SS support. (For e.g.: UMS only
> declares fsg_hs_bulk_in_desc but not fsg_ss_bulk_in_desc like in kernel),
> Without any function drivers claiming and implementing SS support how is
> this supposed to work? Or did I miss something?

Commit 771e76515ed5abe7eff73a54ccb0c9ae55f34388 has added support for detecting usb 3.0 device. For the enquiry from host we are sending bos descriptor to host as a part to support 3.0 & we have tested it with DFU function.

Regards
T karthik
> 
> Regards
> Vignesh
> 
> > Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
> > Signed-off-by: Siva Durga Prasad Paladugu
> > <siva.durga.paladugu@xilinx.com>
> > Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> > ---
> >
> >  drivers/usb/gadget/composite.c | 61
> ++++++++++++++++++++++++++++++----
> >  include/linux/usb/ch9.h        |  3 ++
> >  include/linux/usb/gadget.h     |  9 +++++
> >  3 files changed, 67 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/usb/gadget/composite.c
> > b/drivers/usb/gadget/composite.c index c7e762374752..618a7d5016ee
> > 100644
> > --- a/drivers/usb/gadget/composite.c
> > +++ b/drivers/usb/gadget/composite.c
> > @@ -688,6 +688,57 @@ static void composite_setup_complete(struct
> usb_ep *ep, struct usb_request *req)
> >  				req->status, req->actual, req->length);  }
> >
> > +static int bos_desc(struct usb_composite_dev *cdev) {
> > +	struct usb_ext_cap_descriptor   *usb_ext;
> > +	struct usb_bos_descriptor       *bos = cdev->req->buf;
> > +
> > +	bos->bLength = USB_DT_BOS_SIZE;
> > +	bos->bDescriptorType = USB_DT_BOS;
> > +
> > +	bos->wTotalLength = cpu_to_le16(USB_DT_BOS_SIZE);
> > +	bos->bNumDeviceCaps = 0;
> > +
> > +	/*
> > +	 * A SuperSpeed device shall include the USB2.0 extension descriptor
> > +	 * and shall support LPM when operating in USB2.0 HS mode.
> > +	 */
> > +	usb_ext = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
> > +	bos->bNumDeviceCaps++;
> > +	le16_add_cpu(&bos->wTotalLength, USB_DT_USB_EXT_CAP_SIZE);
> > +	usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE;
> > +	usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
> > +	usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT;
> > +	usb_ext->bmAttributes =
> > +		cpu_to_le32(USB_LPM_SUPPORT | USB_BESL_SUPPORT);
> > +
> > +	/*
> > +	 * The Superspeed USB Capability descriptor shall be implemented
> > +	 * by all SuperSpeed devices.
> > +	 */
> > +	if (gadget_is_superspeed(cdev->gadget)) {
> > +		struct usb_ss_cap_descriptor *ss_cap;
> > +
> > +		ss_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
> > +		bos->bNumDeviceCaps++;
> > +		le16_add_cpu(&bos->wTotalLength,
> USB_DT_USB_SS_CAP_SIZE);
> > +		ss_cap->bLength = USB_DT_USB_SS_CAP_SIZE;
> > +		ss_cap->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
> > +		ss_cap->bDevCapabilityType = USB_SS_CAP_TYPE;
> > +		ss_cap->bmAttributes = 0; /* LTM is not supported yet */
> > +		ss_cap->wSpeedSupported =
> > +			cpu_to_le16(USB_LOW_SPEED_OPERATION |
> > +				    USB_FULL_SPEED_OPERATION |
> > +				    USB_HIGH_SPEED_OPERATION |
> > +				    USB_5GBPS_OPERATION);
> > +		ss_cap->bFunctionalitySupport =
> USB_LOW_SPEED_OPERATION;
> > +		ss_cap->bU1devExitLat = USB_DEFAULT_U1_DEV_EXIT_LAT;
> > +		ss_cap->bU2DevExitLat =
> > +			cpu_to_le16(USB_DEFAULT_U2_DEV_EXIT_LAT);
> > +	}
> > +	return le16_to_cpu(bos->wTotalLength); }
> > +
> >  /*
> >   * The setup() callback implements all the ep0 functionality that's
> >   * not handled lower down, in hardware or the hardware driver(like @@
> > -776,12 +827,10 @@ composite_setup(struct usb_gadget *gadget, const
> struct usb_ctrlrequest *ctrl)
> >  				value = min(w_length, (u16) value);
> >  			break;
> >  		case USB_DT_BOS:
> > -			/*
> > -			 * The USB compliance test (USB 2.0 Command
> Verifier)
> > -			 * issues this request. We should not run into the
> > -			 * default path here. But return for now until
> > -			 * the superspeed support is added.
> > -			 */
> > +			if (gadget_is_superspeed(cdev->gadget))
> > +				value = bos_desc(cdev);
> > +			if (value >= 0)
> > +				value = min(w_length, (u16)value);
> >  			break;
> >  		default:
> >  			goto unknown;
> > diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index
> > 264c9712a33a..989a5fcbd966 100644
> > --- a/include/linux/usb/ch9.h
> > +++ b/include/linux/usb/ch9.h
> > @@ -878,6 +878,9 @@ struct usb_ss_cap_descriptor {		/*
> Link Power Management */
> >  	__le16 bU2DevExitLat;
> >  } __attribute__((packed));
> >
> > +#define USB_DEFAULT_U1_DEV_EXIT_LAT     0x01	/* Less then 1
> microsec */
> > +#define USB_DEFAULT_U2_DEV_EXIT_LAT     0x01F4	/* Less then
> 500 microsec */
> > +
> >  #define USB_DT_USB_SS_CAP_SIZE	10
> >
> >  /*
> > diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> > index 497798a32a87..58bfaddd036a 100644
> > --- a/include/linux/usb/gadget.h
> > +++ b/include/linux/usb/gadget.h
> > @@ -566,6 +566,15 @@ static inline int gadget_is_otg(struct usb_gadget
> > *g)  #endif  }
> >
> > +/**
> > + * gadget_is_superspeed() - return true if the hardware handles
> > +superspeed
> > + * @g: controller that might support superspeed  */ static inline int
> > +gadget_is_superspeed(struct usb_gadget *g) {
> > +	return g->max_speed >= USB_SPEED_SUPER; }
> > +
> >  /**
> >   * usb_gadget_frame_number - returns the current frame number
> >   * @gadget: controller that reports the frame number
> >
> 
> --
> Regards
> Vignesh

      parent reply	other threads:[~2019-10-25 11:47 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-14 12:52 [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework Michal Simek
2019-10-24 11:22 ` Michal Simek
2019-10-24 15:44   ` Jean-Jacques Hiblot
2019-10-25 10:28     ` Roger Quadros
2019-11-04 10:11       ` Michal Simek
2019-10-25  4:42 ` Vignesh Raghavendra
2019-10-25  6:00   ` Michal Simek
2019-10-25 11:47   ` T Karthik Reddy [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MN2PR02MB6367D6993632787603B3A409A5650@MN2PR02MB6367.namprd02.prod.outlook.com \
    --to=tkarthik@xilinx.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.