r6040: consolidate MAC reset to its own function
authorFlorian Fainelli <florian@openwrt.org>
Wed, 11 Apr 2012 07:18:36 +0000 (07:18 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Apr 2012 20:06:23 +0000 (16:06 -0400)
The reset of the MAC is currently done identically from two places
and one place is not waiting for the MAC_SM bit to be set after reset.
Everytime the MAC is software resetted a state machine is also needed
so consolidate the reset to its own function.

Signed-off-by: Florian Fainelli <florian@openwrt.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/rdc/r6040.c

index a26307fe143ea4d59b1f10ab9cfbbcc0cafea51f..c10b0b89626b0639121d28d7155e47cce648a8e1 100644 (file)
@@ -358,27 +358,35 @@ err_exit:
        return rc;
 }
 
-static void r6040_init_mac_regs(struct net_device *dev)
+static void r6040_reset_mac(struct r6040_private *lp)
 {
-       struct r6040_private *lp = netdev_priv(dev);
        void __iomem *ioaddr = lp->base;
        int limit = 2048;
        u16 cmd;
 
-       /* Mask Off Interrupt */
-       iowrite16(MSK_INT, ioaddr + MIER);
-
-       /* Reset RDC MAC */
        iowrite16(MAC_RST, ioaddr + MCR1);
        while (limit--) {
                cmd = ioread16(ioaddr + MCR1);
                if (cmd & MAC_RST)
                        break;
        }
+
        /* Reset internal state machine */
        iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
        iowrite16(0, ioaddr + MAC_SM);
        mdelay(5);
+}
+
+static void r6040_init_mac_regs(struct net_device *dev)
+{
+       struct r6040_private *lp = netdev_priv(dev);
+       void __iomem *ioaddr = lp->base;
+
+       /* Mask Off Interrupt */
+       iowrite16(MSK_INT, ioaddr + MIER);
+
+       /* Reset RDC MAC */
+       r6040_reset_mac(lp);
 
        /* MAC Bus Control Register */
        iowrite16(MBCR_DEFAULT, ioaddr + MBCR);
@@ -445,18 +453,13 @@ static void r6040_down(struct net_device *dev)
 {
        struct r6040_private *lp = netdev_priv(dev);
        void __iomem *ioaddr = lp->base;
-       int limit = 2048;
        u16 *adrp;
-       u16 cmd;
 
        /* Stop MAC */
        iowrite16(MSK_INT, ioaddr + MIER);      /* Mask Off Interrupt */
-       iowrite16(MAC_RST, ioaddr + MCR1);      /* Reset RDC MAC */
-       while (limit--) {
-               cmd = ioread16(ioaddr + MCR1);
-               if (cmd & MAC_RST)
-                       break;
-       }
+
+       /* Reset RDC MAC */
+       r6040_reset_mac(lp);
 
        /* Restore MAC Address to MIDx */
        adrp = (u16 *) dev->dev_addr;
@@ -736,11 +739,7 @@ static void r6040_mac_address(struct net_device *dev)
        u16 *adrp;
 
        /* Reset MAC */
-       iowrite16(MAC_RST, ioaddr + MCR1);
-       /* Reset internal state machine */
-       iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
-       iowrite16(0, ioaddr + MAC_SM);
-       mdelay(5);
+       r6040_reset_mac(lp);
 
        /* Restore MAC Address */
        adrp = (u16 *) dev->dev_addr;