net: systemport: wait for packet in umac_enable_set()
authorFlorian Fainelli <f.fainelli@gmail.com>
Thu, 15 May 2014 21:33:53 +0000 (14:33 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 May 2014 20:41:40 +0000 (16:41 -0400)
When umac_enable_set() is used to disable the UniMAC receiver or
transmitter, we need to make sure that we wait for a full-sized packet
to be processed because the UniMAC hardware stops on a packet boundary,
not immediately.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bcmsysport.c

index 26030d67518b3ec4d55659052a52d87186e02e75..d40c5b969e9e8753dac18429c41b64eb26d66e2f 100644 (file)
@@ -1244,6 +1244,12 @@ static inline void umac_enable_set(struct bcm_sysport_priv *priv,
        else
                reg &= ~(CMD_RX_EN | CMD_TX_EN);
        umac_writel(priv, reg, UMAC_CMD);
+
+       /* UniMAC stops on a packet boundary, wait for a full-sized packet
+        * to be processed (1 msec).
+        */
+       if (enable == 0)
+               usleep_range(1000, 2000);
 }
 
 static inline int umac_reset(struct bcm_sysport_priv *priv)