Skip to contentSkip to conversation

OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

PATCH Superseded Vaibhav Hiremath 3 participants 7 messages Jan 25, 2011 – Jan 29, 2011

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal to ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/[email protected]/msg35784.html

---
Since Kevin reported that this patch doesn't get applied cleanly, so I am reposting it again after making sure that it gets applied cleanly.

 arch/arm/mach-omap2/board-omap3evm.c |   39 +++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)
arch/arm/mach-omap2/board-omap3evm.c +38 -1
index 323c380..97e0f65 100644
@@ -58,6 +58,13 @@
 #define OMAP3EVM_ETHR_ID_REV	0x50
 #define OMAP3EVM_ETHR_GPIO_IRQ	176
 #define OMAP3EVM_SMSC911X_CS	5
+/*
+ * Eth Reset signal
+ *	64 = Generation 1 (<=RevD)
+ *	7 = Generation 2 (>=RevE)
+ */
+#define OMAP3EVM_GEN1_ETHR_GPIO_RST	64
+#define OMAP3EVM_GEN2_ETHR_GPIO_RST	7
 
 static u8 omap3_evm_version;
 
@@ -124,10 +131,15 @@ static struct platform_device omap3evm_smsc911x_device = {
 
 static inline void __init omap3evm_init_smsc911x(void)
 {
-	int eth_cs;
+	int eth_cs, eth_rst;
 	struct clk *l3ck;
 	unsigned int rate;
 
+	if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
+		eth_rst = OMAP3EVM_GEN1_ETHR_GPIO_RST;
+	else
+		eth_rst = OMAP3EVM_GEN2_ETHR_GPIO_RST;
+
 	eth_cs = OMAP3EVM_SMSC911X_CS;
 
 	l3ck = clk_get(NULL, "l3_ck");
@@ -136,6 +148,27 @@ static inline void __init omap3evm_init_smsc911x(void)
 	else
 		rate = clk_get_rate(l3ck);
 
+	/* Configure ethernet controller reset gpio */
+	if (cpu_is_omap3430()) {
+		if (gpio_request(eth_rst, "SMSC911x gpio") < 0) {
+			pr_err(KERN_ERR "Failed to request %d for smsc911x\n",
+					eth_rst);
+			return;
+		}
+
+		if (gpio_direction_output(eth_rst, 1) < 0) {
+			pr_err(KERN_ERR "Failed to set direction of %d for" \
+					" smsc911x\n", eth_rst);
+			return;
+		}
+		/* reset pulse to ethernet controller*/
+		usleep_range(150, 220);
+		gpio_set_value(eth_rst, 0);
+		usleep_range(150, 220);
+		gpio_set_value(eth_rst, 1);
+		usleep_range(1, 2);
+	}
+
 	if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMSC911x irq") < 0) {
 		printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
 			OMAP3EVM_ETHR_GPIO_IRQ);
@@ -658,6 +691,10 @@ static struct omap_board_mux board_mux[] __initdata = {
 				OMAP_PIN_OFF_WAKEUPENABLE),
 	OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
 				OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_OUTPUT_LOW),
+	OMAP3_MUX(SYS_BOOT5, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+				OMAP_PIN_OFF_NONE),
+	OMAP3_MUX(GPMC_WAIT2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+				OMAP_PIN_OFF_NONE),
 	{ .reg_offset = OMAP_MUX_TERMINATOR },
 };
 #endif

--
1.6.2.4

#1 lore raw

PATCH v2 1/1 OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

Quoted 19 lines

-----Original Message-----
From: Hiremath, Vaibhav
Sent: Tuesday, January 25, 2011 8:53 PM
To: linux-omap at vger.kernel.org
Cc: Hiremath, Vaibhav; Varadarajan, Charulatha
Subject: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal to ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg35784.html

Quoted 7 lines

---
Since Kevin reported that this patch doesn't get applied cleanly, so I am reposting it again after making sure that it gets applied cleanly.

[Hiremath, Vaibhav] Oops, missed linux-arm-kernel list, adding here.

Not sure whether I need to repost keeping linux-arm-kernel?

Thanks,
Vaibhav

Quoted 85 lines
 arch/arm/mach-omap2/board-omap3evm.c |   39
+++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)
arch/arm/mach- renamed from arch/arm/mach-omap2/board-omap3evm.c +0 -0

omap2/board-omap3evm.c
index 323c380..97e0f65 100644

arch/arm/mach-omap2/board-omap3evm.c +13 -1
@@ -58,6 +58,13 @@
 #define OMAP3EVM_ETHR_ID_REV	0x50
 #define OMAP3EVM_ETHR_GPIO_IRQ	176
 #define OMAP3EVM_SMSC911X_CS	5
+/*
+ * Eth Reset signal
+ *	64 = Generation 1 (<=RevD)
+ *	7 = Generation 2 (>=RevE)
+ */
+#define OMAP3EVM_GEN1_ETHR_GPIO_RST	64
+#define OMAP3EVM_GEN2_ETHR_GPIO_RST	7
 
 static u8 omap3_evm_version;
 
@@ -124,10 +131,15 @@ static struct platform_device
 omap3evm_smsc911x_device = {
 
 static inline void __init omap3evm_init_smsc911x(void)
 {
-	int eth_cs;
+	int eth_cs, eth_rst;
 	struct clk *l3ck;
 	unsigned int rate;
 
+	if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
+		eth_rst = OMAP3EVM_GEN1_ETHR_GPIO_RST;
+	else
+		eth_rst = OMAP3EVM_GEN2_ETHR_GPIO_RST;
+
 	eth_cs = OMAP3EVM_SMSC911X_CS;
 
arch/arm/mach-omap2/board-omap3evm.c +21 -0
 	l3ck = clk_get(NULL, "l3_ck");
@@ -136,6 +148,27 @@ static inline void __init
 omap3evm_init_smsc911x(void)
 	else
 		rate = clk_get_rate(l3ck);
 
+	/* Configure ethernet controller reset gpio */
+	if (cpu_is_omap3430()) {
+		if (gpio_request(eth_rst, "SMSC911x gpio") < 0) {
+			pr_err(KERN_ERR "Failed to request %d for smsc911x\n",
+					eth_rst);
+			return;
+		}
+
+		if (gpio_direction_output(eth_rst, 1) < 0) {
+			pr_err(KERN_ERR "Failed to set direction of %d for" \
+					" smsc911x\n", eth_rst);
+			return;
+		}
+		/* reset pulse to ethernet controller*/
+		usleep_range(150, 220);
+		gpio_set_value(eth_rst, 0);
+		usleep_range(150, 220);
+		gpio_set_value(eth_rst, 1);
+		usleep_range(1, 2);
+	}
+
 	if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMSC911x irq") < 0) {
 		printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
arch/arm/mach-omap2/board-omap3evm.c +4 -0
 			OMAP3EVM_ETHR_GPIO_IRQ);
@@ -658,6 +691,10 @@ static struct omap_board_mux board_mux[] __initdata =
 {
 				OMAP_PIN_OFF_WAKEUPENABLE),
 	OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
 				OMAP_PIN_OFF_INPUT_PULLUP |
 OMAP_PIN_OFF_OUTPUT_LOW),
+	OMAP3_MUX(SYS_BOOT5, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+				OMAP_PIN_OFF_NONE),
+	OMAP3_MUX(GPMC_WAIT2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+				OMAP_PIN_OFF_NONE),
 	{ .reg_offset = OMAP_MUX_TERMINATOR },

};
#endif
--
1.6.2.4

#2 lore raw

PATCH v2 1/1 OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

Hello,

Quoted 10 lines
Quoted 10 lines

Subject: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal to ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

Quoted 6 lines
Quoted 6 lines

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg35784.html

Out of interest - have you tried this network chip (smsc9118) in an SMP environment [is it on OMAP4?]? On the Versatile Express it's quite easy to get it to `lock up'. It claims to be servicing interrupts but you certainly don't get any useful packets. and ifdown/ifup brings it back to life again.

I took a brief look at the driver and found a few issues there:

1.) Read-after-read and read-after-write minimum delays aren't respected 2.) The locking is too low-level (it's around the register accessors) so
there is plenty of scope for deadlock if a calling function holds some other locks too.
3.) FIFO fastforwarding uses the word count instead of the byte count. 4.) Bit 20 of the HW_CFG register apparently always needs to be asserted,
but it's 0 out of reset (who knows what they were thinking?!).

I tried to resolve these problems (admittedly as a quick bit of hacking) but the issue persists.

Anyway, it would just be nice to know if anybody else has seen problems with this chip/driver because it makes the Versatile Express pretty much useless as a remote box.

Will

#3 lore raw
In reply to Hiremath, Vaibhav

Hello,

Quoted 10 lines
Quoted 10 lines

Subject: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal to ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

Quoted 6 lines
Quoted 6 lines

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/[email protected]/msg35784.html

Out of interest - have you tried this network chip (smsc9118) in an SMP environment [is it on OMAP4?]? On the Versatile Express it's quite easy to get it to `lock up'. It claims to be servicing interrupts but you certainly don't get any useful packets. and ifdown/ifup brings it back to life again.

I took a brief look at the driver and found a few issues there:

1.) Read-after-read and read-after-write minimum delays aren't respected 2.) The locking is too low-level (it's around the register accessors) so
there is plenty of scope for deadlock if a calling function holds some other locks too.
3.) FIFO fastforwarding uses the word count instead of the byte count. 4.) Bit 20 of the HW_CFG register apparently always needs to be asserted,
but it's 0 out of reset (who knows what they were thinking?!).

I tried to resolve these problems (admittedly as a quick bit of hacking) but the issue persists.

Anyway, it would just be nice to know if anybody else has seen problems with this chip/driver because it makes the Versatile Express pretty much useless as a remote box.

Will

#4 lore raw

PATCH v2 1/1 OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

In reply to Hiremath, Vaibhav
Quoted 25 lines · Vaibhav
Quoted 18 lines

-----Original Message-----
From: Hiremath, Vaibhav
Sent: Tuesday, January 25, 2011 8:53 PM
To: linux-omap at vger.kernel.org
Cc: Hiremath, Vaibhav; Varadarajan, Charulatha
Subject: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal to ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg35784.html

Quoted 7 lines

---
Since Kevin reported that this patch doesn't get applied cleanly, so I am reposting it again after making sure that it gets applied cleanly.

Quoted 3 lines

[Hiremath, Vaibhav] Oops, missed linux-arm-kernel list, adding here.

Not sure whether I need to repost keeping linux-arm-kernel?

Yes, please repost.

Kevin

Quoted 91 lines
Quoted 82 lines
 arch/arm/mach-omap2/board-omap3evm.c |   39
+++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)
arch/arm/mach- renamed from arch/arm/mach-omap2/board-omap3evm.c +0 -0

omap2/board-omap3evm.c
index 323c380..97e0f65 100644

arch/arm/mach-omap2/board-omap3evm.c +13 -1
@@ -58,6 +58,13 @@
 #define OMAP3EVM_ETHR_ID_REV	0x50
 #define OMAP3EVM_ETHR_GPIO_IRQ	176
 #define OMAP3EVM_SMSC911X_CS	5
+/*
+ * Eth Reset signal
+ *	64 = Generation 1 (<=RevD)
+ *	7 = Generation 2 (>=RevE)
+ */
+#define OMAP3EVM_GEN1_ETHR_GPIO_RST	64
+#define OMAP3EVM_GEN2_ETHR_GPIO_RST	7
 
 static u8 omap3_evm_version;
 
@@ -124,10 +131,15 @@ static struct platform_device
 omap3evm_smsc911x_device = {
 
 static inline void __init omap3evm_init_smsc911x(void)
 {
-	int eth_cs;
+	int eth_cs, eth_rst;
 	struct clk *l3ck;
 	unsigned int rate;
 
+	if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
+		eth_rst = OMAP3EVM_GEN1_ETHR_GPIO_RST;
+	else
+		eth_rst = OMAP3EVM_GEN2_ETHR_GPIO_RST;
+
 	eth_cs = OMAP3EVM_SMSC911X_CS;
 
arch/arm/mach-omap2/board-omap3evm.c +21 -0
 	l3ck = clk_get(NULL, "l3_ck");
@@ -136,6 +148,27 @@ static inline void __init
 omap3evm_init_smsc911x(void)
 	else
 		rate = clk_get_rate(l3ck);
 
+	/* Configure ethernet controller reset gpio */
+	if (cpu_is_omap3430()) {
+		if (gpio_request(eth_rst, "SMSC911x gpio") < 0) {
+			pr_err(KERN_ERR "Failed to request %d for smsc911x\n",
+					eth_rst);
+			return;
+		}
+
+		if (gpio_direction_output(eth_rst, 1) < 0) {
+			pr_err(KERN_ERR "Failed to set direction of %d for" \
+					" smsc911x\n", eth_rst);
+			return;
+		}
+		/* reset pulse to ethernet controller*/
+		usleep_range(150, 220);
+		gpio_set_value(eth_rst, 0);
+		usleep_range(150, 220);
+		gpio_set_value(eth_rst, 1);
+		usleep_range(1, 2);
+	}
+
 	if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMSC911x irq") < 0) {
 		printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
arch/arm/mach-omap2/board-omap3evm.c +4 -0
 			OMAP3EVM_ETHR_GPIO_IRQ);
@@ -658,6 +691,10 @@ static struct omap_board_mux board_mux[] __initdata =
 {
 				OMAP_PIN_OFF_WAKEUPENABLE),
 	OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
 				OMAP_PIN_OFF_INPUT_PULLUP |
 OMAP_PIN_OFF_OUTPUT_LOW),
+	OMAP3_MUX(SYS_BOOT5, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+				OMAP_PIN_OFF_NONE),
+	OMAP3_MUX(GPMC_WAIT2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+				OMAP_PIN_OFF_NONE),
 	{ .reg_offset = OMAP_MUX_TERMINATOR },
Quoted 4 lines

};
#endif
--
1.6.2.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw

PATCH v2 1/1 OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

In reply to Hiremath, Vaibhav
Quoted 25 lines · Vaibhav
Quoted 18 lines

-----Original Message-----
From: Hiremath, Vaibhav
Sent: Tuesday, January 25, 2011 8:53 PM
To: linux-omap at vger.kernel.org
Cc: Hiremath, Vaibhav; Varadarajan, Charulatha
Subject: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal to ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg35784.html

Quoted 7 lines

---
Since Kevin reported that this patch doesn't get applied cleanly, so I am reposting it again after making sure that it gets applied cleanly.

Quoted 4 lines

[Hiremath, Vaibhav] Oops, missed linux-arm-kernel list, adding here.

Not sure whether I need to repost keeping linux-arm-kernel?

Also, did you post the smc911x driver fix yet that is needed for testing with newer kernels?

Kevin

#6 lore raw

PATCH v2 1/1 OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

Quoted 40 lines

-----Original Message-----
From: Hilman, Kevin
Sent: Friday, January 28, 2011 1:38 AM
To: Hiremath, Vaibhav
Cc: linux-omap at vger.kernel.org; Varadarajan, Charulatha; linux-arm- kernel at lists.infradead.org
Subject: Re: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet controller in board_init

Quoted 6 lines · Vaibhav
Quoted 6 lines

-----Original Message-----
From: Hiremath, Vaibhav
Sent: Tuesday, January 25, 2011 8:53 PM
To: linux-omap at vger.kernel.org
Cc: Hiremath, Vaibhav; Varadarajan, Charulatha
Subject: [PATCH-V2] OMAP3EVM:FIX: Reset the smsc911x ethernet

controller

Quoted 4 lines
Quoted 4 lines

in board_init

With addition of hwmod support to gpio, the ethernet controller goes undetected for OMAP35xEVM. So explicitly assert the reset signal

to

Quoted 5 lines
Quoted 5 lines

ethernet controller smsc911x -

- GPIO7 (>=RevG version of EVM's)
- GPIO64 (<=RevD version of EVM's)

Quoted 9 lines
Quoted 9 lines

This patch is based on intial version from Charulatha V, reference to original discussion -
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg35784.html

---
Since Kevin reported that this patch doesn't get applied cleanly, so I am reposting it again after making sure that it gets applied

cleanly.

Quoted 1 line
Quoted 1 line
Quoted 8 lines
Quoted 4 lines

[Hiremath, Vaibhav] Oops, missed linux-arm-kernel list, adding here.

Not sure whether I need to repost keeping linux-arm-kernel?

Also, did you post the smc911x driver fix yet that is needed for testing with newer kernels?

[Hiremath, Vaibhav] Not yet. Got completely loaded with some high priority issues. I will try to post it sometime this week.

Thanks,
Vaibhav

Quoted 1 line

Kevin