aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/rdc
diff options
context:
space:
mode:
authorFlorian Fainelli <florian@openwrt.org>2012-04-11 03:18:36 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-12 16:06:23 -0400
commit90f750a81a29587846e907d2c8ed60a0586ce632 (patch)
treea029d7e97a5c67c1ece4b7fc40ed402604ce9b12 /drivers/net/ethernet/rdc
parentc1e6aaf0ab0150d625dc266721c033db8b43e49d (diff)
r6040: consolidate MAC reset to its own function
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>
Diffstat (limited to 'drivers/net/ethernet/rdc')
-rw-r--r--drivers/net/ethernet/rdc/r6040.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/drivers/net/ethernet/rdc/r6040.c b/drivers/net/ethernet/rdc/r6040.c
index a26307fe143e..c10b0b89626b 100644
--- a/drivers/net/ethernet/rdc/r6040.c
+++ b/drivers/net/ethernet/rdc/r6040.c
@@ -358,27 +358,35 @@ err_exit:
358 return rc; 358 return rc;
359} 359}
360 360
361static void r6040_init_mac_regs(struct net_device *dev) 361static void r6040_reset_mac(struct r6040_private *lp)
362{ 362{
363 struct r6040_private *lp = netdev_priv(dev);
364 void __iomem *ioaddr = lp->base; 363 void __iomem *ioaddr = lp->base;
365 int limit = 2048; 364 int limit = 2048;
366 u16 cmd; 365 u16 cmd;
367 366
368 /* Mask Off Interrupt */
369 iowrite16(MSK_INT, ioaddr + MIER);
370
371 /* Reset RDC MAC */
372 iowrite16(MAC_RST, ioaddr + MCR1); 367 iowrite16(MAC_RST, ioaddr + MCR1);
373 while (limit--) { 368 while (limit--) {
374 cmd = ioread16(ioaddr + MCR1); 369 cmd = ioread16(ioaddr + MCR1);
375 if (cmd & MAC_RST) 370 if (cmd & MAC_RST)
376 break; 371 break;
377 } 372 }
373
378 /* Reset internal state machine */ 374 /* Reset internal state machine */
379 iowrite16(MAC_SM_RST, ioaddr + MAC_SM); 375 iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
380 iowrite16(0, ioaddr + MAC_SM); 376 iowrite16(0, ioaddr + MAC_SM);
381 mdelay(5); 377 mdelay(5);
378}
379
380static void r6040_init_mac_regs(struct net_device *dev)
381{
382 struct r6040_private *lp = netdev_priv(dev);
383 void __iomem *ioaddr = lp->base;
384
385 /* Mask Off Interrupt */
386 iowrite16(MSK_INT, ioaddr + MIER);
387
388 /* Reset RDC MAC */
389 r6040_reset_mac(lp);
382 390
383 /* MAC Bus Control Register */ 391 /* MAC Bus Control Register */
384 iowrite16(MBCR_DEFAULT, ioaddr + MBCR); 392 iowrite16(MBCR_DEFAULT, ioaddr + MBCR);
@@ -445,18 +453,13 @@ static void r6040_down(struct net_device *dev)
445{ 453{
446 struct r6040_private *lp = netdev_priv(dev); 454 struct r6040_private *lp = netdev_priv(dev);
447 void __iomem *ioaddr = lp->base; 455 void __iomem *ioaddr = lp->base;
448 int limit = 2048;
449 u16 *adrp; 456 u16 *adrp;
450 u16 cmd;
451 457
452 /* Stop MAC */ 458 /* Stop MAC */
453 iowrite16(MSK_INT, ioaddr + MIER); /* Mask Off Interrupt */ 459 iowrite16(MSK_INT, ioaddr + MIER); /* Mask Off Interrupt */
454 iowrite16(MAC_RST, ioaddr + MCR1); /* Reset RDC MAC */ 460
455 while (limit--) { 461 /* Reset RDC MAC */
456 cmd = ioread16(ioaddr + MCR1); 462 r6040_reset_mac(lp);
457 if (cmd & MAC_RST)
458 break;
459 }
460 463
461 /* Restore MAC Address to MIDx */ 464 /* Restore MAC Address to MIDx */
462 adrp = (u16 *) dev->dev_addr; 465 adrp = (u16 *) dev->dev_addr;
@@ -736,11 +739,7 @@ static void r6040_mac_address(struct net_device *dev)
736 u16 *adrp; 739 u16 *adrp;
737 740
738 /* Reset MAC */ 741 /* Reset MAC */
739 iowrite16(MAC_RST, ioaddr + MCR1); 742 r6040_reset_mac(lp);
740 /* Reset internal state machine */
741 iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
742 iowrite16(0, ioaddr + MAC_SM);
743 mdelay(5);
744 743
745 /* Restore MAC Address */ 744 /* Restore MAC Address */
746 adrp = (u16 *) dev->dev_addr; 745 adrp = (u16 *) dev->dev_addr;