Fix EHCI usb. I start to test on a
IXP465 board and I find some errors in the code. This
patch fix:
- descriptor initizialization (config, interface and endpoint
  must be one next-to the other when the USB_DT_CONFIG message
  is send.
- FIX little/endian bigendian (introduce the CONFIG_EHCI_DESC_BIG_ENDIAN
  and the CONFIG_EHCI_MMIO_BIG_ENDIAN)
- Introduce the linux version of the usb_config_descriptor and
  usb_interface descriptor. This descriptor does't contains
  u-boot extension.

Signed-off-by: Michael Trimarchi <[EMAIL PROTECTED]>
---
 drivers/usb/usb_ehci.h      |   50 ++++++-
 drivers/usb/usb_ehci_core.c |  342 +++++++++++++++++++++++--------------------
 drivers/usb/usb_ehci_core.h |    2 +-
 3 files changed, 233 insertions(+), 161 deletions(-)

diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
index ebffb44..3e7a2ab 100644
--- a/drivers/usb/usb_ehci.h
+++ b/drivers/usb/usb_ehci.h
@@ -24,6 +24,7 @@
 /* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */
 #define DeviceRequest \
        ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE) << 8)
+
 #define DeviceOutRequest \
        ((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE) << 8)
 
@@ -32,6 +33,7 @@
 
 #define EndpointRequest \
        ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8)
+
 #define EndpointOutRequest \
        ((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8)
 
@@ -39,8 +41,9 @@
  * Register Space.
  */
 struct ehci_hccr {
-       uint8_t cr_caplength;
-       uint16_t cr_hciversion;
+       uint32_t cr_capbase;
+#define HC_LENGTH(p)           (((p) >> 0) & 0x00ff)
+#define HC_VERSION(p)          (((p) >> 16) & 0xffff)
        uint32_t cr_hcsparams;
        uint32_t cr_hccparams;
        uint8_t cr_hcsp_portrt[8];
@@ -48,7 +51,9 @@ struct ehci_hccr {
 
 struct ehci_hcor {
        uint32_t or_usbcmd;
+#define CMD_ASE                (1 << 5)
        uint32_t or_usbsts;
+#define        STD_ASS         (1 << 15)
        uint32_t or_usbintr;
        uint32_t or_frindex;
        uint32_t or_ctrldssegment;
@@ -60,6 +65,47 @@ struct ehci_hcor {
        uint32_t or_systune;
 };
 
+/* Interface descriptor */
+struct usb_linux_interface_descriptor {
+       unsigned char   bLength;
+       unsigned char   bDescriptorType;
+       unsigned char   bInterfaceNumber;
+       unsigned char   bAlternateSetting;
+       unsigned char   bNumEndpoints;
+       unsigned char   bInterfaceClass;
+       unsigned char   bInterfaceSubClass;
+       unsigned char   bInterfaceProtocol;
+       unsigned char   iInterface;
+} __attribute__ ((packed));
+
+/* Configuration descriptor information.. */
+struct usb_linux_config_descriptor {
+       unsigned char   bLength;
+       unsigned char   bDescriptorType;
+       unsigned short  wTotalLength;
+       unsigned char   bNumInterfaces;
+       unsigned char   bConfigurationValue;
+       unsigned char   iConfiguration;
+       unsigned char   bmAttributes;
+       unsigned char   MaxPower;
+} __attribute__ ((packed));
+
+#if defined CONFIG_EHCI_DESC_BIG_ENDIAN
+#define        ehci_readl(x)           (x)
+#define ehci_writel(a, b)      (a) = (b)
+#else
+#define ehci_readl(x)          cpu_to_le32((x))
+#define ehci_writel(a, b)      (a) = cpu_to_le32((b))
+#endif
+
+#if defined CONFIG_EHCI_MMIO_BIG_ENDIAN
+#define hc32_to_cpu(x)         be32_to_cpu((x))
+#define cpu_to_hc32(x)         cpu_to_be32((x))
+#else
+#define hc32_to_cpu(x)         le32_to_cpu((x))
+#define cpu_to_hc32(x)         cpu_to_le32((x))
+#endif
+
 #define EHCI_PS_WKOC_E         0x00400000      /* RW wake on over current */
 #define EHCI_PS_WKDSCNNT_E     0x00200000      /* RW wake on disconnect */
 #define EHCI_PS_WKCNNT_E       0x00100000      /* RW wake on connect */
diff --git a/drivers/usb/usb_ehci_core.c b/drivers/usb/usb_ehci_core.c
index 765b5dd..ca63850 100644
--- a/drivers/usb/usb_ehci_core.c
+++ b/drivers/usb/usb_ehci_core.c
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2007-2008, Juniper Networks, Inc.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to