diff options
| -rw-r--r-- | drivers/isdn/gigaset/isocdata.c | 2 | ||||
| -rw-r--r-- | drivers/net/Makefile | 2 | ||||
| -rw-r--r-- | drivers/net/gianfar.c | 11 | ||||
| -rw-r--r-- | drivers/net/mac8390.c | 10 | ||||
| -rw-r--r-- | drivers/net/r8169.c | 102 | ||||
| -rw-r--r-- | drivers/net/wimax/i2400m/usb.c | 35 | ||||
| -rw-r--r-- | drivers/net/wireless/airo.c | 23 | ||||
| -rw-r--r-- | drivers/net/wireless/ath5k/phy.c | 49 | ||||
| -rw-r--r-- | drivers/net/wireless/ath5k/reset.c | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00debug.c | 2 | ||||
| -rw-r--r-- | net/core/pktgen.c | 2 | ||||
| -rw-r--r-- | net/ipv4/fib_trie.c | 6 | ||||
| -rw-r--r-- | net/ipv4/route.c | 60 | ||||
| -rw-r--r-- | net/ipv4/tcp_vegas.c | 11 | ||||
| -rw-r--r-- | net/ipv6/route.c | 3 | ||||
| -rw-r--r-- | net/rxrpc/ar-connection.c | 12 | ||||
| -rw-r--r-- | net/wireless/reg.c | 7 | ||||
| -rw-r--r-- | net/wireless/wext.c | 7 |
22 files changed, 216 insertions, 161 deletions
diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c index b171e75cb52e..29808c4fb1cb 100644 --- a/drivers/isdn/gigaset/isocdata.c +++ b/drivers/isdn/gigaset/isocdata.c | |||
| @@ -175,7 +175,7 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size) | |||
| 175 | return -EINVAL; | 175 | return -EINVAL; |
| 176 | } | 176 | } |
| 177 | src = iwb->read; | 177 | src = iwb->read; |
| 178 | if (unlikely(limit > BAS_OUTBUFSIZE + BAS_OUTBUFPAD || | 178 | if (unlikely(limit >= BAS_OUTBUFSIZE + BAS_OUTBUFPAD || |
| 179 | (read < src && limit >= src))) { | 179 | (read < src && limit >= src))) { |
| 180 | pr_err("isoc write buffer frame reservation violated\n"); | 180 | pr_err("isoc write buffer frame reservation violated\n"); |
| 181 | return -EFAULT; | 181 | return -EFAULT; |
diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 1fc4602a6ff2..a1c25cb4669f 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile | |||
| @@ -102,7 +102,7 @@ obj-$(CONFIG_HAMACHI) += hamachi.o | |||
| 102 | obj-$(CONFIG_NET) += Space.o loopback.o | 102 | obj-$(CONFIG_NET) += Space.o loopback.o |
| 103 | obj-$(CONFIG_SEEQ8005) += seeq8005.o | 103 | obj-$(CONFIG_SEEQ8005) += seeq8005.o |
| 104 | obj-$(CONFIG_NET_SB1000) += sb1000.o | 104 | obj-$(CONFIG_NET_SB1000) += sb1000.o |
| 105 | obj-$(CONFIG_MAC8390) += mac8390.o 8390.o | 105 | obj-$(CONFIG_MAC8390) += mac8390.o |
| 106 | obj-$(CONFIG_APNE) += apne.o 8390.o | 106 | obj-$(CONFIG_APNE) += apne.o 8390.o |
| 107 | obj-$(CONFIG_PCMCIA_PCNET) += 8390.o | 107 | obj-$(CONFIG_PCMCIA_PCNET) += 8390.o |
| 108 | obj-$(CONFIG_HP100) += hp100.o | 108 | obj-$(CONFIG_HP100) += hp100.o |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index b2c49679bba7..a0519184e54e 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -1885,8 +1885,17 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit) | |||
| 1885 | 1885 | ||
| 1886 | if (unlikely(!newskb)) | 1886 | if (unlikely(!newskb)) |
| 1887 | newskb = skb; | 1887 | newskb = skb; |
| 1888 | else if (skb) | 1888 | else if (skb) { |
| 1889 | /* | ||
| 1890 | * We need to reset ->data to what it | ||
| 1891 | * was before gfar_new_skb() re-aligned | ||
| 1892 | * it to an RXBUF_ALIGNMENT boundary | ||
| 1893 | * before we put the skb back on the | ||
| 1894 | * recycle list. | ||
| 1895 | */ | ||
| 1896 | skb->data = skb->head + NET_SKB_PAD; | ||
| 1889 | __skb_queue_head(&priv->rx_recycle, skb); | 1897 | __skb_queue_head(&priv->rx_recycle, skb); |
| 1898 | } | ||
| 1890 | } else { | 1899 | } else { |
| 1891 | /* Increment the number of packets */ | 1900 | /* Increment the number of packets */ |
| 1892 | dev->stats.rx_packets++; | 1901 | dev->stats.rx_packets++; |
diff --git a/drivers/net/mac8390.c b/drivers/net/mac8390.c index 8e884869a05b..f26667d5eaae 100644 --- a/drivers/net/mac8390.c +++ b/drivers/net/mac8390.c | |||
| @@ -304,7 +304,7 @@ struct net_device * __init mac8390_probe(int unit) | |||
| 304 | if (!MACH_IS_MAC) | 304 | if (!MACH_IS_MAC) |
| 305 | return ERR_PTR(-ENODEV); | 305 | return ERR_PTR(-ENODEV); |
| 306 | 306 | ||
| 307 | dev = alloc_ei_netdev(); | 307 | dev = ____alloc_ei_netdev(0); |
| 308 | if (!dev) | 308 | if (!dev) |
| 309 | return ERR_PTR(-ENOMEM); | 309 | return ERR_PTR(-ENOMEM); |
| 310 | 310 | ||
| @@ -481,10 +481,10 @@ void cleanup_module(void) | |||
| 481 | static const struct net_device_ops mac8390_netdev_ops = { | 481 | static const struct net_device_ops mac8390_netdev_ops = { |
| 482 | .ndo_open = mac8390_open, | 482 | .ndo_open = mac8390_open, |
| 483 | .ndo_stop = mac8390_close, | 483 | .ndo_stop = mac8390_close, |
| 484 | .ndo_start_xmit = ei_start_xmit, | 484 | .ndo_start_xmit = __ei_start_xmit, |
| 485 | .ndo_tx_timeout = ei_tx_timeout, | 485 | .ndo_tx_timeout = __ei_tx_timeout, |
| 486 | .ndo_get_stats = ei_get_stats, | 486 | .ndo_get_stats = __ei_get_stats, |
| 487 | .ndo_set_multicast_list = ei_set_multicast_list, | 487 | .ndo_set_multicast_list = __ei_set_multicast_list, |
| 488 | .ndo_validate_addr = eth_validate_addr, | 488 | .ndo_validate_addr = eth_validate_addr, |
| 489 | .ndo_set_mac_address = eth_mac_addr, | 489 | .ndo_set_mac_address = eth_mac_addr, |
| 490 | .ndo_change_mtu = eth_change_mtu, | 490 | .ndo_change_mtu = eth_change_mtu, |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 0b6e8c896835..8247a945a1d9 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -3554,54 +3554,64 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) | |||
| 3554 | int handled = 0; | 3554 | int handled = 0; |
| 3555 | int status; | 3555 | int status; |
| 3556 | 3556 | ||
| 3557 | /* loop handling interrupts until we have no new ones or | ||
| 3558 | * we hit a invalid/hotplug case. | ||
| 3559 | */ | ||
| 3557 | status = RTL_R16(IntrStatus); | 3560 | status = RTL_R16(IntrStatus); |
| 3561 | while (status && status != 0xffff) { | ||
| 3562 | handled = 1; | ||
| 3558 | 3563 | ||
| 3559 | /* hotplug/major error/no more work/shared irq */ | 3564 | /* Handle all of the error cases first. These will reset |
| 3560 | if ((status == 0xffff) || !status) | 3565 | * the chip, so just exit the loop. |
| 3561 | goto out; | 3566 | */ |
| 3562 | 3567 | if (unlikely(!netif_running(dev))) { | |
| 3563 | handled = 1; | 3568 | rtl8169_asic_down(ioaddr); |
| 3569 | break; | ||
| 3570 | } | ||
| 3564 | 3571 | ||
| 3565 | if (unlikely(!netif_running(dev))) { | 3572 | /* Work around for rx fifo overflow */ |
| 3566 | rtl8169_asic_down(ioaddr); | 3573 | if (unlikely(status & RxFIFOOver) && |
| 3567 | goto out; | 3574 | (tp->mac_version == RTL_GIGA_MAC_VER_11)) { |
| 3568 | } | 3575 | netif_stop_queue(dev); |
| 3576 | rtl8169_tx_timeout(dev); | ||
| 3577 | break; | ||
| 3578 | } | ||
| 3569 | 3579 | ||
| 3570 | status &= tp->intr_mask; | 3580 | if (unlikely(status & SYSErr)) { |
| 3571 | RTL_W16(IntrStatus, | 3581 | rtl8169_pcierr_interrupt(dev); |
| 3572 | (status & RxFIFOOver) ? (status | RxOverflow) : status); | 3582 | break; |
| 3583 | } | ||
| 3573 | 3584 | ||
| 3574 | if (!(status & tp->intr_event)) | 3585 | if (status & LinkChg) |
| 3575 | goto out; | 3586 | rtl8169_check_link_status(dev, tp, ioaddr); |
| 3576 | 3587 | ||
| 3577 | /* Work around for rx fifo overflow */ | 3588 | /* We need to see the lastest version of tp->intr_mask to |
| 3578 | if (unlikely(status & RxFIFOOver) && | 3589 | * avoid ignoring an MSI interrupt and having to wait for |
| 3579 | (tp->mac_version == RTL_GIGA_MAC_VER_11)) { | 3590 | * another event which may never come. |
| 3580 | netif_stop_queue(dev); | 3591 | */ |
| 3581 | rtl8169_tx_timeout(dev); | 3592 | smp_rmb(); |
| 3582 | goto out; | 3593 | if (status & tp->intr_mask & tp->napi_event) { |
| 3583 | } | 3594 | RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event); |
| 3595 | tp->intr_mask = ~tp->napi_event; | ||
| 3596 | |||
| 3597 | if (likely(napi_schedule_prep(&tp->napi))) | ||
| 3598 | __napi_schedule(&tp->napi); | ||
| 3599 | else if (netif_msg_intr(tp)) { | ||
| 3600 | printk(KERN_INFO "%s: interrupt %04x in poll\n", | ||
| 3601 | dev->name, status); | ||
| 3602 | } | ||
| 3603 | } | ||
| 3584 | 3604 | ||
| 3585 | if (unlikely(status & SYSErr)) { | 3605 | /* We only get a new MSI interrupt when all active irq |
| 3586 | rtl8169_pcierr_interrupt(dev); | 3606 | * sources on the chip have been acknowledged. So, ack |
| 3587 | goto out; | 3607 | * everything we've seen and check if new sources have become |
| 3608 | * active to avoid blocking all interrupts from the chip. | ||
| 3609 | */ | ||
| 3610 | RTL_W16(IntrStatus, | ||
| 3611 | (status & RxFIFOOver) ? (status | RxOverflow) : status); | ||
| 3612 | status = RTL_R16(IntrStatus); | ||
| 3588 | } | 3613 | } |
| 3589 | 3614 | ||
| 3590 | if (status & LinkChg) | ||
| 3591 | rtl8169_check_link_status(dev, tp, ioaddr); | ||
| 3592 | |||
| 3593 | if (status & tp->napi_event) { | ||
| 3594 | RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event); | ||
| 3595 | tp->intr_mask = ~tp->napi_event; | ||
| 3596 | |||
| 3597 | if (likely(napi_schedule_prep(&tp->napi))) | ||
| 3598 | __napi_schedule(&tp->napi); | ||
| 3599 | else if (netif_msg_intr(tp)) { | ||
| 3600 | printk(KERN_INFO "%s: interrupt %04x in poll\n", | ||
| 3601 | dev->name, status); | ||
| 3602 | } | ||
| 3603 | } | ||
| 3604 | out: | ||
| 3605 | return IRQ_RETVAL(handled); | 3615 | return IRQ_RETVAL(handled); |
| 3606 | } | 3616 | } |
| 3607 | 3617 | ||
| @@ -3617,13 +3627,15 @@ static int rtl8169_poll(struct napi_struct *napi, int budget) | |||
| 3617 | 3627 | ||
| 3618 | if (work_done < budget) { | 3628 | if (work_done < budget) { |
| 3619 | napi_complete(napi); | 3629 | napi_complete(napi); |
| 3620 | tp->intr_mask = 0xffff; | 3630 | |
| 3621 | /* | 3631 | /* We need for force the visibility of tp->intr_mask |
| 3622 | * 20040426: the barrier is not strictly required but the | 3632 | * for other CPUs, as we can loose an MSI interrupt |
| 3623 | * behavior of the irq handler could be less predictable | 3633 | * and potentially wait for a retransmit timeout if we don't. |
| 3624 | * without it. Btw, the lack of flush for the posted pci | 3634 | * The posted write to IntrMask is safe, as it will |
| 3625 | * write is safe - FR | 3635 | * eventually make it to the chip and we won't loose anything |
| 3636 | * until it does. | ||
| 3626 | */ | 3637 | */ |
| 3638 | tp->intr_mask = 0xffff; | ||
| 3627 | smp_wmb(); | 3639 | smp_wmb(); |
| 3628 | RTL_W16(IntrMask, tp->intr_event); | 3640 | RTL_W16(IntrMask, tp->intr_event); |
| 3629 | } | 3641 | } |
diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c index ca4151a9e222..17851321b7fd 100644 --- a/drivers/net/wimax/i2400m/usb.c +++ b/drivers/net/wimax/i2400m/usb.c | |||
| @@ -505,27 +505,52 @@ int i2400mu_suspend(struct usb_interface *iface, pm_message_t pm_msg) | |||
| 505 | #ifdef CONFIG_PM | 505 | #ifdef CONFIG_PM |
| 506 | struct usb_device *usb_dev = i2400mu->usb_dev; | 506 | struct usb_device *usb_dev = i2400mu->usb_dev; |
| 507 | #endif | 507 | #endif |
| 508 | unsigned is_autosuspend = 0; | ||
| 508 | struct i2400m *i2400m = &i2400mu->i2400m; | 509 | struct i2400m *i2400m = &i2400mu->i2400m; |
| 509 | 510 | ||
| 511 | #ifdef CONFIG_PM | ||
| 512 | if (usb_dev->auto_pm > 0) | ||
| 513 | is_autosuspend = 1; | ||
| 514 | #endif | ||
| 515 | |||
| 510 | d_fnstart(3, dev, "(iface %p pm_msg %u)\n", iface, pm_msg.event); | 516 | d_fnstart(3, dev, "(iface %p pm_msg %u)\n", iface, pm_msg.event); |
| 511 | if (i2400m->updown == 0) | 517 | if (i2400m->updown == 0) |
| 512 | goto no_firmware; | 518 | goto no_firmware; |
| 513 | d_printf(1, dev, "fw up, requesting standby\n"); | 519 | if (i2400m->state == I2400M_SS_DATA_PATH_CONNECTED && is_autosuspend) { |
| 520 | /* ugh -- the device is connected and this suspend | ||
| 521 | * request is an autosuspend one (not a system standby | ||
| 522 | * / hibernate). | ||
| 523 | * | ||
| 524 | * The only way the device can go to standby is if the | ||
| 525 | * link with the base station is in IDLE mode; that | ||
| 526 | * were the case, we'd be in status | ||
| 527 | * I2400M_SS_CONNECTED_IDLE. But we are not. | ||
| 528 | * | ||
| 529 | * If we *tell* him to go power save now, it'll reset | ||
| 530 | * as a precautionary measure, so if this is an | ||
| 531 | * autosuspend thing, say no and it'll come back | ||
| 532 | * later, when the link is IDLE | ||
| 533 | */ | ||
| 534 | result = -EBADF; | ||
| 535 | d_printf(1, dev, "fw up, link up, not-idle, autosuspend: " | ||
| 536 | "not entering powersave\n"); | ||
| 537 | goto error_not_now; | ||
| 538 | } | ||
| 539 | d_printf(1, dev, "fw up: entering powersave\n"); | ||
| 514 | atomic_dec(&i2400mu->do_autopm); | 540 | atomic_dec(&i2400mu->do_autopm); |
| 515 | result = i2400m_cmd_enter_powersave(i2400m); | 541 | result = i2400m_cmd_enter_powersave(i2400m); |
| 516 | atomic_inc(&i2400mu->do_autopm); | 542 | atomic_inc(&i2400mu->do_autopm); |
| 517 | #ifdef CONFIG_PM | 543 | if (result < 0 && !is_autosuspend) { |
| 518 | if (result < 0 && usb_dev->auto_pm == 0) { | ||
| 519 | /* System suspend, can't fail */ | 544 | /* System suspend, can't fail */ |
| 520 | dev_err(dev, "failed to suspend, will reset on resume\n"); | 545 | dev_err(dev, "failed to suspend, will reset on resume\n"); |
| 521 | result = 0; | 546 | result = 0; |
| 522 | } | 547 | } |
| 523 | #endif | ||
| 524 | if (result < 0) | 548 | if (result < 0) |
| 525 | goto error_enter_powersave; | 549 | goto error_enter_powersave; |
| 526 | i2400mu_notification_release(i2400mu); | 550 | i2400mu_notification_release(i2400mu); |
| 527 | d_printf(1, dev, "fw up, got standby\n"); | 551 | d_printf(1, dev, "powersave requested\n"); |
| 528 | error_enter_powersave: | 552 | error_enter_powersave: |
| 553 | error_not_now: | ||
| 529 | no_firmware: | 554 | no_firmware: |
| 530 | d_fnend(3, dev, "(iface %p pm_msg %u) = %d\n", | 555 | d_fnend(3, dev, "(iface %p pm_msg %u) = %d\n", |
| 531 | iface, pm_msg.event, result); | 556 | iface, pm_msg.event, result); |
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index d73475739127..9eabf4d1f2e7 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
| @@ -6467,6 +6467,7 @@ static int airo_get_encode(struct net_device *dev, | |||
| 6467 | { | 6467 | { |
| 6468 | struct airo_info *local = dev->ml_priv; | 6468 | struct airo_info *local = dev->ml_priv; |
| 6469 | int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; | 6469 | int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; |
| 6470 | int wep_key_len; | ||
| 6470 | u8 buf[16]; | 6471 | u8 buf[16]; |
| 6471 | 6472 | ||
| 6472 | if (!local->wep_capable) | 6473 | if (!local->wep_capable) |
| @@ -6500,11 +6501,13 @@ static int airo_get_encode(struct net_device *dev, | |||
| 6500 | dwrq->flags |= index + 1; | 6501 | dwrq->flags |= index + 1; |
| 6501 | 6502 | ||
| 6502 | /* Copy the key to the user buffer */ | 6503 | /* Copy the key to the user buffer */ |
| 6503 | dwrq->length = get_wep_key(local, index, &buf[0], sizeof(buf)); | 6504 | wep_key_len = get_wep_key(local, index, &buf[0], sizeof(buf)); |
| 6504 | if (dwrq->length != -1) | 6505 | if (wep_key_len < 0) { |
| 6505 | memcpy(extra, buf, dwrq->length); | ||
| 6506 | else | ||
| 6507 | dwrq->length = 0; | 6506 | dwrq->length = 0; |
| 6507 | } else { | ||
| 6508 | dwrq->length = wep_key_len; | ||
| 6509 | memcpy(extra, buf, dwrq->length); | ||
| 6510 | } | ||
| 6508 | 6511 | ||
| 6509 | return 0; | 6512 | return 0; |
| 6510 | } | 6513 | } |
| @@ -6617,7 +6620,7 @@ static int airo_get_encodeext(struct net_device *dev, | |||
| 6617 | struct airo_info *local = dev->ml_priv; | 6620 | struct airo_info *local = dev->ml_priv; |
| 6618 | struct iw_point *encoding = &wrqu->encoding; | 6621 | struct iw_point *encoding = &wrqu->encoding; |
| 6619 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | 6622 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; |
| 6620 | int idx, max_key_len; | 6623 | int idx, max_key_len, wep_key_len; |
| 6621 | u8 buf[16]; | 6624 | u8 buf[16]; |
| 6622 | 6625 | ||
| 6623 | if (!local->wep_capable) | 6626 | if (!local->wep_capable) |
| @@ -6661,11 +6664,13 @@ static int airo_get_encodeext(struct net_device *dev, | |||
| 6661 | memset(extra, 0, 16); | 6664 | memset(extra, 0, 16); |
| 6662 | 6665 | ||
| 6663 | /* Copy the key to the user buffer */ | 6666 | /* Copy the key to the user buffer */ |
| 6664 | ext->key_len = get_wep_key(local, idx, &buf[0], sizeof(buf)); | 6667 | wep_key_len = get_wep_key(local, idx, &buf[0], sizeof(buf)); |
| 6665 | if (ext->key_len != -1) | 6668 | if (wep_key_len < 0) { |
| 6666 | memcpy(extra, buf, ext->key_len); | ||
| 6667 | else | ||
| 6668 | ext->key_len = 0; | 6669 | ext->key_len = 0; |
| 6670 | } else { | ||
| 6671 | ext->key_len = wep_key_len; | ||
| 6672 | memcpy(extra, buf, ext->key_len); | ||
| 6673 | } | ||
| 6669 | 6674 | ||
| 6670 | return 0; | 6675 | return 0; |
| 6671 | } | 6676 | } |
diff --git a/drivers/net/wireless/ath5k/phy.c b/drivers/net/wireless/ath5k/phy.c index 9e2faae5ae94..b48b29dca3d2 100644 --- a/drivers/net/wireless/ath5k/phy.c +++ b/drivers/net/wireless/ath5k/phy.c | |||
| @@ -1487,28 +1487,35 @@ ath5k_get_linear_pcdac_min(const u8 *stepL, const u8 *stepR, | |||
| 1487 | { | 1487 | { |
| 1488 | s8 tmp; | 1488 | s8 tmp; |
| 1489 | s16 min_pwrL, min_pwrR; | 1489 | s16 min_pwrL, min_pwrR; |
| 1490 | s16 pwr_i = pwrL[0]; | 1490 | s16 pwr_i; |
| 1491 | 1491 | ||
| 1492 | do { | 1492 | if (pwrL[0] == pwrL[1]) |
| 1493 | pwr_i--; | 1493 | min_pwrL = pwrL[0]; |
| 1494 | tmp = (s8) ath5k_get_interpolated_value(pwr_i, | 1494 | else { |
| 1495 | pwrL[0], pwrL[1], | 1495 | pwr_i = pwrL[0]; |
| 1496 | stepL[0], stepL[1]); | 1496 | do { |
| 1497 | 1497 | pwr_i--; | |
| 1498 | } while (tmp > 1); | 1498 | tmp = (s8) ath5k_get_interpolated_value(pwr_i, |
| 1499 | 1499 | pwrL[0], pwrL[1], | |
| 1500 | min_pwrL = pwr_i; | 1500 | stepL[0], stepL[1]); |
| 1501 | 1501 | } while (tmp > 1); | |
| 1502 | pwr_i = pwrR[0]; | 1502 | |
| 1503 | do { | 1503 | min_pwrL = pwr_i; |
| 1504 | pwr_i--; | 1504 | } |
| 1505 | tmp = (s8) ath5k_get_interpolated_value(pwr_i, | ||
| 1506 | pwrR[0], pwrR[1], | ||
| 1507 | stepR[0], stepR[1]); | ||
| 1508 | |||
| 1509 | } while (tmp > 1); | ||
| 1510 | 1505 | ||
| 1511 | min_pwrR = pwr_i; | 1506 | if (pwrR[0] == pwrR[1]) |
| 1507 | min_pwrR = pwrR[0]; | ||
| 1508 | else { | ||
| 1509 | pwr_i = pwrR[0]; | ||
| 1510 | do { | ||
| 1511 | pwr_i--; | ||
| 1512 | tmp = (s8) ath5k_get_interpolated_value(pwr_i, | ||
| 1513 | pwrR[0], pwrR[1], | ||
| 1514 | stepR[0], stepR[1]); | ||
| 1515 | } while (tmp > 1); | ||
| 1516 | |||
| 1517 | min_pwrR = pwr_i; | ||
| 1518 | } | ||
| 1512 | 1519 | ||
| 1513 | /* Keep the right boundary so that it works for both curves */ | 1520 | /* Keep the right boundary so that it works for both curves */ |
| 1514 | return max(min_pwrL, min_pwrR); | 1521 | return max(min_pwrL, min_pwrR); |
diff --git a/drivers/net/wireless/ath5k/reset.c b/drivers/net/wireless/ath5k/reset.c index 7a17d31b2fd9..5f72c111c2e8 100644 --- a/drivers/net/wireless/ath5k/reset.c +++ b/drivers/net/wireless/ath5k/reset.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | \*****************************/ | 26 | \*****************************/ |
| 27 | 27 | ||
| 28 | #include <linux/pci.h> /* To determine if a card is pci-e */ | 28 | #include <linux/pci.h> /* To determine if a card is pci-e */ |
| 29 | #include <linux/bitops.h> /* For get_bitmask_order */ | 29 | #include <linux/log2.h> |
| 30 | #include "ath5k.h" | 30 | #include "ath5k.h" |
| 31 | #include "reg.h" | 31 | #include "reg.h" |
| 32 | #include "base.h" | 32 | #include "base.h" |
| @@ -69,10 +69,10 @@ static inline int ath5k_hw_write_ofdm_timings(struct ath5k_hw *ah, | |||
| 69 | 69 | ||
| 70 | /* Get exponent | 70 | /* Get exponent |
| 71 | * ALGO: coef_exp = 14 - highest set bit position */ | 71 | * ALGO: coef_exp = 14 - highest set bit position */ |
| 72 | coef_exp = get_bitmask_order(coef_scaled); | 72 | coef_exp = ilog2(coef_scaled); |
| 73 | 73 | ||
| 74 | /* Doesn't make sense if it's zero*/ | 74 | /* Doesn't make sense if it's zero*/ |
| 75 | if (!coef_exp) | 75 | if (!coef_scaled || !coef_exp) |
| 76 | return -EINVAL; | 76 | return -EINVAL; |
| 77 | 77 | ||
| 78 | /* Note: we've shifted coef_scaled by 24 */ | 78 | /* Note: we've shifted coef_scaled by 24 */ |
| @@ -359,7 +359,7 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial) | |||
| 359 | mode |= AR5K_PHY_MODE_FREQ_5GHZ; | 359 | mode |= AR5K_PHY_MODE_FREQ_5GHZ; |
| 360 | 360 | ||
| 361 | if (ah->ah_radio == AR5K_RF5413) | 361 | if (ah->ah_radio == AR5K_RF5413) |
| 362 | clock |= AR5K_PHY_PLL_40MHZ_5413; | 362 | clock = AR5K_PHY_PLL_40MHZ_5413; |
| 363 | else | 363 | else |
| 364 | clock |= AR5K_PHY_PLL_40MHZ; | 364 | clock |= AR5K_PHY_PLL_40MHZ; |
| 365 | 365 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index e5ca2511a81a..9452461ce864 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #include "iwl-6000-hw.h" | 46 | #include "iwl-6000-hw.h" |
| 47 | 47 | ||
| 48 | /* Highest firmware API version supported */ | 48 | /* Highest firmware API version supported */ |
| 49 | #define IWL5000_UCODE_API_MAX 1 | 49 | #define IWL5000_UCODE_API_MAX 2 |
| 50 | #define IWL5150_UCODE_API_MAX 2 | 50 | #define IWL5150_UCODE_API_MAX 2 |
| 51 | 51 | ||
| 52 | /* Lowest firmware API version supported */ | 52 | /* Lowest firmware API version supported */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 3bb28db4a40f..f46ba2475776 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -669,13 +669,6 @@ static int iwl_set_mode(struct iwl_priv *priv, int mode) | |||
| 669 | if (!iwl_is_ready_rf(priv)) | 669 | if (!iwl_is_ready_rf(priv)) |
| 670 | return -EAGAIN; | 670 | return -EAGAIN; |
| 671 | 671 | ||
| 672 | cancel_delayed_work(&priv->scan_check); | ||
| 673 | if (iwl_scan_cancel_timeout(priv, 100)) { | ||
| 674 | IWL_WARN(priv, "Aborted scan still in progress after 100ms\n"); | ||
| 675 | IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n"); | ||
| 676 | return -EAGAIN; | ||
| 677 | } | ||
| 678 | |||
| 679 | iwl_commit_rxon(priv); | 672 | iwl_commit_rxon(priv); |
| 680 | 673 | ||
| 681 | return 0; | 674 | return 0; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index e7c65c4f741b..6330b91e37ce 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -227,9 +227,6 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv, | |||
| 227 | /* The HW is no longer scanning */ | 227 | /* The HW is no longer scanning */ |
| 228 | clear_bit(STATUS_SCAN_HW, &priv->status); | 228 | clear_bit(STATUS_SCAN_HW, &priv->status); |
| 229 | 229 | ||
| 230 | /* The scan completion notification came in, so kill that timer... */ | ||
| 231 | cancel_delayed_work(&priv->scan_check); | ||
| 232 | |||
| 233 | IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n", | 230 | IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n", |
| 234 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? | 231 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? |
| 235 | "2.4" : "5.2", | 232 | "2.4" : "5.2", |
| @@ -712,6 +709,8 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
| 712 | 709 | ||
| 713 | mutex_lock(&priv->mutex); | 710 | mutex_lock(&priv->mutex); |
| 714 | 711 | ||
| 712 | cancel_delayed_work(&priv->scan_check); | ||
| 713 | |||
| 715 | if (!iwl_is_ready(priv)) { | 714 | if (!iwl_is_ready(priv)) { |
| 716 | IWL_WARN(priv, "request scan called when driver not ready.\n"); | 715 | IWL_WARN(priv, "request scan called when driver not ready.\n"); |
| 717 | goto done; | 716 | goto done; |
| @@ -925,6 +924,8 @@ void iwl_bg_scan_completed(struct work_struct *work) | |||
| 925 | 924 | ||
| 926 | IWL_DEBUG_SCAN(priv, "SCAN complete scan\n"); | 925 | IWL_DEBUG_SCAN(priv, "SCAN complete scan\n"); |
| 927 | 926 | ||
| 927 | cancel_delayed_work(&priv->scan_check); | ||
| 928 | |||
| 928 | ieee80211_scan_completed(priv->hw, false); | 929 | ieee80211_scan_completed(priv->hw, false); |
| 929 | 930 | ||
| 930 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 931 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 4cce66133500..ff4d0e41d7c4 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -782,13 +782,6 @@ static int iwl3945_set_mode(struct iwl_priv *priv, int mode) | |||
| 782 | if (!iwl_is_ready_rf(priv)) | 782 | if (!iwl_is_ready_rf(priv)) |
| 783 | return -EAGAIN; | 783 | return -EAGAIN; |
| 784 | 784 | ||
| 785 | cancel_delayed_work(&priv->scan_check); | ||
| 786 | if (iwl_scan_cancel_timeout(priv, 100)) { | ||
| 787 | IWL_WARN(priv, "Aborted scan still in progress after 100ms\n"); | ||
| 788 | IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n"); | ||
| 789 | return -EAGAIN; | ||
| 790 | } | ||
| 791 | |||
| 792 | iwl3945_commit_rxon(priv); | 785 | iwl3945_commit_rxon(priv); |
| 793 | 786 | ||
| 794 | return 0; | 787 | return 0; |
| @@ -3298,6 +3291,8 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 3298 | 3291 | ||
| 3299 | mutex_lock(&priv->mutex); | 3292 | mutex_lock(&priv->mutex); |
| 3300 | 3293 | ||
| 3294 | cancel_delayed_work(&priv->scan_check); | ||
| 3295 | |||
| 3301 | if (!iwl_is_ready(priv)) { | 3296 | if (!iwl_is_ready(priv)) { |
| 3302 | IWL_WARN(priv, "request scan called when driver not ready.\n"); | 3297 | IWL_WARN(priv, "request scan called when driver not ready.\n"); |
| 3303 | goto done; | 3298 | goto done; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c index 07d378ef0b46..7b3ee8c2eaef 100644 --- a/drivers/net/wireless/rt2x00/rt2x00debug.c +++ b/drivers/net/wireless/rt2x00/rt2x00debug.c | |||
| @@ -138,7 +138,7 @@ void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev, | |||
| 138 | 138 | ||
| 139 | if (cipher == CIPHER_TKIP_NO_MIC) | 139 | if (cipher == CIPHER_TKIP_NO_MIC) |
| 140 | cipher = CIPHER_TKIP; | 140 | cipher = CIPHER_TKIP; |
| 141 | if (cipher == CIPHER_NONE || cipher > CIPHER_MAX) | 141 | if (cipher == CIPHER_NONE || cipher >= CIPHER_MAX) |
| 142 | return; | 142 | return; |
| 143 | 143 | ||
| 144 | /* Remove CIPHER_NONE index */ | 144 | /* Remove CIPHER_NONE index */ |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 3779c1438c11..0666a827bc62 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -2447,7 +2447,7 @@ static inline void free_SAs(struct pktgen_dev *pkt_dev) | |||
| 2447 | if (pkt_dev->cflows) { | 2447 | if (pkt_dev->cflows) { |
| 2448 | /* let go of the SAs if we have them */ | 2448 | /* let go of the SAs if we have them */ |
| 2449 | int i = 0; | 2449 | int i = 0; |
| 2450 | for (; i < pkt_dev->nflows; i++){ | 2450 | for (; i < pkt_dev->cflows; i++) { |
| 2451 | struct xfrm_state *x = pkt_dev->flows[i].x; | 2451 | struct xfrm_state *x = pkt_dev->flows[i].x; |
| 2452 | if (x) { | 2452 | if (x) { |
| 2453 | xfrm_state_put(x); | 2453 | xfrm_state_put(x); |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index ec0ae490f0b6..33c7c85dfe40 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -986,9 +986,12 @@ fib_find_node(struct trie *t, u32 key) | |||
| 986 | static struct node *trie_rebalance(struct trie *t, struct tnode *tn) | 986 | static struct node *trie_rebalance(struct trie *t, struct tnode *tn) |
| 987 | { | 987 | { |
| 988 | int wasfull; | 988 | int wasfull; |
| 989 | t_key cindex, key = tn->key; | 989 | t_key cindex, key; |
| 990 | struct tnode *tp; | 990 | struct tnode *tp; |
| 991 | 991 | ||
| 992 | preempt_disable(); | ||
| 993 | key = tn->key; | ||
| 994 | |||
| 992 | while (tn != NULL && (tp = node_parent((struct node *)tn)) != NULL) { | 995 | while (tn != NULL && (tp = node_parent((struct node *)tn)) != NULL) { |
| 993 | cindex = tkey_extract_bits(key, tp->pos, tp->bits); | 996 | cindex = tkey_extract_bits(key, tp->pos, tp->bits); |
| 994 | wasfull = tnode_full(tp, tnode_get_child(tp, cindex)); | 997 | wasfull = tnode_full(tp, tnode_get_child(tp, cindex)); |
| @@ -1007,6 +1010,7 @@ static struct node *trie_rebalance(struct trie *t, struct tnode *tn) | |||
| 1007 | if (IS_TNODE(tn)) | 1010 | if (IS_TNODE(tn)) |
| 1008 | tn = (struct tnode *)resize(t, (struct tnode *)tn); | 1011 | tn = (struct tnode *)resize(t, (struct tnode *)tn); |
| 1009 | 1012 | ||
| 1013 | preempt_enable(); | ||
| 1010 | return (struct node *)tn; | 1014 | return (struct node *)tn; |
| 1011 | } | 1015 | } |
| 1012 | 1016 | ||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index c4c60e9f068a..28205e5bfa9b 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -784,8 +784,8 @@ static void rt_check_expire(void) | |||
| 784 | { | 784 | { |
| 785 | static unsigned int rover; | 785 | static unsigned int rover; |
| 786 | unsigned int i = rover, goal; | 786 | unsigned int i = rover, goal; |
| 787 | struct rtable *rth, **rthp; | 787 | struct rtable *rth, *aux, **rthp; |
| 788 | unsigned long length = 0, samples = 0; | 788 | unsigned long samples = 0; |
| 789 | unsigned long sum = 0, sum2 = 0; | 789 | unsigned long sum = 0, sum2 = 0; |
| 790 | u64 mult; | 790 | u64 mult; |
| 791 | 791 | ||
| @@ -795,9 +795,9 @@ static void rt_check_expire(void) | |||
| 795 | goal = (unsigned int)mult; | 795 | goal = (unsigned int)mult; |
| 796 | if (goal > rt_hash_mask) | 796 | if (goal > rt_hash_mask) |
| 797 | goal = rt_hash_mask + 1; | 797 | goal = rt_hash_mask + 1; |
| 798 | length = 0; | ||
| 799 | for (; goal > 0; goal--) { | 798 | for (; goal > 0; goal--) { |
| 800 | unsigned long tmo = ip_rt_gc_timeout; | 799 | unsigned long tmo = ip_rt_gc_timeout; |
| 800 | unsigned long length; | ||
| 801 | 801 | ||
| 802 | i = (i + 1) & rt_hash_mask; | 802 | i = (i + 1) & rt_hash_mask; |
| 803 | rthp = &rt_hash_table[i].chain; | 803 | rthp = &rt_hash_table[i].chain; |
| @@ -809,8 +809,10 @@ static void rt_check_expire(void) | |||
| 809 | 809 | ||
| 810 | if (*rthp == NULL) | 810 | if (*rthp == NULL) |
| 811 | continue; | 811 | continue; |
| 812 | length = 0; | ||
| 812 | spin_lock_bh(rt_hash_lock_addr(i)); | 813 | spin_lock_bh(rt_hash_lock_addr(i)); |
| 813 | while ((rth = *rthp) != NULL) { | 814 | while ((rth = *rthp) != NULL) { |
| 815 | prefetch(rth->u.dst.rt_next); | ||
| 814 | if (rt_is_expired(rth)) { | 816 | if (rt_is_expired(rth)) { |
| 815 | *rthp = rth->u.dst.rt_next; | 817 | *rthp = rth->u.dst.rt_next; |
| 816 | rt_free(rth); | 818 | rt_free(rth); |
| @@ -819,33 +821,30 @@ static void rt_check_expire(void) | |||
| 819 | if (rth->u.dst.expires) { | 821 | if (rth->u.dst.expires) { |
| 820 | /* Entry is expired even if it is in use */ | 822 | /* Entry is expired even if it is in use */ |
| 821 | if (time_before_eq(jiffies, rth->u.dst.expires)) { | 823 | if (time_before_eq(jiffies, rth->u.dst.expires)) { |
| 824 | nofree: | ||
| 822 | tmo >>= 1; | 825 | tmo >>= 1; |
| 823 | rthp = &rth->u.dst.rt_next; | 826 | rthp = &rth->u.dst.rt_next; |
| 824 | /* | 827 | /* |
| 825 | * Only bump our length if the hash | 828 | * We only count entries on |
| 826 | * inputs on entries n and n+1 are not | ||
| 827 | * the same, we only count entries on | ||
| 828 | * a chain with equal hash inputs once | 829 | * a chain with equal hash inputs once |
| 829 | * so that entries for different QOS | 830 | * so that entries for different QOS |
| 830 | * levels, and other non-hash input | 831 | * levels, and other non-hash input |
| 831 | * attributes don't unfairly skew | 832 | * attributes don't unfairly skew |
| 832 | * the length computation | 833 | * the length computation |
| 833 | */ | 834 | */ |
| 834 | if ((*rthp == NULL) || | 835 | for (aux = rt_hash_table[i].chain;;) { |
| 835 | !compare_hash_inputs(&(*rthp)->fl, | 836 | if (aux == rth) { |
| 836 | &rth->fl)) | 837 | length += ONE; |
| 837 | length += ONE; | 838 | break; |
| 839 | } | ||
| 840 | if (compare_hash_inputs(&aux->fl, &rth->fl)) | ||
| 841 | break; | ||
| 842 | aux = aux->u.dst.rt_next; | ||
| 843 | } | ||
| 838 | continue; | 844 | continue; |
| 839 | } | 845 | } |
| 840 | } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout)) { | 846 | } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout)) |
| 841 | tmo >>= 1; | 847 | goto nofree; |
| 842 | rthp = &rth->u.dst.rt_next; | ||
| 843 | if ((*rthp == NULL) || | ||
| 844 | !compare_hash_inputs(&(*rthp)->fl, | ||
| 845 | &rth->fl)) | ||
| 846 | length += ONE; | ||
| 847 | continue; | ||
| 848 | } | ||
| 849 | 848 | ||
| 850 | /* Cleanup aged off entries. */ | 849 | /* Cleanup aged off entries. */ |
| 851 | *rthp = rth->u.dst.rt_next; | 850 | *rthp = rth->u.dst.rt_next; |
| @@ -1068,7 +1067,6 @@ out: return 0; | |||
| 1068 | static int rt_intern_hash(unsigned hash, struct rtable *rt, struct rtable **rp) | 1067 | static int rt_intern_hash(unsigned hash, struct rtable *rt, struct rtable **rp) |
| 1069 | { | 1068 | { |
| 1070 | struct rtable *rth, **rthp; | 1069 | struct rtable *rth, **rthp; |
| 1071 | struct rtable *rthi; | ||
| 1072 | unsigned long now; | 1070 | unsigned long now; |
| 1073 | struct rtable *cand, **candp; | 1071 | struct rtable *cand, **candp; |
| 1074 | u32 min_score; | 1072 | u32 min_score; |
| @@ -1088,7 +1086,6 @@ restart: | |||
| 1088 | } | 1086 | } |
| 1089 | 1087 | ||
| 1090 | rthp = &rt_hash_table[hash].chain; | 1088 | rthp = &rt_hash_table[hash].chain; |
| 1091 | rthi = NULL; | ||
| 1092 | 1089 | ||
| 1093 | spin_lock_bh(rt_hash_lock_addr(hash)); | 1090 | spin_lock_bh(rt_hash_lock_addr(hash)); |
| 1094 | while ((rth = *rthp) != NULL) { | 1091 | while ((rth = *rthp) != NULL) { |
| @@ -1134,17 +1131,6 @@ restart: | |||
| 1134 | chain_length++; | 1131 | chain_length++; |
| 1135 | 1132 | ||
| 1136 | rthp = &rth->u.dst.rt_next; | 1133 | rthp = &rth->u.dst.rt_next; |
| 1137 | |||
| 1138 | /* | ||
| 1139 | * check to see if the next entry in the chain | ||
| 1140 | * contains the same hash input values as rt. If it does | ||
| 1141 | * This is where we will insert into the list, instead of | ||
| 1142 | * at the head. This groups entries that differ by aspects not | ||
| 1143 | * relvant to the hash function together, which we use to adjust | ||
| 1144 | * our chain length | ||
| 1145 | */ | ||
| 1146 | if (*rthp && compare_hash_inputs(&(*rthp)->fl, &rt->fl)) | ||
| 1147 | rthi = rth; | ||
| 1148 | } | 1134 | } |
| 1149 | 1135 | ||
| 1150 | if (cand) { | 1136 | if (cand) { |
| @@ -1205,10 +1191,7 @@ restart: | |||
| 1205 | } | 1191 | } |
| 1206 | } | 1192 | } |
| 1207 | 1193 | ||
| 1208 | if (rthi) | 1194 | rt->u.dst.rt_next = rt_hash_table[hash].chain; |
| 1209 | rt->u.dst.rt_next = rthi->u.dst.rt_next; | ||
| 1210 | else | ||
| 1211 | rt->u.dst.rt_next = rt_hash_table[hash].chain; | ||
| 1212 | 1195 | ||
| 1213 | #if RT_CACHE_DEBUG >= 2 | 1196 | #if RT_CACHE_DEBUG >= 2 |
| 1214 | if (rt->u.dst.rt_next) { | 1197 | if (rt->u.dst.rt_next) { |
| @@ -1224,10 +1207,7 @@ restart: | |||
| 1224 | * previous writes to rt are comitted to memory | 1207 | * previous writes to rt are comitted to memory |
| 1225 | * before making rt visible to other CPUS. | 1208 | * before making rt visible to other CPUS. |
| 1226 | */ | 1209 | */ |
| 1227 | if (rthi) | 1210 | rcu_assign_pointer(rt_hash_table[hash].chain, rt); |
| 1228 | rcu_assign_pointer(rthi->u.dst.rt_next, rt); | ||
| 1229 | else | ||
| 1230 | rcu_assign_pointer(rt_hash_table[hash].chain, rt); | ||
| 1231 | 1211 | ||
| 1232 | spin_unlock_bh(rt_hash_lock_addr(hash)); | 1212 | spin_unlock_bh(rt_hash_lock_addr(hash)); |
| 1233 | *rp = rt; | 1213 | *rp = rt; |
diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c index a453aac91bd3..c6743eec9b7d 100644 --- a/net/ipv4/tcp_vegas.c +++ b/net/ipv4/tcp_vegas.c | |||
| @@ -158,6 +158,11 @@ void tcp_vegas_cwnd_event(struct sock *sk, enum tcp_ca_event event) | |||
| 158 | } | 158 | } |
| 159 | EXPORT_SYMBOL_GPL(tcp_vegas_cwnd_event); | 159 | EXPORT_SYMBOL_GPL(tcp_vegas_cwnd_event); |
| 160 | 160 | ||
| 161 | static inline u32 tcp_vegas_ssthresh(struct tcp_sock *tp) | ||
| 162 | { | ||
| 163 | return min(tp->snd_ssthresh, tp->snd_cwnd-1); | ||
| 164 | } | ||
| 165 | |||
| 161 | static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | 166 | static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) |
| 162 | { | 167 | { |
| 163 | struct tcp_sock *tp = tcp_sk(sk); | 168 | struct tcp_sock *tp = tcp_sk(sk); |
| @@ -221,11 +226,10 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 221 | */ | 226 | */ |
| 222 | diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; | 227 | diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; |
| 223 | 228 | ||
| 224 | if (diff > gamma && tp->snd_ssthresh > 2 ) { | 229 | if (diff > gamma && tp->snd_cwnd <= tp->snd_ssthresh) { |
| 225 | /* Going too fast. Time to slow down | 230 | /* Going too fast. Time to slow down |
| 226 | * and switch to congestion avoidance. | 231 | * and switch to congestion avoidance. |
| 227 | */ | 232 | */ |
| 228 | tp->snd_ssthresh = 2; | ||
| 229 | 233 | ||
| 230 | /* Set cwnd to match the actual rate | 234 | /* Set cwnd to match the actual rate |
| 231 | * exactly: | 235 | * exactly: |
| @@ -235,6 +239,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 235 | * utilization. | 239 | * utilization. |
| 236 | */ | 240 | */ |
| 237 | tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1); | 241 | tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1); |
| 242 | tp->snd_ssthresh = tcp_vegas_ssthresh(tp); | ||
| 238 | 243 | ||
| 239 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { | 244 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { |
| 240 | /* Slow start. */ | 245 | /* Slow start. */ |
| @@ -250,6 +255,8 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 250 | * we slow down. | 255 | * we slow down. |
| 251 | */ | 256 | */ |
| 252 | tp->snd_cwnd--; | 257 | tp->snd_cwnd--; |
| 258 | tp->snd_ssthresh | ||
| 259 | = tcp_vegas_ssthresh(tp); | ||
| 253 | } else if (diff < alpha) { | 260 | } else if (diff < alpha) { |
| 254 | /* We don't have enough extra packets | 261 | /* We don't have enough extra packets |
| 255 | * in the network, so speed up. | 262 | * in the network, so speed up. |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 1394ddb6e35c..032a5ec391c5 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -137,6 +137,7 @@ static struct rt6_info ip6_null_entry_template = { | |||
| 137 | } | 137 | } |
| 138 | }, | 138 | }, |
| 139 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), | 139 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), |
| 140 | .rt6i_protocol = RTPROT_KERNEL, | ||
| 140 | .rt6i_metric = ~(u32) 0, | 141 | .rt6i_metric = ~(u32) 0, |
| 141 | .rt6i_ref = ATOMIC_INIT(1), | 142 | .rt6i_ref = ATOMIC_INIT(1), |
| 142 | }; | 143 | }; |
| @@ -159,6 +160,7 @@ static struct rt6_info ip6_prohibit_entry_template = { | |||
| 159 | } | 160 | } |
| 160 | }, | 161 | }, |
| 161 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), | 162 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), |
| 163 | .rt6i_protocol = RTPROT_KERNEL, | ||
| 162 | .rt6i_metric = ~(u32) 0, | 164 | .rt6i_metric = ~(u32) 0, |
| 163 | .rt6i_ref = ATOMIC_INIT(1), | 165 | .rt6i_ref = ATOMIC_INIT(1), |
| 164 | }; | 166 | }; |
| @@ -176,6 +178,7 @@ static struct rt6_info ip6_blk_hole_entry_template = { | |||
| 176 | } | 178 | } |
| 177 | }, | 179 | }, |
| 178 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), | 180 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), |
| 181 | .rt6i_protocol = RTPROT_KERNEL, | ||
| 179 | .rt6i_metric = ~(u32) 0, | 182 | .rt6i_metric = ~(u32) 0, |
| 180 | .rt6i_ref = ATOMIC_INIT(1), | 183 | .rt6i_ref = ATOMIC_INIT(1), |
| 181 | }; | 184 | }; |
diff --git a/net/rxrpc/ar-connection.c b/net/rxrpc/ar-connection.c index 0f1218b8d289..67e38a056240 100644 --- a/net/rxrpc/ar-connection.c +++ b/net/rxrpc/ar-connection.c | |||
| @@ -343,9 +343,9 @@ static int rxrpc_connect_exclusive(struct rxrpc_sock *rx, | |||
| 343 | /* not yet present - create a candidate for a new connection | 343 | /* not yet present - create a candidate for a new connection |
| 344 | * and then redo the check */ | 344 | * and then redo the check */ |
| 345 | conn = rxrpc_alloc_connection(gfp); | 345 | conn = rxrpc_alloc_connection(gfp); |
| 346 | if (IS_ERR(conn)) { | 346 | if (!conn) { |
| 347 | _leave(" = %ld", PTR_ERR(conn)); | 347 | _leave(" = -ENOMEM"); |
| 348 | return PTR_ERR(conn); | 348 | return -ENOMEM; |
| 349 | } | 349 | } |
| 350 | 350 | ||
| 351 | conn->trans = trans; | 351 | conn->trans = trans; |
| @@ -508,9 +508,9 @@ int rxrpc_connect_call(struct rxrpc_sock *rx, | |||
| 508 | /* not yet present - create a candidate for a new connection and then | 508 | /* not yet present - create a candidate for a new connection and then |
| 509 | * redo the check */ | 509 | * redo the check */ |
| 510 | candidate = rxrpc_alloc_connection(gfp); | 510 | candidate = rxrpc_alloc_connection(gfp); |
| 511 | if (IS_ERR(candidate)) { | 511 | if (!candidate) { |
| 512 | _leave(" = %ld", PTR_ERR(candidate)); | 512 | _leave(" = -ENOMEM"); |
| 513 | return PTR_ERR(candidate); | 513 | return -ENOMEM; |
| 514 | } | 514 | } |
| 515 | 515 | ||
| 516 | candidate->trans = trans; | 516 | candidate->trans = trans; |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 08265ca15785..487cb627ddba 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -1551,6 +1551,13 @@ static int regulatory_hint_core(const char *alpha2) | |||
| 1551 | 1551 | ||
| 1552 | queue_regulatory_request(request); | 1552 | queue_regulatory_request(request); |
| 1553 | 1553 | ||
| 1554 | /* | ||
| 1555 | * This ensures last_request is populated once modules | ||
| 1556 | * come swinging in and calling regulatory hints and | ||
| 1557 | * wiphy_apply_custom_regulatory(). | ||
| 1558 | */ | ||
| 1559 | flush_scheduled_work(); | ||
| 1560 | |||
| 1554 | return 0; | 1561 | return 0; |
| 1555 | } | 1562 | } |
| 1556 | 1563 | ||
diff --git a/net/wireless/wext.c b/net/wireless/wext.c index cb6a5bb85d80..0e59f9ae9b81 100644 --- a/net/wireless/wext.c +++ b/net/wireless/wext.c | |||
| @@ -786,6 +786,13 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, | |||
| 786 | err = -EFAULT; | 786 | err = -EFAULT; |
| 787 | goto out; | 787 | goto out; |
| 788 | } | 788 | } |
| 789 | |||
| 790 | if (cmd == SIOCSIWENCODEEXT) { | ||
| 791 | struct iw_encode_ext *ee = (void *) extra; | ||
| 792 | |||
| 793 | if (iwp->length < sizeof(*ee) + ee->key_len) | ||
| 794 | return -EFAULT; | ||
| 795 | } | ||
| 789 | } | 796 | } |
| 790 | 797 | ||
| 791 | err = handler(dev, info, (union iwreq_data *) iwp, extra); | 798 | err = handler(dev, info, (union iwreq_data *) iwp, extra); |
