usbdev: modify usb device support USB3.0 MaxPacketSize

Signed-off-by: yangsong8 <yangsong8@xiaomi.com>
diff --git a/drivers/usbdev/Kconfig b/drivers/usbdev/Kconfig
index 5e757352..005fd22 100644
--- a/drivers/usbdev/Kconfig
+++ b/drivers/usbdev/Kconfig
@@ -318,6 +318,35 @@
 	int "Packet and request buffer sizes"
 	default 64
 
+config PL2303_EPBULK_FSSIZE
+	int "BULK endpoints full speed MAXPACKET size"
+	default 64
+	---help---
+		Max package size for the bulk endpoint if full speed mode.
+		Default 64.
+
+if USBDEV_DUALSPEED
+
+config PL2303_EPBULK_HSSIZE
+	int "BULK endpoints high speed MAXPACKET size"
+	default 512
+	---help---
+		Max package size for the bulk endpoint if high speed mode.
+		Default 512.
+
+endif # USBDEV_DUALSPEED
+
+if USBDEV_SUPERSPEED
+
+config PL2303_EPBULK_SSSIZE
+	int "BULK endpoints super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 config PL2303_NWRREQS
 	int "Number of read requests that can be in flight"
 	default 4
@@ -462,6 +491,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCACM_EPINTIN_SSSIZE
+	int "Interrupt IN super speed MAXPACKET size"
+	default 64
+	---help---
+		Max package size for the interrupt IN endpoint if super speed mode.
+		Default 64.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCACM_COMPOSITE
 
 # In a composite device the EP-Number is configured dynamically via
@@ -494,6 +534,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCACM_EPBULKOUT_SSSIZE
+	int "Bulk OUT out super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk OUT endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCACM_COMPOSITE
 
 # In a composite device the EP-Number is configured dynamically via
@@ -526,6 +577,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCACM_EPBULKIN_SSSIZE
+	int "Bulk IN super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk IN endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 config CDCACM_NRDREQS
 	int "Number of read requests that can be in flight"
 	default 4
@@ -670,7 +732,7 @@
 if USBDEV_DUALSPEED
 
 config USBADB_EPBULKOUT_HSSIZE
-	int "Bulk OUT out high speed MAXPACKET size"
+	int "Bulk OUT high speed MAXPACKET size"
 	default 512
 	---help---
 		Max package size for the bulk OUT endpoint if high speed mode.
@@ -678,6 +740,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config USBADB_EPBULKOUT_SSSIZE
+	int "Bulk OUT super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk OUT endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 config USBADB_EPBULKIN_FSSIZE
 	int "Bulk IN full speed MAXPACKET size"
 	default 64
@@ -696,6 +769,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config USBADB_EPBULKIN_SSSIZE
+	int "Bulk IN super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk IN endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 config USBADB_NRDREQS
 	int "Number of read requests that can be in flight"
 	default 4
@@ -1135,6 +1219,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCECM_EPINTIN_SSSIZE
+	int "Interrupt IN super speed MAXPACKET size"
+	default 64
+	---help---
+		Max package size for the interrupt IN endpoint if super speed mode.
+		Default 64.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCECM_COMPOSITE
 
 # In a composite device the EP-Number is configured dynamically via
@@ -1159,7 +1254,7 @@
 if USBDEV_DUALSPEED
 
 config CDCECM_EPBULKOUT_HSSIZE
-	int "Bulk OUT out high speed MAXPACKET size"
+	int "Bulk OUT high speed MAXPACKET size"
 	default 512
 	---help---
 		Max package size for the bulk OUT endpoint if high speed mode.
@@ -1167,6 +1262,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCECM_EPBULKOUT_SSSIZE
+	int "Bulk OUT super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk OUT endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCECM_COMPOSITE
 
 # In a composite device the EP-Number is configured dynamically via
@@ -1199,6 +1305,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCECM_EPBULKIN_SSSIZE
+	int "Bulk IN super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk IN endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCECM_COMPOSITE
 
 # In a composite device the Vendor- and Product-ID is given by the composite
@@ -1310,6 +1427,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCNCM_EPINTIN_SSSIZE
+	int "Interrupt IN super speed MAXPACKET size"
+	default 64
+	---help---
+		Max package size for the interrupt IN endpoint if super speed mode.
+		Default 64.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCNCM_COMPOSITE
 
 # In a composite device the EP-Number is configured dynamically via
@@ -1334,7 +1462,7 @@
 if USBDEV_DUALSPEED
 
 config CDCNCM_EPBULKOUT_HSSIZE
-	int "Bulk OUT out high speed MAXPACKET size"
+	int "Bulk OUT high speed MAXPACKET size"
 	default 512
 	---help---
 		Max package size for the bulk OUT endpoint if high speed mode.
@@ -1342,6 +1470,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCNCM_EPBULKOUT_SSSIZE
+	int "Bulk OUT super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk OUT endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCNCM_COMPOSITE
 
 # In a composite device the EP-Number is configured dynamically via
@@ -1374,6 +1513,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config CDCNCM_EPBULKIN_SSSIZE
+	int "Bulk IN super speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk IN endpoint if super speed mode.
+		Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
 if !CDCNCM_COMPOSITE
 
 # In a composite device the Vendor- and Product-ID is given by the composite
@@ -1519,6 +1669,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config USBMTP_EPBULKOUT_SSSIZE
+	int "Bulk OUT Super Speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk OUT endpoint if Super Speed mode.
+		Default 1024.
+
+endif # USBDEV_DUALSPEED
+
 config USBMTP_EPBULKIN_FSSIZE
 	int "Bulk IN Full Speed MAXPACKET size"
 	default 64
@@ -1537,6 +1698,17 @@
 
 endif # USBDEV_DUALSPEED
 
+if USBDEV_SUPERSPEED
+
+config USBMTP_EPBULKIN_SSSIZE
+	int "Bulk IN Super Speed MAXPACKET size"
+	default 1024
+	---help---
+		Max package size for the bulk IN endpoint if Super Speed mode.
+		Default 1024.
+
+endif # USBDEV_DUALSPEED
+
 config USBMTP_EPINTIN_SIZE
 	int "Interrupt IN MAXPACKET size"
 	default 28
diff --git a/drivers/usbdev/adb.c b/drivers/usbdev/adb.c
index 0bf396b..e094d8d 100644
--- a/drivers/usbdev/adb.c
+++ b/drivers/usbdev/adb.c
@@ -117,9 +117,9 @@
 #ifndef CONFIG_USBADB_COMPOSITE
 static const struct usb_devdesc_s g_adb_devdesc =
 {
-  .len = USB_SIZEOF_DEVDESC,         /* Descriptor length */
-  .type = USB_DESC_TYPE_DEVICE,      /* Descriptor type */
-  .usb =                             /* USB version */
+  .len = USB_SIZEOF_DEVDESC,                  /* Descriptor length */
+  .type = USB_DESC_TYPE_DEVICE,               /* Descriptor type */
+  .usb =                                      /* USB version */
   {
     LSBYTE(0x0200),
     MSBYTE(0x0200)
@@ -133,37 +133,37 @@
     LSBYTE(CONFIG_USBADB_VENDORID),
     MSBYTE(CONFIG_USBADB_VENDORID)
   },
-  .product =                         /* Product ID */
+  .product =                                  /* Product ID */
   {
     LSBYTE(CONFIG_USBADB_PRODUCTID),
     MSBYTE(CONFIG_USBADB_PRODUCTID)
   },
-  .device =                          /* Device ID */
+  .device =                                   /* Device ID */
   {
     LSBYTE(USBADB_VERSIONNO),
     MSBYTE(USBADB_VERSIONNO)
   },
-  .imfgr = USBADB_MANUFACTURERSTRID, /* Manufacturer */
-  .iproduct = USBADB_PRODUCTSTRID,   /* Product */
-  .serno = USBADB_SERIALSTRID,       /* Serial number */
-  .nconfigs = USBADB_NCONFIGS,       /* Number of configurations */
+  .imfgr = USBADB_MANUFACTURERSTRID,          /* Manufacturer */
+  .iproduct = USBADB_PRODUCTSTRID,            /* Product */
+  .serno = USBADB_SERIALSTRID,                /* Serial number */
+  .nconfigs = USBADB_NCONFIGS,                /* Number of configurations */
 };
 
 #  ifdef CONFIG_USBDEV_DUALSPEED
 static const struct usb_qualdesc_s g_adb_qualdesc =
 {
-  USB_SIZEOF_QUALDESC,               /* len */
-  USB_DESC_TYPE_DEVICEQUALIFIER,     /* type */
-  {                                  /* usb */
+  USB_SIZEOF_QUALDESC,                        /* len */
+  USB_DESC_TYPE_DEVICEQUALIFIER,              /* type */
+  {                                           /* usb */
     LSBYTE(0x0200),
     MSBYTE(0x0200)
   },
-  0,                                 /* classid */
-  0,                                 /* subclass */
-  0,                                 /* protocol */
-  CONFIG_USBADB_EP0MAXPACKET,        /* mxpacketsize */
-  USBADB_NCONFIGS,                   /* nconfigs */
-  0,                                 /* reserved */
+  0,                                          /* classid */
+  0,                                          /* subclass */
+  0,                                          /* protocol */
+  CONFIG_USBADB_EP0MAXPACKET,                 /* mxpacketsize */
+  USBADB_NCONFIGS,                            /* nconfigs */
+  0,                                          /* reserved */
 };
 #  endif
 
@@ -239,6 +239,9 @@
 #ifdef CONFIG_USBDEV_DUALSPEED
   .hssize = CONFIG_USBADB_EPBULKIN_HSSIZE,
 #endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize = CONFIG_USBADB_EPBULKIN_SSSIZE,
+#endif
   .reqnum = CONFIG_USBADB_NWRREQS,
 };
 
@@ -258,6 +261,9 @@
 #ifdef CONFIG_USBDEV_DUALSPEED
   .hssize = CONFIG_USBADB_EPBULKOUT_HSSIZE,
 #endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize = CONFIG_USBADB_EPBULKOUT_SSSIZE,
+#endif
   .reqnum = CONFIG_USBADB_NRDREQS,
 };
 
@@ -279,7 +285,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
                                   FAR struct usbdev_devinfo_s *devinfo,
                                   uint8_t speed, uint8_t type)
@@ -288,19 +294,18 @@
                                   FAR struct usbdev_devinfo_s *devinfo)
 #endif
 {
-  bool hispeed = false;
   FAR struct usb_epdesc_s *epdesc;
   FAR struct usb_ifdesc_s *dest;
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (speed == USB_SPEED_HIGH);
-
   /* Check for switches between high and full speed */
 
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
     {
-      hispeed = !hispeed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
   dest = (FAR struct usb_ifdesc_s *)buf;
@@ -309,9 +314,9 @@
   memcpy(dest, &g_adb_ifdesc, sizeof(g_adb_ifdesc));
 
   usbdev_copy_epdesc(&epdesc[0], devinfo->epno[USBADB_EP_BULKIN_IDX],
-                     hispeed, &g_adb_epbulkin);
+                     speed, &g_adb_epbulkin);
   usbdev_copy_epdesc(&epdesc[1], devinfo->epno[USBADB_EP_BULKOUT_IDX],
-                     hispeed, &g_adb_epbulkout);
+                     speed, &g_adb_epbulkout);
 
 #ifdef CONFIG_USBADB_COMPOSITE
   /* For composite device, apply possible offset to the interface numbers */
diff --git a/drivers/usbdev/cdcacm.c b/drivers/usbdev/cdcacm.c
index 7f887bd..4ec53e4 100644
--- a/drivers/usbdev/cdcacm.c
+++ b/drivers/usbdev/cdcacm.c
@@ -175,7 +175,7 @@
 static int     cdcacm_epconfigure(FAR struct usbdev_ep_s *ep,
                  enum cdcacm_epdesc_e epid, bool last,
                  FAR struct usbdev_devinfo_s *devinfo,
-                 bool hispeed);
+                 uint8_t speed);
 static int     cdcacm_setconfig(FAR struct cdcacm_dev_s *priv,
                  uint8_t config);
 
@@ -915,10 +915,10 @@
 static int cdcacm_epconfigure(FAR struct usbdev_ep_s *ep,
                               enum cdcacm_epdesc_e epid, bool last,
                               FAR struct usbdev_devinfo_s *devinfo,
-                              bool hispeed)
+                              uint8_t speed)
 {
   struct usb_epdesc_s epdesc;
-  cdcacm_copy_epdesc(epid, &epdesc, devinfo, hispeed);
+  cdcacm_copy_epdesc(epid, &epdesc, devinfo, speed);
   return EP_CONFIGURE(ep, &epdesc, last);
 }
 
@@ -975,18 +975,8 @@
 
   /* Configure the IN interrupt endpoint */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (priv->usbdev->speed == USB_SPEED_HIGH)
-    {
-      ret = cdcacm_epconfigure(priv->epintin, CDCACM_EPINTIN, false,
-                               &priv->devinfo, true);
-    }
-  else
-#endif
-    {
-      ret = cdcacm_epconfigure(priv->epintin, CDCACM_EPINTIN, false,
-                               &priv->devinfo, false);
-    }
+  ret = cdcacm_epconfigure(priv->epintin, CDCACM_EPINTIN, false,
+                            &priv->devinfo, priv->usbdev->speed);
 
   if (ret < 0)
     {
@@ -998,18 +988,8 @@
 
   /* Configure the IN bulk endpoint */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (priv->usbdev->speed == USB_SPEED_HIGH)
-    {
-      ret = cdcacm_epconfigure(priv->epbulkin, CDCACM_EPBULKIN, false,
-                               &priv->devinfo, true);
-    }
-  else
-#endif
-    {
-      ret = cdcacm_epconfigure(priv->epbulkin, CDCACM_EPBULKIN, false,
-                               &priv->devinfo, false);
-    }
+  ret = cdcacm_epconfigure(priv->epbulkin, CDCACM_EPBULKIN, false,
+                            &priv->devinfo, priv->usbdev->speed);
 
   if (ret < 0)
     {
@@ -1021,18 +1001,8 @@
 
   /* Configure the OUT bulk endpoint */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (priv->usbdev->speed == USB_SPEED_HIGH)
-    {
-      ret = cdcacm_epconfigure(priv->epbulkout, CDCACM_EPBULKOUT, true,
-                               &priv->devinfo, true);
-    }
-  else
-#endif
-    {
-      ret = cdcacm_epconfigure(priv->epbulkout, CDCACM_EPBULKOUT, true,
-                               &priv->devinfo, false);
-    }
+  ret = cdcacm_epconfigure(priv->epbulkout, CDCACM_EPBULKOUT, true,
+                            &priv->devinfo, priv->usbdev->speed);
 
   if (ret < 0)
     {
@@ -1336,8 +1306,9 @@
   priv->epbulkout->priv = priv;
 
   /* Pre-allocate read requests.  The buffer size is one full packet. */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+  reqlen = CONFIG_CDCACM_EPBULKOUT_SSSIZE;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
   reqlen = CONFIG_CDCACM_EPBULKOUT_HSSIZE;
 #else
   reqlen = CONFIG_CDCACM_EPBULKOUT_FSSIZE;
@@ -1369,7 +1340,9 @@
    * shared with interrupt IN endpoint which does not need a large buffer.
    */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+  reqlen = CONFIG_CDCACM_EPBULKIN_SSSIZE;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
   reqlen = CONFIG_CDCACM_EPBULKIN_HSSIZE;
 #else
   reqlen = CONFIG_CDCACM_EPBULKIN_FSSIZE;
@@ -1658,7 +1631,7 @@
 #ifndef CONFIG_CDCACM_COMPOSITE
               case USB_DESC_TYPE_CONFIG:
                 {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
                   ret = cdcacm_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
                                          dev->speed, ctrl->value[1]);
 #else
@@ -2931,8 +2904,9 @@
   priv->serdev.priv         = priv;
 
   /* Initialize the USB class driver structure */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+  drvr->drvr.speed          = USB_SPEED_SUPER;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
   drvr->drvr.speed          = USB_SPEED_HIGH;
 #else
   drvr->drvr.speed          = USB_SPEED_FULL;
@@ -3133,7 +3107,7 @@
 
   /* Let the construction function calculate the size of config descriptor */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
   dev->cfgdescsize  = cdcacm_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
 #else
   dev->cfgdescsize  = cdcacm_mkcfgdesc(NULL, NULL);
diff --git a/drivers/usbdev/cdcacm.h b/drivers/usbdev/cdcacm.h
index 00dfe6b..8671c31 100644
--- a/drivers/usbdev/cdcacm.h
+++ b/drivers/usbdev/cdcacm.h
@@ -236,7 +236,7 @@
 int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid,
                        FAR struct usb_epdesc_s *epdesc,
                        FAR struct usbdev_devinfo_s *devinfo,
-                       bool hispeed);
+                       uint8_t speed);
 
 /****************************************************************************
  * Name: cdcacm_mkcfgdesc
@@ -246,7 +246,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf,
                          FAR struct usbdev_devinfo_s *devinfo,
                          uint8_t speed, uint8_t type);
diff --git a/drivers/usbdev/cdcacm_desc.c b/drivers/usbdev/cdcacm_desc.c
index 5a6480f..516ab85 100644
--- a/drivers/usbdev/cdcacm_desc.c
+++ b/drivers/usbdev/cdcacm_desc.c
@@ -227,10 +227,10 @@
 int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid,
                        FAR struct usb_epdesc_s *epdesc,
                        FAR struct usbdev_devinfo_s *devinfo,
-                       bool hispeed)
+                       uint8_t speed)
 {
-#ifndef CONFIG_USBDEV_DUALSPEED
-    UNUSED(hispeed);
+#if !defined(CONFIG_USBDEV_DUALSPEED) && !defined(CONFIG_USBDEV_SUPERSPEED)
+    UNUSED(speed);
 #endif
 
     switch (epid)
@@ -242,8 +242,18 @@
           epdesc->addr = CDCACM_MKEPINTIN(devinfo);    /* Endpoint address */
           epdesc->attr = CDCACM_EPINTIN_ATTR;          /* Endpoint attributes */
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+          if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+            {
+              /* Maximum packet size (super speed) */
+
+              epdesc->mxpacketsize[0] = LSBYTE(CONFIG_CDCACM_EPINTIN_SSSIZE);
+              epdesc->mxpacketsize[1] = MSBYTE(CONFIG_CDCACM_EPINTIN_SSSIZE);
+            }
+          else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-          if (hispeed)
+          if (speed == USB_SPEED_HIGH)
             {
               /* Maximum packet size (high speed) */
 
@@ -269,8 +279,19 @@
         epdesc->type = USB_DESC_TYPE_ENDPOINT;       /* Descriptor type */
         epdesc->addr = CDCACM_MKEPBULKOUT(devinfo);  /* Endpoint address */
         epdesc->attr = CDCACM_EPOUTBULK_ATTR;        /* Endpoint attributes */
+
+#ifdef CONFIG_USBDEV_SUPERSPEED
+        if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+          {
+            /* Maximum packet size (super speed) */
+
+            epdesc->mxpacketsize[0] = LSBYTE(CONFIG_CDCACM_EPBULKOUT_SSSIZE);
+            epdesc->mxpacketsize[1] = MSBYTE(CONFIG_CDCACM_EPBULKOUT_SSSIZE);
+          }
+        else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-        if (hispeed)
+        if (speed == USB_SPEED_HIGH)
           {
             /* Maximum packet size (high speed) */
 
@@ -297,8 +318,18 @@
         epdesc->addr = CDCACM_MKEPBULKIN(devinfo);   /* Endpoint address */
         epdesc->attr = CDCACM_EPINBULK_ATTR;         /* Endpoint attributes */
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+        if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+          {
+            /* Maximum packet size (super speed) */
+
+            epdesc->mxpacketsize[0] = LSBYTE(CONFIG_CDCACM_EPBULKIN_SSSIZE);
+            epdesc->mxpacketsize[1] = MSBYTE(CONFIG_CDCACM_EPBULKIN_SSSIZE);
+          }
+        else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-        if (hispeed)
+        if (speed == USB_SPEED_HIGH)
           {
             /* Maximum packet size (high speed) */
 
@@ -333,7 +364,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf,
                          FAR struct usbdev_devinfo_s *devinfo,
                          uint8_t speed, uint8_t type)
@@ -343,17 +374,14 @@
 #endif
 {
   int length = 0;
-  bool hispeed = false;
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (speed == USB_SPEED_HIGH);
-
-  /* Check for switches between high and full speed */
-
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
     {
-      hispeed = !hispeed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
   /* Fill in all descriptors directly to the buf */
@@ -376,7 +404,7 @@
 
       /* Let's calculate the size... */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
       int16_t size = cdcacm_mkcfgdesc(NULL, NULL, speed, type);
 #else
       int16_t size = cdcacm_mkcfgdesc(NULL, NULL);
@@ -537,7 +565,7 @@
     {
       cdcacm_copy_epdesc(CDCACM_EPINTIN, (struct usb_epdesc_s *)buf,
                          devinfo,
-                         hispeed);
+                         speed);
 
       buf += USB_SIZEOF_EPDESC;
     }
@@ -575,7 +603,7 @@
     {
       cdcacm_copy_epdesc(CDCACM_EPBULKOUT, (struct usb_epdesc_s *)buf,
                          devinfo,
-                         hispeed);
+                         speed);
       buf += USB_SIZEOF_EPDESC;
     }
 
@@ -587,7 +615,7 @@
     {
       cdcacm_copy_epdesc(CDCACM_EPBULKIN, (struct usb_epdesc_s *)buf,
                          devinfo,
-                         hispeed);
+                         speed);
       buf += USB_SIZEOF_EPDESC;
     }
 
diff --git a/drivers/usbdev/cdcecm.c b/drivers/usbdev/cdcecm.c
index 1ec8430..05b904a 100644
--- a/drivers/usbdev/cdcecm.c
+++ b/drivers/usbdev/cdcecm.c
@@ -208,7 +208,7 @@
 
 static void cdcecm_mkepdesc(int epidx,
               FAR struct usb_epdesc_s *epdesc,
-              FAR struct usbdev_devinfo_s *devinfo, bool hispeed);
+              FAR struct usbdev_devinfo_s *devinfo, uint8_t speed);
 
 /****************************************************************************
  * Private Data
@@ -949,7 +949,6 @@
 static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config)
 {
   struct usb_epdesc_s epdesc;
-  bool is_high_speed;
   int ret = OK;
 
   if (config == self->config)
@@ -969,7 +968,8 @@
       return -EINVAL;
     }
 
-  cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX, &epdesc, &self->devinfo, false);
+  cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX,
+                  &epdesc, &self->devinfo, self->usbdev.speed);
   ret = EP_CONFIGURE(self->epint, &epdesc, false);
 
   if (ret < 0)
@@ -979,9 +979,8 @@
 
   self->epint->priv = self;
 
-  is_high_speed = (self->usbdev.speed == USB_SPEED_HIGH);
   cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX,
-                  &epdesc, &self->devinfo, is_high_speed);
+                  &epdesc, &self->devinfo, self->usbdev.speed);
   ret = EP_CONFIGURE(self->epbulkin, &epdesc, false);
 
   if (ret < 0)
@@ -992,7 +991,7 @@
   self->epbulkin->priv = self;
 
   cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX,
-                  &epdesc, &self->devinfo, is_high_speed);
+                  &epdesc, &self->devinfo, self->usbdev.speed);
   ret = EP_CONFIGURE(self->epbulkout, &epdesc, true);
 
   if (ret < 0)
@@ -1141,21 +1140,34 @@
 static void cdcecm_mkepdesc(int epidx,
                             FAR struct usb_epdesc_s *epdesc,
                             FAR struct usbdev_devinfo_s *devinfo,
-                            bool hispeed)
+                            uint8_t speed)
 {
   uint16_t intin_mxpktsz   = CONFIG_CDCECM_EPINTIN_FSSIZE;
   uint16_t bulkout_mxpktsz = CONFIG_CDCECM_EPBULKOUT_FSSIZE;
   uint16_t bulkin_mxpktsz  = CONFIG_CDCECM_EPBULKIN_FSSIZE;
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (hispeed)
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
     {
+      /* Maximum packet size (super speed) */
+
+      intin_mxpktsz   = CONFIG_CDCECM_EPINTIN_SSSIZE;
+      bulkout_mxpktsz = CONFIG_CDCECM_EPBULKOUT_SSSIZE;
+      bulkin_mxpktsz  = CONFIG_CDCECM_EPBULKIN_SSSIZE;
+    }
+  else
+#endif
+#ifdef CONFIG_USBDEV_DUALSPEED
+  if (speed == USB_SPEED_HIGH)
+    {
+      /* Maximum packet size (high speed) */
+
       intin_mxpktsz   = CONFIG_CDCECM_EPINTIN_HSSIZE;
       bulkout_mxpktsz = CONFIG_CDCECM_EPBULKOUT_HSSIZE;
       bulkin_mxpktsz  = CONFIG_CDCECM_EPBULKIN_HSSIZE;
     }
 #else
-  UNUSED(hispeed);
+  UNUSED(speed);
 #endif
 
   epdesc->len  = USB_SIZEOF_EPDESC;            /* Descriptor length */
@@ -1209,7 +1221,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc,
                                 FAR struct usbdev_devinfo_s *devinfo,
                                 uint8_t speed, uint8_t type)
@@ -1220,17 +1232,16 @@
 {
   FAR struct usb_cfgdesc_s *cfgdesc = NULL;
   int16_t len = 0;
-  bool is_high_speed = false;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-  is_high_speed = (speed == USB_SPEED_HIGH);
 
   /* Check for switches between high and full speed */
 
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
     {
-      is_high_speed = !is_high_speed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
 #ifndef CONFIG_CDCECM_COMPOSITE
@@ -1355,7 +1366,7 @@
     {
       FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
 
-      cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX, epdesc, devinfo, false);
+      cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX, epdesc, devinfo, speed);
       desc += USB_SIZEOF_EPDESC;
     }
 
@@ -1407,7 +1418,7 @@
     {
       FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
 
-      cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, epdesc, devinfo, is_high_speed);
+      cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, epdesc, devinfo, speed);
       desc += USB_SIZEOF_EPDESC;
     }
 
@@ -1417,7 +1428,7 @@
     {
       FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
 
-      cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, epdesc, devinfo, is_high_speed);
+      cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, epdesc, devinfo, speed);
       desc += USB_SIZEOF_EPDESC;
     }
 
@@ -1473,7 +1484,7 @@
 #endif /* CONFIG_USBDEV_DUALSPEED */
     case USB_DESC_TYPE_CONFIG:
       {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
         return cdcecm_mkcfgdesc((FAR uint8_t *)desc, &self->devinfo,
                                 self->usbdev.speed, type);
 #else
@@ -2007,7 +2018,7 @@
 
   /* Let the construction function calculate the size of config descriptor */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
   dev->cfgdescsize  = cdcecm_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
 #else
   dev->cfgdescsize  = cdcecm_mkcfgdesc(NULL, NULL);
diff --git a/drivers/usbdev/cdcncm.c b/drivers/usbdev/cdcncm.c
index 3c40f88..b64b394 100644
--- a/drivers/usbdev/cdcncm.c
+++ b/drivers/usbdev/cdcncm.c
@@ -427,7 +427,7 @@
 
 static void cdcncm_mkepdesc(int epidx, FAR struct usb_epdesc_s *epdesc,
                             FAR struct usbdev_devinfo_s *devinfo,
-                            bool hispeed);
+                            uint8_t speed);
 
 /****************************************************************************
  * Private Data
@@ -580,7 +580,7 @@
 
 static inline uint32_t cdcncm_get(FAR uint8_t **address, size_t size)
 {
-  uint32_t value;
+  uint32_t value = 0;
 
   switch (size)
   {
@@ -1582,7 +1582,6 @@
 static int cdcncm_setconfig(FAR struct cdcncm_driver_s *self, uint8_t config)
 {
   struct usb_epdesc_s epdesc;
-  bool is_high_speed = self->usbdev.speed == USB_SPEED_HIGH;
   int ret;
 
   if (config == self->config)
@@ -1602,7 +1601,8 @@
       return -EINVAL;
     }
 
-  cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX, &epdesc, &self->devinfo, false);
+  cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX,
+                  &epdesc, &self->devinfo, self->usbdev.speed);
   ret = EP_CONFIGURE(self->epint, &epdesc, false);
 
   if (ret < 0)
@@ -1612,7 +1612,7 @@
 
   self->epint->priv = self;
   cdcncm_mkepdesc(CDCNCM_EP_BULKIN_IDX,
-                  &epdesc, &self->devinfo, is_high_speed);
+                  &epdesc, &self->devinfo, self->usbdev.speed);
   ret = EP_CONFIGURE(self->epbulkin, &epdesc, false);
 
   if (ret < 0)
@@ -1623,7 +1623,7 @@
   self->epbulkin->priv = self;
 
   cdcncm_mkepdesc(CDCNCM_EP_BULKOUT_IDX,
-                  &epdesc, &self->devinfo, is_high_speed);
+                  &epdesc, &self->devinfo, self->usbdev.speed);
   ret = EP_CONFIGURE(self->epbulkout, &epdesc, true);
 
   if (ret < 0)
@@ -1911,21 +1911,34 @@
 
 static void cdcncm_mkepdesc(int epidx, FAR struct usb_epdesc_s *epdesc,
                             FAR struct usbdev_devinfo_s *devinfo,
-                            bool hispeed)
+                            uint8_t speed)
 {
   uint16_t intin_mxpktsz   = CONFIG_CDCNCM_EPINTIN_FSSIZE;
   uint16_t bulkout_mxpktsz = CONFIG_CDCNCM_EPBULKOUT_FSSIZE;
   uint16_t bulkin_mxpktsz  = CONFIG_CDCNCM_EPBULKIN_FSSIZE;
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (hispeed)
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
     {
+      /* Maximum packet size (super speed) */
+
+      intin_mxpktsz   = CONFIG_CDCNCM_EPINTIN_SSSIZE;
+      bulkout_mxpktsz = CONFIG_CDCNCM_EPBULKOUT_SSSIZE;
+      bulkin_mxpktsz  = CONFIG_CDCNCM_EPBULKIN_SSSIZE;
+    }
+  else
+#endif
+#ifdef CONFIG_USBDEV_DUALSPEED
+  if (speed == USB_SPEED_HIGH)
+    {
+      /* Maximum packet size (high speed) */
+
       intin_mxpktsz   = CONFIG_CDCNCM_EPINTIN_HSSIZE;
       bulkout_mxpktsz = CONFIG_CDCNCM_EPBULKOUT_HSSIZE;
       bulkin_mxpktsz  = CONFIG_CDCNCM_EPBULKIN_HSSIZE;
     }
 #else
-  UNUSED(hispeed);
+  UNUSED(speed);
 #endif
 
   epdesc->len  = USB_SIZEOF_EPDESC;      /* Descriptor length */
@@ -1979,7 +1992,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc,
                                FAR struct usbdev_devinfo_s *devinfo,
                                uint8_t speed, uint8_t type, bool isncm)
@@ -1991,17 +2004,16 @@
 {
   FAR struct usb_cfgdesc_s *cfgdesc = NULL;
   int16_t len = 0;
-  bool is_high_speed = false;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-  is_high_speed = (speed == USB_SPEED_HIGH);
 
   /* Check for switches between high and full speed */
 
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
     {
-      is_high_speed = !is_high_speed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
 #ifndef CONFIG_CDCNCM_COMPOSITE
@@ -2172,7 +2184,7 @@
     {
       FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
 
-      cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX, epdesc, devinfo, false);
+      cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX, epdesc, devinfo, speed);
       desc += USB_SIZEOF_EPDESC;
     }
 
@@ -2226,7 +2238,7 @@
     {
       FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
 
-      cdcncm_mkepdesc(CDCNCM_EP_BULKIN_IDX, epdesc, devinfo, is_high_speed);
+      cdcncm_mkepdesc(CDCNCM_EP_BULKIN_IDX, epdesc, devinfo, speed);
       desc += USB_SIZEOF_EPDESC;
     }
 
@@ -2236,7 +2248,7 @@
     {
       FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
 
-      cdcncm_mkepdesc(CDCNCM_EP_BULKOUT_IDX, epdesc, devinfo, is_high_speed);
+      cdcncm_mkepdesc(CDCNCM_EP_BULKOUT_IDX, epdesc, devinfo, speed);
       desc += USB_SIZEOF_EPDESC;
     }
 
@@ -2260,7 +2272,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t cdcncm_mkcfgdesc(FAR uint8_t *desc,
                                 FAR struct usbdev_devinfo_s *devinfo,
                                 uint8_t speed, uint8_t type)
@@ -2339,7 +2351,7 @@
     case USB_DESC_TYPE_OTHERSPEEDCONFIG:
 #endif /* CONFIG_USBDEV_DUALSPEED */
     case USB_DESC_TYPE_CONFIG:
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
       return cdcncm_mkcfgdesc((FAR uint8_t *)desc, &self->devinfo,
                               self->usbdev.speed, type);
 #else
@@ -3070,7 +3082,7 @@
 
   /* Let the construction function calculate the size of config descriptor */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
   dev->cfgdescsize  = isncm ?
                       cdcncm_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0) :
                       cdcmbim_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
diff --git a/drivers/usbdev/composite.c b/drivers/usbdev/composite.c
index 8e3f990..e793a8f 100644
--- a/drivers/usbdev/composite.c
+++ b/drivers/usbdev/composite.c
@@ -277,7 +277,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t composite_mkcfgdesc(FAR struct usbdevclass_driver_s *driver,
                                    FAR uint8_t *buf,
                                    uint8_t speed, uint8_t type)
@@ -313,7 +313,7 @@
     {
       FAR struct composite_devobj_s *devobj = &priv->device[i];
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
       len = devobj->compdesc.mkconfdesc(buf,
                                         &devobj->compdesc.devinfo,
                                         speed, type);
@@ -677,7 +677,7 @@
 
               case USB_DESC_TYPE_CONFIG:
                 {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
                     ret = composite_mkcfgdesc(driver, ctrlreq->buf,
                                               dev->speed, ctrl->value[1]);
 #else
diff --git a/drivers/usbdev/dfu.c b/drivers/usbdev/dfu.c
index 9e4b0af..1cc4fc3 100644
--- a/drivers/usbdev/dfu.c
+++ b/drivers/usbdev/dfu.c
@@ -181,11 +181,22 @@
 {
 }
 
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
+                                  FAR struct usbdev_devinfo_s *devinfo,
+                                  uint8_t speed, uint8_t type)
+#else
 static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
                                   FAR struct usbdev_devinfo_s *devinfo)
+#endif
 {
   FAR struct dfu_cfgdesc_s *dest = (FAR struct dfu_cfgdesc_s *)buf;
 
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  UNUSED(speed);
+  UNUSED(type);
+#endif
+
   *dest = g_dfu_cfgdesc;
   dest->ifdesc.ifno += devinfo->ifnobase;
   dest->ifdesc.iif = devinfo->strbase;
@@ -308,7 +319,12 @@
         {
           if (ctrl->value[1] == USB_DESC_TYPE_CONFIG)
             {
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+              ret = usbclass_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
+                                       dev->speed, ctrl->value[1]);
+#else
               ret = usbclass_mkcfgdesc(ctrlreq->buf, &priv->devinfo);
+#endif
             }
           else if (ctrl->value[1] == USB_DESC_TYPE_STRING)
             {
diff --git a/drivers/usbdev/mtp.c b/drivers/usbdev/mtp.c
index 2c46719..22888d1 100644
--- a/drivers/usbdev/mtp.c
+++ b/drivers/usbdev/mtp.c
@@ -227,6 +227,9 @@
 #ifdef CONFIG_USBDEV_DUALSPEED
   .hssize = CONFIG_USBMTP_EPBULKIN_HSSIZE,
 #endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize = CONFIG_USBMTP_EPBULKIN_SSSIZE,
+#endif
   .reqnum = CONFIG_USBMTP_NWRREQS,
 };
 
@@ -246,6 +249,9 @@
 #ifdef CONFIG_USBDEV_DUALSPEED
   .hssize = CONFIG_USBMTP_EPBULKOUT_HSSIZE,
 #endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize = CONFIG_USBMTP_EPBULKOUT_SSSIZE,
+#endif
   .reqnum = CONFIG_USBMTP_NRDREQS,
 };
 
@@ -265,6 +271,9 @@
 #ifdef CONFIG_USBDEV_DUALSPEED
   .hssize = CONFIG_USBMTP_EPINTIN_SIZE,
 #endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize = CONFIG_USBMTP_EPINTIN_SIZE,
+#endif
   .reqnum = CONFIG_USBMTP_NWRREQS,
 };
 
@@ -287,7 +296,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
                                   FAR struct usbdev_devinfo_s *devinfo,
                                   uint8_t speed, uint8_t type)
@@ -296,19 +305,18 @@
                                   FAR struct usbdev_devinfo_s *devinfo)
 #endif
 {
-  bool hispeed = false;
   FAR struct usb_epdesc_s *epdesc;
   FAR struct usb_ifdesc_s *dest;
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (speed == USB_SPEED_HIGH);
-
   /* Check for switches between high and full speed */
 
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
     {
-      hispeed = !hispeed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
   dest = (FAR struct usb_ifdesc_s *)buf;
@@ -317,11 +325,11 @@
   memcpy(dest, &g_mtp_ifdesc, sizeof(g_mtp_ifdesc));
 
   usbdev_copy_epdesc(&epdesc[0], devinfo->epno[USBMTP_EP_BULKIN_IDX],
-                     hispeed, &g_mtp_epbulkin);
+                     speed, &g_mtp_epbulkin);
   usbdev_copy_epdesc(&epdesc[1], devinfo->epno[USBMTP_EP_BULKOUT_IDX],
-                     hispeed, &g_mtp_epbulkout);
+                     speed, &g_mtp_epbulkout);
   usbdev_copy_epdesc(&epdesc[2], devinfo->epno[USBMTP_EP_INTIN_IDX],
-                     hispeed, &g_mtp_epbulkintin);
+                     speed, &g_mtp_epbulkintin);
 
 #ifdef CONFIG_USBMTP_COMPOSITE
   /* For composite device, apply possible offset to the interface numbers */
diff --git a/drivers/usbdev/pl2303.c b/drivers/usbdev/pl2303.c
index 116ff84..8927f6c 100644
--- a/drivers/usbdev/pl2303.c
+++ b/drivers/usbdev/pl2303.c
@@ -293,9 +293,9 @@
 /* Configuration ************************************************************/
 
 static int     usbclass_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc);
-#ifdef CONFIG_USBDEV_DUALSPEED
 static void    usbclass_mkepbulkdesc(const struct usb_epdesc_s *indesc,
                  uint16_t mxpacket, struct usb_epdesc_s *outdesc);
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t usbclass_mkcfgdesc(uint8_t *buf, uint8_t speed, uint8_t type);
 #else
 static int16_t usbclass_mkcfgdesc(uint8_t *buf);
@@ -835,7 +835,6 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
 static inline void usbclass_mkepbulkdesc(
                              FAR const struct usb_epdesc_s *indesc,
                              uint16_t mxpacket,
@@ -850,7 +849,6 @@
   outdesc->mxpacketsize[0] = LSBYTE(mxpacket);
   outdesc->mxpacketsize[1] = MSBYTE(mxpacket);
 }
-#endif
 
 /****************************************************************************
  * Name: usbclass_mkcfgdesc
@@ -860,19 +858,25 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t usbclass_mkcfgdesc(uint8_t *buf, uint8_t speed, uint8_t type)
 #else
 static int16_t usbclass_mkcfgdesc(uint8_t *buf)
 #endif
 {
   FAR struct usb_cfgdesc_s *cfgdesc = (FAR struct usb_cfgdesc_s *)buf;
-#ifdef CONFIG_USBDEV_DUALSPEED
-  bool hispeed = (speed == USB_SPEED_HIGH);
-  uint16_t bulkmxpacket;
-#endif
+  uint16_t bulkmxpacket = CONFIG_PL2303_EPBULK_FSSIZE;
   uint16_t totallen;
 
+  /* Check for switches between high and full speed */
+
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
+    {
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
+    }
+#endif
+
   /* This is the total length of the configuration (not necessarily the
    * size that we will be sending now.
    */
@@ -892,40 +896,28 @@
   memcpy(buf, &g_ifdesc, USB_SIZEOF_IFDESC);
   buf += USB_SIZEOF_IFDESC;
 
-  /* Make the three endpoint configurations.  First, check for switches
-   * between high and full speed
-   */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
-    {
-      hispeed = !hispeed;
-    }
-#endif
-
   memcpy(buf, &g_epintindesc, USB_SIZEOF_EPDESC);
   buf += USB_SIZEOF_EPDESC;
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  if (hispeed)
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
     {
-      bulkmxpacket = 512;
+      bulkmxpacket = CONFIG_PL2303_EPBULK_SSSIZE;
     }
   else
+#endif
+#ifdef CONFIG_USBDEV_DUALSPEED
+  if (speed == USB_SPEED_HIGH)
     {
-      bulkmxpacket = 64;
+      bulkmxpacket = CONFIG_PL2303_EPBULK_HSSIZE;
     }
+#endif
 
   usbclass_mkepbulkdesc(&g_epbulkoutdesc, bulkmxpacket,
                         (FAR struct usb_epdesc_s *)buf);
   buf += USB_SIZEOF_EPDESC;
   usbclass_mkepbulkdesc(&g_epbulkindesc, bulkmxpacket,
                         (FAR struct usb_epdesc_s *)buf);
-#else
-  memcpy(buf, &g_epbulkoutdesc, USB_SIZEOF_EPDESC);
-  buf += USB_SIZEOF_EPDESC;
-  memcpy(buf, &g_epbulkindesc, USB_SIZEOF_EPDESC);
-#endif
 
   /* Finally, fill in the total size of the configuration descriptor */
 
@@ -982,10 +974,8 @@
 static int usbclass_setconfig(FAR struct pl2303_dev_s *priv, uint8_t config)
 {
   FAR struct usbdev_req_s *req;
-#ifdef CONFIG_USBDEV_DUALSPEED
   struct usb_epdesc_s epdesc;
-  uint16_t bulkmxpacket;
-#endif
+  uint16_t bulkmxpacket = CONFIG_PL2303_EPBULK_FSSIZE;
   int i;
   int ret = 0;
 
@@ -1038,21 +1028,23 @@
 
   /* Configure the IN bulk endpoint */
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  if (priv->usbdev->speed == USB_SPEED_SUPER ||
+      priv->usbdev->speed == USB_SPEED_SUPER_PLUS)
+    {
+      bulkmxpacket = CONFIG_PL2303_EPBULK_SSSIZE;
+    }
+  else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
   if (priv->usbdev->speed == USB_SPEED_HIGH)
     {
-      bulkmxpacket = 512;
+      bulkmxpacket = CONFIG_PL2303_EPBULK_HSSIZE;
     }
-  else
-    {
-      bulkmxpacket = 64;
-    }
+#endif
 
   usbclass_mkepbulkdesc(&g_epbulkindesc, bulkmxpacket, &epdesc);
   ret = EP_CONFIGURE(priv->epbulkin, &epdesc, false);
-#else
-  ret = EP_CONFIGURE(priv->epbulkin, &g_epbulkindesc, false);
-#endif
   if (ret < 0)
     {
       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKINCONFIGFAIL), 0);
@@ -1063,12 +1055,8 @@
 
   /* Configure the OUT bulk endpoint */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
   usbclass_mkepbulkdesc(&g_epbulkoutdesc, bulkmxpacket, &epdesc);
   ret = EP_CONFIGURE(priv->epbulkout, &epdesc, true);
-#else
-  ret = EP_CONFIGURE(priv->epbulkout, &g_epbulkoutdesc, true);
-#endif
   if (ret < 0)
     {
       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKOUTCONFIGFAIL), 0);
@@ -1273,7 +1261,7 @@
                          ((FAR struct pl2303_driver_s *)driver)->dev;
   FAR struct pl2303_req_s *reqcontainer;
   irqstate_t flags;
-  uint16_t reqlen;
+  uint16_t reqlen = CONFIG_PL2303_EPBULK_FSSIZE;
   int ret;
   int i;
 
@@ -1351,10 +1339,19 @@
 
   /* Pre-allocate read requests.  The buffer size is one full packet. */
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  if (dev->speed == USB_SPEED_SUPER ||
+      dev->speed == USB_SPEED_SUPER_PLUS)
+    {
+      reqlen = CONFIG_PL2303_EPBULK_SSSIZE;
+    }
+  else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-  reqlen = 512;
-#else
-  reqlen = 64;
+  if (dev->speed == USB_SPEED_HIGH)
+    {
+      reqlen = CONFIG_PL2303_EPBULK_HSSIZE;
+    }
 #endif
 
   for (i = 0; i < CONFIG_PL2303_NRDREQS; i++)
@@ -1380,12 +1377,6 @@
    * size.
    */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  reqlen = 512;
-#else
-  reqlen = 64;
-#endif
-
   if (CONFIG_PL2303_BULKIN_REQLEN > reqlen)
     {
       reqlen = CONFIG_CDCACM_BULKIN_REQLEN;
@@ -1643,7 +1634,7 @@
 
                 case USB_DESC_TYPE_CONFIG:
                   {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
                     ret = usbclass_mkcfgdesc(ctrlreq->buf,
                                              dev->speed, ctrl->req);
 #else
diff --git a/drivers/usbdev/rndis.c b/drivers/usbdev/rndis.c
index 50ec804..e7eaf48 100644
--- a/drivers/usbdev/rndis.c
+++ b/drivers/usbdev/rndis.c
@@ -248,12 +248,6 @@
 static int  usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config);
 static void usbclass_resetconfig(FAR struct rndis_dev_s *priv);
 
-/* usbclass helpers  */
-
-static int usbclass_copy_epdesc(int epid, FAR struct usb_epdesc_s *epdesc,
-                                FAR struct usbdev_devinfo_s *devinfo,
-                                bool hispeed);
-
 /****************************************************************************
  * Private Data
  ****************************************************************************/
@@ -293,111 +287,149 @@
 };
 #endif
 
-const static struct rndis_cfgdesc_s g_rndis_cfgdesc =
+#ifndef CONFIG_RNDIS_COMPOSITE
+
+  /* Configuration descriptor */
+
+static const struct usb_cfgdesc_s g_rndis_cfgdesc =
 {
-#ifndef CONFIG_RNDIS_COMPOSITE
+  .len          = USB_SIZEOF_CFGDESC,
+  .type         = USB_DESC_TYPE_CONFIG,
+  .totallen     =
   {
-    .len          = USB_SIZEOF_CFGDESC,
-    .type         = USB_DESC_TYPE_CONFIG,
-    .totallen     =
-    {
-      0, 0
-    },
-    .ninterfaces  = RNDIS_NINTERFACES,
-    .cfgvalue     = RNDIS_CONFIGID,
-    .icfg         = 0,
-    .attr         = USB_CONFIG_ATTR_ONE | USB_CONFIG_ATTR_SELFPOWER,
-    .mxpower      = (CONFIG_USBDEV_MAXPOWER + 1) / 2
+    0, 0
   },
+  .ninterfaces  = RNDIS_NINTERFACES,
+  .cfgvalue     = RNDIS_CONFIGID,
+  .icfg         = 0,
+  .attr         = USB_CONFIG_ATTR_ONE | USB_CONFIG_ATTR_SELFPOWER,
+  .mxpower      = (CONFIG_USBDEV_MAXPOWER + 1) / 2
+};
 #elif defined(CONFIG_COMPOSITE_IAD)
-  {
-    .len          = USB_SIZEOF_IADDESC,
-    .type         = USB_DESC_TYPE_INTERFACEASSOCIATION,
-    .firstif      = 0,
-    .nifs         = RNDIS_NINTERFACES,
-    .classid      = 0xef,
-    .subclass     = 0x04,
-    .protocol     = 0x01,
-    .ifunction    = 0
-  },
+
+  /* Interface association descriptor */
+
+static const struct usb_iaddesc_s g_rndis_assoc_desc =
+{
+  .len          = USB_SIZEOF_IADDESC,
+  .type         = USB_DESC_TYPE_INTERFACEASSOCIATION,
+  .firstif      = 0,
+  .nifs         = RNDIS_NINTERFACES,
+  .classid      = 0xef,
+  .subclass     = 0x04,
+  .protocol     = 0x01,
+  .ifunction    = 0
+};
 #endif
-  {
-    .len          = USB_SIZEOF_IFDESC,
-    .type         = USB_DESC_TYPE_INTERFACE,
-    .ifno         = 0,
-    .alt          = 0,
-    .neps         = 1,
-    .classid      = USB_CLASS_CDC,
-    .subclass     = CDC_SUBCLASS_ACM,
-    .protocol     = CDC_PROTO_VENDOR,
-    .iif          = 0
-  },
-  {
-    .len          = USB_SIZEOF_EPDESC,
-    .type         = USB_DESC_TYPE_ENDPOINT,
-#ifndef CONFIG_RNDIS_COMPOSITE
-    .addr         = RNDIS_EPINTIN_ADDR,
-#endif
-    .attr         = USB_EP_ATTR_XFER_INT,
-    .mxpacketsize =
+
+  /* Communication interface descriptor */
+
+static const struct usb_ifdesc_s g_rndis_comm_ifdesc =
+{
+  .len          = USB_SIZEOF_IFDESC,
+  .type         = USB_DESC_TYPE_INTERFACE,
+  .ifno         = 0,
+  .alt          = 0,
+  .neps         = 1,
+  .classid      = USB_CLASS_CDC,
+  .subclass     = CDC_SUBCLASS_ACM,
+  .protocol     = CDC_PROTO_VENDOR,
+  .iif          = 0
+};
+
+  /* Interrupt endpoint descriptor */
+
+static const struct usbdev_epinfo_s g_rndis_epintindesc =
+{
+  .desc =
     {
-      LSBYTE(16), MSBYTE(16)
-    },
-    .interval = 1
-  },
-  {
-    .len          = USB_SIZEOF_IFDESC,
-    .type         = USB_DESC_TYPE_INTERFACE,
-    .ifno         = 1,
-    .alt          = 0,
-    .neps         = 2,
-    .classid      = USB_CLASS_CDC_DATA,
-    .subclass     = 0,
-    .protocol     = 0,
-    .iif          = 0
-  },
-  {
-    .len          = USB_SIZEOF_EPDESC,
-    .type         = USB_DESC_TYPE_ENDPOINT,
+      .len      = USB_SIZEOF_EPDESC,
+      .type     = USB_DESC_TYPE_ENDPOINT,
 #ifndef CONFIG_RNDIS_COMPOSITE
-    .addr         = RNDIS_EPBULKIN_ADDR,
+      .addr     = RNDIS_EPINTIN_ADDR,
 #endif
-    .attr         = USB_EP_ATTR_XFER_BULK,
+      .attr     = USB_EP_ATTR_XFER_INT,
+      .interval = 1
+    },
+  .fssize       = CONFIG_RNDIS_EPINTIN_FSSIZE,
 #ifdef CONFIG_USBDEV_DUALSPEED
-    .mxpacketsize =
-    {
-      LSBYTE(512), MSBYTE(512)
-    },
-    .interval     = 0
-#else
-    .mxpacketsize =
-    {
-      LSBYTE(64), MSBYTE(64)
-    },
-    .interval     = 1
+  .hssize       = CONFIG_RNDIS_EPINTIN_HSSIZE,
 #endif
-  },
-  {
-    .len          = USB_SIZEOF_EPDESC,
-    .type         = USB_DESC_TYPE_ENDPOINT,
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize       = CONFIG_RNDIS_EPINTIN_HSSIZE,
+#endif
+  .reqnum       = 1,
+};
+
+  /* Data interface descriptor */
+
+static const struct usb_ifdesc_s g_rndis_data_ifdesc =
+{
+  .len          = USB_SIZEOF_IFDESC,
+  .type         = USB_DESC_TYPE_INTERFACE,
+  .ifno         = 1,
+  .alt          = 0,
+  .neps         = 2,
+  .classid      = USB_CLASS_CDC_DATA,
+  .subclass     = 0,
+  .protocol     = 0,
+  .iif          = 0
+};
+
+  /* Bulk in interface descriptor */
+
+static const struct usbdev_epinfo_s g_rndis_epbulkindesc =
+{
+  .desc =
+    {
+      .len      = USB_SIZEOF_EPDESC,
+      .type     = USB_DESC_TYPE_ENDPOINT,
 #ifndef CONFIG_RNDIS_COMPOSITE
-    .addr         = RNDIS_EPBULKOUT_ADDR,
+      .addr     = RNDIS_EPBULKIN_ADDR,
 #endif
-    .attr         = USB_EP_ATTR_XFER_BULK,
+      .attr     = USB_EP_ATTR_XFER_BULK,
 #ifdef CONFIG_USBDEV_DUALSPEED
-    .mxpacketsize =
-    {
-      LSBYTE(512), MSBYTE(512)
-    },
-    .interval     = 0
+      .interval = 0
 #else
-    .mxpacketsize =
-    {
-      LSBYTE(64), MSBYTE(64)
-    },
-    .interval     = 1
+      .interval = 1
 #endif
-  }
+    },
+  .fssize       = CONFIG_RNDIS_EPBULKIN_FSSIZE,
+#ifdef CONFIG_USBDEV_DUALSPEED
+  .hssize       = CONFIG_RNDIS_EPBULKIN_HSSIZE,
+#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize       = CONFIG_RNDIS_EPBULKIN_SSSIZE,
+#endif
+  .reqnum       = 1,
+};
+
+  /* Bulk out interface descriptor */
+
+static const struct usbdev_epinfo_s g_rndis_epbulkoutdesc =
+{
+  .desc =
+    {
+      .len      = USB_SIZEOF_EPDESC,
+      .type     = USB_DESC_TYPE_ENDPOINT,
+#ifndef CONFIG_RNDIS_COMPOSITE
+      .addr     = RNDIS_EPBULKOUT_ADDR,
+#endif
+      .attr     = USB_EP_ATTR_XFER_BULK,
+#ifdef CONFIG_USBDEV_DUALSPEED
+      .interval = 0
+#else
+      .interval = 1
+#endif
+    },
+  .fssize       = CONFIG_RNDIS_EPBULKOUT_FSSIZE,
+#ifdef CONFIG_USBDEV_DUALSPEED
+  .hssize       = CONFIG_RNDIS_EPBULKOUT_HSSIZE,
+#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  .sssize       = CONFIG_RNDIS_EPBULKOUT_SSSIZE,
+#endif
+  .reqnum       = 1,
 };
 
 /* Default MAC address given to the host side of the interface. */
@@ -452,7 +484,7 @@
     g_rndis_supported_oids
   },
   {RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,    4, CONFIG_NET_ETH_PKTSIZE,  NULL},
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
   {RNDIS_OID_GEN_LINK_SPEED,            4, 100000,              NULL},
 #else
   {RNDIS_OID_GEN_LINK_SPEED,            4, 2000000,             NULL},
@@ -1871,116 +1903,6 @@
 }
 
 /****************************************************************************
- * Name: usbclass_copy_epdesc
- *
- * Description:
- *   Copies the requested Endpoint Description into the buffer given.
- *   Returns the number of Bytes filled in ( sizeof(struct usb_epdesc_s) ).
- *
- ****************************************************************************/
-
-static int usbclass_copy_epdesc(int epid, FAR struct usb_epdesc_s *epdesc,
-                                FAR struct usbdev_devinfo_s *devinfo,
-                                bool hispeed)
-{
-#ifndef CONFIG_USBDEV_DUALSPEED
-    UNUSED(hispeed);
-#endif
-
-    switch (epid)
-    {
-    case RNDIS_EP_INTIN_IDX:  /* Interrupt IN endpoint */
-        {
-          epdesc->len  = USB_SIZEOF_EPDESC;         /* Descriptor length */
-          epdesc->type = USB_DESC_TYPE_ENDPOINT;    /* Descriptor type */
-          epdesc->addr = RNDIS_MKEPINTIN(devinfo);  /* Endpoint address */
-          epdesc->attr = RNDIS_EPINTIN_ATTR;        /* Endpoint attributes */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-          if (hispeed)
-            {
-              /* Maximum packet size (high speed) */
-
-              epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPINTIN_HSSIZE);
-              epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPINTIN_HSSIZE);
-            }
-          else
-#endif
-            {
-              /* Maximum packet size (full speed) */
-
-              epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPINTIN_FSSIZE);
-              epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPINTIN_FSSIZE);
-            }
-
-          epdesc->interval = 10;                       /* Interval */
-      }
-      break;
-
-    case RNDIS_EP_BULKOUT_IDX:  /* Bulk OUT endpoint */
-      {
-        epdesc->len  = USB_SIZEOF_EPDESC;           /* Descriptor length */
-        epdesc->type = USB_DESC_TYPE_ENDPOINT;      /* Descriptor type */
-        epdesc->addr = RNDIS_MKEPBULKOUT(devinfo);  /* Endpoint address */
-        epdesc->attr = RNDIS_EPOUTBULK_ATTR;        /* Endpoint attributes */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-        if (hispeed)
-          {
-            /* Maximum packet size (high speed) */
-
-            epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKOUT_HSSIZE);
-            epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKOUT_HSSIZE);
-          }
-        else
-#endif
-          {
-            /* Maximum packet size (full speed) */
-
-            epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKOUT_FSSIZE);
-            epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKOUT_FSSIZE);
-          }
-
-        epdesc->interval = 0;                       /* Interval */
-      }
-      break;
-
-    case RNDIS_EP_BULKIN_IDX:  /* Bulk IN endpoint */
-      {
-        epdesc->len  = USB_SIZEOF_EPDESC;           /* Descriptor length */
-        epdesc->type = USB_DESC_TYPE_ENDPOINT;      /* Descriptor type */
-        epdesc->addr = RNDIS_MKEPBULKIN(devinfo);   /* Endpoint address */
-        epdesc->attr = RNDIS_EPINBULK_ATTR;         /* Endpoint attributes */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-        if (hispeed)
-          {
-            /* Maximum packet size (high speed) */
-
-            epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKIN_HSSIZE);
-            epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKIN_HSSIZE);
-          }
-        else
-#endif
-          {
-            /* Maximum packet size (full speed) */
-
-            epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKIN_FSSIZE);
-            epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKIN_FSSIZE);
-          }
-
-        epdesc->interval = 0;                       /* Interval */
-      }
-      break;
-
-    default:
-        return 0;
-    }
-
-  return sizeof(struct usb_epdesc_s);
-}
-
-/****************************************************************************
  * Name: usbclass_mkcfgdesc
  *
  * Description:
@@ -1988,7 +1910,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
                                   FAR struct usbdev_devinfo_s *devinfo,
                                   uint8_t speed, uint8_t type)
@@ -1997,56 +1919,131 @@
                                   FAR struct usbdev_devinfo_s *devinfo)
 #endif
 {
-  FAR struct rndis_cfgdesc_s *dest = (FAR struct rndis_cfgdesc_s *)buf;
-  bool hispeed = false;
-  uint16_t totallen;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (speed == USB_SPEED_HIGH);
+  uint16_t totallen = 0;
 
   /* Check for switches between high and full speed */
 
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
     {
-      hispeed = !hispeed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
   /* This is the total length of the configuration (not necessarily the
    * size that we will be sending now).
    */
-
-  totallen = sizeof(g_rndis_cfgdesc);
-
-  if (dest != NULL)
-    {
-      memcpy(dest, &g_rndis_cfgdesc, totallen);
-
-      usbclass_copy_epdesc(RNDIS_EP_INTIN_IDX, &dest->epintindesc,
-                           devinfo, hispeed);
-      usbclass_copy_epdesc(RNDIS_EP_BULKIN_IDX, &dest->epbulkindesc,
-                           devinfo, hispeed);
-      usbclass_copy_epdesc(RNDIS_EP_BULKOUT_IDX, &dest->epbulkoutdesc,
-                           devinfo, hispeed);
-
 #ifndef CONFIG_RNDIS_COMPOSITE
-      /* For a stand-alone device, just fill in the total length */
-
-      dest->cfgdesc.totallen[0] = LSBYTE(totallen);
-      dest->cfgdesc.totallen[1] = MSBYTE(totallen);
-#else
-      /* For composite device, apply possible offset to the interface
-       * numbers
+  if (buf != NULL)
+    {
+      /* Configuration descriptor.
+       * If the USB serial device is configured as part of  composite device,
+       * then the configuration descriptor will be provided by the
+       * composite device logic.
        */
 
-#  ifdef CONFIG_COMPOSITE_IAD
-      dest->assoc_desc.firstif += devinfo->ifnobase;
-#  endif
-      dest->comm_ifdesc.ifno   += devinfo->ifnobase;
-      dest->data_ifdesc.ifno   += devinfo->ifnobase;
+      FAR struct usb_cfgdesc_s *dest = (FAR struct usb_cfgdesc_s *)buf;
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+      int16_t size = usbclass_mkcfgdesc(NULL, NULL, speed, type);
+#else
+      int16_t size = usbclass_mkcfgdesc(NULL, NULL);
 #endif
+
+      memcpy(buf, &g_rndis_cfgdesc, sizeof(struct usb_cfgdesc_s));
+#ifdef CONFIG_USBDEV_DUALSPEED
+      dest->type = type;                                     /* Descriptor type */
+#endif
+      dest->totallen[0] = LSBYTE(size);                      /* LS Total length */
+      dest->totallen[1] = MSBYTE(size);                      /* MS Total length */
+
+      buf += sizeof(struct usb_cfgdesc_s);
     }
 
+  totallen += sizeof(struct usb_cfgdesc_s);
+
+#elif defined(CONFIG_COMPOSITE_IAD)
+  /* Interface association descriptor */
+
+  if (buf != NULL)
+    {
+      FAR struct usb_iaddesc_s *dest = (FAR struct usb_iaddesc_s *)buf;
+
+      memcpy(dest, &g_rndis_assoc_desc, sizeof(struct usb_iaddesc_s));
+      dest->firstif += devinfo->ifnobase;
+
+      buf += sizeof(struct usb_iaddesc_s);
+    }
+
+  totallen += sizeof(struct usb_iaddesc_s);
+#endif
+
+  if (buf != NULL)
+    {
+      FAR struct usb_ifdesc_s *dest = (FAR struct usb_ifdesc_s *)buf;
+
+      memcpy(dest, &g_rndis_comm_ifdesc, sizeof(struct usb_ifdesc_s));
+#ifdef CONFIG_RNDIS_COMPOSITE
+      dest->ifno += devinfo->ifnobase;
+#endif
+      buf += sizeof(struct usb_ifdesc_s);
+    }
+
+  totallen += sizeof(struct usb_ifdesc_s);
+
+  if (buf != NULL)
+    {
+      usbdev_copy_epdesc((struct usb_epdesc_s *)buf,
+                         devinfo->epno[RNDIS_EP_INTIN_IDX],
+                         speed,
+                         &g_rndis_epintindesc
+      );
+
+      buf += USB_SIZEOF_EPDESC;
+    }
+
+  totallen += USB_SIZEOF_EPDESC;
+
+  if (buf != NULL)
+    {
+      FAR struct usb_ifdesc_s *dest = (FAR struct usb_ifdesc_s *)buf;
+
+      memcpy(dest, &g_rndis_data_ifdesc, sizeof(struct usb_ifdesc_s));
+#ifdef CONFIG_RNDIS_COMPOSITE
+      dest->ifno += devinfo->ifnobase;
+#endif
+      buf += sizeof(struct usb_ifdesc_s);
+    }
+
+  totallen += sizeof(struct usb_ifdesc_s);
+
+  if (buf != NULL)
+    {
+      usbdev_copy_epdesc((struct usb_epdesc_s *)buf,
+                         devinfo->epno[RNDIS_EP_BULKIN_IDX],
+                         speed,
+                         &g_rndis_epbulkindesc
+      );
+
+      buf += USB_SIZEOF_EPDESC;
+    }
+
+  totallen += USB_SIZEOF_EPDESC;
+
+  if (buf != NULL)
+    {
+      usbdev_copy_epdesc((struct usb_epdesc_s *)buf,
+                         devinfo->epno[RNDIS_EP_BULKOUT_IDX],
+                         speed,
+                         &g_rndis_epbulkoutdesc
+      );
+
+      buf += USB_SIZEOF_EPDESC;
+    }
+
+  totallen += USB_SIZEOF_EPDESC;
+
   return totallen;
 }
 
@@ -2444,7 +2441,7 @@
 #  endif /* CONFIG_USBDEV_DUALSPEED */
                 case USB_DESC_TYPE_CONFIG:
                   {
-#  ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
                     ret = usbclass_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
                                              dev->speed, ctrl->req);
 #  else
@@ -2688,7 +2685,6 @@
 static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config)
 {
   struct usb_epdesc_s epdesc;
-  bool hispeed = false;
   int ret = 0;
 
 #ifdef CONFIG_DEBUG_FEATURES
@@ -2699,10 +2695,6 @@
     }
 #endif
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (priv->usbdev->speed == USB_SPEED_HIGH);
-#endif
-
   if (config == priv->config)
     {
       /* Already configured -- Do nothing */
@@ -2733,7 +2725,10 @@
 
   /* Configure the IN interrupt endpoint */
 
-  usbclass_copy_epdesc(RNDIS_EP_INTIN_IDX, &epdesc, &priv->devinfo, hispeed);
+  usbdev_copy_epdesc(&epdesc,
+                     priv->devinfo.epno[RNDIS_EP_INTIN_IDX],
+                     priv->usbdev->speed,
+                     &g_rndis_epintindesc);
   ret = EP_CONFIGURE(priv->epintin, &epdesc, false);
   if (ret < 0)
     {
@@ -2745,8 +2740,10 @@
 
   /* Configure the IN bulk endpoint */
 
-  usbclass_copy_epdesc(RNDIS_EP_BULKIN_IDX,
-                       &epdesc, &priv->devinfo, hispeed);
+  usbdev_copy_epdesc(&epdesc,
+                     priv->devinfo.epno[RNDIS_EP_BULKIN_IDX],
+                     priv->usbdev->speed,
+                     &g_rndis_epbulkindesc);
   ret = EP_CONFIGURE(priv->epbulkin, &epdesc, false);
 
   if (ret < 0)
@@ -2759,8 +2756,10 @@
 
   /* Configure the OUT bulk endpoint */
 
-  usbclass_copy_epdesc(RNDIS_EP_BULKOUT_IDX,
-                       &epdesc, &priv->devinfo, hispeed);
+  usbdev_copy_epdesc(&epdesc,
+                     priv->devinfo.epno[RNDIS_EP_BULKOUT_IDX],
+                     priv->usbdev->speed,
+                     &g_rndis_epbulkoutdesc);
   ret = EP_CONFIGURE(priv->epbulkout, &epdesc, true);
 
   if (ret < 0)
@@ -3017,7 +3016,7 @@
 
   /* Let the construction function calculate the size of config descriptor */
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
   dev->cfgdescsize  = usbclass_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
 #else
   dev->cfgdescsize  = usbclass_mkcfgdesc(NULL, NULL);
diff --git a/drivers/usbdev/usbdev_desc.c b/drivers/usbdev/usbdev_desc.c
index f9c12e8..7d2594e 100644
--- a/drivers/usbdev/usbdev_desc.c
+++ b/drivers/usbdev/usbdev_desc.c
@@ -76,18 +76,28 @@
  ****************************************************************************/
 
 void usbdev_copy_epdesc(FAR struct usb_epdesc_s *epdesc,
-                        uint8_t epno, bool hispeed,
+                        uint8_t epno, uint8_t speed,
                         FAR const struct usbdev_epinfo_s *epinfo)
 {
-#ifndef CONFIG_USBDEV_DUALSPEED
-  UNUSED(hispeed);
+#if !defined(CONFIG_USBDEV_DUALSPEED) && !defined(CONFIG_USBDEV_SUPERSPEED)
+  UNUSED(speed);
 #endif
 
   memcpy(epdesc, &epinfo->desc, sizeof(struct usb_epdesc_s));
   epdesc->addr |= epno;
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+    {
+      /* Maximum packet size (super speed) */
+
+      epdesc->mxpacketsize[0] = LSBYTE(epinfo->sssize);
+      epdesc->mxpacketsize[1] = MSBYTE(epinfo->sssize);
+    }
+  else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-  if (hispeed)
+  if (speed == USB_SPEED_HIGH)
     {
       /* Maximum packet size (high speed) */
 
diff --git a/drivers/usbdev/usbdev_fs.c b/drivers/usbdev/usbdev_fs.c
index cacc62d..02b5388 100644
--- a/drivers/usbdev/usbdev_fs.c
+++ b/drivers/usbdev/usbdev_fs.c
@@ -933,7 +933,9 @@
                              FAR const struct usbdev_epinfo_s *epinfo,
                              FAR struct usbdev_fs_ep_s *fs_ep)
 {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+  uint16_t reqsize = epinfo->sssize;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
   uint16_t reqsize = epinfo->hssize;
 #else
   uint16_t reqsize = epinfo->fssize;
@@ -1143,7 +1145,6 @@
 {
   FAR struct usbdev_devinfo_s *devinfo = &fs->devinfo;
   struct usb_epdesc_s epdesc;
-  bool hispeed = false;
   uint16_t i;
   uint16_t j;
   int ret;
@@ -1160,16 +1161,12 @@
       return 0;
     }
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (fs->cdev->usbdev->speed == USB_SPEED_HIGH);
-#endif
-
   for (i = 0; i < devinfo->nendpoints; i++)
     {
       FAR struct usbdev_fs_ep_s *fs_ep = &fs->eps[i];
 
       usbdev_copy_epdesc(&epdesc, devinfo->epno[i],
-                         hispeed, devinfo->epinfos[i]);
+                         fs->cdev->usbdev->speed, devinfo->epinfos[i]);
       ret = EP_CONFIGURE(fs_ep->ep, &epdesc,
                          (i == (devinfo->nendpoints - 1)));
       if (ret < 0)
diff --git a/drivers/usbdev/usbmsc.c b/drivers/usbdev/usbmsc.c
index 8298a0a..b679335 100644
--- a/drivers/usbdev/usbmsc.c
+++ b/drivers/usbdev/usbmsc.c
@@ -207,7 +207,9 @@
    * const, canned descriptors.
    */
 
+#if !defined(CONFIG_USBDEV_SUPERSPEED) && !defined(CONFIG_USBMSC_COMPOSITE)
   DEBUGASSERT(CONFIG_USBMSC_EP0MAXPACKET == dev->ep0->maxpacket);
+#endif
 
   /* Preallocate control request */
 
@@ -544,7 +546,7 @@
 #ifndef CONFIG_USBMSC_COMPOSITE
               case USB_DESC_TYPE_CONFIG:
                 {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
                   ret = usbmsc_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
                                          dev->speed, ctrl->value[1]);
 #else
@@ -872,7 +874,6 @@
   FAR struct usbmsc_req_s *privreq;
   FAR struct usbdev_req_s *req;
   struct usb_epdesc_s epdesc;
-  bool hispeed = false;
   int i;
   int ret = 0;
 
@@ -892,10 +893,6 @@
       return OK;
     }
 
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (priv->usbdev->speed == USB_SPEED_HIGH);
-#endif
-
   /* Discard the previous configuration data */
 
   usbmsc_resetconfig(priv);
@@ -919,7 +916,7 @@
   /* Configure the IN bulk endpoint */
 
   usbmsc_copy_epdesc(USBMSC_EPBULKIN, &epdesc, &priv->devinfo,
-                     hispeed);
+                     priv->usbdev->speed);
   ret = EP_CONFIGURE(priv->epbulkin, &epdesc, false);
   if (ret < 0)
     {
@@ -932,7 +929,7 @@
   /* Configure the OUT bulk endpoint */
 
   usbmsc_copy_epdesc(USBMSC_EPBULKOUT, &epdesc, &priv->devinfo,
-                     hispeed);
+                     priv->usbdev->speed);
   ret = EP_CONFIGURE(priv->epbulkout, &epdesc, true);
   if (ret < 0)
     {
diff --git a/drivers/usbdev/usbmsc.h b/drivers/usbdev/usbmsc.h
index ee96007..7fa463d 100644
--- a/drivers/usbdev/usbmsc.h
+++ b/drivers/usbdev/usbmsc.h
@@ -301,6 +301,9 @@
 #define USBMSC_MKEPBULKIN(devDesc)    (USB_DIR_IN | (devDesc)->epno[USBMSC_EP_BULKIN_IDX])
 #define USBMSC_EPINBULK_ATTR          (USB_EP_ATTR_XFER_BULK)
 
+#define USBMSC_SSBULKMAXPACKET        (1024)
+#define USBMSC_SSBULKMXPKTSHIFT       (10)
+#define USBMSC_SSBULKMXPKTMASK        (0x000003ff)
 #define USBMSC_HSBULKMAXPACKET        (512)
 #define USBMSC_HSBULKMXPKTSHIFT       (9)
 #define USBMSC_HSBULKMXPKTMASK        (0x000001ff)
@@ -545,7 +548,7 @@
 int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid,
                        FAR struct usb_epdesc_s *epdesc,
                        FAR struct usbdev_devinfo_s *devinfo,
-                       bool hispeed);
+                       uint8_t speed);
 
 /****************************************************************************
  * Name: usbmsc_mkcfgdesc
@@ -555,7 +558,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 int16_t usbmsc_mkcfgdesc(FAR uint8_t *buf,
                          FAR struct usbdev_devinfo_s *devinfo,
                          uint8_t speed, uint8_t type);
diff --git a/drivers/usbdev/usbmsc_desc.c b/drivers/usbdev/usbmsc_desc.c
index f10f37d..8d0efb9 100644
--- a/drivers/usbdev/usbmsc_desc.c
+++ b/drivers/usbdev/usbmsc_desc.c
@@ -225,10 +225,10 @@
 int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid,
                        FAR struct usb_epdesc_s *epdesc,
                        FAR struct usbdev_devinfo_s *devinfo,
-                       bool hispeed)
+                       uint8_t speed)
 {
-#ifndef CONFIG_USBDEV_DUALSPEED
-    UNUSED(hispeed);
+#if !defined(CONFIG_USBDEV_DUALSPEED) && !defined(CONFIG_USBDEV_SUPERSPEED)
+    UNUSED(speed);
 #endif
 
     switch (epid)
@@ -240,8 +240,18 @@
         epdesc->addr = USBMSC_MKEPBULKOUT(devinfo); /* Endpoint address */
         epdesc->attr = USBMSC_EPOUTBULK_ATTR;       /* Endpoint attributes */
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+        if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+          {
+            /* Maximum packet size (super speed) */
+
+            epdesc->mxpacketsize[0] = LSBYTE(USBMSC_SSBULKMAXPACKET);
+            epdesc->mxpacketsize[1] = MSBYTE(USBMSC_SSBULKMAXPACKET);
+          }
+        else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-        if (hispeed)
+        if (speed == USB_SPEED_HIGH)
           {
             /* Maximum packet size (high speed) */
 
@@ -268,8 +278,18 @@
         epdesc->addr = USBMSC_MKEPBULKIN(devinfo);  /* Endpoint address */
         epdesc->attr = USBMSC_EPINBULK_ATTR;        /* Endpoint attributes */
 
+#ifdef CONFIG_USBDEV_SUPERSPEED
+        if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+          {
+            /* Maximum packet size (super speed) */
+
+            epdesc->mxpacketsize[0] = LSBYTE(USBMSC_SSBULKMAXPACKET);
+            epdesc->mxpacketsize[1] = MSBYTE(USBMSC_SSBULKMAXPACKET);
+          }
+        else
+#endif
 #ifdef CONFIG_USBDEV_DUALSPEED
-        if (hispeed)
+        if (speed == USB_SPEED_HIGH)
           {
             /* Maximum packet size (high speed) */
 
@@ -304,7 +324,7 @@
  *
  ****************************************************************************/
 
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
 int16_t usbmsc_mkcfgdesc(uint8_t *buf,
                          FAR struct usbdev_devinfo_s *devinfo,
                          uint8_t speed, uint8_t type)
@@ -313,17 +333,15 @@
                         FAR struct usbdev_devinfo_s *devinfo)
 #endif
 {
-  bool hispeed = false;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
-  hispeed = (speed == USB_SPEED_HIGH);
-
   /* Check for switches between high and full speed */
 
-  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+  if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed != USB_SPEED_HIGH)
     {
-      hispeed = !hispeed;
+      speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
     }
+#else
+  uint8_t speed = USB_SPEED_FULL;
 #endif
 
   /* Fill in all descriptors directly to the buf */
@@ -389,7 +407,7 @@
     {
       int len = usbmsc_copy_epdesc(USBMSC_EPBULKIN,
                                   (FAR struct usb_epdesc_s *)buf,
-                                   devinfo, hispeed);
+                                   devinfo, speed);
 
       buf += len;
     }
@@ -399,7 +417,7 @@
     {
       int len = usbmsc_copy_epdesc(USBMSC_EPBULKOUT,
                                   (FAR struct usb_epdesc_s *)buf, devinfo,
-                                   hispeed);
+                                   speed);
 
       buf += len;
     }
diff --git a/include/nuttx/usb/cdcacm.h b/include/nuttx/usb/cdcacm.h
index 98d7d3f..0b2a010 100644
--- a/include/nuttx/usb/cdcacm.h
+++ b/include/nuttx/usb/cdcacm.h
@@ -57,6 +57,9 @@
  * CONFIG_CDCACM_EPBULKOUT_HSSIZE
  *   Max package size for the bulk OUT endpoint if high speed mode.
  *   Default 512.
+  * CONFIG_CDCACM_EPBULKOUT_SSSIZE
+ *   Max package size for the bulk OUT endpoint if super speed mode.
+ *   Default 1024.
  * CONFIG_CDCACM_EPBULKIN
  *   The logical 7-bit address of a hardware endpoint that supports
  *   bulk IN operation.  Default: 2
@@ -66,6 +69,9 @@
  * CONFIG_CDCACM_EPBULKIN_HSSIZE
  *   Max package size for the bulk IN endpoint if high speed mode.
  *   Default 512.
+ * CONFIG_CDCACM_EPBULKIN_SSSIZE
+ *   Max package size for the bulk IN endpoint if super speed mode.
+ *   Default 1024.
  * CONFIG_CDCACM_NWRREQS and CONFIG_CDCACM_NRDREQS
  *   The number of write/read requests that can be in flight.
  *   CONFIG_CDCACM_NWRREQS includes write requests used for both the
@@ -146,6 +152,10 @@
 #  define CONFIG_CDCACM_EPBULKIN_HSSIZE 512
 #endif
 
+#ifndef CONFIG_CDCACM_EPBULKIN_SSSIZE
+#  define CONFIG_CDCACM_EPBULKIN_SSSIZE 1024
+#endif
+
 #ifndef CONFIG_CDCACM_BULKIN_REQLEN
 #  ifdef CONFIG_USBDEV_DUALSPEED
 #    define CONFIG_CDCACM_BULKIN_REQLEN (3 * CONFIG_CDCACM_EPBULKIN_FSSIZE / 2)
@@ -176,6 +186,10 @@
 #  define CONFIG_CDCACM_EPBULKOUT_HSSIZE 512
 #endif
 
+#ifndef CONFIG_CDCACM_EPBULKOUT_SSSIZE
+#  define CONFIG_CDCACM_EPBULKOUT_SSSIZE 1024
+#endif
+
 /* Number of requests in the write queue.  This includes write requests used
  * for both the interrupt and bulk IN endpoints.
  */
diff --git a/include/nuttx/usb/rndis.h b/include/nuttx/usb/rndis.h
index c8cc469..aaa1746 100644
--- a/include/nuttx/usb/rndis.h
+++ b/include/nuttx/usb/rndis.h
@@ -50,6 +50,10 @@
 #  define CONFIG_RNDIS_EPINTIN_HSSIZE 16
 #endif
 
+#ifndef CONFIG_RNDIS_EPINTIN_SSSIZE
+#  define CONFIG_RNDIS_EPINTIN_SSSIZE 16
+#endif
+
 #ifndef CONFIG_RNDIS_EPBULKIN_FSSIZE
 #  define CONFIG_RNDIS_EPBULKIN_FSSIZE 64
 #endif
@@ -58,6 +62,10 @@
 #  define CONFIG_RNDIS_EPBULKIN_HSSIZE 512
 #endif
 
+#ifndef CONFIG_RNDIS_EPBULKIN_SSSIZE
+#  define CONFIG_RNDIS_EPBULKIN_SSSIZE 1024
+#endif
+
 #ifndef CONFIG_RNDIS_EPBULKOUT_FSSIZE
 #  define CONFIG_RNDIS_EPBULKOUT_FSSIZE 64
 #endif
@@ -66,6 +74,10 @@
 #  define CONFIG_RNDIS_EPBULKOUT_HSSIZE 512
 #endif
 
+#ifndef CONFIG_RNDIS_EPBULKOUT_SSSIZE
+#  define CONFIG_RNDIS_EPBULKOUT_SSSIZE 1024
+#endif
+
 /****************************************************************************
  * Public Data
  ****************************************************************************/
diff --git a/include/nuttx/usb/usbdev.h b/include/nuttx/usb/usbdev.h
index 557e1e3..b0ecc81 100644
--- a/include/nuttx/usb/usbdev.h
+++ b/include/nuttx/usb/usbdev.h
@@ -197,6 +197,9 @@
 #ifdef CONFIG_USBDEV_DUALSPEED
   uint16_t            hssize;
 #endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+  uint16_t            sssize;
+#endif
   uint16_t            reqnum;
 };
 
@@ -219,7 +222,7 @@
 struct usbdevclass_driver_s;
 struct composite_devdesc_s
 {
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
   CODE int16_t (*mkconfdesc)(FAR uint8_t *buf,
                              FAR struct usbdev_devinfo_s *devinfo,
                              uint8_t speed, uint8_t type);
@@ -438,7 +441,7 @@
  ****************************************************************************/
 
 void usbdev_copy_epdesc(FAR struct usb_epdesc_s *epdesc,
-                        uint8_t epno, bool hispeed,
+                        uint8_t epno, uint8_t speed,
                         FAR const struct usbdev_epinfo_s *epinfo);
 
 /****************************************************************************