aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sb1250-mac.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/sb1250-mac.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c76
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;
2402unreg_mdio:
2403 mdiobus_unregister(sc->mii_bus);
2404 dev_set_drvdata(&pldev->dev, NULL);
2405free_mdio:
2406 mdiobus_free(sc->mii_bus);
2407uninit_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
2460out_unregister: 2464out_unregister:
2461 mdiobus_unregister(sc->mii_bus);
2462
2463out_unirq:
2464 free_irq(dev->irq, dev); 2465 free_irq(dev->irq, dev);
2465
2466out_err: 2466out_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);