diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-14 10:56:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-14 10:56:24 -0400 |
commit | 533bb8a4d7388686243c37a414c4448ba3566f8a (patch) | |
tree | 506ef946871e4499862ecc8513f49b69389ae865 /drivers/net | |
parent | 4f3f8e94b7b079131f0faf641e8afd790a6537d1 (diff) | |
parent | 159d83363b629c91d020734207c1bc788b96af5a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (31 commits)
[BRIDGE]: Fix crash in __ip_route_output_key with bridge netfilter
[NETFILTER]: ipt_CLUSTERIP: fix race between clusterip_config_find_get and _entry_put
[IPV6] ADDRCONF: Don't generate temporary address for ip6-ip6 interface.
[IPV6] ADDRCONF: Ensure disabling multicast RS even if privacy extensions are disabled.
[IPV6]: Use appropriate sock tclass setting for routing lookup.
[IPV6]: IPv6 extension header structures need to be packed.
[IPV6]: Fix ipv6 address fetching in raw6_icmp_error().
[NET]: Return more appropriate error from eth_validate_addr().
[ISDN]: Do not validate ISDN net device address prior to interface-up
[NET]: Fix kernel-doc for skb_segment
[SOCK] sk_stamp: should be initialized to ktime_set(-1L, 0)
net: check for underlength tap writes
net: make struct tun_struct private to tun.c
[SCTP]: IPv4 vs IPv6 addresses mess in sctp_inet[6]addr_event.
[SCTP]: Fix compiler warning about const qualifiers
[SCTP]: Fix protocol violation when receiving an error lenght INIT-ACK
[SCTP]: Add check for hmac_algo parameter in sctp_verify_param()
[NET_SCHED] cls_u32: refcounting fix for u32_delete()
[DCCP]: Fix skb->cb conflicts with IP
[AX25]: Potential ax25_uid_assoc-s leaks on module unload.
...
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ehea/ehea.h | 3 | ||||
-rw-r--r-- | drivers/net/ehea/ehea_main.c | 24 | ||||
-rw-r--r-- | drivers/net/forcedeth.c | 26 | ||||
-rw-r--r-- | drivers/net/fs_enet/fs_enet-main.c | 3 | ||||
-rw-r--r-- | drivers/net/macb.c | 14 | ||||
-rw-r--r-- | drivers/net/sc92031.c | 1 | ||||
-rw-r--r-- | drivers/net/sky2.c | 1 | ||||
-rw-r--r-- | drivers/net/smc91x.c | 2 | ||||
-rw-r--r-- | drivers/net/tg3.c | 7 | ||||
-rw-r--r-- | drivers/net/tun.c | 38 | ||||
-rw-r--r-- | drivers/net/ucc_geth.c | 53 | ||||
-rw-r--r-- | drivers/net/wan/Kconfig | 6 |
12 files changed, 138 insertions, 40 deletions
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 93b7fb246960..a8d3280923e8 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | 41 | ||
42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
43 | #define DRV_VERSION "EHEA_0089" | 43 | #define DRV_VERSION "EHEA_0090" |
44 | 44 | ||
45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
@@ -371,6 +371,7 @@ struct ehea_port_res { | |||
371 | struct ehea_q_skb_arr rq2_skba; | 371 | struct ehea_q_skb_arr rq2_skba; |
372 | struct ehea_q_skb_arr rq3_skba; | 372 | struct ehea_q_skb_arr rq3_skba; |
373 | struct ehea_q_skb_arr sq_skba; | 373 | struct ehea_q_skb_arr sq_skba; |
374 | int sq_skba_size; | ||
374 | spinlock_t netif_queue; | 375 | spinlock_t netif_queue; |
375 | int queue_stopped; | 376 | int queue_stopped; |
376 | int swqe_refill_th; | 377 | int swqe_refill_th; |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 07c742dd3f09..f460b623c077 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -349,7 +349,8 @@ static void ehea_refill_rq1(struct ehea_port_res *pr, int index, int nr_of_wqes) | |||
349 | pr->rq1_skba.os_skbs = 0; | 349 | pr->rq1_skba.os_skbs = 0; |
350 | 350 | ||
351 | if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) { | 351 | if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) { |
352 | pr->rq1_skba.index = index; | 352 | if (nr_of_wqes > 0) |
353 | pr->rq1_skba.index = index; | ||
353 | pr->rq1_skba.os_skbs = fill_wqes; | 354 | pr->rq1_skba.os_skbs = fill_wqes; |
354 | return; | 355 | return; |
355 | } | 356 | } |
@@ -1464,7 +1465,9 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr, | |||
1464 | init_attr->act_nr_rwqes_rq2, | 1465 | init_attr->act_nr_rwqes_rq2, |
1465 | init_attr->act_nr_rwqes_rq3); | 1466 | init_attr->act_nr_rwqes_rq3); |
1466 | 1467 | ||
1467 | ret = ehea_init_q_skba(&pr->sq_skba, init_attr->act_nr_send_wqes + 1); | 1468 | pr->sq_skba_size = init_attr->act_nr_send_wqes + 1; |
1469 | |||
1470 | ret = ehea_init_q_skba(&pr->sq_skba, pr->sq_skba_size); | ||
1468 | ret |= ehea_init_q_skba(&pr->rq1_skba, init_attr->act_nr_rwqes_rq1 + 1); | 1471 | ret |= ehea_init_q_skba(&pr->rq1_skba, init_attr->act_nr_rwqes_rq1 + 1); |
1469 | ret |= ehea_init_q_skba(&pr->rq2_skba, init_attr->act_nr_rwqes_rq2 + 1); | 1472 | ret |= ehea_init_q_skba(&pr->rq2_skba, init_attr->act_nr_rwqes_rq2 + 1); |
1470 | ret |= ehea_init_q_skba(&pr->rq3_skba, init_attr->act_nr_rwqes_rq3 + 1); | 1473 | ret |= ehea_init_q_skba(&pr->rq3_skba, init_attr->act_nr_rwqes_rq3 + 1); |
@@ -2621,6 +2624,22 @@ void ehea_purge_sq(struct ehea_qp *orig_qp) | |||
2621 | } | 2624 | } |
2622 | } | 2625 | } |
2623 | 2626 | ||
2627 | void ehea_flush_sq(struct ehea_port *port) | ||
2628 | { | ||
2629 | int i; | ||
2630 | |||
2631 | for (i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) { | ||
2632 | struct ehea_port_res *pr = &port->port_res[i]; | ||
2633 | int swqe_max = pr->sq_skba_size - 2 - pr->swqe_ll_count; | ||
2634 | int k = 0; | ||
2635 | while (atomic_read(&pr->swqe_avail) < swqe_max) { | ||
2636 | msleep(5); | ||
2637 | if (++k == 20) | ||
2638 | break; | ||
2639 | } | ||
2640 | } | ||
2641 | } | ||
2642 | |||
2624 | int ehea_stop_qps(struct net_device *dev) | 2643 | int ehea_stop_qps(struct net_device *dev) |
2625 | { | 2644 | { |
2626 | struct ehea_port *port = netdev_priv(dev); | 2645 | struct ehea_port *port = netdev_priv(dev); |
@@ -2845,6 +2864,7 @@ static void ehea_rereg_mrs(struct work_struct *work) | |||
2845 | if (dev->flags & IFF_UP) { | 2864 | if (dev->flags & IFF_UP) { |
2846 | down(&port->port_lock); | 2865 | down(&port->port_lock); |
2847 | netif_stop_queue(dev); | 2866 | netif_stop_queue(dev); |
2867 | ehea_flush_sq(port); | ||
2848 | ret = ehea_stop_qps(dev); | 2868 | ret = ehea_stop_qps(dev); |
2849 | if (ret) { | 2869 | if (ret) { |
2850 | up(&port->port_lock); | 2870 | up(&port->port_lock); |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 419f533006ab..9f088a47d8b1 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -5316,8 +5316,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
5316 | 5316 | ||
5317 | /* check the workaround bit for correct mac address order */ | 5317 | /* check the workaround bit for correct mac address order */ |
5318 | txreg = readl(base + NvRegTransmitPoll); | 5318 | txreg = readl(base + NvRegTransmitPoll); |
5319 | if ((txreg & NVREG_TRANSMITPOLL_MAC_ADDR_REV) || | 5319 | if (id->driver_data & DEV_HAS_CORRECT_MACADDR) { |
5320 | (id->driver_data & DEV_HAS_CORRECT_MACADDR)) { | ||
5321 | /* mac address is already in correct order */ | 5320 | /* mac address is already in correct order */ |
5322 | dev->dev_addr[0] = (np->orig_mac[0] >> 0) & 0xff; | 5321 | dev->dev_addr[0] = (np->orig_mac[0] >> 0) & 0xff; |
5323 | dev->dev_addr[1] = (np->orig_mac[0] >> 8) & 0xff; | 5322 | dev->dev_addr[1] = (np->orig_mac[0] >> 8) & 0xff; |
@@ -5325,6 +5324,22 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
5325 | dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff; | 5324 | dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff; |
5326 | dev->dev_addr[4] = (np->orig_mac[1] >> 0) & 0xff; | 5325 | dev->dev_addr[4] = (np->orig_mac[1] >> 0) & 0xff; |
5327 | dev->dev_addr[5] = (np->orig_mac[1] >> 8) & 0xff; | 5326 | dev->dev_addr[5] = (np->orig_mac[1] >> 8) & 0xff; |
5327 | } else if (txreg & NVREG_TRANSMITPOLL_MAC_ADDR_REV) { | ||
5328 | /* mac address is already in correct order */ | ||
5329 | dev->dev_addr[0] = (np->orig_mac[0] >> 0) & 0xff; | ||
5330 | dev->dev_addr[1] = (np->orig_mac[0] >> 8) & 0xff; | ||
5331 | dev->dev_addr[2] = (np->orig_mac[0] >> 16) & 0xff; | ||
5332 | dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff; | ||
5333 | dev->dev_addr[4] = (np->orig_mac[1] >> 0) & 0xff; | ||
5334 | dev->dev_addr[5] = (np->orig_mac[1] >> 8) & 0xff; | ||
5335 | /* | ||
5336 | * Set orig mac address back to the reversed version. | ||
5337 | * This flag will be cleared during low power transition. | ||
5338 | * Therefore, we should always put back the reversed address. | ||
5339 | */ | ||
5340 | np->orig_mac[0] = (dev->dev_addr[5] << 0) + (dev->dev_addr[4] << 8) + | ||
5341 | (dev->dev_addr[3] << 16) + (dev->dev_addr[2] << 24); | ||
5342 | np->orig_mac[1] = (dev->dev_addr[1] << 0) + (dev->dev_addr[0] << 8); | ||
5328 | } else { | 5343 | } else { |
5329 | /* need to reverse mac address to correct order */ | 5344 | /* need to reverse mac address to correct order */ |
5330 | dev->dev_addr[0] = (np->orig_mac[1] >> 8) & 0xff; | 5345 | dev->dev_addr[0] = (np->orig_mac[1] >> 8) & 0xff; |
@@ -5595,7 +5610,9 @@ out: | |||
5595 | static int nv_resume(struct pci_dev *pdev) | 5610 | static int nv_resume(struct pci_dev *pdev) |
5596 | { | 5611 | { |
5597 | struct net_device *dev = pci_get_drvdata(pdev); | 5612 | struct net_device *dev = pci_get_drvdata(pdev); |
5613 | u8 __iomem *base = get_hwbase(dev); | ||
5598 | int rc = 0; | 5614 | int rc = 0; |
5615 | u32 txreg; | ||
5599 | 5616 | ||
5600 | if (!netif_running(dev)) | 5617 | if (!netif_running(dev)) |
5601 | goto out; | 5618 | goto out; |
@@ -5606,6 +5623,11 @@ static int nv_resume(struct pci_dev *pdev) | |||
5606 | pci_restore_state(pdev); | 5623 | pci_restore_state(pdev); |
5607 | pci_enable_wake(pdev, PCI_D0, 0); | 5624 | pci_enable_wake(pdev, PCI_D0, 0); |
5608 | 5625 | ||
5626 | /* restore mac address reverse flag */ | ||
5627 | txreg = readl(base + NvRegTransmitPoll); | ||
5628 | txreg |= NVREG_TRANSMITPOLL_MAC_ADDR_REV; | ||
5629 | writel(txreg, base + NvRegTransmitPoll); | ||
5630 | |||
5609 | rc = nv_open(dev); | 5631 | rc = nv_open(dev); |
5610 | out: | 5632 | out: |
5611 | return rc; | 5633 | return rc; |
diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index af869cf9ae7d..940e2041ba38 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c | |||
@@ -835,7 +835,8 @@ static int fs_enet_close(struct net_device *dev) | |||
835 | 835 | ||
836 | netif_stop_queue(dev); | 836 | netif_stop_queue(dev); |
837 | netif_carrier_off(dev); | 837 | netif_carrier_off(dev); |
838 | napi_disable(&fep->napi); | 838 | if (fep->fpi->use_napi) |
839 | napi_disable(&fep->napi); | ||
839 | phy_stop(fep->phydev); | 840 | phy_stop(fep->phydev); |
840 | 841 | ||
841 | spin_lock_irqsave(&fep->lock, flags); | 842 | spin_lock_irqsave(&fep->lock, flags); |
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 1d210ed46130..489c7c3b90d9 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
@@ -242,12 +242,12 @@ static int macb_mii_init(struct macb *bp) | |||
242 | /* Enable managment port */ | 242 | /* Enable managment port */ |
243 | macb_writel(bp, NCR, MACB_BIT(MPE)); | 243 | macb_writel(bp, NCR, MACB_BIT(MPE)); |
244 | 244 | ||
245 | bp->mii_bus.name = "MACB_mii_bus", | 245 | bp->mii_bus.name = "MACB_mii_bus"; |
246 | bp->mii_bus.read = &macb_mdio_read, | 246 | bp->mii_bus.read = &macb_mdio_read; |
247 | bp->mii_bus.write = &macb_mdio_write, | 247 | bp->mii_bus.write = &macb_mdio_write; |
248 | bp->mii_bus.reset = &macb_mdio_reset, | 248 | bp->mii_bus.reset = &macb_mdio_reset; |
249 | bp->mii_bus.id = bp->pdev->id, | 249 | bp->mii_bus.id = bp->pdev->id; |
250 | bp->mii_bus.priv = bp, | 250 | bp->mii_bus.priv = bp; |
251 | bp->mii_bus.dev = &bp->dev->dev; | 251 | bp->mii_bus.dev = &bp->dev->dev; |
252 | pdata = bp->pdev->dev.platform_data; | 252 | pdata = bp->pdev->dev.platform_data; |
253 | 253 | ||
@@ -1257,6 +1257,8 @@ static int __exit macb_remove(struct platform_device *pdev) | |||
1257 | 1257 | ||
1258 | if (dev) { | 1258 | if (dev) { |
1259 | bp = netdev_priv(dev); | 1259 | bp = netdev_priv(dev); |
1260 | if (bp->phy_dev) | ||
1261 | phy_disconnect(bp->phy_dev); | ||
1260 | mdiobus_unregister(&bp->mii_bus); | 1262 | mdiobus_unregister(&bp->mii_bus); |
1261 | kfree(bp->mii_bus.irq); | 1263 | kfree(bp->mii_bus.irq); |
1262 | unregister_netdev(dev); | 1264 | unregister_netdev(dev); |
diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c index 37b42394560d..15fcee55284e 100644 --- a/drivers/net/sc92031.c +++ b/drivers/net/sc92031.c | |||
@@ -1446,6 +1446,7 @@ static int __devinit sc92031_probe(struct pci_dev *pdev, | |||
1446 | } | 1446 | } |
1447 | 1447 | ||
1448 | pci_set_drvdata(pdev, dev); | 1448 | pci_set_drvdata(pdev, dev); |
1449 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
1449 | 1450 | ||
1450 | #if SC92031_USE_BAR == 0 | 1451 | #if SC92031_USE_BAR == 0 |
1451 | dev->mem_start = pci_resource_start(pdev, SC92031_USE_BAR); | 1452 | dev->mem_start = pci_resource_start(pdev, SC92031_USE_BAR); |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 853bce0ac478..f226bcac7d17 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -154,6 +154,7 @@ static const char *yukon2_name[] = { | |||
154 | "EC", /* 0xb6 */ | 154 | "EC", /* 0xb6 */ |
155 | "FE", /* 0xb7 */ | 155 | "FE", /* 0xb7 */ |
156 | "FE+", /* 0xb8 */ | 156 | "FE+", /* 0xb8 */ |
157 | "Supreme", /* 0xb9 */ | ||
157 | }; | 158 | }; |
158 | 159 | ||
159 | static void sky2_set_multicast(struct net_device *dev); | 160 | static void sky2_set_multicast(struct net_device *dev); |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index 4020e9e955b3..63a54e29d563 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
@@ -1326,9 +1326,11 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id) | |||
1326 | SMC_SET_INT_MASK(mask); | 1326 | SMC_SET_INT_MASK(mask); |
1327 | spin_unlock(&lp->lock); | 1327 | spin_unlock(&lp->lock); |
1328 | 1328 | ||
1329 | #ifndef CONFIG_NET_POLL_CONTROLLER | ||
1329 | if (timeout == MAX_IRQ_LOOPS) | 1330 | if (timeout == MAX_IRQ_LOOPS) |
1330 | PRINTK("%s: spurious interrupt (mask = 0x%02x)\n", | 1331 | PRINTK("%s: spurious interrupt (mask = 0x%02x)\n", |
1331 | dev->name, mask); | 1332 | dev->name, mask); |
1333 | #endif | ||
1332 | DBG(3, "%s: Interrupt done (%d loops)\n", | 1334 | DBG(3, "%s: Interrupt done (%d loops)\n", |
1333 | dev->name, MAX_IRQ_LOOPS - timeout); | 1335 | dev->name, MAX_IRQ_LOOPS - timeout); |
1334 | 1336 | ||
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index d4655b2d1f3f..96043c5746d0 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -64,8 +64,8 @@ | |||
64 | 64 | ||
65 | #define DRV_MODULE_NAME "tg3" | 65 | #define DRV_MODULE_NAME "tg3" |
66 | #define PFX DRV_MODULE_NAME ": " | 66 | #define PFX DRV_MODULE_NAME ": " |
67 | #define DRV_MODULE_VERSION "3.89" | 67 | #define DRV_MODULE_VERSION "3.90" |
68 | #define DRV_MODULE_RELDATE "April 03, 2008" | 68 | #define DRV_MODULE_RELDATE "April 12, 2008" |
69 | 69 | ||
70 | #define TG3_DEF_MAC_MODE 0 | 70 | #define TG3_DEF_MAC_MODE 0 |
71 | #define TG3_DEF_RX_MODE 0 | 71 | #define TG3_DEF_RX_MODE 0 |
@@ -12578,7 +12578,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
12578 | const struct pci_device_id *ent) | 12578 | const struct pci_device_id *ent) |
12579 | { | 12579 | { |
12580 | static int tg3_version_printed = 0; | 12580 | static int tg3_version_printed = 0; |
12581 | unsigned long tg3reg_base, tg3reg_len; | 12581 | resource_size_t tg3reg_base; |
12582 | unsigned long tg3reg_len; | ||
12582 | struct net_device *dev; | 12583 | struct net_device *dev; |
12583 | struct tg3 *tp; | 12584 | struct tg3 *tp; |
12584 | int err, pm_cap; | 12585 | int err, pm_cap; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 7b816a032957..5b5d87585d91 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -67,9 +67,42 @@ | |||
67 | #include <asm/system.h> | 67 | #include <asm/system.h> |
68 | #include <asm/uaccess.h> | 68 | #include <asm/uaccess.h> |
69 | 69 | ||
70 | /* Uncomment to enable debugging */ | ||
71 | /* #define TUN_DEBUG 1 */ | ||
72 | |||
70 | #ifdef TUN_DEBUG | 73 | #ifdef TUN_DEBUG |
71 | static int debug; | 74 | static int debug; |
75 | |||
76 | #define DBG if(tun->debug)printk | ||
77 | #define DBG1 if(debug==2)printk | ||
78 | #else | ||
79 | #define DBG( a... ) | ||
80 | #define DBG1( a... ) | ||
81 | #endif | ||
82 | |||
83 | struct tun_struct { | ||
84 | struct list_head list; | ||
85 | unsigned long flags; | ||
86 | int attached; | ||
87 | uid_t owner; | ||
88 | gid_t group; | ||
89 | |||
90 | wait_queue_head_t read_wait; | ||
91 | struct sk_buff_head readq; | ||
92 | |||
93 | struct net_device *dev; | ||
94 | |||
95 | struct fasync_struct *fasync; | ||
96 | |||
97 | unsigned long if_flags; | ||
98 | u8 dev_addr[ETH_ALEN]; | ||
99 | u32 chr_filter[2]; | ||
100 | u32 net_filter[2]; | ||
101 | |||
102 | #ifdef TUN_DEBUG | ||
103 | int debug; | ||
72 | #endif | 104 | #endif |
105 | }; | ||
73 | 106 | ||
74 | /* Network device part of the driver */ | 107 | /* Network device part of the driver */ |
75 | 108 | ||
@@ -253,8 +286,11 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, | |||
253 | return -EFAULT; | 286 | return -EFAULT; |
254 | } | 287 | } |
255 | 288 | ||
256 | if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) | 289 | if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) { |
257 | align = NET_IP_ALIGN; | 290 | align = NET_IP_ALIGN; |
291 | if (unlikely(len < ETH_HLEN)) | ||
292 | return -EINVAL; | ||
293 | } | ||
258 | 294 | ||
259 | if (!(skb = alloc_skb(len + align, GFP_KERNEL))) { | 295 | if (!(skb = alloc_skb(len + align, GFP_KERNEL))) { |
260 | tun->dev->stats.rx_dropped++; | 296 | tun->dev->stats.rx_dropped++; |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 8cc316653a39..0ee4c168e4c0 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
@@ -3833,6 +3833,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
3833 | struct device_node *phy; | 3833 | struct device_node *phy; |
3834 | int err, ucc_num, max_speed = 0; | 3834 | int err, ucc_num, max_speed = 0; |
3835 | const phandle *ph; | 3835 | const phandle *ph; |
3836 | const u32 *fixed_link; | ||
3836 | const unsigned int *prop; | 3837 | const unsigned int *prop; |
3837 | const char *sprop; | 3838 | const char *sprop; |
3838 | const void *mac_addr; | 3839 | const void *mac_addr; |
@@ -3923,18 +3924,38 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
3923 | 3924 | ||
3924 | ug_info->uf_info.regs = res.start; | 3925 | ug_info->uf_info.regs = res.start; |
3925 | ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); | 3926 | ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); |
3927 | fixed_link = of_get_property(np, "fixed-link", NULL); | ||
3928 | if (fixed_link) { | ||
3929 | ug_info->mdio_bus = 0; | ||
3930 | ug_info->phy_address = fixed_link[0]; | ||
3931 | phy = NULL; | ||
3932 | } else { | ||
3933 | ph = of_get_property(np, "phy-handle", NULL); | ||
3934 | phy = of_find_node_by_phandle(*ph); | ||
3926 | 3935 | ||
3927 | ph = of_get_property(np, "phy-handle", NULL); | 3936 | if (phy == NULL) |
3928 | phy = of_find_node_by_phandle(*ph); | 3937 | return -ENODEV; |
3929 | 3938 | ||
3930 | if (phy == NULL) | 3939 | /* set the PHY address */ |
3931 | return -ENODEV; | 3940 | prop = of_get_property(phy, "reg", NULL); |
3941 | if (prop == NULL) | ||
3942 | return -1; | ||
3943 | ug_info->phy_address = *prop; | ||
3944 | |||
3945 | /* Set the bus id */ | ||
3946 | mdio = of_get_parent(phy); | ||
3947 | |||
3948 | if (mdio == NULL) | ||
3949 | return -1; | ||
3932 | 3950 | ||
3933 | /* set the PHY address */ | 3951 | err = of_address_to_resource(mdio, 0, &res); |
3934 | prop = of_get_property(phy, "reg", NULL); | 3952 | of_node_put(mdio); |
3935 | if (prop == NULL) | 3953 | |
3936 | return -1; | 3954 | if (err) |
3937 | ug_info->phy_address = *prop; | 3955 | return -1; |
3956 | |||
3957 | ug_info->mdio_bus = res.start; | ||
3958 | } | ||
3938 | 3959 | ||
3939 | /* get the phy interface type, or default to MII */ | 3960 | /* get the phy interface type, or default to MII */ |
3940 | prop = of_get_property(np, "phy-connection-type", NULL); | 3961 | prop = of_get_property(np, "phy-connection-type", NULL); |
@@ -3979,20 +4000,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
3979 | ug_info->numThreadsRx = UCC_GETH_NUM_OF_THREADS_4; | 4000 | ug_info->numThreadsRx = UCC_GETH_NUM_OF_THREADS_4; |
3980 | } | 4001 | } |
3981 | 4002 | ||
3982 | /* Set the bus id */ | ||
3983 | mdio = of_get_parent(phy); | ||
3984 | |||
3985 | if (mdio == NULL) | ||
3986 | return -1; | ||
3987 | |||
3988 | err = of_address_to_resource(mdio, 0, &res); | ||
3989 | of_node_put(mdio); | ||
3990 | |||
3991 | if (err) | ||
3992 | return -1; | ||
3993 | |||
3994 | ug_info->mdio_bus = res.start; | ||
3995 | |||
3996 | if (netif_msg_probe(&debug)) | 4003 | if (netif_msg_probe(&debug)) |
3997 | printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n", | 4004 | printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n", |
3998 | ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs, | 4005 | ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs, |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index a3df09ee729f..8005dd16fb4e 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
@@ -150,9 +150,13 @@ config HDLC_FR | |||
150 | 150 | ||
151 | config HDLC_PPP | 151 | config HDLC_PPP |
152 | tristate "Synchronous Point-to-Point Protocol (PPP) support" | 152 | tristate "Synchronous Point-to-Point Protocol (PPP) support" |
153 | depends on HDLC | 153 | depends on HDLC && BROKEN |
154 | help | 154 | help |
155 | Generic HDLC driver supporting PPP over WAN connections. | 155 | Generic HDLC driver supporting PPP over WAN connections. |
156 | This module is currently broken and will cause a kernel panic | ||
157 | when a device configured in PPP mode is activated. | ||
158 | |||
159 | It will be replaced by new PPP implementation in Linux 2.6.26. | ||
156 | 160 | ||
157 | If unsure, say N. | 161 | If unsure, say N. |
158 | 162 | ||