diff options
author | David S. Miller <davem@davemloft.net> | 2008-10-11 15:39:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-10-11 15:39:35 -0400 |
commit | 56c5d900dbb8e042bfad035d18433476931d8f93 (patch) | |
tree | 00b793965beeef10db03e0ff021d2d965c410759 /drivers/net/sb1250-mac.c | |
parent | 4dd95b63ae25c5cad6986829b5e8788e9faa0330 (diff) | |
parent | ead9d23d803ea3a73766c3cb27bf7563ac8d7266 (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.c | 48 |
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) | |||
2069 | static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) | 2069 | static 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 | ||
2448 | out_unregister: | 2456 | out_unregister: |
2449 | mdiobus_unregister(&sc->mii_bus); | 2457 | mdiobus_unregister(sc->mii_bus); |
2450 | 2458 | ||
2451 | out_unirq: | 2459 | out_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) | |||
2568 | static void sbmac_tx_timeout (struct net_device *dev) | 2576 | static 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 | ||