diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/sb1250-mac.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/sb1250-mac.c')
-rw-r--r-- | drivers/net/sb1250-mac.c | 76 |
1 files changed, 37 insertions, 39 deletions
diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index 508551f1b3fc..04efc0c1bda9 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c | |||
@@ -1476,7 +1476,6 @@ static void sbmac_channel_start(struct sbmac_softc *s) | |||
1476 | V_MAC_TX_RL_THRSH(4) | | 1476 | V_MAC_TX_RL_THRSH(4) | |
1477 | V_MAC_RX_PL_THRSH(4) | | 1477 | V_MAC_RX_PL_THRSH(4) | |
1478 | V_MAC_RX_RD_THRSH(4) | /* Must be '4' */ | 1478 | V_MAC_RX_RD_THRSH(4) | /* Must be '4' */ |
1479 | V_MAC_RX_PL_THRSH(4) | | ||
1480 | V_MAC_RX_RL_THRSH(8) | | 1479 | V_MAC_RX_RL_THRSH(8) | |
1481 | 0; | 1480 | 0; |
1482 | 1481 | ||
@@ -2162,13 +2161,13 @@ static void sbmac_setmulti(struct sbmac_softc *sc) | |||
2162 | * XXX if the table overflows */ | 2161 | * XXX if the table overflows */ |
2163 | 2162 | ||
2164 | idx = 1; /* skip station address */ | 2163 | idx = 1; /* skip station address */ |
2165 | mclist = dev->mc_list; | 2164 | netdev_for_each_mc_addr(mclist, dev) { |
2166 | while (mclist && (idx < MAC_ADDR_COUNT)) { | 2165 | if (idx == MAC_ADDR_COUNT) |
2166 | break; | ||
2167 | reg = sbmac_addr2reg(mclist->dmi_addr); | 2167 | reg = sbmac_addr2reg(mclist->dmi_addr); |
2168 | port = sc->sbm_base + R_MAC_ADDR_BASE+(idx * sizeof(uint64_t)); | 2168 | port = sc->sbm_base + R_MAC_ADDR_BASE+(idx * sizeof(uint64_t)); |
2169 | __raw_writeq(reg, port); | 2169 | __raw_writeq(reg, port); |
2170 | idx++; | 2170 | idx++; |
2171 | mclist = mclist->next; | ||
2172 | } | 2171 | } |
2173 | 2172 | ||
2174 | /* | 2173 | /* |
@@ -2354,17 +2353,36 @@ static int sbmac_init(struct platform_device *pldev, long long base) | |||
2354 | 2353 | ||
2355 | sc->mii_bus = mdiobus_alloc(); | 2354 | sc->mii_bus = mdiobus_alloc(); |
2356 | if (sc->mii_bus == NULL) { | 2355 | if (sc->mii_bus == NULL) { |
2357 | sbmac_uninitctx(sc); | 2356 | err = -ENOMEM; |
2358 | return -ENOMEM; | 2357 | goto uninit_ctx; |
2358 | } | ||
2359 | |||
2360 | sc->mii_bus->name = sbmac_mdio_string; | ||
2361 | snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx); | ||
2362 | sc->mii_bus->priv = sc; | ||
2363 | sc->mii_bus->read = sbmac_mii_read; | ||
2364 | sc->mii_bus->write = sbmac_mii_write; | ||
2365 | sc->mii_bus->irq = sc->phy_irq; | ||
2366 | for (i = 0; i < PHY_MAX_ADDR; ++i) | ||
2367 | sc->mii_bus->irq[i] = SBMAC_PHY_INT; | ||
2368 | |||
2369 | sc->mii_bus->parent = &pldev->dev; | ||
2370 | /* | ||
2371 | * Probe PHY address | ||
2372 | */ | ||
2373 | err = mdiobus_register(sc->mii_bus); | ||
2374 | if (err) { | ||
2375 | printk(KERN_ERR "%s: unable to register MDIO bus\n", | ||
2376 | dev->name); | ||
2377 | goto free_mdio; | ||
2359 | } | 2378 | } |
2379 | dev_set_drvdata(&pldev->dev, sc->mii_bus); | ||
2360 | 2380 | ||
2361 | err = register_netdev(dev); | 2381 | err = register_netdev(dev); |
2362 | if (err) { | 2382 | if (err) { |
2363 | printk(KERN_ERR "%s.%d: unable to register netdev\n", | 2383 | printk(KERN_ERR "%s.%d: unable to register netdev\n", |
2364 | sbmac_string, idx); | 2384 | sbmac_string, idx); |
2365 | mdiobus_free(sc->mii_bus); | 2385 | goto unreg_mdio; |
2366 | sbmac_uninitctx(sc); | ||
2367 | return err; | ||
2368 | } | 2386 | } |
2369 | 2387 | ||
2370 | pr_info("%s.%d: registered as %s\n", sbmac_string, idx, dev->name); | 2388 | pr_info("%s.%d: registered as %s\n", sbmac_string, idx, dev->name); |
@@ -2380,19 +2398,15 @@ static int sbmac_init(struct platform_device *pldev, long long base) | |||
2380 | pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %pM\n", | 2398 | pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %pM\n", |
2381 | dev->name, base, eaddr); | 2399 | dev->name, base, eaddr); |
2382 | 2400 | ||
2383 | sc->mii_bus->name = sbmac_mdio_string; | ||
2384 | snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx); | ||
2385 | sc->mii_bus->priv = sc; | ||
2386 | sc->mii_bus->read = sbmac_mii_read; | ||
2387 | sc->mii_bus->write = sbmac_mii_write; | ||
2388 | sc->mii_bus->irq = sc->phy_irq; | ||
2389 | for (i = 0; i < PHY_MAX_ADDR; ++i) | ||
2390 | sc->mii_bus->irq[i] = SBMAC_PHY_INT; | ||
2391 | |||
2392 | sc->mii_bus->parent = &pldev->dev; | ||
2393 | dev_set_drvdata(&pldev->dev, sc->mii_bus); | ||
2394 | |||
2395 | return 0; | 2401 | return 0; |
2402 | unreg_mdio: | ||
2403 | mdiobus_unregister(sc->mii_bus); | ||
2404 | dev_set_drvdata(&pldev->dev, NULL); | ||
2405 | free_mdio: | ||
2406 | mdiobus_free(sc->mii_bus); | ||
2407 | uninit_ctx: | ||
2408 | sbmac_uninitctx(sc); | ||
2409 | return err; | ||
2396 | } | 2410 | } |
2397 | 2411 | ||
2398 | 2412 | ||
@@ -2411,23 +2425,13 @@ static int sbmac_open(struct net_device *dev) | |||
2411 | */ | 2425 | */ |
2412 | 2426 | ||
2413 | __raw_readq(sc->sbm_isr); | 2427 | __raw_readq(sc->sbm_isr); |
2414 | err = request_irq(dev->irq, &sbmac_intr, IRQF_SHARED, dev->name, dev); | 2428 | err = request_irq(dev->irq, sbmac_intr, IRQF_SHARED, dev->name, dev); |
2415 | if (err) { | 2429 | if (err) { |
2416 | printk(KERN_ERR "%s: unable to get IRQ %d\n", dev->name, | 2430 | printk(KERN_ERR "%s: unable to get IRQ %d\n", dev->name, |
2417 | dev->irq); | 2431 | dev->irq); |
2418 | goto out_err; | 2432 | goto out_err; |
2419 | } | 2433 | } |
2420 | 2434 | ||
2421 | /* | ||
2422 | * Probe PHY address | ||
2423 | */ | ||
2424 | err = mdiobus_register(sc->mii_bus); | ||
2425 | if (err) { | ||
2426 | printk(KERN_ERR "%s: unable to register MDIO bus\n", | ||
2427 | dev->name); | ||
2428 | goto out_unirq; | ||
2429 | } | ||
2430 | |||
2431 | sc->sbm_speed = sbmac_speed_none; | 2435 | sc->sbm_speed = sbmac_speed_none; |
2432 | sc->sbm_duplex = sbmac_duplex_none; | 2436 | sc->sbm_duplex = sbmac_duplex_none; |
2433 | sc->sbm_fc = sbmac_fc_none; | 2437 | sc->sbm_fc = sbmac_fc_none; |
@@ -2458,11 +2462,7 @@ static int sbmac_open(struct net_device *dev) | |||
2458 | return 0; | 2462 | return 0; |
2459 | 2463 | ||
2460 | out_unregister: | 2464 | out_unregister: |
2461 | mdiobus_unregister(sc->mii_bus); | ||
2462 | |||
2463 | out_unirq: | ||
2464 | free_irq(dev->irq, dev); | 2465 | free_irq(dev->irq, dev); |
2465 | |||
2466 | out_err: | 2466 | out_err: |
2467 | return err; | 2467 | return err; |
2468 | } | 2468 | } |
@@ -2651,9 +2651,6 @@ static int sbmac_close(struct net_device *dev) | |||
2651 | 2651 | ||
2652 | phy_disconnect(sc->phy_dev); | 2652 | phy_disconnect(sc->phy_dev); |
2653 | sc->phy_dev = NULL; | 2653 | sc->phy_dev = NULL; |
2654 | |||
2655 | mdiobus_unregister(sc->mii_bus); | ||
2656 | |||
2657 | free_irq(dev->irq, dev); | 2654 | free_irq(dev->irq, dev); |
2658 | 2655 | ||
2659 | sbdma_emptyring(&(sc->sbm_txdma)); | 2656 | sbdma_emptyring(&(sc->sbm_txdma)); |
@@ -2761,6 +2758,7 @@ static int __exit sbmac_remove(struct platform_device *pldev) | |||
2761 | 2758 | ||
2762 | unregister_netdev(dev); | 2759 | unregister_netdev(dev); |
2763 | sbmac_uninitctx(sc); | 2760 | sbmac_uninitctx(sc); |
2761 | mdiobus_unregister(sc->mii_bus); | ||
2764 | mdiobus_free(sc->mii_bus); | 2762 | mdiobus_free(sc->mii_bus); |
2765 | iounmap(sc->sbm_base); | 2763 | iounmap(sc->sbm_base); |
2766 | free_netdev(dev); | 2764 | free_netdev(dev); |