From patchwork Wed Mar 27 09:29:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Gautam X-Patchwork-Id: 15682 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 17D9823E10 for ; Wed, 27 Mar 2013 09:32:39 +0000 (UTC) Received: from mail-ve0-f182.google.com (mail-ve0-f182.google.com [209.85.128.182]) by fiordland.canonical.com (Postfix) with ESMTP id AC051A180F9 for ; Wed, 27 Mar 2013 09:32:38 +0000 (UTC) Received: by mail-ve0-f182.google.com with SMTP id m1so2218128ves.41 for ; Wed, 27 Mar 2013 02:32:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-forwarded-to:x-forwarded-for:delivered-to:x-received :received-spf:x-auditid:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references:x-brightmail-tracker:x-brightmail-tracker :dlp-filter:x-mtr:x-cfilter-loop:x-gm-message-state; bh=SjtspBbgKsfCYLGL41CD58THmCfXNuOiy5BNakx/mNI=; b=FMN6qZw6se6TDWtqjNYrvvCEWJzb6zlSG1UvwXmtdZNlvDbRLRHcFhlYPAEKcZaL91 D+wp3fNU+gUuj9vYoGOJGcld2O1cXVc+iiIBoAhe2ZV7C9N2t1A1NpRzWp3H1Ukzj9tc MohktEIkeHnDkvDl0aEp3pGFs2VQklmt8rTB/rna+JAtifSX6e32IdY98Jj6K9mWdMJs VFOuc9OtNe8LLE1w85Oy1JsPi3fJzRGg/iAufnCNAf6h9bJVWrL6hXtSdyNTnuS4JAn3 4X9x/BKQ/xIOBC74gn8G8oeN1odLC2jEm5YcIwuudrRDAqUZbTyRzswS1v6hyVamJLDU TaGw== X-Received: by 10.59.3.9 with SMTP id bs9mr22558178ved.38.1364376758165; Wed, 27 Mar 2013 02:32:38 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.59.4.204 with SMTP id cg12csp107611ved; Wed, 27 Mar 2013 02:32:37 -0700 (PDT) X-Received: by 10.66.230.198 with SMTP id ta6mr28580546pac.126.1364376757246; Wed, 27 Mar 2013 02:32:37 -0700 (PDT) Received: from mailout3.samsung.com (mailout3.samsung.com. [203.254.224.33]) by mx.google.com with ESMTP id ae1si5960269pbc.106.2013.03.27.02.32.36; Wed, 27 Mar 2013 02:32:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of gautam.vivek@samsung.com designates 203.254.224.33 as permitted sender) client-ip=203.254.224.33; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of gautam.vivek@samsung.com designates 203.254.224.33 as permitted sender) smtp.mail=gautam.vivek@samsung.com Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MKB00AOWBT44UL0@mailout3.samsung.com> for patches@linaro.org; Wed, 27 Mar 2013 18:32:35 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.126]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id 19.6A.02019.3BCB2515; Wed, 27 Mar 2013 18:32:35 +0900 (KST) X-AuditID: cbfee690-b7f656d0000007e3-52-5152bcb3714c Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 98.E7.17838.3BCB2515; Wed, 27 Mar 2013 18:32:35 +0900 (KST) Received: from vivekkumarg-linuxpc.sisodomain.com ([107.108.214.169]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MKB00C14BRFI6F0@mmp2.samsung.com>; Wed, 27 Mar 2013 18:32:35 +0900 (KST) From: Vivek Gautam To: u-boot@lists.denx.de Cc: patches@linaro.org, marex@denx.de, sjg@chromium.org, rajeshwari.s@samsung.com, vikas.sajjan@samsung.com, amarendra.xt@samsung.com Subject: [PATCH 6/7] USB: SS: Add support for Super Speed USB interface Date: Wed, 27 Mar 2013 14:59:02 +0530 Message-id: <1364376543-7526-7-git-send-email-gautam.vivek@samsung.com> X-Mailer: git-send-email 1.7.6.5 In-reply-to: <1364376543-7526-1-git-send-email-gautam.vivek@samsung.com> References: <1364376543-7526-1-git-send-email-gautam.vivek@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJLMWRmVeSWpSXmKPExsWyRsSkTnfznqBAg5UnNC2+LOhkt3jT1sho MeXwFxaLlrUHWC2+bdnGaPF2L1Di5rPtTA7sHrMbLrJ4zJt1gsXjzrU9bB5n7+xg9Ojbsoox gDWKyyYlNSezLLVI3y6BK+PUrC72gv/mFSsXbGBtYNys28XIySEhYCLR2djIAmGLSVy4t56t i5GLQ0hgKaPE5L4DrDBFXWc6mCES0xklNt/oYoRwpjBJfFk9iRGkik1AV6Lp7S4wW0RAQuJX /1WwImaBdqCOjbPZQBLCAu4S3+88AitiEVCVWDXjFTOIzQsUv9N8AmqdgsSb28/A4pwCHhIz Xk0Du08IqObQuT1gQyUEprNLLPpzkR1ikIDEt8mHgIo4gBKyEpsOMEPMkZQ4uOIGywRG4QWM DKsYRVMLkguKk9KLTPSKE3OLS/PS9ZLzczcxAoP99L9nE3Yw3jtgfYgxGWjcRGYp0eR8YLTk lcQbGpsZWZiamBobmVuakSasJM6r3mIdKCSQnliSmp2aWpBaFF9UmpNafIiRiYNTqoHRnMVG b6KL6r9/fgdtS5wt7uekhwocqmf7tmj/OaMbHFmvela4ms5KefSsv00qfPpMpd08bj0r0nsn b6vZ+v1G55b52qrGC3Oj0kqvTJ6467t6h5hSmDp/k2+BgtcJp8R9PL2XXRZvThfivvE+p9hO 33li1bWgied7pKWnVjssbr61/u69jf1KLMUZiYZazEXFiQDVTQKejAIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrGIsWRmVeSWpSXmKPExsVy+t9jQd3Ne4ICDW7dkrf4sqCT3eJNWyOj xZTDX1gsWtYeYLX4tmUbo8XbvUCJm8+2Mzmwe8xuuMjiMW/WCRaPO9f2sHmcvbOD0aNvyyrG ANaoBkabjNTElNQihdS85PyUzLx0WyXv4HjneFMzA0NdQ0sLcyWFvMTcVFslF58AXbfMHKBD lBTKEnNKgUIBicXFSvp2mCaEhrjpWsA0Ruj6hgTB9RgZoIGENYwZp2Z1sRf8N69YuWADawPj Zt0uRk4OCQETia4zHcwQtpjEhXvr2boYuTiEBKYzSmy+0cUI4UxhkviyehIjSBWbgK5E09td YLaIgITEr/6rYEXMAu1AHRtns4EkhAXcJb7feQRWxCKgKrFqxiuwFbxA8TvNJ1gh1ilIvLn9 DCzOKeAhMePVNBYQWwio5tC5PYwTGHkXMDKsYhRNLUguKE5KzzXUK07MLS7NS9dLzs/dxAiO pWdSOxhXNlgcYhTgYFTi4Z3BEBQoxJpYVlyZe4hRgoNZSYT3xQqgEG9KYmVValF+fFFpTmrx IcZkoKsmMkuJJucD4zyvJN7Q2MTc1NjU0sTCxMySNGElcd4DrdaBQgLpiSWp2ampBalFMFuY ODilGhi3RERIH1lynev5cg+GhY/EfY5zfLjwIc9cPe53hTb/VMsXTV5TvI6tkNy4PF+3/Q7H xn+F1xs6sh3yQ45Mc+Ypkk+p+RvIqLHP30DKa8qV988uyUgvuvXzdXXn5/0W/bt8pHmXzovx W9PzYXN5yh31NRdecBxmXPadb5emnurXiWtntFxYYcitxFKckWioxVxUnAgAGnuXmukCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Gm-Message-State: ALoCoQmJ9lC2HqK+k+7zLI84hfagiVoHfSmrG0XMZjUE4IzK1olQzXk9rfYUnvY3/P4iLssp9NDi 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 Signed-off-by: Vivek Gautam --- common/cmd_usb.c | 6 ++++-- common/usb.c | 11 ++++++++--- common/usb_hub.c | 10 +++++++--- common/usb_storage.c | 2 +- include/usb.h | 12 +++++++++++- include/usb_defs.h | 24 +++++++++++++++++++++++- 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/common/cmd_usb.c b/common/cmd_usb.c index dacdc2d..90c2cf1 100644 --- a/common/cmd_usb.c +++ b/common/cmd_usb.c @@ -262,7 +262,7 @@ static void usb_display_config(struct usb_device *dev) ifdesc = &config->if_desc[i]; usb_display_if_desc(&ifdesc->desc, dev); for (ii = 0; ii < ifdesc->no_of_ep; ii++) { - epdesc = &ifdesc->ep_desc[ii]; + epdesc = &ifdesc->ep_desc[ii].ep_desc; usb_display_ep_desc(epdesc); } } @@ -271,7 +271,9 @@ static void usb_display_config(struct usb_device *dev) static inline char *portspeed(int speed) { - if (speed == USB_SPEED_HIGH) + if (speed == USB_SPEED_SUPER) + return "5 Gb/s"; + else if (speed == USB_SPEED_HIGH) return "480 Mb/s"; else if (speed == USB_SPEED_LOW) return "1.5 Mb/s"; diff --git a/common/usb.c b/common/usb.c index 39fcedd..a5b915e 100644 --- a/common/usb.c +++ b/common/usb.c @@ -304,7 +304,7 @@ usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx) struct usb_endpoint_descriptor *ep; u16 ep_wMaxPacketSize; - ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx]; + ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx].ep_desc; b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize); @@ -410,14 +410,19 @@ static int usb_parse_config(struct usb_device *dev, ep_wMaxPacketSize = get_unaligned(&dev->config.\ if_desc[ifno].\ ep_desc[epno].\ - wMaxPacketSize); + ep_desc.wMaxPacketSize); put_unaligned(le16_to_cpu(ep_wMaxPacketSize), &dev->config.\ if_desc[ifno].\ ep_desc[epno].\ - wMaxPacketSize); + ep_desc.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->ep_desc[epno].ss_ep_comp), + &buffer[index], buffer[index]); + break; default: if (head->bLength == 0) return 1; diff --git a/common/usb_hub.c b/common/usb_hub.c index 8ba7a0d..9acaede 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -158,7 +158,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"; @@ -262,7 +264,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; @@ -525,7 +529,7 @@ int usb_hub_probe(struct usb_device *dev, int ifnum) /* Multiple endpoints? What kind of mutant ninja-hub is this? */ if (iface->desc.bNumEndpoints != 1) return 0; - ep = &iface->ep_desc[0]; + ep = &iface->ep_desc[0].ep_desc; /* Output endpoint? Curiousier and curiousier.. */ if (!(ep->bEndpointAddress & USB_DIR_IN)) return 0; diff --git a/common/usb_storage.c b/common/usb_storage.c index 475c218..c48da43 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -1301,7 +1301,7 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum, * We will ignore any others. */ for (i = 0; i < iface->desc.bNumEndpoints; i++) { - ep_desc = &iface->ep_desc[i]; + ep_desc = &iface->ep_desc[i].ep_desc; /* is it an BULK endpoint? */ if ((ep_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) { diff --git a/include/usb.h b/include/usb.h index d79c865..1d832ca 100644 --- a/include/usb.h +++ b/include/usb.h @@ -67,6 +67,16 @@ struct devrequest { unsigned short length; } __attribute__ ((packed)); +struct usb_ep_desc { + struct usb_endpoint_descriptor ep_desc; + /* + * 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; +}; + /* Interface */ struct usb_interface { struct usb_interface_descriptor desc; @@ -75,7 +85,7 @@ struct usb_interface { unsigned char num_altsetting; unsigned char act_altsetting; - struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS]; + struct usb_ep_desc ep_desc[USB_MAXENDPOINTS]; } __attribute__ ((packed)); /* Configuration information.. */ diff --git a/include/usb_defs.h b/include/usb_defs.h index 0c78d9d..e2aaef3 100644 --- a/include/usb_defs.h +++ b/include/usb_defs.h @@ -203,6 +203,8 @@ #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 @@ -218,8 +220,20 @@ #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 @@ -228,6 +242,14 @@ #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