git: 1d02c6b1b859 - main - ixl(4): Fix MAC/VLAN filters accounting

From: Eric Joyner <erj_at_FreeBSD.org>
Date: Wed, 15 Feb 2023 22:34:47 UTC
The branch main has been updated by erj:

URL: https://cgit.FreeBSD.org/src/commit/?id=1d02c6b1b859e9f611bc8fe27ca3d2c16ec128c1

commit 1d02c6b1b859e9f611bc8fe27ca3d2c16ec128c1
Author:     Krzysztof Galazka <krzysztof.galazka@intel.com>
AuthorDate: 2023-02-15 22:28:01 +0000
Commit:     Eric Joyner <erj@FreeBSD.org>
CommitDate: 2023-02-15 22:34:25 +0000

    ixl(4): Fix MAC/VLAN filters accounting
    
    - Account for a filter required to enable reception of untagged frames
    while registering and unregistering VLANs to avoid trying to add more
    filters than HW supports
    
    - While adding MAC/VLAN filters, pre-set matching method field in the
    Admin Queue Command response buffer to expected error value to work
    around an issue with some FW versions, which do not update that field if
    operation fails, and be able correctly track which filters were
    configured in HW.
    
    - Remove unused IXL_MAX_FILTERS macro definition
    
    - Update number of available MAC/VLAN filters as in newer FW versions it
    was decreased by one.
    
    - Simplify i40e_dma_mem structure
    
    Signed-off-by: Krzysztof Galazka <krzysztof.galazka@intel.com>
    Signed-off-by: Eric Joyner <erj@FreeBSD.org>
    
    Reviewed by:    erj@
    Tested by:      Gowtham Kumar Ks <gowtham.kumar.ks@intel.com>
    MFC after:      3 days
    Sponsored by:   Intel Corporation
    Differential Revision:  https://reviews.freebsd.org/D37457
---
 sys/dev/ixl/i40e_osdep.c  | 1 -
 sys/dev/ixl/i40e_osdep.h  | 3 ---
 sys/dev/ixl/if_ixl.c      | 7 ++++---
 sys/dev/ixl/ixl.h         | 5 +----
 sys/dev/ixl/ixl_pf_main.c | 5 +++++
 5 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/sys/dev/ixl/i40e_osdep.c b/sys/dev/ixl/i40e_osdep.c
index 20eb02c85d67..b3fd53af9e23 100644
--- a/sys/dev/ixl/i40e_osdep.c
+++ b/sys/dev/ixl/i40e_osdep.c
@@ -109,7 +109,6 @@ i40e_allocate_dma_mem(struct i40e_hw *hw, struct i40e_dma_mem *mem,
 		    "error %u\n", err);
 		goto fail_2;
 	}
-	mem->nseg = 1;
 	mem->size = size;
 	bus_dmamap_sync(mem->tag, mem->map,
 	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
diff --git a/sys/dev/ixl/i40e_osdep.h b/sys/dev/ixl/i40e_osdep.h
index e7a1c1226a0e..1146ece279b5 100644
--- a/sys/dev/ixl/i40e_osdep.h
+++ b/sys/dev/ixl/i40e_osdep.h
@@ -160,10 +160,7 @@ struct i40e_dma_mem {
 	u64			pa;
 	bus_dma_tag_t		tag;
 	bus_dmamap_t		map;
-	bus_dma_segment_t	seg;
 	bus_size_t              size;
-	int			nseg;
-	int                     flags;
 };
 
 struct i40e_virt_mem {
diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c
index 8b7d132db7b7..ca71edd9bd9e 100644
--- a/sys/dev/ixl/if_ixl.c
+++ b/sys/dev/ixl/if_ixl.c
@@ -49,7 +49,7 @@
  *********************************************************************/
 #define IXL_DRIVER_VERSION_MAJOR	2
 #define IXL_DRIVER_VERSION_MINOR	3
-#define IXL_DRIVER_VERSION_BUILD	2
+#define IXL_DRIVER_VERSION_BUILD	3
 
 #define IXL_DRIVER_VERSION_STRING			\
     __XSTRING(IXL_DRIVER_VERSION_MAJOR) "."		\
@@ -1720,9 +1720,10 @@ ixl_if_vlan_unregister(if_ctx_t ctx, u16 vtag)
 	if ((if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER) == 0)
 		return;
 
-	if (vsi->num_vlans < IXL_MAX_VLAN_FILTERS)
+	/* One filter is used for untagged frames */
+	if (vsi->num_vlans < IXL_MAX_VLAN_FILTERS - 1)
 		ixl_del_filter(vsi, hw->mac.addr, vtag);
-	else if (vsi->num_vlans == IXL_MAX_VLAN_FILTERS) {
+	else if (vsi->num_vlans == IXL_MAX_VLAN_FILTERS - 1) {
 		ixl_del_filter(vsi, hw->mac.addr, IXL_VLAN_ANY);
 		ixl_add_vlan_filters(vsi, hw->mac.addr);
 	}
diff --git a/sys/dev/ixl/ixl.h b/sys/dev/ixl/ixl.h
index 6b94732fd44e..30e8ce40126b 100644
--- a/sys/dev/ixl/ixl.h
+++ b/sys/dev/ixl/ixl.h
@@ -164,9 +164,6 @@
 #define IXL_VF_MAX_HDR_BUFFER	0x840
 #define IXL_VF_MAX_FRAME	0x3FFF
 
-/* ERJ: hardware can support ~2k (SW5+) filters between all functions */
-#define IXL_MAX_FILTERS		256
-
 #define IXL_NVM_VERSION_LO_SHIFT	0
 #define IXL_NVM_VERSION_LO_MASK		(0xff << IXL_NVM_VERSION_LO_SHIFT)
 #define IXL_NVM_VERSION_HI_SHIFT	12
@@ -195,7 +192,7 @@
 #define IXL_VLAN_ANY		-1
 
 /* Maximum number of MAC/VLAN filters supported by HW */
-#define IXL_MAX_VLAN_FILTERS	256
+#define IXL_MAX_VLAN_FILTERS	255
 
 #define CSUM_OFFLOAD_IPV4	(CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
 #define CSUM_OFFLOAD_IPV6	(CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6)
diff --git a/sys/dev/ixl/ixl_pf_main.c b/sys/dev/ixl/ixl_pf_main.c
index 7e9ad20b157b..25ced54e79e1 100644
--- a/sys/dev/ixl/ixl_pf_main.c
+++ b/sys/dev/ixl/ixl_pf_main.c
@@ -1396,6 +1396,11 @@ ixl_add_hw_filters(struct ixl_vsi *vsi, struct ixl_ftl_head *to_add, int cnt)
 			b->flags = 0;
 		}
 		b->flags |= I40E_AQC_MACVLAN_ADD_PERFECT_MATCH;
+		/* Some FW versions do not set match method
+		 * when adding filters fails. Initialize it with
+		 * expected error value to allow detection which
+		 * filters were not added */
+		b->match_method = I40E_AQC_MM_ERR_NO_RES;
 		ixl_dbg_filter(pf, "ADD: " MAC_FORMAT "\n",
 		    MAC_FORMAT_ARGS(f->macaddr));