From 0f22fe3a5c96574db6237ae129a5d7a058c50abd Mon Sep 17 00:00:00 2001 From: Roman Zhukov Date: Thu, 19 Apr 2018 12:37:03 +0100 Subject: [PATCH] net/sfc/base: get max supported value for action MARK The mark value for MATCH_ACTION_MARK has a maximum value. Requesting a value larger than the maximum will cause the filter insertion to fail with EINVAL. This patch allows the driver to check the value at the filter validation. Signed-off-by: Roman Zhukov Signed-off-by: Andrew Rybchenko --- drivers/net/sfc/base/ef10_nic.c | 11 +++++++++-- drivers/net/sfc/base/efx.h | 1 + drivers/net/sfc/base/siena_nic.c | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/net/sfc/base/ef10_nic.c b/drivers/net/sfc/base/ef10_nic.c index b28226d9a6..44286dbf39 100644 --- a/drivers/net/sfc/base/ef10_nic.c +++ b/drivers/net/sfc/base/ef10_nic.c @@ -996,7 +996,7 @@ ef10_get_datapath_caps( efx_nic_cfg_t *encp = &(enp->en_nic_cfg); efx_mcdi_req_t req; uint8_t payload[MAX(MC_CMD_GET_CAPABILITIES_IN_LEN, - MC_CMD_GET_CAPABILITIES_V4_OUT_LEN)]; + MC_CMD_GET_CAPABILITIES_V5_OUT_LEN)]; efx_rc_t rc; if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0) @@ -1008,7 +1008,7 @@ ef10_get_datapath_caps( req.emr_in_buf = payload; req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN; req.emr_out_buf = payload; - req.emr_out_length = MC_CMD_GET_CAPABILITIES_V4_OUT_LEN; + req.emr_out_length = MC_CMD_GET_CAPABILITIES_V5_OUT_LEN; efx_mcdi_execute_quiet(enp, &req); @@ -1305,6 +1305,13 @@ ef10_get_datapath_caps( else encp->enc_filter_action_mark_supported = B_FALSE; + /* Get maximum supported value for "MARK" filter action */ + if (req.emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V5_OUT_LEN) + encp->enc_filter_action_mark_max = MCDI_OUT_DWORD(req, + GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_MAX); + else + encp->enc_filter_action_mark_max = 0; + #undef CAP_FLAGS1 #undef CAP_FLAGS2 diff --git a/drivers/net/sfc/base/efx.h b/drivers/net/sfc/base/efx.h index f5ec568c3b..332c6d06fe 100644 --- a/drivers/net/sfc/base/efx.h +++ b/drivers/net/sfc/base/efx.h @@ -1296,6 +1296,7 @@ typedef struct efx_nic_cfg_s { /* Firmware support for "FLAG" and "MARK" filter actions */ boolean_t enc_filter_action_flag_supported; boolean_t enc_filter_action_mark_supported; + uint32_t enc_filter_action_mark_max; } efx_nic_cfg_t; #define EFX_PCI_FUNCTION_IS_PF(_encp) ((_encp)->enc_vf == 0xffff) diff --git a/drivers/net/sfc/base/siena_nic.c b/drivers/net/sfc/base/siena_nic.c index b7033698ed..31eef80b9a 100644 --- a/drivers/net/sfc/base/siena_nic.c +++ b/drivers/net/sfc/base/siena_nic.c @@ -174,6 +174,7 @@ siena_board_cfg( encp->enc_filter_action_flag_supported = B_FALSE; encp->enc_filter_action_mark_supported = B_FALSE; + encp->enc_filter_action_mark_max = 0; return (0); -- 2.20.1