public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware
@ 2008-12-12 10:00 Michael Trimarchi
  2008-12-12 10:19 ` Jean-Christophe PLAGNIOL-VILLARD
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Trimarchi @ 2008-12-12 10:00 UTC (permalink / raw)
  To: u-boot

EHCI fix code and ixp4xx test.
USB ehci configuration parameter:

#define CONFIG_CMD_USB          1
#define CONFIG_USB_STORAGE      1
#define CONFIG_USB_EHCI
#define CONFIG_USB_EHCI_IXP4XX          1
#define CONFIG_EHCI_IS_TDI              1
#define CONFIG_EHCI_DESC_BIG_ENDIAN     1
#define CONFIG_EHCI_MMIO_BIG_ENDIAN     1
#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 2
#define CONFIG_LEGACY_USB_INIT_SEQ      1

2 USB Device(s) found
       scanning bus for storage devices... 0 Storage Device(s) found
=> usb tree

Device Tree:
  1  Hub (1.5MBit/s, 0mA)
  |  u-boot EHCI Host Controller
  |
  |+-2  Mass Storage (12MBit/s, 100mA)
       Sony Storage Media 0C07040930296

=>

Signed-off-by: Michael Trimarchi <trimarchimichael@yahoo.it>

---
 drivers/usb/usb_ehci.h      |   49 ++++++++++--------
 drivers/usb/usb_ehci_core.c |  122 ++++++++++++++++++++++++++----------------
 2 files changed, 102 insertions(+), 69 deletions(-)

diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
index 90b137a..9e8e7b2 100644
--- a/drivers/usb/usb_ehci.h
+++ b/drivers/usb/usb_ehci.h
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2007-2008, Juniper Networks, Inc.
+ * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
  * All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -21,6 +22,10 @@
 #ifndef USB_EHCI_H
 #define USB_EHCI_H
 
+#if !defined(CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS)
+#error "USB EHCI define MAX_ROOT_PORTS"
+#endif
+
 /* (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)
@@ -45,10 +50,12 @@ struct ehci_hccr {
 #define HC_LENGTH(p)		(((p) >> 0) & 0x00ff)
 #define HC_VERSION(p)		(((p) >> 16) & 0xffff)
 	uint32_t cr_hcsparams;
+#define HCS_PPC(p)		((p) & (1 << 4))
+#define HCS_INDICATOR(p)        ((p) & (1 << 16)) /* Port indicators */
 #define HCS_N_PORTS(p)		(((p) >> 0) & 0xf)
 	uint32_t cr_hccparams;
 	uint8_t cr_hcsp_portrt[8];
-};
+} __attribute__ ((packed));
 
 struct ehci_hcor {
 	uint32_t or_usbcmd;
@@ -71,9 +78,9 @@ struct ehci_hcor {
 	uint32_t _reserved_[9];
 	uint32_t or_configflag;
 #define FLAG_CF		(1 << 0)	/* true:  we'll support "high speed" */
-	uint32_t or_portsc[2];
+	uint32_t or_portsc[CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS];
 	uint32_t or_systune;
-};
+} __attribute__ ((packed));
 
 #define USBMODE		0x68		/* USB Device mode */
 #define USBMODE_SDIS	(1 << 3)	/* Stream disable */
@@ -123,26 +130,24 @@ struct usb_linux_config_descriptor {
 #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 */
-#define EHCI_PS_PTC		0x000f0000	/* RW port test control */
-#define EHCI_PS_PIC		0x0000c000	/* RW port indicator control */
-#define EHCI_PS_PO		0x00002000	/* RW port owner */
-#define EHCI_PS_PP		0x00001000	/* RW,RO port power */
-#define EHCI_PS_LS		0x00000c00	/* RO line status */
-#define EHCI_PS_PR		0x00000100	/* RW port reset */
-#define EHCI_PS_SUSP		0x00000080	/* RW suspend */
-#define EHCI_PS_FPR		0x00000040	/* RW force port resume */
-#define EHCI_PS_OCC		0x00000020	/* RWC over current change */
-#define EHCI_PS_OCA		0x00000010	/* RO over current active */
-#define EHCI_PS_PEC		0x00000008	/* RWC port enable change */
-#define EHCI_PS_PE		0x00000004	/* RW port enable */
-#define EHCI_PS_CSC		0x00000002	/* RWC connect status change */
-#define EHCI_PS_CS		0x00000001	/* RO connect status */
+#define EHCI_PS_WKOC_E		(1 << 22)	/* RW wake on over current */
+#define EHCI_PS_WKDSCNNT_E	(1 << 21)	/* RW wake on disconnect */
+#define EHCI_PS_WKCNNT_E	(1 << 20)	/* RW wake on connect */
+#define EHCI_PS_PO		(1 << 13)	/* RW port owner */
+#define EHCI_PS_PP		(1 << 12)	/* RW,RO port power */
+#define EHCI_PS_LS		(3 << 10)	/* RO line status */
+#define EHCI_PS_PR		(1 << 8)	/* RW port reset */
+#define EHCI_PS_SUSP		(1 << 7)	/* RW suspend */
+#define EHCI_PS_FPR		(1 << 6)	/* RW force port resume */
+#define EHCI_PS_OCC		(1 << 5)	/* RWC over current change */
+#define EHCI_PS_OCA		(1 << 4)	/* RO over current active */
+#define EHCI_PS_PEC		(1 << 3)	/* RWC port enable change */
+#define EHCI_PS_PE		(1 << 2)	/* RW port enable */
+#define EHCI_PS_CSC		(1 << 1)	/* RWC connect status change */
+#define EHCI_PS_CS		(1 << 0)	/* RO connect status */
 #define EHCI_PS_CLEAR		(EHCI_PS_OCC | EHCI_PS_PEC | EHCI_PS_CSC)
 
-#define EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == 0x00000400)
+#define EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == (1 << 10))
 
 /*
  * Schedule Interface Space.
@@ -178,7 +183,7 @@ struct QH {
 };
 
 /* Low level intit functions */
-
 int ehci_hcd_init(void);
 int ehci_hcd_stop(void);
+
 #endif /* USB_EHCI_H */
diff --git a/drivers/usb/usb_ehci_core.c b/drivers/usb/usb_ehci_core.c
index ec50874..167867e 100644
--- a/drivers/usb/usb_ehci_core.c
+++ b/drivers/usb/usb_ehci_core.c
@@ -1,6 +1,7 @@
 /*-
  * Copyright (c) 2007-2008, Juniper Networks, Inc.
  * Copyright (c) 2008, Excito Elektronik i Sk?ne AB
+ * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
  * All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -18,7 +19,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  */
-#define DEBUG
 #include <common.h>
 #include <asm/byteorder.h>
 #include <usb.h>
@@ -99,6 +99,12 @@ static struct descriptor {
 	},
 };
 
+#if defined CONFIG_EHCI_IS_TDI
+#define ehci_is_TDI()	1
+#else
+#define ehci_is_TDI()	0
+#endif
+
 static int handshake(uint32_t *ptr, uint32_t mask, uint32_t done, int msec)
 {
 	uint32_t result;
@@ -131,7 +137,7 @@ static int ehci_reset(void)
 	cmd = ehci_readl(&hcor->or_usbcmd);
 	cmd |= CMD_RESET;
 	ehci_writel(&hcor->or_usbcmd, cmd);
-	ret = handshake(&hcor->or_usbcmd, CMD_RESET, 0, 250);
+	ret = handshake((uint32_t *)&hcor->or_usbcmd, CMD_RESET, 0, 250);
 	if (ret < 0) {
 		printf("EHCI fail to reset\n");
 		goto out;
@@ -427,7 +433,15 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 	void *srcptr = NULL;
 	int len, srclen;
 	uint32_t reg;
+	uint32_t *status_reg;
 
+	if (le16_to_cpu(req->index) >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
+		printf("The request port(%d) is not configured\n",
+			le16_to_cpu(req->index) - 1);
+		return -1;
+	}
+	status_reg = (uint32_t *)&hcor->or_portsc[
+						le16_to_cpu(req->index) - 1];
 	srclen = 0;
 
 	debug("req=%u (%#x), type=%u (%#x), value=%u, index=%u\n",
@@ -506,8 +520,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 		break;
 	case USB_REQ_GET_STATUS | ((USB_RT_PORT | USB_DIR_IN) << 8):
 		memset(tmpbuf, 0, 4);
-		reg = ehci_readl(&hcor->or_portsc[le16_to_cpu(req->index)
-				   - 1]);
+		reg = ehci_readl(status_reg);
 		if (reg & EHCI_PS_CS)
 			tmpbuf[0] |= USB_PORT_STAT_CONNECTION;
 		if (reg & EHCI_PS_PE)
@@ -516,8 +529,19 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 			tmpbuf[0] |= USB_PORT_STAT_SUSPEND;
 		if (reg & EHCI_PS_OCA)
 			tmpbuf[0] |= USB_PORT_STAT_OVERCURRENT;
-		if (reg & EHCI_PS_PR)
-			tmpbuf[0] |= USB_PORT_STAT_RESET;
+		if (reg & EHCI_PS_PR &&
+		    (portreset & (1 << le16_to_cpu(req->index)))) {
+			int ret;
+			/* force reset to complete */
+			reg = reg & ~(EHCI_PS_PR | EHCI_PS_CLEAR);
+			ehci_writel(status_reg, reg);
+			ret = handshake(status_reg, EHCI_PS_PR, 0, 2);
+			if (!ret)
+				tmpbuf[0] |= USB_PORT_STAT_RESET;
+			else
+				printf("port(%d) reset error\n",
+					le16_to_cpu(req->index) - 1);
+		}
 		if (reg & EHCI_PS_PP)
 			tmpbuf[1] |= USB_PORT_STAT_POWER >> 8;
 		tmpbuf[1] |= USB_PORT_STAT_HIGH_SPEED >> 8;
@@ -530,73 +554,71 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 			tmpbuf[2] |= USB_PORT_STAT_C_OVERCURRENT;
 		if (portreset & (1 << le16_to_cpu(req->index)))
 			tmpbuf[2] |= USB_PORT_STAT_C_RESET;
+
 		srcptr = tmpbuf;
 		srclen = 4;
 		break;
 	case USB_REQ_SET_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
-		reg = ehci_readl(&hcor->or_portsc[le16_to_cpu(req->index) - 1]);
+		reg = ehci_readl(status_reg);
 		reg &= ~EHCI_PS_CLEAR;
 		switch (le16_to_cpu(req->value)) {
 		case USB_PORT_FEAT_ENABLE:
 			reg |= EHCI_PS_PE;
+			ehci_writel(status_reg, reg);
 			break;
 		case USB_PORT_FEAT_POWER:
-			reg |= EHCI_PS_PP;
+			if (HCS_PPC(ehci_readl(&hccr->cr_hcsparams))) {
+				reg |= EHCI_PS_PP;
+				ehci_writel(status_reg, reg);
+			}
 			break;
 		case USB_PORT_FEAT_RESET:
-			debug("USB FEAT RESET\n");
-			if (EHCI_PS_IS_LOWSPEED(reg)) {
+			if ((reg & (EHCI_PS_PE | EHCI_PS_CS)) == EHCI_PS_CS &&
+			    !ehci_is_TDI() &&
+			    EHCI_PS_IS_LOWSPEED(reg)) {
 				/* Low speed device, give up ownership. */
+				debug("port %d low speed --> companion\n",
+				      req->index - 1);
 				reg |= EHCI_PS_PO;
+				ehci_writel(status_reg, reg);
 				break;
+			} else {
+				reg |= EHCI_PS_PR;
+				reg &= ~EHCI_PS_PE;
+				ehci_writel(status_reg, reg);
+				/*
+				 * caller must wait, then call GetPortStatus
+				 * usb 2.0 specification say 50 ms resets on
+				 * root
+				 */
+				wait_ms(50);
+				portreset |= 1 << le16_to_cpu(req->index);
 			}
-			/* Start reset sequence. */
-			reg &= ~EHCI_PS_PE;
-			reg |= EHCI_PS_PR;
-			ehci_writel(&hcor->or_portsc[
-				le16_to_cpu(req->index) - 1], reg);
-			/* Wait for reset to complete. */
-			wait_ms(500);
-			/* Terminate reset sequence. */
-			reg &= ~EHCI_PS_PR;
-			/* TODO: is it only fsl chip that requires this
-			 * manual setting of port enable?
-			 */
-			reg |= EHCI_PS_PE;
-			ehci_writel(&hcor->or_portsc[
-				le16_to_cpu(req->index) - 1], reg);
-			/* Wait for HC to complete reset. */
-			wait_ms(10);
-			reg =
-			    ehci_readl(&hcor->or_portsc[le16_to_cpu(req->index)
-							- 1]);
-			reg &= ~EHCI_PS_CLEAR;
-			if ((reg & EHCI_PS_PE) == 0) {
-				/* Not a high speed device, give up
-				 * ownership. */
-				reg |= EHCI_PS_PO;
-				break;
-			}
-			portreset |= 1 << le16_to_cpu(req->index);
 			break;
 		default:
 			debug("unknown feature %x\n", le16_to_cpu(req->value));
 			goto unknown;
 		}
-		ehci_writel(&hcor->or_portsc[le16_to_cpu(req->index) - 1], reg);
+		/* unblock posted writes */
+		ehci_readl(&hcor->or_usbcmd);
 		break;
 	case USB_REQ_CLEAR_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
-		reg = ehci_readl(&hcor->or_portsc[le16_to_cpu(req->index) - 1]);
-		reg &= ~EHCI_PS_CLEAR;
+		reg = ehci_readl(status_reg);
 		switch (le16_to_cpu(req->value)) {
 		case USB_PORT_FEAT_ENABLE:
 			reg &= ~EHCI_PS_PE;
 			break;
+		case USB_PORT_FEAT_C_ENABLE:
+			reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_PE;
+			break;
+		case USB_PORT_FEAT_POWER:
+			if (HCS_PPC(ehci_readl(&hccr->cr_hcsparams)))
+				reg = reg & ~(EHCI_PS_CLEAR | EHCI_PS_PP);
 		case USB_PORT_FEAT_C_CONNECTION:
-			reg |= EHCI_PS_CSC;
+			reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_CSC;
 			break;
 		case USB_PORT_FEAT_OVER_CURRENT:
-			reg |= EHCI_PS_OCC;
+			reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_OCC;
 			break;
 		case USB_PORT_FEAT_C_RESET:
 			portreset &= ~(1 << le16_to_cpu(req->index));
@@ -605,7 +627,9 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 			debug("unknown feature %x\n", le16_to_cpu(req->value));
 			goto unknown;
 		}
-		ehci_writel(&hcor->or_portsc[le16_to_cpu(req->index) - 1], reg);
+		ehci_writel(status_reg, reg);
+		/* unblock posted write */
+		ehci_readl(&hcor->or_usbcmd);
 		break;
 	default:
 		debug("Unknown request\n");
@@ -665,9 +689,11 @@ int usb_lowlevel_init(void)
 	reg = ehci_readl(&hccr->cr_hcsparams);
 	descriptor.hub.bNbrPorts = HCS_N_PORTS(reg);
 	printf("Register %x NbrPorts %d\n", reg, descriptor.hub.bNbrPorts);
-	if (reg & 0x10000)	/* Port Indicators */
+	/* Port Indicators */
+	if (HCS_INDICATOR(reg))
 		descriptor.hub.wHubCharacteristics |= 0x80;
-	if (reg & 0x10)		/* Port Power Control */
+	/* Port Power Control */
+	if (HCS_PPC(reg))
 		descriptor.hub.wHubCharacteristics |= 0x01;
 
 	/* Start the host controller. */
@@ -682,9 +708,11 @@ int usb_lowlevel_init(void)
 	cmd = ehci_readl(&hcor->or_configflag);
 	cmd |= FLAG_CF;
 	ehci_writel(&hcor->or_configflag, cmd);
-	/* unblock posted writes */
+	/* unblock posted write */
 	cmd = ehci_readl(&hcor->or_usbcmd);
 	wait_ms(5);
+	reg = HC_VERSION(ehci_readl(&hccr->cr_capbase));
+	printf("USB EHCI %x.%02x\n", reg >> 8, reg & 0xff);
 
 	rootdev = 0;
 
-- 
1.5.6.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware
  2008-12-12 10:00 [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware Michael Trimarchi
@ 2008-12-12 10:19 ` Jean-Christophe PLAGNIOL-VILLARD
  2008-12-12 10:35   ` michael
  2008-12-12 10:39   ` Stefan Roese
  0 siblings, 2 replies; 6+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2008-12-12 10:19 UTC (permalink / raw)
  To: u-boot

On 11:00 Fri 12 Dec     , Michael Trimarchi wrote:
> EHCI fix code and ixp4xx test.
> USB ehci configuration parameter:
> 
> #define CONFIG_CMD_USB          1
> #define CONFIG_USB_STORAGE      1
> #define CONFIG_USB_EHCI
> #define CONFIG_USB_EHCI_IXP4XX          1
> #define CONFIG_EHCI_IS_TDI              1
> #define CONFIG_EHCI_DESC_BIG_ENDIAN     1
> #define CONFIG_EHCI_MMIO_BIG_ENDIAN     1
> #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 2
> #define CONFIG_LEGACY_USB_INIT_SEQ      1
> 
> 2 USB Device(s) found
>        scanning bus for storage devices... 0 Storage Device(s) found
> => usb tree
> 
> Device Tree:
>   1  Hub (1.5MBit/s, 0mA)
>   |  u-boot EHCI Host Controller
>   |
>   |+-2  Mass Storage (12MBit/s, 100mA)
>        Sony Storage Media 0C07040930296
> 
> =>
> 
> Signed-off-by: Michael Trimarchi <trimarchimichael@yahoo.it>
> 
> ---
>  drivers/usb/usb_ehci.h      |   49 ++++++++++--------
>  drivers/usb/usb_ehci_core.c |  122 ++++++++++++++++++++++++++----------------
>  2 files changed, 102 insertions(+), 69 deletions(-)
> 
> diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
> index 90b137a..9e8e7b2 100644
> --- a/drivers/usb/usb_ehci.h
> +++ b/drivers/usb/usb_ehci.h
> @@ -1,5 +1,6 @@
>  /*-
>   * Copyright (c) 2007-2008, Juniper Networks, Inc.
> + * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
please remove you do not do enough modification to claim the copytight
>   * All rights reserved.
>   *
>   * This program is free software; you can redistribute it and/or
> @@ -21,6 +22,10 @@
>  #ifndef USB_EHCI_H
>  #define USB_EHCI_H
>  
> +#if !defined(CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS)
> +#error "USB EHCI define MAX_ROOT_PORTS"
> +#endif
I'll prefer this
#if !defined(CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS)
#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	2
#endif

other wise you must update everyone
> +
>  /* (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)
> @@ -45,10 +50,12 @@ struct ehci_hccr {
>  #define HC_LENGTH(p)		(((p) >> 0) & 0x00ff)
>  #define HC_VERSION(p)		(((p) >> 16) & 0xffff)
>  	uint32_t cr_hcsparams;
> +#define HCS_PPC(p)		((p) & (1 << 4))
> +#define HCS_INDICATOR(p)        ((p) & (1 << 16)) /* Port indicators */
			   ^^^^^^^^
whitespace please fix
>  #define HCS_N_PORTS(p)		(((p) >> 0) & 0xf)
>  	uint32_t cr_hccparams;
>  	uint8_t cr_hcsp_portrt[8];
> -};
> +} __attribute__ ((packed));
>  
>  struct ehci_hcor {
>  	uint32_t or_usbcmd;
> @@ -71,9 +78,9 @@ struct ehci_hcor {
>  	uint32_t _reserved_[9];
>  	uint32_t or_configflag;
>  #define FLAG_CF		(1 << 0)	/* true:  we'll support "high speed" */
> -	uint32_t or_portsc[2];
> +	uint32_t or_portsc[CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS];
>  	uint32_t or_systune;
> -};
> +} __attribute__ ((packed));
>  
>  #define USBMODE		0x68		/* USB Device mode */
>  #define USBMODE_SDIS	(1 << 3)	/* Stream disable */
> @@ -123,26 +130,24 @@ struct usb_linux_config_descriptor {
>  #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 */
> -#define EHCI_PS_PTC		0x000f0000	/* RW port test control */
> -#define EHCI_PS_PIC		0x0000c000	/* RW port indicator control */
> -#define EHCI_PS_PO		0x00002000	/* RW port owner */
> -#define EHCI_PS_PP		0x00001000	/* RW,RO port power */
> -#define EHCI_PS_LS		0x00000c00	/* RO line status */
> -#define EHCI_PS_PR		0x00000100	/* RW port reset */
> -#define EHCI_PS_SUSP		0x00000080	/* RW suspend */
> -#define EHCI_PS_FPR		0x00000040	/* RW force port resume */
> -#define EHCI_PS_OCC		0x00000020	/* RWC over current change */
> -#define EHCI_PS_OCA		0x00000010	/* RO over current active */
> -#define EHCI_PS_PEC		0x00000008	/* RWC port enable change */
> -#define EHCI_PS_PE		0x00000004	/* RW port enable */
> -#define EHCI_PS_CSC		0x00000002	/* RWC connect status change */
> -#define EHCI_PS_CS		0x00000001	/* RO connect status */
> +#define EHCI_PS_WKOC_E		(1 << 22)	/* RW wake on over current */
> +#define EHCI_PS_WKDSCNNT_E	(1 << 21)	/* RW wake on disconnect */
> +#define EHCI_PS_WKCNNT_E	(1 << 20)	/* RW wake on connect */
> +#define EHCI_PS_PO		(1 << 13)	/* RW port owner */
> +#define EHCI_PS_PP		(1 << 12)	/* RW,RO port power */
> +#define EHCI_PS_LS		(3 << 10)	/* RO line status */
> +#define EHCI_PS_PR		(1 << 8)	/* RW port reset */
> +#define EHCI_PS_SUSP		(1 << 7)	/* RW suspend */
> +#define EHCI_PS_FPR		(1 << 6)	/* RW force port resume */
> +#define EHCI_PS_OCC		(1 << 5)	/* RWC over current change */
> +#define EHCI_PS_OCA		(1 << 4)	/* RO over current active */
> +#define EHCI_PS_PEC		(1 << 3)	/* RWC port enable change */
> +#define EHCI_PS_PE		(1 << 2)	/* RW port enable */
> +#define EHCI_PS_CSC		(1 << 1)	/* RWC connect status change */
> +#define EHCI_PS_CS		(1 << 0)	/* RO connect status */
>  #define EHCI_PS_CLEAR		(EHCI_PS_OCC | EHCI_PS_PEC | EHCI_PS_CSC)
>  
> -#define EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == 0x00000400)
> +#define EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == (1 << 10))
IMHP It's personnal preference
>  
>  /*
>   * Schedule Interface Space.
> @@ -178,7 +183,7 @@ struct QH {
>  };
>  
>  /* Low level intit functions */
> -
>  int ehci_hcd_init(void);
>  int ehci_hcd_stop(void);
> +
ditto
>  #endif /* USB_EHCI_H */
> diff --git a/drivers/usb/usb_ehci_core.c b/drivers/usb/usb_ehci_core.c
> index ec50874..167867e 100644
> --- a/drivers/usb/usb_ehci_core.c
> +++ b/drivers/usb/usb_ehci_core.c
> @@ -1,6 +1,7 @@
>  /*-
>   * Copyright (c) 2007-2008, Juniper Networks, Inc.
>   * Copyright (c) 2008, Excito Elektronik i Sk?ne AB
> + * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
>   * All rights reserved.
>   *
>   * This program is free software; you can redistribute it and/or
> @@ -18,7 +19,6 @@
>   * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>   * MA 02111-1307 USA
>   */
> -#define DEBUG
>  #include <common.h>
>  #include <asm/byteorder.h>
>  #include <usb.h>
> @@ -99,6 +99,12 @@ static struct descriptor {
>  	},
>  };
>  
> +#if defined CONFIG_EHCI_IS_TDI
please use ifdef or if defined()
> +#define ehci_is_TDI()	1
> +#else
> +#define ehci_is_TDI()	0
> +#endif
please replace with (1) and (0)
> +

Best Regards,
J.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware
  2008-12-12 10:19 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2008-12-12 10:35   ` michael
  2008-12-12 10:39   ` Stefan Roese
  1 sibling, 0 replies; 6+ messages in thread
From: michael @ 2008-12-12 10:35 UTC (permalink / raw)
  To: u-boot

Hi,

Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 11:00 Fri 12 Dec     , Michael Trimarchi wrote:
>   
>> EHCI fix code and ixp4xx test.
>> USB ehci configuration parameter:
>>
>> #define CONFIG_CMD_USB          1
>> #define CONFIG_USB_STORAGE      1
>> #define CONFIG_USB_EHCI
>> #define CONFIG_USB_EHCI_IXP4XX          1
>> #define CONFIG_EHCI_IS_TDI              1
>> #define CONFIG_EHCI_DESC_BIG_ENDIAN     1
>> #define CONFIG_EHCI_MMIO_BIG_ENDIAN     1
>> #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 2
>> #define CONFIG_LEGACY_USB_INIT_SEQ      1
>>
>> 2 USB Device(s) found
>>        scanning bus for storage devices... 0 Storage Device(s) found
>> => usb tree
>>
>> Device Tree:
>>   1  Hub (1.5MBit/s, 0mA)
>>   |  u-boot EHCI Host Controller
>>   |
>>   |+-2  Mass Storage (12MBit/s, 100mA)
>>        Sony Storage Media 0C07040930296
>>
>> =>
>>
>> Signed-off-by: Michael Trimarchi <trimarchimichael@yahoo.it>
>>
>> ---
>>  drivers/usb/usb_ehci.h      |   49 ++++++++++--------
>>  drivers/usb/usb_ehci_core.c |  122 ++++++++++++++++++++++++++----------------
>>  2 files changed, 102 insertions(+), 69 deletions(-)
>>
>> diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
>> index 90b137a..9e8e7b2 100644
>> --- a/drivers/usb/usb_ehci.h
>> +++ b/drivers/usb/usb_ehci.h
>> @@ -1,5 +1,6 @@
>>  /*-
>>   * Copyright (c) 2007-2008, Juniper Networks, Inc.
>> + * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
>>     
> please remove you do not do enough modification to claim the copytight
>   
Ok, I do few changes before, but if you think that they aren't a lot, 
I'll remove it.
>>   * All rights reserved.
>>   *
>>   * This program is free software; you can redistribute it and/or
>> @@ -21,6 +22,10 @@
>>  #ifndef USB_EHCI_H
>>  #define USB_EHCI_H
>>  
>> +#if !defined(CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS)
>> +#error "USB EHCI define MAX_ROOT_PORTS"
>> +#endif
>>     
> I'll prefer this
> #if !defined(CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS)
> #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	2
> #endif
>
> other wise you must update everyone
>   
ok
>> +
>>  /* (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)
>> @@ -45,10 +50,12 @@ struct ehci_hccr {
>>  #define HC_LENGTH(p)		(((p) >> 0) & 0x00ff)
>>  #define HC_VERSION(p)		(((p) >> 16) & 0xffff)
>>  	uint32_t cr_hcsparams;
>> +#define HCS_PPC(p)		((p) & (1 << 4))
>> +#define HCS_INDICATOR(p)        ((p) & (1 << 16)) /* Port indicators */
>>     
> 			   ^^^^^^^^
> whitespace please fix
>   
ok

>>  #define HCS_N_PORTS(p)		(((p) >> 0) & 0xf)
>>  	uint32_t cr_hccparams;
>>  	uint8_t cr_hcsp_portrt[8];
>> -};
>> +} __attribute__ ((packed));
>>  
>>  struct ehci_hcor {
>>  	uint32_t or_usbcmd;
>> @@ -71,9 +78,9 @@ struct ehci_hcor {
>>  	uint32_t _reserved_[9];
>>  	uint32_t or_configflag;
>>  #define FLAG_CF		(1 << 0)	/* true:  we'll support "high speed" */
>> -	uint32_t or_portsc[2];
>> +	uint32_t or_portsc[CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS];
>>  	uint32_t or_systune;
>> -};
>> +} __attribute__ ((packed));
>>  
>>  #define USBMODE		0x68		/* USB Device mode */
>>  #define USBMODE_SDIS	(1 << 3)	/* Stream disable */
>> @@ -123,26 +130,24 @@ struct usb_linux_config_descriptor {
>>  #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 */
>> -#define EHCI_PS_PTC		0x000f0000	/* RW port test control */
>> -#define EHCI_PS_PIC		0x0000c000	/* RW port indicator control */
>> -#define EHCI_PS_PO		0x00002000	/* RW port owner */
>> -#define EHCI_PS_PP		0x00001000	/* RW,RO port power */
>> -#define EHCI_PS_LS		0x00000c00	/* RO line status */
>> -#define EHCI_PS_PR		0x00000100	/* RW port reset */
>> -#define EHCI_PS_SUSP		0x00000080	/* RW suspend */
>> -#define EHCI_PS_FPR		0x00000040	/* RW force port resume */
>> -#define EHCI_PS_OCC		0x00000020	/* RWC over current change */
>> -#define EHCI_PS_OCA		0x00000010	/* RO over current active */
>> -#define EHCI_PS_PEC		0x00000008	/* RWC port enable change */
>> -#define EHCI_PS_PE		0x00000004	/* RW port enable */
>> -#define EHCI_PS_CSC		0x00000002	/* RWC connect status change */
>> -#define EHCI_PS_CS		0x00000001	/* RO connect status */
>> +#define EHCI_PS_WKOC_E		(1 << 22)	/* RW wake on over current */
>> +#define EHCI_PS_WKDSCNNT_E	(1 << 21)	/* RW wake on disconnect */
>> +#define EHCI_PS_WKCNNT_E	(1 << 20)	/* RW wake on connect */
>> +#define EHCI_PS_PO		(1 << 13)	/* RW port owner */
>> +#define EHCI_PS_PP		(1 << 12)	/* RW,RO port power */
>> +#define EHCI_PS_LS		(3 << 10)	/* RO line status */
>> +#define EHCI_PS_PR		(1 << 8)	/* RW port reset */
>> +#define EHCI_PS_SUSP		(1 << 7)	/* RW suspend */
>> +#define EHCI_PS_FPR		(1 << 6)	/* RW force port resume */
>> +#define EHCI_PS_OCC		(1 << 5)	/* RWC over current change */
>> +#define EHCI_PS_OCA		(1 << 4)	/* RO over current active */
>> +#define EHCI_PS_PEC		(1 << 3)	/* RWC port enable change */
>> +#define EHCI_PS_PE		(1 << 2)	/* RW port enable */
>> +#define EHCI_PS_CSC		(1 << 1)	/* RWC connect status change */
>> +#define EHCI_PS_CS		(1 << 0)	/* RO connect status */
>>  #define EHCI_PS_CLEAR		(EHCI_PS_OCC | EHCI_PS_PEC | EHCI_PS_CSC)
>>  
>> -#define EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == 0x00000400)
>> +#define EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == (1 << 10))
>>     
> IMHP It's personnal preference
>   
I think that it is more readable.
>>  
>>  /*
>>   * Schedule Interface Space.
>> @@ -178,7 +183,7 @@ struct QH {
>>  };
>>  
>>  /* Low level intit functions */
>> -
>>  int ehci_hcd_init(void);
>>  int ehci_hcd_stop(void);
>> +
>>     
> ditto
>   
ok
>>  #endif /* USB_EHCI_H */
>> diff --git a/drivers/usb/usb_ehci_core.c b/drivers/usb/usb_ehci_core.c
>> index ec50874..167867e 100644
>> --- a/drivers/usb/usb_ehci_core.c
>> +++ b/drivers/usb/usb_ehci_core.c
>> @@ -1,6 +1,7 @@
>>  /*-
>>   * Copyright (c) 2007-2008, Juniper Networks, Inc.
>>   * Copyright (c) 2008, Excito Elektronik i Sk?ne AB
>> + * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
>>   * All rights reserved.
>>   *
>>   * This program is free software; you can redistribute it and/or
>> @@ -18,7 +19,6 @@
>>   * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>   * MA 02111-1307 USA
>>   */
>> -#define DEBUG
>>  #include <common.h>
>>  #include <asm/byteorder.h>
>>  #include <usb.h>
>> @@ -99,6 +99,12 @@ static struct descriptor {
>>  	},
>>  };
>>  
>> +#if defined CONFIG_EHCI_IS_TDI
>>     
> please use ifdef or if defined()
>   
>> +#define ehci_is_TDI()	1
>> +#else
>> +#define ehci_is_TDI()	0
>> +#endif
>>     
> please replace with (1) and (0)
>   
>> +
>>     
>
> Best Regards,
> J.
>
>   
I send another version with your comment fixed.

Regards Michael

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware
  2008-12-12 10:19 ` Jean-Christophe PLAGNIOL-VILLARD
  2008-12-12 10:35   ` michael
@ 2008-12-12 10:39   ` Stefan Roese
  2008-12-12 10:42     ` [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx?hardware Jean-Christophe PLAGNIOL-VILLARD
  2008-12-12 11:40     ` [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware Remy Bohmer
  1 sibling, 2 replies; 6+ messages in thread
From: Stefan Roese @ 2008-12-12 10:39 UTC (permalink / raw)
  To: u-boot

On Friday 12 December 2008, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 11:00 Fri 12 Dec     , Michael Trimarchi wrote:

<snip>

> > diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
> > index 90b137a..9e8e7b2 100644
> > --- a/drivers/usb/usb_ehci.h
> > +++ b/drivers/usb/usb_ehci.h
> > @@ -1,5 +1,6 @@
> >  /*-
> >   * Copyright (c) 2007-2008, Juniper Networks, Inc.
> > + * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
>
> please remove you do not do enough modification to claim the copytight

Jean-Christophe, did you follow Michael's EHCI patches from the last days? He 
did quite a lot of work in this driver (e.g. big endian support etc). 
Definitely enough for adding his Copyright here from my point of view.

Best regards,
Stefan

=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx?hardware
  2008-12-12 10:39   ` Stefan Roese
@ 2008-12-12 10:42     ` Jean-Christophe PLAGNIOL-VILLARD
  2008-12-12 11:40     ` [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware Remy Bohmer
  1 sibling, 0 replies; 6+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2008-12-12 10:42 UTC (permalink / raw)
  To: u-boot

On 11:39 Fri 12 Dec     , Stefan Roese wrote:
> On Friday 12 December 2008, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 11:00 Fri 12 Dec     , Michael Trimarchi wrote:
> 
> <snip>
> 
> > > diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
> > > index 90b137a..9e8e7b2 100644
> > > --- a/drivers/usb/usb_ehci.h
> > > +++ b/drivers/usb/usb_ehci.h
> > > @@ -1,5 +1,6 @@
> > >  /*-
> > >   * Copyright (c) 2007-2008, Juniper Networks, Inc.
> > > + * Copyright (c) 2008, Michael Trimarchi <trimarchimichael@yahoo.it>
> >
> > please remove you do not do enough modification to claim the copytight
> 
> Jean-Christophe, did you follow Michael's EHCI patches from the last days? He 
not too much sorry I've seen after his e-mail
I've miss the Author due different e-amil name "Michael" somtimes and full
namy otherwise
> did quite a lot of work in this driver (e.g. big endian support etc). 
> Definitely enough for adding his Copyright here from my point of view.
sure

Best Regards,
J.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware
  2008-12-12 10:39   ` Stefan Roese
  2008-12-12 10:42     ` [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx?hardware Jean-Christophe PLAGNIOL-VILLARD
@ 2008-12-12 11:40     ` Remy Bohmer
  1 sibling, 0 replies; 6+ messages in thread
From: Remy Bohmer @ 2008-12-12 11:40 UTC (permalink / raw)
  To: u-boot

Hello All,

>> please remove you do not do enough modification to claim the copytight
> Jean-Christophe, did you follow Michael's EHCI patches from the last days? He
> did quite a lot of work in this driver (e.g. big endian support etc).
> Definitely enough for adding his Copyright here from my point of view.

I agree on this with Stefan.

Kind Regards,

Remy

>
> Best regards,
> Stefan
>
> =====================================================================
> DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de
> =====================================================================
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-12-12 11:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-12 10:00 [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware Michael Trimarchi
2008-12-12 10:19 ` Jean-Christophe PLAGNIOL-VILLARD
2008-12-12 10:35   ` michael
2008-12-12 10:39   ` Stefan Roese
2008-12-12 10:42     ` [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx?hardware Jean-Christophe PLAGNIOL-VILLARD
2008-12-12 11:40     ` [U-Boot] [RFC USB PATCH] USB ehci fix and test on ixp4xx hardware Remy Bohmer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox