diff options
Diffstat (limited to 'drivers/net/ethernet/cadence/macb_main.c')
-rw-r--r-- | drivers/net/ethernet/cadence/macb_main.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index dc09f9a8a49b..c6707ea2d751 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c | |||
@@ -482,11 +482,6 @@ static int macb_mii_probe(struct net_device *dev) | |||
482 | 482 | ||
483 | if (np) { | 483 | if (np) { |
484 | if (of_phy_is_fixed_link(np)) { | 484 | if (of_phy_is_fixed_link(np)) { |
485 | if (of_phy_register_fixed_link(np) < 0) { | ||
486 | dev_err(&bp->pdev->dev, | ||
487 | "broken fixed-link specification\n"); | ||
488 | return -ENODEV; | ||
489 | } | ||
490 | bp->phy_node = of_node_get(np); | 485 | bp->phy_node = of_node_get(np); |
491 | } else { | 486 | } else { |
492 | bp->phy_node = of_parse_phandle(np, "phy-handle", 0); | 487 | bp->phy_node = of_parse_phandle(np, "phy-handle", 0); |
@@ -569,7 +564,7 @@ static int macb_mii_init(struct macb *bp) | |||
569 | { | 564 | { |
570 | struct macb_platform_data *pdata; | 565 | struct macb_platform_data *pdata; |
571 | struct device_node *np; | 566 | struct device_node *np; |
572 | int err; | 567 | int err = -ENXIO; |
573 | 568 | ||
574 | /* Enable management port */ | 569 | /* Enable management port */ |
575 | macb_writel(bp, NCR, MACB_BIT(MPE)); | 570 | macb_writel(bp, NCR, MACB_BIT(MPE)); |
@@ -592,12 +587,23 @@ static int macb_mii_init(struct macb *bp) | |||
592 | dev_set_drvdata(&bp->dev->dev, bp->mii_bus); | 587 | dev_set_drvdata(&bp->dev->dev, bp->mii_bus); |
593 | 588 | ||
594 | np = bp->pdev->dev.of_node; | 589 | np = bp->pdev->dev.of_node; |
595 | if (pdata) | 590 | if (np && of_phy_is_fixed_link(np)) { |
596 | bp->mii_bus->phy_mask = pdata->phy_mask; | 591 | if (of_phy_register_fixed_link(np) < 0) { |
592 | dev_err(&bp->pdev->dev, | ||
593 | "broken fixed-link specification %pOF\n", np); | ||
594 | goto err_out_free_mdiobus; | ||
595 | } | ||
596 | |||
597 | err = mdiobus_register(bp->mii_bus); | ||
598 | } else { | ||
599 | if (pdata) | ||
600 | bp->mii_bus->phy_mask = pdata->phy_mask; | ||
601 | |||
602 | err = of_mdiobus_register(bp->mii_bus, np); | ||
603 | } | ||
597 | 604 | ||
598 | err = of_mdiobus_register(bp->mii_bus, np); | ||
599 | if (err) | 605 | if (err) |
600 | goto err_out_free_mdiobus; | 606 | goto err_out_free_fixed_link; |
601 | 607 | ||
602 | err = macb_mii_probe(bp->dev); | 608 | err = macb_mii_probe(bp->dev); |
603 | if (err) | 609 | if (err) |
@@ -607,6 +613,7 @@ static int macb_mii_init(struct macb *bp) | |||
607 | 613 | ||
608 | err_out_unregister_bus: | 614 | err_out_unregister_bus: |
609 | mdiobus_unregister(bp->mii_bus); | 615 | mdiobus_unregister(bp->mii_bus); |
616 | err_out_free_fixed_link: | ||
610 | if (np && of_phy_is_fixed_link(np)) | 617 | if (np && of_phy_is_fixed_link(np)) |
611 | of_phy_deregister_fixed_link(np); | 618 | of_phy_deregister_fixed_link(np); |
612 | err_out_free_mdiobus: | 619 | err_out_free_mdiobus: |
@@ -2028,14 +2035,17 @@ static void macb_reset_hw(struct macb *bp) | |||
2028 | { | 2035 | { |
2029 | struct macb_queue *queue; | 2036 | struct macb_queue *queue; |
2030 | unsigned int q; | 2037 | unsigned int q; |
2038 | u32 ctrl = macb_readl(bp, NCR); | ||
2031 | 2039 | ||
2032 | /* Disable RX and TX (XXX: Should we halt the transmission | 2040 | /* Disable RX and TX (XXX: Should we halt the transmission |
2033 | * more gracefully?) | 2041 | * more gracefully?) |
2034 | */ | 2042 | */ |
2035 | macb_writel(bp, NCR, 0); | 2043 | ctrl &= ~(MACB_BIT(RE) | MACB_BIT(TE)); |
2036 | 2044 | ||
2037 | /* Clear the stats registers (XXX: Update stats first?) */ | 2045 | /* Clear the stats registers (XXX: Update stats first?) */ |
2038 | macb_writel(bp, NCR, MACB_BIT(CLRSTAT)); | 2046 | ctrl |= MACB_BIT(CLRSTAT); |
2047 | |||
2048 | macb_writel(bp, NCR, ctrl); | ||
2039 | 2049 | ||
2040 | /* Clear all status flags */ | 2050 | /* Clear all status flags */ |
2041 | macb_writel(bp, TSR, -1); | 2051 | macb_writel(bp, TSR, -1); |
@@ -2223,7 +2233,7 @@ static void macb_init_hw(struct macb *bp) | |||
2223 | } | 2233 | } |
2224 | 2234 | ||
2225 | /* Enable TX and RX */ | 2235 | /* Enable TX and RX */ |
2226 | macb_writel(bp, NCR, MACB_BIT(RE) | MACB_BIT(TE) | MACB_BIT(MPE)); | 2236 | macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(RE) | MACB_BIT(TE)); |
2227 | } | 2237 | } |
2228 | 2238 | ||
2229 | /* The hash address register is 64 bits long and takes up two | 2239 | /* The hash address register is 64 bits long and takes up two |