net/fec on i.MX28: promiscuous mode lost after reconnecting network cable
Subsystems (3)
Hello,
i'm using a i.MX28 custom board (I2SE Duckbill) with 2 different Ethernet interfaces. Both interfaces should be used as bridge using bridge utils. One Ethernet interface is the buildin fec and the other is connect by spi. The board runs under Linux mainline 3.10. But the following problem still occurs on 3.14-rc4.
Here is the problem, if i disconnect and reconnect the Ethernet cable on the buildin fec (eth0), the bridge says the port comes up, but it doesn't work. After that any traffic to the fec is okay, but traffic "through" the bridge is lost. But i expect no traffic is lost, after reconnect the network cable.
If i reset the board without disconnecting the cables, the traffic "through" the bridge works. If i force the promiscuous mode on the fec (eth0) after the reconnect, the bridge works too:
ifconfig eth0 promisc
After that, i made some research and probably found the cause of the problem. In the case that the bridge works (link state connected since reboot) the register HW_ENET_MAC_RCR of the i.MX28 returns 0x45EE011C (PROM=1, promiscuous mode on). Then I disconnect the ethernet cable and reconnect it. After that the register returns 0x45EE0114 (PROM=0, promiscuous mode off) and the bridge doesn't work.
Based on this information, i created a patch against Linux 3.10. I'm not sure it's a good solution but it works. After a fec reset all register values of HW_ENET_MAC_RCR must be restored, but fec_restart do not handle them at all. So set_multicast_list is called after fec_restart to restore the promiscuous mode of the fec.
drivers/net/ethernet/freescale/fec_main.c +2 -1
@@ -1063,6 +1063,8 @@ static void fec_get_mac(struct net_device *ndev)/* ------------------------------------------------------------------------- */ +static void set_multicast_list(struct net_device *ndev); +/* * Phy section
*/
@@ -1093,8 +1095,10 @@ static void fec_enet_adjust_link(struct net_device *ndev)
}
/* if any of the above changed restart the FEC */
- if (status_change)
+ if (status_change) {
fec_restart(ndev, phy_dev->duplex);
+ set_multicast_list(ndev);
+ }
} else {
if (fep->link) {
fec_stop(ndev);Is this solution correct?
Do you need more information?
Best regards
Stefan Wahren
Adding some more folks on Cc.
Quoted 71 lines · Stefan Wahren
Hello,
i'm using a i.MX28 custom board (I2SE Duckbill) with 2 different Ethernet interfaces. Both interfaces should be used as bridge using bridge utils. One Ethernet interface is the buildin fec and the other is connect by spi. The board runs under Linux mainline 3.10. But the following problem still occurs on 3.14-rc4.
Here is the problem, if i disconnect and reconnect the Ethernet cable on the buildin fec (eth0), the bridge says the port comes up, but it doesn't work. After that any traffic to the fec is okay, but traffic "through" the bridge is lost. But i expect no traffic is lost, after reconnect the network cable.
If i reset the board without disconnecting the cables, the traffic "through" the bridge works. If i force the promiscuous mode on the fec (eth0) after the reconnect, the bridge works too:
ifconfig eth0 promisc
After that, i made some research and probably found the cause of the problem. In the case that the bridge works (link state connected since reboot) the register
HW_ENET_MAC_RCRof the i.MX28 returns0x45EE011C(PROM=1, promiscuous mode on). Then I disconnect the ethernet cable and reconnect it. After that the register returns0x45EE0114(PROM=0, promiscuous mode off) and the bridge doesn't work.Based on this information, i created a patch against Linux 3.10. I'm not sure it's a good solution but it works. After a fec reset all register values of
HW_ENET_MAC_RCRmust be restored, butfec_restartdo not handle them at all. Soset_multicast_listis called afterfec_restartto restore the promiscuous mode of the fec.drivers/net/ethernet/freescale/fec_main.c +5
-2@@ -1063,6 +1063,8 @@ static void fec_get_mac(struct net_device *ndev)/* ------------------------------------------------------------------------- */ +static void set_multicast_list(struct net_device *ndev); +/* * Phy section */ @@ -1093,8 +1095,10 @@ static void fec_enet_adjust_link(struct net_device *ndev) }/* if any of the above changed restart the FEC */ -if (status_change) +if (status_change) {fec_restart (ndev, phy_dev->duplex); +set_multicast_list (ndev); + } }else {if (fep->link) {fec_stop(ndev);Is this solution correct?
Do you need more information?
Best regards
Stefan Wahren
--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 64 lines · Fabio Estevam
Adding some more folks on Cc.
Quoted 61 lines · Stefan Wahren
Hello,
i'm using a i.MX28 custom board (I2SE Duckbill) with 2 different Ethernet interfaces. Both interfaces should be used as bridge using bridge utils. One Ethernet interface is the buildin fec and the other is connect by spi. The board runs under Linux mainline 3.10. But the following problem still occurs on 3.14-rc4.
Here is the problem, if i disconnect and reconnect the Ethernet cable on the buildin fec (eth0), the bridge says the port comes up, but it doesn't work. After that any traffic to the fec is okay, but traffic "through" the bridge is lost. But i expect no traffic is lost, after reconnect the network cable.
If i reset the board without disconnecting the cables, the traffic "through" the bridge works. If i force the promiscuous mode on the fec (eth0) after the reconnect, the bridge works too:
ifconfig eth0 promisc
After that, i made some research and probably found the cause of the problem. In the case that the bridge works (link state connected since reboot) the register
HW_ENET_MAC_RCRof the i.MX28 returns0x45EE011C(PROM=1, promiscuous mode on). Then I disconnect the ethernet cable and reconnect it. After that the register returns0x45EE0114(PROM=0, promiscuous mode off) and the bridge doesn't work.Based on this information, i created a patch against Linux 3.10. I'm not sure it's a good solution but it works. After a fec reset all register values of
HW_ENET_MAC_RCRmust be restored, butfec_restartdo not handle them at all. Soset_multicast_listis called afterfec_restartto restore the promiscuous mode of the fec.drivers/net/ethernet/freescale/fec_main.c +5
-2@@ -1063,6 +1063,8 @@ static void fec_get_mac(struct net_device *ndev)/* ------------------------------------------------------------------------- */ +static void set_multicast_list(struct net_device *ndev); +/* * Phy section */ @@ -1093,8 +1095,10 @@ static void fec_enet_adjust_link(struct net_device *ndev) }/* if any of the above changed restart the FEC */ -if (status_change) +if (status_change) {fec_restart (ndev, phy_dev->duplex); +set_multicast_list (ndev); + } }else {if (fep->link) {fec_stop(ndev);
Quoted 1 line
Quoted 1 line
Is this solution correct?
There are many places to call fec_resart.
I suggest call set_multicase_list in fec_restart function.
Quoted 13 lines
Quoted 9 lines
Do you need more information?
Best regards
Stefan Wahren
--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Frank Li <[email protected]>
Data: Friday, March 07, 2014 1:43 AM
Quoted 78 lines
To: Fabio Estevam
Cc: Stefan Wahren; David Miller; [email protected]; linux-arm- [email protected]; Shawn Guo; Estevam Fabio-R49496; Li Frank-B20596; Duan Fugang-B38611; Sascha Hauer
Subject: Re: [Bug] net/fec on i.MX28: promiscuous mode lost after reconnecting network cableQuoted 13 lines · Fabio Estevam
Adding some more folks on Cc.
Quoted 10 lines · Stefan Wahren
Hello,
i'm using a i.MX28 custom board (I2SE Duckbill) with 2 different Ethernet interfaces. Both interfaces should be used as bridge using bridge utils. One Ethernet interface is the buildin fec and the other is connect by spi. The board runs under Linux mainline 3.10. But the following problem still occurs on 3.14-rc4.
Here is the problem, if i disconnect and reconnect the Ethernet cable on the buildin fec (eth0), the bridge says the port comes up, but it doesn't
work.
Quoted 2 lines
Quoted 2 lines
After that any traffic to the fec is okay, but traffic "through" the bridge is lost. But i expect no traffic is lost, after reconnect the network
cable.
Quoted 53 lines
Quoted 53 lines
If i reset the board without disconnecting the cables, the traffic "through" the bridge works. If i force the promiscuous mode on the fec (eth0) after the reconnect, the bridge works too:
ifconfig eth0 promisc
After that, i made some research and probably found the cause of the problem. In the case that the bridge works (link state connected since
reboot) the registerHW_ENET_MAC_RCRof the i.MX28 returns0x45EE011C(PROM=1, promiscuous mode on). Then I disconnect the ethernet cable and reconnect it. After that the register returns0x45EE0114(PROM=0, promiscuous mode off) and the bridge doesn't work.Based on this information, i created a patch against Linux 3.10. I'm not sure it's a good solution but it works. After a fec reset all register values of
HW_ENET_MAC_RCRmust be restored, butfec_restartdo not handle them at all. Soset_multicast_listis called afterfec_restartto restore the promiscuous mode of the fec.drivers/net/ethernet/freescale/fec_main.c +2
-2@@ -1063,6 +1063,8 @@ static void fec_get_mac(struct net_device *ndev)/* --------------------------------------------------------------------- ---- */ +static void set_multicast_list(struct net_device *ndev); +/* * Phy section */ @@ -1093,8 +1095,10 @@ static void fec_enet_adjust_link(struct
net_device
*ndev)} /* if any of the above changed restart the FEC */drivers/net/ethernet/freescale/fec_main.c +3
-1-if (status_change) +if (status_change) {fec_restart (ndev, phy_dev->duplex); +set_multicast_list (ndev); + } }else {if (fep->link) {fec_stop (ndev);
Quoted 5 lines
Quoted 1 line
Quoted 1 line
Is this solution correct?
There are many places to call
fec_resart.
I suggest callset_multicase_listinfec_restartfunction.
Yes, we had called set_multicase_list() in fec_restart() function. The patch is redundant.
Quoted 14 lines
Quoted 13 lines
Quoted 9 lines
Do you need more information?
Best regards
Stefan Wahren
--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi,
Am 07.03.2014 03:10, schrieb [email protected]:
Quoted 80 lines
From: Frank Li <[email protected]>
Data: Friday, March 07, 2014 1:43 AMQuoted 77 lines
To: Fabio Estevam
Cc: Stefan Wahren; David Miller; [email protected]; linux-arm- [email protected]; Shawn Guo; Estevam Fabio-R49496; Li Frank-B20596; Duan Fugang-B38611; Sascha Hauer
Subject: Re: [Bug] net/fec on i.MX28: promiscuous mode lost after reconnecting network cableQuoted 13 lines · Fabio Estevam
Adding some more folks on Cc.
Quoted 10 lines · Stefan Wahren
Hello,
i'm using a i.MX28 custom board (I2SE Duckbill) with 2 different Ethernet interfaces. Both interfaces should be used as bridge using bridge utils. One Ethernet interface is the buildin fec and the other is connect by spi. The board runs under Linux mainline 3.10. But the following problem still occurs on 3.14-rc4.
Here is the problem, if i disconnect and reconnect the Ethernet cable on the buildin fec (eth0), the bridge says the port comes up, but it doesn't
work.
Quoted 2 lines
Quoted 2 lines
After that any traffic to the fec is okay, but traffic "through" the bridge is lost. But i expect no traffic is lost, after reconnect the network
cable.
Quoted 52 lines
Quoted 52 lines
If i reset the board without disconnecting the cables, the traffic "through" the bridge works. If i force the promiscuous mode on the fec (eth0) after the reconnect, the bridge works too:
ifconfig eth0 promisc
After that, i made some research and probably found the cause of the problem. In the case that the bridge works (link state connected since
reboot) the registerHW_ENET_MAC_RCRof the i.MX28 returns0x45EE011C(PROM=1, promiscuous mode on). Then I disconnect the ethernet cable and reconnect it. After that the register returns0x45EE0114(PROM=0, promiscuous mode off) and the bridge doesn't work.Based on this information, i created a patch against Linux 3.10. I'm not sure it's a good solution but it works. After a fec reset all register values of
HW_ENET_MAC_RCRmust be restored, butfec_restartdo not handle them at all. Soset_multicast_listis called afterfec_restartto restore the promiscuous mode of the fec.drivers/net/ethernet/freescale/fec_main.c +2
-2@@ -1063,6 +1063,8 @@ static void fec_get_mac(struct net_device *ndev)/* --------------------------------------------------------------------- ---- */ +static void set_multicast_list(struct net_device *ndev); +/* * Phy section */ @@ -1093,8 +1095,10 @@ static void fec_enet_adjust_link(struct
net_device
*ndev)} /* if any of the above changed restart the FEC */drivers/net/ethernet/freescale/fec_main.c +3
-1-if (status_change) +if (status_change) {fec_restart (ndev, phy_dev->duplex); +set_multicast_list (ndev); + } }else {if (fep->link) {fec_stop (ndev);
Quoted 6 lines
Quoted 4 lines
Quoted 1 line
Quoted 1 line
Is this solution correct?
There are many places to call
fec_resart.
I suggest callset_multicase_listinfec_restartfunction.Yes, we had called
set_multicase_list()infec_restart()function. The patch is redundant.
thanks for the review. I didn't look too long at the linux-3.14-rc4, so i didn't see that. I only know that my problem is still reproducable in linux-3.14-rc5.
But i think i know why the problem still occurs. Both functions set_multicast_list() and fec_restart() write into the register FEC_R_CNTRL. The call of set_multicast_list() is too soon and has no effect in my case. The reason is that the register FEC_R_CNTRL is completly overwritten by the local variable rcntl of fec_restart.
Here is a patch against linux-3.14-rc5 which fixes my problem. I moved the function call to set_multicast_list() behind the register write to FEC_R_CNTRL.
drivers/net/ethernet/freescale/fec_main.c 2014-03-07 16:38:16.564026150 +0100 renamed from drivers/net/ethernet/freescale/fec_main.c 2014-03-03 03:56:16.000000000 +0100 +7 -7
@@ -527,13 +527,6 @@ /* Clear any outstanding interrupt. */ writel(0xffc00000, fep->hwp + FEC_IEVENT); - /* Setup multicast filter. */ - set_multicast_list(ndev); -#ifndef CONFIG_M5272 - writel(0, fep->hwp + FEC_HASH_TABLE_HIGH); - writel(0, fep->hwp + FEC_HASH_TABLE_LOW); -#endif - /* Set maximum receive buffer size. */ writel(PKT_MAXBLR_SIZE, fep->hwp + FEC_R_BUFF_SIZE);
@@ -654,6 +647,13 @@ writel(rcntl, fep->hwp + FEC_R_CNTRL); + /* Setup multicast filter. */ + set_multicast_list(ndev); +#ifndef CONFIG_M5272 + writel(0, fep->hwp + FEC_HASH_TABLE_HIGH); + writel(0, fep->hwp + FEC_HASH_TABLE_LOW); +#endif + if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) { /* enable ENET endian swap */ ecntl |= (1 << 8);
Is this better? If so i'll create a proper patch.
BR Stefan
Quoted 12 lines
Quoted 12 lines
Quoted 12 lines
Quoted 8 lines
Do you need more information?
Best regards
Stefan Wahren
--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Stefan,
Quoted 1 line · Stefan Wahren
Is this better? If so i'll create a proper patch.
Your explanation and patch make sense. Please send it as a proper patch and put all these people on Cc.
Thanks,
Fabio Estevam
PATCH 1/1 eth: fec: Fix lost promiscuous mode after reconnecting cable
In reply to Stefan WahrenIf the Freescale i.MX28 fec is in promiscuous mode and network cable is reconnected then the promiscuous mode get lost. The problem is caused by a too soon call of set_multicast_list to re-enable promisc mode. The FEC_R_CNTRL register changes are overwritten by fec_restart.
This patch fixes this by moving the call behind the init of FEC_R_CNTRL register in fec_restart.
Successful tested on a i.MX28 board.
--- drivers/net/ethernet/freescale/fec_main.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
(quoted diff) +0 -0
b/drivers/net/ethernet/freescale/fec_main.c
index 479a7cb..03a3513 100644
drivers/net/ethernet/freescale/fec_main.c +7 -7
@@ -528,13 +528,6 @@ fec_restart(struct net_device *ndev, int duplex)/* Clear any outstanding interrupt. */ writel (0xffc00000 , fep->hwp +FEC_IEVENT ); -/* Setup multicast filter. */ -set_multicast_list (ndev); -#ifndef CONFIG_M5272 -writel (0 , fep->hwp +FEC_HASH_TABLE_HIGH ); -writel (0 , fep->hwp +FEC_HASH_TABLE_LOW ); -#endif -/* Set maximum receive buffer size. */ writel (PKT_MAXBLR_SIZE , fep->hwp +FEC_R_BUFF_SIZE );
@@ -655,6 +648,13 @@ fec_restart(struct net_device *ndev, int duplex)writel (rcntl, fep->hwp +FEC_R_CNTRL ); +/* Setup multicast filter. */ +set_multicast_list (ndev); +#ifndef CONFIG_M5272 +writel (0 , fep->hwp +FEC_HASH_TABLE_HIGH ); +writel (0 , fep->hwp +FEC_HASH_TABLE_LOW ); +#endif +if (id_entry->driver_data &FEC_QUIRK_ENET_MAC ) {/* enable ENET endian swap */ ecntl |= (1 <<8 );
Signature · 1 line
1.7.10.4
RE: [PATCH net] eth: fec: Fix lost promiscuous mode after reconnecting cable
From: Stefan Wahren <[email protected]>
Data: Tuesday, March 11, 2014 2:19 AM
Quoted 55 lines
To: Duan Fugang-B38611; Frank Li; Fabio Estevam
Cc: David Miller; [email protected]; linux-arm- [email protected]; Shawn Guo; Estevam Fabio-R49496; Li Frank-B20596; Sascha Hauer
Subject: [PATCH net] eth: fec: Fix lost promiscuous mode after reconnecting cableIf the Freescale i.MX28 fec is in promiscuous mode and network cable is reconnected then the promiscuous mode get lost. The problem is caused by a too soon call of
set_multicast_listto re-enable promisc mode.
TheFEC_R_CNTRLregister changes are overwritten byfec_restart.This patch fixes this by moving the call behind the init of
FEC_R_CNTRLregister infec_restart.Successful tested on a i.MX28 board.
Signed-off-by Stefan Wahren <[email protected]>---
drivers/net/ethernet/freescale/fec_main.c| 14 +++++++-------1 file changed, 7 insertions(+), 7 deletions(-)drivers/net/ethernet/freescale/fec_main.c +6
-8@@ -528,13 +528,6 @@ fec_restart(struct net_device *ndev, int duplex)/* Clear any outstanding interrupt. */ writel (0xffc00000 , fep->hwp +FEC_IEVENT ); -/* Setup multicast filter. */ -set_multicast_list (ndev); -#ifndef CONFIG_M5272 -writel (0 , fep->hwp +FEC_HASH_TABLE_HIGH ); -writel (0 , fep->hwp +FEC_HASH_TABLE_LOW ); -#endif -/* Set maximum receive buffer size. */ writel (PKT_MAXBLR_SIZE , fep->hwp +FEC_R_BUFF_SIZE );@@ -655,6 +648,13 @@ fec_restart(struct net_device *ndev, int duplex)writel (rcntl, fep->hwp +FEC_R_CNTRL ); +/* Setup multicast filter. */ +set_multicast_list (ndev); +#ifndef CONFIG_M5272 +writel (0 , fep->hwp +FEC_HASH_TABLE_HIGH ); +writel (0 , fep->hwp +FEC_HASH_TABLE_LOW );#endif +if (id_entry->driver_data &FEC_QUIRK_ENET_MAC ) {/* enable ENET endian swap */ ecntl |= (1 <<8 ); --
Quoted 3 lines
1.7.10.4
David Miller
maintainerRe: [PATCH net] eth: fec: Fix lost promiscuous mode after reconnecting cable
In reply to Stefan WahrenFrom: Stefan Wahren <[email protected]>
Date: Mon, 10 Mar 2014 19:18:56 +0100
Quoted 11 lines
If the Freescale i.MX28 fec is in promiscuous mode and network cable is reconnected then the promiscuous mode get lost. The problem is caused by a too soon call of
set_multicast_listto re-enable promisc mode. TheFEC_R_CNTRLregister changes are overwritten byfec_restart.This patch fixes this by moving the call behind the init of
FEC_R_CNTRLregister infec_restart.Successful tested on a i.MX28 board.
Signed-off-by Stefan Wahren <[email protected]>
Your email client has corrupted your patch, making it unusable for us.
In particular, it has transformed TAB characters into spaces.
Please fix this and resubmit your patch, thank you.
Re: [PATCH net resend] eth: fec: Fix lost promiscuous mode after reconnecting cable
If the Freescale fec is in promiscuous mode and network cable is reconnected then the promiscuous mode get lost. The problem is caused by a too soon call of set_multicast_list to re-enable promisc mode. The FEC_R_CNTRL register changes are overwritten by fec_restart.
This patch fixes this by moving the call behind the init of FEC_R_CNTRL register in fec_restart.
Successful tested on a i.MX28 board.
--- drivers/net/ethernet/freescale/fec_main.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/ethernet/freescale/fec_main.c +7 -7
@@ -528,13 +528,6 @@ fec_restart(struct net_device *ndev, int duplex)/* Clear any outstanding interrupt. */ writel (0xffc00000 , fep->hwp +FEC_IEVENT ); -/* Setup multicast filter. */ -set_multicast_list (ndev); -#ifndef CONFIG_M5272 -writel (0 , fep->hwp +FEC_HASH_TABLE_HIGH ); -writel (0 , fep->hwp +FEC_HASH_TABLE_LOW ); -#endif -/* Set maximum receive buffer size. */ writel (PKT_MAXBLR_SIZE , fep->hwp +FEC_R_BUFF_SIZE );
@@ -655,6 +648,13 @@ fec_restart(struct net_device *ndev, int duplex)writel (rcntl, fep->hwp +FEC_R_CNTRL ); +/* Setup multicast filter. */ +set_multicast_list (ndev); +#ifndef CONFIG_M5272 +writel (0 , fep->hwp +FEC_HASH_TABLE_HIGH ); +writel (0 , fep->hwp +FEC_HASH_TABLE_LOW ); +#endif +if (id_entry->driver_data &FEC_QUIRK_ENET_MAC ) {/* enable ENET endian swap */ ecntl |= (1 <<8 );
Signature · 1 line
1.7.10.4
Re: [PATCH net resend] eth: fec: Fix lost promiscuous mode after reconnecting cable
From: Stefan Wahren <[email protected]>
Date: Wed, 12 Mar 2014 11:28:19 +0100
Quoted 11 lines
If the Freescale fec is in promiscuous mode and network cable is reconnected then the promiscuous mode get lost. The problem is caused by a too soon call of
set_multicast_listto re-enable promisc mode. TheFEC_R_CNTRLregister changes are overwritten byfec_restart.This patch fixes this by moving the call behind the init of
FEC_R_CNTRLregister infec_restart.Successful tested on a i.MX28 board.
Signed-off-by Stefan Wahren <[email protected]>
Applied, thank you.