aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sb1250-mac.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-10-11 15:39:35 -0400
committerDavid S. Miller <davem@davemloft.net>2008-10-11 15:39:35 -0400
commit56c5d900dbb8e042bfad035d18433476931d8f93 (patch)
tree00b793965beeef10db03e0ff021d2d965c410759 /drivers/net/sb1250-mac.c
parent4dd95b63ae25c5cad6986829b5e8788e9faa0330 (diff)
parentead9d23d803ea3a73766c3cb27bf7563ac8d7266 (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts: sound/core/memalloc.c
Diffstat (limited to 'drivers/net/sb1250-mac.c')
-rw-r--r--drivers/net/sb1250-mac.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c
index fe41e4ec21ec..2615d46e6e50 100644
--- a/drivers/net/sb1250-mac.c
+++ b/drivers/net/sb1250-mac.c
@@ -256,7 +256,7 @@ struct sbmac_softc {
256 struct net_device *sbm_dev; /* pointer to linux device */ 256 struct net_device *sbm_dev; /* pointer to linux device */
257 struct napi_struct napi; 257 struct napi_struct napi;
258 struct phy_device *phy_dev; /* the associated PHY device */ 258 struct phy_device *phy_dev; /* the associated PHY device */
259 struct mii_bus mii_bus; /* the MII bus */ 259 struct mii_bus *mii_bus; /* the MII bus */
260 int phy_irq[PHY_MAX_ADDR]; 260 int phy_irq[PHY_MAX_ADDR];
261 spinlock_t sbm_lock; /* spin lock */ 261 spinlock_t sbm_lock; /* spin lock */
262 int sbm_devflags; /* current device flags */ 262 int sbm_devflags; /* current device flags */
@@ -2069,9 +2069,10 @@ static irqreturn_t sbmac_intr(int irq,void *dev_instance)
2069static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) 2069static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev)
2070{ 2070{
2071 struct sbmac_softc *sc = netdev_priv(dev); 2071 struct sbmac_softc *sc = netdev_priv(dev);
2072 unsigned long flags;
2072 2073
2073 /* lock eth irq */ 2074 /* lock eth irq */
2074 spin_lock_irq (&sc->sbm_lock); 2075 spin_lock_irqsave(&sc->sbm_lock, flags);
2075 2076
2076 /* 2077 /*
2077 * Put the buffer on the transmit ring. If we 2078 * Put the buffer on the transmit ring. If we
@@ -2081,14 +2082,14 @@ static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev)
2081 if (sbdma_add_txbuffer(&(sc->sbm_txdma),skb)) { 2082 if (sbdma_add_txbuffer(&(sc->sbm_txdma),skb)) {
2082 /* XXX save skb that we could not send */ 2083 /* XXX save skb that we could not send */
2083 netif_stop_queue(dev); 2084 netif_stop_queue(dev);
2084 spin_unlock_irq(&sc->sbm_lock); 2085 spin_unlock_irqrestore(&sc->sbm_lock, flags);
2085 2086
2086 return 1; 2087 return 1;
2087 } 2088 }
2088 2089
2089 dev->trans_start = jiffies; 2090 dev->trans_start = jiffies;
2090 2091
2091 spin_unlock_irq (&sc->sbm_lock); 2092 spin_unlock_irqrestore(&sc->sbm_lock, flags);
2092 2093
2093 return 0; 2094 return 0;
2094} 2095}
@@ -2347,10 +2348,17 @@ static int sbmac_init(struct platform_device *pldev, long long base)
2347 /* This is needed for PASS2 for Rx H/W checksum feature */ 2348 /* This is needed for PASS2 for Rx H/W checksum feature */
2348 sbmac_set_iphdr_offset(sc); 2349 sbmac_set_iphdr_offset(sc);
2349 2350
2351 sc->mii_bus = mdiobus_alloc();
2352 if (sc->mii_bus == NULL) {
2353 sbmac_uninitctx(sc);
2354 return -ENOMEM;
2355 }
2356
2350 err = register_netdev(dev); 2357 err = register_netdev(dev);
2351 if (err) { 2358 if (err) {
2352 printk(KERN_ERR "%s.%d: unable to register netdev\n", 2359 printk(KERN_ERR "%s.%d: unable to register netdev\n",
2353 sbmac_string, idx); 2360 sbmac_string, idx);
2361 mdiobus_free(sc->mii_bus);
2354 sbmac_uninitctx(sc); 2362 sbmac_uninitctx(sc);
2355 return err; 2363 return err;
2356 } 2364 }
@@ -2368,17 +2376,17 @@ static int sbmac_init(struct platform_device *pldev, long long base)
2368 pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %s\n", 2376 pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %s\n",
2369 dev->name, base, print_mac(mac, eaddr)); 2377 dev->name, base, print_mac(mac, eaddr));
2370 2378
2371 sc->mii_bus.name = sbmac_mdio_string; 2379 sc->mii_bus->name = sbmac_mdio_string;
2372 snprintf(sc->mii_bus.id, MII_BUS_ID_SIZE, "%x", idx); 2380 snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx);
2373 sc->mii_bus.priv = sc; 2381 sc->mii_bus->priv = sc;
2374 sc->mii_bus.read = sbmac_mii_read; 2382 sc->mii_bus->read = sbmac_mii_read;
2375 sc->mii_bus.write = sbmac_mii_write; 2383 sc->mii_bus->write = sbmac_mii_write;
2376 sc->mii_bus.irq = sc->phy_irq; 2384 sc->mii_bus->irq = sc->phy_irq;
2377 for (i = 0; i < PHY_MAX_ADDR; ++i) 2385 for (i = 0; i < PHY_MAX_ADDR; ++i)
2378 sc->mii_bus.irq[i] = SBMAC_PHY_INT; 2386 sc->mii_bus->irq[i] = SBMAC_PHY_INT;
2379 2387
2380 sc->mii_bus.dev = &pldev->dev; 2388 sc->mii_bus->parent = &pldev->dev;
2381 dev_set_drvdata(&pldev->dev, &sc->mii_bus); 2389 dev_set_drvdata(&pldev->dev, sc->mii_bus);
2382 2390
2383 return 0; 2391 return 0;
2384} 2392}
@@ -2409,7 +2417,7 @@ static int sbmac_open(struct net_device *dev)
2409 /* 2417 /*
2410 * Probe PHY address 2418 * Probe PHY address
2411 */ 2419 */
2412 err = mdiobus_register(&sc->mii_bus); 2420 err = mdiobus_register(sc->mii_bus);
2413 if (err) { 2421 if (err) {
2414 printk(KERN_ERR "%s: unable to register MDIO bus\n", 2422 printk(KERN_ERR "%s: unable to register MDIO bus\n",
2415 dev->name); 2423 dev->name);
@@ -2446,7 +2454,7 @@ static int sbmac_open(struct net_device *dev)
2446 return 0; 2454 return 0;
2447 2455
2448out_unregister: 2456out_unregister:
2449 mdiobus_unregister(&sc->mii_bus); 2457 mdiobus_unregister(sc->mii_bus);
2450 2458
2451out_unirq: 2459out_unirq:
2452 free_irq(dev->irq, dev); 2460 free_irq(dev->irq, dev);
@@ -2462,7 +2470,7 @@ static int sbmac_mii_probe(struct net_device *dev)
2462 int i; 2470 int i;
2463 2471
2464 for (i = 0; i < PHY_MAX_ADDR; i++) { 2472 for (i = 0; i < PHY_MAX_ADDR; i++) {
2465 phy_dev = sc->mii_bus.phy_map[i]; 2473 phy_dev = sc->mii_bus->phy_map[i];
2466 if (phy_dev) 2474 if (phy_dev)
2467 break; 2475 break;
2468 } 2476 }
@@ -2568,14 +2576,15 @@ static void sbmac_mii_poll(struct net_device *dev)
2568static void sbmac_tx_timeout (struct net_device *dev) 2576static void sbmac_tx_timeout (struct net_device *dev)
2569{ 2577{
2570 struct sbmac_softc *sc = netdev_priv(dev); 2578 struct sbmac_softc *sc = netdev_priv(dev);
2579 unsigned long flags;
2571 2580
2572 spin_lock_irq (&sc->sbm_lock); 2581 spin_lock_irqsave(&sc->sbm_lock, flags);
2573 2582
2574 2583
2575 dev->trans_start = jiffies; 2584 dev->trans_start = jiffies;
2576 dev->stats.tx_errors++; 2585 dev->stats.tx_errors++;
2577 2586
2578 spin_unlock_irq (&sc->sbm_lock); 2587 spin_unlock_irqrestore(&sc->sbm_lock, flags);
2579 2588
2580 printk (KERN_WARNING "%s: Transmit timed out\n",dev->name); 2589 printk (KERN_WARNING "%s: Transmit timed out\n",dev->name);
2581} 2590}
@@ -2639,7 +2648,7 @@ static int sbmac_close(struct net_device *dev)
2639 phy_disconnect(sc->phy_dev); 2648 phy_disconnect(sc->phy_dev);
2640 sc->phy_dev = NULL; 2649 sc->phy_dev = NULL;
2641 2650
2642 mdiobus_unregister(&sc->mii_bus); 2651 mdiobus_unregister(sc->mii_bus);
2643 2652
2644 free_irq(dev->irq, dev); 2653 free_irq(dev->irq, dev);
2645 2654
@@ -2748,6 +2757,7 @@ static int __exit sbmac_remove(struct platform_device *pldev)
2748 2757
2749 unregister_netdev(dev); 2758 unregister_netdev(dev);
2750 sbmac_uninitctx(sc); 2759 sbmac_uninitctx(sc);
2760 mdiobus_free(sc->mii_bus);
2751 iounmap(sc->sbm_base); 2761 iounmap(sc->sbm_base);
2752 free_netdev(dev); 2762 free_netdev(dev);
2753 2763