net/dpaa2: do not drop parse error packets by dpdmux
DPDMUX should not drop parse error packets. They shall be left to the decision of the connected DPNI interfaces Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
This commit is contained in:
parent
914450bace
commit
3d43972b1b
@ -324,6 +324,24 @@ dpaa2_create_dpdmux_device(int vdev_fd __rte_unused,
|
||||
}
|
||||
}
|
||||
|
||||
if (maj_ver >= 6 && min_ver >= 9) {
|
||||
struct dpdmux_error_cfg mux_err_cfg;
|
||||
|
||||
memset(&mux_err_cfg, 0, sizeof(mux_err_cfg));
|
||||
mux_err_cfg.error_action = DPDMUX_ERROR_ACTION_CONTINUE;
|
||||
mux_err_cfg.errors = DPDMUX_ERROR_DISC;
|
||||
|
||||
ret = dpdmux_if_set_errors_behavior(&dpdmux_dev->dpdmux,
|
||||
CMD_PRI_LOW,
|
||||
dpdmux_dev->token, dpdmux_id,
|
||||
&mux_err_cfg);
|
||||
if (ret) {
|
||||
DPAA2_PMD_ERR("dpdmux_if_set_errors_behavior %s err %d",
|
||||
__func__, ret);
|
||||
goto init_err;
|
||||
}
|
||||
}
|
||||
|
||||
dpdmux_dev->dpdmux_id = dpdmux_id;
|
||||
dpdmux_dev->num_ifs = attr.num_ifs;
|
||||
|
||||
|
@ -1012,3 +1012,40 @@ int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* dpdmux_if_set_errors_behavior() - Set errors behavior
|
||||
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
* @token: Token of DPSW object
|
||||
* @if_id: Interface Identifier
|
||||
* @cfg: Errors configuration
|
||||
*
|
||||
* Provides a set of frame errors that will be rejected or accepted by the
|
||||
* dpdmux interface. The frame with this errors will no longer be dropped by
|
||||
* the dpdmux interface. When frame has parsing error the distribution to
|
||||
* expected interface may fail. If the frame must be distributed using the
|
||||
* information from a header that was not parsed due errors the frame may
|
||||
* be discarded or end up on a default interface because needed data was not
|
||||
* parsed properly.
|
||||
* This function may be called numerous times with different error masks
|
||||
*
|
||||
* Return: '0' on Success; Error code otherwise.
|
||||
*/
|
||||
int dpdmux_if_set_errors_behavior(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
|
||||
uint16_t token, uint16_t if_id, struct dpdmux_error_cfg *cfg)
|
||||
{
|
||||
struct mc_command cmd = { 0 };
|
||||
struct dpdmux_cmd_set_errors_behavior *cmd_params;
|
||||
|
||||
/* prepare command */
|
||||
cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SET_ERRORS_BEHAVIOR,
|
||||
cmd_flags,
|
||||
token);
|
||||
cmd_params = (struct dpdmux_cmd_set_errors_behavior *)cmd.params;
|
||||
cmd_params->errors = cpu_to_le32(cfg->errors);
|
||||
dpdmux_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
|
||||
cmd_params->if_id = cpu_to_le16(if_id);
|
||||
|
||||
/* send command to mc*/
|
||||
return mc_send_command(mc_io, &cmd);
|
||||
}
|
||||
|
@ -39,6 +39,12 @@ int dpdmux_close(struct fsl_mc_io *mc_io,
|
||||
*/
|
||||
#define DPDMUX_OPT_CLS_MASK_SUPPORT 0x0000000000000020ULL
|
||||
|
||||
/**
|
||||
* Automatic max frame length - maximum frame length for dpdmux interface will
|
||||
* be changed automatically by connected dpni objects.
|
||||
*/
|
||||
#define DPDMUX_OPT_AUTO_MAX_FRAME_LEN 0x0000000000000040ULL
|
||||
|
||||
#define DPDMUX_IRQ_INDEX_IF 0x0000
|
||||
#define DPDMUX_IRQ_INDEX 0x0001
|
||||
|
||||
@ -203,6 +209,7 @@ int dpdmux_set_max_frame_length(struct fsl_mc_io *mc_io,
|
||||
* @DPDMUX_CNT_EGR_FRAME: Counts egress frames
|
||||
* @DPDMUX_CNT_EGR_BYTE: Counts egress bytes
|
||||
* @DPDMUX_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames
|
||||
* @DPDMUX_CNT_ING_NO_BUFFER_DISCARD: Counts ingress no buffer discard frames
|
||||
*/
|
||||
enum dpdmux_counter_type {
|
||||
DPDMUX_CNT_ING_FRAME = 0x0,
|
||||
@ -215,7 +222,8 @@ enum dpdmux_counter_type {
|
||||
DPDMUX_CNT_ING_BCAST_BYTES = 0x7,
|
||||
DPDMUX_CNT_EGR_FRAME = 0x8,
|
||||
DPDMUX_CNT_EGR_BYTE = 0x9,
|
||||
DPDMUX_CNT_EGR_FRAME_DISCARD = 0xa
|
||||
DPDMUX_CNT_EGR_FRAME_DISCARD = 0xa,
|
||||
DPDMUX_CNT_ING_NO_BUFFER_DISCARD = 0xb,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -447,4 +455,107 @@ int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
|
||||
uint16_t *major_ver,
|
||||
uint16_t *minor_ver);
|
||||
|
||||
/**
|
||||
* Discard bit. This bit must be used together with other bits in
|
||||
* DPDMUX_ERROR_ACTION_CONTINUE to disable discarding of frames containing
|
||||
* errors
|
||||
*/
|
||||
#define DPDMUX_ERROR_DISC 0x80000000
|
||||
/**
|
||||
* MACSEC is enabled
|
||||
*/
|
||||
#define DPDMUX_ERROR_MS 0x40000000
|
||||
/**
|
||||
* PTP event frame
|
||||
*/
|
||||
#define DPDMUX_ERROR_PTP 0x08000000
|
||||
/**
|
||||
* This is a multicast frame
|
||||
*/
|
||||
#define DPDMUX_ERROR_MC 0x04000000
|
||||
/**
|
||||
* This is a broadcast frame
|
||||
*/
|
||||
#define DPDMUX_ERROR_BC 0x02000000
|
||||
/**
|
||||
* Invalid Key composition or key size error
|
||||
*/
|
||||
#define DPDMUX_ERROR_KSE 0x00040000
|
||||
/**
|
||||
* Extract out of frame header
|
||||
*/
|
||||
#define DPDMUX_ERROR_EOFHE 0x00020000
|
||||
/**
|
||||
* Maximum number of chained lookups is reached
|
||||
*/
|
||||
#define DPDMUX_ERROR_MNLE 0x00010000
|
||||
/**
|
||||
* Invalid table ID
|
||||
*/
|
||||
#define DPDMUX_ERROR_TIDE 0x00008000
|
||||
/**
|
||||
* Policer initialization entry error
|
||||
*/
|
||||
#define DPDMUX_ERROR_PIEE 0x00004000
|
||||
/**
|
||||
* Frame length error
|
||||
*/
|
||||
#define DPDMUX_ERROR_FLE 0x00002000
|
||||
/**
|
||||
* Frame physical error
|
||||
*/
|
||||
#define DPDMUX_ERROR_FPE 0x00001000
|
||||
/**
|
||||
* Cycle limit is exceeded and frame parsing is forced to terminate early
|
||||
*/
|
||||
#define DPDMUX_ERROR_PTE 0x00000080
|
||||
/**
|
||||
* Invalid softparse instruction is encountered
|
||||
*/
|
||||
#define DPDMUX_ERROR_ISP 0x00000040
|
||||
/**
|
||||
* Parsing header error
|
||||
*/
|
||||
#define DPDMUX_ERROR_PHE 0x00000020
|
||||
/*
|
||||
* Block limit is exceeded. Maximum data that can be read and parsed is 256
|
||||
* bytes.
|
||||
* Parser will set this bit if it needs more that this limit to parse.
|
||||
*/
|
||||
#define DPDMUX_ERROR_BLE 0x00000010
|
||||
/**
|
||||
* L3 checksum validation
|
||||
*/
|
||||
#define DPDMUX__ERROR_L3CV 0x00000008
|
||||
/**
|
||||
* L3 checksum error
|
||||
*/
|
||||
#define DPDMUX__ERROR_L3CE 0x00000004
|
||||
/**
|
||||
* L4 checksum validation
|
||||
*/
|
||||
#define DPDMUX__ERROR_L4CV 0x00000002
|
||||
/**
|
||||
* L4 checksum error
|
||||
*/
|
||||
#define DPDMUX__ERROR_L4CE 0x00000001
|
||||
|
||||
enum dpdmux_error_action {
|
||||
DPDMUX_ERROR_ACTION_DISCARD = 0,
|
||||
DPDMUX_ERROR_ACTION_CONTINUE = 1
|
||||
};
|
||||
|
||||
/**
|
||||
* Configure how dpdmux interface behaves on errors
|
||||
* @errors - or'ed combination of DPDMUX_ERROR_*
|
||||
* @action - set to DPDMUX_ERROR_ACTION_DISCARD or DPDMUX_ERROR_ACTION_CONTINUE
|
||||
*/
|
||||
struct dpdmux_error_cfg {
|
||||
uint32_t errors;
|
||||
enum dpdmux_error_action error_action;
|
||||
};
|
||||
|
||||
int dpdmux_if_set_errors_behavior(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
|
||||
uint16_t token, uint16_t if_id, struct dpdmux_error_cfg *cfg);
|
||||
|
||||
#endif /* __FSL_DPDMUX_H */
|
||||
|
@ -9,30 +9,35 @@
|
||||
|
||||
/* DPDMUX Version */
|
||||
#define DPDMUX_VER_MAJOR 6
|
||||
#define DPDMUX_VER_MINOR 3
|
||||
#define DPDMUX_VER_MINOR 9
|
||||
|
||||
#define DPDMUX_CMD_BASE_VERSION 1
|
||||
#define DPDMUX_CMD_VERSION_2 2
|
||||
#define DPDMUX_CMD_VERSION_3 3
|
||||
#define DPDMUX_CMD_VERSION_4 4
|
||||
#define DPDMUX_CMD_ID_OFFSET 4
|
||||
|
||||
#define DPDMUX_CMD(id) (((id) << DPDMUX_CMD_ID_OFFSET) |\
|
||||
DPDMUX_CMD_BASE_VERSION)
|
||||
#define DPDMUX_CMD_V2(id) (((id) << DPDMUX_CMD_ID_OFFSET) | \
|
||||
DPDMUX_CMD_VERSION_2)
|
||||
#define DPDMUX_CMD_V3(id) (((id) << DPDMUX_CMD_ID_OFFSET) |\
|
||||
DPDMUX_CMD_VERSION_3)
|
||||
#define DPDMUX_CMD_V4(id) (((id) << DPDMUX_CMD_ID_OFFSET) |\
|
||||
DPDMUX_CMD_VERSION_4)
|
||||
|
||||
/* Command IDs */
|
||||
#define DPDMUX_CMDID_CLOSE DPDMUX_CMD(0x800)
|
||||
#define DPDMUX_CMDID_OPEN DPDMUX_CMD(0x806)
|
||||
#define DPDMUX_CMDID_CREATE DPDMUX_CMD(0x906)
|
||||
#define DPDMUX_CMDID_CREATE DPDMUX_CMD_V4(0x906)
|
||||
#define DPDMUX_CMDID_DESTROY DPDMUX_CMD(0x986)
|
||||
#define DPDMUX_CMDID_GET_API_VERSION DPDMUX_CMD(0xa06)
|
||||
|
||||
#define DPDMUX_CMDID_ENABLE DPDMUX_CMD(0x002)
|
||||
#define DPDMUX_CMDID_DISABLE DPDMUX_CMD(0x003)
|
||||
#define DPDMUX_CMDID_GET_ATTR DPDMUX_CMD(0x004)
|
||||
#define DPDMUX_CMDID_GET_ATTR DPDMUX_CMD_V2(0x004)
|
||||
#define DPDMUX_CMDID_RESET DPDMUX_CMD(0x005)
|
||||
#define DPDMUX_CMDID_IS_ENABLED DPDMUX_CMD(0x006)
|
||||
|
||||
#define DPDMUX_CMDID_SET_MAX_FRAME_LENGTH DPDMUX_CMD(0x0a1)
|
||||
|
||||
#define DPDMUX_CMDID_UL_RESET_COUNTERS DPDMUX_CMD(0x0a3)
|
||||
@ -49,7 +54,7 @@
|
||||
#define DPDMUX_CMDID_IF_GET_LINK_STATE DPDMUX_CMD_V2(0x0b4)
|
||||
|
||||
#define DPDMUX_CMDID_SET_CUSTOM_KEY DPDMUX_CMD(0x0b5)
|
||||
#define DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY DPDMUX_CMD(0x0b6)
|
||||
#define DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY DPDMUX_CMD_V2(0x0b6)
|
||||
#define DPDMUX_CMDID_REMOVE_CUSTOM_CLS_ENTRY DPDMUX_CMD(0x0b7)
|
||||
|
||||
#define DPDMUX_CMDID_IF_SET_DEFAULT DPDMUX_CMD(0x0b8)
|
||||
@ -57,6 +62,7 @@
|
||||
|
||||
#define DPDMUX_CMDID_SET_RESETABLE DPDMUX_CMD(0x0ba)
|
||||
#define DPDMUX_CMDID_GET_RESETABLE DPDMUX_CMD(0x0bb)
|
||||
#define DPDMUX_CMDID_SET_ERRORS_BEHAVIOR DPDMUX_CMD(0x0bf)
|
||||
|
||||
#define DPDMUX_MASK(field) \
|
||||
GENMASK(DPDMUX_##field##_SHIFT + DPDMUX_##field##_SIZE - 1, \
|
||||
@ -233,5 +239,14 @@ struct dpdmux_rsp_get_skip_reset_flags {
|
||||
uint8_t skip_reset_flags;
|
||||
};
|
||||
|
||||
#define DPDMUX_ERROR_ACTION_SHIFT 0
|
||||
#define DPDMUX_ERROR_ACTION_SIZE 4
|
||||
|
||||
struct dpdmux_cmd_set_errors_behavior {
|
||||
uint32_t errors;
|
||||
uint16_t flags;
|
||||
uint16_t if_id;
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
#endif /* _FSL_DPDMUX_CMD_H */
|
||||
|
Loading…
Reference in New Issue
Block a user