diff options
| author | Florian Fainelli <florian@openwrt.org> | 2012-04-11 03:18:36 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-04-12 16:06:23 -0400 |
| commit | 90f750a81a29587846e907d2c8ed60a0586ce632 (patch) | |
| tree | a029d7e97a5c67c1ece4b7fc40ed402604ce9b12 /drivers/net/ethernet/rdc | |
| parent | c1e6aaf0ab0150d625dc266721c033db8b43e49d (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.c | 37 |
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 | ||
| 361 | static void r6040_init_mac_regs(struct net_device *dev) | 361 | static 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 | |||
| 380 | static 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; |
