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
This commit is contained in:
Krzysztof Galazka 2023-02-15 14:28:01 -08:00 committed by Eric Joyner
parent b1a9e570fe
commit 1d02c6b1b8
No known key found for this signature in database
GPG Key ID: 96F0C6FD61E05DE3
5 changed files with 10 additions and 11 deletions

View File

@ -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);

View File

@ -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 {

View File

@ -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);
}

View File

@ -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)

View File

@ -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));