aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-06-05 16:04:31 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-05 16:04:31 -0400
commitd68de60f73391ce6d19589d94a63bb5ce9070777 (patch)
treee7456ff808c56b98e82afad750e90ea62df4ae81
parentebbe495f19d565bb39be31ca28126a222b6a66dd (diff)
parent41a9e55c89be851dfc2aaae58881371b8df5360a (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
Jeff Kirsher says: ==================== Intel Wired LAN Driver Updates 2014-06-05 This series contains updates to i40e and i40evf. Jesse fixes an issue reported by Dave Jones where a couple of FD checks ended up using bitwise OR where it should have been bitwise AND. Neerav removes unused defines and macros for receive LRO. Fix the driver from allowing the user to set a larger MTU size that the hardware was being configured to support. Refactors send version which moves code in two places into a small helper function. Kamil modifies register diagnostics since register ranges can vary among the different NVMs to avoid false test results. So now we try to identify the full range and use it for a register test and if we fail to define the proper register range, we will only test the first register from that group. Then removes the check for large buffer since this was added in the case this structure changed in the future, since the AQ definition is now mature enough that this check is no longer necessary. Mitch fixes i40evf driver to allocate descriptors in groups of 32 since the hardware requires it. Also fixes a crash when the ring size changed because it would change the count before deallocating resources, causing the driver to either free nonexistent buffers or leak leftover buffers. Fixed the driver to notify the VF for all types of resets so the VF can attempt a graceful reinit. Shannon refactors stats collection to create a unifying stats update routine to call the various stat collection routines. Removes rx_errors and rx_missed stats since they were removed from the chip design. Added missing VSI statistics that the hardware offers but are not apart of the standard netdev stats. v2: dropped patch "i40e: Allow disabling of DCB via debugfs" from Neerav based on feedback from David Miller. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_common.c6
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_debugfs.c9
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_diag.c50
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_ethtool.c19
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c404
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.c4
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.h7
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_type.h16
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_txrx.h7
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_type.h16
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf.h4
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c20
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_main.c8
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c3
14 files changed, 321 insertions, 252 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
index 2329e2ff2deb..a31e3d755aea 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_common.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
@@ -1062,8 +1062,6 @@ i40e_status i40e_aq_add_vsi(struct i40e_hw *hw,
1062 cmd->vsi_flags = cpu_to_le16(vsi_ctx->flags); 1062 cmd->vsi_flags = cpu_to_le16(vsi_ctx->flags);
1063 1063
1064 desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 1064 desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1065 if (sizeof(vsi_ctx->info) > I40E_AQ_LARGE_BUF)
1066 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1067 1065
1068 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info, 1066 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1069 sizeof(vsi_ctx->info), cmd_details); 1067 sizeof(vsi_ctx->info), cmd_details);
@@ -1204,8 +1202,6 @@ i40e_status i40e_aq_get_vsi_params(struct i40e_hw *hw,
1204 cmd->uplink_seid = cpu_to_le16(vsi_ctx->seid); 1202 cmd->uplink_seid = cpu_to_le16(vsi_ctx->seid);
1205 1203
1206 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF); 1204 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1207 if (sizeof(vsi_ctx->info) > I40E_AQ_LARGE_BUF)
1208 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1209 1205
1210 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info, 1206 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1211 sizeof(vsi_ctx->info), NULL); 1207 sizeof(vsi_ctx->info), NULL);
@@ -1244,8 +1240,6 @@ i40e_status i40e_aq_update_vsi_params(struct i40e_hw *hw,
1244 cmd->uplink_seid = cpu_to_le16(vsi_ctx->seid); 1240 cmd->uplink_seid = cpu_to_le16(vsi_ctx->seid);
1245 1241
1246 desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 1242 desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1247 if (sizeof(vsi_ctx->info) > I40E_AQ_LARGE_BUF)
1248 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1249 1243
1250 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info, 1244 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1251 sizeof(vsi_ctx->info), cmd_details); 1245 sizeof(vsi_ctx->info), cmd_details);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
index 1aaec400b28e..1bd0adb38735 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
@@ -862,12 +862,11 @@ static void i40e_dbg_dump_eth_stats(struct i40e_pf *pf,
862 " rx_bytes = \t%lld \trx_unicast = \t\t%lld \trx_multicast = \t%lld\n", 862 " rx_bytes = \t%lld \trx_unicast = \t\t%lld \trx_multicast = \t%lld\n",
863 estats->rx_bytes, estats->rx_unicast, estats->rx_multicast); 863 estats->rx_bytes, estats->rx_unicast, estats->rx_multicast);
864 dev_info(&pf->pdev->dev, 864 dev_info(&pf->pdev->dev,
865 " rx_broadcast = \t%lld \trx_discards = \t\t%lld \trx_errors = \t%lld\n", 865 " rx_broadcast = \t%lld \trx_discards = \t\t%lld\n",
866 estats->rx_broadcast, estats->rx_discards, estats->rx_errors); 866 estats->rx_broadcast, estats->rx_discards);
867 dev_info(&pf->pdev->dev, 867 dev_info(&pf->pdev->dev,
868 " rx_missed = \t%lld \trx_unknown_protocol = \t%lld \ttx_bytes = \t%lld\n", 868 " rx_unknown_protocol = \t%lld \ttx_bytes = \t%lld\n",
869 estats->rx_missed, estats->rx_unknown_protocol, 869 estats->rx_unknown_protocol, estats->tx_bytes);
870 estats->tx_bytes);
871 dev_info(&pf->pdev->dev, 870 dev_info(&pf->pdev->dev,
872 " tx_unicast = \t%lld \ttx_multicast = \t\t%lld \ttx_broadcast = \t%lld\n", 871 " tx_unicast = \t%lld \ttx_multicast = \t\t%lld \ttx_broadcast = \t%lld\n",
873 estats->tx_unicast, estats->tx_multicast, estats->tx_broadcast); 872 estats->tx_unicast, estats->tx_multicast, estats->tx_broadcast);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_diag.c b/drivers/net/ethernet/intel/i40e/i40e_diag.c
index b2380daef8c1..56438bd579e6 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_diag.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_diag.c
@@ -67,17 +67,25 @@ static i40e_status i40e_diag_reg_pattern_test(struct i40e_hw *hw,
67 67
68struct i40e_diag_reg_test_info i40e_reg_list[] = { 68struct i40e_diag_reg_test_info i40e_reg_list[] = {
69 /* offset mask elements stride */ 69 /* offset mask elements stride */
70 {I40E_QTX_CTL(0), 0x0000FFBF, 4, I40E_QTX_CTL(1) - I40E_QTX_CTL(0)}, 70 {I40E_QTX_CTL(0), 0x0000FFBF, 1,
71 {I40E_PFINT_ITR0(0), 0x00000FFF, 3, I40E_PFINT_ITR0(1) - I40E_PFINT_ITR0(0)}, 71 I40E_QTX_CTL(1) - I40E_QTX_CTL(0)},
72 {I40E_PFINT_ITRN(0, 0), 0x00000FFF, 8, I40E_PFINT_ITRN(0, 1) - I40E_PFINT_ITRN(0, 0)}, 72 {I40E_PFINT_ITR0(0), 0x00000FFF, 3,
73 {I40E_PFINT_ITRN(1, 0), 0x00000FFF, 8, I40E_PFINT_ITRN(1, 1) - I40E_PFINT_ITRN(1, 0)}, 73 I40E_PFINT_ITR0(1) - I40E_PFINT_ITR0(0)},
74 {I40E_PFINT_ITRN(2, 0), 0x00000FFF, 8, I40E_PFINT_ITRN(2, 1) - I40E_PFINT_ITRN(2, 0)}, 74 {I40E_PFINT_ITRN(0, 0), 0x00000FFF, 1,
75 {I40E_PFINT_STAT_CTL0, 0x0000000C, 1, 0}, 75 I40E_PFINT_ITRN(0, 1) - I40E_PFINT_ITRN(0, 0)},
76 {I40E_PFINT_LNKLST0, 0x00001FFF, 1, 0}, 76 {I40E_PFINT_ITRN(1, 0), 0x00000FFF, 1,
77 {I40E_PFINT_LNKLSTN(0), 0x000007FF, 64, I40E_PFINT_LNKLSTN(1) - I40E_PFINT_LNKLSTN(0)}, 77 I40E_PFINT_ITRN(1, 1) - I40E_PFINT_ITRN(1, 0)},
78 {I40E_QINT_TQCTL(0), 0x000000FF, 64, I40E_QINT_TQCTL(1) - I40E_QINT_TQCTL(0)}, 78 {I40E_PFINT_ITRN(2, 0), 0x00000FFF, 1,
79 {I40E_QINT_RQCTL(0), 0x000000FF, 64, I40E_QINT_RQCTL(1) - I40E_QINT_RQCTL(0)}, 79 I40E_PFINT_ITRN(2, 1) - I40E_PFINT_ITRN(2, 0)},
80 {I40E_PFINT_ICR0_ENA, 0xF7F20000, 1, 0}, 80 {I40E_PFINT_STAT_CTL0, 0x0000000C, 1, 0},
81 {I40E_PFINT_LNKLST0, 0x00001FFF, 1, 0},
82 {I40E_PFINT_LNKLSTN(0), 0x000007FF, 1,
83 I40E_PFINT_LNKLSTN(1) - I40E_PFINT_LNKLSTN(0)},
84 {I40E_QINT_TQCTL(0), 0x000000FF, 1,
85 I40E_QINT_TQCTL(1) - I40E_QINT_TQCTL(0)},
86 {I40E_QINT_RQCTL(0), 0x000000FF, 1,
87 I40E_QINT_RQCTL(1) - I40E_QINT_RQCTL(0)},
88 {I40E_PFINT_ICR0_ENA, 0xF7F20000, 1, 0},
81 { 0 } 89 { 0 }
82}; 90};
83 91
@@ -93,9 +101,25 @@ i40e_status i40e_diag_reg_test(struct i40e_hw *hw)
93 u32 reg, mask; 101 u32 reg, mask;
94 u32 i, j; 102 u32 i, j;
95 103
96 for (i = 0; (i40e_reg_list[i].offset != 0) && !ret_code; i++) { 104 for (i = 0; i40e_reg_list[i].offset != 0 &&
105 !ret_code; i++) {
106
107 /* set actual reg range for dynamically allocated resources */
108 if (i40e_reg_list[i].offset == I40E_QTX_CTL(0) &&
109 hw->func_caps.num_tx_qp != 0)
110 i40e_reg_list[i].elements = hw->func_caps.num_tx_qp;
111 if ((i40e_reg_list[i].offset == I40E_PFINT_ITRN(0, 0) ||
112 i40e_reg_list[i].offset == I40E_PFINT_ITRN(1, 0) ||
113 i40e_reg_list[i].offset == I40E_PFINT_ITRN(2, 0) ||
114 i40e_reg_list[i].offset == I40E_QINT_TQCTL(0) ||
115 i40e_reg_list[i].offset == I40E_QINT_RQCTL(0)) &&
116 hw->func_caps.num_msix_vectors != 0)
117 i40e_reg_list[i].elements =
118 hw->func_caps.num_msix_vectors - 1;
119
120 /* test register access */
97 mask = i40e_reg_list[i].mask; 121 mask = i40e_reg_list[i].mask;
98 for (j = 0; (j < i40e_reg_list[i].elements) && !ret_code; j++) { 122 for (j = 0; j < i40e_reg_list[i].elements && !ret_code; j++) {
99 reg = i40e_reg_list[i].offset + 123 reg = i40e_reg_list[i].offset +
100 (j * i40e_reg_list[i].stride); 124 (j * i40e_reg_list[i].stride);
101 ret_code = i40e_diag_reg_pattern_test(hw, reg, mask); 125 ret_code = i40e_diag_reg_pattern_test(hw, reg, mask);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 354181d17612..1bb470b94094 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -62,6 +62,12 @@ static const struct i40e_stats i40e_gstrings_net_stats[] = {
62 I40E_NETDEV_STAT(rx_crc_errors), 62 I40E_NETDEV_STAT(rx_crc_errors),
63}; 63};
64 64
65static const struct i40e_stats i40e_gstrings_misc_stats[] = {
66 I40E_VSI_STAT("rx_unknown_protocol", eth_stats.rx_unknown_protocol),
67 I40E_VSI_STAT("rx_broadcast", eth_stats.rx_broadcast),
68 I40E_VSI_STAT("tx_broadcast", eth_stats.tx_broadcast),
69};
70
65static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi, 71static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi,
66 struct ethtool_rxnfc *cmd); 72 struct ethtool_rxnfc *cmd);
67 73
@@ -78,7 +84,6 @@ static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi,
78static struct i40e_stats i40e_gstrings_stats[] = { 84static struct i40e_stats i40e_gstrings_stats[] = {
79 I40E_PF_STAT("rx_bytes", stats.eth.rx_bytes), 85 I40E_PF_STAT("rx_bytes", stats.eth.rx_bytes),
80 I40E_PF_STAT("tx_bytes", stats.eth.tx_bytes), 86 I40E_PF_STAT("tx_bytes", stats.eth.tx_bytes),
81 I40E_PF_STAT("rx_errors", stats.eth.rx_errors),
82 I40E_PF_STAT("tx_errors", stats.eth.tx_errors), 87 I40E_PF_STAT("tx_errors", stats.eth.tx_errors),
83 I40E_PF_STAT("rx_dropped", stats.eth.rx_discards), 88 I40E_PF_STAT("rx_dropped", stats.eth.rx_discards),
84 I40E_PF_STAT("tx_dropped", stats.eth.tx_discards), 89 I40E_PF_STAT("tx_dropped", stats.eth.tx_discards),
@@ -126,7 +131,9 @@ static struct i40e_stats i40e_gstrings_stats[] = {
126 * (sizeof(struct i40e_queue_stats) / sizeof(u64))) 131 * (sizeof(struct i40e_queue_stats) / sizeof(u64)))
127#define I40E_GLOBAL_STATS_LEN ARRAY_SIZE(i40e_gstrings_stats) 132#define I40E_GLOBAL_STATS_LEN ARRAY_SIZE(i40e_gstrings_stats)
128#define I40E_NETDEV_STATS_LEN ARRAY_SIZE(i40e_gstrings_net_stats) 133#define I40E_NETDEV_STATS_LEN ARRAY_SIZE(i40e_gstrings_net_stats)
134#define I40E_MISC_STATS_LEN ARRAY_SIZE(i40e_gstrings_misc_stats)
129#define I40E_VSI_STATS_LEN(n) (I40E_NETDEV_STATS_LEN + \ 135#define I40E_VSI_STATS_LEN(n) (I40E_NETDEV_STATS_LEN + \
136 I40E_MISC_STATS_LEN + \
130 I40E_QUEUE_STATS_LEN((n))) 137 I40E_QUEUE_STATS_LEN((n)))
131#define I40E_PFC_STATS_LEN ( \ 138#define I40E_PFC_STATS_LEN ( \
132 (FIELD_SIZEOF(struct i40e_pf, stats.priority_xoff_rx) + \ 139 (FIELD_SIZEOF(struct i40e_pf, stats.priority_xoff_rx) + \
@@ -649,6 +656,11 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
649 data[i++] = (i40e_gstrings_net_stats[j].sizeof_stat == 656 data[i++] = (i40e_gstrings_net_stats[j].sizeof_stat ==
650 sizeof(u64)) ? *(u64 *)p : *(u32 *)p; 657 sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
651 } 658 }
659 for (j = 0; j < I40E_MISC_STATS_LEN; j++) {
660 p = (char *)vsi + i40e_gstrings_misc_stats[j].stat_offset;
661 data[i++] = (i40e_gstrings_misc_stats[j].sizeof_stat ==
662 sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
663 }
652 rcu_read_lock(); 664 rcu_read_lock();
653 for (j = 0; j < vsi->num_queue_pairs; j++) { 665 for (j = 0; j < vsi->num_queue_pairs; j++) {
654 tx_ring = ACCESS_ONCE(vsi->tx_rings[j]); 666 tx_ring = ACCESS_ONCE(vsi->tx_rings[j]);
@@ -715,6 +727,11 @@ static void i40e_get_strings(struct net_device *netdev, u32 stringset,
715 i40e_gstrings_net_stats[i].stat_string); 727 i40e_gstrings_net_stats[i].stat_string);
716 p += ETH_GSTRING_LEN; 728 p += ETH_GSTRING_LEN;
717 } 729 }
730 for (i = 0; i < I40E_MISC_STATS_LEN; i++) {
731 snprintf(p, ETH_GSTRING_LEN, "%s",
732 i40e_gstrings_misc_stats[i].stat_string);
733 p += ETH_GSTRING_LEN;
734 }
718 for (i = 0; i < vsi->num_queue_pairs; i++) { 735 for (i = 0; i < vsi->num_queue_pairs; i++) {
719 snprintf(p, ETH_GSTRING_LEN, "tx-%u.tx_packets", i); 736 snprintf(p, ETH_GSTRING_LEN, "tx-%u.tx_packets", i);
720 p += ETH_GSTRING_LEN; 737 p += ETH_GSTRING_LEN;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index cef3db44301e..35e5ba4a7856 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -530,6 +530,12 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi)
530 i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx), 530 i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx),
531 vsi->stat_offsets_loaded, 531 vsi->stat_offsets_loaded,
532 &oes->rx_discards, &es->rx_discards); 532 &oes->rx_discards, &es->rx_discards);
533 i40e_stat_update32(hw, I40E_GLV_RUPP(stat_idx),
534 vsi->stat_offsets_loaded,
535 &oes->rx_unknown_protocol, &es->rx_unknown_protocol);
536 i40e_stat_update32(hw, I40E_GLV_TEPC(stat_idx),
537 vsi->stat_offsets_loaded,
538 &oes->tx_errors, &es->tx_errors);
533 539
534 i40e_stat_update48(hw, I40E_GLV_GORCH(stat_idx), 540 i40e_stat_update48(hw, I40E_GLV_GORCH(stat_idx),
535 I40E_GLV_GORCL(stat_idx), 541 I40E_GLV_GORCL(stat_idx),
@@ -720,19 +726,18 @@ static void i40e_update_prio_xoff_rx(struct i40e_pf *pf)
720} 726}
721 727
722/** 728/**
723 * i40e_update_stats - Update the board statistics counters. 729 * i40e_update_vsi_stats - Update the vsi statistics counters.
724 * @vsi: the VSI to be updated 730 * @vsi: the VSI to be updated
725 * 731 *
726 * There are a few instances where we store the same stat in a 732 * There are a few instances where we store the same stat in a
727 * couple of different structs. This is partly because we have 733 * couple of different structs. This is partly because we have
728 * the netdev stats that need to be filled out, which is slightly 734 * the netdev stats that need to be filled out, which is slightly
729 * different from the "eth_stats" defined by the chip and used in 735 * different from the "eth_stats" defined by the chip and used in
730 * VF communications. We sort it all out here in a central place. 736 * VF communications. We sort it out here.
731 **/ 737 **/
732void i40e_update_stats(struct i40e_vsi *vsi) 738static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
733{ 739{
734 struct i40e_pf *pf = vsi->back; 740 struct i40e_pf *pf = vsi->back;
735 struct i40e_hw *hw = &pf->hw;
736 struct rtnl_link_stats64 *ons; 741 struct rtnl_link_stats64 *ons;
737 struct rtnl_link_stats64 *ns; /* netdev stats */ 742 struct rtnl_link_stats64 *ns; /* netdev stats */
738 struct i40e_eth_stats *oes; 743 struct i40e_eth_stats *oes;
@@ -741,8 +746,6 @@ void i40e_update_stats(struct i40e_vsi *vsi)
741 u32 rx_page, rx_buf; 746 u32 rx_page, rx_buf;
742 u64 rx_p, rx_b; 747 u64 rx_p, rx_b;
743 u64 tx_p, tx_b; 748 u64 tx_p, tx_b;
744 u32 val;
745 int i;
746 u16 q; 749 u16 q;
747 750
748 if (test_bit(__I40E_DOWN, &vsi->state) || 751 if (test_bit(__I40E_DOWN, &vsi->state) ||
@@ -804,196 +807,222 @@ void i40e_update_stats(struct i40e_vsi *vsi)
804 ns->tx_packets = tx_p; 807 ns->tx_packets = tx_p;
805 ns->tx_bytes = tx_b; 808 ns->tx_bytes = tx_b;
806 809
807 i40e_update_eth_stats(vsi);
808 /* update netdev stats from eth stats */ 810 /* update netdev stats from eth stats */
809 ons->rx_errors = oes->rx_errors; 811 i40e_update_eth_stats(vsi);
810 ns->rx_errors = es->rx_errors;
811 ons->tx_errors = oes->tx_errors; 812 ons->tx_errors = oes->tx_errors;
812 ns->tx_errors = es->tx_errors; 813 ns->tx_errors = es->tx_errors;
813 ons->multicast = oes->rx_multicast; 814 ons->multicast = oes->rx_multicast;
814 ns->multicast = es->rx_multicast; 815 ns->multicast = es->rx_multicast;
816 ons->rx_dropped = oes->rx_discards;
817 ns->rx_dropped = es->rx_discards;
815 ons->tx_dropped = oes->tx_discards; 818 ons->tx_dropped = oes->tx_discards;
816 ns->tx_dropped = es->tx_discards; 819 ns->tx_dropped = es->tx_discards;
817 820
818 /* Get the port data only if this is the main PF VSI */ 821 /* pull in a couple PF stats if this is the main vsi */
819 if (vsi == pf->vsi[pf->lan_vsi]) { 822 if (vsi == pf->vsi[pf->lan_vsi]) {
820 struct i40e_hw_port_stats *nsd = &pf->stats; 823 ns->rx_crc_errors = pf->stats.crc_errors;
821 struct i40e_hw_port_stats *osd = &pf->stats_offsets; 824 ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes;
822 825 ns->rx_length_errors = pf->stats.rx_length_errors;
823 i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port), 826 }
824 I40E_GLPRT_GORCL(hw->port), 827}
825 pf->stat_offsets_loaded,
826 &osd->eth.rx_bytes, &nsd->eth.rx_bytes);
827 i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
828 I40E_GLPRT_GOTCL(hw->port),
829 pf->stat_offsets_loaded,
830 &osd->eth.tx_bytes, &nsd->eth.tx_bytes);
831 i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
832 pf->stat_offsets_loaded,
833 &osd->eth.rx_discards,
834 &nsd->eth.rx_discards);
835 i40e_stat_update32(hw, I40E_GLPRT_TDPC(hw->port),
836 pf->stat_offsets_loaded,
837 &osd->eth.tx_discards,
838 &nsd->eth.tx_discards);
839 i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
840 I40E_GLPRT_MPRCL(hw->port),
841 pf->stat_offsets_loaded,
842 &osd->eth.rx_multicast,
843 &nsd->eth.rx_multicast);
844 828
845 i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port), 829/**
846 pf->stat_offsets_loaded, 830 * i40e_update_pf_stats - Update the pf statistics counters.
847 &osd->tx_dropped_link_down, 831 * @pf: the PF to be updated
848 &nsd->tx_dropped_link_down); 832 **/
833static void i40e_update_pf_stats(struct i40e_pf *pf)
834{
835 struct i40e_hw_port_stats *osd = &pf->stats_offsets;
836 struct i40e_hw_port_stats *nsd = &pf->stats;
837 struct i40e_hw *hw = &pf->hw;
838 u32 val;
839 int i;
849 840
850 i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port), 841 i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port),
851 pf->stat_offsets_loaded, 842 I40E_GLPRT_GORCL(hw->port),
852 &osd->crc_errors, &nsd->crc_errors); 843 pf->stat_offsets_loaded,
853 ns->rx_crc_errors = nsd->crc_errors; 844 &osd->eth.rx_bytes, &nsd->eth.rx_bytes);
845 i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
846 I40E_GLPRT_GOTCL(hw->port),
847 pf->stat_offsets_loaded,
848 &osd->eth.tx_bytes, &nsd->eth.tx_bytes);
849 i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
850 pf->stat_offsets_loaded,
851 &osd->eth.rx_discards,
852 &nsd->eth.rx_discards);
853 i40e_stat_update32(hw, I40E_GLPRT_TDPC(hw->port),
854 pf->stat_offsets_loaded,
855 &osd->eth.tx_discards,
856 &nsd->eth.tx_discards);
857 i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
858 I40E_GLPRT_MPRCL(hw->port),
859 pf->stat_offsets_loaded,
860 &osd->eth.rx_multicast,
861 &nsd->eth.rx_multicast);
854 862
855 i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port), 863 i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port),
856 pf->stat_offsets_loaded, 864 pf->stat_offsets_loaded,
857 &osd->illegal_bytes, &nsd->illegal_bytes); 865 &osd->tx_dropped_link_down,
858 ns->rx_errors = nsd->crc_errors 866 &nsd->tx_dropped_link_down);
859 + nsd->illegal_bytes;
860 867
861 i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port), 868 i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port),
862 pf->stat_offsets_loaded, 869 pf->stat_offsets_loaded,
863 &osd->mac_local_faults, 870 &osd->crc_errors, &nsd->crc_errors);
864 &nsd->mac_local_faults);
865 i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
866 pf->stat_offsets_loaded,
867 &osd->mac_remote_faults,
868 &nsd->mac_remote_faults);
869 871
870 i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port), 872 i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port),
871 pf->stat_offsets_loaded, 873 pf->stat_offsets_loaded,
872 &osd->rx_length_errors, 874 &osd->illegal_bytes, &nsd->illegal_bytes);
873 &nsd->rx_length_errors);
874 ns->rx_length_errors = nsd->rx_length_errors;
875 875
876 i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port), 876 i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port),
877 pf->stat_offsets_loaded, 877 pf->stat_offsets_loaded,
878 &osd->link_xon_rx, &nsd->link_xon_rx); 878 &osd->mac_local_faults,
879 i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port), 879 &nsd->mac_local_faults);
880 pf->stat_offsets_loaded, 880 i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
881 &osd->link_xon_tx, &nsd->link_xon_tx); 881 pf->stat_offsets_loaded,
882 i40e_update_prio_xoff_rx(pf); /* handles I40E_GLPRT_LXOFFRXC */ 882 &osd->mac_remote_faults,
883 i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port), 883 &nsd->mac_remote_faults);
884 pf->stat_offsets_loaded,
885 &osd->link_xoff_tx, &nsd->link_xoff_tx);
886
887 for (i = 0; i < 8; i++) {
888 i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i),
889 pf->stat_offsets_loaded,
890 &osd->priority_xon_rx[i],
891 &nsd->priority_xon_rx[i]);
892 i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i),
893 pf->stat_offsets_loaded,
894 &osd->priority_xon_tx[i],
895 &nsd->priority_xon_tx[i]);
896 i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i),
897 pf->stat_offsets_loaded,
898 &osd->priority_xoff_tx[i],
899 &nsd->priority_xoff_tx[i]);
900 i40e_stat_update32(hw,
901 I40E_GLPRT_RXON2OFFCNT(hw->port, i),
902 pf->stat_offsets_loaded,
903 &osd->priority_xon_2_xoff[i],
904 &nsd->priority_xon_2_xoff[i]);
905 }
906 884
907 i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port), 885 i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port),
908 I40E_GLPRT_PRC64L(hw->port), 886 pf->stat_offsets_loaded,
909 pf->stat_offsets_loaded, 887 &osd->rx_length_errors,
910 &osd->rx_size_64, &nsd->rx_size_64); 888 &nsd->rx_length_errors);
911 i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
912 I40E_GLPRT_PRC127L(hw->port),
913 pf->stat_offsets_loaded,
914 &osd->rx_size_127, &nsd->rx_size_127);
915 i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
916 I40E_GLPRT_PRC255L(hw->port),
917 pf->stat_offsets_loaded,
918 &osd->rx_size_255, &nsd->rx_size_255);
919 i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
920 I40E_GLPRT_PRC511L(hw->port),
921 pf->stat_offsets_loaded,
922 &osd->rx_size_511, &nsd->rx_size_511);
923 i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
924 I40E_GLPRT_PRC1023L(hw->port),
925 pf->stat_offsets_loaded,
926 &osd->rx_size_1023, &nsd->rx_size_1023);
927 i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
928 I40E_GLPRT_PRC1522L(hw->port),
929 pf->stat_offsets_loaded,
930 &osd->rx_size_1522, &nsd->rx_size_1522);
931 i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
932 I40E_GLPRT_PRC9522L(hw->port),
933 pf->stat_offsets_loaded,
934 &osd->rx_size_big, &nsd->rx_size_big);
935 889
936 i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port), 890 i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port),
937 I40E_GLPRT_PTC64L(hw->port), 891 pf->stat_offsets_loaded,
938 pf->stat_offsets_loaded, 892 &osd->link_xon_rx, &nsd->link_xon_rx);
939 &osd->tx_size_64, &nsd->tx_size_64); 893 i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port),
940 i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port), 894 pf->stat_offsets_loaded,
941 I40E_GLPRT_PTC127L(hw->port), 895 &osd->link_xon_tx, &nsd->link_xon_tx);
942 pf->stat_offsets_loaded, 896 i40e_update_prio_xoff_rx(pf); /* handles I40E_GLPRT_LXOFFRXC */
943 &osd->tx_size_127, &nsd->tx_size_127); 897 i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port),
944 i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port), 898 pf->stat_offsets_loaded,
945 I40E_GLPRT_PTC255L(hw->port), 899 &osd->link_xoff_tx, &nsd->link_xoff_tx);
946 pf->stat_offsets_loaded,
947 &osd->tx_size_255, &nsd->tx_size_255);
948 i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
949 I40E_GLPRT_PTC511L(hw->port),
950 pf->stat_offsets_loaded,
951 &osd->tx_size_511, &nsd->tx_size_511);
952 i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
953 I40E_GLPRT_PTC1023L(hw->port),
954 pf->stat_offsets_loaded,
955 &osd->tx_size_1023, &nsd->tx_size_1023);
956 i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
957 I40E_GLPRT_PTC1522L(hw->port),
958 pf->stat_offsets_loaded,
959 &osd->tx_size_1522, &nsd->tx_size_1522);
960 i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
961 I40E_GLPRT_PTC9522L(hw->port),
962 pf->stat_offsets_loaded,
963 &osd->tx_size_big, &nsd->tx_size_big);
964 900
965 i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port), 901 for (i = 0; i < 8; i++) {
966 pf->stat_offsets_loaded, 902 i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i),
967 &osd->rx_undersize, &nsd->rx_undersize);
968 i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
969 pf->stat_offsets_loaded,
970 &osd->rx_fragments, &nsd->rx_fragments);
971 i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port),
972 pf->stat_offsets_loaded, 903 pf->stat_offsets_loaded,
973 &osd->rx_oversize, &nsd->rx_oversize); 904 &osd->priority_xon_rx[i],
974 i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port), 905 &nsd->priority_xon_rx[i]);
906 i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i),
975 pf->stat_offsets_loaded, 907 pf->stat_offsets_loaded,
976 &osd->rx_jabber, &nsd->rx_jabber); 908 &osd->priority_xon_tx[i],
977 909 &nsd->priority_xon_tx[i]);
978 val = rd32(hw, I40E_PRTPM_EEE_STAT); 910 i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i),
979 nsd->tx_lpi_status =
980 (val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
981 I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
982 nsd->rx_lpi_status =
983 (val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
984 I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
985 i40e_stat_update32(hw, I40E_PRTPM_TLPIC,
986 pf->stat_offsets_loaded, 911 pf->stat_offsets_loaded,
987 &osd->tx_lpi_count, &nsd->tx_lpi_count); 912 &osd->priority_xoff_tx[i],
988 i40e_stat_update32(hw, I40E_PRTPM_RLPIC, 913 &nsd->priority_xoff_tx[i]);
914 i40e_stat_update32(hw,
915 I40E_GLPRT_RXON2OFFCNT(hw->port, i),
989 pf->stat_offsets_loaded, 916 pf->stat_offsets_loaded,
990 &osd->rx_lpi_count, &nsd->rx_lpi_count); 917 &osd->priority_xon_2_xoff[i],
918 &nsd->priority_xon_2_xoff[i]);
991 } 919 }
992 920
921 i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port),
922 I40E_GLPRT_PRC64L(hw->port),
923 pf->stat_offsets_loaded,
924 &osd->rx_size_64, &nsd->rx_size_64);
925 i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
926 I40E_GLPRT_PRC127L(hw->port),
927 pf->stat_offsets_loaded,
928 &osd->rx_size_127, &nsd->rx_size_127);
929 i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
930 I40E_GLPRT_PRC255L(hw->port),
931 pf->stat_offsets_loaded,
932 &osd->rx_size_255, &nsd->rx_size_255);
933 i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
934 I40E_GLPRT_PRC511L(hw->port),
935 pf->stat_offsets_loaded,
936 &osd->rx_size_511, &nsd->rx_size_511);
937 i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
938 I40E_GLPRT_PRC1023L(hw->port),
939 pf->stat_offsets_loaded,
940 &osd->rx_size_1023, &nsd->rx_size_1023);
941 i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
942 I40E_GLPRT_PRC1522L(hw->port),
943 pf->stat_offsets_loaded,
944 &osd->rx_size_1522, &nsd->rx_size_1522);
945 i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
946 I40E_GLPRT_PRC9522L(hw->port),
947 pf->stat_offsets_loaded,
948 &osd->rx_size_big, &nsd->rx_size_big);
949
950 i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port),
951 I40E_GLPRT_PTC64L(hw->port),
952 pf->stat_offsets_loaded,
953 &osd->tx_size_64, &nsd->tx_size_64);
954 i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port),
955 I40E_GLPRT_PTC127L(hw->port),
956 pf->stat_offsets_loaded,
957 &osd->tx_size_127, &nsd->tx_size_127);
958 i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port),
959 I40E_GLPRT_PTC255L(hw->port),
960 pf->stat_offsets_loaded,
961 &osd->tx_size_255, &nsd->tx_size_255);
962 i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
963 I40E_GLPRT_PTC511L(hw->port),
964 pf->stat_offsets_loaded,
965 &osd->tx_size_511, &nsd->tx_size_511);
966 i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
967 I40E_GLPRT_PTC1023L(hw->port),
968 pf->stat_offsets_loaded,
969 &osd->tx_size_1023, &nsd->tx_size_1023);
970 i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
971 I40E_GLPRT_PTC1522L(hw->port),
972 pf->stat_offsets_loaded,
973 &osd->tx_size_1522, &nsd->tx_size_1522);
974 i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
975 I40E_GLPRT_PTC9522L(hw->port),
976 pf->stat_offsets_loaded,
977 &osd->tx_size_big, &nsd->tx_size_big);
978
979 i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port),
980 pf->stat_offsets_loaded,
981 &osd->rx_undersize, &nsd->rx_undersize);
982 i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
983 pf->stat_offsets_loaded,
984 &osd->rx_fragments, &nsd->rx_fragments);
985 i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port),
986 pf->stat_offsets_loaded,
987 &osd->rx_oversize, &nsd->rx_oversize);
988 i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port),
989 pf->stat_offsets_loaded,
990 &osd->rx_jabber, &nsd->rx_jabber);
991
992 val = rd32(hw, I40E_PRTPM_EEE_STAT);
993 nsd->tx_lpi_status =
994 (val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
995 I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
996 nsd->rx_lpi_status =
997 (val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
998 I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
999 i40e_stat_update32(hw, I40E_PRTPM_TLPIC,
1000 pf->stat_offsets_loaded,
1001 &osd->tx_lpi_count, &nsd->tx_lpi_count);
1002 i40e_stat_update32(hw, I40E_PRTPM_RLPIC,
1003 pf->stat_offsets_loaded,
1004 &osd->rx_lpi_count, &nsd->rx_lpi_count);
1005
993 pf->stat_offsets_loaded = true; 1006 pf->stat_offsets_loaded = true;
994} 1007}
995 1008
996/** 1009/**
1010 * i40e_update_stats - Update the various statistics counters.
1011 * @vsi: the VSI to be updated
1012 *
1013 * Update the various stats for this VSI and its related entities.
1014 **/
1015void i40e_update_stats(struct i40e_vsi *vsi)
1016{
1017 struct i40e_pf *pf = vsi->back;
1018
1019 if (vsi == pf->vsi[pf->lan_vsi])
1020 i40e_update_pf_stats(pf);
1021
1022 i40e_update_vsi_stats(vsi);
1023}
1024
1025/**
997 * i40e_find_filter - Search VSI filter list for specific mac/vlan filter 1026 * i40e_find_filter - Search VSI filter list for specific mac/vlan filter
998 * @vsi: the VSI to be searched 1027 * @vsi: the VSI to be searched
999 * @macaddr: the MAC address 1028 * @macaddr: the MAC address
@@ -1698,7 +1727,7 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf)
1698static int i40e_change_mtu(struct net_device *netdev, int new_mtu) 1727static int i40e_change_mtu(struct net_device *netdev, int new_mtu)
1699{ 1728{
1700 struct i40e_netdev_priv *np = netdev_priv(netdev); 1729 struct i40e_netdev_priv *np = netdev_priv(netdev);
1701 int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; 1730 int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
1702 struct i40e_vsi *vsi = np->vsi; 1731 struct i40e_vsi *vsi = np->vsi;
1703 1732
1704 /* MTU < 68 is an error and causes problems on some kernels */ 1733 /* MTU < 68 is an error and causes problems on some kernels */
@@ -4412,6 +4441,9 @@ void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags)
4412 4441
4413 WARN_ON(in_interrupt()); 4442 WARN_ON(in_interrupt());
4414 4443
4444 if (i40e_check_asq_alive(&pf->hw))
4445 i40e_vc_notify_reset(pf);
4446
4415 /* do the biggest reset indicated */ 4447 /* do the biggest reset indicated */
4416 if (reset_flags & (1 << __I40E_GLOBAL_RESET_REQUESTED)) { 4448 if (reset_flags & (1 << __I40E_GLOBAL_RESET_REQUESTED)) {
4417 4449
@@ -5328,9 +5360,6 @@ static int i40e_prep_for_reset(struct i40e_pf *pf)
5328 5360
5329 dev_dbg(&pf->pdev->dev, "Tearing down internal switch for reset\n"); 5361 dev_dbg(&pf->pdev->dev, "Tearing down internal switch for reset\n");
5330 5362
5331 if (i40e_check_asq_alive(hw))
5332 i40e_vc_notify_reset(pf);
5333
5334 /* quiesce the VSIs and their queues that are not already DOWN */ 5363 /* quiesce the VSIs and their queues that are not already DOWN */
5335 i40e_pf_quiesce_all_vsi(pf); 5364 i40e_pf_quiesce_all_vsi(pf);
5336 5365
@@ -5351,13 +5380,28 @@ static int i40e_prep_for_reset(struct i40e_pf *pf)
5351} 5380}
5352 5381
5353/** 5382/**
5383 * i40e_send_version - update firmware with driver version
5384 * @pf: PF struct
5385 */
5386static void i40e_send_version(struct i40e_pf *pf)
5387{
5388 struct i40e_driver_version dv;
5389
5390 dv.major_version = DRV_VERSION_MAJOR;
5391 dv.minor_version = DRV_VERSION_MINOR;
5392 dv.build_version = DRV_VERSION_BUILD;
5393 dv.subbuild_version = 0;
5394 strncpy(dv.driver_string, DRV_VERSION, sizeof(dv.driver_string));
5395 i40e_aq_send_driver_version(&pf->hw, &dv, NULL);
5396}
5397
5398/**
5354 * i40e_reset_and_rebuild - reset and rebuild using a saved config 5399 * i40e_reset_and_rebuild - reset and rebuild using a saved config
5355 * @pf: board private structure 5400 * @pf: board private structure
5356 * @reinit: if the Main VSI needs to re-initialized. 5401 * @reinit: if the Main VSI needs to re-initialized.
5357 **/ 5402 **/
5358static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit) 5403static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
5359{ 5404{
5360 struct i40e_driver_version dv;
5361 struct i40e_hw *hw = &pf->hw; 5405 struct i40e_hw *hw = &pf->hw;
5362 i40e_status ret; 5406 i40e_status ret;
5363 u32 v; 5407 u32 v;
@@ -5490,11 +5534,7 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
5490 } 5534 }
5491 5535
5492 /* tell the firmware that we're starting */ 5536 /* tell the firmware that we're starting */
5493 dv.major_version = DRV_VERSION_MAJOR; 5537 i40e_send_version(pf);
5494 dv.minor_version = DRV_VERSION_MINOR;
5495 dv.build_version = DRV_VERSION_BUILD;
5496 dv.subbuild_version = 0;
5497 i40e_aq_send_driver_version(&pf->hw, &dv, NULL);
5498 5538
5499 dev_info(&pf->pdev->dev, "reset complete\n"); 5539 dev_info(&pf->pdev->dev, "reset complete\n");
5500 5540
@@ -8138,7 +8178,6 @@ static void i40e_print_features(struct i40e_pf *pf)
8138 **/ 8178 **/
8139static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 8179static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
8140{ 8180{
8141 struct i40e_driver_version dv;
8142 struct i40e_pf *pf; 8181 struct i40e_pf *pf;
8143 struct i40e_hw *hw; 8182 struct i40e_hw *hw;
8144 static u16 pfs_found; 8183 static u16 pfs_found;
@@ -8393,12 +8432,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
8393 i40e_dbg_pf_init(pf); 8432 i40e_dbg_pf_init(pf);
8394 8433
8395 /* tell the firmware that we're starting */ 8434 /* tell the firmware that we're starting */
8396 dv.major_version = DRV_VERSION_MAJOR; 8435 i40e_send_version(pf);
8397 dv.minor_version = DRV_VERSION_MINOR;
8398 dv.build_version = DRV_VERSION_BUILD;
8399 dv.subbuild_version = 0;
8400 strncpy(dv.driver_string, DRV_VERSION, sizeof(dv.driver_string));
8401 i40e_aq_send_driver_version(&pf->hw, &dv, NULL);
8402 8436
8403 /* since everything's happy, start the service_task timer */ 8437 /* since everything's happy, start the service_task timer */
8404 mod_timer(&pf->service_timer, 8438 mod_timer(&pf->service_timer,
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 5a2218762db1..1fe28ca18296 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -458,13 +458,13 @@ static void i40e_fd_handle_status(struct i40e_ring *rx_ring,
458 */ 458 */
459 if (fcnt_prog >= (fcnt_avail - I40E_FDIR_BUFFER_FULL_MARGIN)) { 459 if (fcnt_prog >= (fcnt_avail - I40E_FDIR_BUFFER_FULL_MARGIN)) {
460 /* Turn off ATR first */ 460 /* Turn off ATR first */
461 if (pf->flags | I40E_FLAG_FD_ATR_ENABLED) { 461 if (pf->flags & I40E_FLAG_FD_ATR_ENABLED) {
462 pf->flags &= ~I40E_FLAG_FD_ATR_ENABLED; 462 pf->flags &= ~I40E_FLAG_FD_ATR_ENABLED;
463 dev_warn(&pdev->dev, "FD filter space full, ATR for further flows will be turned off\n"); 463 dev_warn(&pdev->dev, "FD filter space full, ATR for further flows will be turned off\n");
464 pf->auto_disable_flags |= 464 pf->auto_disable_flags |=
465 I40E_FLAG_FD_ATR_ENABLED; 465 I40E_FLAG_FD_ATR_ENABLED;
466 pf->flags |= I40E_FLAG_FDIR_REQUIRES_REINIT; 466 pf->flags |= I40E_FLAG_FDIR_REQUIRES_REINIT;
467 } else if (pf->flags | I40E_FLAG_FD_SB_ENABLED) { 467 } else if (pf->flags & I40E_FLAG_FD_SB_ENABLED) {
468 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; 468 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED;
469 dev_warn(&pdev->dev, "FD filter space full, new ntuple rules will not be added\n"); 469 dev_warn(&pdev->dev, "FD filter space full, new ntuple rules will not be added\n");
470 pf->auto_disable_flags |= 470 pf->auto_disable_flags |=
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
index d5e3f5430284..30e5fe35fa3d 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
@@ -179,7 +179,6 @@ enum i40e_ring_state_t {
179 __I40E_TX_DETECT_HANG, 179 __I40E_TX_DETECT_HANG,
180 __I40E_HANG_CHECK_ARMED, 180 __I40E_HANG_CHECK_ARMED,
181 __I40E_RX_PS_ENABLED, 181 __I40E_RX_PS_ENABLED,
182 __I40E_RX_LRO_ENABLED,
183 __I40E_RX_16BYTE_DESC_ENABLED, 182 __I40E_RX_16BYTE_DESC_ENABLED,
184}; 183};
185 184
@@ -195,12 +194,6 @@ enum i40e_ring_state_t {
195 set_bit(__I40E_TX_DETECT_HANG, &(ring)->state) 194 set_bit(__I40E_TX_DETECT_HANG, &(ring)->state)
196#define clear_check_for_tx_hang(ring) \ 195#define clear_check_for_tx_hang(ring) \
197 clear_bit(__I40E_TX_DETECT_HANG, &(ring)->state) 196 clear_bit(__I40E_TX_DETECT_HANG, &(ring)->state)
198#define ring_is_lro_enabled(ring) \
199 test_bit(__I40E_RX_LRO_ENABLED, &(ring)->state)
200#define set_ring_lro_enabled(ring) \
201 set_bit(__I40E_RX_LRO_ENABLED, &(ring)->state)
202#define clear_ring_lro_enabled(ring) \
203 clear_bit(__I40E_RX_LRO_ENABLED, &(ring)->state)
204#define ring_is_16byte_desc_enabled(ring) \ 197#define ring_is_16byte_desc_enabled(ring) \
205 test_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) 198 test_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state)
206#define set_ring_16byte_desc_enabled(ring) \ 199#define set_ring_16byte_desc_enabled(ring) \
diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h b/drivers/net/ethernet/intel/i40e/i40e_type.h
index 71f9718caf0a..5a930b31728f 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_type.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
@@ -60,8 +60,8 @@
60/* Max default timeout in ms, */ 60/* Max default timeout in ms, */
61#define I40E_MAX_NVM_TIMEOUT 18000 61#define I40E_MAX_NVM_TIMEOUT 18000
62 62
63/* Switch from mc to the 2usec global time (this is the GTIME resolution) */ 63/* Switch from ms to the 1usec global time (this is the GTIME resolution) */
64#define I40E_MS_TO_GTIME(time) (((time) * 1000) / 2) 64#define I40E_MS_TO_GTIME(time) ((time) * 1000)
65 65
66/* forward declaration */ 66/* forward declaration */
67struct i40e_hw; 67struct i40e_hw;
@@ -955,6 +955,16 @@ struct i40e_vsi_context {
955 struct i40e_aqc_vsi_properties_data info; 955 struct i40e_aqc_vsi_properties_data info;
956}; 956};
957 957
958struct i40e_veb_context {
959 u16 seid;
960 u16 uplink_seid;
961 u16 veb_number;
962 u16 vebs_allocated;
963 u16 vebs_unallocated;
964 u16 flags;
965 struct i40e_aqc_get_veb_parameters_completion info;
966};
967
958/* Statistics collected by each port, VSI, VEB, and S-channel */ 968/* Statistics collected by each port, VSI, VEB, and S-channel */
959struct i40e_eth_stats { 969struct i40e_eth_stats {
960 u64 rx_bytes; /* gorc */ 970 u64 rx_bytes; /* gorc */
@@ -962,8 +972,6 @@ struct i40e_eth_stats {
962 u64 rx_multicast; /* mprc */ 972 u64 rx_multicast; /* mprc */
963 u64 rx_broadcast; /* bprc */ 973 u64 rx_broadcast; /* bprc */
964 u64 rx_discards; /* rdpc */ 974 u64 rx_discards; /* rdpc */
965 u64 rx_errors; /* repc */
966 u64 rx_missed; /* rmpc */
967 u64 rx_unknown_protocol; /* rupp */ 975 u64 rx_unknown_protocol; /* rupp */
968 u64 tx_bytes; /* gotc */ 976 u64 tx_bytes; /* gotc */
969 u64 tx_unicast; /* uptc */ 977 u64 tx_unicast; /* uptc */
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
index af639d8608a5..e297a3aba0f2 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
@@ -178,7 +178,6 @@ enum i40e_ring_state_t {
178 __I40E_TX_DETECT_HANG, 178 __I40E_TX_DETECT_HANG,
179 __I40E_HANG_CHECK_ARMED, 179 __I40E_HANG_CHECK_ARMED,
180 __I40E_RX_PS_ENABLED, 180 __I40E_RX_PS_ENABLED,
181 __I40E_RX_LRO_ENABLED,
182 __I40E_RX_16BYTE_DESC_ENABLED, 181 __I40E_RX_16BYTE_DESC_ENABLED,
183}; 182};
184 183
@@ -194,12 +193,6 @@ enum i40e_ring_state_t {
194 set_bit(__I40E_TX_DETECT_HANG, &(ring)->state) 193 set_bit(__I40E_TX_DETECT_HANG, &(ring)->state)
195#define clear_check_for_tx_hang(ring) \ 194#define clear_check_for_tx_hang(ring) \
196 clear_bit(__I40E_TX_DETECT_HANG, &(ring)->state) 195 clear_bit(__I40E_TX_DETECT_HANG, &(ring)->state)
197#define ring_is_lro_enabled(ring) \
198 test_bit(__I40E_RX_LRO_ENABLED, &(ring)->state)
199#define set_ring_lro_enabled(ring) \
200 set_bit(__I40E_RX_LRO_ENABLED, &(ring)->state)
201#define clear_ring_lro_enabled(ring) \
202 clear_bit(__I40E_RX_LRO_ENABLED, &(ring)->state)
203#define ring_is_16byte_desc_enabled(ring) \ 196#define ring_is_16byte_desc_enabled(ring) \
204 test_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) 197 test_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state)
205#define set_ring_16byte_desc_enabled(ring) \ 198#define set_ring_16byte_desc_enabled(ring) \
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_type.h b/drivers/net/ethernet/intel/i40evf/i40e_type.h
index 67082f7bfcef..4fc9835ca7b1 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_type.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_type.h
@@ -60,8 +60,8 @@
60/* Max default timeout in ms, */ 60/* Max default timeout in ms, */
61#define I40E_MAX_NVM_TIMEOUT 18000 61#define I40E_MAX_NVM_TIMEOUT 18000
62 62
63/* Switch from mc to the 2usec global time (this is the GTIME resolution) */ 63/* Switch from ms to the 1usec global time (this is the GTIME resolution) */
64#define I40E_MS_TO_GTIME(time) (((time) * 1000) / 2) 64#define I40E_MS_TO_GTIME(time) ((time) * 1000)
65 65
66/* forward declaration */ 66/* forward declaration */
67struct i40e_hw; 67struct i40e_hw;
@@ -955,6 +955,16 @@ struct i40e_vsi_context {
955 struct i40e_aqc_vsi_properties_data info; 955 struct i40e_aqc_vsi_properties_data info;
956}; 956};
957 957
958struct i40e_veb_context {
959 u16 seid;
960 u16 uplink_seid;
961 u16 veb_number;
962 u16 vebs_allocated;
963 u16 vebs_unallocated;
964 u16 flags;
965 struct i40e_aqc_get_veb_parameters_completion info;
966};
967
958/* Statistics collected by each port, VSI, VEB, and S-channel */ 968/* Statistics collected by each port, VSI, VEB, and S-channel */
959struct i40e_eth_stats { 969struct i40e_eth_stats {
960 u64 rx_bytes; /* gorc */ 970 u64 rx_bytes; /* gorc */
@@ -962,8 +972,6 @@ struct i40e_eth_stats {
962 u64 rx_multicast; /* mprc */ 972 u64 rx_multicast; /* mprc */
963 u64 rx_broadcast; /* bprc */ 973 u64 rx_broadcast; /* bprc */
964 u64 rx_discards; /* rdpc */ 974 u64 rx_discards; /* rdpc */
965 u64 rx_errors; /* repc */
966 u64 rx_missed; /* rmpc */
967 u64 rx_unknown_protocol; /* rupp */ 975 u64 rx_unknown_protocol; /* rupp */
968 u64 tx_bytes; /* gotc */ 976 u64 tx_bytes; /* gotc */
969 u64 tx_unicast; /* uptc */ 977 u64 tx_unicast; /* uptc */
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf.h b/drivers/net/ethernet/intel/i40evf/i40evf.h
index 2913bc3332a1..30ef519d4b91 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf.h
+++ b/drivers/net/ethernet/intel/i40evf/i40evf.h
@@ -80,7 +80,7 @@ struct i40e_vsi {
80#define I40EVF_MIN_TXD 64 80#define I40EVF_MIN_TXD 64
81#define I40EVF_MAX_RXD 4096 81#define I40EVF_MAX_RXD 4096
82#define I40EVF_MIN_RXD 64 82#define I40EVF_MIN_RXD 64
83#define I40EVF_REQ_DESCRIPTOR_MULTIPLE 8 83#define I40EVF_REQ_DESCRIPTOR_MULTIPLE 32
84 84
85/* Supported Rx Buffer Sizes */ 85/* Supported Rx Buffer Sizes */
86#define I40EVF_RXBUFFER_64 64 /* Used for packet split */ 86#define I40EVF_RXBUFFER_64 64 /* Used for packet split */
@@ -196,10 +196,12 @@ struct i40evf_adapter {
196 struct i40e_ring *tx_rings[I40E_MAX_VSI_QP]; 196 struct i40e_ring *tx_rings[I40E_MAX_VSI_QP];
197 u32 tx_timeout_count; 197 u32 tx_timeout_count;
198 struct list_head mac_filter_list; 198 struct list_head mac_filter_list;
199 u32 tx_desc_count;
199 200
200 /* RX */ 201 /* RX */
201 struct i40e_ring *rx_rings[I40E_MAX_VSI_QP]; 202 struct i40e_ring *rx_rings[I40E_MAX_VSI_QP];
202 u64 hw_csum_rx_error; 203 u64 hw_csum_rx_error;
204 u32 rx_desc_count;
203 int num_msix_vectors; 205 int num_msix_vectors;
204 struct msix_entry *msix_entries; 206 struct msix_entry *msix_entries;
205 207
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
index 9cd381a6c4be..60407a9df0c1 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
@@ -47,8 +47,6 @@ static const struct i40evf_stats i40evf_gstrings_stats[] = {
47 I40EVF_STAT("rx_multicast", current_stats.rx_multicast), 47 I40EVF_STAT("rx_multicast", current_stats.rx_multicast),
48 I40EVF_STAT("rx_broadcast", current_stats.rx_broadcast), 48 I40EVF_STAT("rx_broadcast", current_stats.rx_broadcast),
49 I40EVF_STAT("rx_discards", current_stats.rx_discards), 49 I40EVF_STAT("rx_discards", current_stats.rx_discards),
50 I40EVF_STAT("rx_errors", current_stats.rx_errors),
51 I40EVF_STAT("rx_missed", current_stats.rx_missed),
52 I40EVF_STAT("rx_unknown_protocol", current_stats.rx_unknown_protocol), 50 I40EVF_STAT("rx_unknown_protocol", current_stats.rx_unknown_protocol),
53 I40EVF_STAT("tx_bytes", current_stats.tx_bytes), 51 I40EVF_STAT("tx_bytes", current_stats.tx_bytes),
54 I40EVF_STAT("tx_unicast", current_stats.tx_unicast), 52 I40EVF_STAT("tx_unicast", current_stats.tx_unicast),
@@ -224,13 +222,11 @@ static void i40evf_get_ringparam(struct net_device *netdev,
224 struct ethtool_ringparam *ring) 222 struct ethtool_ringparam *ring)
225{ 223{
226 struct i40evf_adapter *adapter = netdev_priv(netdev); 224 struct i40evf_adapter *adapter = netdev_priv(netdev);
227 struct i40e_ring *tx_ring = adapter->tx_rings[0];
228 struct i40e_ring *rx_ring = adapter->rx_rings[0];
229 225
230 ring->rx_max_pending = I40EVF_MAX_RXD; 226 ring->rx_max_pending = I40EVF_MAX_RXD;
231 ring->tx_max_pending = I40EVF_MAX_TXD; 227 ring->tx_max_pending = I40EVF_MAX_TXD;
232 ring->rx_pending = rx_ring->count; 228 ring->rx_pending = adapter->rx_desc_count;
233 ring->tx_pending = tx_ring->count; 229 ring->tx_pending = adapter->tx_desc_count;
234} 230}
235 231
236/** 232/**
@@ -246,7 +242,6 @@ static int i40evf_set_ringparam(struct net_device *netdev,
246{ 242{
247 struct i40evf_adapter *adapter = netdev_priv(netdev); 243 struct i40evf_adapter *adapter = netdev_priv(netdev);
248 u32 new_rx_count, new_tx_count; 244 u32 new_rx_count, new_tx_count;
249 int i;
250 245
251 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) 246 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
252 return -EINVAL; 247 return -EINVAL;
@@ -262,17 +257,16 @@ static int i40evf_set_ringparam(struct net_device *netdev,
262 new_rx_count = ALIGN(new_rx_count, I40EVF_REQ_DESCRIPTOR_MULTIPLE); 257 new_rx_count = ALIGN(new_rx_count, I40EVF_REQ_DESCRIPTOR_MULTIPLE);
263 258
264 /* if nothing to do return success */ 259 /* if nothing to do return success */
265 if ((new_tx_count == adapter->tx_rings[0]->count) && 260 if ((new_tx_count == adapter->tx_desc_count) &&
266 (new_rx_count == adapter->rx_rings[0]->count)) 261 (new_rx_count == adapter->rx_desc_count))
267 return 0; 262 return 0;
268 263
269 for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { 264 adapter->tx_desc_count = new_tx_count;
270 adapter->tx_rings[0]->count = new_tx_count; 265 adapter->rx_desc_count = new_rx_count;
271 adapter->rx_rings[0]->count = new_rx_count;
272 }
273 266
274 if (netif_running(netdev)) 267 if (netif_running(netdev))
275 i40evf_reinit_locked(adapter); 268 i40evf_reinit_locked(adapter);
269
276 return 0; 270 return 0;
277} 271}
278 272
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 632c2b32afa1..d24f40f1673a 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -1091,14 +1091,14 @@ static int i40evf_alloc_queues(struct i40evf_adapter *adapter)
1091 tx_ring->queue_index = i; 1091 tx_ring->queue_index = i;
1092 tx_ring->netdev = adapter->netdev; 1092 tx_ring->netdev = adapter->netdev;
1093 tx_ring->dev = &adapter->pdev->dev; 1093 tx_ring->dev = &adapter->pdev->dev;
1094 tx_ring->count = I40EVF_DEFAULT_TXD; 1094 tx_ring->count = adapter->tx_desc_count;
1095 adapter->tx_rings[i] = tx_ring; 1095 adapter->tx_rings[i] = tx_ring;
1096 1096
1097 rx_ring = &tx_ring[1]; 1097 rx_ring = &tx_ring[1];
1098 rx_ring->queue_index = i; 1098 rx_ring->queue_index = i;
1099 rx_ring->netdev = adapter->netdev; 1099 rx_ring->netdev = adapter->netdev;
1100 rx_ring->dev = &adapter->pdev->dev; 1100 rx_ring->dev = &adapter->pdev->dev;
1101 rx_ring->count = I40EVF_DEFAULT_RXD; 1101 rx_ring->count = adapter->rx_desc_count;
1102 adapter->rx_rings[i] = rx_ring; 1102 adapter->rx_rings[i] = rx_ring;
1103 } 1103 }
1104 1104
@@ -1669,6 +1669,7 @@ static int i40evf_setup_all_tx_resources(struct i40evf_adapter *adapter)
1669 int i, err = 0; 1669 int i, err = 0;
1670 1670
1671 for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { 1671 for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
1672 adapter->tx_rings[i]->count = adapter->tx_desc_count;
1672 err = i40evf_setup_tx_descriptors(adapter->tx_rings[i]); 1673 err = i40evf_setup_tx_descriptors(adapter->tx_rings[i]);
1673 if (!err) 1674 if (!err)
1674 continue; 1675 continue;
@@ -1696,6 +1697,7 @@ static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter)
1696 int i, err = 0; 1697 int i, err = 0;
1697 1698
1698 for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { 1699 for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
1700 adapter->rx_rings[i]->count = adapter->rx_desc_count;
1699 err = i40evf_setup_rx_descriptors(adapter->rx_rings[i]); 1701 err = i40evf_setup_rx_descriptors(adapter->rx_rings[i]);
1700 if (!err) 1702 if (!err)
1701 continue; 1703 continue;
@@ -2092,6 +2094,8 @@ static void i40evf_init_task(struct work_struct *work)
2092 adapter->watchdog_timer.data = (unsigned long)adapter; 2094 adapter->watchdog_timer.data = (unsigned long)adapter;
2093 mod_timer(&adapter->watchdog_timer, jiffies + 1); 2095 mod_timer(&adapter->watchdog_timer, jiffies + 1);
2094 2096
2097 adapter->tx_desc_count = I40EVF_DEFAULT_TXD;
2098 adapter->rx_desc_count = I40EVF_DEFAULT_RXD;
2095 err = i40evf_init_interrupt_scheme(adapter); 2099 err = i40evf_init_interrupt_scheme(adapter);
2096 if (err) 2100 if (err)
2097 goto err_sw_init; 2101 goto err_sw_init;
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c b/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c
index 7f80bb417722..b3cd3cd644a1 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c
@@ -748,9 +748,8 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
748 stats->tx_broadcast; 748 stats->tx_broadcast;
749 adapter->net_stats.rx_bytes = stats->rx_bytes; 749 adapter->net_stats.rx_bytes = stats->rx_bytes;
750 adapter->net_stats.tx_bytes = stats->tx_bytes; 750 adapter->net_stats.tx_bytes = stats->tx_bytes;
751 adapter->net_stats.rx_errors = stats->rx_errors;
752 adapter->net_stats.tx_errors = stats->tx_errors; 751 adapter->net_stats.tx_errors = stats->tx_errors;
753 adapter->net_stats.rx_dropped = stats->rx_missed; 752 adapter->net_stats.rx_dropped = stats->rx_discards;
754 adapter->net_stats.tx_dropped = stats->tx_discards; 753 adapter->net_stats.tx_dropped = stats->tx_discards;
755 adapter->current_stats = *stats; 754 adapter->current_stats = *stats;
756 } 755 }