diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2014-10-28 11:12:01 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-28 17:08:47 -0400 |
commit | 704d33e7006f20f9b4fa7d24a0f08c4b5919b131 (patch) | |
tree | aca2c9c6337b62a19dd145759c9aaab1568a26ee /drivers/net/ethernet/broadcom | |
parent | 8edf0047f4b8e03d94ef88f5a7dec146cce03a06 (diff) | |
download | linux-704d33e7006f20f9b4fa7d24a0f08c4b5919b131.tar.gz linux-704d33e7006f20f9b4fa7d24a0f08c4b5919b131.tar.bz2 linux-704d33e7006f20f9b4fa7d24a0f08c4b5919b131.zip |
net: systemport: reset UniMAC coming out of a suspend cycle
bcm_sysport_resume() was missing an UniMAC reset which can lead to
various receive FIFO corruptions coming out of a suspend cycle. If the
RX FIFO is stuck, it will deliver corrupted/duplicate packets towards
the host CPU interface.
This could be reproduced on crowded network and when Wake-on-LAN is
enabled for this particular interface because the switch still forwards
packets towards the host CPU interface (SYSTEMPORT), and we had to leave
the UniMAC RX enable bit on to allow matching MagicPackets.
Once we re-enter the resume function, there is a small window during
which the UniMAC receive is still enabled, and we start queueing
packets, but the RDMA and RBUF engines are not ready, which leads to
having packets stuck in the UniMAC RX FIFO, ultimately delivered towards
the host CPU as corrupted.
Fixes: 40755a0fce17 ("net: systemport: add suspend and resume support")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 7dce91189e51..3a6778a667f4 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -1858,6 +1858,8 @@ static int bcm_sysport_resume(struct device *d) if (!netif_running(dev)) return 0; + umac_reset(priv); + /* We may have been suspended and never received a WOL event that * would turn off MPD detection, take care of that now */ |