Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-11-04 Thread Michal Simek
On 25. 10. 19 12:28, Roger Quadros wrote:
> 
> 
> On 24/10/2019 18:44, Jean-Jacques Hiblot wrote:
>> + Vignesh and Roger
>>
>> On 24/10/2019 13:22, Michal Simek wrote:
>>> po 14. 10. 2019 v 14:52 odesílatel Michal Simek
>>>  napsal:
 From: T Karthik Reddy 

 To add usb-3.0 support to peripheral device add BOS & SS capability
 descriptors to gadget composite framework.

 Signed-off-by: T Karthik Reddy 
 Signed-off-by: Siva Durga Prasad Paladugu
 
 Signed-off-by: Michal Simek 
> 
> Reviewed-by: Roger Quadros 

Lukasz: This patch is assigned to you in patchwork. Can you please
comment it or take it via your tree?

Thanks,
Michal
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-25 Thread T Karthik Reddy
Hi Vignesh,

> -Original Message-
> From: Vignesh Raghavendra 
> Sent: Friday, October 25, 2019 10:13 AM
> To: Michal Simek ; u-boot@lists.denx.de; git
> 
> Cc: Marek Vasut ; T Karthik Reddy 
> 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 
> >
> > 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 
> > Signed-off-by: Siva Durga Prasad Paladugu
> > 
> > Signed-off-by: Michal Simek 
> > ---
> >
> >  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(>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(>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 @@ compo

Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-25 Thread Roger Quadros



On 24/10/2019 18:44, Jean-Jacques Hiblot wrote:

+ Vignesh and Roger

On 24/10/2019 13:22, Michal Simek wrote:

po 14. 10. 2019 v 14:52 odesílatel Michal Simek
 napsal:

From: T Karthik Reddy 

To add usb-3.0 support to peripheral device add BOS & SS capability
descriptors to gadget composite framework.

Signed-off-by: T Karthik Reddy 
Signed-off-by: Siva Durga Prasad Paladugu 
Signed-off-by: Michal Simek 


Reviewed-by: Roger Quadros 


---

  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(>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(>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
@@ 

Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-25 Thread Michal Simek
Hi,

On 25. 10. 19 6:42, Vignesh Raghavendra wrote:
> Hi Michal,
> 
> On 14/10/19 6:22 PM, Michal Simek wrote:
>> From: T Karthik Reddy 
>>
>> 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?

Karthik/Siva: Can you please provide details?

What I see is that it was developed on ultra96 to fix issue around usb-3.0.

Thanks,
Michal

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-24 Thread Vignesh Raghavendra
Hi Michal,

On 14/10/19 6:22 PM, Michal Simek wrote:
> From: T Karthik Reddy 
> 
> 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?

Regards
Vignesh

> Signed-off-by: T Karthik Reddy 
> Signed-off-by: Siva Durga Prasad Paladugu 
> Signed-off-by: Michal Simek 
> ---
> 
>  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(>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(>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 

Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-24 Thread Jean-Jacques Hiblot

+ Vignesh and Roger

On 24/10/2019 13:22, Michal Simek wrote:

po 14. 10. 2019 v 14:52 odesílatel Michal Simek
 napsal:

From: T Karthik Reddy 

To add usb-3.0 support to peripheral device add BOS & SS capability
descriptors to gadget composite framework.

Signed-off-by: T Karthik Reddy 
Signed-off-by: Siva Durga Prasad Paladugu 
Signed-off-by: Michal Simek 
---

  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(>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(>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
  }


Re: [U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-24 Thread Michal Simek
po 14. 10. 2019 v 14:52 odesílatel Michal Simek
 napsal:
>
> From: T Karthik Reddy 
>
> To add usb-3.0 support to peripheral device add BOS & SS capability
> descriptors to gadget composite framework.
>
> Signed-off-by: T Karthik Reddy 
> Signed-off-by: Siva Durga Prasad Paladugu 
> Signed-off-by: Michal Simek 
> ---
>
>  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(>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(>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
> --- 

[U-Boot] [PATCH] usb: composite: add BOS descriptor support to composite framework

2019-10-14 Thread Michal Simek
From: T Karthik Reddy 

To add usb-3.0 support to peripheral device add BOS & SS capability
descriptors to gadget composite framework.

Signed-off-by: T Karthik Reddy 
Signed-off-by: Siva Durga Prasad Paladugu 
Signed-off-by: Michal Simek 
---

 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(>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(>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
+ */