aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-03-03 20:47:23 -0500
committerDavid S. Miller <davem@davemloft.net>2015-03-03 20:47:23 -0500
commitb97526f3ff95f92b107f0fb52cbb8627e395429b (patch)
tree9806c3a143ebb7153ad680643a56a659618c269d
parent1cea7e2c9fb3bc6bec8589337a50f60a45085156 (diff)
parentce458fcfcbaff08a1597f72f9c26e9a776ca934b (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 2015-03-03 This series contains updates to fm10k, i40e and i40evf. Matthew updates the fm10k driver by cleaning up code comments and whitespace issues. Also modifies the tunnel length header check, to make it more robust by calculating the inner L4 header length based on whether it is TCP or UDP. Implemented ndo_features_check() that allows drivers to report their offload capabilities per-skb. Neerav updates the i40e driver to skip over priority tagging if DCB is not enabled. Fixes an issue where the driver is not flushing out the DCBNL app table for applications that are not present in the local DCBX application configuration TLVs. Fixed i40e where, in the case of MFP mode, the driver was returning the incorrect number of traffic classes for partitions that are not enabled for iSCSI. Even though the driver was not configuring these traffic classes in the transmit scheduler for the NIC partitions, it does use this map to setup the queue mappings. Shannon updates i40e/i40evf to include the firmware build number in the formatted firmware version string. Akeem adds a safety net (by adding a 'default' case) for the possible unmatched switch calls. Mitch updates i40e to not automatically disable PF loopback at runtime, now that we have the functionality to enable and disable PF loopback. This fix cleans up a bogus error message when removing the PF module with VFs enabled. Adds a extra check to make sure that the indirection table pointer is valid before dereferencing it. Anjali enables i40e to enable more than the max RSS qps when running in a single TC mode for the main VSI. It is possible to enable as many as num_online_cpus(). Adds a firmware check to ensure that DCB is disabled for firmware versions older than 4.33. Updates i40e/i40evf to add missing packet types for VXLAN offload. Updated i40e to be able to handle varying RSS table size for each VSI, since all VSI's do not have the same RSS table size. v2: Dropped previous patch #9 "i40e/i40evf: Add capability to gather VEB per TC stats" since the stats should be in ethtool and not debugfs. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k.h1
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_common.c3
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c2
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_iov.c2
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_main.c39
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_mbx.c20
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_netdev.c19
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_pci.c2
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_pf.c23
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_tlv.c2
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_type.h5
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_vf.c14
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e.h11
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_adminq.c1
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_adminq.h1
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_common.c12
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c13
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_ethtool.c8
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c87
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_prototype.h1
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.c13
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c1
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_adminq.h1
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_txrx.c8
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c14
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_main.c2
26 files changed, 190 insertions, 115 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k.h b/drivers/net/ethernet/intel/fm10k/fm10k.h
index 42eb4344a9dc..59edfd4446cd 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k.h
+++ b/drivers/net/ethernet/intel/fm10k/fm10k.h
@@ -439,6 +439,7 @@ extern char fm10k_driver_name[];
439extern const char fm10k_driver_version[]; 439extern const char fm10k_driver_version[];
440int fm10k_init_queueing_scheme(struct fm10k_intfc *interface); 440int fm10k_init_queueing_scheme(struct fm10k_intfc *interface);
441void fm10k_clear_queueing_scheme(struct fm10k_intfc *interface); 441void fm10k_clear_queueing_scheme(struct fm10k_intfc *interface);
442__be16 fm10k_tx_encap_offload(struct sk_buff *skb);
442netdev_tx_t fm10k_xmit_frame_ring(struct sk_buff *skb, 443netdev_tx_t fm10k_xmit_frame_ring(struct sk_buff *skb,
443 struct fm10k_ring *tx_ring); 444 struct fm10k_ring *tx_ring);
444void fm10k_tx_timeout_reset(struct fm10k_intfc *interface); 445void fm10k_tx_timeout_reset(struct fm10k_intfc *interface);
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_common.c b/drivers/net/ethernet/intel/fm10k/fm10k_common.c
index bf19dccd4288..6cfae6ac04ea 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_common.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_common.c
@@ -398,7 +398,7 @@ static void fm10k_update_hw_stats_rx_q(struct fm10k_hw *hw,
398 /* Retrieve RX Owner Data */ 398 /* Retrieve RX Owner Data */
399 id_rx = fm10k_read_reg(hw, FM10K_RXQCTL(idx)); 399 id_rx = fm10k_read_reg(hw, FM10K_RXQCTL(idx));
400 400
401 /* Process RX Ring*/ 401 /* Process RX Ring */
402 do { 402 do {
403 rx_drops = fm10k_read_hw_stats_32b(hw, FM10K_QPRDC(idx), 403 rx_drops = fm10k_read_hw_stats_32b(hw, FM10K_QPRDC(idx),
404 &q->rx_drops); 404 &q->rx_drops);
@@ -466,7 +466,6 @@ void fm10k_update_hw_stats_q(struct fm10k_hw *hw, struct fm10k_hw_stats_q *q,
466 * Function invalidates the index values for the queues so any updates that 466 * Function invalidates the index values for the queues so any updates that
467 * may have happened are ignored and the base for the queue stats is reset. 467 * may have happened are ignored and the base for the queue stats is reset.
468 **/ 468 **/
469
470void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 idx, u32 count) 469void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 idx, u32 count)
471{ 470{
472 u32 i; 471 u32 i;
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
index 651f53bc7376..33b6106c764b 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
@@ -1019,7 +1019,7 @@ static int fm10k_set_channels(struct net_device *dev,
1019} 1019}
1020 1020
1021static int fm10k_get_ts_info(struct net_device *dev, 1021static int fm10k_get_ts_info(struct net_device *dev,
1022 struct ethtool_ts_info *info) 1022 struct ethtool_ts_info *info)
1023{ 1023{
1024 struct fm10k_intfc *interface = netdev_priv(dev); 1024 struct fm10k_intfc *interface = netdev_priv(dev);
1025 1025
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
index 060190864238..a02308f5048f 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
@@ -275,7 +275,7 @@ s32 fm10k_iov_update_pvid(struct fm10k_intfc *interface, u16 glort, u16 pvid)
275 if (vf_idx >= iov_data->num_vfs) 275 if (vf_idx >= iov_data->num_vfs)
276 return FM10K_ERR_PARAM; 276 return FM10K_ERR_PARAM;
277 277
278 /* determine if an update has occured and if so notify the VF */ 278 /* determine if an update has occurred and if so notify the VF */
279 vf_info = &iov_data->vf_info[vf_idx]; 279 vf_info = &iov_data->vf_info[vf_idx];
280 if (vf_info->sw_vid != pvid) { 280 if (vf_info->sw_vid != pvid) {
281 vf_info->sw_vid = pvid; 281 vf_info->sw_vid = pvid;
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c
index 84ab9eea2768..c325bc0c8338 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c
@@ -711,10 +711,6 @@ static struct ethhdr *fm10k_gre_is_nvgre(struct sk_buff *skb)
711 if (nvgre_hdr->flags & FM10K_NVGRE_RESERVED0_FLAGS) 711 if (nvgre_hdr->flags & FM10K_NVGRE_RESERVED0_FLAGS)
712 return NULL; 712 return NULL;
713 713
714 /* verify protocol is transparent Ethernet bridging */
715 if (nvgre_hdr->proto != htons(ETH_P_TEB))
716 return NULL;
717
718 /* report start of ethernet header */ 714 /* report start of ethernet header */
719 if (nvgre_hdr->flags & NVGRE_TNI) 715 if (nvgre_hdr->flags & NVGRE_TNI)
720 return (struct ethhdr *)(nvgre_hdr + 1); 716 return (struct ethhdr *)(nvgre_hdr + 1);
@@ -722,15 +718,13 @@ static struct ethhdr *fm10k_gre_is_nvgre(struct sk_buff *skb)
722 return (struct ethhdr *)(&nvgre_hdr->tni); 718 return (struct ethhdr *)(&nvgre_hdr->tni);
723} 719}
724 720
725static __be16 fm10k_tx_encap_offload(struct sk_buff *skb) 721__be16 fm10k_tx_encap_offload(struct sk_buff *skb)
726{ 722{
723 u8 l4_hdr = 0, inner_l4_hdr = 0, inner_l4_hlen;
727 struct ethhdr *eth_hdr; 724 struct ethhdr *eth_hdr;
728 u8 l4_hdr = 0;
729 725
730/* fm10k supports 184 octets of outer+inner headers. Minus 20 for inner L4. */ 726 if (skb->inner_protocol_type != ENCAP_TYPE_ETHER ||
731#define FM10K_MAX_ENCAP_TRANSPORT_OFFSET 164 727 skb->inner_protocol != htons(ETH_P_TEB))
732 if (skb_inner_transport_header(skb) - skb_mac_header(skb) >
733 FM10K_MAX_ENCAP_TRANSPORT_OFFSET)
734 return 0; 728 return 0;
735 729
736 switch (vlan_get_protocol(skb)) { 730 switch (vlan_get_protocol(skb)) {
@@ -760,12 +754,33 @@ static __be16 fm10k_tx_encap_offload(struct sk_buff *skb)
760 754
761 switch (eth_hdr->h_proto) { 755 switch (eth_hdr->h_proto) {
762 case htons(ETH_P_IP): 756 case htons(ETH_P_IP):
757 inner_l4_hdr = inner_ip_hdr(skb)->protocol;
758 break;
763 case htons(ETH_P_IPV6): 759 case htons(ETH_P_IPV6):
760 inner_l4_hdr = inner_ipv6_hdr(skb)->nexthdr;
764 break; 761 break;
765 default: 762 default:
766 return 0; 763 return 0;
767 } 764 }
768 765
766 switch (inner_l4_hdr) {
767 case IPPROTO_TCP:
768 inner_l4_hlen = inner_tcp_hdrlen(skb);
769 break;
770 case IPPROTO_UDP:
771 inner_l4_hlen = 8;
772 break;
773 default:
774 return 0;
775 }
776
777 /* The hardware allows tunnel offloads only if the combined inner and
778 * outer header is 184 bytes or less
779 */
780 if (skb_inner_transport_header(skb) + inner_l4_hlen -
781 skb_mac_header(skb) > FM10K_TUNNEL_HEADER_LENGTH)
782 return 0;
783
769 return eth_hdr->h_proto; 784 return eth_hdr->h_proto;
770} 785}
771 786
@@ -934,10 +949,10 @@ static int __fm10k_maybe_stop_tx(struct fm10k_ring *tx_ring, u16 size)
934{ 949{
935 netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index); 950 netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index);
936 951
952 /* Memory barrier before checking head and tail */
937 smp_mb(); 953 smp_mb();
938 954
939 /* We need to check again in a case another CPU has just 955 /* Check again in a case another CPU has just made room available */
940 * made room available. */
941 if (likely(fm10k_desc_unused(tx_ring) < size)) 956 if (likely(fm10k_desc_unused(tx_ring) < size))
942 return -EBUSY; 957 return -EBUSY;
943 958
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c b/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c
index 9f5457c9e627..14ee696e9830 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c
@@ -72,7 +72,7 @@ static bool fm10k_fifo_empty(struct fm10k_mbx_fifo *fifo)
72 * @fifo: pointer to FIFO 72 * @fifo: pointer to FIFO
73 * @offset: offset to add to head 73 * @offset: offset to add to head
74 * 74 *
75 * This function returns the indicies into the fifo based on head + offset 75 * This function returns the indices into the fifo based on head + offset
76 **/ 76 **/
77static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset) 77static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
78{ 78{
@@ -84,7 +84,7 @@ static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
84 * @fifo: pointer to FIFO 84 * @fifo: pointer to FIFO
85 * @offset: offset to add to tail 85 * @offset: offset to add to tail
86 * 86 *
87 * This function returns the indicies into the fifo based on tail + offset 87 * This function returns the indices into the fifo based on tail + offset
88 **/ 88 **/
89static u16 fm10k_fifo_tail_offset(struct fm10k_mbx_fifo *fifo, u16 offset) 89static u16 fm10k_fifo_tail_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
90{ 90{
@@ -326,7 +326,7 @@ static u16 fm10k_mbx_validate_msg_size(struct fm10k_mbx_info *mbx, u16 len)
326 * fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem 326 * fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem
327 * @mbx: pointer to mailbox 327 * @mbx: pointer to mailbox
328 * 328 *
329 * This function will take a seciton of the Rx FIFO and copy it into the 329 * This function will take a section of the Rx FIFO and copy it into the
330 mbx->tail--; 330 mbx->tail--;
331 * mailbox memory. The offset in mbmem is based on the lower bits of the 331 * mailbox memory. The offset in mbmem is based on the lower bits of the
332 * tail and len determines the length to copy. 332 * tail and len determines the length to copy.
@@ -418,7 +418,7 @@ static void fm10k_mbx_pull_head(struct fm10k_hw *hw,
418 * @hw: pointer to hardware structure 418 * @hw: pointer to hardware structure
419 * @mbx: pointer to mailbox 419 * @mbx: pointer to mailbox
420 * 420 *
421 * This function will take a seciton of the mailbox memory and copy it 421 * This function will take a section of the mailbox memory and copy it
422 * into the Rx FIFO. The offset is based on the lower bits of the 422 * into the Rx FIFO. The offset is based on the lower bits of the
423 * head and len determines the length to copy. 423 * head and len determines the length to copy.
424 **/ 424 **/
@@ -464,7 +464,7 @@ static void fm10k_mbx_read_copy(struct fm10k_hw *hw,
464 * @tail: tail index of message 464 * @tail: tail index of message
465 * 465 *
466 * This function will first validate the tail index and size for the 466 * This function will first validate the tail index and size for the
467 * incoming message. It then updates the acknowlegment number and 467 * incoming message. It then updates the acknowledgment number and
468 * copies the data into the FIFO. It will return the number of messages 468 * copies the data into the FIFO. It will return the number of messages
469 * dequeued on success and a negative value on error. 469 * dequeued on success and a negative value on error.
470 **/ 470 **/
@@ -761,7 +761,7 @@ static s32 fm10k_mbx_enqueue_tx(struct fm10k_hw *hw,
761 err = fm10k_fifo_enqueue(&mbx->tx, msg); 761 err = fm10k_fifo_enqueue(&mbx->tx, msg);
762 } 762 }
763 763
764 /* if we failed trhead the error */ 764 /* if we failed treat the error */
765 if (err) { 765 if (err) {
766 mbx->timeout = 0; 766 mbx->timeout = 0;
767 mbx->tx_busy++; 767 mbx->tx_busy++;
@@ -815,7 +815,7 @@ static void fm10k_mbx_write(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx)
815{ 815{
816 u32 mbmem = mbx->mbmem_reg; 816 u32 mbmem = mbx->mbmem_reg;
817 817
818 /* write new msg header to notify recepient of change */ 818 /* write new msg header to notify recipient of change */
819 fm10k_write_reg(hw, mbmem, mbx->mbx_hdr); 819 fm10k_write_reg(hw, mbmem, mbx->mbx_hdr);
820 820
821 /* write mailbox to sent interrupt */ 821 /* write mailbox to sent interrupt */
@@ -1251,7 +1251,7 @@ static s32 fm10k_mbx_process_error(struct fm10k_hw *hw,
1251 /* we will need to pull all of the fields for verification */ 1251 /* we will need to pull all of the fields for verification */
1252 head = FM10K_MSG_HDR_FIELD_GET(*hdr, HEAD); 1252 head = FM10K_MSG_HDR_FIELD_GET(*hdr, HEAD);
1253 1253
1254 /* we only have lower 10 bits of error number os add upper bits */ 1254 /* we only have lower 10 bits of error number so add upper bits */
1255 err_no = FM10K_MSG_HDR_FIELD_GET(*hdr, ERR_NO); 1255 err_no = FM10K_MSG_HDR_FIELD_GET(*hdr, ERR_NO);
1256 err_no |= ~FM10K_MSG_HDR_MASK(ERR_NO); 1256 err_no |= ~FM10K_MSG_HDR_MASK(ERR_NO);
1257 1257
@@ -1548,7 +1548,7 @@ s32 fm10k_pfvf_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx,
1548 mbx->timeout = 0; 1548 mbx->timeout = 0;
1549 mbx->udelay = FM10K_MBX_INIT_DELAY; 1549 mbx->udelay = FM10K_MBX_INIT_DELAY;
1550 1550
1551 /* initalize tail and head */ 1551 /* initialize tail and head */
1552 mbx->tail = 1; 1552 mbx->tail = 1;
1553 mbx->head = 1; 1553 mbx->head = 1;
1554 1554
@@ -1627,7 +1627,7 @@ static void fm10k_sm_mbx_connect_reset(struct fm10k_mbx_info *mbx)
1627 mbx->local = FM10K_SM_MBX_VERSION; 1627 mbx->local = FM10K_SM_MBX_VERSION;
1628 mbx->remote = 0; 1628 mbx->remote = 0;
1629 1629
1630 /* initalize tail and head */ 1630 /* initialize tail and head */
1631 mbx->tail = 1; 1631 mbx->tail = 1;
1632 mbx->head = 1; 1632 mbx->head = 1;
1633 1633
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
index cfde8bac1aeb..d5b303dad95e 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
@@ -356,7 +356,7 @@ static void fm10k_free_all_rx_resources(struct fm10k_intfc *interface)
356 * fm10k_request_glort_range - Request GLORTs for use in configuring rules 356 * fm10k_request_glort_range - Request GLORTs for use in configuring rules
357 * @interface: board private structure 357 * @interface: board private structure
358 * 358 *
359 * This function allocates a range of glorts for this inteface to use. 359 * This function allocates a range of glorts for this interface to use.
360 **/ 360 **/
361static void fm10k_request_glort_range(struct fm10k_intfc *interface) 361static void fm10k_request_glort_range(struct fm10k_intfc *interface)
362{ 362{
@@ -781,7 +781,7 @@ static int fm10k_update_vid(struct net_device *netdev, u16 vid, bool set)
781 781
782 fm10k_mbx_lock(interface); 782 fm10k_mbx_lock(interface);
783 783
784 /* only need to update the VLAN if not in promiscous mode */ 784 /* only need to update the VLAN if not in promiscuous mode */
785 if (!(netdev->flags & IFF_PROMISC)) { 785 if (!(netdev->flags & IFF_PROMISC)) {
786 err = hw->mac.ops.update_vlan(hw, vid, 0, set); 786 err = hw->mac.ops.update_vlan(hw, vid, 0, set);
787 if (err) 787 if (err)
@@ -970,7 +970,7 @@ static void fm10k_set_rx_mode(struct net_device *dev)
970 970
971 fm10k_mbx_lock(interface); 971 fm10k_mbx_lock(interface);
972 972
973 /* syncronize all of the addresses */ 973 /* synchronize all of the addresses */
974 if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { 974 if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
975 __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync); 975 __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync);
976 if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI) 976 if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
@@ -1051,7 +1051,7 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
1051 vid, true, 0); 1051 vid, true, 0);
1052 } 1052 }
1053 1053
1054 /* syncronize all of the addresses */ 1054 /* synchronize all of the addresses */
1055 if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { 1055 if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
1056 __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync); 1056 __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync);
1057 if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI) 1057 if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
@@ -1350,6 +1350,16 @@ static void fm10k_dfwd_del_station(struct net_device *dev, void *priv)
1350 } 1350 }
1351} 1351}
1352 1352
1353static netdev_features_t fm10k_features_check(struct sk_buff *skb,
1354 struct net_device *dev,
1355 netdev_features_t features)
1356{
1357 if (!skb->encapsulation || fm10k_tx_encap_offload(skb))
1358 return features;
1359
1360 return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK);
1361}
1362
1353static const struct net_device_ops fm10k_netdev_ops = { 1363static const struct net_device_ops fm10k_netdev_ops = {
1354 .ndo_open = fm10k_open, 1364 .ndo_open = fm10k_open,
1355 .ndo_stop = fm10k_close, 1365 .ndo_stop = fm10k_close,
@@ -1372,6 +1382,7 @@ static const struct net_device_ops fm10k_netdev_ops = {
1372 .ndo_do_ioctl = fm10k_ioctl, 1382 .ndo_do_ioctl = fm10k_ioctl,
1373 .ndo_dfwd_add_station = fm10k_dfwd_add_station, 1383 .ndo_dfwd_add_station = fm10k_dfwd_add_station,
1374 .ndo_dfwd_del_station = fm10k_dfwd_del_station, 1384 .ndo_dfwd_del_station = fm10k_dfwd_del_station,
1385 .ndo_features_check = fm10k_features_check,
1375}; 1386};
1376 1387
1377#define DEFAULT_DEBUG_LEVEL_SHIFT 3 1388#define DEFAULT_DEBUG_LEVEL_SHIFT 3
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
index 4f5892cc32d7..8978d55a1c51 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
@@ -648,7 +648,7 @@ static void fm10k_configure_rx_ring(struct fm10k_intfc *interface,
648 /* Configure the Rx buffer size for one buff without split */ 648 /* Configure the Rx buffer size for one buff without split */
649 srrctl |= FM10K_RX_BUFSZ >> FM10K_SRRCTL_BSIZEPKT_SHIFT; 649 srrctl |= FM10K_RX_BUFSZ >> FM10K_SRRCTL_BSIZEPKT_SHIFT;
650 650
651 /* Configure the Rx ring to supress loopback packets */ 651 /* Configure the Rx ring to suppress loopback packets */
652 srrctl |= FM10K_SRRCTL_LOOPBACK_SUPPRESS; 652 srrctl |= FM10K_SRRCTL_LOOPBACK_SUPPRESS;
653 fm10k_write_reg(hw, FM10K_SRRCTL(reg_idx), srrctl); 653 fm10k_write_reg(hw, FM10K_SRRCTL(reg_idx), srrctl);
654 654
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pf.c b/drivers/net/ethernet/intel/fm10k/fm10k_pf.c
index 7e4711958e46..159cd8463800 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_pf.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_pf.c
@@ -234,8 +234,7 @@ static s32 fm10k_update_vlan_pf(struct fm10k_hw *hw, u32 vid, u8 vsi, bool set)
234 vid = (vid << 17) >> 17; 234 vid = (vid << 17) >> 17;
235 235
236 /* verify the reserved 0 fields are 0 */ 236 /* verify the reserved 0 fields are 0 */
237 if (len >= FM10K_VLAN_TABLE_VID_MAX || 237 if (len >= FM10K_VLAN_TABLE_VID_MAX || vid >= FM10K_VLAN_TABLE_VID_MAX)
238 vid >= FM10K_VLAN_TABLE_VID_MAX)
239 return FM10K_ERR_PARAM; 238 return FM10K_ERR_PARAM;
240 239
241 /* Loop through the table updating all required VLANs */ 240 /* Loop through the table updating all required VLANs */
@@ -312,7 +311,7 @@ bool fm10k_glort_valid_pf(struct fm10k_hw *hw, u16 glort)
312} 311}
313 312
314/** 313/**
315 * fm10k_update_uc_addr_pf - Update device unicast addresss 314 * fm10k_update_xc_addr_pf - Update device addresses
316 * @hw: pointer to the HW structure 315 * @hw: pointer to the HW structure
317 * @glort: base resource tag for this request 316 * @glort: base resource tag for this request
318 * @mac: MAC address to add/remove from table 317 * @mac: MAC address to add/remove from table
@@ -356,7 +355,7 @@ static s32 fm10k_update_xc_addr_pf(struct fm10k_hw *hw, u16 glort,
356} 355}
357 356
358/** 357/**
359 * fm10k_update_uc_addr_pf - Update device unicast addresss 358 * fm10k_update_uc_addr_pf - Update device unicast addresses
360 * @hw: pointer to the HW structure 359 * @hw: pointer to the HW structure
361 * @glort: base resource tag for this request 360 * @glort: base resource tag for this request
362 * @mac: MAC address to add/remove from table 361 * @mac: MAC address to add/remove from table
@@ -454,7 +453,7 @@ static void fm10k_update_int_moderator_pf(struct fm10k_hw *hw)
454 break; 453 break;
455 } 454 }
456 455
457 /* always reset VFITR2[0] to point to last enabled PF vector*/ 456 /* always reset VFITR2[0] to point to last enabled PF vector */
458 fm10k_write_reg(hw, FM10K_ITR2(FM10K_ITR_REG_COUNT_PF), i); 457 fm10k_write_reg(hw, FM10K_ITR2(FM10K_ITR_REG_COUNT_PF), i);
459 458
460 /* reset ITR2[0] to point to last enabled PF vector */ 459 /* reset ITR2[0] to point to last enabled PF vector */
@@ -812,7 +811,7 @@ static s32 fm10k_iov_assign_int_moderator_pf(struct fm10k_hw *hw, u16 vf_idx)
812 if (vf_idx >= hw->iov.num_vfs) 811 if (vf_idx >= hw->iov.num_vfs)
813 return FM10K_ERR_PARAM; 812 return FM10K_ERR_PARAM;
814 813
815 /* determine vector offset and count*/ 814 /* determine vector offset and count */
816 vf_v_idx = fm10k_vf_vector_index(hw, vf_idx); 815 vf_v_idx = fm10k_vf_vector_index(hw, vf_idx);
817 vf_v_limit = vf_v_idx + fm10k_vectors_per_pool(hw); 816 vf_v_limit = vf_v_idx + fm10k_vectors_per_pool(hw);
818 817
@@ -951,7 +950,7 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw,
951 if (vf_info->mbx.ops.disconnect) 950 if (vf_info->mbx.ops.disconnect)
952 vf_info->mbx.ops.disconnect(hw, &vf_info->mbx); 951 vf_info->mbx.ops.disconnect(hw, &vf_info->mbx);
953 952
954 /* determine vector offset and count*/ 953 /* determine vector offset and count */
955 vf_v_idx = fm10k_vf_vector_index(hw, vf_idx); 954 vf_v_idx = fm10k_vf_vector_index(hw, vf_idx);
956 vf_v_limit = vf_v_idx + fm10k_vectors_per_pool(hw); 955 vf_v_limit = vf_v_idx + fm10k_vectors_per_pool(hw);
957 956
@@ -1035,7 +1034,7 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw,
1035 ((u32)vf_info->mac[2]); 1034 ((u32)vf_info->mac[2]);
1036 } 1035 }
1037 1036
1038 /* map queue pairs back to VF from last to first*/ 1037 /* map queue pairs back to VF from last to first */
1039 for (i = queues_per_pool; i--;) { 1038 for (i = queues_per_pool; i--;) {
1040 fm10k_write_reg(hw, FM10K_TDBAL(vf_q_idx + i), tdbal); 1039 fm10k_write_reg(hw, FM10K_TDBAL(vf_q_idx + i), tdbal);
1041 fm10k_write_reg(hw, FM10K_TDBAH(vf_q_idx + i), tdbah); 1040 fm10k_write_reg(hw, FM10K_TDBAH(vf_q_idx + i), tdbah);
@@ -1141,7 +1140,7 @@ static s32 fm10k_iov_report_timestamp_pf(struct fm10k_hw *hw,
1141 * 1140 *
1142 * This function is a default handler for MSI-X requests from the VF. The 1141 * This function is a default handler for MSI-X requests from the VF. The
1143 * assumption is that in this case it is acceptable to just directly 1142 * assumption is that in this case it is acceptable to just directly
1144 * hand off the message form the VF to the underlying shared code. 1143 * hand off the message from the VF to the underlying shared code.
1145 **/ 1144 **/
1146s32 fm10k_iov_msg_msix_pf(struct fm10k_hw *hw, u32 **results, 1145s32 fm10k_iov_msg_msix_pf(struct fm10k_hw *hw, u32 **results,
1147 struct fm10k_mbx_info *mbx) 1146 struct fm10k_mbx_info *mbx)
@@ -1160,7 +1159,7 @@ s32 fm10k_iov_msg_msix_pf(struct fm10k_hw *hw, u32 **results,
1160 * 1159 *
1161 * This function is a default handler for MAC/VLAN requests from the VF. 1160 * This function is a default handler for MAC/VLAN requests from the VF.
1162 * The assumption is that in this case it is acceptable to just directly 1161 * The assumption is that in this case it is acceptable to just directly
1163 * hand off the message form the VF to the underlying shared code. 1162 * hand off the message from the VF to the underlying shared code.
1164 **/ 1163 **/
1165s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *hw, u32 **results, 1164s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *hw, u32 **results,
1166 struct fm10k_mbx_info *mbx) 1165 struct fm10k_mbx_info *mbx)
@@ -1404,7 +1403,7 @@ static void fm10k_update_hw_stats_pf(struct fm10k_hw *hw,
1404 &stats->vlan_drop); 1403 &stats->vlan_drop);
1405 loopback_drop = fm10k_read_hw_stats_32b(hw, 1404 loopback_drop = fm10k_read_hw_stats_32b(hw,
1406 FM10K_STATS_LOOPBACK_DROP, 1405 FM10K_STATS_LOOPBACK_DROP,
1407 &stats->loopback_drop); 1406 &stats->loopback_drop);
1408 nodesc_drop = fm10k_read_hw_stats_32b(hw, 1407 nodesc_drop = fm10k_read_hw_stats_32b(hw,
1409 FM10K_STATS_NODESC_DROP, 1408 FM10K_STATS_NODESC_DROP,
1410 &stats->nodesc_drop); 1409 &stats->nodesc_drop);
@@ -1573,7 +1572,7 @@ static s32 fm10k_get_host_state_pf(struct fm10k_hw *hw, bool *switch_ready)
1573 s32 ret_val = 0; 1572 s32 ret_val = 0;
1574 u32 dma_ctrl2; 1573 u32 dma_ctrl2;
1575 1574
1576 /* verify the switch is ready for interraction */ 1575 /* verify the switch is ready for interaction */
1577 dma_ctrl2 = fm10k_read_reg(hw, FM10K_DMA_CTRL2); 1576 dma_ctrl2 = fm10k_read_reg(hw, FM10K_DMA_CTRL2);
1578 if (!(dma_ctrl2 & FM10K_DMA_CTRL2_SWITCH_READY)) 1577 if (!(dma_ctrl2 & FM10K_DMA_CTRL2_SWITCH_READY))
1579 goto out; 1578 goto out;
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_tlv.c b/drivers/net/ethernet/intel/fm10k/fm10k_tlv.c
index fd0a05f011a8..9b29d7b0377a 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_tlv.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_tlv.c
@@ -710,7 +710,7 @@ void fm10k_tlv_msg_test_create(u32 *msg, u32 attr_flags)
710/** 710/**
711 * fm10k_tlv_msg_test - Validate all results on test message receive 711 * fm10k_tlv_msg_test - Validate all results on test message receive
712 * @hw: Pointer to hardware structure 712 * @hw: Pointer to hardware structure
713 * @results: Pointer array to attributes in the mesage 713 * @results: Pointer array to attributes in the message
714 * @mbx: Pointer to mailbox information structure 714 * @mbx: Pointer to mailbox information structure
715 * 715 *
716 * This function does a check to verify all attributes match what the test 716 * This function does a check to verify all attributes match what the test
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_type.h b/drivers/net/ethernet/intel/fm10k/fm10k_type.h
index 7c6d9d5a8ae5..4af96686c584 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_type.h
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_type.h
@@ -356,6 +356,9 @@ struct fm10k_hw;
356#define FM10K_QUEUE_DISABLE_TIMEOUT 100 356#define FM10K_QUEUE_DISABLE_TIMEOUT 100
357#define FM10K_RESET_TIMEOUT 150 357#define FM10K_RESET_TIMEOUT 150
358 358
359/* Maximum supported combined inner and outer header length for encapsulation */
360#define FM10K_TUNNEL_HEADER_LENGTH 184
361
359/* VF registers */ 362/* VF registers */
360#define FM10K_VFCTRL 0x00000 363#define FM10K_VFCTRL 0x00000
361#define FM10K_VFCTRL_RST 0x00000008 364#define FM10K_VFCTRL_RST 0x00000008
@@ -593,7 +596,7 @@ struct fm10k_vf_info {
593 u16 sw_vid; /* Switch API assigned VLAN */ 596 u16 sw_vid; /* Switch API assigned VLAN */
594 u16 pf_vid; /* PF assigned Default VLAN */ 597 u16 pf_vid; /* PF assigned Default VLAN */
595 u8 mac[ETH_ALEN]; /* PF Default MAC address */ 598 u8 mac[ETH_ALEN]; /* PF Default MAC address */
596 u8 vsi; /* VSI idenfifier */ 599 u8 vsi; /* VSI identifier */
597 u8 vf_idx; /* which VF this is */ 600 u8 vf_idx; /* which VF this is */
598 u8 vf_flags; /* flags indicating what modes 601 u8 vf_flags; /* flags indicating what modes
599 * are supported for the port 602 * are supported for the port
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_vf.c b/drivers/net/ethernet/intel/fm10k/fm10k_vf.c
index f0aa0f97b4a9..17219678439a 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_vf.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_vf.c
@@ -37,7 +37,7 @@ static s32 fm10k_stop_hw_vf(struct fm10k_hw *hw)
37 if (err) 37 if (err)
38 return err; 38 return err;
39 39
40 /* If permenant address is set then we need to restore it */ 40 /* If permanent address is set then we need to restore it */
41 if (is_valid_ether_addr(perm_addr)) { 41 if (is_valid_ether_addr(perm_addr)) {
42 bal = (((u32)perm_addr[3]) << 24) | 42 bal = (((u32)perm_addr[3]) << 24) |
43 (((u32)perm_addr[4]) << 16) | 43 (((u32)perm_addr[4]) << 16) |
@@ -65,7 +65,7 @@ static s32 fm10k_stop_hw_vf(struct fm10k_hw *hw)
65 * fm10k_reset_hw_vf - VF hardware reset 65 * fm10k_reset_hw_vf - VF hardware reset
66 * @hw: pointer to hardware structure 66 * @hw: pointer to hardware structure
67 * 67 *
68 * This function should return the hardare to a state similar to the 68 * This function should return the hardware to a state similar to the
69 * one it is in after just being initialized. 69 * one it is in after just being initialized.
70 **/ 70 **/
71static s32 fm10k_reset_hw_vf(struct fm10k_hw *hw) 71static s32 fm10k_reset_hw_vf(struct fm10k_hw *hw)
@@ -252,7 +252,7 @@ static s32 fm10k_read_mac_addr_vf(struct fm10k_hw *hw)
252} 252}
253 253
254/** 254/**
255 * fm10k_update_uc_addr_vf - Update device unicast address 255 * fm10k_update_uc_addr_vf - Update device unicast addresses
256 * @hw: pointer to the HW structure 256 * @hw: pointer to the HW structure
257 * @glort: unused 257 * @glort: unused
258 * @mac: MAC address to add/remove from table 258 * @mac: MAC address to add/remove from table
@@ -282,7 +282,7 @@ static s32 fm10k_update_uc_addr_vf(struct fm10k_hw *hw, u16 glort,
282 memcmp(hw->mac.perm_addr, mac, ETH_ALEN)) 282 memcmp(hw->mac.perm_addr, mac, ETH_ALEN))
283 return FM10K_ERR_PARAM; 283 return FM10K_ERR_PARAM;
284 284
285 /* add bit to notify us if this is a set of clear operation */ 285 /* add bit to notify us if this is a set or clear operation */
286 if (!add) 286 if (!add)
287 vid |= FM10K_VLAN_CLEAR; 287 vid |= FM10K_VLAN_CLEAR;
288 288
@@ -295,7 +295,7 @@ static s32 fm10k_update_uc_addr_vf(struct fm10k_hw *hw, u16 glort,
295} 295}
296 296
297/** 297/**
298 * fm10k_update_mc_addr_vf - Update device multicast address 298 * fm10k_update_mc_addr_vf - Update device multicast addresses
299 * @hw: pointer to the HW structure 299 * @hw: pointer to the HW structure
300 * @glort: unused 300 * @glort: unused
301 * @mac: MAC address to add/remove from table 301 * @mac: MAC address to add/remove from table
@@ -319,7 +319,7 @@ static s32 fm10k_update_mc_addr_vf(struct fm10k_hw *hw, u16 glort,
319 if (!is_multicast_ether_addr(mac)) 319 if (!is_multicast_ether_addr(mac))
320 return FM10K_ERR_PARAM; 320 return FM10K_ERR_PARAM;
321 321
322 /* add bit to notify us if this is a set of clear operation */ 322 /* add bit to notify us if this is a set or clear operation */
323 if (!add) 323 if (!add)
324 vid |= FM10K_VLAN_CLEAR; 324 vid |= FM10K_VLAN_CLEAR;
325 325
@@ -515,7 +515,7 @@ static s32 fm10k_adjust_systime_vf(struct fm10k_hw *hw, s32 ppb)
515 * @hw: pointer to the hardware structure 515 * @hw: pointer to the hardware structure
516 * 516 *
517 * Function reads the content of 2 registers, combined to represent a 64 bit 517 * Function reads the content of 2 registers, combined to represent a 64 bit
518 * value measured in nanosecods. In order to guarantee the value is accurate 518 * value measured in nanoseconds. In order to guarantee the value is accurate
519 * we check the 32 most significant bits both before and after reading the 519 * we check the 32 most significant bits both before and after reading the
520 * 32 least significant bits to verify they didn't change as we were reading 520 * 32 least significant bits to verify they didn't change as we were reading
521 * the registers. 521 * the registers.
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 5761917734dc..c5137313b62a 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -471,6 +471,9 @@ struct i40e_vsi {
471 u16 rx_itr_setting; 471 u16 rx_itr_setting;
472 u16 tx_itr_setting; 472 u16 tx_itr_setting;
473 473
474 u16 rss_table_size;
475 u16 rss_size;
476
474 u16 max_frame; 477 u16 max_frame;
475 u16 rx_hdr_len; 478 u16 rx_hdr_len;
476 u16 rx_buf_len; 479 u16 rx_buf_len;
@@ -488,6 +491,7 @@ struct i40e_vsi {
488 491
489 u16 base_queue; /* vsi's first queue in hw array */ 492 u16 base_queue; /* vsi's first queue in hw array */
490 u16 alloc_queue_pairs; /* Allocated Tx/Rx queues */ 493 u16 alloc_queue_pairs; /* Allocated Tx/Rx queues */
494 u16 req_queue_pairs; /* User requested queue pairs */
491 u16 num_queue_pairs; /* Used tx and rx pairs */ 495 u16 num_queue_pairs; /* Used tx and rx pairs */
492 u16 num_desc; 496 u16 num_desc;
493 enum i40e_vsi_type type; /* VSI type, e.g., LAN, FCoE, etc */ 497 enum i40e_vsi_type type; /* VSI type, e.g., LAN, FCoE, etc */
@@ -557,14 +561,14 @@ static inline char *i40e_fw_version_str(struct i40e_hw *hw)
557 static char buf[32]; 561 static char buf[32];
558 562
559 snprintf(buf, sizeof(buf), 563 snprintf(buf, sizeof(buf),
560 "f%d.%d a%d.%d n%02x.%02x e%08x", 564 "f%d.%d.%05d a%d.%d n%x.%02x e%x",
561 hw->aq.fw_maj_ver, hw->aq.fw_min_ver, 565 hw->aq.fw_maj_ver, hw->aq.fw_min_ver, hw->aq.fw_build,
562 hw->aq.api_maj_ver, hw->aq.api_min_ver, 566 hw->aq.api_maj_ver, hw->aq.api_min_ver,
563 (hw->nvm.version & I40E_NVM_VERSION_HI_MASK) >> 567 (hw->nvm.version & I40E_NVM_VERSION_HI_MASK) >>
564 I40E_NVM_VERSION_HI_SHIFT, 568 I40E_NVM_VERSION_HI_SHIFT,
565 (hw->nvm.version & I40E_NVM_VERSION_LO_MASK) >> 569 (hw->nvm.version & I40E_NVM_VERSION_LO_MASK) >>
566 I40E_NVM_VERSION_LO_SHIFT, 570 I40E_NVM_VERSION_LO_SHIFT,
567 hw->nvm.eetrack); 571 (hw->nvm.eetrack & 0xffffff));
568 572
569 return buf; 573 return buf;
570} 574}
@@ -725,6 +729,7 @@ void i40e_fcoe_handle_status(struct i40e_ring *rx_ring,
725void i40e_vlan_stripping_enable(struct i40e_vsi *vsi); 729void i40e_vlan_stripping_enable(struct i40e_vsi *vsi);
726#ifdef CONFIG_I40E_DCB 730#ifdef CONFIG_I40E_DCB
727void i40e_dcbnl_flush_apps(struct i40e_pf *pf, 731void i40e_dcbnl_flush_apps(struct i40e_pf *pf,
732 struct i40e_dcbx_config *old_cfg,
728 struct i40e_dcbx_config *new_cfg); 733 struct i40e_dcbx_config *new_cfg);
729void i40e_dcbnl_set_all(struct i40e_vsi *vsi); 734void i40e_dcbnl_set_all(struct i40e_vsi *vsi);
730void i40e_dcbnl_setup(struct i40e_vsi *vsi); 735void i40e_dcbnl_setup(struct i40e_vsi *vsi);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c
index 77f6254a89ac..dc2ed359e945 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c
@@ -592,6 +592,7 @@ i40e_status i40e_init_adminq(struct i40e_hw *hw)
592 ret_code = i40e_aq_get_firmware_version(hw, 592 ret_code = i40e_aq_get_firmware_version(hw,
593 &hw->aq.fw_maj_ver, 593 &hw->aq.fw_maj_ver,
594 &hw->aq.fw_min_ver, 594 &hw->aq.fw_min_ver,
595 &hw->aq.fw_build,
595 &hw->aq.api_maj_ver, 596 &hw->aq.api_maj_ver,
596 &hw->aq.api_min_ver, 597 &hw->aq.api_min_ver,
597 NULL); 598 NULL);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.h b/drivers/net/ethernet/intel/i40e/i40e_adminq.h
index de17b6fbcc4e..28e519a50de4 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_adminq.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.h
@@ -93,6 +93,7 @@ struct i40e_adminq_info {
93 u16 asq_buf_size; /* send queue buffer size */ 93 u16 asq_buf_size; /* send queue buffer size */
94 u16 fw_maj_ver; /* firmware major version */ 94 u16 fw_maj_ver; /* firmware major version */
95 u16 fw_min_ver; /* firmware minor version */ 95 u16 fw_min_ver; /* firmware minor version */
96 u32 fw_build; /* firmware build number */
96 u16 api_maj_ver; /* api major version */ 97 u16 api_maj_ver; /* api major version */
97 u16 api_min_ver; /* api minor version */ 98 u16 api_min_ver; /* api minor version */
98 bool nvm_release_on_done; 99 bool nvm_release_on_done;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
index 88b2d45578dd..cb19c377e0cc 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_common.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
@@ -1737,6 +1737,7 @@ i40e_status i40e_aq_get_switch_config(struct i40e_hw *hw,
1737 * @hw: pointer to the hw struct 1737 * @hw: pointer to the hw struct
1738 * @fw_major_version: firmware major version 1738 * @fw_major_version: firmware major version
1739 * @fw_minor_version: firmware minor version 1739 * @fw_minor_version: firmware minor version
1740 * @fw_build: firmware build number
1740 * @api_major_version: major queue version 1741 * @api_major_version: major queue version
1741 * @api_minor_version: minor queue version 1742 * @api_minor_version: minor queue version
1742 * @cmd_details: pointer to command details structure or NULL 1743 * @cmd_details: pointer to command details structure or NULL
@@ -1745,6 +1746,7 @@ i40e_status i40e_aq_get_switch_config(struct i40e_hw *hw,
1745 **/ 1746 **/
1746i40e_status i40e_aq_get_firmware_version(struct i40e_hw *hw, 1747i40e_status i40e_aq_get_firmware_version(struct i40e_hw *hw,
1747 u16 *fw_major_version, u16 *fw_minor_version, 1748 u16 *fw_major_version, u16 *fw_minor_version,
1749 u32 *fw_build,
1748 u16 *api_major_version, u16 *api_minor_version, 1750 u16 *api_major_version, u16 *api_minor_version,
1749 struct i40e_asq_cmd_details *cmd_details) 1751 struct i40e_asq_cmd_details *cmd_details)
1750{ 1752{
@@ -1758,13 +1760,15 @@ i40e_status i40e_aq_get_firmware_version(struct i40e_hw *hw,
1758 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1760 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1759 1761
1760 if (!status) { 1762 if (!status) {
1761 if (fw_major_version != NULL) 1763 if (fw_major_version)
1762 *fw_major_version = le16_to_cpu(resp->fw_major); 1764 *fw_major_version = le16_to_cpu(resp->fw_major);
1763 if (fw_minor_version != NULL) 1765 if (fw_minor_version)
1764 *fw_minor_version = le16_to_cpu(resp->fw_minor); 1766 *fw_minor_version = le16_to_cpu(resp->fw_minor);
1765 if (api_major_version != NULL) 1767 if (fw_build)
1768 *fw_build = le32_to_cpu(resp->fw_build);
1769 if (api_major_version)
1766 *api_major_version = le16_to_cpu(resp->api_major); 1770 *api_major_version = le16_to_cpu(resp->api_major);
1767 if (api_minor_version != NULL) 1771 if (api_minor_version)
1768 *api_minor_version = le16_to_cpu(resp->api_minor); 1772 *api_minor_version = le16_to_cpu(resp->api_minor);
1769 } 1773 }
1770 1774
diff --git a/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c b/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c
index 183dcb63ce98..b0665509eae6 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c
@@ -269,22 +269,21 @@ static bool i40e_dcbnl_find_app(struct i40e_dcbx_config *cfg,
269/** 269/**
270 * i40e_dcbnl_flush_apps - Delete all removed APPs 270 * i40e_dcbnl_flush_apps - Delete all removed APPs
271 * @pf: the corresponding pf 271 * @pf: the corresponding pf
272 * @old_cfg: old DCBX configuration data
272 * @new_cfg: new DCBX configuration data 273 * @new_cfg: new DCBX configuration data
273 * 274 *
274 * Find and delete all APPs that are not present in the passed 275 * Find and delete all APPs that are not present in the passed
275 * DCB configuration 276 * DCB configuration
276 **/ 277 **/
277void i40e_dcbnl_flush_apps(struct i40e_pf *pf, 278void i40e_dcbnl_flush_apps(struct i40e_pf *pf,
279 struct i40e_dcbx_config *old_cfg,
278 struct i40e_dcbx_config *new_cfg) 280 struct i40e_dcbx_config *new_cfg)
279{ 281{
280 struct i40e_dcb_app_priority_table app; 282 struct i40e_dcb_app_priority_table app;
281 struct i40e_dcbx_config *dcbxcfg;
282 struct i40e_hw *hw = &pf->hw;
283 int i; 283 int i;
284 284
285 dcbxcfg = &hw->local_dcbx_config; 285 for (i = 0; i < old_cfg->numapps; i++) {
286 for (i = 0; i < dcbxcfg->numapps; i++) { 286 app = old_cfg->app[i];
287 app = dcbxcfg->app[i];
288 /* The APP is not available anymore delete it */ 287 /* The APP is not available anymore delete it */
289 if (!i40e_dcbnl_find_app(new_cfg, &app)) 288 if (!i40e_dcbnl_find_app(new_cfg, &app))
290 i40e_dcbnl_del_app(pf, &app); 289 i40e_dcbnl_del_app(pf, &app);
@@ -306,9 +305,7 @@ void i40e_dcbnl_setup(struct i40e_vsi *vsi)
306 if (!(pf->flags & I40E_FLAG_DCB_CAPABLE)) 305 if (!(pf->flags & I40E_FLAG_DCB_CAPABLE))
307 return; 306 return;
308 307
309 /* Do not setup DCB NL ops for MFP mode */ 308 dev->dcbnl_ops = &dcbnl_ops;
310 if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
311 dev->dcbnl_ops = &dcbnl_ops;
312 309
313 /* Set initial IEEE DCB settings */ 310 /* Set initial IEEE DCB settings */
314 i40e_dcbnl_set_all(vsi); 311 i40e_dcbnl_set_all(vsi);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 309bd1cf13e2..7413b0e429c8 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -1413,6 +1413,8 @@ static void i40e_get_strings(struct net_device *netdev, u32 stringset,
1413 data += ETH_GSTRING_LEN; 1413 data += ETH_GSTRING_LEN;
1414 } 1414 }
1415 break; 1415 break;
1416 default:
1417 break;
1416 } 1418 }
1417} 1419}
1418 1420
@@ -1654,6 +1656,8 @@ static int i40e_set_phys_id(struct net_device *netdev,
1654 case ETHTOOL_ID_INACTIVE: 1656 case ETHTOOL_ID_INACTIVE:
1655 i40e_led_set(hw, pf->led_status, false); 1657 i40e_led_set(hw, pf->led_status, false);
1656 break; 1658 break;
1659 default:
1660 break;
1657 } 1661 }
1658 1662
1659 return 0; 1663 return 0;
@@ -2344,10 +2348,6 @@ static int i40e_set_channels(struct net_device *dev,
2344 /* update feature limits from largest to smallest supported values */ 2348 /* update feature limits from largest to smallest supported values */
2345 /* TODO: Flow director limit, DCB etc */ 2349 /* TODO: Flow director limit, DCB etc */
2346 2350
2347 /* cap RSS limit */
2348 if (count > pf->rss_size_max)
2349 count = pf->rss_size_max;
2350
2351 /* use rss_reconfig to rebuild with new queue count and update traffic 2351 /* use rss_reconfig to rebuild with new queue count and update traffic
2352 * class queue mapping 2352 * class queue mapping
2353 */ 2353 */
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index aadc60432980..c3858e7f0e66 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -39,7 +39,7 @@ static const char i40e_driver_string[] =
39 39
40#define DRV_VERSION_MAJOR 1 40#define DRV_VERSION_MAJOR 1
41#define DRV_VERSION_MINOR 2 41#define DRV_VERSION_MINOR 2
42#define DRV_VERSION_BUILD 9 42#define DRV_VERSION_BUILD 10
43#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ 43#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
44 __stringify(DRV_VERSION_MINOR) "." \ 44 __stringify(DRV_VERSION_MINOR) "." \
45 __stringify(DRV_VERSION_BUILD) DRV_KERN 45 __stringify(DRV_VERSION_BUILD) DRV_KERN
@@ -1566,6 +1566,12 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
1566 1566
1567 /* Set actual Tx/Rx queue pairs */ 1567 /* Set actual Tx/Rx queue pairs */
1568 vsi->num_queue_pairs = offset; 1568 vsi->num_queue_pairs = offset;
1569 if ((vsi->type == I40E_VSI_MAIN) && (numtc == 1)) {
1570 if (vsi->req_queue_pairs > 0)
1571 vsi->num_queue_pairs = vsi->req_queue_pairs;
1572 else
1573 vsi->num_queue_pairs = pf->num_lan_msix;
1574 }
1569 1575
1570 /* Scheduler section valid can only be set for ADD VSI */ 1576 /* Scheduler section valid can only be set for ADD VSI */
1571 if (is_add) { 1577 if (is_add) {
@@ -4101,7 +4107,7 @@ static u8 i40e_pf_get_num_tc(struct i40e_pf *pf)
4101 if (pf->hw.func_caps.iscsi) 4107 if (pf->hw.func_caps.iscsi)
4102 enabled_tc = i40e_get_iscsi_tc_map(pf); 4108 enabled_tc = i40e_get_iscsi_tc_map(pf);
4103 else 4109 else
4104 enabled_tc = pf->hw.func_caps.enabled_tcmap; 4110 return 1; /* Only TC0 */
4105 4111
4106 /* At least have TC0 */ 4112 /* At least have TC0 */
4107 enabled_tc = (enabled_tc ? enabled_tc : 0x1); 4113 enabled_tc = (enabled_tc ? enabled_tc : 0x1);
@@ -4151,11 +4157,11 @@ static u8 i40e_pf_get_tc_map(struct i40e_pf *pf)
4151 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) 4157 if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
4152 return i40e_dcb_get_enabled_tc(&pf->hw.local_dcbx_config); 4158 return i40e_dcb_get_enabled_tc(&pf->hw.local_dcbx_config);
4153 4159
4154 /* MPF enabled and iSCSI PF type */ 4160 /* MFP enabled and iSCSI PF type */
4155 if (pf->hw.func_caps.iscsi) 4161 if (pf->hw.func_caps.iscsi)
4156 return i40e_get_iscsi_tc_map(pf); 4162 return i40e_get_iscsi_tc_map(pf);
4157 else 4163 else
4158 return pf->hw.func_caps.enabled_tcmap; 4164 return i40e_pf_get_default_tc(pf);
4159} 4165}
4160 4166
4161/** 4167/**
@@ -4545,6 +4551,11 @@ static int i40e_init_pf_dcb(struct i40e_pf *pf)
4545 struct i40e_hw *hw = &pf->hw; 4551 struct i40e_hw *hw = &pf->hw;
4546 int err = 0; 4552 int err = 0;
4547 4553
4554 /* Do not enable DCB for SW1 and SW2 images even if the FW is capable */
4555 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) ||
4556 (pf->hw.aq.fw_maj_ver < 4))
4557 goto out;
4558
4548 /* Get the initial DCB configuration */ 4559 /* Get the initial DCB configuration */
4549 err = i40e_init_dcb(hw); 4560 err = i40e_init_dcb(hw);
4550 if (!err) { 4561 if (!err) {
@@ -5155,7 +5166,6 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
5155 struct i40e_aqc_lldp_get_mib *mib = 5166 struct i40e_aqc_lldp_get_mib *mib =
5156 (struct i40e_aqc_lldp_get_mib *)&e->desc.params.raw; 5167 (struct i40e_aqc_lldp_get_mib *)&e->desc.params.raw;
5157 struct i40e_hw *hw = &pf->hw; 5168 struct i40e_hw *hw = &pf->hw;
5158 struct i40e_dcbx_config *dcbx_cfg = &hw->local_dcbx_config;
5159 struct i40e_dcbx_config tmp_dcbx_cfg; 5169 struct i40e_dcbx_config tmp_dcbx_cfg;
5160 bool need_reconfig = false; 5170 bool need_reconfig = false;
5161 int ret = 0; 5171 int ret = 0;
@@ -5188,8 +5198,10 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
5188 5198
5189 memset(&tmp_dcbx_cfg, 0, sizeof(tmp_dcbx_cfg)); 5199 memset(&tmp_dcbx_cfg, 0, sizeof(tmp_dcbx_cfg));
5190 /* Store the old configuration */ 5200 /* Store the old configuration */
5191 tmp_dcbx_cfg = *dcbx_cfg; 5201 memcpy(&tmp_dcbx_cfg, &hw->local_dcbx_config, sizeof(tmp_dcbx_cfg));
5192 5202
5203 /* Reset the old DCBx configuration data */
5204 memset(&hw->local_dcbx_config, 0, sizeof(hw->local_dcbx_config));
5193 /* Get updated DCBX data from firmware */ 5205 /* Get updated DCBX data from firmware */
5194 ret = i40e_get_dcb_config(&pf->hw); 5206 ret = i40e_get_dcb_config(&pf->hw);
5195 if (ret) { 5207 if (ret) {
@@ -5198,20 +5210,22 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
5198 } 5210 }
5199 5211
5200 /* No change detected in DCBX configs */ 5212 /* No change detected in DCBX configs */
5201 if (!memcmp(&tmp_dcbx_cfg, dcbx_cfg, sizeof(tmp_dcbx_cfg))) { 5213 if (!memcmp(&tmp_dcbx_cfg, &hw->local_dcbx_config,
5214 sizeof(tmp_dcbx_cfg))) {
5202 dev_dbg(&pf->pdev->dev, "No change detected in DCBX configuration.\n"); 5215 dev_dbg(&pf->pdev->dev, "No change detected in DCBX configuration.\n");
5203 goto exit; 5216 goto exit;
5204 } 5217 }
5205 5218
5206 need_reconfig = i40e_dcb_need_reconfig(pf, &tmp_dcbx_cfg, dcbx_cfg); 5219 need_reconfig = i40e_dcb_need_reconfig(pf, &tmp_dcbx_cfg,
5220 &hw->local_dcbx_config);
5207 5221
5208 i40e_dcbnl_flush_apps(pf, dcbx_cfg); 5222 i40e_dcbnl_flush_apps(pf, &tmp_dcbx_cfg, &hw->local_dcbx_config);
5209 5223
5210 if (!need_reconfig) 5224 if (!need_reconfig)
5211 goto exit; 5225 goto exit;
5212 5226
5213 /* Enable DCB tagging only when more than one TC */ 5227 /* Enable DCB tagging only when more than one TC */
5214 if (i40e_dcb_get_num_tc(dcbx_cfg) > 1) 5228 if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1)
5215 pf->flags |= I40E_FLAG_DCB_ENABLED; 5229 pf->flags |= I40E_FLAG_DCB_ENABLED;
5216 else 5230 else
5217 pf->flags &= ~I40E_FLAG_DCB_ENABLED; 5231 pf->flags &= ~I40E_FLAG_DCB_ENABLED;
@@ -6305,13 +6319,14 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
6305 } 6319 }
6306 } 6320 }
6307 6321
6308 msleep(75); 6322 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) ||
6309 ret = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); 6323 (pf->hw.aq.fw_maj_ver < 4)) {
6310 if (ret) { 6324 msleep(75);
6311 dev_info(&pf->pdev->dev, "link restart failed, aq_err=%d\n", 6325 ret = i40e_aq_set_link_restart_an(&pf->hw, true, NULL);
6312 pf->hw.aq.asq_last_status); 6326 if (ret)
6327 dev_info(&pf->pdev->dev, "link restart failed, aq_err=%d\n",
6328 pf->hw.aq.asq_last_status);
6313 } 6329 }
6314
6315 /* reinit the misc interrupt */ 6330 /* reinit the misc interrupt */
6316 if (pf->flags & I40E_FLAG_MSIX_ENABLED) 6331 if (pf->flags & I40E_FLAG_MSIX_ENABLED)
6317 ret = i40e_setup_misc_vector(pf); 6332 ret = i40e_setup_misc_vector(pf);
@@ -6698,6 +6713,8 @@ static int i40e_vsi_mem_alloc(struct i40e_pf *pf, enum i40e_vsi_type type)
6698 vsi->idx = vsi_idx; 6713 vsi->idx = vsi_idx;
6699 vsi->rx_itr_setting = pf->rx_itr_default; 6714 vsi->rx_itr_setting = pf->rx_itr_default;
6700 vsi->tx_itr_setting = pf->tx_itr_default; 6715 vsi->tx_itr_setting = pf->tx_itr_default;
6716 vsi->rss_table_size = (vsi->type == I40E_VSI_MAIN) ?
6717 pf->rss_table_size : 64;
6701 vsi->netdev_registered = false; 6718 vsi->netdev_registered = false;
6702 vsi->work_limit = I40E_DEFAULT_IRQ_WORK; 6719 vsi->work_limit = I40E_DEFAULT_IRQ_WORK;
6703 INIT_LIST_HEAD(&vsi->mac_filter_list); 6720 INIT_LIST_HEAD(&vsi->mac_filter_list);
@@ -6921,7 +6938,8 @@ static int i40e_init_msix(struct i40e_pf *pf)
6921 * If we can't get what we want, we'll simplify to nearly nothing 6938 * If we can't get what we want, we'll simplify to nearly nothing
6922 * and try again. If that still fails, we punt. 6939 * and try again. If that still fails, we punt.
6923 */ 6940 */
6924 pf->num_lan_msix = pf->num_lan_qps - (pf->rss_size_max - pf->rss_size); 6941 pf->num_lan_msix = min_t(int, num_online_cpus(),
6942 hw->func_caps.num_msix_vectors);
6925 pf->num_vmdq_msix = pf->num_vmdq_qps; 6943 pf->num_vmdq_msix = pf->num_vmdq_qps;
6926 other_vecs = 1; 6944 other_vecs = 1;
6927 other_vecs += (pf->num_vmdq_vsis * pf->num_vmdq_msix); 6945 other_vecs += (pf->num_vmdq_vsis * pf->num_vmdq_msix);
@@ -7189,6 +7207,7 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)
7189static int i40e_config_rss(struct i40e_pf *pf) 7207static int i40e_config_rss(struct i40e_pf *pf)
7190{ 7208{
7191 u32 rss_key[I40E_PFQF_HKEY_MAX_INDEX + 1]; 7209 u32 rss_key[I40E_PFQF_HKEY_MAX_INDEX + 1];
7210 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
7192 struct i40e_hw *hw = &pf->hw; 7211 struct i40e_hw *hw = &pf->hw;
7193 u32 lut = 0; 7212 u32 lut = 0;
7194 int i, j; 7213 int i, j;
@@ -7206,6 +7225,8 @@ static int i40e_config_rss(struct i40e_pf *pf)
7206 wr32(hw, I40E_PFQF_HENA(0), (u32)hena); 7225 wr32(hw, I40E_PFQF_HENA(0), (u32)hena);
7207 wr32(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32)); 7226 wr32(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32));
7208 7227
7228 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs);
7229
7209 /* Check capability and Set table size and register per hw expectation*/ 7230 /* Check capability and Set table size and register per hw expectation*/
7210 reg_val = rd32(hw, I40E_PFQF_CTL_0); 7231 reg_val = rd32(hw, I40E_PFQF_CTL_0);
7211 if (hw->func_caps.rss_table_size == 512) { 7232 if (hw->func_caps.rss_table_size == 512) {
@@ -7227,7 +7248,7 @@ static int i40e_config_rss(struct i40e_pf *pf)
7227 * If LAN VSI is the only consumer for RSS then this requirement 7248 * If LAN VSI is the only consumer for RSS then this requirement
7228 * is not necessary. 7249 * is not necessary.
7229 */ 7250 */
7230 if (j == pf->rss_size) 7251 if (j == vsi->rss_size)
7231 j = 0; 7252 j = 0;
7232 /* lut = 4-byte sliding window of 4 lut entries */ 7253 /* lut = 4-byte sliding window of 4 lut entries */
7233 lut = (lut << 8) | (j & 7254 lut = (lut << 8) | (j &
@@ -7251,15 +7272,19 @@ static int i40e_config_rss(struct i40e_pf *pf)
7251 **/ 7272 **/
7252int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count) 7273int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count)
7253{ 7274{
7275 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
7276 int new_rss_size;
7277
7254 if (!(pf->flags & I40E_FLAG_RSS_ENABLED)) 7278 if (!(pf->flags & I40E_FLAG_RSS_ENABLED))
7255 return 0; 7279 return 0;
7256 7280
7257 queue_count = min_t(int, queue_count, pf->rss_size_max); 7281 new_rss_size = min_t(int, queue_count, pf->rss_size_max);
7258 7282
7259 if (queue_count != pf->rss_size) { 7283 if (queue_count != vsi->num_queue_pairs) {
7284 vsi->req_queue_pairs = queue_count;
7260 i40e_prep_for_reset(pf); 7285 i40e_prep_for_reset(pf);
7261 7286
7262 pf->rss_size = queue_count; 7287 pf->rss_size = new_rss_size;
7263 7288
7264 i40e_reset_and_rebuild(pf, true); 7289 i40e_reset_and_rebuild(pf, true);
7265 i40e_config_rss(pf); 7290 i40e_config_rss(pf);
@@ -7432,6 +7457,7 @@ static int i40e_sw_init(struct i40e_pf *pf)
7432 */ 7457 */
7433 pf->rss_size_max = 0x1 << pf->hw.func_caps.rss_table_entry_width; 7458 pf->rss_size_max = 0x1 << pf->hw.func_caps.rss_table_entry_width;
7434 pf->rss_size = 1; 7459 pf->rss_size = 1;
7460 pf->rss_table_size = pf->hw.func_caps.rss_table_size;
7435 pf->rss_size_max = min_t(int, pf->rss_size_max, 7461 pf->rss_size_max = min_t(int, pf->rss_size_max,
7436 pf->hw.func_caps.num_tx_qp); 7462 pf->hw.func_caps.num_tx_qp);
7437 if (pf->hw.func_caps.rss) { 7463 if (pf->hw.func_caps.rss) {
@@ -9258,7 +9284,11 @@ static void i40e_determine_queue_usage(struct i40e_pf *pf)
9258 pf->flags &= ~I40E_FLAG_DCB_CAPABLE; 9284 pf->flags &= ~I40E_FLAG_DCB_CAPABLE;
9259 dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n"); 9285 dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n");
9260 } 9286 }
9261 pf->num_lan_qps = pf->rss_size_max; 9287 pf->num_lan_qps = max_t(int, pf->rss_size_max,
9288 num_online_cpus());
9289 pf->num_lan_qps = min_t(int, pf->num_lan_qps,
9290 pf->hw.func_caps.num_tx_qp);
9291
9262 queues_left -= pf->num_lan_qps; 9292 queues_left -= pf->num_lan_qps;
9263 } 9293 }
9264 9294
@@ -9662,13 +9692,14 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
9662 if (err) 9692 if (err)
9663 dev_info(&pf->pdev->dev, "set phy mask fail, aq_err %d\n", err); 9693 dev_info(&pf->pdev->dev, "set phy mask fail, aq_err %d\n", err);
9664 9694
9665 msleep(75); 9695 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) ||
9666 err = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); 9696 (pf->hw.aq.fw_maj_ver < 4)) {
9667 if (err) { 9697 msleep(75);
9668 dev_info(&pf->pdev->dev, "link restart failed, aq_err=%d\n", 9698 err = i40e_aq_set_link_restart_an(&pf->hw, true, NULL);
9669 pf->hw.aq.asq_last_status); 9699 if (err)
9700 dev_info(&pf->pdev->dev, "link restart failed, aq_err=%d\n",
9701 pf->hw.aq.asq_last_status);
9670 } 9702 }
9671
9672 /* The main driver is (mostly) up and happy. We need to set this state 9703 /* The main driver is (mostly) up and happy. We need to set this state
9673 * before setting up the misc vector or we get a race and the vector 9704 * before setting up the misc vector or we get a race and the vector
9674 * ends up disabled forever. 9705 * ends up disabled forever.
diff --git a/drivers/net/ethernet/intel/i40e/i40e_prototype.h b/drivers/net/ethernet/intel/i40e/i40e_prototype.h
index 8cab460865f5..fea0d37ecc72 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_prototype.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_prototype.h
@@ -66,6 +66,7 @@ void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink);
66 66
67i40e_status i40e_aq_get_firmware_version(struct i40e_hw *hw, 67i40e_status i40e_aq_get_firmware_version(struct i40e_hw *hw,
68 u16 *fw_major_version, u16 *fw_minor_version, 68 u16 *fw_major_version, u16 *fw_minor_version,
69 u32 *fw_build,
69 u16 *api_major_version, u16 *api_minor_version, 70 u16 *api_major_version, u16 *api_minor_version,
70 struct i40e_asq_cmd_details *cmd_details); 71 struct i40e_asq_cmd_details *cmd_details);
71i40e_status i40e_aq_debug_write_register(struct i40e_hw *hw, 72i40e_status i40e_aq_debug_write_register(struct i40e_hw *hw,
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index f8c863bfa6f7..af350626843e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -1354,10 +1354,10 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi,
1354 struct iphdr *iph; 1354 struct iphdr *iph;
1355 __sum16 csum; 1355 __sum16 csum;
1356 1356
1357 ipv4_tunnel = (rx_ptype > I40E_RX_PTYPE_GRENAT4_MAC_PAY3) && 1357 ipv4_tunnel = (rx_ptype >= I40E_RX_PTYPE_GRENAT4_MAC_PAY3) &&
1358 (rx_ptype < I40E_RX_PTYPE_GRENAT4_MACVLAN_IPV6_ICMP_PAY4); 1358 (rx_ptype <= I40E_RX_PTYPE_GRENAT4_MACVLAN_IPV6_ICMP_PAY4);
1359 ipv6_tunnel = (rx_ptype > I40E_RX_PTYPE_GRENAT6_MAC_PAY3) && 1359 ipv6_tunnel = (rx_ptype >= I40E_RX_PTYPE_GRENAT6_MAC_PAY3) &&
1360 (rx_ptype < I40E_RX_PTYPE_GRENAT6_MACVLAN_IPV6_ICMP_PAY4); 1360 (rx_ptype <= I40E_RX_PTYPE_GRENAT6_MACVLAN_IPV6_ICMP_PAY4);
1361 1361
1362 skb->ip_summed = CHECKSUM_NONE; 1362 skb->ip_summed = CHECKSUM_NONE;
1363 1363
@@ -2043,6 +2043,9 @@ static int i40e_tx_prepare_vlan_flags(struct sk_buff *skb,
2043 tx_flags |= I40E_TX_FLAGS_SW_VLAN; 2043 tx_flags |= I40E_TX_FLAGS_SW_VLAN;
2044 } 2044 }
2045 2045
2046 if (!(tx_ring->vsi->back->flags & I40E_FLAG_DCB_ENABLED))
2047 goto out;
2048
2046 /* Insert 802.1p priority into VLAN header */ 2049 /* Insert 802.1p priority into VLAN header */
2047 if ((tx_flags & (I40E_TX_FLAGS_HW_VLAN | I40E_TX_FLAGS_SW_VLAN)) || 2050 if ((tx_flags & (I40E_TX_FLAGS_HW_VLAN | I40E_TX_FLAGS_SW_VLAN)) ||
2048 (skb->priority != TC_PRIO_CONTROL)) { 2051 (skb->priority != TC_PRIO_CONTROL)) {
@@ -2063,6 +2066,8 @@ static int i40e_tx_prepare_vlan_flags(struct sk_buff *skb,
2063 tx_flags |= I40E_TX_FLAGS_HW_VLAN; 2066 tx_flags |= I40E_TX_FLAGS_HW_VLAN;
2064 } 2067 }
2065 } 2068 }
2069
2070out:
2066 *flags = tx_flags; 2071 *flags = tx_flags;
2067 return 0; 2072 return 0;
2068} 2073}
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 493335caa276..910c45e83fdd 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -832,7 +832,6 @@ void i40e_free_vfs(struct i40e_pf *pf)
832 bit_idx = (hw->func_caps.vf_base_id + vf_id) % 32; 832 bit_idx = (hw->func_caps.vf_base_id + vf_id) % 32;
833 wr32(hw, I40E_GLGEN_VFLRSTAT(reg_idx), (1 << bit_idx)); 833 wr32(hw, I40E_GLGEN_VFLRSTAT(reg_idx), (1 << bit_idx));
834 } 834 }
835 i40e_disable_pf_switch_lb(pf);
836 } else { 835 } else {
837 dev_warn(&pf->pdev->dev, 836 dev_warn(&pf->pdev->dev,
838 "unable to disable SR-IOV because VFs are assigned.\n"); 837 "unable to disable SR-IOV because VFs are assigned.\n");
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq.h b/drivers/net/ethernet/intel/i40evf/i40e_adminq.h
index 60f04e96a80e..ef43d68f67b3 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_adminq.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq.h
@@ -93,6 +93,7 @@ struct i40e_adminq_info {
93 u16 asq_buf_size; /* send queue buffer size */ 93 u16 asq_buf_size; /* send queue buffer size */
94 u16 fw_maj_ver; /* firmware major version */ 94 u16 fw_maj_ver; /* firmware major version */
95 u16 fw_min_ver; /* firmware minor version */ 95 u16 fw_min_ver; /* firmware minor version */
96 u32 fw_build; /* firmware build number */
96 u16 api_maj_ver; /* api major version */ 97 u16 api_maj_ver; /* api major version */
97 u16 api_min_ver; /* api minor version */ 98 u16 api_min_ver; /* api minor version */
98 bool nvm_release_on_done; 99 bool nvm_release_on_done;
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
index fc7e2d0b755c..d2ff862f0726 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
@@ -852,10 +852,10 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi,
852 struct iphdr *iph; 852 struct iphdr *iph;
853 __sum16 csum; 853 __sum16 csum;
854 854
855 ipv4_tunnel = (rx_ptype > I40E_RX_PTYPE_GRENAT4_MAC_PAY3) && 855 ipv4_tunnel = (rx_ptype >= I40E_RX_PTYPE_GRENAT4_MAC_PAY3) &&
856 (rx_ptype < I40E_RX_PTYPE_GRENAT4_MACVLAN_IPV6_ICMP_PAY4); 856 (rx_ptype <= I40E_RX_PTYPE_GRENAT4_MACVLAN_IPV6_ICMP_PAY4);
857 ipv6_tunnel = (rx_ptype > I40E_RX_PTYPE_GRENAT6_MAC_PAY3) && 857 ipv6_tunnel = (rx_ptype >= I40E_RX_PTYPE_GRENAT6_MAC_PAY3) &&
858 (rx_ptype < I40E_RX_PTYPE_GRENAT6_MACVLAN_IPV6_ICMP_PAY4); 858 (rx_ptype <= I40E_RX_PTYPE_GRENAT6_MACVLAN_IPV6_ICMP_PAY4);
859 859
860 skb->ip_summed = CHECKSUM_NONE; 860 skb->ip_summed = CHECKSUM_NONE;
861 861
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
index c5ffaccb59d3..681a5d4b4f6a 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
@@ -642,12 +642,14 @@ static int i40evf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
642 if (!indir) 642 if (!indir)
643 return 0; 643 return 0;
644 644
645 for (i = 0, j = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) { 645 if (indir) {
646 hlut_val = rd32(hw, I40E_VFQF_HLUT(i)); 646 for (i = 0, j = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) {
647 indir[j++] = hlut_val & 0xff; 647 hlut_val = rd32(hw, I40E_VFQF_HLUT(i));
648 indir[j++] = (hlut_val >> 8) & 0xff; 648 indir[j++] = hlut_val & 0xff;
649 indir[j++] = (hlut_val >> 16) & 0xff; 649 indir[j++] = (hlut_val >> 8) & 0xff;
650 indir[j++] = (hlut_val >> 24) & 0xff; 650 indir[j++] = (hlut_val >> 16) & 0xff;
651 indir[j++] = (hlut_val >> 24) & 0xff;
652 }
651 } 653 }
652 return 0; 654 return 0;
653} 655}
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 31d35e200f04..a95135846ea9 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -36,7 +36,7 @@ char i40evf_driver_name[] = "i40evf";
36static const char i40evf_driver_string[] = 36static const char i40evf_driver_string[] =
37 "Intel(R) XL710/X710 Virtual Function Network Driver"; 37 "Intel(R) XL710/X710 Virtual Function Network Driver";
38 38
39#define DRV_VERSION "1.2.3" 39#define DRV_VERSION "1.2.4"
40const char i40evf_driver_version[] = DRV_VERSION; 40const char i40evf_driver_version[] = DRV_VERSION;
41static const char i40evf_copyright[] = 41static const char i40evf_copyright[] =
42 "Copyright (c) 2013 - 2014 Intel Corporation."; 42 "Copyright (c) 2013 - 2014 Intel Corporation.";