USB: SS: Add support for Super Speed USB interface
authorVivek Gautam <gautam.vivek@samsung.com>
Fri, 12 Apr 2013 11:04:38 +0000 (16:34 +0530)
committerChanho Park <chanho61.park@samsung.com>
Fri, 24 Jul 2015 07:29:55 +0000 (16:29 +0900)
This adds usb framework support for super-speed usb, which will
further facilitate to add stack support for xHCI.

Signed-off-by: Vikas C Sajjan <vikas.sajjan@samsung.com>
Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
common/cmd_usb.c
common/usb.c
common/usb_hub.c
include/usb.h
include/usb_defs.h

index cda4fac6e7361fd46c6e2d3a37d0d6cbe7570fcf..9a6f96911acde43246c784a0ac198c6823999785 100644 (file)
@@ -271,12 +271,24 @@ void usb_display_config(struct usb_device *dev)
 
 static inline char *portspeed(int speed)
 {
-       if (speed == USB_SPEED_HIGH)
-               return "480 Mb/s";
-       else if (speed == USB_SPEED_LOW)
-               return "1.5 Mb/s";
-       else
-               return "12 Mb/s";
+       char *speed_str;
+
+       switch (speed) {
+       case USB_SPEED_SUPER:
+               speed_str = "5 Gb/s";
+               break;
+       case USB_SPEED_HIGH:
+               speed_str = "480 Mb/s";
+               break;
+       case USB_SPEED_LOW:
+               speed_str = "1.5 Mb/s";
+               break;
+       default:
+               speed_str = "12 Mb/s";
+               break;
+       }
+
+       return speed_str;
 }
 
 /* shows the device tree recursively */
index 6fc0fc1c0ec75fe34f100cbfb03b207628b32885..e8fa03d8b13af259838cf02fc69007f251fa0a6f 100644 (file)
@@ -416,6 +416,11 @@ static int usb_parse_config(struct usb_device *dev,
                                        wMaxPacketSize);
                        USB_PRINTF("if %d, ep %d\n", ifno, epno);
                        break;
+               case USB_DT_SS_ENDPOINT_COMP:
+                       if_desc = &dev->config.if_desc[ifno];
+                       memcpy(&if_desc->ss_ep_comp_desc[epno],
+                               &buffer[index], buffer[index]);
+                       break;
                default:
                        if (head->bLength == 0)
                                return 1;
index a3c5f22814054772a164896ef2308648f7d4e8f1..48f7782749b4df1383de119f3ce165f66f9c8990 100644 (file)
@@ -142,7 +142,9 @@ static struct usb_hub_device *usb_hub_allocate(void)
 
 static inline char *portspeed(int portstatus)
 {
-       if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED))
+       if (portstatus & (1 << USB_PORT_FEAT_SUPERSPEED))
+               return "5 Gb/s";
+       else if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED))
                return "480 Mb/s";
        else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED))
                return "1.5 Mb/s";
@@ -246,7 +248,9 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
        /* Allocate a new device struct for it */
        usb = usb_alloc_new_device(dev->controller);
 
-       if (portstatus & USB_PORT_STAT_HIGH_SPEED)
+       if (portstatus & USB_PORT_STAT_SUPER_SPEED)
+               usb->speed = USB_SPEED_SUPER;
+       else if (portstatus & USB_PORT_STAT_HIGH_SPEED)
                usb->speed = USB_SPEED_HIGH;
        else if (portstatus & USB_PORT_STAT_LOW_SPEED)
                usb->speed = USB_SPEED_LOW;
index 601f56598c6cecb17e15c093647ae8e71746ff78..ea436cf9dd2a34d758f88895cd1ce167ec78df45 100644 (file)
@@ -76,6 +76,12 @@ struct usb_interface {
        unsigned char   act_altsetting;
 
        struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS];
+       /*
+        * Super Speed Device will have Super Speed Endpoint
+        * Companion Descriptor  (section 9.6.7 of usb 3.0 spec)
+        * Revision 1.0 June 6th 2011
+        */
+       struct usb_ss_ep_comp_descriptor ss_ep_comp_desc[USB_MAXENDPOINTS];
 } __attribute__ ((packed));
 
 /* Configuration information.. */
index 9502544b21bd1b41a034193de822f1345045acc7..5b9cdee53e3656d6b880c8aff0b9db7fe9ccf0aa 100644 (file)
 #define USB_PORT_FEAT_POWER          8
 #define USB_PORT_FEAT_LOWSPEED       9
 #define USB_PORT_FEAT_HIGHSPEED      10
+#define USB_PORT_FEAT_FULLSPEED      11
+#define USB_PORT_FEAT_SUPERSPEED     12
 #define USB_PORT_FEAT_C_CONNECTION   16
 #define USB_PORT_FEAT_C_ENABLE       17
 #define USB_PORT_FEAT_C_SUSPEND      18
 #define USB_PORT_STAT_POWER         0x0100
 #define USB_PORT_STAT_LOW_SPEED     0x0200
 #define USB_PORT_STAT_HIGH_SPEED    0x0400     /* support for EHCI */
+#define USB_PORT_STAT_FULL_SPEED    0x0800
+#define USB_PORT_STAT_SUPER_SPEED   0x1000     /* support for XHCI */
 #define USB_PORT_STAT_SPEED    \
-       (USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED)
+       (USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED | \
+       USB_PORT_STAT_FULL_SPEED | USB_PORT_STAT_SUPER_SPEED)
+
+/*
+ * Additions to wPortStatus bit field from USB 3.0
+ * See USB 3.0 spec Table 10-10
+ */
+#define USB_PORT_STAT_LINK_STATE       0x01e0
+#define USB_SS_PORT_STAT_POWER         0x0200
+#define USB_SS_PORT_STAT_SPEED         0x1c00
+#define USB_PORT_STAT_SPEED_5GBPS      0x0000
 
 /* wPortChange bits */
 #define USB_PORT_STAT_C_CONNECTION  0x0001
 #define USB_PORT_STAT_C_OVERCURRENT 0x0008
 #define USB_PORT_STAT_C_RESET       0x0010
 
+/*
+ * Addition to wPortChange bit fields form USB 3.0
+ * See USB 3.0 spec Table 10-11
+ */
+#define USB_PORT_STAT_C_BH_RESET       0x0020
+#define USB_PORT_STAT_C_LINK_STATE     0x0040
+#define USB_PORT_STAT_C_CONFIG_ERROR   0x0080
+
 /* wHubCharacteristics (masks) */
 #define HUB_CHAR_LPSM               0x0003
 #define HUB_CHAR_COMPOUND           0x0004