Patchwork [U-Boot,2/3] usb: fix: Fixing Port status and feature number constants

login
register
mail settings
Submitter Vivek Gautam
Date April 24, 2013, 12:50 p.m.
Message ID <1366807813-10481-3-git-send-email-gautam.vivek@samsung.com>
Download mbox | patch
Permalink /patch/239199/
State Accepted
Delegated to: Marek Vasut
Headers show

Comments

Vivek Gautam - April 24, 2013, 12:50 p.m.
Fix the Port status bit constants and Port feature number
constants as a part of USB 2.0 and USB 3.0 Hub class.

Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
---
 common/usb_hub.c   |   40 ++++++++++++++++++++++++++++------------
 include/usb_defs.h |   39 +++++++++++++++++++++++----------------
 2 files changed, 51 insertions(+), 28 deletions(-)
Julius Werner - April 24, 2013, 5:52 p.m.
On Wed, Apr 24, 2013 at 5:50 AM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
> Fix the Port status bit constants and Port feature number
> constants as a part of USB 2.0 and USB 3.0 Hub class.
>
> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
> ---
>  common/usb_hub.c   |   40 ++++++++++++++++++++++++++++------------
>  include/usb_defs.h |   39 +++++++++++++++++++++++----------------
>  2 files changed, 51 insertions(+), 28 deletions(-)
>
> diff --git a/common/usb_hub.c b/common/usb_hub.c
> index dad0409..d9816e4 100644
> --- a/common/usb_hub.c
> +++ b/common/usb_hub.c
> @@ -170,14 +170,24 @@ static struct usb_hub_device *usb_hub_allocate(void)
>
>  static inline char *portspeed(int portstatus)
>  {
> -       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";
> -       else
> -               return "12 Mb/s";
> +       char *speed_str;
> +
> +       switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
> +       case USB_PORT_STAT_SUPER_SPEED:
> +               speed_str = "5 Gb/s";
> +               break;
> +       case USB_PORT_STAT_HIGH_SPEED:
> +               speed_str = "480 Mb/s";
> +               break;
> +       case USB_PORT_STAT_LOW_SPEED:
> +               speed_str = "1.5 Mb/s";
> +               break;
> +       default:
> +               speed_str = "12 Mb/s";
> +               break;
> +       }
> +
> +       return speed_str;
>  }

Just a nitpick... you could save 8 lines here by moving the return
into the case blocks. Rest of the patch set LGTM.

>
>  int hub_port_reset(struct usb_device *dev, int port,
> @@ -275,14 +285,20 @@ 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_SUPER_SPEED)
> +       switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
> +       case USB_PORT_STAT_SUPER_SPEED:
>                 usb->speed = USB_SPEED_SUPER;
> -       else if (portstatus & USB_PORT_STAT_HIGH_SPEED)
> +               break;
> +       case USB_PORT_STAT_HIGH_SPEED:
>                 usb->speed = USB_SPEED_HIGH;
> -       else if (portstatus & USB_PORT_STAT_LOW_SPEED)
> +               break;
> +       case USB_PORT_STAT_LOW_SPEED:
>                 usb->speed = USB_SPEED_LOW;
> -       else
> +               break;
> +       default:
>                 usb->speed = USB_SPEED_FULL;
> +               break;
> +       }
>
>         dev->children[port] = usb;
>         usb->parent = dev;
> diff --git a/include/usb_defs.h b/include/usb_defs.h
> index 6ce6791..4f3601a 100644
> --- a/include/usb_defs.h
> +++ b/include/usb_defs.h
> @@ -215,8 +215,6 @@
>  #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
> @@ -224,6 +222,17 @@
>  #define USB_PORT_FEAT_C_RESET        20
>  #define USB_PORT_FEAT_TEST           21
>
> +/*
> + * Changes to Port feature numbers for Super speed,
> + * from USB 3.0 spec Table 10-8
> + */
> +#define USB_SS_PORT_FEAT_U1_TIMEOUT    23
> +#define USB_SS_PORT_FEAT_U2_TIMEOUT    24
> +#define USB_SS_PORT_FEAT_C_LINK_STATE  25
> +#define USB_SS_PORT_FEAT_C_CONFIG_ERROR        26
> +#define USB_SS_PORT_FEAT_BH_RESET      28
> +#define USB_SS_PORT_FEAT_C_BH_RESET    29
> +
>  /* wPortStatus bits */
>  #define USB_PORT_STAT_CONNECTION    0x0001
>  #define USB_PORT_STAT_ENABLE        0x0002
> @@ -233,20 +242,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_FULL_SPEED | USB_PORT_STAT_SUPER_SPEED)
> +#define USB_PORT_STAT_SUPER_SPEED   0x0600     /* faking support to XHCI */
> +#define USB_PORT_STAT_SPEED_MASK       \
> +       (USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED)
>
>  /*
> - * Additions to wPortStatus bit field from USB 3.0
> - * See USB 3.0 spec Table 10-10
> + * Changes to wPortStatus bit field in USB 3.0
> + * See USB 3.0 spec Table 10-11
>   */
> -#define USB_PORT_STAT_LINK_STATE       0x01e0
> +#define USB_SS_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
> +#define USB_SS_PORT_STAT_SPEED_5GBPS   0x0000
>
>  /* wPortChange bits */
>  #define USB_PORT_STAT_C_CONNECTION  0x0001
> @@ -256,12 +263,12 @@
>  #define USB_PORT_STAT_C_RESET       0x0010
>
>  /*
> - * Addition to wPortChange bit fields form USB 3.0
> - * See USB 3.0 spec Table 10-11
> + * Changes to wPortChange bit fields in USB 3.0
> + * See USB 3.0 spec Table 10-12
>   */
> -#define USB_PORT_STAT_C_BH_RESET       0x0020
> -#define USB_PORT_STAT_C_LINK_STATE     0x0040
> -#define USB_PORT_STAT_C_CONFIG_ERROR   0x0080
> +#define USB_SS_PORT_STAT_C_BH_RESET    0x0020
> +#define USB_SS_PORT_STAT_C_LINK_STATE  0x0040
> +#define USB_SS_PORT_STAT_C_CONFIG_ERROR        0x0080
>
>  /* wHubCharacteristics (masks) */
>  #define HUB_CHAR_LPSM               0x0003
> --
> 1.7.6.5
>

Patch

diff --git a/common/usb_hub.c b/common/usb_hub.c
index dad0409..d9816e4 100644
--- a/common/usb_hub.c
+++ b/common/usb_hub.c
@@ -170,14 +170,24 @@  static struct usb_hub_device *usb_hub_allocate(void)
 
 static inline char *portspeed(int portstatus)
 {
-	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";
-	else
-		return "12 Mb/s";
+	char *speed_str;
+
+	switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
+	case USB_PORT_STAT_SUPER_SPEED:
+		speed_str = "5 Gb/s";
+		break;
+	case USB_PORT_STAT_HIGH_SPEED:
+		speed_str = "480 Mb/s";
+		break;
+	case USB_PORT_STAT_LOW_SPEED:
+		speed_str = "1.5 Mb/s";
+		break;
+	default:
+		speed_str = "12 Mb/s";
+		break;
+	}
+
+	return speed_str;
 }
 
 int hub_port_reset(struct usb_device *dev, int port,
@@ -275,14 +285,20 @@  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_SUPER_SPEED)
+	switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
+	case USB_PORT_STAT_SUPER_SPEED:
 		usb->speed = USB_SPEED_SUPER;
-	else if (portstatus & USB_PORT_STAT_HIGH_SPEED)
+		break;
+	case USB_PORT_STAT_HIGH_SPEED:
 		usb->speed = USB_SPEED_HIGH;
-	else if (portstatus & USB_PORT_STAT_LOW_SPEED)
+		break;
+	case USB_PORT_STAT_LOW_SPEED:
 		usb->speed = USB_SPEED_LOW;
-	else
+		break;
+	default:
 		usb->speed = USB_SPEED_FULL;
+		break;
+	}
 
 	dev->children[port] = usb;
 	usb->parent = dev;
diff --git a/include/usb_defs.h b/include/usb_defs.h
index 6ce6791..4f3601a 100644
--- a/include/usb_defs.h
+++ b/include/usb_defs.h
@@ -215,8 +215,6 @@ 
 #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
@@ -224,6 +222,17 @@ 
 #define USB_PORT_FEAT_C_RESET        20
 #define USB_PORT_FEAT_TEST           21
 
+/*
+ * Changes to Port feature numbers for Super speed,
+ * from USB 3.0 spec Table 10-8
+ */
+#define USB_SS_PORT_FEAT_U1_TIMEOUT	23
+#define USB_SS_PORT_FEAT_U2_TIMEOUT	24
+#define USB_SS_PORT_FEAT_C_LINK_STATE	25
+#define USB_SS_PORT_FEAT_C_CONFIG_ERROR	26
+#define USB_SS_PORT_FEAT_BH_RESET	28
+#define USB_SS_PORT_FEAT_C_BH_RESET	29
+
 /* wPortStatus bits */
 #define USB_PORT_STAT_CONNECTION    0x0001
 #define USB_PORT_STAT_ENABLE        0x0002
@@ -233,20 +242,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_FULL_SPEED | USB_PORT_STAT_SUPER_SPEED)
+#define USB_PORT_STAT_SUPER_SPEED   0x0600	/* faking support to XHCI */
+#define USB_PORT_STAT_SPEED_MASK	\
+	(USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED)
 
 /*
- * Additions to wPortStatus bit field from USB 3.0
- * See USB 3.0 spec Table 10-10
+ * Changes to wPortStatus bit field in USB 3.0
+ * See USB 3.0 spec Table 10-11
  */
-#define USB_PORT_STAT_LINK_STATE	0x01e0
+#define USB_SS_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
+#define USB_SS_PORT_STAT_SPEED_5GBPS	0x0000
 
 /* wPortChange bits */
 #define USB_PORT_STAT_C_CONNECTION  0x0001
@@ -256,12 +263,12 @@ 
 #define USB_PORT_STAT_C_RESET       0x0010
 
 /*
- * Addition to wPortChange bit fields form USB 3.0
- * See USB 3.0 spec Table 10-11
+ * Changes to wPortChange bit fields in USB 3.0
+ * See USB 3.0 spec Table 10-12
  */
-#define USB_PORT_STAT_C_BH_RESET	0x0020
-#define USB_PORT_STAT_C_LINK_STATE	0x0040
-#define USB_PORT_STAT_C_CONFIG_ERROR	0x0080
+#define USB_SS_PORT_STAT_C_BH_RESET	0x0020
+#define USB_SS_PORT_STAT_C_LINK_STATE	0x0040
+#define USB_SS_PORT_STAT_C_CONFIG_ERROR	0x0080
 
 /* wHubCharacteristics (masks) */
 #define HUB_CHAR_LPSM               0x0003