diff options
79 files changed, 714 insertions, 811 deletions
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index 4550d247e308..c011e2296cb1 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c | |||
| @@ -74,32 +74,52 @@ struct jit_ctx { | |||
| 74 | 74 | ||
| 75 | int bpf_jit_enable __read_mostly; | 75 | int bpf_jit_enable __read_mostly; |
| 76 | 76 | ||
| 77 | static u64 jit_get_skb_b(struct sk_buff *skb, unsigned offset) | 77 | static inline int call_neg_helper(struct sk_buff *skb, int offset, void *ret, |
| 78 | unsigned int size) | ||
| 79 | { | ||
| 80 | void *ptr = bpf_internal_load_pointer_neg_helper(skb, offset, size); | ||
| 81 | |||
| 82 | if (!ptr) | ||
| 83 | return -EFAULT; | ||
| 84 | memcpy(ret, ptr, size); | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | |||
| 88 | static u64 jit_get_skb_b(struct sk_buff *skb, int offset) | ||
| 78 | { | 89 | { |
| 79 | u8 ret; | 90 | u8 ret; |
| 80 | int err; | 91 | int err; |
| 81 | 92 | ||
| 82 | err = skb_copy_bits(skb, offset, &ret, 1); | 93 | if (offset < 0) |
| 94 | err = call_neg_helper(skb, offset, &ret, 1); | ||
| 95 | else | ||
| 96 | err = skb_copy_bits(skb, offset, &ret, 1); | ||
| 83 | 97 | ||
| 84 | return (u64)err << 32 | ret; | 98 | return (u64)err << 32 | ret; |
| 85 | } | 99 | } |
| 86 | 100 | ||
| 87 | static u64 jit_get_skb_h(struct sk_buff *skb, unsigned offset) | 101 | static u64 jit_get_skb_h(struct sk_buff *skb, int offset) |
| 88 | { | 102 | { |
| 89 | u16 ret; | 103 | u16 ret; |
| 90 | int err; | 104 | int err; |
| 91 | 105 | ||
| 92 | err = skb_copy_bits(skb, offset, &ret, 2); | 106 | if (offset < 0) |
| 107 | err = call_neg_helper(skb, offset, &ret, 2); | ||
| 108 | else | ||
| 109 | err = skb_copy_bits(skb, offset, &ret, 2); | ||
| 93 | 110 | ||
| 94 | return (u64)err << 32 | ntohs(ret); | 111 | return (u64)err << 32 | ntohs(ret); |
| 95 | } | 112 | } |
| 96 | 113 | ||
| 97 | static u64 jit_get_skb_w(struct sk_buff *skb, unsigned offset) | 114 | static u64 jit_get_skb_w(struct sk_buff *skb, int offset) |
| 98 | { | 115 | { |
| 99 | u32 ret; | 116 | u32 ret; |
| 100 | int err; | 117 | int err; |
| 101 | 118 | ||
| 102 | err = skb_copy_bits(skb, offset, &ret, 4); | 119 | if (offset < 0) |
| 120 | err = call_neg_helper(skb, offset, &ret, 4); | ||
| 121 | else | ||
| 122 | err = skb_copy_bits(skb, offset, &ret, 4); | ||
| 103 | 123 | ||
| 104 | return (u64)err << 32 | ntohl(ret); | 124 | return (u64)err << 32 | ntohl(ret); |
| 105 | } | 125 | } |
| @@ -536,9 +556,6 @@ static int build_body(struct jit_ctx *ctx) | |||
| 536 | case BPF_LD | BPF_B | BPF_ABS: | 556 | case BPF_LD | BPF_B | BPF_ABS: |
| 537 | load_order = 0; | 557 | load_order = 0; |
| 538 | load: | 558 | load: |
| 539 | /* the interpreter will deal with the negative K */ | ||
| 540 | if ((int)k < 0) | ||
| 541 | return -ENOTSUPP; | ||
| 542 | emit_mov_i(r_off, k, ctx); | 559 | emit_mov_i(r_off, k, ctx); |
| 543 | load_common: | 560 | load_common: |
| 544 | ctx->seen |= SEEN_DATA | SEEN_CALL; | 561 | ctx->seen |= SEEN_DATA | SEEN_CALL; |
| @@ -547,12 +564,24 @@ load_common: | |||
| 547 | emit(ARM_SUB_I(r_scratch, r_skb_hl, | 564 | emit(ARM_SUB_I(r_scratch, r_skb_hl, |
| 548 | 1 << load_order), ctx); | 565 | 1 << load_order), ctx); |
| 549 | emit(ARM_CMP_R(r_scratch, r_off), ctx); | 566 | emit(ARM_CMP_R(r_scratch, r_off), ctx); |
| 550 | condt = ARM_COND_HS; | 567 | condt = ARM_COND_GE; |
| 551 | } else { | 568 | } else { |
| 552 | emit(ARM_CMP_R(r_skb_hl, r_off), ctx); | 569 | emit(ARM_CMP_R(r_skb_hl, r_off), ctx); |
| 553 | condt = ARM_COND_HI; | 570 | condt = ARM_COND_HI; |
| 554 | } | 571 | } |
| 555 | 572 | ||
| 573 | /* | ||
| 574 | * test for negative offset, only if we are | ||
| 575 | * currently scheduled to take the fast | ||
| 576 | * path. this will update the flags so that | ||
| 577 | * the slowpath instruction are ignored if the | ||
| 578 | * offset is negative. | ||
| 579 | * | ||
| 580 | * for loard_order == 0 the HI condition will | ||
| 581 | * make loads at offset 0 take the slow path too. | ||
| 582 | */ | ||
| 583 | _emit(condt, ARM_CMP_I(r_off, 0), ctx); | ||
| 584 | |||
| 556 | _emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data), | 585 | _emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data), |
| 557 | ctx); | 586 | ctx); |
| 558 | 587 | ||
| @@ -860,9 +889,11 @@ b_epilogue: | |||
| 860 | off = offsetof(struct sk_buff, vlan_tci); | 889 | off = offsetof(struct sk_buff, vlan_tci); |
| 861 | emit(ARM_LDRH_I(r_A, r_skb, off), ctx); | 890 | emit(ARM_LDRH_I(r_A, r_skb, off), ctx); |
| 862 | if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) | 891 | if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) |
| 863 | OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx); | 892 | OP_IMM3(ARM_AND, r_A, r_A, ~VLAN_TAG_PRESENT, ctx); |
| 864 | else | 893 | else { |
| 865 | OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx); | 894 | OP_IMM3(ARM_LSR, r_A, r_A, 12, ctx); |
| 895 | OP_IMM3(ARM_AND, r_A, r_A, 0x1, ctx); | ||
| 896 | } | ||
| 866 | break; | 897 | break; |
| 867 | case BPF_ANC | SKF_AD_QUEUE: | 898 | case BPF_ANC | SKF_AD_QUEUE: |
| 868 | ctx->seen |= SEEN_SKB; | 899 | ctx->seen |= SEEN_SKB; |
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c index 1e1a4323a71f..9ceb8ac68fdc 100644 --- a/drivers/bluetooth/btbcm.c +++ b/drivers/bluetooth/btbcm.c | |||
| @@ -472,12 +472,11 @@ int btbcm_setup_apple(struct hci_dev *hdev) | |||
| 472 | 472 | ||
| 473 | /* Read Verbose Config Version Info */ | 473 | /* Read Verbose Config Version Info */ |
| 474 | skb = btbcm_read_verbose_config(hdev); | 474 | skb = btbcm_read_verbose_config(hdev); |
| 475 | if (IS_ERR(skb)) | 475 | if (!IS_ERR(skb)) { |
| 476 | return PTR_ERR(skb); | 476 | BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, skb->data[1], |
| 477 | 477 | get_unaligned_le16(skb->data + 5)); | |
| 478 | BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, skb->data[1], | 478 | kfree_skb(skb); |
| 479 | get_unaligned_le16(skb->data + 5)); | 479 | } |
| 480 | kfree_skb(skb); | ||
| 481 | 480 | ||
| 482 | set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); | 481 | set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); |
| 483 | 482 | ||
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c index 8c91fd5eb6fd..375be509e95f 100644 --- a/drivers/isdn/gigaset/ser-gigaset.c +++ b/drivers/isdn/gigaset/ser-gigaset.c | |||
| @@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty) | |||
| 524 | cs->hw.ser->tty = tty; | 524 | cs->hw.ser->tty = tty; |
| 525 | atomic_set(&cs->hw.ser->refcnt, 1); | 525 | atomic_set(&cs->hw.ser->refcnt, 1); |
| 526 | init_completion(&cs->hw.ser->dead_cmp); | 526 | init_completion(&cs->hw.ser->dead_cmp); |
| 527 | |||
| 528 | tty->disc_data = cs; | 527 | tty->disc_data = cs; |
| 529 | 528 | ||
| 529 | /* Set the amount of data we're willing to receive per call | ||
| 530 | * from the hardware driver to half of the input buffer size | ||
| 531 | * to leave some reserve. | ||
| 532 | * Note: We don't do flow control towards the hardware driver. | ||
| 533 | * If more data is received than will fit into the input buffer, | ||
| 534 | * it will be dropped and an error will be logged. This should | ||
| 535 | * never happen as the device is slow and the buffer size ample. | ||
| 536 | */ | ||
| 537 | tty->receive_room = RBUFSIZE/2; | ||
| 538 | |||
| 530 | /* OK.. Initialization of the datastructures and the HW is done.. Now | 539 | /* OK.. Initialization of the datastructures and the HW is done.. Now |
| 531 | * startup system and notify the LL that we are ready to run | 540 | * startup system and notify the LL that we are ready to run |
| 532 | */ | 541 | */ |
| @@ -598,28 +607,6 @@ static int gigaset_tty_hangup(struct tty_struct *tty) | |||
| 598 | } | 607 | } |
| 599 | 608 | ||
| 600 | /* | 609 | /* |
| 601 | * Read on the tty. | ||
| 602 | * Unused, received data goes only to the Gigaset driver. | ||
| 603 | */ | ||
| 604 | static ssize_t | ||
| 605 | gigaset_tty_read(struct tty_struct *tty, struct file *file, | ||
| 606 | unsigned char __user *buf, size_t count) | ||
| 607 | { | ||
| 608 | return -EAGAIN; | ||
| 609 | } | ||
| 610 | |||
| 611 | /* | ||
| 612 | * Write on the tty. | ||
| 613 | * Unused, transmit data comes only from the Gigaset driver. | ||
| 614 | */ | ||
| 615 | static ssize_t | ||
| 616 | gigaset_tty_write(struct tty_struct *tty, struct file *file, | ||
| 617 | const unsigned char *buf, size_t count) | ||
| 618 | { | ||
| 619 | return -EAGAIN; | ||
| 620 | } | ||
| 621 | |||
| 622 | /* | ||
| 623 | * Ioctl on the tty. | 610 | * Ioctl on the tty. |
| 624 | * Called in process context only. | 611 | * Called in process context only. |
| 625 | * May be re-entered by multiple ioctl calling threads. | 612 | * May be re-entered by multiple ioctl calling threads. |
| @@ -752,8 +739,6 @@ static struct tty_ldisc_ops gigaset_ldisc = { | |||
| 752 | .open = gigaset_tty_open, | 739 | .open = gigaset_tty_open, |
| 753 | .close = gigaset_tty_close, | 740 | .close = gigaset_tty_close, |
| 754 | .hangup = gigaset_tty_hangup, | 741 | .hangup = gigaset_tty_hangup, |
| 755 | .read = gigaset_tty_read, | ||
| 756 | .write = gigaset_tty_write, | ||
| 757 | .ioctl = gigaset_tty_ioctl, | 742 | .ioctl = gigaset_tty_ioctl, |
| 758 | .receive_buf = gigaset_tty_receive, | 743 | .receive_buf = gigaset_tty_receive, |
| 759 | .write_wakeup = gigaset_tty_wakeup, | 744 | .write_wakeup = gigaset_tty_wakeup, |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 317a49480475..e1ccefce9a9d 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -625,6 +625,23 @@ static void bond_set_dev_addr(struct net_device *bond_dev, | |||
| 625 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); | 625 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); |
| 626 | } | 626 | } |
| 627 | 627 | ||
| 628 | static struct slave *bond_get_old_active(struct bonding *bond, | ||
| 629 | struct slave *new_active) | ||
| 630 | { | ||
| 631 | struct slave *slave; | ||
| 632 | struct list_head *iter; | ||
| 633 | |||
| 634 | bond_for_each_slave(bond, slave, iter) { | ||
| 635 | if (slave == new_active) | ||
| 636 | continue; | ||
| 637 | |||
| 638 | if (ether_addr_equal(bond->dev->dev_addr, slave->dev->dev_addr)) | ||
| 639 | return slave; | ||
| 640 | } | ||
| 641 | |||
| 642 | return NULL; | ||
| 643 | } | ||
| 644 | |||
| 628 | /* bond_do_fail_over_mac | 645 | /* bond_do_fail_over_mac |
| 629 | * | 646 | * |
| 630 | * Perform special MAC address swapping for fail_over_mac settings | 647 | * Perform special MAC address swapping for fail_over_mac settings |
| @@ -652,6 +669,9 @@ static void bond_do_fail_over_mac(struct bonding *bond, | |||
| 652 | if (!new_active) | 669 | if (!new_active) |
| 653 | return; | 670 | return; |
| 654 | 671 | ||
| 672 | if (!old_active) | ||
| 673 | old_active = bond_get_old_active(bond, new_active); | ||
| 674 | |||
| 655 | if (old_active) { | 675 | if (old_active) { |
| 656 | ether_addr_copy(tmp_mac, new_active->dev->dev_addr); | 676 | ether_addr_copy(tmp_mac, new_active->dev->dev_addr); |
| 657 | ether_addr_copy(saddr.sa_data, | 677 | ether_addr_copy(saddr.sa_data, |
| @@ -1725,9 +1745,16 @@ err_free: | |||
| 1725 | 1745 | ||
| 1726 | err_undo_flags: | 1746 | err_undo_flags: |
| 1727 | /* Enslave of first slave has failed and we need to fix master's mac */ | 1747 | /* Enslave of first slave has failed and we need to fix master's mac */ |
| 1728 | if (!bond_has_slaves(bond) && | 1748 | if (!bond_has_slaves(bond)) { |
| 1729 | ether_addr_equal_64bits(bond_dev->dev_addr, slave_dev->dev_addr)) | 1749 | if (ether_addr_equal_64bits(bond_dev->dev_addr, |
| 1730 | eth_hw_addr_random(bond_dev); | 1750 | slave_dev->dev_addr)) |
| 1751 | eth_hw_addr_random(bond_dev); | ||
| 1752 | if (bond_dev->type != ARPHRD_ETHER) { | ||
| 1753 | ether_setup(bond_dev); | ||
| 1754 | bond_dev->flags |= IFF_MASTER; | ||
| 1755 | bond_dev->priv_flags &= ~IFF_TX_SKB_SHARING; | ||
| 1756 | } | ||
| 1757 | } | ||
| 1731 | 1758 | ||
| 1732 | return res; | 1759 | return res; |
| 1733 | } | 1760 | } |
| @@ -1916,6 +1943,7 @@ static int bond_release_and_destroy(struct net_device *bond_dev, | |||
| 1916 | bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; | 1943 | bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; |
| 1917 | netdev_info(bond_dev, "Destroying bond %s\n", | 1944 | netdev_info(bond_dev, "Destroying bond %s\n", |
| 1918 | bond_dev->name); | 1945 | bond_dev->name); |
| 1946 | bond_remove_proc_entry(bond); | ||
| 1919 | unregister_netdevice(bond_dev); | 1947 | unregister_netdevice(bond_dev); |
| 1920 | } | 1948 | } |
| 1921 | return ret; | 1949 | return ret; |
diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index f4e40aa4d2a2..945c0955a967 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c | |||
| @@ -577,10 +577,10 @@ static void at91_rx_overflow_err(struct net_device *dev) | |||
| 577 | 577 | ||
| 578 | cf->can_id |= CAN_ERR_CRTL; | 578 | cf->can_id |= CAN_ERR_CRTL; |
| 579 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; | 579 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; |
| 580 | netif_receive_skb(skb); | ||
| 581 | 580 | ||
| 582 | stats->rx_packets++; | 581 | stats->rx_packets++; |
| 583 | stats->rx_bytes += cf->can_dlc; | 582 | stats->rx_bytes += cf->can_dlc; |
| 583 | netif_receive_skb(skb); | ||
| 584 | } | 584 | } |
| 585 | 585 | ||
| 586 | /** | 586 | /** |
| @@ -642,10 +642,10 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb) | |||
| 642 | } | 642 | } |
| 643 | 643 | ||
| 644 | at91_read_mb(dev, mb, cf); | 644 | at91_read_mb(dev, mb, cf); |
| 645 | netif_receive_skb(skb); | ||
| 646 | 645 | ||
| 647 | stats->rx_packets++; | 646 | stats->rx_packets++; |
| 648 | stats->rx_bytes += cf->can_dlc; | 647 | stats->rx_bytes += cf->can_dlc; |
| 648 | netif_receive_skb(skb); | ||
| 649 | 649 | ||
| 650 | can_led_event(dev, CAN_LED_EVENT_RX); | 650 | can_led_event(dev, CAN_LED_EVENT_RX); |
| 651 | } | 651 | } |
| @@ -802,10 +802,10 @@ static int at91_poll_err(struct net_device *dev, int quota, u32 reg_sr) | |||
| 802 | return 0; | 802 | return 0; |
| 803 | 803 | ||
| 804 | at91_poll_err_frame(dev, cf, reg_sr); | 804 | at91_poll_err_frame(dev, cf, reg_sr); |
| 805 | netif_receive_skb(skb); | ||
| 806 | 805 | ||
| 807 | dev->stats.rx_packets++; | 806 | dev->stats.rx_packets++; |
| 808 | dev->stats.rx_bytes += cf->can_dlc; | 807 | dev->stats.rx_bytes += cf->can_dlc; |
| 808 | netif_receive_skb(skb); | ||
| 809 | 809 | ||
| 810 | return 1; | 810 | return 1; |
| 811 | } | 811 | } |
| @@ -1067,10 +1067,10 @@ static void at91_irq_err(struct net_device *dev) | |||
| 1067 | return; | 1067 | return; |
| 1068 | 1068 | ||
| 1069 | at91_irq_err_state(dev, cf, new_state); | 1069 | at91_irq_err_state(dev, cf, new_state); |
| 1070 | netif_rx(skb); | ||
| 1071 | 1070 | ||
| 1072 | dev->stats.rx_packets++; | 1071 | dev->stats.rx_packets++; |
| 1073 | dev->stats.rx_bytes += cf->can_dlc; | 1072 | dev->stats.rx_bytes += cf->can_dlc; |
| 1073 | netif_rx(skb); | ||
| 1074 | 1074 | ||
| 1075 | priv->can.state = new_state; | 1075 | priv->can.state = new_state; |
| 1076 | } | 1076 | } |
diff --git a/drivers/net/can/bfin_can.c b/drivers/net/can/bfin_can.c index 27ad312e7abf..57dadd52b428 100644 --- a/drivers/net/can/bfin_can.c +++ b/drivers/net/can/bfin_can.c | |||
| @@ -424,10 +424,9 @@ static void bfin_can_rx(struct net_device *dev, u16 isrc) | |||
| 424 | cf->data[6 - i] = (6 - i) < cf->can_dlc ? (val >> 8) : 0; | 424 | cf->data[6 - i] = (6 - i) < cf->can_dlc ? (val >> 8) : 0; |
| 425 | } | 425 | } |
| 426 | 426 | ||
| 427 | netif_rx(skb); | ||
| 428 | |||
| 429 | stats->rx_packets++; | 427 | stats->rx_packets++; |
| 430 | stats->rx_bytes += cf->can_dlc; | 428 | stats->rx_bytes += cf->can_dlc; |
| 429 | netif_rx(skb); | ||
| 431 | } | 430 | } |
| 432 | 431 | ||
| 433 | static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) | 432 | static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) |
| @@ -508,10 +507,9 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) | |||
| 508 | 507 | ||
| 509 | priv->can.state = state; | 508 | priv->can.state = state; |
| 510 | 509 | ||
| 511 | netif_rx(skb); | ||
| 512 | |||
| 513 | stats->rx_packets++; | 510 | stats->rx_packets++; |
| 514 | stats->rx_bytes += cf->can_dlc; | 511 | stats->rx_bytes += cf->can_dlc; |
| 512 | netif_rx(skb); | ||
| 515 | 513 | ||
| 516 | return 0; | 514 | return 0; |
| 517 | } | 515 | } |
diff --git a/drivers/net/can/cc770/cc770.c b/drivers/net/can/cc770/cc770.c index c11d44984036..70a8cbb29e75 100644 --- a/drivers/net/can/cc770/cc770.c +++ b/drivers/net/can/cc770/cc770.c | |||
| @@ -504,10 +504,10 @@ static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1) | |||
| 504 | for (i = 0; i < cf->can_dlc; i++) | 504 | for (i = 0; i < cf->can_dlc; i++) |
| 505 | cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]); | 505 | cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]); |
| 506 | } | 506 | } |
| 507 | netif_rx(skb); | ||
| 508 | 507 | ||
| 509 | stats->rx_packets++; | 508 | stats->rx_packets++; |
| 510 | stats->rx_bytes += cf->can_dlc; | 509 | stats->rx_bytes += cf->can_dlc; |
| 510 | netif_rx(skb); | ||
| 511 | } | 511 | } |
| 512 | 512 | ||
| 513 | static int cc770_err(struct net_device *dev, u8 status) | 513 | static int cc770_err(struct net_device *dev, u8 status) |
| @@ -584,10 +584,10 @@ static int cc770_err(struct net_device *dev, u8 status) | |||
| 584 | } | 584 | } |
| 585 | } | 585 | } |
| 586 | 586 | ||
| 587 | netif_rx(skb); | ||
| 588 | 587 | ||
| 589 | stats->rx_packets++; | 588 | stats->rx_packets++; |
| 590 | stats->rx_bytes += cf->can_dlc; | 589 | stats->rx_bytes += cf->can_dlc; |
| 590 | netif_rx(skb); | ||
| 591 | 591 | ||
| 592 | return 0; | 592 | return 0; |
| 593 | } | 593 | } |
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 6201c5a1a884..b1e8d729851c 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
| @@ -577,10 +577,10 @@ static int flexcan_poll_bus_err(struct net_device *dev, u32 reg_esr) | |||
| 577 | return 0; | 577 | return 0; |
| 578 | 578 | ||
| 579 | do_bus_err(dev, cf, reg_esr); | 579 | do_bus_err(dev, cf, reg_esr); |
| 580 | netif_receive_skb(skb); | ||
| 581 | 580 | ||
| 582 | dev->stats.rx_packets++; | 581 | dev->stats.rx_packets++; |
| 583 | dev->stats.rx_bytes += cf->can_dlc; | 582 | dev->stats.rx_bytes += cf->can_dlc; |
| 583 | netif_receive_skb(skb); | ||
| 584 | 584 | ||
| 585 | return 1; | 585 | return 1; |
| 586 | } | 586 | } |
| @@ -622,10 +622,9 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr) | |||
| 622 | if (unlikely(new_state == CAN_STATE_BUS_OFF)) | 622 | if (unlikely(new_state == CAN_STATE_BUS_OFF)) |
| 623 | can_bus_off(dev); | 623 | can_bus_off(dev); |
| 624 | 624 | ||
| 625 | netif_receive_skb(skb); | ||
| 626 | |||
| 627 | dev->stats.rx_packets++; | 625 | dev->stats.rx_packets++; |
| 628 | dev->stats.rx_bytes += cf->can_dlc; | 626 | dev->stats.rx_bytes += cf->can_dlc; |
| 627 | netif_receive_skb(skb); | ||
| 629 | 628 | ||
| 630 | return 1; | 629 | return 1; |
| 631 | } | 630 | } |
| @@ -670,10 +669,10 @@ static int flexcan_read_frame(struct net_device *dev) | |||
| 670 | } | 669 | } |
| 671 | 670 | ||
| 672 | flexcan_read_fifo(dev, cf); | 671 | flexcan_read_fifo(dev, cf); |
| 673 | netif_receive_skb(skb); | ||
| 674 | 672 | ||
| 675 | stats->rx_packets++; | 673 | stats->rx_packets++; |
| 676 | stats->rx_bytes += cf->can_dlc; | 674 | stats->rx_bytes += cf->can_dlc; |
| 675 | netif_receive_skb(skb); | ||
| 677 | 676 | ||
| 678 | can_led_event(dev, CAN_LED_EVENT_RX); | 677 | can_led_event(dev, CAN_LED_EVENT_RX); |
| 679 | 678 | ||
diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c index e3d7e22a4fa0..db9538d4b358 100644 --- a/drivers/net/can/grcan.c +++ b/drivers/net/can/grcan.c | |||
| @@ -1216,11 +1216,12 @@ static int grcan_receive(struct net_device *dev, int budget) | |||
| 1216 | cf->data[i] = (u8)(slot[j] >> shift); | 1216 | cf->data[i] = (u8)(slot[j] >> shift); |
| 1217 | } | 1217 | } |
| 1218 | } | 1218 | } |
| 1219 | netif_receive_skb(skb); | ||
| 1220 | 1219 | ||
| 1221 | /* Update statistics and read pointer */ | 1220 | /* Update statistics and read pointer */ |
| 1222 | stats->rx_packets++; | 1221 | stats->rx_packets++; |
| 1223 | stats->rx_bytes += cf->can_dlc; | 1222 | stats->rx_bytes += cf->can_dlc; |
| 1223 | netif_receive_skb(skb); | ||
| 1224 | |||
| 1224 | rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size); | 1225 | rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size); |
| 1225 | } | 1226 | } |
| 1226 | 1227 | ||
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c index 32bd7f451aa4..7b92e911a616 100644 --- a/drivers/net/can/sja1000/sja1000.c +++ b/drivers/net/can/sja1000/sja1000.c | |||
| @@ -377,10 +377,9 @@ static void sja1000_rx(struct net_device *dev) | |||
| 377 | /* release receive buffer */ | 377 | /* release receive buffer */ |
| 378 | sja1000_write_cmdreg(priv, CMD_RRB); | 378 | sja1000_write_cmdreg(priv, CMD_RRB); |
| 379 | 379 | ||
| 380 | netif_rx(skb); | ||
| 381 | |||
| 382 | stats->rx_packets++; | 380 | stats->rx_packets++; |
| 383 | stats->rx_bytes += cf->can_dlc; | 381 | stats->rx_bytes += cf->can_dlc; |
| 382 | netif_rx(skb); | ||
| 384 | 383 | ||
| 385 | can_led_event(dev, CAN_LED_EVENT_RX); | 384 | can_led_event(dev, CAN_LED_EVENT_RX); |
| 386 | } | 385 | } |
| @@ -484,10 +483,9 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
| 484 | can_bus_off(dev); | 483 | can_bus_off(dev); |
| 485 | } | 484 | } |
| 486 | 485 | ||
| 487 | netif_rx(skb); | ||
| 488 | |||
| 489 | stats->rx_packets++; | 486 | stats->rx_packets++; |
| 490 | stats->rx_bytes += cf->can_dlc; | 487 | stats->rx_bytes += cf->can_dlc; |
| 488 | netif_rx(skb); | ||
| 491 | 489 | ||
| 492 | return 0; | 490 | return 0; |
| 493 | } | 491 | } |
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index a23a7af8eb9a..9a3f15cb7ef4 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c | |||
| @@ -218,10 +218,10 @@ static void slc_bump(struct slcan *sl) | |||
| 218 | 218 | ||
| 219 | memcpy(skb_put(skb, sizeof(struct can_frame)), | 219 | memcpy(skb_put(skb, sizeof(struct can_frame)), |
| 220 | &cf, sizeof(struct can_frame)); | 220 | &cf, sizeof(struct can_frame)); |
| 221 | netif_rx_ni(skb); | ||
| 222 | 221 | ||
| 223 | sl->dev->stats.rx_packets++; | 222 | sl->dev->stats.rx_packets++; |
| 224 | sl->dev->stats.rx_bytes += cf.can_dlc; | 223 | sl->dev->stats.rx_bytes += cf.can_dlc; |
| 224 | netif_rx_ni(skb); | ||
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | /* parse tty input stream */ | 227 | /* parse tty input stream */ |
diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c index c1a95a34d62e..b7e83c212023 100644 --- a/drivers/net/can/spi/mcp251x.c +++ b/drivers/net/can/spi/mcp251x.c | |||
| @@ -1086,8 +1086,8 @@ static int mcp251x_can_probe(struct spi_device *spi) | |||
| 1086 | if (ret) | 1086 | if (ret) |
| 1087 | goto out_clk; | 1087 | goto out_clk; |
| 1088 | 1088 | ||
| 1089 | priv->power = devm_regulator_get(&spi->dev, "vdd"); | 1089 | priv->power = devm_regulator_get_optional(&spi->dev, "vdd"); |
| 1090 | priv->transceiver = devm_regulator_get(&spi->dev, "xceiver"); | 1090 | priv->transceiver = devm_regulator_get_optional(&spi->dev, "xceiver"); |
| 1091 | if ((PTR_ERR(priv->power) == -EPROBE_DEFER) || | 1091 | if ((PTR_ERR(priv->power) == -EPROBE_DEFER) || |
| 1092 | (PTR_ERR(priv->transceiver) == -EPROBE_DEFER)) { | 1092 | (PTR_ERR(priv->transceiver) == -EPROBE_DEFER)) { |
| 1093 | ret = -EPROBE_DEFER; | 1093 | ret = -EPROBE_DEFER; |
| @@ -1222,17 +1222,16 @@ static int __maybe_unused mcp251x_can_resume(struct device *dev) | |||
| 1222 | struct spi_device *spi = to_spi_device(dev); | 1222 | struct spi_device *spi = to_spi_device(dev); |
| 1223 | struct mcp251x_priv *priv = spi_get_drvdata(spi); | 1223 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
| 1224 | 1224 | ||
| 1225 | if (priv->after_suspend & AFTER_SUSPEND_POWER) { | 1225 | if (priv->after_suspend & AFTER_SUSPEND_POWER) |
| 1226 | mcp251x_power_enable(priv->power, 1); | 1226 | mcp251x_power_enable(priv->power, 1); |
| 1227 | |||
| 1228 | if (priv->after_suspend & AFTER_SUSPEND_UP) { | ||
| 1229 | mcp251x_power_enable(priv->transceiver, 1); | ||
| 1227 | queue_work(priv->wq, &priv->restart_work); | 1230 | queue_work(priv->wq, &priv->restart_work); |
| 1228 | } else { | 1231 | } else { |
| 1229 | if (priv->after_suspend & AFTER_SUSPEND_UP) { | 1232 | priv->after_suspend = 0; |
| 1230 | mcp251x_power_enable(priv->transceiver, 1); | ||
| 1231 | queue_work(priv->wq, &priv->restart_work); | ||
| 1232 | } else { | ||
| 1233 | priv->after_suspend = 0; | ||
| 1234 | } | ||
| 1235 | } | 1233 | } |
| 1234 | |||
| 1236 | priv->force_quit = 0; | 1235 | priv->force_quit = 0; |
| 1237 | enable_irq(spi->irq); | 1236 | enable_irq(spi->irq); |
| 1238 | return 0; | 1237 | return 0; |
diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c index e95a9e1a889f..cf345cbfe819 100644 --- a/drivers/net/can/ti_hecc.c +++ b/drivers/net/can/ti_hecc.c | |||
| @@ -747,9 +747,9 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
| 747 | } | 747 | } |
| 748 | } | 748 | } |
| 749 | 749 | ||
| 750 | netif_rx(skb); | ||
| 751 | stats->rx_packets++; | 750 | stats->rx_packets++; |
| 752 | stats->rx_bytes += cf->can_dlc; | 751 | stats->rx_bytes += cf->can_dlc; |
| 752 | netif_rx(skb); | ||
| 753 | 753 | ||
| 754 | return 0; | 754 | return 0; |
| 755 | } | 755 | } |
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 866bac0ae7e9..2d390384ef3b 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
| @@ -324,10 +324,9 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
| 324 | cf->data[i] = msg->msg.can_msg.msg[i]; | 324 | cf->data[i] = msg->msg.can_msg.msg[i]; |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | netif_rx(skb); | ||
| 328 | |||
| 329 | stats->rx_packets++; | 327 | stats->rx_packets++; |
| 330 | stats->rx_bytes += cf->can_dlc; | 328 | stats->rx_bytes += cf->can_dlc; |
| 329 | netif_rx(skb); | ||
| 331 | } | 330 | } |
| 332 | 331 | ||
| 333 | static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) | 332 | static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) |
| @@ -400,10 +399,9 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
| 400 | stats->rx_errors++; | 399 | stats->rx_errors++; |
| 401 | } | 400 | } |
| 402 | 401 | ||
| 403 | netif_rx(skb); | ||
| 404 | |||
| 405 | stats->rx_packets++; | 402 | stats->rx_packets++; |
| 406 | stats->rx_bytes += cf->can_dlc; | 403 | stats->rx_bytes += cf->can_dlc; |
| 404 | netif_rx(skb); | ||
| 407 | } | 405 | } |
| 408 | 406 | ||
| 409 | /* | 407 | /* |
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index 411c1af92c62..0e5a4493ba4f 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c | |||
| @@ -301,13 +301,12 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv, | |||
| 301 | cf->data[7] = rxerr; | 301 | cf->data[7] = rxerr; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | netif_rx(skb); | ||
| 305 | |||
| 306 | priv->bec.txerr = txerr; | 304 | priv->bec.txerr = txerr; |
| 307 | priv->bec.rxerr = rxerr; | 305 | priv->bec.rxerr = rxerr; |
| 308 | 306 | ||
| 309 | stats->rx_packets++; | 307 | stats->rx_packets++; |
| 310 | stats->rx_bytes += cf->can_dlc; | 308 | stats->rx_bytes += cf->can_dlc; |
| 309 | netif_rx(skb); | ||
| 311 | } | 310 | } |
| 312 | } | 311 | } |
| 313 | 312 | ||
| @@ -347,10 +346,9 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv, | |||
| 347 | cf->data[i] = msg->msg.rx.data[i]; | 346 | cf->data[i] = msg->msg.rx.data[i]; |
| 348 | } | 347 | } |
| 349 | 348 | ||
| 350 | netif_rx(skb); | ||
| 351 | |||
| 352 | stats->rx_packets++; | 349 | stats->rx_packets++; |
| 353 | stats->rx_bytes += cf->can_dlc; | 350 | stats->rx_bytes += cf->can_dlc; |
| 351 | netif_rx(skb); | ||
| 354 | } | 352 | } |
| 355 | 353 | ||
| 356 | return; | 354 | return; |
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c index 72427f21edff..6b94007ae052 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb.c | |||
| @@ -526,9 +526,9 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, | |||
| 526 | hwts->hwtstamp = timeval_to_ktime(tv); | 526 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 527 | } | 527 | } |
| 528 | 528 | ||
| 529 | netif_rx(skb); | ||
| 530 | mc->netdev->stats.rx_packets++; | 529 | mc->netdev->stats.rx_packets++; |
| 531 | mc->netdev->stats.rx_bytes += cf->can_dlc; | 530 | mc->netdev->stats.rx_bytes += cf->can_dlc; |
| 531 | netif_rx(skb); | ||
| 532 | 532 | ||
| 533 | return 0; | 533 | return 0; |
| 534 | } | 534 | } |
| @@ -659,12 +659,11 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) | |||
| 659 | hwts = skb_hwtstamps(skb); | 659 | hwts = skb_hwtstamps(skb); |
| 660 | hwts->hwtstamp = timeval_to_ktime(tv); | 660 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 661 | 661 | ||
| 662 | /* push the skb */ | ||
| 663 | netif_rx(skb); | ||
| 664 | |||
| 665 | /* update statistics */ | 662 | /* update statistics */ |
| 666 | mc->netdev->stats.rx_packets++; | 663 | mc->netdev->stats.rx_packets++; |
| 667 | mc->netdev->stats.rx_bytes += cf->can_dlc; | 664 | mc->netdev->stats.rx_bytes += cf->can_dlc; |
| 665 | /* push the skb */ | ||
| 666 | netif_rx(skb); | ||
| 668 | 667 | ||
| 669 | return 0; | 668 | return 0; |
| 670 | 669 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index dec51717635e..7d61b3279798 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | |||
| @@ -553,9 +553,9 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if, | |||
| 553 | hwts = skb_hwtstamps(skb); | 553 | hwts = skb_hwtstamps(skb); |
| 554 | hwts->hwtstamp = timeval_to_ktime(tv); | 554 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 555 | 555 | ||
| 556 | netif_rx(skb); | ||
| 557 | netdev->stats.rx_packets++; | 556 | netdev->stats.rx_packets++; |
| 558 | netdev->stats.rx_bytes += can_frame->can_dlc; | 557 | netdev->stats.rx_bytes += can_frame->can_dlc; |
| 558 | netif_rx(skb); | ||
| 559 | 559 | ||
| 560 | return 0; | 560 | return 0; |
| 561 | } | 561 | } |
| @@ -670,9 +670,9 @@ static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, | |||
| 670 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); | 670 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); |
| 671 | hwts = skb_hwtstamps(skb); | 671 | hwts = skb_hwtstamps(skb); |
| 672 | hwts->hwtstamp = timeval_to_ktime(tv); | 672 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 673 | netif_rx(skb); | ||
| 674 | netdev->stats.rx_packets++; | 673 | netdev->stats.rx_packets++; |
| 675 | netdev->stats.rx_bytes += can_frame->can_dlc; | 674 | netdev->stats.rx_bytes += can_frame->can_dlc; |
| 675 | netif_rx(skb); | ||
| 676 | 676 | ||
| 677 | return 0; | 677 | return 0; |
| 678 | } | 678 | } |
diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c index dd52c7a4c80d..de95b1ccba3e 100644 --- a/drivers/net/can/usb/usb_8dev.c +++ b/drivers/net/can/usb/usb_8dev.c | |||
| @@ -461,10 +461,9 @@ static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv, | |||
| 461 | priv->bec.txerr = txerr; | 461 | priv->bec.txerr = txerr; |
| 462 | priv->bec.rxerr = rxerr; | 462 | priv->bec.rxerr = rxerr; |
| 463 | 463 | ||
| 464 | netif_rx(skb); | ||
| 465 | |||
| 466 | stats->rx_packets++; | 464 | stats->rx_packets++; |
| 467 | stats->rx_bytes += cf->can_dlc; | 465 | stats->rx_bytes += cf->can_dlc; |
| 466 | netif_rx(skb); | ||
| 468 | } | 467 | } |
| 469 | 468 | ||
| 470 | /* Read data and status frames */ | 469 | /* Read data and status frames */ |
| @@ -494,10 +493,9 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv, | |||
| 494 | else | 493 | else |
| 495 | memcpy(cf->data, msg->data, cf->can_dlc); | 494 | memcpy(cf->data, msg->data, cf->can_dlc); |
| 496 | 495 | ||
| 497 | netif_rx(skb); | ||
| 498 | |||
| 499 | stats->rx_packets++; | 496 | stats->rx_packets++; |
| 500 | stats->rx_bytes += cf->can_dlc; | 497 | stats->rx_bytes += cf->can_dlc; |
| 498 | netif_rx(skb); | ||
| 501 | 499 | ||
| 502 | can_led_event(priv->netdev, CAN_LED_EVENT_RX); | 500 | can_led_event(priv->netdev, CAN_LED_EVENT_RX); |
| 503 | } else { | 501 | } else { |
diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index 972982f8bea7..079897b3a955 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c | |||
| @@ -696,9 +696,20 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds) | |||
| 696 | } | 696 | } |
| 697 | 697 | ||
| 698 | /* Include the pseudo-PHY address and the broadcast PHY address to | 698 | /* Include the pseudo-PHY address and the broadcast PHY address to |
| 699 | * divert reads towards our workaround | 699 | * divert reads towards our workaround. This is only required for |
| 700 | * 7445D0, since 7445E0 disconnects the internal switch pseudo-PHY such | ||
| 701 | * that we can use the regular SWITCH_MDIO master controller instead. | ||
| 702 | * | ||
| 703 | * By default, DSA initializes ds->phys_mii_mask to ds->phys_port_mask | ||
| 704 | * to have a 1:1 mapping between Port address and PHY address in order | ||
| 705 | * to utilize the slave_mii_bus instance to read from Port PHYs. This is | ||
| 706 | * not what we want here, so we initialize phys_mii_mask 0 to always | ||
| 707 | * utilize the "master" MDIO bus backed by the "mdio-unimac" driver. | ||
| 700 | */ | 708 | */ |
| 701 | ds->phys_mii_mask |= ((1 << BRCM_PSEUDO_PHY_ADDR) | (1 << 0)); | 709 | if (of_machine_is_compatible("brcm,bcm7445d0")) |
| 710 | ds->phys_mii_mask |= ((1 << BRCM_PSEUDO_PHY_ADDR) | (1 << 0)); | ||
| 711 | else | ||
| 712 | ds->phys_mii_mask = 0; | ||
| 702 | 713 | ||
| 703 | rev = reg_readl(priv, REG_SWITCH_REVISION); | 714 | rev = reg_readl(priv, REG_SWITCH_REVISION); |
| 704 | priv->hw_params.top_rev = (rev >> SWITCH_TOP_REV_SHIFT) & | 715 | priv->hw_params.top_rev = (rev >> SWITCH_TOP_REV_SHIFT) & |
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c index fd8547c2b79d..561342466076 100644 --- a/drivers/net/dsa/mv88e6xxx.c +++ b/drivers/net/dsa/mv88e6xxx.c | |||
| @@ -1163,7 +1163,7 @@ int mv88e6xxx_leave_bridge(struct dsa_switch *ds, int port, u32 br_port_mask) | |||
| 1163 | 1163 | ||
| 1164 | newfid = __ffs(ps->fid_mask); | 1164 | newfid = __ffs(ps->fid_mask); |
| 1165 | ps->fid[port] = newfid; | 1165 | ps->fid[port] = newfid; |
| 1166 | ps->fid_mask &= (1 << newfid); | 1166 | ps->fid_mask &= ~(1 << newfid); |
| 1167 | ps->bridge_mask[fid] &= ~(1 << port); | 1167 | ps->bridge_mask[fid] &= ~(1 << port); |
| 1168 | ps->bridge_mask[newfid] = 1 << port; | 1168 | ps->bridge_mask[newfid] = 1 << port; |
| 1169 | 1169 | ||
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 42e20e5385ac..1f89c59b4353 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| 25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| 26 | #include <linux/string.h> | 26 | #include <linux/string.h> |
| 27 | #include <linux/pm_runtime.h> | ||
| 28 | #include <linux/ptrace.h> | 27 | #include <linux/ptrace.h> |
| 29 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
| 30 | #include <linux/ioport.h> | 29 | #include <linux/ioport.h> |
| @@ -78,7 +77,6 @@ static void fec_enet_itr_coal_init(struct net_device *ndev); | |||
| 78 | #define FEC_ENET_RAEM_V 0x8 | 77 | #define FEC_ENET_RAEM_V 0x8 |
| 79 | #define FEC_ENET_RAFL_V 0x8 | 78 | #define FEC_ENET_RAFL_V 0x8 |
| 80 | #define FEC_ENET_OPD_V 0xFFF0 | 79 | #define FEC_ENET_OPD_V 0xFFF0 |
| 81 | #define FEC_MDIO_PM_TIMEOUT 100 /* ms */ | ||
| 82 | 80 | ||
| 83 | static struct platform_device_id fec_devtype[] = { | 81 | static struct platform_device_id fec_devtype[] = { |
| 84 | { | 82 | { |
| @@ -1769,13 +1767,7 @@ static void fec_enet_adjust_link(struct net_device *ndev) | |||
| 1769 | static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | 1767 | static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) |
| 1770 | { | 1768 | { |
| 1771 | struct fec_enet_private *fep = bus->priv; | 1769 | struct fec_enet_private *fep = bus->priv; |
| 1772 | struct device *dev = &fep->pdev->dev; | ||
| 1773 | unsigned long time_left; | 1770 | unsigned long time_left; |
| 1774 | int ret = 0; | ||
| 1775 | |||
| 1776 | ret = pm_runtime_get_sync(dev); | ||
| 1777 | if (IS_ERR_VALUE(ret)) | ||
| 1778 | return ret; | ||
| 1779 | 1771 | ||
| 1780 | fep->mii_timeout = 0; | 1772 | fep->mii_timeout = 0; |
| 1781 | init_completion(&fep->mdio_done); | 1773 | init_completion(&fep->mdio_done); |
| @@ -1791,30 +1783,18 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | |||
| 1791 | if (time_left == 0) { | 1783 | if (time_left == 0) { |
| 1792 | fep->mii_timeout = 1; | 1784 | fep->mii_timeout = 1; |
| 1793 | netdev_err(fep->netdev, "MDIO read timeout\n"); | 1785 | netdev_err(fep->netdev, "MDIO read timeout\n"); |
| 1794 | ret = -ETIMEDOUT; | 1786 | return -ETIMEDOUT; |
| 1795 | goto out; | ||
| 1796 | } | 1787 | } |
| 1797 | 1788 | ||
| 1798 | ret = FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); | 1789 | /* return value */ |
| 1799 | 1790 | return FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); | |
| 1800 | out: | ||
| 1801 | pm_runtime_mark_last_busy(dev); | ||
| 1802 | pm_runtime_put_autosuspend(dev); | ||
| 1803 | |||
| 1804 | return ret; | ||
| 1805 | } | 1791 | } |
| 1806 | 1792 | ||
| 1807 | static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | 1793 | static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, |
| 1808 | u16 value) | 1794 | u16 value) |
| 1809 | { | 1795 | { |
| 1810 | struct fec_enet_private *fep = bus->priv; | 1796 | struct fec_enet_private *fep = bus->priv; |
| 1811 | struct device *dev = &fep->pdev->dev; | ||
| 1812 | unsigned long time_left; | 1797 | unsigned long time_left; |
| 1813 | int ret = 0; | ||
| 1814 | |||
| 1815 | ret = pm_runtime_get_sync(dev); | ||
| 1816 | if (IS_ERR_VALUE(ret)) | ||
| 1817 | return ret; | ||
| 1818 | 1798 | ||
| 1819 | fep->mii_timeout = 0; | 1799 | fep->mii_timeout = 0; |
| 1820 | init_completion(&fep->mdio_done); | 1800 | init_completion(&fep->mdio_done); |
| @@ -1831,13 +1811,10 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | |||
| 1831 | if (time_left == 0) { | 1811 | if (time_left == 0) { |
| 1832 | fep->mii_timeout = 1; | 1812 | fep->mii_timeout = 1; |
| 1833 | netdev_err(fep->netdev, "MDIO write timeout\n"); | 1813 | netdev_err(fep->netdev, "MDIO write timeout\n"); |
| 1834 | ret = -ETIMEDOUT; | 1814 | return -ETIMEDOUT; |
| 1835 | } | 1815 | } |
| 1836 | 1816 | ||
| 1837 | pm_runtime_mark_last_busy(dev); | 1817 | return 0; |
| 1838 | pm_runtime_put_autosuspend(dev); | ||
| 1839 | |||
| 1840 | return ret; | ||
| 1841 | } | 1818 | } |
| 1842 | 1819 | ||
| 1843 | static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | 1820 | static int fec_enet_clk_enable(struct net_device *ndev, bool enable) |
| @@ -1849,6 +1826,9 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | |||
| 1849 | ret = clk_prepare_enable(fep->clk_ahb); | 1826 | ret = clk_prepare_enable(fep->clk_ahb); |
| 1850 | if (ret) | 1827 | if (ret) |
| 1851 | return ret; | 1828 | return ret; |
| 1829 | ret = clk_prepare_enable(fep->clk_ipg); | ||
| 1830 | if (ret) | ||
| 1831 | goto failed_clk_ipg; | ||
| 1852 | if (fep->clk_enet_out) { | 1832 | if (fep->clk_enet_out) { |
| 1853 | ret = clk_prepare_enable(fep->clk_enet_out); | 1833 | ret = clk_prepare_enable(fep->clk_enet_out); |
| 1854 | if (ret) | 1834 | if (ret) |
| @@ -1872,6 +1852,7 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | |||
| 1872 | } | 1852 | } |
| 1873 | } else { | 1853 | } else { |
| 1874 | clk_disable_unprepare(fep->clk_ahb); | 1854 | clk_disable_unprepare(fep->clk_ahb); |
| 1855 | clk_disable_unprepare(fep->clk_ipg); | ||
| 1875 | if (fep->clk_enet_out) | 1856 | if (fep->clk_enet_out) |
| 1876 | clk_disable_unprepare(fep->clk_enet_out); | 1857 | clk_disable_unprepare(fep->clk_enet_out); |
| 1877 | if (fep->clk_ptp) { | 1858 | if (fep->clk_ptp) { |
| @@ -1893,6 +1874,8 @@ failed_clk_ptp: | |||
| 1893 | if (fep->clk_enet_out) | 1874 | if (fep->clk_enet_out) |
| 1894 | clk_disable_unprepare(fep->clk_enet_out); | 1875 | clk_disable_unprepare(fep->clk_enet_out); |
| 1895 | failed_clk_enet_out: | 1876 | failed_clk_enet_out: |
| 1877 | clk_disable_unprepare(fep->clk_ipg); | ||
| 1878 | failed_clk_ipg: | ||
| 1896 | clk_disable_unprepare(fep->clk_ahb); | 1879 | clk_disable_unprepare(fep->clk_ahb); |
| 1897 | 1880 | ||
| 1898 | return ret; | 1881 | return ret; |
| @@ -2864,14 +2847,10 @@ fec_enet_open(struct net_device *ndev) | |||
| 2864 | struct fec_enet_private *fep = netdev_priv(ndev); | 2847 | struct fec_enet_private *fep = netdev_priv(ndev); |
| 2865 | int ret; | 2848 | int ret; |
| 2866 | 2849 | ||
| 2867 | ret = pm_runtime_get_sync(&fep->pdev->dev); | ||
| 2868 | if (IS_ERR_VALUE(ret)) | ||
| 2869 | return ret; | ||
| 2870 | |||
| 2871 | pinctrl_pm_select_default_state(&fep->pdev->dev); | 2850 | pinctrl_pm_select_default_state(&fep->pdev->dev); |
| 2872 | ret = fec_enet_clk_enable(ndev, true); | 2851 | ret = fec_enet_clk_enable(ndev, true); |
| 2873 | if (ret) | 2852 | if (ret) |
| 2874 | goto clk_enable; | 2853 | return ret; |
| 2875 | 2854 | ||
| 2876 | /* I should reset the ring buffers here, but I don't yet know | 2855 | /* I should reset the ring buffers here, but I don't yet know |
| 2877 | * a simple way to do that. | 2856 | * a simple way to do that. |
| @@ -2902,9 +2881,6 @@ err_enet_mii_probe: | |||
| 2902 | fec_enet_free_buffers(ndev); | 2881 | fec_enet_free_buffers(ndev); |
| 2903 | err_enet_alloc: | 2882 | err_enet_alloc: |
| 2904 | fec_enet_clk_enable(ndev, false); | 2883 | fec_enet_clk_enable(ndev, false); |
| 2905 | clk_enable: | ||
| 2906 | pm_runtime_mark_last_busy(&fep->pdev->dev); | ||
| 2907 | pm_runtime_put_autosuspend(&fep->pdev->dev); | ||
| 2908 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); | 2884 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); |
| 2909 | return ret; | 2885 | return ret; |
| 2910 | } | 2886 | } |
| @@ -2927,9 +2903,6 @@ fec_enet_close(struct net_device *ndev) | |||
| 2927 | 2903 | ||
| 2928 | fec_enet_clk_enable(ndev, false); | 2904 | fec_enet_clk_enable(ndev, false); |
| 2929 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); | 2905 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); |
| 2930 | pm_runtime_mark_last_busy(&fep->pdev->dev); | ||
| 2931 | pm_runtime_put_autosuspend(&fep->pdev->dev); | ||
| 2932 | |||
| 2933 | fec_enet_free_buffers(ndev); | 2906 | fec_enet_free_buffers(ndev); |
| 2934 | 2907 | ||
| 2935 | return 0; | 2908 | return 0; |
| @@ -3415,10 +3388,6 @@ fec_probe(struct platform_device *pdev) | |||
| 3415 | if (ret) | 3388 | if (ret) |
| 3416 | goto failed_clk; | 3389 | goto failed_clk; |
| 3417 | 3390 | ||
| 3418 | ret = clk_prepare_enable(fep->clk_ipg); | ||
| 3419 | if (ret) | ||
| 3420 | goto failed_clk_ipg; | ||
| 3421 | |||
| 3422 | fep->reg_phy = devm_regulator_get(&pdev->dev, "phy"); | 3391 | fep->reg_phy = devm_regulator_get(&pdev->dev, "phy"); |
| 3423 | if (!IS_ERR(fep->reg_phy)) { | 3392 | if (!IS_ERR(fep->reg_phy)) { |
| 3424 | ret = regulator_enable(fep->reg_phy); | 3393 | ret = regulator_enable(fep->reg_phy); |
| @@ -3465,8 +3434,6 @@ fec_probe(struct platform_device *pdev) | |||
| 3465 | netif_carrier_off(ndev); | 3434 | netif_carrier_off(ndev); |
| 3466 | fec_enet_clk_enable(ndev, false); | 3435 | fec_enet_clk_enable(ndev, false); |
| 3467 | pinctrl_pm_select_sleep_state(&pdev->dev); | 3436 | pinctrl_pm_select_sleep_state(&pdev->dev); |
| 3468 | pm_runtime_set_active(&pdev->dev); | ||
| 3469 | pm_runtime_enable(&pdev->dev); | ||
| 3470 | 3437 | ||
| 3471 | ret = register_netdev(ndev); | 3438 | ret = register_netdev(ndev); |
| 3472 | if (ret) | 3439 | if (ret) |
| @@ -3480,12 +3447,6 @@ fec_probe(struct platform_device *pdev) | |||
| 3480 | 3447 | ||
| 3481 | fep->rx_copybreak = COPYBREAK_DEFAULT; | 3448 | fep->rx_copybreak = COPYBREAK_DEFAULT; |
| 3482 | INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work); | 3449 | INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work); |
| 3483 | |||
| 3484 | pm_runtime_set_autosuspend_delay(&pdev->dev, FEC_MDIO_PM_TIMEOUT); | ||
| 3485 | pm_runtime_use_autosuspend(&pdev->dev); | ||
| 3486 | pm_runtime_mark_last_busy(&pdev->dev); | ||
| 3487 | pm_runtime_put_autosuspend(&pdev->dev); | ||
| 3488 | |||
| 3489 | return 0; | 3450 | return 0; |
| 3490 | 3451 | ||
| 3491 | failed_register: | 3452 | failed_register: |
| @@ -3496,8 +3457,6 @@ failed_init: | |||
| 3496 | if (fep->reg_phy) | 3457 | if (fep->reg_phy) |
| 3497 | regulator_disable(fep->reg_phy); | 3458 | regulator_disable(fep->reg_phy); |
| 3498 | failed_regulator: | 3459 | failed_regulator: |
| 3499 | clk_disable_unprepare(fep->clk_ipg); | ||
| 3500 | failed_clk_ipg: | ||
| 3501 | fec_enet_clk_enable(ndev, false); | 3460 | fec_enet_clk_enable(ndev, false); |
| 3502 | failed_clk: | 3461 | failed_clk: |
| 3503 | failed_phy: | 3462 | failed_phy: |
| @@ -3609,28 +3568,7 @@ failed_clk: | |||
| 3609 | return ret; | 3568 | return ret; |
| 3610 | } | 3569 | } |
| 3611 | 3570 | ||
| 3612 | static int __maybe_unused fec_runtime_suspend(struct device *dev) | 3571 | static SIMPLE_DEV_PM_OPS(fec_pm_ops, fec_suspend, fec_resume); |
| 3613 | { | ||
| 3614 | struct net_device *ndev = dev_get_drvdata(dev); | ||
| 3615 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
| 3616 | |||
| 3617 | clk_disable_unprepare(fep->clk_ipg); | ||
| 3618 | |||
| 3619 | return 0; | ||
| 3620 | } | ||
| 3621 | |||
| 3622 | static int __maybe_unused fec_runtime_resume(struct device *dev) | ||
| 3623 | { | ||
| 3624 | struct net_device *ndev = dev_get_drvdata(dev); | ||
| 3625 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
| 3626 | |||
| 3627 | return clk_prepare_enable(fep->clk_ipg); | ||
| 3628 | } | ||
| 3629 | |||
| 3630 | static const struct dev_pm_ops fec_pm_ops = { | ||
| 3631 | SET_SYSTEM_SLEEP_PM_OPS(fec_suspend, fec_resume) | ||
| 3632 | SET_RUNTIME_PM_OPS(fec_runtime_suspend, fec_runtime_resume, NULL) | ||
| 3633 | }; | ||
| 3634 | 3572 | ||
| 3635 | static struct platform_driver fec_driver = { | 3573 | static struct platform_driver fec_driver = { |
| 3636 | .driver = { | 3574 | .driver = { |
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 370e20ed224c..62e48bc0cb23 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
| @@ -1462,7 +1462,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, | |||
| 1462 | struct mvneta_rx_queue *rxq) | 1462 | struct mvneta_rx_queue *rxq) |
| 1463 | { | 1463 | { |
| 1464 | struct net_device *dev = pp->dev; | 1464 | struct net_device *dev = pp->dev; |
| 1465 | int rx_done, rx_filled; | 1465 | int rx_done; |
| 1466 | u32 rcvd_pkts = 0; | 1466 | u32 rcvd_pkts = 0; |
| 1467 | u32 rcvd_bytes = 0; | 1467 | u32 rcvd_bytes = 0; |
| 1468 | 1468 | ||
| @@ -1473,7 +1473,6 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, | |||
| 1473 | rx_todo = rx_done; | 1473 | rx_todo = rx_done; |
| 1474 | 1474 | ||
| 1475 | rx_done = 0; | 1475 | rx_done = 0; |
| 1476 | rx_filled = 0; | ||
| 1477 | 1476 | ||
| 1478 | /* Fairness NAPI loop */ | 1477 | /* Fairness NAPI loop */ |
| 1479 | while (rx_done < rx_todo) { | 1478 | while (rx_done < rx_todo) { |
| @@ -1484,7 +1483,6 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, | |||
| 1484 | int rx_bytes, err; | 1483 | int rx_bytes, err; |
| 1485 | 1484 | ||
| 1486 | rx_done++; | 1485 | rx_done++; |
| 1487 | rx_filled++; | ||
| 1488 | rx_status = rx_desc->status; | 1486 | rx_status = rx_desc->status; |
| 1489 | rx_bytes = rx_desc->data_size - (ETH_FCS_LEN + MVNETA_MH_SIZE); | 1487 | rx_bytes = rx_desc->data_size - (ETH_FCS_LEN + MVNETA_MH_SIZE); |
| 1490 | data = (unsigned char *)rx_desc->buf_cookie; | 1488 | data = (unsigned char *)rx_desc->buf_cookie; |
| @@ -1524,6 +1522,14 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, | |||
| 1524 | continue; | 1522 | continue; |
| 1525 | } | 1523 | } |
| 1526 | 1524 | ||
| 1525 | /* Refill processing */ | ||
| 1526 | err = mvneta_rx_refill(pp, rx_desc); | ||
| 1527 | if (err) { | ||
| 1528 | netdev_err(dev, "Linux processing - Can't refill\n"); | ||
| 1529 | rxq->missed++; | ||
| 1530 | goto err_drop_frame; | ||
| 1531 | } | ||
| 1532 | |||
| 1527 | skb = build_skb(data, pp->frag_size > PAGE_SIZE ? 0 : pp->frag_size); | 1533 | skb = build_skb(data, pp->frag_size > PAGE_SIZE ? 0 : pp->frag_size); |
| 1528 | if (!skb) | 1534 | if (!skb) |
| 1529 | goto err_drop_frame; | 1535 | goto err_drop_frame; |
| @@ -1543,14 +1549,6 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, | |||
| 1543 | mvneta_rx_csum(pp, rx_status, skb); | 1549 | mvneta_rx_csum(pp, rx_status, skb); |
| 1544 | 1550 | ||
| 1545 | napi_gro_receive(&pp->napi, skb); | 1551 | napi_gro_receive(&pp->napi, skb); |
| 1546 | |||
| 1547 | /* Refill processing */ | ||
| 1548 | err = mvneta_rx_refill(pp, rx_desc); | ||
| 1549 | if (err) { | ||
| 1550 | netdev_err(dev, "Linux processing - Can't refill\n"); | ||
| 1551 | rxq->missed++; | ||
| 1552 | rx_filled--; | ||
| 1553 | } | ||
| 1554 | } | 1552 | } |
| 1555 | 1553 | ||
| 1556 | if (rcvd_pkts) { | 1554 | if (rcvd_pkts) { |
| @@ -1563,7 +1561,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, | |||
| 1563 | } | 1561 | } |
| 1564 | 1562 | ||
| 1565 | /* Update rxq management counters */ | 1563 | /* Update rxq management counters */ |
| 1566 | mvneta_rxq_desc_num_update(pp, rxq, rx_done, rx_filled); | 1564 | mvneta_rxq_desc_num_update(pp, rxq, rx_done, rx_done); |
| 1567 | 1565 | ||
| 1568 | return rx_done; | 1566 | return rx_done; |
| 1569 | } | 1567 | } |
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c index fd9745714d90..78849dd4ef8e 100644 --- a/drivers/net/ethernet/renesas/ravb_main.c +++ b/drivers/net/ethernet/renesas/ravb_main.c | |||
| @@ -228,9 +228,7 @@ static void ravb_ring_format(struct net_device *ndev, int q) | |||
| 228 | struct ravb_desc *desc = NULL; | 228 | struct ravb_desc *desc = NULL; |
| 229 | int rx_ring_size = sizeof(*rx_desc) * priv->num_rx_ring[q]; | 229 | int rx_ring_size = sizeof(*rx_desc) * priv->num_rx_ring[q]; |
| 230 | int tx_ring_size = sizeof(*tx_desc) * priv->num_tx_ring[q]; | 230 | int tx_ring_size = sizeof(*tx_desc) * priv->num_tx_ring[q]; |
| 231 | struct sk_buff *skb; | ||
| 232 | dma_addr_t dma_addr; | 231 | dma_addr_t dma_addr; |
| 233 | void *buffer; | ||
| 234 | int i; | 232 | int i; |
| 235 | 233 | ||
| 236 | priv->cur_rx[q] = 0; | 234 | priv->cur_rx[q] = 0; |
| @@ -241,41 +239,28 @@ static void ravb_ring_format(struct net_device *ndev, int q) | |||
| 241 | memset(priv->rx_ring[q], 0, rx_ring_size); | 239 | memset(priv->rx_ring[q], 0, rx_ring_size); |
| 242 | /* Build RX ring buffer */ | 240 | /* Build RX ring buffer */ |
| 243 | for (i = 0; i < priv->num_rx_ring[q]; i++) { | 241 | for (i = 0; i < priv->num_rx_ring[q]; i++) { |
| 244 | priv->rx_skb[q][i] = NULL; | ||
| 245 | skb = netdev_alloc_skb(ndev, PKT_BUF_SZ + RAVB_ALIGN - 1); | ||
| 246 | if (!skb) | ||
| 247 | break; | ||
| 248 | ravb_set_buffer_align(skb); | ||
| 249 | /* RX descriptor */ | 242 | /* RX descriptor */ |
| 250 | rx_desc = &priv->rx_ring[q][i]; | 243 | rx_desc = &priv->rx_ring[q][i]; |
| 251 | /* The size of the buffer should be on 16-byte boundary. */ | 244 | /* The size of the buffer should be on 16-byte boundary. */ |
| 252 | rx_desc->ds_cc = cpu_to_le16(ALIGN(PKT_BUF_SZ, 16)); | 245 | rx_desc->ds_cc = cpu_to_le16(ALIGN(PKT_BUF_SZ, 16)); |
| 253 | dma_addr = dma_map_single(&ndev->dev, skb->data, | 246 | dma_addr = dma_map_single(&ndev->dev, priv->rx_skb[q][i]->data, |
| 254 | ALIGN(PKT_BUF_SZ, 16), | 247 | ALIGN(PKT_BUF_SZ, 16), |
| 255 | DMA_FROM_DEVICE); | 248 | DMA_FROM_DEVICE); |
| 256 | if (dma_mapping_error(&ndev->dev, dma_addr)) { | 249 | /* We just set the data size to 0 for a failed mapping which |
| 257 | dev_kfree_skb(skb); | 250 | * should prevent DMA from happening... |
| 258 | break; | 251 | */ |
| 259 | } | 252 | if (dma_mapping_error(&ndev->dev, dma_addr)) |
| 260 | priv->rx_skb[q][i] = skb; | 253 | rx_desc->ds_cc = cpu_to_le16(0); |
| 261 | rx_desc->dptr = cpu_to_le32(dma_addr); | 254 | rx_desc->dptr = cpu_to_le32(dma_addr); |
| 262 | rx_desc->die_dt = DT_FEMPTY; | 255 | rx_desc->die_dt = DT_FEMPTY; |
| 263 | } | 256 | } |
| 264 | rx_desc = &priv->rx_ring[q][i]; | 257 | rx_desc = &priv->rx_ring[q][i]; |
| 265 | rx_desc->dptr = cpu_to_le32((u32)priv->rx_desc_dma[q]); | 258 | rx_desc->dptr = cpu_to_le32((u32)priv->rx_desc_dma[q]); |
| 266 | rx_desc->die_dt = DT_LINKFIX; /* type */ | 259 | rx_desc->die_dt = DT_LINKFIX; /* type */ |
| 267 | priv->dirty_rx[q] = (u32)(i - priv->num_rx_ring[q]); | ||
| 268 | 260 | ||
| 269 | memset(priv->tx_ring[q], 0, tx_ring_size); | 261 | memset(priv->tx_ring[q], 0, tx_ring_size); |
| 270 | /* Build TX ring buffer */ | 262 | /* Build TX ring buffer */ |
| 271 | for (i = 0; i < priv->num_tx_ring[q]; i++) { | 263 | for (i = 0; i < priv->num_tx_ring[q]; i++) { |
| 272 | priv->tx_skb[q][i] = NULL; | ||
| 273 | priv->tx_buffers[q][i] = NULL; | ||
| 274 | buffer = kmalloc(PKT_BUF_SZ + RAVB_ALIGN - 1, GFP_KERNEL); | ||
| 275 | if (!buffer) | ||
| 276 | break; | ||
| 277 | /* Aligned TX buffer */ | ||
| 278 | priv->tx_buffers[q][i] = buffer; | ||
| 279 | tx_desc = &priv->tx_ring[q][i]; | 264 | tx_desc = &priv->tx_ring[q][i]; |
| 280 | tx_desc->die_dt = DT_EEMPTY; | 265 | tx_desc->die_dt = DT_EEMPTY; |
| 281 | } | 266 | } |
| @@ -298,7 +283,10 @@ static void ravb_ring_format(struct net_device *ndev, int q) | |||
| 298 | static int ravb_ring_init(struct net_device *ndev, int q) | 283 | static int ravb_ring_init(struct net_device *ndev, int q) |
| 299 | { | 284 | { |
| 300 | struct ravb_private *priv = netdev_priv(ndev); | 285 | struct ravb_private *priv = netdev_priv(ndev); |
| 286 | struct sk_buff *skb; | ||
| 301 | int ring_size; | 287 | int ring_size; |
| 288 | void *buffer; | ||
| 289 | int i; | ||
| 302 | 290 | ||
| 303 | /* Allocate RX and TX skb rings */ | 291 | /* Allocate RX and TX skb rings */ |
| 304 | priv->rx_skb[q] = kcalloc(priv->num_rx_ring[q], | 292 | priv->rx_skb[q] = kcalloc(priv->num_rx_ring[q], |
| @@ -308,12 +296,28 @@ static int ravb_ring_init(struct net_device *ndev, int q) | |||
| 308 | if (!priv->rx_skb[q] || !priv->tx_skb[q]) | 296 | if (!priv->rx_skb[q] || !priv->tx_skb[q]) |
| 309 | goto error; | 297 | goto error; |
| 310 | 298 | ||
| 299 | for (i = 0; i < priv->num_rx_ring[q]; i++) { | ||
| 300 | skb = netdev_alloc_skb(ndev, PKT_BUF_SZ + RAVB_ALIGN - 1); | ||
| 301 | if (!skb) | ||
| 302 | goto error; | ||
| 303 | ravb_set_buffer_align(skb); | ||
| 304 | priv->rx_skb[q][i] = skb; | ||
| 305 | } | ||
| 306 | |||
| 311 | /* Allocate rings for the aligned buffers */ | 307 | /* Allocate rings for the aligned buffers */ |
| 312 | priv->tx_buffers[q] = kcalloc(priv->num_tx_ring[q], | 308 | priv->tx_buffers[q] = kcalloc(priv->num_tx_ring[q], |
| 313 | sizeof(*priv->tx_buffers[q]), GFP_KERNEL); | 309 | sizeof(*priv->tx_buffers[q]), GFP_KERNEL); |
| 314 | if (!priv->tx_buffers[q]) | 310 | if (!priv->tx_buffers[q]) |
| 315 | goto error; | 311 | goto error; |
| 316 | 312 | ||
| 313 | for (i = 0; i < priv->num_tx_ring[q]; i++) { | ||
| 314 | buffer = kmalloc(PKT_BUF_SZ + RAVB_ALIGN - 1, GFP_KERNEL); | ||
| 315 | if (!buffer) | ||
| 316 | goto error; | ||
| 317 | /* Aligned TX buffer */ | ||
| 318 | priv->tx_buffers[q][i] = buffer; | ||
| 319 | } | ||
| 320 | |||
| 317 | /* Allocate all RX descriptors. */ | 321 | /* Allocate all RX descriptors. */ |
| 318 | ring_size = sizeof(struct ravb_ex_rx_desc) * (priv->num_rx_ring[q] + 1); | 322 | ring_size = sizeof(struct ravb_ex_rx_desc) * (priv->num_rx_ring[q] + 1); |
| 319 | priv->rx_ring[q] = dma_alloc_coherent(NULL, ring_size, | 323 | priv->rx_ring[q] = dma_alloc_coherent(NULL, ring_size, |
| @@ -524,6 +528,10 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q) | |||
| 524 | if (--boguscnt < 0) | 528 | if (--boguscnt < 0) |
| 525 | break; | 529 | break; |
| 526 | 530 | ||
| 531 | /* We use 0-byte descriptors to mark the DMA mapping errors */ | ||
| 532 | if (!pkt_len) | ||
| 533 | continue; | ||
| 534 | |||
| 527 | if (desc_status & MSC_MC) | 535 | if (desc_status & MSC_MC) |
| 528 | stats->multicast++; | 536 | stats->multicast++; |
| 529 | 537 | ||
| @@ -543,10 +551,9 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q) | |||
| 543 | 551 | ||
| 544 | skb = priv->rx_skb[q][entry]; | 552 | skb = priv->rx_skb[q][entry]; |
| 545 | priv->rx_skb[q][entry] = NULL; | 553 | priv->rx_skb[q][entry] = NULL; |
| 546 | dma_sync_single_for_cpu(&ndev->dev, | 554 | dma_unmap_single(&ndev->dev, le32_to_cpu(desc->dptr), |
| 547 | le32_to_cpu(desc->dptr), | 555 | ALIGN(PKT_BUF_SZ, 16), |
| 548 | ALIGN(PKT_BUF_SZ, 16), | 556 | DMA_FROM_DEVICE); |
| 549 | DMA_FROM_DEVICE); | ||
| 550 | get_ts &= (q == RAVB_NC) ? | 557 | get_ts &= (q == RAVB_NC) ? |
| 551 | RAVB_RXTSTAMP_TYPE_V2_L2_EVENT : | 558 | RAVB_RXTSTAMP_TYPE_V2_L2_EVENT : |
| 552 | ~RAVB_RXTSTAMP_TYPE_V2_L2_EVENT; | 559 | ~RAVB_RXTSTAMP_TYPE_V2_L2_EVENT; |
| @@ -584,17 +591,15 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q) | |||
| 584 | if (!skb) | 591 | if (!skb) |
| 585 | break; /* Better luck next round. */ | 592 | break; /* Better luck next round. */ |
| 586 | ravb_set_buffer_align(skb); | 593 | ravb_set_buffer_align(skb); |
| 587 | dma_unmap_single(&ndev->dev, le32_to_cpu(desc->dptr), | ||
| 588 | ALIGN(PKT_BUF_SZ, 16), | ||
| 589 | DMA_FROM_DEVICE); | ||
| 590 | dma_addr = dma_map_single(&ndev->dev, skb->data, | 594 | dma_addr = dma_map_single(&ndev->dev, skb->data, |
| 591 | le16_to_cpu(desc->ds_cc), | 595 | le16_to_cpu(desc->ds_cc), |
| 592 | DMA_FROM_DEVICE); | 596 | DMA_FROM_DEVICE); |
| 593 | skb_checksum_none_assert(skb); | 597 | skb_checksum_none_assert(skb); |
| 594 | if (dma_mapping_error(&ndev->dev, dma_addr)) { | 598 | /* We just set the data size to 0 for a failed mapping |
| 595 | dev_kfree_skb_any(skb); | 599 | * which should prevent DMA from happening... |
| 596 | break; | 600 | */ |
| 597 | } | 601 | if (dma_mapping_error(&ndev->dev, dma_addr)) |
| 602 | desc->ds_cc = cpu_to_le16(0); | ||
| 598 | desc->dptr = cpu_to_le32(dma_addr); | 603 | desc->dptr = cpu_to_le32(dma_addr); |
| 599 | priv->rx_skb[q][entry] = skb; | 604 | priv->rx_skb[q][entry] = skb; |
| 600 | } | 605 | } |
| @@ -1279,7 +1284,6 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 1279 | u32 dma_addr; | 1284 | u32 dma_addr; |
| 1280 | void *buffer; | 1285 | void *buffer; |
| 1281 | u32 entry; | 1286 | u32 entry; |
| 1282 | u32 tccr; | ||
| 1283 | 1287 | ||
| 1284 | spin_lock_irqsave(&priv->lock, flags); | 1288 | spin_lock_irqsave(&priv->lock, flags); |
| 1285 | if (priv->cur_tx[q] - priv->dirty_tx[q] >= priv->num_tx_ring[q]) { | 1289 | if (priv->cur_tx[q] - priv->dirty_tx[q] >= priv->num_tx_ring[q]) { |
| @@ -1328,9 +1332,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 1328 | dma_wmb(); | 1332 | dma_wmb(); |
| 1329 | desc->die_dt = DT_FSINGLE; | 1333 | desc->die_dt = DT_FSINGLE; |
| 1330 | 1334 | ||
| 1331 | tccr = ravb_read(ndev, TCCR); | 1335 | ravb_write(ndev, ravb_read(ndev, TCCR) | (TCCR_TSRQ0 << q), TCCR); |
| 1332 | if (!(tccr & (TCCR_TSRQ0 << q))) | ||
| 1333 | ravb_write(ndev, tccr | (TCCR_TSRQ0 << q), TCCR); | ||
| 1334 | 1336 | ||
| 1335 | priv->cur_tx[q]++; | 1337 | priv->cur_tx[q]++; |
| 1336 | if (priv->cur_tx[q] - priv->dirty_tx[q] >= priv->num_tx_ring[q] && | 1338 | if (priv->cur_tx[q] - priv->dirty_tx[q] >= priv->num_tx_ring[q] && |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 50f7a7a26821..864b476f7fd5 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -2843,7 +2843,7 @@ int stmmac_dvr_probe(struct device *device, | |||
| 2843 | if (res->mac) | 2843 | if (res->mac) |
| 2844 | memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN); | 2844 | memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN); |
| 2845 | 2845 | ||
| 2846 | dev_set_drvdata(device, priv); | 2846 | dev_set_drvdata(device, priv->dev); |
| 2847 | 2847 | ||
| 2848 | /* Verify driver arguments */ | 2848 | /* Verify driver arguments */ |
| 2849 | stmmac_verify_args(); | 2849 | stmmac_verify_args(); |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index f335bf119ab5..d155bf2573cd 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -793,9 +793,7 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id) | |||
| 793 | static int cpsw_poll(struct napi_struct *napi, int budget) | 793 | static int cpsw_poll(struct napi_struct *napi, int budget) |
| 794 | { | 794 | { |
| 795 | struct cpsw_priv *priv = napi_to_priv(napi); | 795 | struct cpsw_priv *priv = napi_to_priv(napi); |
| 796 | int num_tx, num_rx; | 796 | int num_rx; |
| 797 | |||
| 798 | num_tx = cpdma_chan_process(priv->txch, 128); | ||
| 799 | 797 | ||
| 800 | num_rx = cpdma_chan_process(priv->rxch, budget); | 798 | num_rx = cpdma_chan_process(priv->rxch, budget); |
| 801 | if (num_rx < budget) { | 799 | if (num_rx < budget) { |
| @@ -810,9 +808,8 @@ static int cpsw_poll(struct napi_struct *napi, int budget) | |||
| 810 | } | 808 | } |
| 811 | } | 809 | } |
| 812 | 810 | ||
| 813 | if (num_rx || num_tx) | 811 | if (num_rx) |
| 814 | cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n", | 812 | cpsw_dbg(priv, intr, "poll %d rx pkts\n", num_rx); |
| 815 | num_rx, num_tx); | ||
| 816 | 813 | ||
| 817 | return num_rx; | 814 | return num_rx; |
| 818 | } | 815 | } |
diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c index 5ec4ed3f6c8d..ec8ed30196f3 100644 --- a/drivers/net/ethernet/ti/netcp_core.c +++ b/drivers/net/ethernet/ti/netcp_core.c | |||
| @@ -1617,11 +1617,11 @@ static int netcp_ndo_open(struct net_device *ndev) | |||
| 1617 | } | 1617 | } |
| 1618 | mutex_unlock(&netcp_modules_lock); | 1618 | mutex_unlock(&netcp_modules_lock); |
| 1619 | 1619 | ||
| 1620 | netcp_rxpool_refill(netcp); | ||
| 1621 | napi_enable(&netcp->rx_napi); | 1620 | napi_enable(&netcp->rx_napi); |
| 1622 | napi_enable(&netcp->tx_napi); | 1621 | napi_enable(&netcp->tx_napi); |
| 1623 | knav_queue_enable_notify(netcp->tx_compl_q); | 1622 | knav_queue_enable_notify(netcp->tx_compl_q); |
| 1624 | knav_queue_enable_notify(netcp->rx_queue); | 1623 | knav_queue_enable_notify(netcp->rx_queue); |
| 1624 | netcp_rxpool_refill(netcp); | ||
| 1625 | netif_tx_wake_all_queues(ndev); | 1625 | netif_tx_wake_all_queues(ndev); |
| 1626 | dev_dbg(netcp->ndev_dev, "netcp device %s opened\n", ndev->name); | 1626 | dev_dbg(netcp->ndev_dev, "netcp device %s opened\n", ndev->name); |
| 1627 | return 0; | 1627 | return 0; |
diff --git a/drivers/net/ipvlan/ipvlan.h b/drivers/net/ipvlan/ipvlan.h index 953a97492fab..9542b7bac61a 100644 --- a/drivers/net/ipvlan/ipvlan.h +++ b/drivers/net/ipvlan/ipvlan.h | |||
| @@ -67,8 +67,6 @@ struct ipvl_dev { | |||
| 67 | struct ipvl_port *port; | 67 | struct ipvl_port *port; |
| 68 | struct net_device *phy_dev; | 68 | struct net_device *phy_dev; |
| 69 | struct list_head addrs; | 69 | struct list_head addrs; |
| 70 | int ipv4cnt; | ||
| 71 | int ipv6cnt; | ||
| 72 | struct ipvl_pcpu_stats __percpu *pcpu_stats; | 70 | struct ipvl_pcpu_stats __percpu *pcpu_stats; |
| 73 | DECLARE_BITMAP(mac_filters, IPVLAN_MAC_FILTER_SIZE); | 71 | DECLARE_BITMAP(mac_filters, IPVLAN_MAC_FILTER_SIZE); |
| 74 | netdev_features_t sfeatures; | 72 | netdev_features_t sfeatures; |
| @@ -106,6 +104,11 @@ static inline struct ipvl_port *ipvlan_port_get_rcu(const struct net_device *d) | |||
| 106 | return rcu_dereference(d->rx_handler_data); | 104 | return rcu_dereference(d->rx_handler_data); |
| 107 | } | 105 | } |
| 108 | 106 | ||
| 107 | static inline struct ipvl_port *ipvlan_port_get_rcu_bh(const struct net_device *d) | ||
| 108 | { | ||
| 109 | return rcu_dereference_bh(d->rx_handler_data); | ||
| 110 | } | ||
| 111 | |||
| 109 | static inline struct ipvl_port *ipvlan_port_get_rtnl(const struct net_device *d) | 112 | static inline struct ipvl_port *ipvlan_port_get_rtnl(const struct net_device *d) |
| 110 | { | 113 | { |
| 111 | return rtnl_dereference(d->rx_handler_data); | 114 | return rtnl_dereference(d->rx_handler_data); |
| @@ -124,5 +127,5 @@ struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, | |||
| 124 | bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6); | 127 | bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6); |
| 125 | struct ipvl_addr *ipvlan_ht_addr_lookup(const struct ipvl_port *port, | 128 | struct ipvl_addr *ipvlan_ht_addr_lookup(const struct ipvl_port *port, |
| 126 | const void *iaddr, bool is_v6); | 129 | const void *iaddr, bool is_v6); |
| 127 | void ipvlan_ht_addr_del(struct ipvl_addr *addr, bool sync); | 130 | void ipvlan_ht_addr_del(struct ipvl_addr *addr); |
| 128 | #endif /* __IPVLAN_H */ | 131 | #endif /* __IPVLAN_H */ |
diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c index 8afbedad620d..207f62e8de9a 100644 --- a/drivers/net/ipvlan/ipvlan_core.c +++ b/drivers/net/ipvlan/ipvlan_core.c | |||
| @@ -85,11 +85,9 @@ void ipvlan_ht_addr_add(struct ipvl_dev *ipvlan, struct ipvl_addr *addr) | |||
| 85 | hlist_add_head_rcu(&addr->hlnode, &port->hlhead[hash]); | 85 | hlist_add_head_rcu(&addr->hlnode, &port->hlhead[hash]); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | void ipvlan_ht_addr_del(struct ipvl_addr *addr, bool sync) | 88 | void ipvlan_ht_addr_del(struct ipvl_addr *addr) |
| 89 | { | 89 | { |
| 90 | hlist_del_init_rcu(&addr->hlnode); | 90 | hlist_del_init_rcu(&addr->hlnode); |
| 91 | if (sync) | ||
| 92 | synchronize_rcu(); | ||
| 93 | } | 91 | } |
| 94 | 92 | ||
| 95 | struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, | 93 | struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, |
| @@ -531,7 +529,7 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev) | |||
| 531 | int ipvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) | 529 | int ipvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) |
| 532 | { | 530 | { |
| 533 | struct ipvl_dev *ipvlan = netdev_priv(dev); | 531 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 534 | struct ipvl_port *port = ipvlan_port_get_rcu(ipvlan->phy_dev); | 532 | struct ipvl_port *port = ipvlan_port_get_rcu_bh(ipvlan->phy_dev); |
| 535 | 533 | ||
| 536 | if (!port) | 534 | if (!port) |
| 537 | goto out; | 535 | goto out; |
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c index 1acc283160d9..20b58bdecf75 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c | |||
| @@ -153,10 +153,9 @@ static int ipvlan_open(struct net_device *dev) | |||
| 153 | else | 153 | else |
| 154 | dev->flags &= ~IFF_NOARP; | 154 | dev->flags &= ~IFF_NOARP; |
| 155 | 155 | ||
| 156 | if (ipvlan->ipv6cnt > 0 || ipvlan->ipv4cnt > 0) { | 156 | list_for_each_entry(addr, &ipvlan->addrs, anode) |
| 157 | list_for_each_entry(addr, &ipvlan->addrs, anode) | 157 | ipvlan_ht_addr_add(ipvlan, addr); |
| 158 | ipvlan_ht_addr_add(ipvlan, addr); | 158 | |
| 159 | } | ||
| 160 | return dev_uc_add(phy_dev, phy_dev->dev_addr); | 159 | return dev_uc_add(phy_dev, phy_dev->dev_addr); |
| 161 | } | 160 | } |
| 162 | 161 | ||
| @@ -171,10 +170,9 @@ static int ipvlan_stop(struct net_device *dev) | |||
| 171 | 170 | ||
| 172 | dev_uc_del(phy_dev, phy_dev->dev_addr); | 171 | dev_uc_del(phy_dev, phy_dev->dev_addr); |
| 173 | 172 | ||
| 174 | if (ipvlan->ipv6cnt > 0 || ipvlan->ipv4cnt > 0) { | 173 | list_for_each_entry(addr, &ipvlan->addrs, anode) |
| 175 | list_for_each_entry(addr, &ipvlan->addrs, anode) | 174 | ipvlan_ht_addr_del(addr); |
| 176 | ipvlan_ht_addr_del(addr, !dev->dismantle); | 175 | |
| 177 | } | ||
| 178 | return 0; | 176 | return 0; |
| 179 | } | 177 | } |
| 180 | 178 | ||
| @@ -471,8 +469,6 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev, | |||
| 471 | ipvlan->port = port; | 469 | ipvlan->port = port; |
| 472 | ipvlan->sfeatures = IPVLAN_FEATURES; | 470 | ipvlan->sfeatures = IPVLAN_FEATURES; |
| 473 | INIT_LIST_HEAD(&ipvlan->addrs); | 471 | INIT_LIST_HEAD(&ipvlan->addrs); |
| 474 | ipvlan->ipv4cnt = 0; | ||
| 475 | ipvlan->ipv6cnt = 0; | ||
| 476 | 472 | ||
| 477 | /* TODO Probably put random address here to be presented to the | 473 | /* TODO Probably put random address here to be presented to the |
| 478 | * world but keep using the physical-dev address for the outgoing | 474 | * world but keep using the physical-dev address for the outgoing |
| @@ -508,12 +504,12 @@ static void ipvlan_link_delete(struct net_device *dev, struct list_head *head) | |||
| 508 | struct ipvl_dev *ipvlan = netdev_priv(dev); | 504 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 509 | struct ipvl_addr *addr, *next; | 505 | struct ipvl_addr *addr, *next; |
| 510 | 506 | ||
| 511 | if (ipvlan->ipv6cnt > 0 || ipvlan->ipv4cnt > 0) { | 507 | list_for_each_entry_safe(addr, next, &ipvlan->addrs, anode) { |
| 512 | list_for_each_entry_safe(addr, next, &ipvlan->addrs, anode) { | 508 | ipvlan_ht_addr_del(addr); |
| 513 | ipvlan_ht_addr_del(addr, !dev->dismantle); | 509 | list_del(&addr->anode); |
| 514 | list_del(&addr->anode); | 510 | kfree_rcu(addr, rcu); |
| 515 | } | ||
| 516 | } | 511 | } |
| 512 | |||
| 517 | list_del_rcu(&ipvlan->pnode); | 513 | list_del_rcu(&ipvlan->pnode); |
| 518 | unregister_netdevice_queue(dev, head); | 514 | unregister_netdevice_queue(dev, head); |
| 519 | netdev_upper_dev_unlink(ipvlan->phy_dev, dev); | 515 | netdev_upper_dev_unlink(ipvlan->phy_dev, dev); |
| @@ -627,7 +623,7 @@ static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) | |||
| 627 | memcpy(&addr->ip6addr, ip6_addr, sizeof(struct in6_addr)); | 623 | memcpy(&addr->ip6addr, ip6_addr, sizeof(struct in6_addr)); |
| 628 | addr->atype = IPVL_IPV6; | 624 | addr->atype = IPVL_IPV6; |
| 629 | list_add_tail(&addr->anode, &ipvlan->addrs); | 625 | list_add_tail(&addr->anode, &ipvlan->addrs); |
| 630 | ipvlan->ipv6cnt++; | 626 | |
| 631 | /* If the interface is not up, the address will be added to the hash | 627 | /* If the interface is not up, the address will be added to the hash |
| 632 | * list by ipvlan_open. | 628 | * list by ipvlan_open. |
| 633 | */ | 629 | */ |
| @@ -645,10 +641,8 @@ static void ipvlan_del_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) | |||
| 645 | if (!addr) | 641 | if (!addr) |
| 646 | return; | 642 | return; |
| 647 | 643 | ||
| 648 | ipvlan_ht_addr_del(addr, true); | 644 | ipvlan_ht_addr_del(addr); |
| 649 | list_del(&addr->anode); | 645 | list_del(&addr->anode); |
| 650 | ipvlan->ipv6cnt--; | ||
| 651 | WARN_ON(ipvlan->ipv6cnt < 0); | ||
| 652 | kfree_rcu(addr, rcu); | 646 | kfree_rcu(addr, rcu); |
| 653 | 647 | ||
| 654 | return; | 648 | return; |
| @@ -661,6 +655,10 @@ static int ipvlan_addr6_event(struct notifier_block *unused, | |||
| 661 | struct net_device *dev = (struct net_device *)if6->idev->dev; | 655 | struct net_device *dev = (struct net_device *)if6->idev->dev; |
| 662 | struct ipvl_dev *ipvlan = netdev_priv(dev); | 656 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 663 | 657 | ||
| 658 | /* FIXME IPv6 autoconf calls us from bh without RTNL */ | ||
| 659 | if (in_softirq()) | ||
| 660 | return NOTIFY_DONE; | ||
| 661 | |||
| 664 | if (!netif_is_ipvlan(dev)) | 662 | if (!netif_is_ipvlan(dev)) |
| 665 | return NOTIFY_DONE; | 663 | return NOTIFY_DONE; |
| 666 | 664 | ||
| @@ -699,7 +697,7 @@ static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) | |||
| 699 | memcpy(&addr->ip4addr, ip4_addr, sizeof(struct in_addr)); | 697 | memcpy(&addr->ip4addr, ip4_addr, sizeof(struct in_addr)); |
| 700 | addr->atype = IPVL_IPV4; | 698 | addr->atype = IPVL_IPV4; |
| 701 | list_add_tail(&addr->anode, &ipvlan->addrs); | 699 | list_add_tail(&addr->anode, &ipvlan->addrs); |
| 702 | ipvlan->ipv4cnt++; | 700 | |
| 703 | /* If the interface is not up, the address will be added to the hash | 701 | /* If the interface is not up, the address will be added to the hash |
| 704 | * list by ipvlan_open. | 702 | * list by ipvlan_open. |
| 705 | */ | 703 | */ |
| @@ -717,10 +715,8 @@ static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) | |||
| 717 | if (!addr) | 715 | if (!addr) |
| 718 | return; | 716 | return; |
| 719 | 717 | ||
| 720 | ipvlan_ht_addr_del(addr, true); | 718 | ipvlan_ht_addr_del(addr); |
| 721 | list_del(&addr->anode); | 719 | list_del(&addr->anode); |
| 722 | ipvlan->ipv4cnt--; | ||
| 723 | WARN_ON(ipvlan->ipv4cnt < 0); | ||
| 724 | kfree_rcu(addr, rcu); | 720 | kfree_rcu(addr, rcu); |
| 725 | 721 | ||
| 726 | return; | 722 | return; |
diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c index c7a12e2e07b7..8a3bf5469892 100644 --- a/drivers/net/phy/dp83867.c +++ b/drivers/net/phy/dp83867.c | |||
| @@ -164,7 +164,7 @@ static int dp83867_config_init(struct phy_device *phydev) | |||
| 164 | return ret; | 164 | return ret; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | if ((phydev->interface >= PHY_INTERFACE_MODE_RGMII_ID) || | 167 | if ((phydev->interface >= PHY_INTERFACE_MODE_RGMII_ID) && |
| 168 | (phydev->interface <= PHY_INTERFACE_MODE_RGMII_RXID)) { | 168 | (phydev->interface <= PHY_INTERFACE_MODE_RGMII_RXID)) { |
| 169 | val = phy_read_mmd_indirect(phydev, DP83867_RGMIICTL, | 169 | val = phy_read_mmd_indirect(phydev, DP83867_RGMIICTL, |
| 170 | DP83867_DEVADDR, phydev->addr); | 170 | DP83867_DEVADDR, phydev->addr); |
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 095ef3fe369a..46a14cbb0215 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
| @@ -421,6 +421,8 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) | |||
| 421 | { | 421 | { |
| 422 | struct phy_device *phydev = to_phy_device(dev); | 422 | struct phy_device *phydev = to_phy_device(dev); |
| 423 | struct phy_driver *phydrv = to_phy_driver(drv); | 423 | struct phy_driver *phydrv = to_phy_driver(drv); |
| 424 | const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); | ||
| 425 | int i; | ||
| 424 | 426 | ||
| 425 | if (of_driver_match_device(dev, drv)) | 427 | if (of_driver_match_device(dev, drv)) |
| 426 | return 1; | 428 | return 1; |
| @@ -428,8 +430,21 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) | |||
| 428 | if (phydrv->match_phy_device) | 430 | if (phydrv->match_phy_device) |
| 429 | return phydrv->match_phy_device(phydev); | 431 | return phydrv->match_phy_device(phydev); |
| 430 | 432 | ||
| 431 | return (phydrv->phy_id & phydrv->phy_id_mask) == | 433 | if (phydev->is_c45) { |
| 432 | (phydev->phy_id & phydrv->phy_id_mask); | 434 | for (i = 1; i < num_ids; i++) { |
| 435 | if (!(phydev->c45_ids.devices_in_package & (1 << i))) | ||
| 436 | continue; | ||
| 437 | |||
| 438 | if ((phydrv->phy_id & phydrv->phy_id_mask) == | ||
| 439 | (phydev->c45_ids.device_ids[i] & | ||
| 440 | phydrv->phy_id_mask)) | ||
| 441 | return 1; | ||
| 442 | } | ||
| 443 | return 0; | ||
| 444 | } else { | ||
| 445 | return (phydrv->phy_id & phydrv->phy_id_mask) == | ||
| 446 | (phydev->phy_id & phydrv->phy_id_mask); | ||
| 447 | } | ||
| 433 | } | 448 | } |
| 434 | 449 | ||
| 435 | #ifdef CONFIG_PM | 450 | #ifdef CONFIG_PM |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index f603f362504b..9d43460ce3c7 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -757,6 +757,7 @@ static const struct usb_device_id products[] = { | |||
| 757 | {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ | 757 | {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ |
| 758 | {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ | 758 | {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ |
| 759 | {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ | 759 | {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ |
| 760 | {QMI_FIXED_INTF(0x1199, 0x9041, 10)}, /* Sierra Wireless MC7305/MC7355 */ | ||
| 760 | {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ | 761 | {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ |
| 761 | {QMI_FIXED_INTF(0x1199, 0x9053, 8)}, /* Sierra Wireless Modem */ | 762 | {QMI_FIXED_INTF(0x1199, 0x9053, 8)}, /* Sierra Wireless Modem */ |
| 762 | {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ | 763 | {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 63c7810e1545..7fbca37a1adf 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -1828,7 +1828,8 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 1828 | else | 1828 | else |
| 1829 | vi->hdr_len = sizeof(struct virtio_net_hdr); | 1829 | vi->hdr_len = sizeof(struct virtio_net_hdr); |
| 1830 | 1830 | ||
| 1831 | if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT)) | 1831 | if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT) || |
| 1832 | virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) | ||
| 1832 | vi->any_header_sg = true; | 1833 | vi->any_header_sg = true; |
| 1833 | 1834 | ||
| 1834 | if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) | 1835 | if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 5e15e8e10ed3..a31a6804dc34 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -279,6 +279,7 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) | |||
| 279 | return; | 279 | return; |
| 280 | case AR9300_DEVID_QCA956X: | 280 | case AR9300_DEVID_QCA956X: |
| 281 | ah->hw_version.macVersion = AR_SREV_VERSION_9561; | 281 | ah->hw_version.macVersion = AR_SREV_VERSION_9561; |
| 282 | return; | ||
| 282 | } | 283 | } |
| 283 | 284 | ||
| 284 | val = REG_READ(ah, AR_SREV) & AR_SREV_ID; | 285 | val = REG_READ(ah, AR_SREV) & AR_SREV_ID; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-fh.h b/drivers/net/wireless/iwlwifi/iwl-fh.h index d56064861a9c..d45dc021cda2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fh.h +++ b/drivers/net/wireless/iwlwifi/iwl-fh.h | |||
| @@ -438,6 +438,12 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(unsigned int chnl) | |||
| 438 | #define RX_QUEUE_MASK 255 | 438 | #define RX_QUEUE_MASK 255 |
| 439 | #define RX_QUEUE_SIZE_LOG 8 | 439 | #define RX_QUEUE_SIZE_LOG 8 |
| 440 | 440 | ||
| 441 | /* | ||
| 442 | * RX related structures and functions | ||
| 443 | */ | ||
| 444 | #define RX_FREE_BUFFERS 64 | ||
| 445 | #define RX_LOW_WATERMARK 8 | ||
| 446 | |||
| 441 | /** | 447 | /** |
| 442 | * struct iwl_rb_status - reserve buffer status | 448 | * struct iwl_rb_status - reserve buffer status |
| 443 | * host memory mapped FH registers | 449 | * host memory mapped FH registers |
diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c index 80fefe7d7b8c..3b8e85e51002 100644 --- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c +++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c | |||
| @@ -540,13 +540,11 @@ static void iwl_set_hw_address_family_8000(struct device *dev, | |||
| 540 | hw_addr = (const u8 *)(mac_override + | 540 | hw_addr = (const u8 *)(mac_override + |
| 541 | MAC_ADDRESS_OVERRIDE_FAMILY_8000); | 541 | MAC_ADDRESS_OVERRIDE_FAMILY_8000); |
| 542 | 542 | ||
| 543 | /* The byte order is little endian 16 bit, meaning 214365 */ | 543 | /* |
| 544 | data->hw_addr[0] = hw_addr[1]; | 544 | * Store the MAC address from MAO section. |
| 545 | data->hw_addr[1] = hw_addr[0]; | 545 | * No byte swapping is required in MAO section |
| 546 | data->hw_addr[2] = hw_addr[3]; | 546 | */ |
| 547 | data->hw_addr[3] = hw_addr[2]; | 547 | memcpy(data->hw_addr, hw_addr, ETH_ALEN); |
| 548 | data->hw_addr[4] = hw_addr[5]; | ||
| 549 | data->hw_addr[5] = hw_addr[4]; | ||
| 550 | 548 | ||
| 551 | /* | 549 | /* |
| 552 | * Force the use of the OTP MAC address in case of reserved MAC | 550 | * Force the use of the OTP MAC address in case of reserved MAC |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h index 5e4cbdb44c60..737774a01c74 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | |||
| @@ -660,7 +660,8 @@ struct iwl_scan_config { | |||
| 660 | * iwl_umac_scan_flags | 660 | * iwl_umac_scan_flags |
| 661 | *@IWL_UMAC_SCAN_FLAG_PREEMPTIVE: scan process triggered by this scan request | 661 | *@IWL_UMAC_SCAN_FLAG_PREEMPTIVE: scan process triggered by this scan request |
| 662 | * can be preempted by other scan requests with higher priority. | 662 | * can be preempted by other scan requests with higher priority. |
| 663 | * The low priority scan is aborted. | 663 | * The low priority scan will be resumed when the higher proirity scan is |
| 664 | * completed. | ||
| 664 | *@IWL_UMAC_SCAN_FLAG_START_NOTIF: notification will be sent to the driver | 665 | *@IWL_UMAC_SCAN_FLAG_START_NOTIF: notification will be sent to the driver |
| 665 | * when scan starts. | 666 | * when scan starts. |
| 666 | */ | 667 | */ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index 5de144968723..5000bfcded61 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
| @@ -1109,6 +1109,9 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, | |||
| 1109 | cmd->uid = cpu_to_le32(uid); | 1109 | cmd->uid = cpu_to_le32(uid); |
| 1110 | cmd->general_flags = cpu_to_le32(iwl_mvm_scan_umac_flags(mvm, params)); | 1110 | cmd->general_flags = cpu_to_le32(iwl_mvm_scan_umac_flags(mvm, params)); |
| 1111 | 1111 | ||
| 1112 | if (type == IWL_MVM_SCAN_SCHED) | ||
| 1113 | cmd->flags = cpu_to_le32(IWL_UMAC_SCAN_FLAG_PREEMPTIVE); | ||
| 1114 | |||
| 1112 | if (iwl_mvm_scan_use_ebs(mvm, vif, n_iterations)) | 1115 | if (iwl_mvm_scan_use_ebs(mvm, vif, n_iterations)) |
| 1113 | cmd->channel_flags = IWL_SCAN_CHANNEL_FLAG_EBS | | 1116 | cmd->channel_flags = IWL_SCAN_CHANNEL_FLAG_EBS | |
| 1114 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | 1117 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | |
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c index d68dc697a4a0..26f076e82149 100644 --- a/drivers/net/wireless/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/iwlwifi/mvm/sta.c | |||
| @@ -1401,6 +1401,7 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm, | |||
| 1401 | bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE); | 1401 | bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE); |
| 1402 | u8 sta_id; | 1402 | u8 sta_id; |
| 1403 | int ret; | 1403 | int ret; |
| 1404 | static const u8 __maybe_unused zero_addr[ETH_ALEN] = {0}; | ||
| 1404 | 1405 | ||
| 1405 | lockdep_assert_held(&mvm->mutex); | 1406 | lockdep_assert_held(&mvm->mutex); |
| 1406 | 1407 | ||
| @@ -1467,7 +1468,7 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm, | |||
| 1467 | end: | 1468 | end: |
| 1468 | IWL_DEBUG_WEP(mvm, "key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n", | 1469 | IWL_DEBUG_WEP(mvm, "key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n", |
| 1469 | keyconf->cipher, keyconf->keylen, keyconf->keyidx, | 1470 | keyconf->cipher, keyconf->keylen, keyconf->keyidx, |
| 1470 | sta->addr, ret); | 1471 | sta ? sta->addr : zero_addr, ret); |
| 1471 | return ret; | 1472 | return ret; |
| 1472 | } | 1473 | } |
| 1473 | 1474 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c index d24b6a83e68c..e472729e5f14 100644 --- a/drivers/net/wireless/iwlwifi/mvm/time-event.c +++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c | |||
| @@ -86,7 +86,7 @@ void iwl_mvm_te_clear_data(struct iwl_mvm *mvm, | |||
| 86 | { | 86 | { |
| 87 | lockdep_assert_held(&mvm->time_event_lock); | 87 | lockdep_assert_held(&mvm->time_event_lock); |
| 88 | 88 | ||
| 89 | if (te_data->id == TE_MAX) | 89 | if (!te_data->vif) |
| 90 | return; | 90 | return; |
| 91 | 91 | ||
| 92 | list_del(&te_data->list); | 92 | list_del(&te_data->list); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 7ba7a118ff5c..89116864d2a0 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | |||
| @@ -252,7 +252,7 @@ void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd, | |||
| 252 | 252 | ||
| 253 | if (info->band == IEEE80211_BAND_2GHZ && | 253 | if (info->band == IEEE80211_BAND_2GHZ && |
| 254 | !iwl_mvm_bt_coex_is_shared_ant_avail(mvm)) | 254 | !iwl_mvm_bt_coex_is_shared_ant_avail(mvm)) |
| 255 | rate_flags = BIT(mvm->cfg->non_shared_ant) << RATE_MCS_ANT_POS; | 255 | rate_flags = mvm->cfg->non_shared_ant << RATE_MCS_ANT_POS; |
| 256 | else | 256 | else |
| 257 | rate_flags = | 257 | rate_flags = |
| 258 | BIT(mvm->mgmt_last_antenna_idx) << RATE_MCS_ANT_POS; | 258 | BIT(mvm->mgmt_last_antenna_idx) << RATE_MCS_ANT_POS; |
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index 2ed1e4d2774d..9f65c1cff1b1 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
| @@ -368,12 +368,14 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
| 368 | /* 3165 Series */ | 368 | /* 3165 Series */ |
| 369 | {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)}, | 369 | {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)}, |
| 370 | {IWL_PCI_DEVICE(0x3165, 0x4012, iwl3165_2ac_cfg)}, | 370 | {IWL_PCI_DEVICE(0x3165, 0x4012, iwl3165_2ac_cfg)}, |
| 371 | {IWL_PCI_DEVICE(0x3166, 0x4212, iwl3165_2ac_cfg)}, | ||
| 371 | {IWL_PCI_DEVICE(0x3165, 0x4410, iwl3165_2ac_cfg)}, | 372 | {IWL_PCI_DEVICE(0x3165, 0x4410, iwl3165_2ac_cfg)}, |
| 372 | {IWL_PCI_DEVICE(0x3165, 0x4510, iwl3165_2ac_cfg)}, | 373 | {IWL_PCI_DEVICE(0x3165, 0x4510, iwl3165_2ac_cfg)}, |
| 373 | {IWL_PCI_DEVICE(0x3165, 0x4110, iwl3165_2ac_cfg)}, | 374 | {IWL_PCI_DEVICE(0x3165, 0x4110, iwl3165_2ac_cfg)}, |
| 374 | {IWL_PCI_DEVICE(0x3166, 0x4310, iwl3165_2ac_cfg)}, | 375 | {IWL_PCI_DEVICE(0x3166, 0x4310, iwl3165_2ac_cfg)}, |
| 375 | {IWL_PCI_DEVICE(0x3166, 0x4210, iwl3165_2ac_cfg)}, | 376 | {IWL_PCI_DEVICE(0x3166, 0x4210, iwl3165_2ac_cfg)}, |
| 376 | {IWL_PCI_DEVICE(0x3165, 0x8010, iwl3165_2ac_cfg)}, | 377 | {IWL_PCI_DEVICE(0x3165, 0x8010, iwl3165_2ac_cfg)}, |
| 378 | {IWL_PCI_DEVICE(0x3165, 0x8110, iwl3165_2ac_cfg)}, | ||
| 377 | 379 | ||
| 378 | /* 7265 Series */ | 380 | /* 7265 Series */ |
| 379 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, | 381 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, |
| @@ -426,9 +428,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
| 426 | {IWL_PCI_DEVICE(0x24F4, 0x1130, iwl8260_2ac_cfg)}, | 428 | {IWL_PCI_DEVICE(0x24F4, 0x1130, iwl8260_2ac_cfg)}, |
| 427 | {IWL_PCI_DEVICE(0x24F4, 0x1030, iwl8260_2ac_cfg)}, | 429 | {IWL_PCI_DEVICE(0x24F4, 0x1030, iwl8260_2ac_cfg)}, |
| 428 | {IWL_PCI_DEVICE(0x24F3, 0xC010, iwl8260_2ac_cfg)}, | 430 | {IWL_PCI_DEVICE(0x24F3, 0xC010, iwl8260_2ac_cfg)}, |
| 431 | {IWL_PCI_DEVICE(0x24F3, 0xC110, iwl8260_2ac_cfg)}, | ||
| 429 | {IWL_PCI_DEVICE(0x24F3, 0xD010, iwl8260_2ac_cfg)}, | 432 | {IWL_PCI_DEVICE(0x24F3, 0xD010, iwl8260_2ac_cfg)}, |
| 430 | {IWL_PCI_DEVICE(0x24F4, 0xC030, iwl8260_2ac_cfg)}, | ||
| 431 | {IWL_PCI_DEVICE(0x24F4, 0xD030, iwl8260_2ac_cfg)}, | ||
| 432 | {IWL_PCI_DEVICE(0x24F3, 0xC050, iwl8260_2ac_cfg)}, | 433 | {IWL_PCI_DEVICE(0x24F3, 0xC050, iwl8260_2ac_cfg)}, |
| 433 | {IWL_PCI_DEVICE(0x24F3, 0xD050, iwl8260_2ac_cfg)}, | 434 | {IWL_PCI_DEVICE(0x24F3, 0xD050, iwl8260_2ac_cfg)}, |
| 434 | {IWL_PCI_DEVICE(0x24F3, 0x8010, iwl8260_2ac_cfg)}, | 435 | {IWL_PCI_DEVICE(0x24F3, 0x8010, iwl8260_2ac_cfg)}, |
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h index 31f72a61cc3f..376b84e54ad7 100644 --- a/drivers/net/wireless/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/iwlwifi/pcie/internal.h | |||
| @@ -44,15 +44,6 @@ | |||
| 44 | #include "iwl-io.h" | 44 | #include "iwl-io.h" |
| 45 | #include "iwl-op-mode.h" | 45 | #include "iwl-op-mode.h" |
| 46 | 46 | ||
| 47 | /* | ||
| 48 | * RX related structures and functions | ||
| 49 | */ | ||
| 50 | #define RX_NUM_QUEUES 1 | ||
| 51 | #define RX_POST_REQ_ALLOC 2 | ||
| 52 | #define RX_CLAIM_REQ_ALLOC 8 | ||
| 53 | #define RX_POOL_SIZE ((RX_CLAIM_REQ_ALLOC - RX_POST_REQ_ALLOC) * RX_NUM_QUEUES) | ||
| 54 | #define RX_LOW_WATERMARK 8 | ||
| 55 | |||
| 56 | struct iwl_host_cmd; | 47 | struct iwl_host_cmd; |
| 57 | 48 | ||
| 58 | /*This file includes the declaration that are internal to the | 49 | /*This file includes the declaration that are internal to the |
| @@ -86,29 +77,29 @@ struct isr_statistics { | |||
| 86 | * struct iwl_rxq - Rx queue | 77 | * struct iwl_rxq - Rx queue |
| 87 | * @bd: driver's pointer to buffer of receive buffer descriptors (rbd) | 78 | * @bd: driver's pointer to buffer of receive buffer descriptors (rbd) |
| 88 | * @bd_dma: bus address of buffer of receive buffer descriptors (rbd) | 79 | * @bd_dma: bus address of buffer of receive buffer descriptors (rbd) |
| 80 | * @pool: | ||
| 81 | * @queue: | ||
| 89 | * @read: Shared index to newest available Rx buffer | 82 | * @read: Shared index to newest available Rx buffer |
| 90 | * @write: Shared index to oldest written Rx packet | 83 | * @write: Shared index to oldest written Rx packet |
| 91 | * @free_count: Number of pre-allocated buffers in rx_free | 84 | * @free_count: Number of pre-allocated buffers in rx_free |
| 92 | * @used_count: Number of RBDs handled to allocator to use for allocation | ||
| 93 | * @write_actual: | 85 | * @write_actual: |
| 94 | * @rx_free: list of RBDs with allocated RB ready for use | 86 | * @rx_free: list of free SKBs for use |
| 95 | * @rx_used: list of RBDs with no RB attached | 87 | * @rx_used: List of Rx buffers with no SKB |
| 96 | * @need_update: flag to indicate we need to update read/write index | 88 | * @need_update: flag to indicate we need to update read/write index |
| 97 | * @rb_stts: driver's pointer to receive buffer status | 89 | * @rb_stts: driver's pointer to receive buffer status |
| 98 | * @rb_stts_dma: bus address of receive buffer status | 90 | * @rb_stts_dma: bus address of receive buffer status |
| 99 | * @lock: | 91 | * @lock: |
| 100 | * @pool: initial pool of iwl_rx_mem_buffer for the queue | ||
| 101 | * @queue: actual rx queue | ||
| 102 | * | 92 | * |
| 103 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers | 93 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers |
| 104 | */ | 94 | */ |
| 105 | struct iwl_rxq { | 95 | struct iwl_rxq { |
| 106 | __le32 *bd; | 96 | __le32 *bd; |
| 107 | dma_addr_t bd_dma; | 97 | dma_addr_t bd_dma; |
| 98 | struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; | ||
| 99 | struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | ||
| 108 | u32 read; | 100 | u32 read; |
| 109 | u32 write; | 101 | u32 write; |
| 110 | u32 free_count; | 102 | u32 free_count; |
| 111 | u32 used_count; | ||
| 112 | u32 write_actual; | 103 | u32 write_actual; |
| 113 | struct list_head rx_free; | 104 | struct list_head rx_free; |
| 114 | struct list_head rx_used; | 105 | struct list_head rx_used; |
| @@ -116,32 +107,6 @@ struct iwl_rxq { | |||
| 116 | struct iwl_rb_status *rb_stts; | 107 | struct iwl_rb_status *rb_stts; |
| 117 | dma_addr_t rb_stts_dma; | 108 | dma_addr_t rb_stts_dma; |
| 118 | spinlock_t lock; | 109 | spinlock_t lock; |
| 119 | struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE]; | ||
| 120 | struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | ||
| 121 | }; | ||
| 122 | |||
| 123 | /** | ||
| 124 | * struct iwl_rb_allocator - Rx allocator | ||
| 125 | * @pool: initial pool of allocator | ||
| 126 | * @req_pending: number of requests the allcator had not processed yet | ||
| 127 | * @req_ready: number of requests honored and ready for claiming | ||
| 128 | * @rbd_allocated: RBDs with pages allocated and ready to be handled to | ||
| 129 | * the queue. This is a list of &struct iwl_rx_mem_buffer | ||
| 130 | * @rbd_empty: RBDs with no page attached for allocator use. This is a list | ||
| 131 | * of &struct iwl_rx_mem_buffer | ||
| 132 | * @lock: protects the rbd_allocated and rbd_empty lists | ||
| 133 | * @alloc_wq: work queue for background calls | ||
| 134 | * @rx_alloc: work struct for background calls | ||
| 135 | */ | ||
| 136 | struct iwl_rb_allocator { | ||
| 137 | struct iwl_rx_mem_buffer pool[RX_POOL_SIZE]; | ||
| 138 | atomic_t req_pending; | ||
| 139 | atomic_t req_ready; | ||
| 140 | struct list_head rbd_allocated; | ||
| 141 | struct list_head rbd_empty; | ||
| 142 | spinlock_t lock; | ||
| 143 | struct workqueue_struct *alloc_wq; | ||
| 144 | struct work_struct rx_alloc; | ||
| 145 | }; | 110 | }; |
| 146 | 111 | ||
| 147 | struct iwl_dma_ptr { | 112 | struct iwl_dma_ptr { |
| @@ -285,7 +250,7 @@ iwl_pcie_get_scratchbuf_dma(struct iwl_txq *txq, int idx) | |||
| 285 | /** | 250 | /** |
| 286 | * struct iwl_trans_pcie - PCIe transport specific data | 251 | * struct iwl_trans_pcie - PCIe transport specific data |
| 287 | * @rxq: all the RX queue data | 252 | * @rxq: all the RX queue data |
| 288 | * @rba: allocator for RX replenishing | 253 | * @rx_replenish: work that will be called when buffers need to be allocated |
| 289 | * @drv - pointer to iwl_drv | 254 | * @drv - pointer to iwl_drv |
| 290 | * @trans: pointer to the generic transport area | 255 | * @trans: pointer to the generic transport area |
| 291 | * @scd_base_addr: scheduler sram base address in SRAM | 256 | * @scd_base_addr: scheduler sram base address in SRAM |
| @@ -308,7 +273,7 @@ iwl_pcie_get_scratchbuf_dma(struct iwl_txq *txq, int idx) | |||
| 308 | */ | 273 | */ |
| 309 | struct iwl_trans_pcie { | 274 | struct iwl_trans_pcie { |
| 310 | struct iwl_rxq rxq; | 275 | struct iwl_rxq rxq; |
| 311 | struct iwl_rb_allocator rba; | 276 | struct work_struct rx_replenish; |
| 312 | struct iwl_trans *trans; | 277 | struct iwl_trans *trans; |
| 313 | struct iwl_drv *drv; | 278 | struct iwl_drv *drv; |
| 314 | 279 | ||
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index a3fbaa0ef5e0..adad8d0fae7f 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | * | 2 | * |
| 3 | * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. | 3 | * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. |
| 4 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH | 4 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
| 5 | * | 5 | * |
| 6 | * Portions of this file are derived from the ipw3945 project, as well | 6 | * Portions of this file are derived from the ipw3945 project, as well |
| 7 | * as portions of the ieee80211 subsystem header files. | 7 | * as portions of the ieee80211 subsystem header files. |
| @@ -74,29 +74,16 @@ | |||
| 74 | * resets the Rx queue buffers with new memory. | 74 | * resets the Rx queue buffers with new memory. |
| 75 | * | 75 | * |
| 76 | * The management in the driver is as follows: | 76 | * The management in the driver is as follows: |
| 77 | * + A list of pre-allocated RBDs is stored in iwl->rxq->rx_free. | 77 | * + A list of pre-allocated SKBs is stored in iwl->rxq->rx_free. When |
| 78 | * When the interrupt handler is called, the request is processed. | 78 | * iwl->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled |
| 79 | * The page is either stolen - transferred to the upper layer | 79 | * to replenish the iwl->rxq->rx_free. |
| 80 | * or reused - added immediately to the iwl->rxq->rx_free list. | 80 | * + In iwl_pcie_rx_replenish (scheduled) if 'processed' != 'read' then the |
| 81 | * + When the page is stolen - the driver updates the matching queue's used | 81 | * iwl->rxq is replenished and the READ INDEX is updated (updating the |
| 82 | * count, detaches the RBD and transfers it to the queue used list. | 82 | * 'processed' and 'read' driver indexes as well) |
| 83 | * When there are two used RBDs - they are transferred to the allocator empty | ||
| 84 | * list. Work is then scheduled for the allocator to start allocating | ||
| 85 | * eight buffers. | ||
| 86 | * When there are another 6 used RBDs - they are transferred to the allocator | ||
| 87 | * empty list and the driver tries to claim the pre-allocated buffers and | ||
| 88 | * add them to iwl->rxq->rx_free. If it fails - it continues to claim them | ||
| 89 | * until ready. | ||
| 90 | * When there are 8+ buffers in the free list - either from allocation or from | ||
| 91 | * 8 reused unstolen pages - restock is called to update the FW and indexes. | ||
| 92 | * + In order to make sure the allocator always has RBDs to use for allocation | ||
| 93 | * the allocator has initial pool in the size of num_queues*(8-2) - the | ||
| 94 | * maximum missing RBDs per allocation request (request posted with 2 | ||
| 95 | * empty RBDs, there is no guarantee when the other 6 RBDs are supplied). | ||
| 96 | * The queues supplies the recycle of the rest of the RBDs. | ||
| 97 | * + A received packet is processed and handed to the kernel network stack, | 83 | * + A received packet is processed and handed to the kernel network stack, |
| 98 | * detached from the iwl->rxq. The driver 'processed' index is updated. | 84 | * detached from the iwl->rxq. The driver 'processed' index is updated. |
| 99 | * + If there are no allocated buffers in iwl->rxq->rx_free, | 85 | * + The Host/Firmware iwl->rxq is replenished at irq thread time from the |
| 86 | * rx_free list. If there are no allocated buffers in iwl->rxq->rx_free, | ||
| 100 | * the READ INDEX is not incremented and iwl->status(RX_STALLED) is set. | 87 | * the READ INDEX is not incremented and iwl->status(RX_STALLED) is set. |
| 101 | * If there were enough free buffers and RX_STALLED is set it is cleared. | 88 | * If there were enough free buffers and RX_STALLED is set it is cleared. |
| 102 | * | 89 | * |
| @@ -105,32 +92,18 @@ | |||
| 105 | * | 92 | * |
| 106 | * iwl_rxq_alloc() Allocates rx_free | 93 | * iwl_rxq_alloc() Allocates rx_free |
| 107 | * iwl_pcie_rx_replenish() Replenishes rx_free list from rx_used, and calls | 94 | * iwl_pcie_rx_replenish() Replenishes rx_free list from rx_used, and calls |
| 108 | * iwl_pcie_rxq_restock. | 95 | * iwl_pcie_rxq_restock |
| 109 | * Used only during initialization. | ||
| 110 | * iwl_pcie_rxq_restock() Moves available buffers from rx_free into Rx | 96 | * iwl_pcie_rxq_restock() Moves available buffers from rx_free into Rx |
| 111 | * queue, updates firmware pointers, and updates | 97 | * queue, updates firmware pointers, and updates |
| 112 | * the WRITE index. | 98 | * the WRITE index. If insufficient rx_free buffers |
| 113 | * iwl_pcie_rx_allocator() Background work for allocating pages. | 99 | * are available, schedules iwl_pcie_rx_replenish |
| 114 | * | 100 | * |
| 115 | * -- enable interrupts -- | 101 | * -- enable interrupts -- |
| 116 | * ISR - iwl_rx() Detach iwl_rx_mem_buffers from pool up to the | 102 | * ISR - iwl_rx() Detach iwl_rx_mem_buffers from pool up to the |
| 117 | * READ INDEX, detaching the SKB from the pool. | 103 | * READ INDEX, detaching the SKB from the pool. |
| 118 | * Moves the packet buffer from queue to rx_used. | 104 | * Moves the packet buffer from queue to rx_used. |
| 119 | * Posts and claims requests to the allocator. | ||
| 120 | * Calls iwl_pcie_rxq_restock to refill any empty | 105 | * Calls iwl_pcie_rxq_restock to refill any empty |
| 121 | * slots. | 106 | * slots. |
| 122 | * | ||
| 123 | * RBD life-cycle: | ||
| 124 | * | ||
| 125 | * Init: | ||
| 126 | * rxq.pool -> rxq.rx_used -> rxq.rx_free -> rxq.queue | ||
| 127 | * | ||
| 128 | * Regular Receive interrupt: | ||
| 129 | * Page Stolen: | ||
| 130 | * rxq.queue -> rxq.rx_used -> allocator.rbd_empty -> | ||
| 131 | * allocator.rbd_allocated -> rxq.rx_free -> rxq.queue | ||
| 132 | * Page not Stolen: | ||
| 133 | * rxq.queue -> rxq.rx_free -> rxq.queue | ||
| 134 | * ... | 107 | * ... |
| 135 | * | 108 | * |
| 136 | */ | 109 | */ |
| @@ -267,6 +240,10 @@ static void iwl_pcie_rxq_restock(struct iwl_trans *trans) | |||
| 267 | rxq->free_count--; | 240 | rxq->free_count--; |
| 268 | } | 241 | } |
| 269 | spin_unlock(&rxq->lock); | 242 | spin_unlock(&rxq->lock); |
| 243 | /* If the pre-allocated buffer pool is dropping low, schedule to | ||
| 244 | * refill it */ | ||
| 245 | if (rxq->free_count <= RX_LOW_WATERMARK) | ||
| 246 | schedule_work(&trans_pcie->rx_replenish); | ||
| 270 | 247 | ||
| 271 | /* If we've added more space for the firmware to place data, tell it. | 248 | /* If we've added more space for the firmware to place data, tell it. |
| 272 | * Increment device's write pointer in multiples of 8. */ | 249 | * Increment device's write pointer in multiples of 8. */ |
| @@ -278,44 +255,6 @@ static void iwl_pcie_rxq_restock(struct iwl_trans *trans) | |||
| 278 | } | 255 | } |
| 279 | 256 | ||
| 280 | /* | 257 | /* |
| 281 | * iwl_pcie_rx_alloc_page - allocates and returns a page. | ||
| 282 | * | ||
| 283 | */ | ||
| 284 | static struct page *iwl_pcie_rx_alloc_page(struct iwl_trans *trans) | ||
| 285 | { | ||
| 286 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
| 287 | struct iwl_rxq *rxq = &trans_pcie->rxq; | ||
| 288 | struct page *page; | ||
| 289 | gfp_t gfp_mask = GFP_KERNEL; | ||
| 290 | |||
| 291 | if (rxq->free_count > RX_LOW_WATERMARK) | ||
| 292 | gfp_mask |= __GFP_NOWARN; | ||
| 293 | |||
| 294 | if (trans_pcie->rx_page_order > 0) | ||
| 295 | gfp_mask |= __GFP_COMP; | ||
| 296 | |||
| 297 | /* Alloc a new receive buffer */ | ||
| 298 | page = alloc_pages(gfp_mask, trans_pcie->rx_page_order); | ||
| 299 | if (!page) { | ||
| 300 | if (net_ratelimit()) | ||
| 301 | IWL_DEBUG_INFO(trans, "alloc_pages failed, order: %d\n", | ||
| 302 | trans_pcie->rx_page_order); | ||
| 303 | /* Issue an error if the hardware has consumed more than half | ||
| 304 | * of its free buffer list and we don't have enough | ||
| 305 | * pre-allocated buffers. | ||
| 306 | ` */ | ||
| 307 | if (rxq->free_count <= RX_LOW_WATERMARK && | ||
| 308 | iwl_rxq_space(rxq) > (RX_QUEUE_SIZE / 2) && | ||
| 309 | net_ratelimit()) | ||
| 310 | IWL_CRIT(trans, | ||
| 311 | "Failed to alloc_pages with GFP_KERNEL. Only %u free buffers remaining.\n", | ||
| 312 | rxq->free_count); | ||
| 313 | return NULL; | ||
| 314 | } | ||
| 315 | return page; | ||
| 316 | } | ||
| 317 | |||
| 318 | /* | ||
| 319 | * iwl_pcie_rxq_alloc_rbs - allocate a page for each used RBD | 258 | * iwl_pcie_rxq_alloc_rbs - allocate a page for each used RBD |
| 320 | * | 259 | * |
| 321 | * A used RBD is an Rx buffer that has been given to the stack. To use it again | 260 | * A used RBD is an Rx buffer that has been given to the stack. To use it again |
| @@ -324,12 +263,13 @@ static struct page *iwl_pcie_rx_alloc_page(struct iwl_trans *trans) | |||
| 324 | * iwl_pcie_rxq_restock. The latter function will update the HW to use the newly | 263 | * iwl_pcie_rxq_restock. The latter function will update the HW to use the newly |
| 325 | * allocated buffers. | 264 | * allocated buffers. |
| 326 | */ | 265 | */ |
| 327 | static void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans) | 266 | static void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans, gfp_t priority) |
| 328 | { | 267 | { |
| 329 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 268 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 330 | struct iwl_rxq *rxq = &trans_pcie->rxq; | 269 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 331 | struct iwl_rx_mem_buffer *rxb; | 270 | struct iwl_rx_mem_buffer *rxb; |
| 332 | struct page *page; | 271 | struct page *page; |
| 272 | gfp_t gfp_mask = priority; | ||
| 333 | 273 | ||
| 334 | while (1) { | 274 | while (1) { |
| 335 | spin_lock(&rxq->lock); | 275 | spin_lock(&rxq->lock); |
| @@ -339,10 +279,32 @@ static void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans) | |||
| 339 | } | 279 | } |
| 340 | spin_unlock(&rxq->lock); | 280 | spin_unlock(&rxq->lock); |
| 341 | 281 | ||
| 282 | if (rxq->free_count > RX_LOW_WATERMARK) | ||
| 283 | gfp_mask |= __GFP_NOWARN; | ||
| 284 | |||
| 285 | if (trans_pcie->rx_page_order > 0) | ||
| 286 | gfp_mask |= __GFP_COMP; | ||
| 287 | |||
| 342 | /* Alloc a new receive buffer */ | 288 | /* Alloc a new receive buffer */ |
| 343 | page = iwl_pcie_rx_alloc_page(trans); | 289 | page = alloc_pages(gfp_mask, trans_pcie->rx_page_order); |
| 344 | if (!page) | 290 | if (!page) { |
| 291 | if (net_ratelimit()) | ||
| 292 | IWL_DEBUG_INFO(trans, "alloc_pages failed, " | ||
| 293 | "order: %d\n", | ||
| 294 | trans_pcie->rx_page_order); | ||
| 295 | |||
| 296 | if ((rxq->free_count <= RX_LOW_WATERMARK) && | ||
| 297 | net_ratelimit()) | ||
| 298 | IWL_CRIT(trans, "Failed to alloc_pages with %s." | ||
| 299 | "Only %u free buffers remaining.\n", | ||
| 300 | priority == GFP_ATOMIC ? | ||
| 301 | "GFP_ATOMIC" : "GFP_KERNEL", | ||
| 302 | rxq->free_count); | ||
| 303 | /* We don't reschedule replenish work here -- we will | ||
| 304 | * call the restock method and if it still needs | ||
| 305 | * more buffers it will schedule replenish */ | ||
| 345 | return; | 306 | return; |
| 307 | } | ||
| 346 | 308 | ||
| 347 | spin_lock(&rxq->lock); | 309 | spin_lock(&rxq->lock); |
| 348 | 310 | ||
| @@ -393,7 +355,7 @@ static void iwl_pcie_rxq_free_rbs(struct iwl_trans *trans) | |||
| 393 | 355 | ||
| 394 | lockdep_assert_held(&rxq->lock); | 356 | lockdep_assert_held(&rxq->lock); |
| 395 | 357 | ||
| 396 | for (i = 0; i < RX_QUEUE_SIZE; i++) { | 358 | for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) { |
| 397 | if (!rxq->pool[i].page) | 359 | if (!rxq->pool[i].page) |
| 398 | continue; | 360 | continue; |
| 399 | dma_unmap_page(trans->dev, rxq->pool[i].page_dma, | 361 | dma_unmap_page(trans->dev, rxq->pool[i].page_dma, |
| @@ -410,144 +372,32 @@ static void iwl_pcie_rxq_free_rbs(struct iwl_trans *trans) | |||
| 410 | * When moving to rx_free an page is allocated for the slot. | 372 | * When moving to rx_free an page is allocated for the slot. |
| 411 | * | 373 | * |
| 412 | * Also restock the Rx queue via iwl_pcie_rxq_restock. | 374 | * Also restock the Rx queue via iwl_pcie_rxq_restock. |
| 413 | * This is called only during initialization | 375 | * This is called as a scheduled work item (except for during initialization) |
| 414 | */ | 376 | */ |
| 415 | static void iwl_pcie_rx_replenish(struct iwl_trans *trans) | 377 | static void iwl_pcie_rx_replenish(struct iwl_trans *trans, gfp_t gfp) |
| 416 | { | 378 | { |
| 417 | iwl_pcie_rxq_alloc_rbs(trans); | 379 | iwl_pcie_rxq_alloc_rbs(trans, gfp); |
| 418 | 380 | ||
| 419 | iwl_pcie_rxq_restock(trans); | 381 | iwl_pcie_rxq_restock(trans); |
| 420 | } | 382 | } |
| 421 | 383 | ||
| 422 | /* | 384 | static void iwl_pcie_rx_replenish_work(struct work_struct *data) |
| 423 | * iwl_pcie_rx_allocator - Allocates pages in the background for RX queues | ||
| 424 | * | ||
| 425 | * Allocates for each received request 8 pages | ||
| 426 | * Called as a scheduled work item. | ||
| 427 | */ | ||
| 428 | static void iwl_pcie_rx_allocator(struct iwl_trans *trans) | ||
| 429 | { | ||
| 430 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
| 431 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 432 | |||
| 433 | while (atomic_read(&rba->req_pending)) { | ||
| 434 | int i; | ||
| 435 | struct list_head local_empty; | ||
| 436 | struct list_head local_allocated; | ||
| 437 | |||
| 438 | INIT_LIST_HEAD(&local_allocated); | ||
| 439 | spin_lock(&rba->lock); | ||
| 440 | /* swap out the entire rba->rbd_empty to a local list */ | ||
| 441 | list_replace_init(&rba->rbd_empty, &local_empty); | ||
| 442 | spin_unlock(&rba->lock); | ||
| 443 | |||
| 444 | for (i = 0; i < RX_CLAIM_REQ_ALLOC;) { | ||
| 445 | struct iwl_rx_mem_buffer *rxb; | ||
| 446 | struct page *page; | ||
| 447 | |||
| 448 | /* List should never be empty - each reused RBD is | ||
| 449 | * returned to the list, and initial pool covers any | ||
| 450 | * possible gap between the time the page is allocated | ||
| 451 | * to the time the RBD is added. | ||
| 452 | */ | ||
| 453 | BUG_ON(list_empty(&local_empty)); | ||
| 454 | /* Get the first rxb from the rbd list */ | ||
| 455 | rxb = list_first_entry(&local_empty, | ||
| 456 | struct iwl_rx_mem_buffer, list); | ||
| 457 | BUG_ON(rxb->page); | ||
| 458 | |||
| 459 | /* Alloc a new receive buffer */ | ||
| 460 | page = iwl_pcie_rx_alloc_page(trans); | ||
| 461 | if (!page) | ||
| 462 | continue; | ||
| 463 | rxb->page = page; | ||
| 464 | |||
| 465 | /* Get physical address of the RB */ | ||
| 466 | rxb->page_dma = dma_map_page(trans->dev, page, 0, | ||
| 467 | PAGE_SIZE << trans_pcie->rx_page_order, | ||
| 468 | DMA_FROM_DEVICE); | ||
| 469 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { | ||
| 470 | rxb->page = NULL; | ||
| 471 | __free_pages(page, trans_pcie->rx_page_order); | ||
| 472 | continue; | ||
| 473 | } | ||
| 474 | /* dma address must be no more than 36 bits */ | ||
| 475 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); | ||
| 476 | /* and also 256 byte aligned! */ | ||
| 477 | BUG_ON(rxb->page_dma & DMA_BIT_MASK(8)); | ||
| 478 | |||
| 479 | /* move the allocated entry to the out list */ | ||
| 480 | list_move(&rxb->list, &local_allocated); | ||
| 481 | i++; | ||
| 482 | } | ||
| 483 | |||
| 484 | spin_lock(&rba->lock); | ||
| 485 | /* add the allocated rbds to the allocator allocated list */ | ||
| 486 | list_splice_tail(&local_allocated, &rba->rbd_allocated); | ||
| 487 | /* add the unused rbds back to the allocator empty list */ | ||
| 488 | list_splice_tail(&local_empty, &rba->rbd_empty); | ||
| 489 | spin_unlock(&rba->lock); | ||
| 490 | |||
| 491 | atomic_dec(&rba->req_pending); | ||
| 492 | atomic_inc(&rba->req_ready); | ||
| 493 | } | ||
| 494 | } | ||
| 495 | |||
| 496 | /* | ||
| 497 | * iwl_pcie_rx_allocator_get - Returns the pre-allocated pages | ||
| 498 | .* | ||
| 499 | .* Called by queue when the queue posted allocation request and | ||
| 500 | * has freed 8 RBDs in order to restock itself. | ||
| 501 | */ | ||
| 502 | static int iwl_pcie_rx_allocator_get(struct iwl_trans *trans, | ||
| 503 | struct iwl_rx_mem_buffer | ||
| 504 | *out[RX_CLAIM_REQ_ALLOC]) | ||
| 505 | { | ||
| 506 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
| 507 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 508 | int i; | ||
| 509 | |||
| 510 | if (atomic_dec_return(&rba->req_ready) < 0) { | ||
| 511 | atomic_inc(&rba->req_ready); | ||
| 512 | IWL_DEBUG_RX(trans, | ||
| 513 | "Allocation request not ready, pending requests = %d\n", | ||
| 514 | atomic_read(&rba->req_pending)); | ||
| 515 | return -ENOMEM; | ||
| 516 | } | ||
| 517 | |||
| 518 | spin_lock(&rba->lock); | ||
| 519 | for (i = 0; i < RX_CLAIM_REQ_ALLOC; i++) { | ||
| 520 | /* Get next free Rx buffer, remove it from free list */ | ||
| 521 | out[i] = list_first_entry(&rba->rbd_allocated, | ||
| 522 | struct iwl_rx_mem_buffer, list); | ||
| 523 | list_del(&out[i]->list); | ||
| 524 | } | ||
| 525 | spin_unlock(&rba->lock); | ||
| 526 | |||
| 527 | return 0; | ||
| 528 | } | ||
| 529 | |||
| 530 | static void iwl_pcie_rx_allocator_work(struct work_struct *data) | ||
| 531 | { | 385 | { |
| 532 | struct iwl_rb_allocator *rba_p = | ||
| 533 | container_of(data, struct iwl_rb_allocator, rx_alloc); | ||
| 534 | struct iwl_trans_pcie *trans_pcie = | 386 | struct iwl_trans_pcie *trans_pcie = |
| 535 | container_of(rba_p, struct iwl_trans_pcie, rba); | 387 | container_of(data, struct iwl_trans_pcie, rx_replenish); |
| 536 | 388 | ||
| 537 | iwl_pcie_rx_allocator(trans_pcie->trans); | 389 | iwl_pcie_rx_replenish(trans_pcie->trans, GFP_KERNEL); |
| 538 | } | 390 | } |
| 539 | 391 | ||
| 540 | static int iwl_pcie_rx_alloc(struct iwl_trans *trans) | 392 | static int iwl_pcie_rx_alloc(struct iwl_trans *trans) |
| 541 | { | 393 | { |
| 542 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 394 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 543 | struct iwl_rxq *rxq = &trans_pcie->rxq; | 395 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 544 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 545 | struct device *dev = trans->dev; | 396 | struct device *dev = trans->dev; |
| 546 | 397 | ||
| 547 | memset(&trans_pcie->rxq, 0, sizeof(trans_pcie->rxq)); | 398 | memset(&trans_pcie->rxq, 0, sizeof(trans_pcie->rxq)); |
| 548 | 399 | ||
| 549 | spin_lock_init(&rxq->lock); | 400 | spin_lock_init(&rxq->lock); |
| 550 | spin_lock_init(&rba->lock); | ||
| 551 | 401 | ||
| 552 | if (WARN_ON(rxq->bd || rxq->rb_stts)) | 402 | if (WARN_ON(rxq->bd || rxq->rb_stts)) |
| 553 | return -EINVAL; | 403 | return -EINVAL; |
| @@ -637,49 +487,15 @@ static void iwl_pcie_rx_init_rxb_lists(struct iwl_rxq *rxq) | |||
| 637 | INIT_LIST_HEAD(&rxq->rx_free); | 487 | INIT_LIST_HEAD(&rxq->rx_free); |
| 638 | INIT_LIST_HEAD(&rxq->rx_used); | 488 | INIT_LIST_HEAD(&rxq->rx_used); |
| 639 | rxq->free_count = 0; | 489 | rxq->free_count = 0; |
| 640 | rxq->used_count = 0; | ||
| 641 | 490 | ||
| 642 | for (i = 0; i < RX_QUEUE_SIZE; i++) | 491 | for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) |
| 643 | list_add(&rxq->pool[i].list, &rxq->rx_used); | 492 | list_add(&rxq->pool[i].list, &rxq->rx_used); |
| 644 | } | 493 | } |
| 645 | 494 | ||
| 646 | static void iwl_pcie_rx_init_rba(struct iwl_rb_allocator *rba) | ||
| 647 | { | ||
| 648 | int i; | ||
| 649 | |||
| 650 | lockdep_assert_held(&rba->lock); | ||
| 651 | |||
| 652 | INIT_LIST_HEAD(&rba->rbd_allocated); | ||
| 653 | INIT_LIST_HEAD(&rba->rbd_empty); | ||
| 654 | |||
| 655 | for (i = 0; i < RX_POOL_SIZE; i++) | ||
| 656 | list_add(&rba->pool[i].list, &rba->rbd_empty); | ||
| 657 | } | ||
| 658 | |||
| 659 | static void iwl_pcie_rx_free_rba(struct iwl_trans *trans) | ||
| 660 | { | ||
| 661 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
| 662 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 663 | int i; | ||
| 664 | |||
| 665 | lockdep_assert_held(&rba->lock); | ||
| 666 | |||
| 667 | for (i = 0; i < RX_POOL_SIZE; i++) { | ||
| 668 | if (!rba->pool[i].page) | ||
| 669 | continue; | ||
| 670 | dma_unmap_page(trans->dev, rba->pool[i].page_dma, | ||
| 671 | PAGE_SIZE << trans_pcie->rx_page_order, | ||
| 672 | DMA_FROM_DEVICE); | ||
| 673 | __free_pages(rba->pool[i].page, trans_pcie->rx_page_order); | ||
| 674 | rba->pool[i].page = NULL; | ||
| 675 | } | ||
| 676 | } | ||
| 677 | |||
| 678 | int iwl_pcie_rx_init(struct iwl_trans *trans) | 495 | int iwl_pcie_rx_init(struct iwl_trans *trans) |
| 679 | { | 496 | { |
| 680 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 497 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 681 | struct iwl_rxq *rxq = &trans_pcie->rxq; | 498 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 682 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 683 | int i, err; | 499 | int i, err; |
| 684 | 500 | ||
| 685 | if (!rxq->bd) { | 501 | if (!rxq->bd) { |
| @@ -687,21 +503,11 @@ int iwl_pcie_rx_init(struct iwl_trans *trans) | |||
| 687 | if (err) | 503 | if (err) |
| 688 | return err; | 504 | return err; |
| 689 | } | 505 | } |
| 690 | if (!rba->alloc_wq) | ||
| 691 | rba->alloc_wq = alloc_workqueue("rb_allocator", | ||
| 692 | WQ_HIGHPRI | WQ_UNBOUND, 1); | ||
| 693 | INIT_WORK(&rba->rx_alloc, iwl_pcie_rx_allocator_work); | ||
| 694 | |||
| 695 | spin_lock(&rba->lock); | ||
| 696 | atomic_set(&rba->req_pending, 0); | ||
| 697 | atomic_set(&rba->req_ready, 0); | ||
| 698 | /* free all first - we might be reconfigured for a different size */ | ||
| 699 | iwl_pcie_rx_free_rba(trans); | ||
| 700 | iwl_pcie_rx_init_rba(rba); | ||
| 701 | spin_unlock(&rba->lock); | ||
| 702 | 506 | ||
| 703 | spin_lock(&rxq->lock); | 507 | spin_lock(&rxq->lock); |
| 704 | 508 | ||
| 509 | INIT_WORK(&trans_pcie->rx_replenish, iwl_pcie_rx_replenish_work); | ||
| 510 | |||
| 705 | /* free all first - we might be reconfigured for a different size */ | 511 | /* free all first - we might be reconfigured for a different size */ |
| 706 | iwl_pcie_rxq_free_rbs(trans); | 512 | iwl_pcie_rxq_free_rbs(trans); |
| 707 | iwl_pcie_rx_init_rxb_lists(rxq); | 513 | iwl_pcie_rx_init_rxb_lists(rxq); |
| @@ -716,7 +522,7 @@ int iwl_pcie_rx_init(struct iwl_trans *trans) | |||
| 716 | memset(rxq->rb_stts, 0, sizeof(*rxq->rb_stts)); | 522 | memset(rxq->rb_stts, 0, sizeof(*rxq->rb_stts)); |
| 717 | spin_unlock(&rxq->lock); | 523 | spin_unlock(&rxq->lock); |
| 718 | 524 | ||
| 719 | iwl_pcie_rx_replenish(trans); | 525 | iwl_pcie_rx_replenish(trans, GFP_KERNEL); |
| 720 | 526 | ||
| 721 | iwl_pcie_rx_hw_init(trans, rxq); | 527 | iwl_pcie_rx_hw_init(trans, rxq); |
| 722 | 528 | ||
| @@ -731,7 +537,6 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) | |||
| 731 | { | 537 | { |
| 732 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 538 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 733 | struct iwl_rxq *rxq = &trans_pcie->rxq; | 539 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 734 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 735 | 540 | ||
| 736 | /*if rxq->bd is NULL, it means that nothing has been allocated, | 541 | /*if rxq->bd is NULL, it means that nothing has been allocated, |
| 737 | * exit now */ | 542 | * exit now */ |
| @@ -740,15 +545,7 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) | |||
| 740 | return; | 545 | return; |
| 741 | } | 546 | } |
| 742 | 547 | ||
| 743 | cancel_work_sync(&rba->rx_alloc); | 548 | cancel_work_sync(&trans_pcie->rx_replenish); |
| 744 | if (rba->alloc_wq) { | ||
| 745 | destroy_workqueue(rba->alloc_wq); | ||
| 746 | rba->alloc_wq = NULL; | ||
| 747 | } | ||
| 748 | |||
| 749 | spin_lock(&rba->lock); | ||
| 750 | iwl_pcie_rx_free_rba(trans); | ||
| 751 | spin_unlock(&rba->lock); | ||
| 752 | 549 | ||
| 753 | spin_lock(&rxq->lock); | 550 | spin_lock(&rxq->lock); |
| 754 | iwl_pcie_rxq_free_rbs(trans); | 551 | iwl_pcie_rxq_free_rbs(trans); |
| @@ -769,43 +566,6 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) | |||
| 769 | rxq->rb_stts = NULL; | 566 | rxq->rb_stts = NULL; |
| 770 | } | 567 | } |
| 771 | 568 | ||
| 772 | /* | ||
| 773 | * iwl_pcie_rx_reuse_rbd - Recycle used RBDs | ||
| 774 | * | ||
| 775 | * Called when a RBD can be reused. The RBD is transferred to the allocator. | ||
| 776 | * When there are 2 empty RBDs - a request for allocation is posted | ||
| 777 | */ | ||
| 778 | static void iwl_pcie_rx_reuse_rbd(struct iwl_trans *trans, | ||
| 779 | struct iwl_rx_mem_buffer *rxb, | ||
| 780 | struct iwl_rxq *rxq) | ||
| 781 | { | ||
| 782 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
| 783 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
| 784 | |||
| 785 | /* Count the used RBDs */ | ||
| 786 | rxq->used_count++; | ||
| 787 | |||
| 788 | /* Move the RBD to the used list, will be moved to allocator in batches | ||
| 789 | * before claiming or posting a request*/ | ||
| 790 | list_add_tail(&rxb->list, &rxq->rx_used); | ||
| 791 | |||
| 792 | /* If we have RX_POST_REQ_ALLOC new released rx buffers - | ||
| 793 | * issue a request for allocator. Modulo RX_CLAIM_REQ_ALLOC is | ||
| 794 | * used for the case we failed to claim RX_CLAIM_REQ_ALLOC, | ||
| 795 | * after but we still need to post another request. | ||
| 796 | */ | ||
| 797 | if ((rxq->used_count % RX_CLAIM_REQ_ALLOC) == RX_POST_REQ_ALLOC) { | ||
| 798 | /* Move the 2 RBDs to the allocator ownership. | ||
| 799 | Allocator has another 6 from pool for the request completion*/ | ||
| 800 | spin_lock(&rba->lock); | ||
| 801 | list_splice_tail_init(&rxq->rx_used, &rba->rbd_empty); | ||
| 802 | spin_unlock(&rba->lock); | ||
| 803 | |||
| 804 | atomic_inc(&rba->req_pending); | ||
| 805 | queue_work(rba->alloc_wq, &rba->rx_alloc); | ||
| 806 | } | ||
| 807 | } | ||
| 808 | |||
| 809 | static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, | 569 | static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, |
| 810 | struct iwl_rx_mem_buffer *rxb) | 570 | struct iwl_rx_mem_buffer *rxb) |
| 811 | { | 571 | { |
| @@ -928,13 +688,13 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, | |||
| 928 | */ | 688 | */ |
| 929 | __free_pages(rxb->page, trans_pcie->rx_page_order); | 689 | __free_pages(rxb->page, trans_pcie->rx_page_order); |
| 930 | rxb->page = NULL; | 690 | rxb->page = NULL; |
| 931 | iwl_pcie_rx_reuse_rbd(trans, rxb, rxq); | 691 | list_add_tail(&rxb->list, &rxq->rx_used); |
| 932 | } else { | 692 | } else { |
| 933 | list_add_tail(&rxb->list, &rxq->rx_free); | 693 | list_add_tail(&rxb->list, &rxq->rx_free); |
| 934 | rxq->free_count++; | 694 | rxq->free_count++; |
| 935 | } | 695 | } |
| 936 | } else | 696 | } else |
| 937 | iwl_pcie_rx_reuse_rbd(trans, rxb, rxq); | 697 | list_add_tail(&rxb->list, &rxq->rx_used); |
| 938 | } | 698 | } |
| 939 | 699 | ||
| 940 | /* | 700 | /* |
| @@ -944,7 +704,10 @@ static void iwl_pcie_rx_handle(struct iwl_trans *trans) | |||
| 944 | { | 704 | { |
| 945 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 705 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 946 | struct iwl_rxq *rxq = &trans_pcie->rxq; | 706 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 947 | u32 r, i, j; | 707 | u32 r, i; |
| 708 | u8 fill_rx = 0; | ||
| 709 | u32 count = 8; | ||
| 710 | int total_empty; | ||
| 948 | 711 | ||
| 949 | restart: | 712 | restart: |
| 950 | spin_lock(&rxq->lock); | 713 | spin_lock(&rxq->lock); |
| @@ -957,6 +720,14 @@ restart: | |||
| 957 | if (i == r) | 720 | if (i == r) |
| 958 | IWL_DEBUG_RX(trans, "HW = SW = %d\n", r); | 721 | IWL_DEBUG_RX(trans, "HW = SW = %d\n", r); |
| 959 | 722 | ||
| 723 | /* calculate total frames need to be restock after handling RX */ | ||
| 724 | total_empty = r - rxq->write_actual; | ||
| 725 | if (total_empty < 0) | ||
| 726 | total_empty += RX_QUEUE_SIZE; | ||
| 727 | |||
| 728 | if (total_empty > (RX_QUEUE_SIZE / 2)) | ||
| 729 | fill_rx = 1; | ||
| 730 | |||
| 960 | while (i != r) { | 731 | while (i != r) { |
| 961 | struct iwl_rx_mem_buffer *rxb; | 732 | struct iwl_rx_mem_buffer *rxb; |
| 962 | 733 | ||
| @@ -968,48 +739,29 @@ restart: | |||
| 968 | iwl_pcie_rx_handle_rb(trans, rxb); | 739 | iwl_pcie_rx_handle_rb(trans, rxb); |
| 969 | 740 | ||
| 970 | i = (i + 1) & RX_QUEUE_MASK; | 741 | i = (i + 1) & RX_QUEUE_MASK; |
| 971 | 742 | /* If there are a lot of unused frames, | |
| 972 | /* If we have RX_CLAIM_REQ_ALLOC released rx buffers - | 743 | * restock the Rx queue so ucode wont assert. */ |
| 973 | * try to claim the pre-allocated buffers from the allocator */ | 744 | if (fill_rx) { |
| 974 | if (rxq->used_count >= RX_CLAIM_REQ_ALLOC) { | 745 | count++; |
| 975 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | 746 | if (count >= 8) { |
| 976 | struct iwl_rx_mem_buffer *out[RX_CLAIM_REQ_ALLOC]; | 747 | rxq->read = i; |
| 977 | 748 | spin_unlock(&rxq->lock); | |
| 978 | /* Add the remaining 6 empty RBDs for allocator use */ | 749 | iwl_pcie_rx_replenish(trans, GFP_ATOMIC); |
| 979 | spin_lock(&rba->lock); | 750 | count = 0; |
| 980 | list_splice_tail_init(&rxq->rx_used, &rba->rbd_empty); | 751 | goto restart; |
| 981 | spin_unlock(&rba->lock); | ||
| 982 | |||
| 983 | /* If not ready - continue, will try to reclaim later. | ||
| 984 | * No need to reschedule work - allocator exits only on | ||
| 985 | * success */ | ||
| 986 | if (!iwl_pcie_rx_allocator_get(trans, out)) { | ||
| 987 | /* If success - then RX_CLAIM_REQ_ALLOC | ||
| 988 | * buffers were retrieved and should be added | ||
| 989 | * to free list */ | ||
| 990 | rxq->used_count -= RX_CLAIM_REQ_ALLOC; | ||
| 991 | for (j = 0; j < RX_CLAIM_REQ_ALLOC; j++) { | ||
| 992 | list_add_tail(&out[j]->list, | ||
| 993 | &rxq->rx_free); | ||
| 994 | rxq->free_count++; | ||
| 995 | } | ||
| 996 | } | 752 | } |
| 997 | } | 753 | } |
| 998 | /* handle restock for two cases: | ||
| 999 | * - we just pulled buffers from the allocator | ||
| 1000 | * - we have 8+ unstolen pages accumulated */ | ||
| 1001 | if (rxq->free_count >= RX_CLAIM_REQ_ALLOC) { | ||
| 1002 | rxq->read = i; | ||
| 1003 | spin_unlock(&rxq->lock); | ||
| 1004 | iwl_pcie_rxq_restock(trans); | ||
| 1005 | goto restart; | ||
| 1006 | } | ||
| 1007 | } | 754 | } |
| 1008 | 755 | ||
| 1009 | /* Backtrack one entry */ | 756 | /* Backtrack one entry */ |
| 1010 | rxq->read = i; | 757 | rxq->read = i; |
| 1011 | spin_unlock(&rxq->lock); | 758 | spin_unlock(&rxq->lock); |
| 1012 | 759 | ||
| 760 | if (fill_rx) | ||
| 761 | iwl_pcie_rx_replenish(trans, GFP_ATOMIC); | ||
| 762 | else | ||
| 763 | iwl_pcie_rxq_restock(trans); | ||
| 764 | |||
| 1013 | if (trans_pcie->napi.poll) | 765 | if (trans_pcie->napi.poll) |
| 1014 | napi_gro_flush(&trans_pcie->napi, false); | 766 | napi_gro_flush(&trans_pcie->napi, false); |
| 1015 | } | 767 | } |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 43ae658af6ec..6203c4ad9bba 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
| @@ -182,7 +182,7 @@ static void iwl_trans_pcie_write_shr(struct iwl_trans *trans, u32 reg, u32 val) | |||
| 182 | 182 | ||
| 183 | static void iwl_pcie_set_pwr(struct iwl_trans *trans, bool vaux) | 183 | static void iwl_pcie_set_pwr(struct iwl_trans *trans, bool vaux) |
| 184 | { | 184 | { |
| 185 | if (!trans->cfg->apmg_not_supported) | 185 | if (trans->cfg->apmg_not_supported) |
| 186 | return; | 186 | return; |
| 187 | 187 | ||
| 188 | if (vaux && pci_pme_capable(to_pci_dev(trans->dev), PCI_D3cold)) | 188 | if (vaux && pci_pme_capable(to_pci_dev(trans->dev), PCI_D3cold)) |
| @@ -2459,7 +2459,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2459 | struct iwl_trans_pcie *trans_pcie; | 2459 | struct iwl_trans_pcie *trans_pcie; |
| 2460 | struct iwl_trans *trans; | 2460 | struct iwl_trans *trans; |
| 2461 | u16 pci_cmd; | 2461 | u16 pci_cmd; |
| 2462 | int err; | 2462 | int ret; |
| 2463 | 2463 | ||
| 2464 | trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), | 2464 | trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), |
| 2465 | &pdev->dev, cfg, &trans_ops_pcie, 0); | 2465 | &pdev->dev, cfg, &trans_ops_pcie, 0); |
| @@ -2474,8 +2474,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2474 | spin_lock_init(&trans_pcie->ref_lock); | 2474 | spin_lock_init(&trans_pcie->ref_lock); |
| 2475 | init_waitqueue_head(&trans_pcie->ucode_write_waitq); | 2475 | init_waitqueue_head(&trans_pcie->ucode_write_waitq); |
| 2476 | 2476 | ||
| 2477 | err = pci_enable_device(pdev); | 2477 | ret = pci_enable_device(pdev); |
| 2478 | if (err) | 2478 | if (ret) |
| 2479 | goto out_no_pci; | 2479 | goto out_no_pci; |
| 2480 | 2480 | ||
| 2481 | if (!cfg->base_params->pcie_l1_allowed) { | 2481 | if (!cfg->base_params->pcie_l1_allowed) { |
| @@ -2491,23 +2491,23 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2491 | 2491 | ||
| 2492 | pci_set_master(pdev); | 2492 | pci_set_master(pdev); |
| 2493 | 2493 | ||
| 2494 | err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); | 2494 | ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); |
| 2495 | if (!err) | 2495 | if (!ret) |
| 2496 | err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36)); | 2496 | ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36)); |
| 2497 | if (err) { | 2497 | if (ret) { |
| 2498 | err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); | 2498 | ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
| 2499 | if (!err) | 2499 | if (!ret) |
| 2500 | err = pci_set_consistent_dma_mask(pdev, | 2500 | ret = pci_set_consistent_dma_mask(pdev, |
| 2501 | DMA_BIT_MASK(32)); | 2501 | DMA_BIT_MASK(32)); |
| 2502 | /* both attempts failed: */ | 2502 | /* both attempts failed: */ |
| 2503 | if (err) { | 2503 | if (ret) { |
| 2504 | dev_err(&pdev->dev, "No suitable DMA available\n"); | 2504 | dev_err(&pdev->dev, "No suitable DMA available\n"); |
| 2505 | goto out_pci_disable_device; | 2505 | goto out_pci_disable_device; |
| 2506 | } | 2506 | } |
| 2507 | } | 2507 | } |
| 2508 | 2508 | ||
| 2509 | err = pci_request_regions(pdev, DRV_NAME); | 2509 | ret = pci_request_regions(pdev, DRV_NAME); |
| 2510 | if (err) { | 2510 | if (ret) { |
| 2511 | dev_err(&pdev->dev, "pci_request_regions failed\n"); | 2511 | dev_err(&pdev->dev, "pci_request_regions failed\n"); |
| 2512 | goto out_pci_disable_device; | 2512 | goto out_pci_disable_device; |
| 2513 | } | 2513 | } |
| @@ -2515,7 +2515,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2515 | trans_pcie->hw_base = pci_ioremap_bar(pdev, 0); | 2515 | trans_pcie->hw_base = pci_ioremap_bar(pdev, 0); |
| 2516 | if (!trans_pcie->hw_base) { | 2516 | if (!trans_pcie->hw_base) { |
| 2517 | dev_err(&pdev->dev, "pci_ioremap_bar failed\n"); | 2517 | dev_err(&pdev->dev, "pci_ioremap_bar failed\n"); |
| 2518 | err = -ENODEV; | 2518 | ret = -ENODEV; |
| 2519 | goto out_pci_release_regions; | 2519 | goto out_pci_release_regions; |
| 2520 | } | 2520 | } |
| 2521 | 2521 | ||
| @@ -2527,9 +2527,9 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2527 | trans_pcie->pci_dev = pdev; | 2527 | trans_pcie->pci_dev = pdev; |
| 2528 | iwl_disable_interrupts(trans); | 2528 | iwl_disable_interrupts(trans); |
| 2529 | 2529 | ||
| 2530 | err = pci_enable_msi(pdev); | 2530 | ret = pci_enable_msi(pdev); |
| 2531 | if (err) { | 2531 | if (ret) { |
| 2532 | dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", err); | 2532 | dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", ret); |
| 2533 | /* enable rfkill interrupt: hw bug w/a */ | 2533 | /* enable rfkill interrupt: hw bug w/a */ |
| 2534 | pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd); | 2534 | pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd); |
| 2535 | if (pci_cmd & PCI_COMMAND_INTX_DISABLE) { | 2535 | if (pci_cmd & PCI_COMMAND_INTX_DISABLE) { |
| @@ -2547,11 +2547,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2547 | */ | 2547 | */ |
| 2548 | if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) { | 2548 | if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) { |
| 2549 | unsigned long flags; | 2549 | unsigned long flags; |
| 2550 | int ret; | ||
| 2551 | 2550 | ||
| 2552 | trans->hw_rev = (trans->hw_rev & 0xfff0) | | 2551 | trans->hw_rev = (trans->hw_rev & 0xfff0) | |
| 2553 | (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2); | 2552 | (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2); |
| 2554 | 2553 | ||
| 2554 | ret = iwl_pcie_prepare_card_hw(trans); | ||
| 2555 | if (ret) { | ||
| 2556 | IWL_WARN(trans, "Exit HW not ready\n"); | ||
| 2557 | goto out_pci_disable_msi; | ||
| 2558 | } | ||
| 2559 | |||
| 2555 | /* | 2560 | /* |
| 2556 | * in-order to recognize C step driver should read chip version | 2561 | * in-order to recognize C step driver should read chip version |
| 2557 | * id located at the AUX bus MISC address space. | 2562 | * id located at the AUX bus MISC address space. |
| @@ -2591,13 +2596,14 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 2591 | /* Initialize the wait queue for commands */ | 2596 | /* Initialize the wait queue for commands */ |
| 2592 | init_waitqueue_head(&trans_pcie->wait_command_queue); | 2597 | init_waitqueue_head(&trans_pcie->wait_command_queue); |
| 2593 | 2598 | ||
| 2594 | if (iwl_pcie_alloc_ict(trans)) | 2599 | ret = iwl_pcie_alloc_ict(trans); |
| 2600 | if (ret) | ||
| 2595 | goto out_pci_disable_msi; | 2601 | goto out_pci_disable_msi; |
| 2596 | 2602 | ||
| 2597 | err = request_threaded_irq(pdev->irq, iwl_pcie_isr, | 2603 | ret = request_threaded_irq(pdev->irq, iwl_pcie_isr, |
| 2598 | iwl_pcie_irq_handler, | 2604 | iwl_pcie_irq_handler, |
| 2599 | IRQF_SHARED, DRV_NAME, trans); | 2605 | IRQF_SHARED, DRV_NAME, trans); |
| 2600 | if (err) { | 2606 | if (ret) { |
| 2601 | IWL_ERR(trans, "Error allocating IRQ %d\n", pdev->irq); | 2607 | IWL_ERR(trans, "Error allocating IRQ %d\n", pdev->irq); |
| 2602 | goto out_free_ict; | 2608 | goto out_free_ict; |
| 2603 | } | 2609 | } |
| @@ -2617,5 +2623,5 @@ out_pci_disable_device: | |||
| 2617 | pci_disable_device(pdev); | 2623 | pci_disable_device(pdev); |
| 2618 | out_no_pci: | 2624 | out_no_pci: |
| 2619 | iwl_trans_free(trans); | 2625 | iwl_trans_free(trans); |
| 2620 | return ERR_PTR(err); | 2626 | return ERR_PTR(ret); |
| 2621 | } | 2627 | } |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 880d0d63e872..7d50711476fe 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -1566,13 +1566,13 @@ static inline void xenvif_tx_dealloc_action(struct xenvif_queue *queue) | |||
| 1566 | smp_rmb(); | 1566 | smp_rmb(); |
| 1567 | 1567 | ||
| 1568 | while (dc != dp) { | 1568 | while (dc != dp) { |
| 1569 | BUG_ON(gop - queue->tx_unmap_ops > MAX_PENDING_REQS); | 1569 | BUG_ON(gop - queue->tx_unmap_ops >= MAX_PENDING_REQS); |
| 1570 | pending_idx = | 1570 | pending_idx = |
| 1571 | queue->dealloc_ring[pending_index(dc++)]; | 1571 | queue->dealloc_ring[pending_index(dc++)]; |
| 1572 | 1572 | ||
| 1573 | pending_idx_release[gop-queue->tx_unmap_ops] = | 1573 | pending_idx_release[gop - queue->tx_unmap_ops] = |
| 1574 | pending_idx; | 1574 | pending_idx; |
| 1575 | queue->pages_to_unmap[gop-queue->tx_unmap_ops] = | 1575 | queue->pages_to_unmap[gop - queue->tx_unmap_ops] = |
| 1576 | queue->mmap_pages[pending_idx]; | 1576 | queue->mmap_pages[pending_idx]; |
| 1577 | gnttab_set_unmap_op(gop, | 1577 | gnttab_set_unmap_op(gop, |
| 1578 | idx_to_kaddr(queue, pending_idx), | 1578 | idx_to_kaddr(queue, pending_idx), |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index a741678f24a2..883fe1e7c5a1 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -4868,6 +4868,23 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy, | |||
| 4868 | struct cfg80211_chan_def *chandef, | 4868 | struct cfg80211_chan_def *chandef, |
| 4869 | enum nl80211_iftype iftype); | 4869 | enum nl80211_iftype iftype); |
| 4870 | 4870 | ||
| 4871 | /** | ||
| 4872 | * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation | ||
| 4873 | * @wiphy: the wiphy | ||
| 4874 | * @chandef: the channel definition | ||
| 4875 | * @iftype: interface type | ||
| 4876 | * | ||
| 4877 | * Return: %true if there is no secondary channel or the secondary channel(s) | ||
| 4878 | * can be used for beaconing (i.e. is not a radar channel etc.). This version | ||
| 4879 | * also checks if IR-relaxation conditions apply, to allow beaconing under | ||
| 4880 | * more permissive conditions. | ||
| 4881 | * | ||
| 4882 | * Requires the RTNL to be held. | ||
| 4883 | */ | ||
| 4884 | bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, | ||
| 4885 | struct cfg80211_chan_def *chandef, | ||
| 4886 | enum nl80211_iftype iftype); | ||
| 4887 | |||
| 4871 | /* | 4888 | /* |
| 4872 | * cfg80211_ch_switch_notify - update wdev channel and notify userspace | 4889 | * cfg80211_ch_switch_notify - update wdev channel and notify userspace |
| 4873 | * @dev: the device which switched channels | 4890 | * @dev: the device which switched channels |
diff --git a/include/net/ip.h b/include/net/ip.h index 0750a186ea63..d5fe9f2ab699 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -161,6 +161,7 @@ static inline __u8 get_rtconn_flags(struct ipcm_cookie* ipc, struct sock* sk) | |||
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | /* datagram.c */ | 163 | /* datagram.c */ |
| 164 | int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | ||
| 164 | int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 165 | int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
| 165 | 166 | ||
| 166 | void ip4_datagram_release_cb(struct sock *sk); | 167 | void ip4_datagram_release_cb(struct sock *sk); |
diff --git a/net/ax25/ax25_subr.c b/net/ax25/ax25_subr.c index 1997538a5d23..3b78e8473a01 100644 --- a/net/ax25/ax25_subr.c +++ b/net/ax25/ax25_subr.c | |||
| @@ -264,6 +264,7 @@ void ax25_disconnect(ax25_cb *ax25, int reason) | |||
| 264 | { | 264 | { |
| 265 | ax25_clear_queues(ax25); | 265 | ax25_clear_queues(ax25); |
| 266 | 266 | ||
| 267 | ax25_stop_heartbeat(ax25); | ||
| 267 | ax25_stop_t1timer(ax25); | 268 | ax25_stop_t1timer(ax25); |
| 268 | ax25_stop_t2timer(ax25); | 269 | ax25_stop_t2timer(ax25); |
| 269 | ax25_stop_t3timer(ax25); | 270 | ax25_stop_t3timer(ax25); |
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index c11cf2611db0..1198a3dbad95 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c | |||
| @@ -351,7 +351,6 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, | |||
| 351 | if (state == MDB_TEMPORARY) | 351 | if (state == MDB_TEMPORARY) |
| 352 | mod_timer(&p->timer, now + br->multicast_membership_interval); | 352 | mod_timer(&p->timer, now + br->multicast_membership_interval); |
| 353 | 353 | ||
| 354 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); | ||
| 355 | return 0; | 354 | return 0; |
| 356 | } | 355 | } |
| 357 | 356 | ||
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 742a6c27d7a2..79db489cdade 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
| @@ -39,6 +39,16 @@ static void br_multicast_start_querier(struct net_bridge *br, | |||
| 39 | struct bridge_mcast_own_query *query); | 39 | struct bridge_mcast_own_query *query); |
| 40 | static void br_multicast_add_router(struct net_bridge *br, | 40 | static void br_multicast_add_router(struct net_bridge *br, |
| 41 | struct net_bridge_port *port); | 41 | struct net_bridge_port *port); |
| 42 | static void br_ip4_multicast_leave_group(struct net_bridge *br, | ||
| 43 | struct net_bridge_port *port, | ||
| 44 | __be32 group, | ||
| 45 | __u16 vid); | ||
| 46 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 47 | static void br_ip6_multicast_leave_group(struct net_bridge *br, | ||
| 48 | struct net_bridge_port *port, | ||
| 49 | const struct in6_addr *group, | ||
| 50 | __u16 vid); | ||
| 51 | #endif | ||
| 42 | unsigned int br_mdb_rehash_seq; | 52 | unsigned int br_mdb_rehash_seq; |
| 43 | 53 | ||
| 44 | static inline int br_ip_equal(const struct br_ip *a, const struct br_ip *b) | 54 | static inline int br_ip_equal(const struct br_ip *a, const struct br_ip *b) |
| @@ -1010,9 +1020,15 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, | |||
| 1010 | continue; | 1020 | continue; |
| 1011 | } | 1021 | } |
| 1012 | 1022 | ||
| 1013 | err = br_ip4_multicast_add_group(br, port, group, vid); | 1023 | if ((type == IGMPV3_CHANGE_TO_INCLUDE || |
| 1014 | if (err) | 1024 | type == IGMPV3_MODE_IS_INCLUDE) && |
| 1015 | break; | 1025 | ntohs(grec->grec_nsrcs) == 0) { |
| 1026 | br_ip4_multicast_leave_group(br, port, group, vid); | ||
| 1027 | } else { | ||
| 1028 | err = br_ip4_multicast_add_group(br, port, group, vid); | ||
| 1029 | if (err) | ||
| 1030 | break; | ||
| 1031 | } | ||
| 1016 | } | 1032 | } |
| 1017 | 1033 | ||
| 1018 | return err; | 1034 | return err; |
| @@ -1071,10 +1087,17 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, | |||
| 1071 | continue; | 1087 | continue; |
| 1072 | } | 1088 | } |
| 1073 | 1089 | ||
| 1074 | err = br_ip6_multicast_add_group(br, port, &grec->grec_mca, | 1090 | if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE || |
| 1075 | vid); | 1091 | grec->grec_type == MLD2_MODE_IS_INCLUDE) && |
| 1076 | if (err) | 1092 | ntohs(*nsrcs) == 0) { |
| 1077 | break; | 1093 | br_ip6_multicast_leave_group(br, port, &grec->grec_mca, |
| 1094 | vid); | ||
| 1095 | } else { | ||
| 1096 | err = br_ip6_multicast_add_group(br, port, | ||
| 1097 | &grec->grec_mca, vid); | ||
| 1098 | if (!err) | ||
| 1099 | break; | ||
| 1100 | } | ||
| 1078 | } | 1101 | } |
| 1079 | 1102 | ||
| 1080 | return err; | 1103 | return err; |
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 3cc71b9f5517..cc858919108e 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
| @@ -121,12 +121,13 @@ static void caif_flow_ctrl(struct sock *sk, int mode) | |||
| 121 | * Copied from sock.c:sock_queue_rcv_skb(), but changed so packets are | 121 | * Copied from sock.c:sock_queue_rcv_skb(), but changed so packets are |
| 122 | * not dropped, but CAIF is sending flow off instead. | 122 | * not dropped, but CAIF is sending flow off instead. |
| 123 | */ | 123 | */ |
| 124 | static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | 124 | static void caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) |
| 125 | { | 125 | { |
| 126 | int err; | 126 | int err; |
| 127 | unsigned long flags; | 127 | unsigned long flags; |
| 128 | struct sk_buff_head *list = &sk->sk_receive_queue; | 128 | struct sk_buff_head *list = &sk->sk_receive_queue; |
| 129 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); | 129 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
| 130 | bool queued = false; | ||
| 130 | 131 | ||
| 131 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | 132 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= |
| 132 | (unsigned int)sk->sk_rcvbuf && rx_flow_is_on(cf_sk)) { | 133 | (unsigned int)sk->sk_rcvbuf && rx_flow_is_on(cf_sk)) { |
| @@ -139,7 +140,8 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
| 139 | 140 | ||
| 140 | err = sk_filter(sk, skb); | 141 | err = sk_filter(sk, skb); |
| 141 | if (err) | 142 | if (err) |
| 142 | return err; | 143 | goto out; |
| 144 | |||
| 143 | if (!sk_rmem_schedule(sk, skb, skb->truesize) && rx_flow_is_on(cf_sk)) { | 145 | if (!sk_rmem_schedule(sk, skb, skb->truesize) && rx_flow_is_on(cf_sk)) { |
| 144 | set_rx_flow_off(cf_sk); | 146 | set_rx_flow_off(cf_sk); |
| 145 | net_dbg_ratelimited("sending flow OFF due to rmem_schedule\n"); | 147 | net_dbg_ratelimited("sending flow OFF due to rmem_schedule\n"); |
| @@ -147,21 +149,16 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
| 147 | } | 149 | } |
| 148 | skb->dev = NULL; | 150 | skb->dev = NULL; |
| 149 | skb_set_owner_r(skb, sk); | 151 | skb_set_owner_r(skb, sk); |
| 150 | /* Cache the SKB length before we tack it onto the receive | ||
| 151 | * queue. Once it is added it no longer belongs to us and | ||
| 152 | * may be freed by other threads of control pulling packets | ||
| 153 | * from the queue. | ||
| 154 | */ | ||
| 155 | spin_lock_irqsave(&list->lock, flags); | 152 | spin_lock_irqsave(&list->lock, flags); |
| 156 | if (!sock_flag(sk, SOCK_DEAD)) | 153 | queued = !sock_flag(sk, SOCK_DEAD); |
| 154 | if (queued) | ||
| 157 | __skb_queue_tail(list, skb); | 155 | __skb_queue_tail(list, skb); |
| 158 | spin_unlock_irqrestore(&list->lock, flags); | 156 | spin_unlock_irqrestore(&list->lock, flags); |
| 159 | 157 | out: | |
| 160 | if (!sock_flag(sk, SOCK_DEAD)) | 158 | if (queued) |
| 161 | sk->sk_data_ready(sk); | 159 | sk->sk_data_ready(sk); |
| 162 | else | 160 | else |
| 163 | kfree_skb(skb); | 161 | kfree_skb(skb); |
| 164 | return 0; | ||
| 165 | } | 162 | } |
| 166 | 163 | ||
| 167 | /* Packet Receive Callback function called from CAIF Stack */ | 164 | /* Packet Receive Callback function called from CAIF Stack */ |
diff --git a/net/core/datagram.c b/net/core/datagram.c index b80fb91bb3f7..4967262b2707 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -131,6 +131,35 @@ out_noerr: | |||
| 131 | goto out; | 131 | goto out; |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | static int skb_set_peeked(struct sk_buff *skb) | ||
| 135 | { | ||
| 136 | struct sk_buff *nskb; | ||
| 137 | |||
| 138 | if (skb->peeked) | ||
| 139 | return 0; | ||
| 140 | |||
| 141 | /* We have to unshare an skb before modifying it. */ | ||
| 142 | if (!skb_shared(skb)) | ||
| 143 | goto done; | ||
| 144 | |||
| 145 | nskb = skb_clone(skb, GFP_ATOMIC); | ||
| 146 | if (!nskb) | ||
| 147 | return -ENOMEM; | ||
| 148 | |||
| 149 | skb->prev->next = nskb; | ||
| 150 | skb->next->prev = nskb; | ||
| 151 | nskb->prev = skb->prev; | ||
| 152 | nskb->next = skb->next; | ||
| 153 | |||
| 154 | consume_skb(skb); | ||
| 155 | skb = nskb; | ||
| 156 | |||
| 157 | done: | ||
| 158 | skb->peeked = 1; | ||
| 159 | |||
| 160 | return 0; | ||
| 161 | } | ||
| 162 | |||
| 134 | /** | 163 | /** |
| 135 | * __skb_recv_datagram - Receive a datagram skbuff | 164 | * __skb_recv_datagram - Receive a datagram skbuff |
| 136 | * @sk: socket | 165 | * @sk: socket |
| @@ -165,7 +194,9 @@ out_noerr: | |||
| 165 | struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | 194 | struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, |
| 166 | int *peeked, int *off, int *err) | 195 | int *peeked, int *off, int *err) |
| 167 | { | 196 | { |
| 197 | struct sk_buff_head *queue = &sk->sk_receive_queue; | ||
| 168 | struct sk_buff *skb, *last; | 198 | struct sk_buff *skb, *last; |
| 199 | unsigned long cpu_flags; | ||
| 169 | long timeo; | 200 | long timeo; |
| 170 | /* | 201 | /* |
| 171 | * Caller is allowed not to check sk->sk_err before skb_recv_datagram() | 202 | * Caller is allowed not to check sk->sk_err before skb_recv_datagram() |
| @@ -184,8 +215,6 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | |||
| 184 | * Look at current nfs client by the way... | 215 | * Look at current nfs client by the way... |
| 185 | * However, this function was correct in any case. 8) | 216 | * However, this function was correct in any case. 8) |
| 186 | */ | 217 | */ |
| 187 | unsigned long cpu_flags; | ||
| 188 | struct sk_buff_head *queue = &sk->sk_receive_queue; | ||
| 189 | int _off = *off; | 218 | int _off = *off; |
| 190 | 219 | ||
| 191 | last = (struct sk_buff *)queue; | 220 | last = (struct sk_buff *)queue; |
| @@ -199,7 +228,11 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | |||
| 199 | _off -= skb->len; | 228 | _off -= skb->len; |
| 200 | continue; | 229 | continue; |
| 201 | } | 230 | } |
| 202 | skb->peeked = 1; | 231 | |
| 232 | error = skb_set_peeked(skb); | ||
| 233 | if (error) | ||
| 234 | goto unlock_err; | ||
| 235 | |||
| 203 | atomic_inc(&skb->users); | 236 | atomic_inc(&skb->users); |
| 204 | } else | 237 | } else |
| 205 | __skb_unlink(skb, queue); | 238 | __skb_unlink(skb, queue); |
| @@ -223,6 +256,8 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | |||
| 223 | 256 | ||
| 224 | return NULL; | 257 | return NULL; |
| 225 | 258 | ||
| 259 | unlock_err: | ||
| 260 | spin_unlock_irqrestore(&queue->lock, cpu_flags); | ||
| 226 | no_packet: | 261 | no_packet: |
| 227 | *err = error; | 262 | *err = error; |
| 228 | return NULL; | 263 | return NULL; |
| @@ -622,7 +657,8 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len) | |||
| 622 | !skb->csum_complete_sw) | 657 | !skb->csum_complete_sw) |
| 623 | netdev_rx_csum_fault(skb->dev); | 658 | netdev_rx_csum_fault(skb->dev); |
| 624 | } | 659 | } |
| 625 | skb->csum_valid = !sum; | 660 | if (!skb_shared(skb)) |
| 661 | skb->csum_valid = !sum; | ||
| 626 | return sum; | 662 | return sum; |
| 627 | } | 663 | } |
| 628 | EXPORT_SYMBOL(__skb_checksum_complete_head); | 664 | EXPORT_SYMBOL(__skb_checksum_complete_head); |
| @@ -642,11 +678,13 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb) | |||
| 642 | netdev_rx_csum_fault(skb->dev); | 678 | netdev_rx_csum_fault(skb->dev); |
| 643 | } | 679 | } |
| 644 | 680 | ||
| 645 | /* Save full packet checksum */ | 681 | if (!skb_shared(skb)) { |
| 646 | skb->csum = csum; | 682 | /* Save full packet checksum */ |
| 647 | skb->ip_summed = CHECKSUM_COMPLETE; | 683 | skb->csum = csum; |
| 648 | skb->csum_complete_sw = 1; | 684 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 649 | skb->csum_valid = !sum; | 685 | skb->csum_complete_sw = 1; |
| 686 | skb->csum_valid = !sum; | ||
| 687 | } | ||
| 650 | 688 | ||
| 651 | return sum; | 689 | return sum; |
| 652 | } | 690 | } |
diff --git a/net/core/dst.c b/net/core/dst.c index e956ce6d1378..002144bea935 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
| @@ -284,7 +284,9 @@ void dst_release(struct dst_entry *dst) | |||
| 284 | int newrefcnt; | 284 | int newrefcnt; |
| 285 | 285 | ||
| 286 | newrefcnt = atomic_dec_return(&dst->__refcnt); | 286 | newrefcnt = atomic_dec_return(&dst->__refcnt); |
| 287 | WARN_ON(newrefcnt < 0); | 287 | if (unlikely(newrefcnt < 0)) |
| 288 | net_warn_ratelimited("%s: dst:%p refcnt:%d\n", | ||
| 289 | __func__, dst, newrefcnt); | ||
| 288 | if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt) | 290 | if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt) |
| 289 | call_rcu(&dst->rcu_head, dst_destroy_rcu); | 291 | call_rcu(&dst->rcu_head, dst_destroy_rcu); |
| 290 | } | 292 | } |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9e433d58d265..dc004b1e1f85 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -1804,10 +1804,13 @@ static int do_setlink(const struct sk_buff *skb, | |||
| 1804 | goto errout; | 1804 | goto errout; |
| 1805 | 1805 | ||
| 1806 | nla_for_each_nested(attr, tb[IFLA_VF_PORTS], rem) { | 1806 | nla_for_each_nested(attr, tb[IFLA_VF_PORTS], rem) { |
| 1807 | if (nla_type(attr) != IFLA_VF_PORT) | 1807 | if (nla_type(attr) != IFLA_VF_PORT || |
| 1808 | continue; | 1808 | nla_len(attr) < NLA_HDRLEN) { |
| 1809 | err = nla_parse_nested(port, IFLA_PORT_MAX, | 1809 | err = -EINVAL; |
| 1810 | attr, ifla_port_policy); | 1810 | goto errout; |
| 1811 | } | ||
| 1812 | err = nla_parse_nested(port, IFLA_PORT_MAX, attr, | ||
| 1813 | ifla_port_policy); | ||
| 1811 | if (err < 0) | 1814 | if (err < 0) |
| 1812 | goto errout; | 1815 | goto errout; |
| 1813 | if (!port[IFLA_PORT_VF]) { | 1816 | if (!port[IFLA_PORT_VF]) { |
diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index 90c0e8386116..574fad9cca05 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include <net/route.h> | 20 | #include <net/route.h> |
| 21 | #include <net/tcp_states.h> | 21 | #include <net/tcp_states.h> |
| 22 | 22 | ||
| 23 | int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | 23 | int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) |
| 24 | { | 24 | { |
| 25 | struct inet_sock *inet = inet_sk(sk); | 25 | struct inet_sock *inet = inet_sk(sk); |
| 26 | struct sockaddr_in *usin = (struct sockaddr_in *) uaddr; | 26 | struct sockaddr_in *usin = (struct sockaddr_in *) uaddr; |
| @@ -39,8 +39,6 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
| 39 | 39 | ||
| 40 | sk_dst_reset(sk); | 40 | sk_dst_reset(sk); |
| 41 | 41 | ||
| 42 | lock_sock(sk); | ||
| 43 | |||
| 44 | oif = sk->sk_bound_dev_if; | 42 | oif = sk->sk_bound_dev_if; |
| 45 | saddr = inet->inet_saddr; | 43 | saddr = inet->inet_saddr; |
| 46 | if (ipv4_is_multicast(usin->sin_addr.s_addr)) { | 44 | if (ipv4_is_multicast(usin->sin_addr.s_addr)) { |
| @@ -82,9 +80,19 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
| 82 | sk_dst_set(sk, &rt->dst); | 80 | sk_dst_set(sk, &rt->dst); |
| 83 | err = 0; | 81 | err = 0; |
| 84 | out: | 82 | out: |
| 85 | release_sock(sk); | ||
| 86 | return err; | 83 | return err; |
| 87 | } | 84 | } |
| 85 | EXPORT_SYMBOL(__ip4_datagram_connect); | ||
| 86 | |||
| 87 | int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | ||
| 88 | { | ||
| 89 | int res; | ||
| 90 | |||
| 91 | lock_sock(sk); | ||
| 92 | res = __ip4_datagram_connect(sk, uaddr, addr_len); | ||
| 93 | release_sock(sk); | ||
| 94 | return res; | ||
| 95 | } | ||
| 88 | EXPORT_SYMBOL(ip4_datagram_connect); | 96 | EXPORT_SYMBOL(ip4_datagram_connect); |
| 89 | 97 | ||
| 90 | /* Because UDP xmit path can manipulate sk_dst_cache without holding | 98 | /* Because UDP xmit path can manipulate sk_dst_cache without holding |
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 5f9b063bbe8a..0cb9165421d4 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
| @@ -624,22 +624,21 @@ EXPORT_SYMBOL_GPL(inet_hashinfo_init); | |||
| 624 | 624 | ||
| 625 | int inet_ehash_locks_alloc(struct inet_hashinfo *hashinfo) | 625 | int inet_ehash_locks_alloc(struct inet_hashinfo *hashinfo) |
| 626 | { | 626 | { |
| 627 | unsigned int locksz = sizeof(spinlock_t); | ||
| 627 | unsigned int i, nblocks = 1; | 628 | unsigned int i, nblocks = 1; |
| 628 | 629 | ||
| 629 | if (sizeof(spinlock_t) != 0) { | 630 | if (locksz != 0) { |
| 630 | /* allocate 2 cache lines or at least one spinlock per cpu */ | 631 | /* allocate 2 cache lines or at least one spinlock per cpu */ |
| 631 | nblocks = max_t(unsigned int, | 632 | nblocks = max(2U * L1_CACHE_BYTES / locksz, 1U); |
| 632 | 2 * L1_CACHE_BYTES / sizeof(spinlock_t), | ||
| 633 | 1); | ||
| 634 | nblocks = roundup_pow_of_two(nblocks * num_possible_cpus()); | 633 | nblocks = roundup_pow_of_two(nblocks * num_possible_cpus()); |
| 635 | 634 | ||
| 636 | /* no more locks than number of hash buckets */ | 635 | /* no more locks than number of hash buckets */ |
| 637 | nblocks = min(nblocks, hashinfo->ehash_mask + 1); | 636 | nblocks = min(nblocks, hashinfo->ehash_mask + 1); |
| 638 | 637 | ||
| 639 | hashinfo->ehash_locks = kmalloc_array(nblocks, sizeof(spinlock_t), | 638 | hashinfo->ehash_locks = kmalloc_array(nblocks, locksz, |
| 640 | GFP_KERNEL | __GFP_NOWARN); | 639 | GFP_KERNEL | __GFP_NOWARN); |
| 641 | if (!hashinfo->ehash_locks) | 640 | if (!hashinfo->ehash_locks) |
| 642 | hashinfo->ehash_locks = vmalloc(nblocks * sizeof(spinlock_t)); | 641 | hashinfo->ehash_locks = vmalloc(nblocks * locksz); |
| 643 | 642 | ||
| 644 | if (!hashinfo->ehash_locks) | 643 | if (!hashinfo->ehash_locks) |
| 645 | return -ENOMEM; | 644 | return -ENOMEM; |
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index a50dc6d408d1..31f71b15cfba 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
| @@ -351,7 +351,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) | |||
| 351 | ihl = ip_hdrlen(skb); | 351 | ihl = ip_hdrlen(skb); |
| 352 | 352 | ||
| 353 | /* Determine the position of this fragment. */ | 353 | /* Determine the position of this fragment. */ |
| 354 | end = offset + skb->len - ihl; | 354 | end = offset + skb->len - skb_network_offset(skb) - ihl; |
| 355 | err = -EINVAL; | 355 | err = -EINVAL; |
| 356 | 356 | ||
| 357 | /* Is this the final fragment? */ | 357 | /* Is this the final fragment? */ |
| @@ -381,7 +381,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) | |||
| 381 | goto err; | 381 | goto err; |
| 382 | 382 | ||
| 383 | err = -ENOMEM; | 383 | err = -ENOMEM; |
| 384 | if (!pskb_pull(skb, ihl)) | 384 | if (!pskb_pull(skb, skb_network_offset(skb) + ihl)) |
| 385 | goto err; | 385 | goto err; |
| 386 | 386 | ||
| 387 | err = pskb_trim_rcsum(skb, end - offset); | 387 | err = pskb_trim_rcsum(skb, end - offset); |
| @@ -641,6 +641,8 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, | |||
| 641 | iph->frag_off = 0; | 641 | iph->frag_off = 0; |
| 642 | } | 642 | } |
| 643 | 643 | ||
| 644 | ip_send_check(iph); | ||
| 645 | |||
| 644 | IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS); | 646 | IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS); |
| 645 | qp->q.fragments = NULL; | 647 | qp->q.fragments = NULL; |
| 646 | qp->q.fragments_tail = NULL; | 648 | qp->q.fragments_tail = NULL; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 684f095d196e..728f5b3d3c64 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1917,14 +1917,13 @@ void tcp_enter_loss(struct sock *sk) | |||
| 1917 | const struct inet_connection_sock *icsk = inet_csk(sk); | 1917 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| 1918 | struct tcp_sock *tp = tcp_sk(sk); | 1918 | struct tcp_sock *tp = tcp_sk(sk); |
| 1919 | struct sk_buff *skb; | 1919 | struct sk_buff *skb; |
| 1920 | bool new_recovery = false; | 1920 | bool new_recovery = icsk->icsk_ca_state < TCP_CA_Recovery; |
| 1921 | bool is_reneg; /* is receiver reneging on SACKs? */ | 1921 | bool is_reneg; /* is receiver reneging on SACKs? */ |
| 1922 | 1922 | ||
| 1923 | /* Reduce ssthresh if it has not yet been made inside this window. */ | 1923 | /* Reduce ssthresh if it has not yet been made inside this window. */ |
| 1924 | if (icsk->icsk_ca_state <= TCP_CA_Disorder || | 1924 | if (icsk->icsk_ca_state <= TCP_CA_Disorder || |
| 1925 | !after(tp->high_seq, tp->snd_una) || | 1925 | !after(tp->high_seq, tp->snd_una) || |
| 1926 | (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) { | 1926 | (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) { |
| 1927 | new_recovery = true; | ||
| 1928 | tp->prior_ssthresh = tcp_current_ssthresh(sk); | 1927 | tp->prior_ssthresh = tcp_current_ssthresh(sk); |
| 1929 | tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk); | 1928 | tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk); |
| 1930 | tcp_ca_event(sk, CA_EVENT_LOSS); | 1929 | tcp_ca_event(sk, CA_EVENT_LOSS); |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 62d908e64eeb..b10a88986a98 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
| @@ -40,7 +40,7 @@ static bool ipv6_mapped_addr_any(const struct in6_addr *a) | |||
| 40 | return ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0); | 40 | return ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | 43 | static int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) |
| 44 | { | 44 | { |
| 45 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; | 45 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; |
| 46 | struct inet_sock *inet = inet_sk(sk); | 46 | struct inet_sock *inet = inet_sk(sk); |
| @@ -56,7 +56,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
| 56 | if (usin->sin6_family == AF_INET) { | 56 | if (usin->sin6_family == AF_INET) { |
| 57 | if (__ipv6_only_sock(sk)) | 57 | if (__ipv6_only_sock(sk)) |
| 58 | return -EAFNOSUPPORT; | 58 | return -EAFNOSUPPORT; |
| 59 | err = ip4_datagram_connect(sk, uaddr, addr_len); | 59 | err = __ip4_datagram_connect(sk, uaddr, addr_len); |
| 60 | goto ipv4_connected; | 60 | goto ipv4_connected; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| @@ -98,9 +98,9 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
| 98 | sin.sin_addr.s_addr = daddr->s6_addr32[3]; | 98 | sin.sin_addr.s_addr = daddr->s6_addr32[3]; |
| 99 | sin.sin_port = usin->sin6_port; | 99 | sin.sin_port = usin->sin6_port; |
| 100 | 100 | ||
| 101 | err = ip4_datagram_connect(sk, | 101 | err = __ip4_datagram_connect(sk, |
| 102 | (struct sockaddr *) &sin, | 102 | (struct sockaddr *) &sin, |
| 103 | sizeof(sin)); | 103 | sizeof(sin)); |
| 104 | 104 | ||
| 105 | ipv4_connected: | 105 | ipv4_connected: |
| 106 | if (err) | 106 | if (err) |
| @@ -204,6 +204,16 @@ out: | |||
| 204 | fl6_sock_release(flowlabel); | 204 | fl6_sock_release(flowlabel); |
| 205 | return err; | 205 | return err; |
| 206 | } | 206 | } |
| 207 | |||
| 208 | int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | ||
| 209 | { | ||
| 210 | int res; | ||
| 211 | |||
| 212 | lock_sock(sk); | ||
| 213 | res = __ip6_datagram_connect(sk, uaddr, addr_len); | ||
| 214 | release_sock(sk); | ||
| 215 | return res; | ||
| 216 | } | ||
| 207 | EXPORT_SYMBOL_GPL(ip6_datagram_connect); | 217 | EXPORT_SYMBOL_GPL(ip6_datagram_connect); |
| 208 | 218 | ||
| 209 | int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr, | 219 | int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr, |
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index e893cd18612f..08b62047c67f 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c | |||
| @@ -292,8 +292,6 @@ static struct packet_offload ipv6_packet_offload __read_mostly = { | |||
| 292 | static const struct net_offload sit_offload = { | 292 | static const struct net_offload sit_offload = { |
| 293 | .callbacks = { | 293 | .callbacks = { |
| 294 | .gso_segment = ipv6_gso_segment, | 294 | .gso_segment = ipv6_gso_segment, |
| 295 | .gro_receive = ipv6_gro_receive, | ||
| 296 | .gro_complete = ipv6_gro_complete, | ||
| 297 | }, | 295 | }, |
| 298 | }; | 296 | }; |
| 299 | 297 | ||
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index 29236e832e44..c09c0131bfa2 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
| @@ -723,6 +723,7 @@ void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata) | |||
| 723 | 723 | ||
| 724 | debugfs_remove_recursive(sdata->vif.debugfs_dir); | 724 | debugfs_remove_recursive(sdata->vif.debugfs_dir); |
| 725 | sdata->vif.debugfs_dir = NULL; | 725 | sdata->vif.debugfs_dir = NULL; |
| 726 | sdata->debugfs.subdir_stations = NULL; | ||
| 726 | } | 727 | } |
| 727 | 728 | ||
| 728 | void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata) | 729 | void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata) |
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index ed1edac14372..553ac6dd4867 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
| @@ -1863,10 +1863,6 @@ void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) | |||
| 1863 | ieee80211_teardown_sdata(sdata); | 1863 | ieee80211_teardown_sdata(sdata); |
| 1864 | } | 1864 | } |
| 1865 | 1865 | ||
| 1866 | /* | ||
| 1867 | * Remove all interfaces, may only be called at hardware unregistration | ||
| 1868 | * time because it doesn't do RCU-safe list removals. | ||
| 1869 | */ | ||
| 1870 | void ieee80211_remove_interfaces(struct ieee80211_local *local) | 1866 | void ieee80211_remove_interfaces(struct ieee80211_local *local) |
| 1871 | { | 1867 | { |
| 1872 | struct ieee80211_sub_if_data *sdata, *tmp; | 1868 | struct ieee80211_sub_if_data *sdata, *tmp; |
| @@ -1875,14 +1871,21 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local) | |||
| 1875 | 1871 | ||
| 1876 | ASSERT_RTNL(); | 1872 | ASSERT_RTNL(); |
| 1877 | 1873 | ||
| 1878 | /* | 1874 | /* Before destroying the interfaces, make sure they're all stopped so |
| 1879 | * Close all AP_VLAN interfaces first, as otherwise they | 1875 | * that the hardware is stopped. Otherwise, the driver might still be |
| 1880 | * might be closed while the AP interface they belong to | 1876 | * iterating the interfaces during the shutdown, e.g. from a worker |
| 1881 | * is closed, causing unregister_netdevice_many() to crash. | 1877 | * or from RX processing or similar, and if it does so (using atomic |
| 1878 | * iteration) while we're manipulating the list, the iteration will | ||
| 1879 | * crash. | ||
| 1880 | * | ||
| 1881 | * After this, the hardware should be stopped and the driver should | ||
| 1882 | * have stopped all of its activities, so that we can do RCU-unaware | ||
| 1883 | * manipulations of the interface list below. | ||
| 1882 | */ | 1884 | */ |
| 1883 | list_for_each_entry(sdata, &local->interfaces, list) | 1885 | cfg80211_shutdown_all_interfaces(local->hw.wiphy); |
| 1884 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | 1886 | |
| 1885 | dev_close(sdata->dev); | 1887 | WARN(local->open_count, "%s: open count remains %d\n", |
| 1888 | wiphy_name(local->hw.wiphy), local->open_count); | ||
| 1886 | 1889 | ||
| 1887 | mutex_lock(&local->iflist_mtx); | 1890 | mutex_lock(&local->iflist_mtx); |
| 1888 | list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { | 1891 | list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { |
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index 5438d13e2f00..3b59099413fb 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c | |||
| @@ -306,7 +306,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
| 306 | if (action == WLAN_SP_MESH_PEERING_CONFIRM) { | 306 | if (action == WLAN_SP_MESH_PEERING_CONFIRM) { |
| 307 | /* AID */ | 307 | /* AID */ |
| 308 | pos = skb_put(skb, 2); | 308 | pos = skb_put(skb, 2); |
| 309 | put_unaligned_le16(plid, pos + 2); | 309 | put_unaligned_le16(plid, pos); |
| 310 | } | 310 | } |
| 311 | if (ieee80211_add_srates_ie(sdata, skb, true, band) || | 311 | if (ieee80211_add_srates_ie(sdata, skb, true, band) || |
| 312 | ieee80211_add_ext_srates_ie(sdata, skb, true, band) || | 312 | ieee80211_add_ext_srates_ie(sdata, skb, true, band) || |
| @@ -1122,6 +1122,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, | |||
| 1122 | WLAN_SP_MESH_PEERING_CONFIRM) { | 1122 | WLAN_SP_MESH_PEERING_CONFIRM) { |
| 1123 | baseaddr += 4; | 1123 | baseaddr += 4; |
| 1124 | baselen += 4; | 1124 | baselen += 4; |
| 1125 | |||
| 1126 | if (baselen > len) | ||
| 1127 | return; | ||
| 1125 | } | 1128 | } |
| 1126 | ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems); | 1129 | ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems); |
| 1127 | mesh_process_plink_frame(sdata, mgmt, &elems); | 1130 | mesh_process_plink_frame(sdata, mgmt, &elems); |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 06b60980c62c..b676b9fa707b 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
| @@ -76,6 +76,22 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
| 76 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | 76 | if (sdata->vif.type != NL80211_IFTYPE_STATION) |
| 77 | continue; | 77 | continue; |
| 78 | ieee80211_mgd_quiesce(sdata); | 78 | ieee80211_mgd_quiesce(sdata); |
| 79 | /* If suspended during TX in progress, and wowlan | ||
| 80 | * is enabled (connection will be active) there | ||
| 81 | * can be a race where the driver is put out | ||
| 82 | * of power-save due to TX and during suspend | ||
| 83 | * dynamic_ps_timer is cancelled and TX packet | ||
| 84 | * is flushed, leaving the driver in ACTIVE even | ||
| 85 | * after resuming until dynamic_ps_timer puts | ||
| 86 | * driver back in DOZE. | ||
| 87 | */ | ||
| 88 | if (sdata->u.mgd.associated && | ||
| 89 | sdata->u.mgd.powersave && | ||
| 90 | !(local->hw.conf.flags & IEEE80211_CONF_PS)) { | ||
| 91 | local->hw.conf.flags |= IEEE80211_CONF_PS; | ||
| 92 | ieee80211_hw_config(local, | ||
| 93 | IEEE80211_CONF_CHANGE_PS); | ||
| 94 | } | ||
| 79 | } | 95 | } |
| 80 | 96 | ||
| 81 | err = drv_suspend(local, wowlan); | 97 | err = drv_suspend(local, wowlan); |
diff --git a/net/mac80211/tdls.c b/net/mac80211/tdls.c index ad31b2dab4f5..8db6e2994bbc 100644 --- a/net/mac80211/tdls.c +++ b/net/mac80211/tdls.c | |||
| @@ -60,6 +60,7 @@ ieee80211_tdls_add_subband(struct ieee80211_sub_if_data *sdata, | |||
| 60 | struct ieee80211_channel *ch; | 60 | struct ieee80211_channel *ch; |
| 61 | struct cfg80211_chan_def chandef; | 61 | struct cfg80211_chan_def chandef; |
| 62 | int i, subband_start; | 62 | int i, subband_start; |
| 63 | struct wiphy *wiphy = sdata->local->hw.wiphy; | ||
| 63 | 64 | ||
| 64 | for (i = start; i <= end; i += spacing) { | 65 | for (i = start; i <= end; i += spacing) { |
| 65 | if (!ch_cnt) | 66 | if (!ch_cnt) |
| @@ -70,9 +71,8 @@ ieee80211_tdls_add_subband(struct ieee80211_sub_if_data *sdata, | |||
| 70 | /* we will be active on the channel */ | 71 | /* we will be active on the channel */ |
| 71 | cfg80211_chandef_create(&chandef, ch, | 72 | cfg80211_chandef_create(&chandef, ch, |
| 72 | NL80211_CHAN_NO_HT); | 73 | NL80211_CHAN_NO_HT); |
| 73 | if (cfg80211_reg_can_beacon(sdata->local->hw.wiphy, | 74 | if (cfg80211_reg_can_beacon_relax(wiphy, &chandef, |
| 74 | &chandef, | 75 | sdata->wdev.iftype)) { |
| 75 | sdata->wdev.iftype)) { | ||
| 76 | ch_cnt++; | 76 | ch_cnt++; |
| 77 | /* | 77 | /* |
| 78 | * check if the next channel is also part of | 78 | * check if the next channel is also part of |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 8410bb3bf5e8..b8233505bf9f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1117,7 +1117,9 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx, | |||
| 1117 | queued = true; | 1117 | queued = true; |
| 1118 | info->control.vif = &tx->sdata->vif; | 1118 | info->control.vif = &tx->sdata->vif; |
| 1119 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; | 1119 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; |
| 1120 | info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS; | 1120 | info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS | |
| 1121 | IEEE80211_TX_CTL_NO_PS_BUFFER | | ||
| 1122 | IEEE80211_TX_STATUS_EOSP; | ||
| 1121 | __skb_queue_tail(&tid_tx->pending, skb); | 1123 | __skb_queue_tail(&tid_tx->pending, skb); |
| 1122 | if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER) | 1124 | if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER) |
| 1123 | purge_skb = __skb_dequeue(&tid_tx->pending); | 1125 | purge_skb = __skb_dequeue(&tid_tx->pending); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 9a0ae7172f92..d8e2e3918ce2 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -357,25 +357,52 @@ err1: | |||
| 357 | return NULL; | 357 | return NULL; |
| 358 | } | 358 | } |
| 359 | 359 | ||
| 360 | |||
| 361 | static void | ||
| 362 | __netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, bool tx_ring, void **pg_vec, | ||
| 363 | unsigned int order) | ||
| 364 | { | ||
| 365 | struct netlink_sock *nlk = nlk_sk(sk); | ||
| 366 | struct sk_buff_head *queue; | ||
| 367 | struct netlink_ring *ring; | ||
| 368 | |||
| 369 | queue = tx_ring ? &sk->sk_write_queue : &sk->sk_receive_queue; | ||
| 370 | ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; | ||
| 371 | |||
| 372 | spin_lock_bh(&queue->lock); | ||
| 373 | |||
| 374 | ring->frame_max = req->nm_frame_nr - 1; | ||
| 375 | ring->head = 0; | ||
| 376 | ring->frame_size = req->nm_frame_size; | ||
| 377 | ring->pg_vec_pages = req->nm_block_size / PAGE_SIZE; | ||
| 378 | |||
| 379 | swap(ring->pg_vec_len, req->nm_block_nr); | ||
| 380 | swap(ring->pg_vec_order, order); | ||
| 381 | swap(ring->pg_vec, pg_vec); | ||
| 382 | |||
| 383 | __skb_queue_purge(queue); | ||
| 384 | spin_unlock_bh(&queue->lock); | ||
| 385 | |||
| 386 | WARN_ON(atomic_read(&nlk->mapped)); | ||
| 387 | |||
| 388 | if (pg_vec) | ||
| 389 | free_pg_vec(pg_vec, order, req->nm_block_nr); | ||
| 390 | } | ||
| 391 | |||
| 360 | static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, | 392 | static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, |
| 361 | bool closing, bool tx_ring) | 393 | bool tx_ring) |
| 362 | { | 394 | { |
| 363 | struct netlink_sock *nlk = nlk_sk(sk); | 395 | struct netlink_sock *nlk = nlk_sk(sk); |
| 364 | struct netlink_ring *ring; | 396 | struct netlink_ring *ring; |
| 365 | struct sk_buff_head *queue; | ||
| 366 | void **pg_vec = NULL; | 397 | void **pg_vec = NULL; |
| 367 | unsigned int order = 0; | 398 | unsigned int order = 0; |
| 368 | int err; | ||
| 369 | 399 | ||
| 370 | ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; | 400 | ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; |
| 371 | queue = tx_ring ? &sk->sk_write_queue : &sk->sk_receive_queue; | ||
| 372 | 401 | ||
| 373 | if (!closing) { | 402 | if (atomic_read(&nlk->mapped)) |
| 374 | if (atomic_read(&nlk->mapped)) | 403 | return -EBUSY; |
| 375 | return -EBUSY; | 404 | if (atomic_read(&ring->pending)) |
| 376 | if (atomic_read(&ring->pending)) | 405 | return -EBUSY; |
| 377 | return -EBUSY; | ||
| 378 | } | ||
| 379 | 406 | ||
| 380 | if (req->nm_block_nr) { | 407 | if (req->nm_block_nr) { |
| 381 | if (ring->pg_vec != NULL) | 408 | if (ring->pg_vec != NULL) |
| @@ -407,31 +434,19 @@ static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, | |||
| 407 | return -EINVAL; | 434 | return -EINVAL; |
| 408 | } | 435 | } |
| 409 | 436 | ||
| 410 | err = -EBUSY; | ||
| 411 | mutex_lock(&nlk->pg_vec_lock); | 437 | mutex_lock(&nlk->pg_vec_lock); |
| 412 | if (closing || atomic_read(&nlk->mapped) == 0) { | 438 | if (atomic_read(&nlk->mapped) == 0) { |
| 413 | err = 0; | 439 | __netlink_set_ring(sk, req, tx_ring, pg_vec, order); |
| 414 | spin_lock_bh(&queue->lock); | 440 | mutex_unlock(&nlk->pg_vec_lock); |
| 415 | 441 | return 0; | |
| 416 | ring->frame_max = req->nm_frame_nr - 1; | ||
| 417 | ring->head = 0; | ||
| 418 | ring->frame_size = req->nm_frame_size; | ||
| 419 | ring->pg_vec_pages = req->nm_block_size / PAGE_SIZE; | ||
| 420 | |||
| 421 | swap(ring->pg_vec_len, req->nm_block_nr); | ||
| 422 | swap(ring->pg_vec_order, order); | ||
| 423 | swap(ring->pg_vec, pg_vec); | ||
| 424 | |||
| 425 | __skb_queue_purge(queue); | ||
| 426 | spin_unlock_bh(&queue->lock); | ||
| 427 | |||
| 428 | WARN_ON(atomic_read(&nlk->mapped)); | ||
| 429 | } | 442 | } |
| 443 | |||
| 430 | mutex_unlock(&nlk->pg_vec_lock); | 444 | mutex_unlock(&nlk->pg_vec_lock); |
| 431 | 445 | ||
| 432 | if (pg_vec) | 446 | if (pg_vec) |
| 433 | free_pg_vec(pg_vec, order, req->nm_block_nr); | 447 | free_pg_vec(pg_vec, order, req->nm_block_nr); |
| 434 | return err; | 448 | |
| 449 | return -EBUSY; | ||
| 435 | } | 450 | } |
| 436 | 451 | ||
| 437 | static void netlink_mm_open(struct vm_area_struct *vma) | 452 | static void netlink_mm_open(struct vm_area_struct *vma) |
| @@ -900,10 +915,10 @@ static void netlink_sock_destruct(struct sock *sk) | |||
| 900 | 915 | ||
| 901 | memset(&req, 0, sizeof(req)); | 916 | memset(&req, 0, sizeof(req)); |
| 902 | if (nlk->rx_ring.pg_vec) | 917 | if (nlk->rx_ring.pg_vec) |
| 903 | netlink_set_ring(sk, &req, true, false); | 918 | __netlink_set_ring(sk, &req, false, NULL, 0); |
| 904 | memset(&req, 0, sizeof(req)); | 919 | memset(&req, 0, sizeof(req)); |
| 905 | if (nlk->tx_ring.pg_vec) | 920 | if (nlk->tx_ring.pg_vec) |
| 906 | netlink_set_ring(sk, &req, true, true); | 921 | __netlink_set_ring(sk, &req, true, NULL, 0); |
| 907 | } | 922 | } |
| 908 | #endif /* CONFIG_NETLINK_MMAP */ | 923 | #endif /* CONFIG_NETLINK_MMAP */ |
| 909 | 924 | ||
| @@ -2223,7 +2238,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, | |||
| 2223 | return -EINVAL; | 2238 | return -EINVAL; |
| 2224 | if (copy_from_user(&req, optval, sizeof(req))) | 2239 | if (copy_from_user(&req, optval, sizeof(req))) |
| 2225 | return -EFAULT; | 2240 | return -EFAULT; |
| 2226 | err = netlink_set_ring(sk, &req, false, | 2241 | err = netlink_set_ring(sk, &req, |
| 2227 | optname == NETLINK_TX_RING); | 2242 | optname == NETLINK_TX_RING); |
| 2228 | break; | 2243 | break; |
| 2229 | } | 2244 | } |
diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c index 4613df8c8290..65523948fb95 100644 --- a/net/openvswitch/flow_table.c +++ b/net/openvswitch/flow_table.c | |||
| @@ -752,7 +752,7 @@ int ovs_flow_init(void) | |||
| 752 | BUILD_BUG_ON(sizeof(struct sw_flow_key) % sizeof(long)); | 752 | BUILD_BUG_ON(sizeof(struct sw_flow_key) % sizeof(long)); |
| 753 | 753 | ||
| 754 | flow_cache = kmem_cache_create("sw_flow", sizeof(struct sw_flow) | 754 | flow_cache = kmem_cache_create("sw_flow", sizeof(struct sw_flow) |
| 755 | + (num_possible_nodes() | 755 | + (nr_node_ids |
| 756 | * sizeof(struct flow_stats *)), | 756 | * sizeof(struct flow_stats *)), |
| 757 | 0, 0, NULL); | 757 | 0, 0, NULL); |
| 758 | if (flow_cache == NULL) | 758 | if (flow_cache == NULL) |
diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c index 1d56903fd4c7..1df78289e248 100644 --- a/net/sched/act_bpf.c +++ b/net/sched/act_bpf.c | |||
| @@ -339,6 +339,9 @@ static void tcf_bpf_cleanup(struct tc_action *act, int bind) | |||
| 339 | bpf_prog_put(prog->filter); | 339 | bpf_prog_put(prog->filter); |
| 340 | else | 340 | else |
| 341 | bpf_prog_destroy(prog->filter); | 341 | bpf_prog_destroy(prog->filter); |
| 342 | |||
| 343 | kfree(prog->bpf_ops); | ||
| 344 | kfree(prog->bpf_name); | ||
| 342 | } | 345 | } |
| 343 | 346 | ||
| 344 | static struct tc_action_ops act_bpf_ops __read_mostly = { | 347 | static struct tc_action_ops act_bpf_ops __read_mostly = { |
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index c79ecfd36e0f..e5168f8b9640 100644 --- a/net/sched/cls_bpf.c +++ b/net/sched/cls_bpf.c | |||
| @@ -378,7 +378,7 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, | |||
| 378 | goto errout; | 378 | goto errout; |
| 379 | 379 | ||
| 380 | if (oldprog) { | 380 | if (oldprog) { |
| 381 | list_replace_rcu(&prog->link, &oldprog->link); | 381 | list_replace_rcu(&oldprog->link, &prog->link); |
| 382 | tcf_unbind_filter(tp, &oldprog->res); | 382 | tcf_unbind_filter(tp, &oldprog->res); |
| 383 | call_rcu(&oldprog->rcu, __cls_bpf_delete_prog); | 383 | call_rcu(&oldprog->rcu, __cls_bpf_delete_prog); |
| 384 | } else { | 384 | } else { |
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c index 76bc3a20ffdb..bb2a0f529c1f 100644 --- a/net/sched/cls_flow.c +++ b/net/sched/cls_flow.c | |||
| @@ -425,6 +425,8 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, | |||
| 425 | if (!fnew) | 425 | if (!fnew) |
| 426 | goto err2; | 426 | goto err2; |
| 427 | 427 | ||
| 428 | tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); | ||
| 429 | |||
| 428 | fold = (struct flow_filter *)*arg; | 430 | fold = (struct flow_filter *)*arg; |
| 429 | if (fold) { | 431 | if (fold) { |
| 430 | err = -EINVAL; | 432 | err = -EINVAL; |
| @@ -486,7 +488,6 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, | |||
| 486 | fnew->mask = ~0U; | 488 | fnew->mask = ~0U; |
| 487 | fnew->tp = tp; | 489 | fnew->tp = tp; |
| 488 | get_random_bytes(&fnew->hashrnd, 4); | 490 | get_random_bytes(&fnew->hashrnd, 4); |
| 489 | tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); | ||
| 490 | } | 491 | } |
| 491 | 492 | ||
| 492 | fnew->perturb_timer.function = flow_perturbation; | 493 | fnew->perturb_timer.function = flow_perturbation; |
| @@ -526,7 +527,7 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, | |||
| 526 | if (*arg == 0) | 527 | if (*arg == 0) |
| 527 | list_add_tail_rcu(&fnew->list, &head->filters); | 528 | list_add_tail_rcu(&fnew->list, &head->filters); |
| 528 | else | 529 | else |
| 529 | list_replace_rcu(&fnew->list, &fold->list); | 530 | list_replace_rcu(&fold->list, &fnew->list); |
| 530 | 531 | ||
| 531 | *arg = (unsigned long)fnew; | 532 | *arg = (unsigned long)fnew; |
| 532 | 533 | ||
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index 9d37ccd95062..2f3d03f99487 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c | |||
| @@ -499,7 +499,7 @@ static int fl_change(struct net *net, struct sk_buff *in_skb, | |||
| 499 | *arg = (unsigned long) fnew; | 499 | *arg = (unsigned long) fnew; |
| 500 | 500 | ||
| 501 | if (fold) { | 501 | if (fold) { |
| 502 | list_replace_rcu(&fnew->list, &fold->list); | 502 | list_replace_rcu(&fold->list, &fnew->list); |
| 503 | tcf_unbind_filter(tp, &fold->res); | 503 | tcf_unbind_filter(tp, &fold->res); |
| 504 | call_rcu(&fold->rcu, fl_destroy_filter); | 504 | call_rcu(&fold->rcu, fl_destroy_filter); |
| 505 | } else { | 505 | } else { |
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c index d75993f89fac..21ca33c9f036 100644 --- a/net/sched/sch_fq_codel.c +++ b/net/sched/sch_fq_codel.c | |||
| @@ -155,14 +155,23 @@ static unsigned int fq_codel_drop(struct Qdisc *sch) | |||
| 155 | skb = dequeue_head(flow); | 155 | skb = dequeue_head(flow); |
| 156 | len = qdisc_pkt_len(skb); | 156 | len = qdisc_pkt_len(skb); |
| 157 | q->backlogs[idx] -= len; | 157 | q->backlogs[idx] -= len; |
| 158 | kfree_skb(skb); | ||
| 159 | sch->q.qlen--; | 158 | sch->q.qlen--; |
| 160 | qdisc_qstats_drop(sch); | 159 | qdisc_qstats_drop(sch); |
| 161 | qdisc_qstats_backlog_dec(sch, skb); | 160 | qdisc_qstats_backlog_dec(sch, skb); |
| 161 | kfree_skb(skb); | ||
| 162 | flow->dropped++; | 162 | flow->dropped++; |
| 163 | return idx; | 163 | return idx; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | static unsigned int fq_codel_qdisc_drop(struct Qdisc *sch) | ||
| 167 | { | ||
| 168 | unsigned int prev_backlog; | ||
| 169 | |||
| 170 | prev_backlog = sch->qstats.backlog; | ||
| 171 | fq_codel_drop(sch); | ||
| 172 | return prev_backlog - sch->qstats.backlog; | ||
| 173 | } | ||
| 174 | |||
| 166 | static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) | 175 | static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
| 167 | { | 176 | { |
| 168 | struct fq_codel_sched_data *q = qdisc_priv(sch); | 177 | struct fq_codel_sched_data *q = qdisc_priv(sch); |
| @@ -604,7 +613,7 @@ static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = { | |||
| 604 | .enqueue = fq_codel_enqueue, | 613 | .enqueue = fq_codel_enqueue, |
| 605 | .dequeue = fq_codel_dequeue, | 614 | .dequeue = fq_codel_dequeue, |
| 606 | .peek = qdisc_peek_dequeued, | 615 | .peek = qdisc_peek_dequeued, |
| 607 | .drop = fq_codel_drop, | 616 | .drop = fq_codel_qdisc_drop, |
| 608 | .init = fq_codel_init, | 617 | .init = fq_codel_init, |
| 609 | .reset = fq_codel_reset, | 618 | .reset = fq_codel_reset, |
| 610 | .destroy = fq_codel_destroy, | 619 | .destroy = fq_codel_destroy, |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 7d1492663360..52f75a5473e1 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
| @@ -306,10 +306,10 @@ drop: | |||
| 306 | len = qdisc_pkt_len(skb); | 306 | len = qdisc_pkt_len(skb); |
| 307 | slot->backlog -= len; | 307 | slot->backlog -= len; |
| 308 | sfq_dec(q, x); | 308 | sfq_dec(q, x); |
| 309 | kfree_skb(skb); | ||
| 310 | sch->q.qlen--; | 309 | sch->q.qlen--; |
| 311 | qdisc_qstats_drop(sch); | 310 | qdisc_qstats_drop(sch); |
| 312 | qdisc_qstats_backlog_dec(sch, skb); | 311 | qdisc_qstats_backlog_dec(sch, skb); |
| 312 | kfree_skb(skb); | ||
| 313 | return len; | 313 | return len; |
| 314 | } | 314 | } |
| 315 | 315 | ||
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index 915b328b9ac5..59cabc9bce69 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c | |||
| @@ -797,23 +797,18 @@ static bool cfg80211_ir_permissive_chan(struct wiphy *wiphy, | |||
| 797 | return false; | 797 | return false; |
| 798 | } | 798 | } |
| 799 | 799 | ||
| 800 | bool cfg80211_reg_can_beacon(struct wiphy *wiphy, | 800 | static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy, |
| 801 | struct cfg80211_chan_def *chandef, | 801 | struct cfg80211_chan_def *chandef, |
| 802 | enum nl80211_iftype iftype) | 802 | enum nl80211_iftype iftype, |
| 803 | bool check_no_ir) | ||
| 803 | { | 804 | { |
| 804 | bool res; | 805 | bool res; |
| 805 | u32 prohibited_flags = IEEE80211_CHAN_DISABLED | | 806 | u32 prohibited_flags = IEEE80211_CHAN_DISABLED | |
| 806 | IEEE80211_CHAN_RADAR; | 807 | IEEE80211_CHAN_RADAR; |
| 807 | 808 | ||
| 808 | trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype); | 809 | trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir); |
| 809 | 810 | ||
| 810 | /* | 811 | if (check_no_ir) |
| 811 | * Under certain conditions suggested by some regulatory bodies a | ||
| 812 | * GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag | ||
| 813 | * only if such relaxations are not enabled and the conditions are not | ||
| 814 | * met. | ||
| 815 | */ | ||
| 816 | if (!cfg80211_ir_permissive_chan(wiphy, iftype, chandef->chan)) | ||
| 817 | prohibited_flags |= IEEE80211_CHAN_NO_IR; | 812 | prohibited_flags |= IEEE80211_CHAN_NO_IR; |
| 818 | 813 | ||
| 819 | if (cfg80211_chandef_dfs_required(wiphy, chandef, iftype) > 0 && | 814 | if (cfg80211_chandef_dfs_required(wiphy, chandef, iftype) > 0 && |
| @@ -827,8 +822,36 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy, | |||
| 827 | trace_cfg80211_return_bool(res); | 822 | trace_cfg80211_return_bool(res); |
| 828 | return res; | 823 | return res; |
| 829 | } | 824 | } |
| 825 | |||
| 826 | bool cfg80211_reg_can_beacon(struct wiphy *wiphy, | ||
| 827 | struct cfg80211_chan_def *chandef, | ||
| 828 | enum nl80211_iftype iftype) | ||
| 829 | { | ||
| 830 | return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, true); | ||
| 831 | } | ||
| 830 | EXPORT_SYMBOL(cfg80211_reg_can_beacon); | 832 | EXPORT_SYMBOL(cfg80211_reg_can_beacon); |
| 831 | 833 | ||
| 834 | bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, | ||
| 835 | struct cfg80211_chan_def *chandef, | ||
| 836 | enum nl80211_iftype iftype) | ||
| 837 | { | ||
| 838 | bool check_no_ir; | ||
| 839 | |||
| 840 | ASSERT_RTNL(); | ||
| 841 | |||
| 842 | /* | ||
| 843 | * Under certain conditions suggested by some regulatory bodies a | ||
| 844 | * GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag | ||
| 845 | * only if such relaxations are not enabled and the conditions are not | ||
| 846 | * met. | ||
| 847 | */ | ||
| 848 | check_no_ir = !cfg80211_ir_permissive_chan(wiphy, iftype, | ||
| 849 | chandef->chan); | ||
| 850 | |||
| 851 | return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir); | ||
| 852 | } | ||
| 853 | EXPORT_SYMBOL(cfg80211_reg_can_beacon_relax); | ||
| 854 | |||
| 832 | int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, | 855 | int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, |
| 833 | struct cfg80211_chan_def *chandef) | 856 | struct cfg80211_chan_def *chandef) |
| 834 | { | 857 | { |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index c264effd00a6..76b41578a838 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -2003,7 +2003,8 @@ static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, | |||
| 2003 | switch (iftype) { | 2003 | switch (iftype) { |
| 2004 | case NL80211_IFTYPE_AP: | 2004 | case NL80211_IFTYPE_AP: |
| 2005 | case NL80211_IFTYPE_P2P_GO: | 2005 | case NL80211_IFTYPE_P2P_GO: |
| 2006 | if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, iftype)) { | 2006 | if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, |
| 2007 | iftype)) { | ||
| 2007 | result = -EINVAL; | 2008 | result = -EINVAL; |
| 2008 | break; | 2009 | break; |
| 2009 | } | 2010 | } |
| @@ -3403,8 +3404,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) | |||
| 3403 | } else if (!nl80211_get_ap_channel(rdev, ¶ms)) | 3404 | } else if (!nl80211_get_ap_channel(rdev, ¶ms)) |
| 3404 | return -EINVAL; | 3405 | return -EINVAL; |
| 3405 | 3406 | ||
| 3406 | if (!cfg80211_reg_can_beacon(&rdev->wiphy, ¶ms.chandef, | 3407 | if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, |
| 3407 | wdev->iftype)) | 3408 | wdev->iftype)) |
| 3408 | return -EINVAL; | 3409 | return -EINVAL; |
| 3409 | 3410 | ||
| 3410 | if (info->attrs[NL80211_ATTR_ACL_POLICY]) { | 3411 | if (info->attrs[NL80211_ATTR_ACL_POLICY]) { |
| @@ -6492,8 +6493,8 @@ skip_beacons: | |||
| 6492 | if (err) | 6493 | if (err) |
| 6493 | return err; | 6494 | return err; |
| 6494 | 6495 | ||
| 6495 | if (!cfg80211_reg_can_beacon(&rdev->wiphy, ¶ms.chandef, | 6496 | if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, |
| 6496 | wdev->iftype)) | 6497 | wdev->iftype)) |
| 6497 | return -EINVAL; | 6498 | return -EINVAL; |
| 6498 | 6499 | ||
| 6499 | err = cfg80211_chandef_dfs_required(wdev->wiphy, | 6500 | err = cfg80211_chandef_dfs_required(wdev->wiphy, |
| @@ -10170,7 +10171,8 @@ static int nl80211_tdls_channel_switch(struct sk_buff *skb, | |||
| 10170 | return -EINVAL; | 10171 | return -EINVAL; |
| 10171 | 10172 | ||
| 10172 | /* we will be active on the TDLS link */ | 10173 | /* we will be active on the TDLS link */ |
| 10173 | if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, wdev->iftype)) | 10174 | if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, |
| 10175 | wdev->iftype)) | ||
| 10174 | return -EINVAL; | 10176 | return -EINVAL; |
| 10175 | 10177 | ||
| 10176 | /* don't allow switching to DFS channels */ | 10178 | /* don't allow switching to DFS channels */ |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index d359e0610198..aa2d75482017 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -544,15 +544,15 @@ static int call_crda(const char *alpha2) | |||
| 544 | reg_regdb_query(alpha2); | 544 | reg_regdb_query(alpha2); |
| 545 | 545 | ||
| 546 | if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) { | 546 | if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) { |
| 547 | pr_info("Exceeded CRDA call max attempts. Not calling CRDA\n"); | 547 | pr_debug("Exceeded CRDA call max attempts. Not calling CRDA\n"); |
| 548 | return -EINVAL; | 548 | return -EINVAL; |
| 549 | } | 549 | } |
| 550 | 550 | ||
| 551 | if (!is_world_regdom((char *) alpha2)) | 551 | if (!is_world_regdom((char *) alpha2)) |
| 552 | pr_info("Calling CRDA for country: %c%c\n", | 552 | pr_debug("Calling CRDA for country: %c%c\n", |
| 553 | alpha2[0], alpha2[1]); | 553 | alpha2[0], alpha2[1]); |
| 554 | else | 554 | else |
| 555 | pr_info("Calling CRDA to update world regulatory domain\n"); | 555 | pr_debug("Calling CRDA to update world regulatory domain\n"); |
| 556 | 556 | ||
| 557 | return kobject_uevent_env(®_pdev->dev.kobj, KOBJ_CHANGE, env); | 557 | return kobject_uevent_env(®_pdev->dev.kobj, KOBJ_CHANGE, env); |
| 558 | } | 558 | } |
| @@ -1589,7 +1589,7 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
| 1589 | case NL80211_IFTYPE_AP: | 1589 | case NL80211_IFTYPE_AP: |
| 1590 | case NL80211_IFTYPE_P2P_GO: | 1590 | case NL80211_IFTYPE_P2P_GO: |
| 1591 | case NL80211_IFTYPE_ADHOC: | 1591 | case NL80211_IFTYPE_ADHOC: |
| 1592 | return cfg80211_reg_can_beacon(wiphy, &chandef, iftype); | 1592 | return cfg80211_reg_can_beacon_relax(wiphy, &chandef, iftype); |
| 1593 | case NL80211_IFTYPE_STATION: | 1593 | case NL80211_IFTYPE_STATION: |
| 1594 | case NL80211_IFTYPE_P2P_CLIENT: | 1594 | case NL80211_IFTYPE_P2P_CLIENT: |
| 1595 | return cfg80211_chandef_usable(wiphy, &chandef, | 1595 | return cfg80211_chandef_usable(wiphy, &chandef, |
diff --git a/net/wireless/trace.h b/net/wireless/trace.h index af3617c9879e..a808279a432a 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h | |||
| @@ -2358,20 +2358,23 @@ TRACE_EVENT(cfg80211_cqm_rssi_notify, | |||
| 2358 | 2358 | ||
| 2359 | TRACE_EVENT(cfg80211_reg_can_beacon, | 2359 | TRACE_EVENT(cfg80211_reg_can_beacon, |
| 2360 | TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, | 2360 | TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, |
| 2361 | enum nl80211_iftype iftype), | 2361 | enum nl80211_iftype iftype, bool check_no_ir), |
| 2362 | TP_ARGS(wiphy, chandef, iftype), | 2362 | TP_ARGS(wiphy, chandef, iftype, check_no_ir), |
| 2363 | TP_STRUCT__entry( | 2363 | TP_STRUCT__entry( |
| 2364 | WIPHY_ENTRY | 2364 | WIPHY_ENTRY |
| 2365 | CHAN_DEF_ENTRY | 2365 | CHAN_DEF_ENTRY |
| 2366 | __field(enum nl80211_iftype, iftype) | 2366 | __field(enum nl80211_iftype, iftype) |
| 2367 | __field(bool, check_no_ir) | ||
| 2367 | ), | 2368 | ), |
| 2368 | TP_fast_assign( | 2369 | TP_fast_assign( |
| 2369 | WIPHY_ASSIGN; | 2370 | WIPHY_ASSIGN; |
| 2370 | CHAN_DEF_ASSIGN(chandef); | 2371 | CHAN_DEF_ASSIGN(chandef); |
| 2371 | __entry->iftype = iftype; | 2372 | __entry->iftype = iftype; |
| 2373 | __entry->check_no_ir = check_no_ir; | ||
| 2372 | ), | 2374 | ), |
| 2373 | TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", iftype=%d", | 2375 | TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", iftype=%d check_no_ir=%s", |
| 2374 | WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->iftype) | 2376 | WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->iftype, |
| 2377 | BOOL_TO_STR(__entry->check_no_ir)) | ||
| 2375 | ); | 2378 | ); |
| 2376 | 2379 | ||
| 2377 | TRACE_EVENT(cfg80211_chandef_dfs_required, | 2380 | TRACE_EVENT(cfg80211_chandef_dfs_required, |
