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>
This commit is contained in:
parent
c1e6aaf0ab
commit
90f750a81a
@ -358,27 +358,35 @@ err_exit:
|
|||||||
return rc;
|
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;
|
void __iomem *ioaddr = lp->base;
|
||||||
int limit = 2048;
|
int limit = 2048;
|
||||||
u16 cmd;
|
u16 cmd;
|
||||||
|
|
||||||
/* Mask Off Interrupt */
|
|
||||||
iowrite16(MSK_INT, ioaddr + MIER);
|
|
||||||
|
|
||||||
/* Reset RDC MAC */
|
|
||||||
iowrite16(MAC_RST, ioaddr + MCR1);
|
iowrite16(MAC_RST, ioaddr + MCR1);
|
||||||
while (limit--) {
|
while (limit--) {
|
||||||
cmd = ioread16(ioaddr + MCR1);
|
cmd = ioread16(ioaddr + MCR1);
|
||||||
if (cmd & MAC_RST)
|
if (cmd & MAC_RST)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset internal state machine */
|
/* Reset internal state machine */
|
||||||
iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
|
iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
|
||||||
iowrite16(0, ioaddr + MAC_SM);
|
iowrite16(0, ioaddr + MAC_SM);
|
||||||
mdelay(5);
|
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 */
|
/* MAC Bus Control Register */
|
||||||
iowrite16(MBCR_DEFAULT, ioaddr + MBCR);
|
iowrite16(MBCR_DEFAULT, ioaddr + MBCR);
|
||||||
@ -445,18 +453,13 @@ static void r6040_down(struct net_device *dev)
|
|||||||
{
|
{
|
||||||
struct r6040_private *lp = netdev_priv(dev);
|
struct r6040_private *lp = netdev_priv(dev);
|
||||||
void __iomem *ioaddr = lp->base;
|
void __iomem *ioaddr = lp->base;
|
||||||
int limit = 2048;
|
|
||||||
u16 *adrp;
|
u16 *adrp;
|
||||||
u16 cmd;
|
|
||||||
|
|
||||||
/* Stop MAC */
|
/* Stop MAC */
|
||||||
iowrite16(MSK_INT, ioaddr + MIER); /* Mask Off Interrupt */
|
iowrite16(MSK_INT, ioaddr + MIER); /* Mask Off Interrupt */
|
||||||
iowrite16(MAC_RST, ioaddr + MCR1); /* Reset RDC MAC */
|
|
||||||
while (limit--) {
|
/* Reset RDC MAC */
|
||||||
cmd = ioread16(ioaddr + MCR1);
|
r6040_reset_mac(lp);
|
||||||
if (cmd & MAC_RST)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore MAC Address to MIDx */
|
/* Restore MAC Address to MIDx */
|
||||||
adrp = (u16 *) dev->dev_addr;
|
adrp = (u16 *) dev->dev_addr;
|
||||||
@ -736,11 +739,7 @@ static void r6040_mac_address(struct net_device *dev)
|
|||||||
u16 *adrp;
|
u16 *adrp;
|
||||||
|
|
||||||
/* Reset MAC */
|
/* Reset MAC */
|
||||||
iowrite16(MAC_RST, ioaddr + MCR1);
|
r6040_reset_mac(lp);
|
||||||
/* Reset internal state machine */
|
|
||||||
iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
|
|
||||||
iowrite16(0, ioaddr + MAC_SM);
|
|
||||||
mdelay(5);
|
|
||||||
|
|
||||||
/* Restore MAC Address */
|
/* Restore MAC Address */
|
||||||
adrp = (u16 *) dev->dev_addr;
|
adrp = (u16 *) dev->dev_addr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user