diff options
author | David S. Miller <davem@davemloft.net> | 2014-04-24 13:19:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-24 13:19:00 -0400 |
commit | 4366004d77278a90c18f92f7cb9ec0c264da563d (patch) | |
tree | 4fb046b6b06cc681f791a8ddf7507b5f8eb99be8 | |
parent | e9f0fb88493570200b8dc1cc02d3e676412d25bc (diff) | |
parent | a450a685791d12c0a477b75d630d6ae66acab9a7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/ethernet/intel/igb/e1000_mac.c
net/core/filter.c
Both conflicts were simple overlapping changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
29 files changed, 157 insertions, 158 deletions
diff --git a/Documentation/networking/scaling.txt b/Documentation/networking/scaling.txt index ca6977f5b2ed..99ca40e8e810 100644 --- a/Documentation/networking/scaling.txt +++ b/Documentation/networking/scaling.txt | |||
@@ -429,7 +429,7 @@ RPS and RFS were introduced in kernel 2.6.35. XPS was incorporated into | |||
429 | (therbert@google.com) | 429 | (therbert@google.com) |
430 | 430 | ||
431 | Accelerated RFS was introduced in 2.6.35. Original patches were | 431 | Accelerated RFS was introduced in 2.6.35. Original patches were |
432 | submitted by Ben Hutchings (bhutchings@solarflare.com) | 432 | submitted by Ben Hutchings (bwh@kernel.org) |
433 | 433 | ||
434 | Authors: | 434 | Authors: |
435 | Tom Herbert (therbert@google.com) | 435 | Tom Herbert (therbert@google.com) |
diff --git a/MAINTAINERS b/MAINTAINERS index e67ea2442041..1241a73cc230 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -7674,7 +7674,6 @@ F: drivers/clk/samsung/ | |||
7674 | SAMSUNG SXGBE DRIVERS | 7674 | SAMSUNG SXGBE DRIVERS |
7675 | M: Byungho An <bh74.an@samsung.com> | 7675 | M: Byungho An <bh74.an@samsung.com> |
7676 | M: Girish K S <ks.giri@samsung.com> | 7676 | M: Girish K S <ks.giri@samsung.com> |
7677 | M: Siva Reddy Kallam <siva.kallam@samsung.com> | ||
7678 | M: Vipul Pandya <vipul.pandya@samsung.com> | 7677 | M: Vipul Pandya <vipul.pandya@samsung.com> |
7679 | S: Supported | 7678 | S: Supported |
7680 | L: netdev@vger.kernel.org | 7679 | L: netdev@vger.kernel.org |
diff --git a/drivers/isdn/hisax/icc.c b/drivers/isdn/hisax/icc.c index 51dae9167238..96d1df05044f 100644 --- a/drivers/isdn/hisax/icc.c +++ b/drivers/isdn/hisax/icc.c | |||
@@ -425,7 +425,7 @@ afterXPR: | |||
425 | if (cs->debug & L1_DEB_MONITOR) | 425 | if (cs->debug & L1_DEB_MONITOR) |
426 | debugl1(cs, "ICC %02x -> MOX1", cs->dc.icc.mon_tx[cs->dc.icc.mon_txp - 1]); | 426 | debugl1(cs, "ICC %02x -> MOX1", cs->dc.icc.mon_tx[cs->dc.icc.mon_txp - 1]); |
427 | } | 427 | } |
428 | AfterMOX1: | 428 | AfterMOX1: ; |
429 | #endif | 429 | #endif |
430 | } | 430 | } |
431 | } | 431 | } |
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c index eeecc29cf5b7..9f45782819ec 100644 --- a/drivers/net/ethernet/arc/emac_main.c +++ b/drivers/net/ethernet/arc/emac_main.c | |||
@@ -574,6 +574,18 @@ static int arc_emac_tx(struct sk_buff *skb, struct net_device *ndev) | |||
574 | return NETDEV_TX_OK; | 574 | return NETDEV_TX_OK; |
575 | } | 575 | } |
576 | 576 | ||
577 | static void arc_emac_set_address_internal(struct net_device *ndev) | ||
578 | { | ||
579 | struct arc_emac_priv *priv = netdev_priv(ndev); | ||
580 | unsigned int addr_low, addr_hi; | ||
581 | |||
582 | addr_low = le32_to_cpu(*(__le32 *) &ndev->dev_addr[0]); | ||
583 | addr_hi = le16_to_cpu(*(__le16 *) &ndev->dev_addr[4]); | ||
584 | |||
585 | arc_reg_set(priv, R_ADDRL, addr_low); | ||
586 | arc_reg_set(priv, R_ADDRH, addr_hi); | ||
587 | } | ||
588 | |||
577 | /** | 589 | /** |
578 | * arc_emac_set_address - Set the MAC address for this device. | 590 | * arc_emac_set_address - Set the MAC address for this device. |
579 | * @ndev: Pointer to net_device structure. | 591 | * @ndev: Pointer to net_device structure. |
@@ -587,9 +599,7 @@ static int arc_emac_tx(struct sk_buff *skb, struct net_device *ndev) | |||
587 | */ | 599 | */ |
588 | static int arc_emac_set_address(struct net_device *ndev, void *p) | 600 | static int arc_emac_set_address(struct net_device *ndev, void *p) |
589 | { | 601 | { |
590 | struct arc_emac_priv *priv = netdev_priv(ndev); | ||
591 | struct sockaddr *addr = p; | 602 | struct sockaddr *addr = p; |
592 | unsigned int addr_low, addr_hi; | ||
593 | 603 | ||
594 | if (netif_running(ndev)) | 604 | if (netif_running(ndev)) |
595 | return -EBUSY; | 605 | return -EBUSY; |
@@ -599,11 +609,7 @@ static int arc_emac_set_address(struct net_device *ndev, void *p) | |||
599 | 609 | ||
600 | memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len); | 610 | memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len); |
601 | 611 | ||
602 | addr_low = le32_to_cpu(*(__le32 *) &ndev->dev_addr[0]); | 612 | arc_emac_set_address_internal(ndev); |
603 | addr_hi = le16_to_cpu(*(__le16 *) &ndev->dev_addr[4]); | ||
604 | |||
605 | arc_reg_set(priv, R_ADDRL, addr_low); | ||
606 | arc_reg_set(priv, R_ADDRH, addr_hi); | ||
607 | 613 | ||
608 | return 0; | 614 | return 0; |
609 | } | 615 | } |
@@ -713,6 +719,7 @@ static int arc_emac_probe(struct platform_device *pdev) | |||
713 | else | 719 | else |
714 | eth_hw_addr_random(ndev); | 720 | eth_hw_addr_random(ndev); |
715 | 721 | ||
722 | arc_emac_set_address_internal(ndev); | ||
716 | dev_info(&pdev->dev, "MAC address is now %pM\n", ndev->dev_addr); | 723 | dev_info(&pdev->dev, "MAC address is now %pM\n", ndev->dev_addr); |
717 | 724 | ||
718 | /* Do 1 allocation instead of 2 separate ones for Rx and Tx BD rings */ | 725 | /* Do 1 allocation instead of 2 separate ones for Rx and Tx BD rings */ |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 1d32c9742461..e4207efd13f8 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -1167,7 +1167,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work) | |||
1167 | dev_kfree_skb_any(adapter->tx_hwtstamp_skb); | 1167 | dev_kfree_skb_any(adapter->tx_hwtstamp_skb); |
1168 | adapter->tx_hwtstamp_skb = NULL; | 1168 | adapter->tx_hwtstamp_skb = NULL; |
1169 | adapter->tx_hwtstamp_timeouts++; | 1169 | adapter->tx_hwtstamp_timeouts++; |
1170 | e_warn("clearing Tx timestamp hang"); | 1170 | e_warn("clearing Tx timestamp hang\n"); |
1171 | } else { | 1171 | } else { |
1172 | /* reschedule to check later */ | 1172 | /* reschedule to check later */ |
1173 | schedule_work(&adapter->tx_hwtstamp_work); | 1173 | schedule_work(&adapter->tx_hwtstamp_work); |
@@ -5698,7 +5698,7 @@ struct rtnl_link_stats64 *e1000e_get_stats64(struct net_device *netdev, | |||
5698 | static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | 5698 | static int e1000_change_mtu(struct net_device *netdev, int new_mtu) |
5699 | { | 5699 | { |
5700 | struct e1000_adapter *adapter = netdev_priv(netdev); | 5700 | struct e1000_adapter *adapter = netdev_priv(netdev); |
5701 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; | 5701 | int max_frame = new_mtu + VLAN_HLEN + ETH_HLEN + ETH_FCS_LEN; |
5702 | 5702 | ||
5703 | /* Jumbo frame support */ | 5703 | /* Jumbo frame support */ |
5704 | if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) && | 5704 | if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) && |
@@ -6247,6 +6247,7 @@ static int __e1000_resume(struct pci_dev *pdev) | |||
6247 | return 0; | 6247 | return 0; |
6248 | } | 6248 | } |
6249 | 6249 | ||
6250 | #ifdef CONFIG_PM_SLEEP | ||
6250 | static int e1000e_pm_thaw(struct device *dev) | 6251 | static int e1000e_pm_thaw(struct device *dev) |
6251 | { | 6252 | { |
6252 | struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); | 6253 | struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); |
@@ -6267,7 +6268,6 @@ static int e1000e_pm_thaw(struct device *dev) | |||
6267 | return 0; | 6268 | return 0; |
6268 | } | 6269 | } |
6269 | 6270 | ||
6270 | #ifdef CONFIG_PM_SLEEP | ||
6271 | static int e1000e_pm_suspend(struct device *dev) | 6271 | static int e1000e_pm_suspend(struct device *dev) |
6272 | { | 6272 | { |
6273 | struct pci_dev *pdev = to_pci_dev(dev); | 6273 | struct pci_dev *pdev = to_pci_dev(dev); |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 0c69851eaecc..4fe15d58adfa 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -4267,6 +4267,14 @@ static int i40e_open(struct net_device *netdev) | |||
4267 | if (err) | 4267 | if (err) |
4268 | return err; | 4268 | return err; |
4269 | 4269 | ||
4270 | /* configure global TSO hardware offload settings */ | ||
4271 | wr32(&pf->hw, I40E_GLLAN_TSOMSK_F, be32_to_cpu(TCP_FLAG_PSH | | ||
4272 | TCP_FLAG_FIN) >> 16); | ||
4273 | wr32(&pf->hw, I40E_GLLAN_TSOMSK_M, be32_to_cpu(TCP_FLAG_PSH | | ||
4274 | TCP_FLAG_FIN | | ||
4275 | TCP_FLAG_CWR) >> 16); | ||
4276 | wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); | ||
4277 | |||
4270 | #ifdef CONFIG_I40E_VXLAN | 4278 | #ifdef CONFIG_I40E_VXLAN |
4271 | vxlan_get_rx_port(netdev); | 4279 | vxlan_get_rx_port(netdev); |
4272 | #endif | 4280 | #endif |
@@ -6767,6 +6775,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi) | |||
6767 | NETIF_F_HW_VLAN_CTAG_FILTER | | 6775 | NETIF_F_HW_VLAN_CTAG_FILTER | |
6768 | NETIF_F_IPV6_CSUM | | 6776 | NETIF_F_IPV6_CSUM | |
6769 | NETIF_F_TSO | | 6777 | NETIF_F_TSO | |
6778 | NETIF_F_TSO_ECN | | ||
6770 | NETIF_F_TSO6 | | 6779 | NETIF_F_TSO6 | |
6771 | NETIF_F_RXCSUM | | 6780 | NETIF_F_RXCSUM | |
6772 | NETIF_F_NTUPLE | | 6781 | NETIF_F_NTUPLE | |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_nvm.c b/drivers/net/ethernet/intel/i40e/i40e_nvm.c index 262bdf11d221..81299189a47d 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_nvm.c +++ b/drivers/net/ethernet/intel/i40e/i40e_nvm.c | |||
@@ -160,7 +160,7 @@ static i40e_status i40e_poll_sr_srctl_done_bit(struct i40e_hw *hw) | |||
160 | udelay(5); | 160 | udelay(5); |
161 | } | 161 | } |
162 | if (ret_code == I40E_ERR_TIMEOUT) | 162 | if (ret_code == I40E_ERR_TIMEOUT) |
163 | hw_dbg(hw, "Done bit in GLNVM_SRCTL not set"); | 163 | hw_dbg(hw, "Done bit in GLNVM_SRCTL not set\n"); |
164 | return ret_code; | 164 | return ret_code; |
165 | } | 165 | } |
166 | 166 | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c index e33ec6c842b7..e61e63720800 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c | |||
@@ -239,7 +239,7 @@ static void i40e_ptp_tx_work(struct work_struct *work) | |||
239 | dev_kfree_skb_any(pf->ptp_tx_skb); | 239 | dev_kfree_skb_any(pf->ptp_tx_skb); |
240 | pf->ptp_tx_skb = NULL; | 240 | pf->ptp_tx_skb = NULL; |
241 | pf->tx_hwtstamp_timeouts++; | 241 | pf->tx_hwtstamp_timeouts++; |
242 | dev_warn(&pf->pdev->dev, "clearing Tx timestamp hang"); | 242 | dev_warn(&pf->pdev->dev, "clearing Tx timestamp hang\n"); |
243 | return; | 243 | return; |
244 | } | 244 | } |
245 | 245 | ||
@@ -321,7 +321,7 @@ void i40e_ptp_rx_hang(struct i40e_vsi *vsi) | |||
321 | pf->last_rx_ptp_check = jiffies; | 321 | pf->last_rx_ptp_check = jiffies; |
322 | pf->rx_hwtstamp_cleared++; | 322 | pf->rx_hwtstamp_cleared++; |
323 | dev_warn(&vsi->back->pdev->dev, | 323 | dev_warn(&vsi->back->pdev->dev, |
324 | "%s: clearing Rx timestamp hang", | 324 | "%s: clearing Rx timestamp hang\n", |
325 | __func__); | 325 | __func__); |
326 | } | 326 | } |
327 | } | 327 | } |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 0f5d96ad281d..9478ddc66caf 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
@@ -418,7 +418,7 @@ int i40e_add_del_fdir(struct i40e_vsi *vsi, | |||
418 | } | 418 | } |
419 | break; | 419 | break; |
420 | default: | 420 | default: |
421 | dev_info(&pf->pdev->dev, "Could not specify spec type %d", | 421 | dev_info(&pf->pdev->dev, "Could not specify spec type %d\n", |
422 | input->flow_type); | 422 | input->flow_type); |
423 | ret = -EINVAL; | 423 | ret = -EINVAL; |
424 | } | 424 | } |
@@ -478,7 +478,7 @@ static void i40e_fd_handle_status(struct i40e_ring *rx_ring, | |||
478 | pf->flags |= I40E_FLAG_FDIR_REQUIRES_REINIT; | 478 | pf->flags |= I40E_FLAG_FDIR_REQUIRES_REINIT; |
479 | } | 479 | } |
480 | } else { | 480 | } else { |
481 | dev_info(&pdev->dev, "FD filter programming error"); | 481 | dev_info(&pdev->dev, "FD filter programming error\n"); |
482 | } | 482 | } |
483 | } else if (error == | 483 | } else if (error == |
484 | (0x1 << I40E_RX_PROG_STATUS_DESC_NO_FD_ENTRY_SHIFT)) { | 484 | (0x1 << I40E_RX_PROG_STATUS_DESC_NO_FD_ENTRY_SHIFT)) { |
@@ -1713,9 +1713,11 @@ static int i40e_tx_prepare_vlan_flags(struct sk_buff *skb, | |||
1713 | I40E_TX_FLAGS_VLAN_PRIO_SHIFT; | 1713 | I40E_TX_FLAGS_VLAN_PRIO_SHIFT; |
1714 | if (tx_flags & I40E_TX_FLAGS_SW_VLAN) { | 1714 | if (tx_flags & I40E_TX_FLAGS_SW_VLAN) { |
1715 | struct vlan_ethhdr *vhdr; | 1715 | struct vlan_ethhdr *vhdr; |
1716 | if (skb_header_cloned(skb) && | 1716 | int rc; |
1717 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | 1717 | |
1718 | return -ENOMEM; | 1718 | rc = skb_cow_head(skb, 0); |
1719 | if (rc < 0) | ||
1720 | return rc; | ||
1719 | vhdr = (struct vlan_ethhdr *)skb->data; | 1721 | vhdr = (struct vlan_ethhdr *)skb->data; |
1720 | vhdr->h_vlan_TCI = htons(tx_flags >> | 1722 | vhdr->h_vlan_TCI = htons(tx_flags >> |
1721 | I40E_TX_FLAGS_VLAN_SHIFT); | 1723 | I40E_TX_FLAGS_VLAN_SHIFT); |
@@ -1743,20 +1745,18 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb, | |||
1743 | u64 *cd_type_cmd_tso_mss, u32 *cd_tunneling) | 1745 | u64 *cd_type_cmd_tso_mss, u32 *cd_tunneling) |
1744 | { | 1746 | { |
1745 | u32 cd_cmd, cd_tso_len, cd_mss; | 1747 | u32 cd_cmd, cd_tso_len, cd_mss; |
1748 | struct ipv6hdr *ipv6h; | ||
1746 | struct tcphdr *tcph; | 1749 | struct tcphdr *tcph; |
1747 | struct iphdr *iph; | 1750 | struct iphdr *iph; |
1748 | u32 l4len; | 1751 | u32 l4len; |
1749 | int err; | 1752 | int err; |
1750 | struct ipv6hdr *ipv6h; | ||
1751 | 1753 | ||
1752 | if (!skb_is_gso(skb)) | 1754 | if (!skb_is_gso(skb)) |
1753 | return 0; | 1755 | return 0; |
1754 | 1756 | ||
1755 | if (skb_header_cloned(skb)) { | 1757 | err = skb_cow_head(skb, 0); |
1756 | err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); | 1758 | if (err < 0) |
1757 | if (err) | 1759 | return err; |
1758 | return err; | ||
1759 | } | ||
1760 | 1760 | ||
1761 | if (protocol == htons(ETH_P_IP)) { | 1761 | if (protocol == htons(ETH_P_IP)) { |
1762 | iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); | 1762 | iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); |
diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.c b/drivers/net/ethernet/intel/igb/e1000_i210.c index db963397cc27..f67f8a170b90 100644 --- a/drivers/net/ethernet/intel/igb/e1000_i210.c +++ b/drivers/net/ethernet/intel/igb/e1000_i210.c | |||
@@ -365,7 +365,7 @@ static s32 igb_read_invm_word_i210(struct e1000_hw *hw, u8 address, u16 *data) | |||
365 | word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword); | 365 | word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword); |
366 | if (word_address == address) { | 366 | if (word_address == address) { |
367 | *data = INVM_DWORD_TO_WORD_DATA(invm_dword); | 367 | *data = INVM_DWORD_TO_WORD_DATA(invm_dword); |
368 | hw_dbg("Read INVM Word 0x%02x = %x", | 368 | hw_dbg("Read INVM Word 0x%02x = %x\n", |
369 | address, *data); | 369 | address, *data); |
370 | status = E1000_SUCCESS; | 370 | status = E1000_SUCCESS; |
371 | break; | 371 | break; |
diff --git a/drivers/net/ethernet/intel/igb/e1000_mac.c b/drivers/net/ethernet/intel/igb/e1000_mac.c index c0c5fc35165b..42e42a93a4b5 100644 --- a/drivers/net/ethernet/intel/igb/e1000_mac.c +++ b/drivers/net/ethernet/intel/igb/e1000_mac.c | |||
@@ -928,10 +928,10 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw) | |||
928 | */ | 928 | */ |
929 | if (hw->fc.requested_mode == e1000_fc_full) { | 929 | if (hw->fc.requested_mode == e1000_fc_full) { |
930 | hw->fc.current_mode = e1000_fc_full; | 930 | hw->fc.current_mode = e1000_fc_full; |
931 | hw_dbg("Flow Control = FULL.\r\n"); | 931 | hw_dbg("Flow Control = FULL.\n"); |
932 | } else { | 932 | } else { |
933 | hw->fc.current_mode = e1000_fc_rx_pause; | 933 | hw->fc.current_mode = e1000_fc_rx_pause; |
934 | hw_dbg("Flow Control = RX PAUSE frames only.\r\n"); | 934 | hw_dbg("Flow Control = RX PAUSE frames only.\n"); |
935 | } | 935 | } |
936 | } | 936 | } |
937 | /* For receiving PAUSE frames ONLY. | 937 | /* For receiving PAUSE frames ONLY. |
@@ -946,7 +946,7 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw) | |||
946 | (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && | 946 | (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && |
947 | (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { | 947 | (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { |
948 | hw->fc.current_mode = e1000_fc_tx_pause; | 948 | hw->fc.current_mode = e1000_fc_tx_pause; |
949 | hw_dbg("Flow Control = TX PAUSE frames only.\r\n"); | 949 | hw_dbg("Flow Control = TX PAUSE frames only.\n"); |
950 | } | 950 | } |
951 | /* For transmitting PAUSE frames ONLY. | 951 | /* For transmitting PAUSE frames ONLY. |
952 | * | 952 | * |
@@ -960,7 +960,7 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw) | |||
960 | !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && | 960 | !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && |
961 | (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { | 961 | (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { |
962 | hw->fc.current_mode = e1000_fc_rx_pause; | 962 | hw->fc.current_mode = e1000_fc_rx_pause; |
963 | hw_dbg("Flow Control = RX PAUSE frames only.\r\n"); | 963 | hw_dbg("Flow Control = RX PAUSE frames only.\n"); |
964 | } | 964 | } |
965 | /* Per the IEEE spec, at this point flow control should be | 965 | /* Per the IEEE spec, at this point flow control should be |
966 | * disabled. However, we want to consider that we could | 966 | * disabled. However, we want to consider that we could |
@@ -986,10 +986,10 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw) | |||
986 | (hw->fc.requested_mode == e1000_fc_tx_pause) || | 986 | (hw->fc.requested_mode == e1000_fc_tx_pause) || |
987 | (hw->fc.strict_ieee)) { | 987 | (hw->fc.strict_ieee)) { |
988 | hw->fc.current_mode = e1000_fc_none; | 988 | hw->fc.current_mode = e1000_fc_none; |
989 | hw_dbg("Flow Control = NONE.\r\n"); | 989 | hw_dbg("Flow Control = NONE.\n"); |
990 | } else { | 990 | } else { |
991 | hw->fc.current_mode = e1000_fc_rx_pause; | 991 | hw->fc.current_mode = e1000_fc_rx_pause; |
992 | hw_dbg("Flow Control = RX PAUSE frames only.\r\n"); | 992 | hw_dbg("Flow Control = RX PAUSE frames only.\n"); |
993 | } | 993 | } |
994 | 994 | ||
995 | /* Now we need to do one last check... If we auto- | 995 | /* Now we need to do one last check... If we auto- |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 642e09f7fa37..50cfe7db3b12 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -5193,8 +5193,10 @@ void igb_update_stats(struct igb_adapter *adapter, | |||
5193 | 5193 | ||
5194 | rcu_read_lock(); | 5194 | rcu_read_lock(); |
5195 | for (i = 0; i < adapter->num_rx_queues; i++) { | 5195 | for (i = 0; i < adapter->num_rx_queues; i++) { |
5196 | u32 rqdpc = rd32(E1000_RQDPC(i)); | ||
5197 | struct igb_ring *ring = adapter->rx_ring[i]; | 5196 | struct igb_ring *ring = adapter->rx_ring[i]; |
5197 | u32 rqdpc = rd32(E1000_RQDPC(i)); | ||
5198 | if (hw->mac.type >= e1000_i210) | ||
5199 | wr32(E1000_RQDPC(i), 0); | ||
5198 | 5200 | ||
5199 | if (rqdpc) { | 5201 | if (rqdpc) { |
5200 | ring->rx_stats.drops += rqdpc; | 5202 | ring->rx_stats.drops += rqdpc; |
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c index 9209d652e1c9..ab25e49365f7 100644 --- a/drivers/net/ethernet/intel/igb/igb_ptp.c +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c | |||
@@ -389,7 +389,7 @@ static void igb_ptp_tx_work(struct work_struct *work) | |||
389 | adapter->ptp_tx_skb = NULL; | 389 | adapter->ptp_tx_skb = NULL; |
390 | clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); | 390 | clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state); |
391 | adapter->tx_hwtstamp_timeouts++; | 391 | adapter->tx_hwtstamp_timeouts++; |
392 | dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang"); | 392 | dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n"); |
393 | return; | 393 | return; |
394 | } | 394 | } |
395 | 395 | ||
@@ -451,7 +451,7 @@ void igb_ptp_rx_hang(struct igb_adapter *adapter) | |||
451 | rd32(E1000_RXSTMPH); | 451 | rd32(E1000_RXSTMPH); |
452 | adapter->last_rx_ptp_check = jiffies; | 452 | adapter->last_rx_ptp_check = jiffies; |
453 | adapter->rx_hwtstamp_cleared++; | 453 | adapter->rx_hwtstamp_cleared++; |
454 | dev_warn(&adapter->pdev->dev, "clearing Rx timestamp hang"); | 454 | dev_warn(&adapter->pdev->dev, "clearing Rx timestamp hang\n"); |
455 | } | 455 | } |
456 | } | 456 | } |
457 | 457 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 0975742ca7ec..c688c8a4c063 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
@@ -255,7 +255,6 @@ struct ixgbe_ring { | |||
255 | struct ixgbe_tx_buffer *tx_buffer_info; | 255 | struct ixgbe_tx_buffer *tx_buffer_info; |
256 | struct ixgbe_rx_buffer *rx_buffer_info; | 256 | struct ixgbe_rx_buffer *rx_buffer_info; |
257 | }; | 257 | }; |
258 | unsigned long last_rx_timestamp; | ||
259 | unsigned long state; | 258 | unsigned long state; |
260 | u8 __iomem *tail; | 259 | u8 __iomem *tail; |
261 | dma_addr_t dma; /* phys. address of descriptor ring */ | 260 | dma_addr_t dma; /* phys. address of descriptor ring */ |
@@ -778,6 +777,7 @@ struct ixgbe_adapter { | |||
778 | unsigned long ptp_tx_start; | 777 | unsigned long ptp_tx_start; |
779 | unsigned long last_overflow_check; | 778 | unsigned long last_overflow_check; |
780 | unsigned long last_rx_ptp_check; | 779 | unsigned long last_rx_ptp_check; |
780 | unsigned long last_rx_timestamp; | ||
781 | spinlock_t tmreg_lock; | 781 | spinlock_t tmreg_lock; |
782 | struct cyclecounter cc; | 782 | struct cyclecounter cc; |
783 | struct timecounter tc; | 783 | struct timecounter tc; |
@@ -960,24 +960,7 @@ void ixgbe_ptp_init(struct ixgbe_adapter *adapter); | |||
960 | void ixgbe_ptp_stop(struct ixgbe_adapter *adapter); | 960 | void ixgbe_ptp_stop(struct ixgbe_adapter *adapter); |
961 | void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter); | 961 | void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter); |
962 | void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter); | 962 | void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter); |
963 | void __ixgbe_ptp_rx_hwtstamp(struct ixgbe_q_vector *q_vector, | 963 | void ixgbe_ptp_rx_hwtstamp(struct ixgbe_adapter *adapter, struct sk_buff *skb); |
964 | struct sk_buff *skb); | ||
965 | static inline void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring, | ||
966 | union ixgbe_adv_rx_desc *rx_desc, | ||
967 | struct sk_buff *skb) | ||
968 | { | ||
969 | if (unlikely(!ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_TS))) | ||
970 | return; | ||
971 | |||
972 | __ixgbe_ptp_rx_hwtstamp(rx_ring->q_vector, skb); | ||
973 | |||
974 | /* | ||
975 | * Update the last_rx_timestamp timer in order to enable watchdog check | ||
976 | * for error case of latched timestamp on a dropped packet. | ||
977 | */ | ||
978 | rx_ring->last_rx_timestamp = jiffies; | ||
979 | } | ||
980 | |||
981 | int ixgbe_ptp_set_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr); | 964 | int ixgbe_ptp_set_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr); |
982 | int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr); | 965 | int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr); |
983 | void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter); | 966 | void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 6cc148b7c132..bdc55819179d 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | |||
@@ -1199,7 +1199,7 @@ static s32 ixgbe_detect_eeprom_page_size_generic(struct ixgbe_hw *hw, | |||
1199 | */ | 1199 | */ |
1200 | hw->eeprom.word_page_size = IXGBE_EEPROM_PAGE_SIZE_MAX - data[0]; | 1200 | hw->eeprom.word_page_size = IXGBE_EEPROM_PAGE_SIZE_MAX - data[0]; |
1201 | 1201 | ||
1202 | hw_dbg(hw, "Detected EEPROM page size = %d words.", | 1202 | hw_dbg(hw, "Detected EEPROM page size = %d words.\n", |
1203 | hw->eeprom.word_page_size); | 1203 | hw->eeprom.word_page_size); |
1204 | out: | 1204 | out: |
1205 | return status; | 1205 | return status; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 39a1c07258b0..8089ea9f2fba 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -1690,7 +1690,8 @@ static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring, | |||
1690 | 1690 | ||
1691 | ixgbe_rx_checksum(rx_ring, rx_desc, skb); | 1691 | ixgbe_rx_checksum(rx_ring, rx_desc, skb); |
1692 | 1692 | ||
1693 | ixgbe_ptp_rx_hwtstamp(rx_ring, rx_desc, skb); | 1693 | if (unlikely(ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_TS))) |
1694 | ixgbe_ptp_rx_hwtstamp(rx_ring->q_vector->adapter, skb); | ||
1694 | 1695 | ||
1695 | if ((dev->features & NETIF_F_HW_VLAN_CTAG_RX) && | 1696 | if ((dev->features & NETIF_F_HW_VLAN_CTAG_RX) && |
1696 | ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_VP)) { | 1697 | ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_VP)) { |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index 23f765263f12..a76af8e28a04 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | |||
@@ -536,7 +536,7 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) | |||
536 | 536 | ||
537 | if (time_out == max_time_out) { | 537 | if (time_out == max_time_out) { |
538 | status = IXGBE_ERR_LINK_SETUP; | 538 | status = IXGBE_ERR_LINK_SETUP; |
539 | hw_dbg(hw, "ixgbe_setup_phy_link_generic: time out"); | 539 | hw_dbg(hw, "ixgbe_setup_phy_link_generic: time out\n"); |
540 | } | 540 | } |
541 | 541 | ||
542 | return status; | 542 | return status; |
@@ -745,7 +745,7 @@ s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw) | |||
745 | 745 | ||
746 | if (time_out == max_time_out) { | 746 | if (time_out == max_time_out) { |
747 | status = IXGBE_ERR_LINK_SETUP; | 747 | status = IXGBE_ERR_LINK_SETUP; |
748 | hw_dbg(hw, "ixgbe_setup_phy_link_tnx: time out"); | 748 | hw_dbg(hw, "ixgbe_setup_phy_link_tnx: time out\n"); |
749 | } | 749 | } |
750 | 750 | ||
751 | return status; | 751 | return status; |
@@ -1175,7 +1175,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) | |||
1175 | status = 0; | 1175 | status = 0; |
1176 | } else { | 1176 | } else { |
1177 | if (hw->allow_unsupported_sfp) { | 1177 | if (hw->allow_unsupported_sfp) { |
1178 | e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules."); | 1178 | e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n"); |
1179 | status = 0; | 1179 | status = 0; |
1180 | } else { | 1180 | } else { |
1181 | hw_dbg(hw, | 1181 | hw_dbg(hw, |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c index 63515a6f67fa..8902ae683457 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | |||
@@ -435,10 +435,8 @@ void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter) | |||
435 | void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter) | 435 | void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter) |
436 | { | 436 | { |
437 | struct ixgbe_hw *hw = &adapter->hw; | 437 | struct ixgbe_hw *hw = &adapter->hw; |
438 | struct ixgbe_ring *rx_ring; | ||
439 | u32 tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL); | 438 | u32 tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL); |
440 | unsigned long rx_event; | 439 | unsigned long rx_event; |
441 | int n; | ||
442 | 440 | ||
443 | /* if we don't have a valid timestamp in the registers, just update the | 441 | /* if we don't have a valid timestamp in the registers, just update the |
444 | * timeout counter and exit | 442 | * timeout counter and exit |
@@ -450,18 +448,15 @@ void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter) | |||
450 | 448 | ||
451 | /* determine the most recent watchdog or rx_timestamp event */ | 449 | /* determine the most recent watchdog or rx_timestamp event */ |
452 | rx_event = adapter->last_rx_ptp_check; | 450 | rx_event = adapter->last_rx_ptp_check; |
453 | for (n = 0; n < adapter->num_rx_queues; n++) { | 451 | if (time_after(adapter->last_rx_timestamp, rx_event)) |
454 | rx_ring = adapter->rx_ring[n]; | 452 | rx_event = adapter->last_rx_timestamp; |
455 | if (time_after(rx_ring->last_rx_timestamp, rx_event)) | ||
456 | rx_event = rx_ring->last_rx_timestamp; | ||
457 | } | ||
458 | 453 | ||
459 | /* only need to read the high RXSTMP register to clear the lock */ | 454 | /* only need to read the high RXSTMP register to clear the lock */ |
460 | if (time_is_before_jiffies(rx_event + 5*HZ)) { | 455 | if (time_is_before_jiffies(rx_event + 5*HZ)) { |
461 | IXGBE_READ_REG(hw, IXGBE_RXSTMPH); | 456 | IXGBE_READ_REG(hw, IXGBE_RXSTMPH); |
462 | adapter->last_rx_ptp_check = jiffies; | 457 | adapter->last_rx_ptp_check = jiffies; |
463 | 458 | ||
464 | e_warn(drv, "clearing RX Timestamp hang"); | 459 | e_warn(drv, "clearing RX Timestamp hang\n"); |
465 | } | 460 | } |
466 | } | 461 | } |
467 | 462 | ||
@@ -517,7 +512,7 @@ static void ixgbe_ptp_tx_hwtstamp_work(struct work_struct *work) | |||
517 | dev_kfree_skb_any(adapter->ptp_tx_skb); | 512 | dev_kfree_skb_any(adapter->ptp_tx_skb); |
518 | adapter->ptp_tx_skb = NULL; | 513 | adapter->ptp_tx_skb = NULL; |
519 | clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state); | 514 | clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state); |
520 | e_warn(drv, "clearing Tx Timestamp hang"); | 515 | e_warn(drv, "clearing Tx Timestamp hang\n"); |
521 | return; | 516 | return; |
522 | } | 517 | } |
523 | 518 | ||
@@ -530,35 +525,22 @@ static void ixgbe_ptp_tx_hwtstamp_work(struct work_struct *work) | |||
530 | } | 525 | } |
531 | 526 | ||
532 | /** | 527 | /** |
533 | * __ixgbe_ptp_rx_hwtstamp - utility function which checks for RX time stamp | 528 | * ixgbe_ptp_rx_hwtstamp - utility function which checks for RX time stamp |
534 | * @q_vector: structure containing interrupt and ring information | 529 | * @adapter: pointer to adapter struct |
535 | * @skb: particular skb to send timestamp with | 530 | * @skb: particular skb to send timestamp with |
536 | * | 531 | * |
537 | * if the timestamp is valid, we convert it into the timecounter ns | 532 | * if the timestamp is valid, we convert it into the timecounter ns |
538 | * value, then store that result into the shhwtstamps structure which | 533 | * value, then store that result into the shhwtstamps structure which |
539 | * is passed up the network stack | 534 | * is passed up the network stack |
540 | */ | 535 | */ |
541 | void __ixgbe_ptp_rx_hwtstamp(struct ixgbe_q_vector *q_vector, | 536 | void ixgbe_ptp_rx_hwtstamp(struct ixgbe_adapter *adapter, struct sk_buff *skb) |
542 | struct sk_buff *skb) | ||
543 | { | 537 | { |
544 | struct ixgbe_adapter *adapter; | 538 | struct ixgbe_hw *hw = &adapter->hw; |
545 | struct ixgbe_hw *hw; | ||
546 | struct skb_shared_hwtstamps *shhwtstamps; | 539 | struct skb_shared_hwtstamps *shhwtstamps; |
547 | u64 regval = 0, ns; | 540 | u64 regval = 0, ns; |
548 | u32 tsyncrxctl; | 541 | u32 tsyncrxctl; |
549 | unsigned long flags; | 542 | unsigned long flags; |
550 | 543 | ||
551 | /* we cannot process timestamps on a ring without a q_vector */ | ||
552 | if (!q_vector || !q_vector->adapter) | ||
553 | return; | ||
554 | |||
555 | adapter = q_vector->adapter; | ||
556 | hw = &adapter->hw; | ||
557 | |||
558 | /* | ||
559 | * Read the tsyncrxctl register afterwards in order to prevent taking an | ||
560 | * I/O hit on every packet. | ||
561 | */ | ||
562 | tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL); | 544 | tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL); |
563 | if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID)) | 545 | if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID)) |
564 | return; | 546 | return; |
@@ -566,13 +548,17 @@ void __ixgbe_ptp_rx_hwtstamp(struct ixgbe_q_vector *q_vector, | |||
566 | regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPL); | 548 | regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPL); |
567 | regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPH) << 32; | 549 | regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPH) << 32; |
568 | 550 | ||
569 | |||
570 | spin_lock_irqsave(&adapter->tmreg_lock, flags); | 551 | spin_lock_irqsave(&adapter->tmreg_lock, flags); |
571 | ns = timecounter_cyc2time(&adapter->tc, regval); | 552 | ns = timecounter_cyc2time(&adapter->tc, regval); |
572 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); | 553 | spin_unlock_irqrestore(&adapter->tmreg_lock, flags); |
573 | 554 | ||
574 | shhwtstamps = skb_hwtstamps(skb); | 555 | shhwtstamps = skb_hwtstamps(skb); |
575 | shhwtstamps->hwtstamp = ns_to_ktime(ns); | 556 | shhwtstamps->hwtstamp = ns_to_ktime(ns); |
557 | |||
558 | /* Update the last_rx_timestamp timer in order to enable watchdog check | ||
559 | * for error case of latched timestamp on a dropped packet. | ||
560 | */ | ||
561 | adapter->last_rx_timestamp = jiffies; | ||
576 | } | 562 | } |
577 | 563 | ||
578 | int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr) | 564 | int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr) |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c index e896dbbd2e15..d71691be4136 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c | |||
@@ -45,10 +45,10 @@ static void sxgbe_prepare_tx_desc(struct sxgbe_tx_norm_desc *p, u8 is_fd, | |||
45 | p->tdes23.tx_rd_des23.first_desc = is_fd; | 45 | p->tdes23.tx_rd_des23.first_desc = is_fd; |
46 | p->tdes23.tx_rd_des23.buf1_size = buf1_len; | 46 | p->tdes23.tx_rd_des23.buf1_size = buf1_len; |
47 | 47 | ||
48 | p->tdes23.tx_rd_des23.tx_pkt_len.cksum_pktlen.total_pkt_len = pkt_len; | 48 | p->tdes23.tx_rd_des23.tx_pkt_len.pkt_len.total_pkt_len = pkt_len; |
49 | 49 | ||
50 | if (cksum) | 50 | if (cksum) |
51 | p->tdes23.tx_rd_des23.tx_pkt_len.cksum_pktlen.cksum_ctl = cic_full; | 51 | p->tdes23.tx_rd_des23.cksum_ctl = cic_full; |
52 | } | 52 | } |
53 | 53 | ||
54 | /* Set VLAN control information */ | 54 | /* Set VLAN control information */ |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h index 838cb9fb0ea9..022630098aea 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h | |||
@@ -39,22 +39,22 @@ struct sxgbe_tx_norm_desc { | |||
39 | u32 int_on_com:1; | 39 | u32 int_on_com:1; |
40 | /* TDES3 */ | 40 | /* TDES3 */ |
41 | union { | 41 | union { |
42 | u32 tcp_payload_len:18; | 42 | u16 tcp_payload_len; |
43 | struct { | 43 | struct { |
44 | u32 total_pkt_len:15; | 44 | u32 total_pkt_len:15; |
45 | u32 reserved1:1; | 45 | u32 reserved1:1; |
46 | u32 cksum_ctl:2; | 46 | } pkt_len; |
47 | } cksum_pktlen; | ||
48 | } tx_pkt_len; | 47 | } tx_pkt_len; |
49 | 48 | ||
50 | u32 tse_bit:1; | 49 | u16 cksum_ctl:2; |
51 | u32 tcp_hdr_len:4; | 50 | u16 tse_bit:1; |
52 | u32 sa_insert_ctl:3; | 51 | u16 tcp_hdr_len:4; |
53 | u32 crc_pad_ctl:2; | 52 | u16 sa_insert_ctl:3; |
54 | u32 last_desc:1; | 53 | u16 crc_pad_ctl:2; |
55 | u32 first_desc:1; | 54 | u16 last_desc:1; |
56 | u32 ctxt_bit:1; | 55 | u16 first_desc:1; |
57 | u32 own_bit:1; | 56 | u16 ctxt_bit:1; |
57 | u16 own_bit:1; | ||
58 | } tx_rd_des23; | 58 | } tx_rd_des23; |
59 | 59 | ||
60 | /* tx write back Desc 2,3 */ | 60 | /* tx write back Desc 2,3 */ |
@@ -70,25 +70,20 @@ struct sxgbe_tx_norm_desc { | |||
70 | 70 | ||
71 | struct sxgbe_rx_norm_desc { | 71 | struct sxgbe_rx_norm_desc { |
72 | union { | 72 | union { |
73 | u32 rdes0; /* buf1 address */ | 73 | u64 rdes01; /* buf1 address */ |
74 | struct { | 74 | union { |
75 | u32 out_vlan_tag:16; | 75 | u32 out_vlan_tag:16; |
76 | u32 in_vlan_tag:16; | 76 | u32 in_vlan_tag:16; |
77 | } wb_rx_des0; | 77 | u32 rss_hash; |
78 | } rd_wb_des0; | 78 | } rx_wb_des01; |
79 | 79 | } rdes01; | |
80 | union { | ||
81 | u32 rdes1; /* buf2 address or buf1[63:32] */ | ||
82 | u32 rss_hash; /* Write-back RX */ | ||
83 | } rd_wb_des1; | ||
84 | 80 | ||
85 | union { | 81 | union { |
86 | /* RX Read format Desc 2,3 */ | 82 | /* RX Read format Desc 2,3 */ |
87 | struct{ | 83 | struct{ |
88 | /* RDES2 */ | 84 | /* RDES2 */ |
89 | u32 buf2_addr; | 85 | u64 buf2_addr:62; |
90 | /* RDES3 */ | 86 | /* RDES3 */ |
91 | u32 buf2_hi_addr:30; | ||
92 | u32 int_on_com:1; | 87 | u32 int_on_com:1; |
93 | u32 own_bit:1; | 88 | u32 own_bit:1; |
94 | } rx_rd_des23; | 89 | } rx_rd_des23; |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c index 01af2cbb479d..43ccb4a6de15 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #define SXGBE_SMA_PREAD_CMD 0x02 /* post read increament address */ | 27 | #define SXGBE_SMA_PREAD_CMD 0x02 /* post read increament address */ |
28 | #define SXGBE_SMA_READ_CMD 0x03 /* read command */ | 28 | #define SXGBE_SMA_READ_CMD 0x03 /* read command */ |
29 | #define SXGBE_SMA_SKIP_ADDRFRM 0x00040000 /* skip the address frame */ | 29 | #define SXGBE_SMA_SKIP_ADDRFRM 0x00040000 /* skip the address frame */ |
30 | #define SXGBE_MII_BUSY 0x00800000 /* mii busy */ | 30 | #define SXGBE_MII_BUSY 0x00400000 /* mii busy */ |
31 | 31 | ||
32 | static int sxgbe_mdio_busy_wait(void __iomem *ioaddr, unsigned int mii_data) | 32 | static int sxgbe_mdio_busy_wait(void __iomem *ioaddr, unsigned int mii_data) |
33 | { | 33 | { |
@@ -147,6 +147,7 @@ int sxgbe_mdio_register(struct net_device *ndev) | |||
147 | struct sxgbe_mdio_bus_data *mdio_data = priv->plat->mdio_bus_data; | 147 | struct sxgbe_mdio_bus_data *mdio_data = priv->plat->mdio_bus_data; |
148 | int err, phy_addr; | 148 | int err, phy_addr; |
149 | int *irqlist; | 149 | int *irqlist; |
150 | bool phy_found = false; | ||
150 | bool act; | 151 | bool act; |
151 | 152 | ||
152 | /* allocate the new mdio bus */ | 153 | /* allocate the new mdio bus */ |
@@ -162,7 +163,7 @@ int sxgbe_mdio_register(struct net_device *ndev) | |||
162 | irqlist = priv->mii_irq; | 163 | irqlist = priv->mii_irq; |
163 | 164 | ||
164 | /* assign mii bus fields */ | 165 | /* assign mii bus fields */ |
165 | mdio_bus->name = "samsxgbe"; | 166 | mdio_bus->name = "sxgbe"; |
166 | mdio_bus->read = &sxgbe_mdio_read; | 167 | mdio_bus->read = &sxgbe_mdio_read; |
167 | mdio_bus->write = &sxgbe_mdio_write; | 168 | mdio_bus->write = &sxgbe_mdio_write; |
168 | snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%s-%x", | 169 | snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
@@ -216,13 +217,22 @@ int sxgbe_mdio_register(struct net_device *ndev) | |||
216 | netdev_info(ndev, "PHY ID %08x at %d IRQ %s (%s)%s\n", | 217 | netdev_info(ndev, "PHY ID %08x at %d IRQ %s (%s)%s\n", |
217 | phy->phy_id, phy_addr, irq_str, | 218 | phy->phy_id, phy_addr, irq_str, |
218 | dev_name(&phy->dev), act ? " active" : ""); | 219 | dev_name(&phy->dev), act ? " active" : ""); |
220 | phy_found = true; | ||
219 | } | 221 | } |
220 | } | 222 | } |
221 | 223 | ||
224 | if (!phy_found) { | ||
225 | netdev_err(ndev, "PHY not found\n"); | ||
226 | goto phyfound_err; | ||
227 | } | ||
228 | |||
222 | priv->mii = mdio_bus; | 229 | priv->mii = mdio_bus; |
223 | 230 | ||
224 | return 0; | 231 | return 0; |
225 | 232 | ||
233 | phyfound_err: | ||
234 | err = -ENODEV; | ||
235 | mdiobus_unregister(mdio_bus); | ||
226 | mdiobus_err: | 236 | mdiobus_err: |
227 | mdiobus_free(mdio_bus); | 237 | mdiobus_free(mdio_bus); |
228 | return err; | 238 | return err; |
diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c index d1b4dca53a9d..bcaa41af1e62 100644 --- a/drivers/net/ethernet/smsc/smc91x.c +++ b/drivers/net/ethernet/smsc/smc91x.c | |||
@@ -147,18 +147,19 @@ MODULE_ALIAS("platform:smc91x"); | |||
147 | */ | 147 | */ |
148 | #define MII_DELAY 1 | 148 | #define MII_DELAY 1 |
149 | 149 | ||
150 | #if SMC_DEBUG > 0 | 150 | #define DBG(n, dev, fmt, ...) \ |
151 | #define DBG(n, dev, args...) \ | 151 | do { \ |
152 | do { \ | 152 | if (SMC_DEBUG >= (n)) \ |
153 | if (SMC_DEBUG >= (n)) \ | 153 | netdev_dbg(dev, fmt, ##__VA_ARGS__); \ |
154 | netdev_dbg(dev, args); \ | ||
155 | } while (0) | 154 | } while (0) |
156 | 155 | ||
157 | #define PRINTK(dev, args...) netdev_info(dev, args) | 156 | #define PRINTK(dev, fmt, ...) \ |
158 | #else | 157 | do { \ |
159 | #define DBG(n, dev, args...) do { } while (0) | 158 | if (SMC_DEBUG > 0) \ |
160 | #define PRINTK(dev, args...) netdev_dbg(dev, args) | 159 | netdev_info(dev, fmt, ##__VA_ARGS__); \ |
161 | #endif | 160 | else \ |
161 | netdev_dbg(dev, fmt, ##__VA_ARGS__); \ | ||
162 | } while (0) | ||
162 | 163 | ||
163 | #if SMC_DEBUG > 3 | 164 | #if SMC_DEBUG > 3 |
164 | static void PRINT_PKT(u_char *buf, int length) | 165 | static void PRINT_PKT(u_char *buf, int length) |
@@ -191,7 +192,7 @@ static void PRINT_PKT(u_char *buf, int length) | |||
191 | pr_cont("\n"); | 192 | pr_cont("\n"); |
192 | } | 193 | } |
193 | #else | 194 | #else |
194 | #define PRINT_PKT(x...) do { } while (0) | 195 | static inline void PRINT_PKT(u_char *buf, int length) { } |
195 | #endif | 196 | #endif |
196 | 197 | ||
197 | 198 | ||
@@ -1781,7 +1782,7 @@ static int smc_findirq(struct smc_local *lp) | |||
1781 | int timeout = 20; | 1782 | int timeout = 20; |
1782 | unsigned long cookie; | 1783 | unsigned long cookie; |
1783 | 1784 | ||
1784 | DBG(2, dev, "%s: %s\n", CARDNAME, __func__); | 1785 | DBG(2, lp->dev, "%s: %s\n", CARDNAME, __func__); |
1785 | 1786 | ||
1786 | cookie = probe_irq_on(); | 1787 | cookie = probe_irq_on(); |
1787 | 1788 | ||
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 5ad971a55c5d..d849684231c1 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
@@ -246,13 +246,13 @@ static int ksz9021_load_values_from_of(struct phy_device *phydev, | |||
246 | if (val1 != -1) | 246 | if (val1 != -1) |
247 | newval = ((newval & 0xfff0) | ((val1 / PS_TO_REG) & 0xf) << 0); | 247 | newval = ((newval & 0xfff0) | ((val1 / PS_TO_REG) & 0xf) << 0); |
248 | 248 | ||
249 | if (val2 != -1) | 249 | if (val2 != -2) |
250 | newval = ((newval & 0xff0f) | ((val2 / PS_TO_REG) & 0xf) << 4); | 250 | newval = ((newval & 0xff0f) | ((val2 / PS_TO_REG) & 0xf) << 4); |
251 | 251 | ||
252 | if (val3 != -1) | 252 | if (val3 != -3) |
253 | newval = ((newval & 0xf0ff) | ((val3 / PS_TO_REG) & 0xf) << 8); | 253 | newval = ((newval & 0xf0ff) | ((val3 / PS_TO_REG) & 0xf) << 8); |
254 | 254 | ||
255 | if (val4 != -1) | 255 | if (val4 != -4) |
256 | newval = ((newval & 0x0fff) | ((val4 / PS_TO_REG) & 0xf) << 12); | 256 | newval = ((newval & 0x0fff) | ((val4 / PS_TO_REG) & 0xf) << 12); |
257 | 257 | ||
258 | return kszphy_extended_write(phydev, reg, newval); | 258 | return kszphy_extended_write(phydev, reg, newval); |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 7b687469199b..8a852b5f215f 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -1285,7 +1285,7 @@ static int virtnet_set_channels(struct net_device *dev, | |||
1285 | if (channels->rx_count || channels->tx_count || channels->other_count) | 1285 | if (channels->rx_count || channels->tx_count || channels->other_count) |
1286 | return -EINVAL; | 1286 | return -EINVAL; |
1287 | 1287 | ||
1288 | if (queue_pairs > vi->max_queue_pairs) | 1288 | if (queue_pairs > vi->max_queue_pairs || queue_pairs == 0) |
1289 | return -EINVAL; | 1289 | return -EINVAL; |
1290 | 1290 | ||
1291 | get_online_cpus(); | 1291 | get_online_cpus(); |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 82355d5d155a..4dbb2ed85b97 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -389,8 +389,8 @@ static inline size_t vxlan_nlmsg_size(void) | |||
389 | + nla_total_size(sizeof(struct nda_cacheinfo)); | 389 | + nla_total_size(sizeof(struct nda_cacheinfo)); |
390 | } | 390 | } |
391 | 391 | ||
392 | static void vxlan_fdb_notify(struct vxlan_dev *vxlan, | 392 | static void vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb, |
393 | struct vxlan_fdb *fdb, int type) | 393 | struct vxlan_rdst *rd, int type) |
394 | { | 394 | { |
395 | struct net *net = dev_net(vxlan->dev); | 395 | struct net *net = dev_net(vxlan->dev); |
396 | struct sk_buff *skb; | 396 | struct sk_buff *skb; |
@@ -400,8 +400,7 @@ static void vxlan_fdb_notify(struct vxlan_dev *vxlan, | |||
400 | if (skb == NULL) | 400 | if (skb == NULL) |
401 | goto errout; | 401 | goto errout; |
402 | 402 | ||
403 | err = vxlan_fdb_info(skb, vxlan, fdb, 0, 0, type, 0, | 403 | err = vxlan_fdb_info(skb, vxlan, fdb, 0, 0, type, 0, rd); |
404 | first_remote_rtnl(fdb)); | ||
405 | if (err < 0) { | 404 | if (err < 0) { |
406 | /* -EMSGSIZE implies BUG in vxlan_nlmsg_size() */ | 405 | /* -EMSGSIZE implies BUG in vxlan_nlmsg_size() */ |
407 | WARN_ON(err == -EMSGSIZE); | 406 | WARN_ON(err == -EMSGSIZE); |
@@ -427,10 +426,7 @@ static void vxlan_ip_miss(struct net_device *dev, union vxlan_addr *ipa) | |||
427 | .remote_vni = VXLAN_N_VID, | 426 | .remote_vni = VXLAN_N_VID, |
428 | }; | 427 | }; |
429 | 428 | ||
430 | INIT_LIST_HEAD(&f.remotes); | 429 | vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH); |
431 | list_add_rcu(&remote.list, &f.remotes); | ||
432 | |||
433 | vxlan_fdb_notify(vxlan, &f, RTM_GETNEIGH); | ||
434 | } | 430 | } |
435 | 431 | ||
436 | static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN]) | 432 | static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN]) |
@@ -438,11 +434,11 @@ static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN]) | |||
438 | struct vxlan_fdb f = { | 434 | struct vxlan_fdb f = { |
439 | .state = NUD_STALE, | 435 | .state = NUD_STALE, |
440 | }; | 436 | }; |
437 | struct vxlan_rdst remote = { }; | ||
441 | 438 | ||
442 | INIT_LIST_HEAD(&f.remotes); | ||
443 | memcpy(f.eth_addr, eth_addr, ETH_ALEN); | 439 | memcpy(f.eth_addr, eth_addr, ETH_ALEN); |
444 | 440 | ||
445 | vxlan_fdb_notify(vxlan, &f, RTM_GETNEIGH); | 441 | vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH); |
446 | } | 442 | } |
447 | 443 | ||
448 | /* Hash Ethernet address */ | 444 | /* Hash Ethernet address */ |
@@ -533,7 +529,8 @@ static int vxlan_fdb_replace(struct vxlan_fdb *f, | |||
533 | 529 | ||
534 | /* Add/update destinations for multicast */ | 530 | /* Add/update destinations for multicast */ |
535 | static int vxlan_fdb_append(struct vxlan_fdb *f, | 531 | static int vxlan_fdb_append(struct vxlan_fdb *f, |
536 | union vxlan_addr *ip, __be16 port, __u32 vni, __u32 ifindex) | 532 | union vxlan_addr *ip, __be16 port, __u32 vni, |
533 | __u32 ifindex, struct vxlan_rdst **rdp) | ||
537 | { | 534 | { |
538 | struct vxlan_rdst *rd; | 535 | struct vxlan_rdst *rd; |
539 | 536 | ||
@@ -551,6 +548,7 @@ static int vxlan_fdb_append(struct vxlan_fdb *f, | |||
551 | 548 | ||
552 | list_add_tail_rcu(&rd->list, &f->remotes); | 549 | list_add_tail_rcu(&rd->list, &f->remotes); |
553 | 550 | ||
551 | *rdp = rd; | ||
554 | return 1; | 552 | return 1; |
555 | } | 553 | } |
556 | 554 | ||
@@ -690,6 +688,7 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan, | |||
690 | __be16 port, __u32 vni, __u32 ifindex, | 688 | __be16 port, __u32 vni, __u32 ifindex, |
691 | __u8 ndm_flags) | 689 | __u8 ndm_flags) |
692 | { | 690 | { |
691 | struct vxlan_rdst *rd = NULL; | ||
693 | struct vxlan_fdb *f; | 692 | struct vxlan_fdb *f; |
694 | int notify = 0; | 693 | int notify = 0; |
695 | 694 | ||
@@ -726,7 +725,8 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan, | |||
726 | if ((flags & NLM_F_APPEND) && | 725 | if ((flags & NLM_F_APPEND) && |
727 | (is_multicast_ether_addr(f->eth_addr) || | 726 | (is_multicast_ether_addr(f->eth_addr) || |
728 | is_zero_ether_addr(f->eth_addr))) { | 727 | is_zero_ether_addr(f->eth_addr))) { |
729 | int rc = vxlan_fdb_append(f, ip, port, vni, ifindex); | 728 | int rc = vxlan_fdb_append(f, ip, port, vni, ifindex, |
729 | &rd); | ||
730 | 730 | ||
731 | if (rc < 0) | 731 | if (rc < 0) |
732 | return rc; | 732 | return rc; |
@@ -756,15 +756,18 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan, | |||
756 | INIT_LIST_HEAD(&f->remotes); | 756 | INIT_LIST_HEAD(&f->remotes); |
757 | memcpy(f->eth_addr, mac, ETH_ALEN); | 757 | memcpy(f->eth_addr, mac, ETH_ALEN); |
758 | 758 | ||
759 | vxlan_fdb_append(f, ip, port, vni, ifindex); | 759 | vxlan_fdb_append(f, ip, port, vni, ifindex, &rd); |
760 | 760 | ||
761 | ++vxlan->addrcnt; | 761 | ++vxlan->addrcnt; |
762 | hlist_add_head_rcu(&f->hlist, | 762 | hlist_add_head_rcu(&f->hlist, |
763 | vxlan_fdb_head(vxlan, mac)); | 763 | vxlan_fdb_head(vxlan, mac)); |
764 | } | 764 | } |
765 | 765 | ||
766 | if (notify) | 766 | if (notify) { |
767 | vxlan_fdb_notify(vxlan, f, RTM_NEWNEIGH); | 767 | if (rd == NULL) |
768 | rd = first_remote_rtnl(f); | ||
769 | vxlan_fdb_notify(vxlan, f, rd, RTM_NEWNEIGH); | ||
770 | } | ||
768 | 771 | ||
769 | return 0; | 772 | return 0; |
770 | } | 773 | } |
@@ -785,7 +788,7 @@ static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f) | |||
785 | "delete %pM\n", f->eth_addr); | 788 | "delete %pM\n", f->eth_addr); |
786 | 789 | ||
787 | --vxlan->addrcnt; | 790 | --vxlan->addrcnt; |
788 | vxlan_fdb_notify(vxlan, f, RTM_DELNEIGH); | 791 | vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_DELNEIGH); |
789 | 792 | ||
790 | hlist_del_rcu(&f->hlist); | 793 | hlist_del_rcu(&f->hlist); |
791 | call_rcu(&f->rcu, vxlan_fdb_free); | 794 | call_rcu(&f->rcu, vxlan_fdb_free); |
@@ -919,6 +922,7 @@ static int vxlan_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], | |||
919 | */ | 922 | */ |
920 | if (rd && !list_is_singular(&f->remotes)) { | 923 | if (rd && !list_is_singular(&f->remotes)) { |
921 | list_del_rcu(&rd->list); | 924 | list_del_rcu(&rd->list); |
925 | vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH); | ||
922 | kfree_rcu(rd, rcu); | 926 | kfree_rcu(rd, rcu); |
923 | goto out; | 927 | goto out; |
924 | } | 928 | } |
@@ -993,7 +997,7 @@ static bool vxlan_snoop(struct net_device *dev, | |||
993 | 997 | ||
994 | rdst->remote_ip = *src_ip; | 998 | rdst->remote_ip = *src_ip; |
995 | f->updated = jiffies; | 999 | f->updated = jiffies; |
996 | vxlan_fdb_notify(vxlan, f, RTM_NEWNEIGH); | 1000 | vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH); |
997 | } else { | 1001 | } else { |
998 | /* learned new entry */ | 1002 | /* learned new entry */ |
999 | spin_lock(&vxlan->hash_lock); | 1003 | spin_lock(&vxlan->hash_lock); |
diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h index 54f91d35e5fd..302ab805b0bb 100644 --- a/include/linux/sock_diag.h +++ b/include/linux/sock_diag.h | |||
@@ -23,7 +23,7 @@ int sock_diag_check_cookie(void *sk, __u32 *cookie); | |||
23 | void sock_diag_save_cookie(void *sk, __u32 *cookie); | 23 | void sock_diag_save_cookie(void *sk, __u32 *cookie); |
24 | 24 | ||
25 | int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr); | 25 | int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr); |
26 | int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, | 26 | int sock_diag_put_filterinfo(struct sock *sk, |
27 | struct sk_buff *skb, int attrtype); | 27 | struct sk_buff *skb, int attrtype); |
28 | 28 | ||
29 | #endif | 29 | #endif |
diff --git a/net/core/filter.c b/net/core/filter.c index 78a636e60a0b..7c4db3dd3d1e 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -122,6 +122,13 @@ noinline u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5) | |||
122 | return 0; | 122 | return 0; |
123 | } | 123 | } |
124 | 124 | ||
125 | /* Register mappings for user programs. */ | ||
126 | #define A_REG 0 | ||
127 | #define X_REG 7 | ||
128 | #define TMP_REG 8 | ||
129 | #define ARG2_REG 2 | ||
130 | #define ARG3_REG 3 | ||
131 | |||
125 | /** | 132 | /** |
126 | * __sk_run_filter - run a filter on a given context | 133 | * __sk_run_filter - run a filter on a given context |
127 | * @ctx: buffer to run the filter on | 134 | * @ctx: buffer to run the filter on |
@@ -242,6 +249,8 @@ unsigned int __sk_run_filter(void *ctx, const struct sock_filter_int *insn) | |||
242 | 249 | ||
243 | regs[FP_REG] = (u64) (unsigned long) &stack[ARRAY_SIZE(stack)]; | 250 | regs[FP_REG] = (u64) (unsigned long) &stack[ARRAY_SIZE(stack)]; |
244 | regs[ARG1_REG] = (u64) (unsigned long) ctx; | 251 | regs[ARG1_REG] = (u64) (unsigned long) ctx; |
252 | regs[A_REG] = 0; | ||
253 | regs[X_REG] = 0; | ||
245 | 254 | ||
246 | select_insn: | 255 | select_insn: |
247 | goto *jumptable[insn->code]; | 256 | goto *jumptable[insn->code]; |
@@ -649,13 +658,6 @@ static u64 __get_random_u32(u64 ctx, u64 A, u64 X, u64 r4, u64 r5) | |||
649 | return (u64)prandom_u32(); | 658 | return (u64)prandom_u32(); |
650 | } | 659 | } |
651 | 660 | ||
652 | /* Register mappings for user programs. */ | ||
653 | #define A_REG 0 | ||
654 | #define X_REG 7 | ||
655 | #define TMP_REG 8 | ||
656 | #define ARG2_REG 2 | ||
657 | #define ARG3_REG 3 | ||
658 | |||
659 | static bool convert_bpf_extensions(struct sock_filter *fp, | 661 | static bool convert_bpf_extensions(struct sock_filter *fp, |
660 | struct sock_filter_int **insnp) | 662 | struct sock_filter_int **insnp) |
661 | { | 663 | { |
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c index d7af18859322..9deb6abd6cf6 100644 --- a/net/core/sock_diag.c +++ b/net/core/sock_diag.c | |||
@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attrtype) | |||
49 | } | 49 | } |
50 | EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); | 50 | EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); |
51 | 51 | ||
52 | int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, | 52 | int sock_diag_put_filterinfo(struct sock *sk, |
53 | struct sk_buff *skb, int attrtype) | 53 | struct sk_buff *skb, int attrtype) |
54 | { | 54 | { |
55 | struct sock_fprog_kern *fprog; | 55 | struct sock_fprog_kern *fprog; |
@@ -58,7 +58,7 @@ int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, | |||
58 | unsigned int flen; | 58 | unsigned int flen; |
59 | int err = 0; | 59 | int err = 0; |
60 | 60 | ||
61 | if (!ns_capable(user_ns, CAP_NET_ADMIN)) { | 61 | if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) { |
62 | nla_reserve(skb, attrtype, 0); | 62 | nla_reserve(skb, attrtype, 0); |
63 | return 0; | 63 | return 0; |
64 | } | 64 | } |
diff --git a/net/packet/diag.c b/net/packet/diag.c index 533ce4ff108a..435ff99ba8c7 100644 --- a/net/packet/diag.c +++ b/net/packet/diag.c | |||
@@ -172,7 +172,7 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, | |||
172 | goto out_nlmsg_trim; | 172 | goto out_nlmsg_trim; |
173 | 173 | ||
174 | if ((req->pdiag_show & PACKET_SHOW_FILTER) && | 174 | if ((req->pdiag_show & PACKET_SHOW_FILTER) && |
175 | sock_diag_put_filterinfo(user_ns, sk, skb, PACKET_DIAG_FILTER)) | 175 | sock_diag_put_filterinfo(sk, skb, PACKET_DIAG_FILTER)) |
176 | goto out_nlmsg_trim; | 176 | goto out_nlmsg_trim; |
177 | 177 | ||
178 | return nlmsg_end(skb, nlh); | 178 | return nlmsg_end(skb, nlh); |