/* SPDX-License-Identifier: BSD-3-Clause * Copyright 2008-2012 Freescale Semiconductor Inc. * Copyright 2017-2020 NXP */ #ifndef __FM_PORT_EXT_H #define __FM_PORT_EXT_H #include #include "ncsw_ext.h" #include "fm_pcd_ext.h" #include "fm_ext.h" #include "net_ext.h" #include "dpaa_integration.h" /* * @Description FM Port routines */ /* * * @Group lnx_ioctl_FM_grp Frame Manager Linux IOCTL API * * @Description FM Linux ioctls definitions and enums * * @{ */ /* * @Group lnx_ioctl_FM_PORT_grp FM Port * * @Description FM Port API * * The FM uses a general module called "port" to represent a Tx * port (MAC), an Rx port (MAC), offline parsing flow or host * command flow. There may be up to 17 (may change) ports in an * FM - 5 Tx ports (4 for the 1G MACs, 1 for the 10G MAC), 5 Rx * Ports, and 7 Host command/Offline parsing ports. The SW driver * manages these ports as sub-modules of the FM, i.e. after an FM * is initialized, its ports may be initialized and operated * upon. * * The port is initialized aware of its type, but other functions * on a port may be indifferent to its type. When necessary, the * driver verifies coherency and returns error if applicable. * * On initialization, user specifies the port type and it's index * (relative to the port's type). Host command and Offline * parsing ports share the same id range, I.e user may not * initialized host command port 0 and offline parsing port 0. * * @{ */ /* * @Description An enum for defining port PCD modes. * (Must match enum e_fm_port_pcd_support defined in * fm_port_ext.h) * * This enum defines the superset of PCD engines support - i.e. * not all engines have to be used, but all have to be enabled. * The real flow of a specific frame depends on the PCD * configuration and the frame headers and payload. Note: the * first engine and the first engine after the parser (if exists) * should be in order, the order is important as it will define * the flow of the port. However, as for the rest engines (the * ones that follows), the order is not important anymore as it * is defined by the PCD graph itself. */ typedef enum ioc_fm_port_pcd_support { e_IOC_FM_PCD_NONE = 0 /**< BMI to BMI, PCD is not used */ , e_IOC_FM_PCD_PRS_ONLY /**< Use only Parser */ , e_IOC_FM_PCD_PLCR_ONLY /**< Use only Policer */ , e_IOC_FM_PCD_PRS_PLCR/**< Use Parser and Policer */ , e_IOC_FM_PCD_PRS_KG /**< Use Parser and Keygen */ , e_IOC_FM_PCD_PRS_KG_AND_CC /**< Use Parser, Keygen and Coarse Classification */ , e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR /**< Use all PCD engines */ , e_IOC_FM_PCD_PRS_KG_AND_PLCR /**< Use Parser, Keygen and Policer */ , e_IOC_FM_PCD_PRS_CC /**< Use Parser and Coarse Classification */ , e_IOC_FM_PCD_PRS_CC_AND_PLCR /**< Use Parser and Coarse Classification and Policer */ , e_IOC_FM_PCD_CC_ONLY /**< Use only Coarse Classification */ } ioc_fm_port_pcd_support; /* * @Collection FM Frame error */ typedef uint32_t ioc_fm_port_frame_err_select_t; /**< typedef for defining Frame Descriptor errors */ /* @} */ /* * @Description An enum for defining Dual Tx rate limiting scale. * (Must match e_fm_port_dual_rate_limiter_scale_down defined in * fm_port_ext.h) */ typedef enum ioc_fm_port_dual_rate_limiter_scale_down { e_IOC_FM_PORT_DUAL_RATE_LIMITER_NONE = 0, /**< Use only single rate limiter*/ e_IOC_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_2, /**< Divide high rate limiter by 2 */ e_IOC_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_4, /**< Divide high rate limiter by 4 */ e_IOC_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_8 /**< Divide high rate limiter by 8 */ } ioc_fm_port_dual_rate_limiter_scale_down; /* * @Description A structure for defining Tx rate limiting * (Must match struct t_fm_port_rate_limit defined in * fm_port_ext.h) */ typedef struct ioc_fm_port_rate_limit_t { uint16_t max_burst_size; /**< in KBytes for Tx ports, in frames for offline * parsing ports. (note that for early chips burst size * is rounded up to a multiply of 1000 frames). */ uint32_t rate_limit; /**< in Kb/sec for Tx ports, in frame/sec for offline * parsing ports. Rate limit refers to data rate (rather * than line rate). */ ioc_fm_port_dual_rate_limiter_scale_down rate_limit_divider; /**< For offline parsing ports only. Not-valid for some * earlier chip revisions */ } ioc_fm_port_rate_limit_t; /* * @Group lnx_ioctl_FM_PORT_runtime_control_grp FM Port Runtime Control * Unit * * @Description FM Port Runtime control unit API functions, definitions and * enums. * * @{ */ /* * @Description An enum for defining FM Port counters. * (Must match enum e_fm_port_counters defined in fm_port_ext.h) */ typedef enum ioc_fm_port_counters { e_IOC_FM_PORT_COUNTERS_CYCLE, /**< BMI performance counter */ e_IOC_FM_PORT_COUNTERS_TASK_UTIL, /**< BMI performance counter */ e_IOC_FM_PORT_COUNTERS_QUEUE_UTIL, /**< BMI performance counter */ e_IOC_FM_PORT_COUNTERS_DMA_UTIL, /**< BMI performance counter */ e_IOC_FM_PORT_COUNTERS_FIFO_UTIL, /**< BMI performance counter */ e_IOC_FM_PORT_COUNTERS_RX_PAUSE_ACTIVATION, /**< BMI Rx only performance counter */ e_IOC_FM_PORT_COUNTERS_FRAME, /**< BMI statistics counter */ e_IOC_FM_PORT_COUNTERS_DISCARD_FRAME, /**< BMI statistics counter */ e_IOC_FM_PORT_COUNTERS_DEALLOC_BUF, /**< BMI deallocate buffer statistics counter */ e_IOC_FM_PORT_COUNTERS_RX_BAD_FRAME, /**< BMI Rx only statistics counter */ e_IOC_FM_PORT_COUNTERS_RX_LARGE_FRAME, /**< BMI Rx only statistics counter */ e_IOC_FM_PORT_COUNTERS_RX_FILTER_FRAME, /**< BMI Rx & OP only statistics counter */ e_IOC_FM_PORT_COUNTERS_RX_LIST_DMA_ERR, /**< BMI Rx, OP & HC only statistics counter */ e_IOC_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD, /**< BMI Rx, OP & HC statistics counter */ e_IOC_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER, /**< BMI Rx, OP & HC only statistics counter */ e_IOC_FM_PORT_COUNTERS_WRED_DISCARD, /**< BMI OP & HC only statistics counter */ e_IOC_FM_PORT_COUNTERS_LENGTH_ERR, /**< BMI non-Rx statistics counter */ e_IOC_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT, /**< BMI non-Rx statistics counter */ e_IOC_FM_PORT_COUNTERS_DEQ_TOTAL,/**< QMI total QM dequeues counter */ e_IOC_FM_PORT_COUNTERS_ENQ_TOTAL,/**< QMI total QM enqueues counter */ e_IOC_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT,/**< QMI counter */ e_IOC_FM_PORT_COUNTERS_DEQ_CONFIRM /**< QMI counter */ } ioc_fm_port_counters; typedef struct ioc_fm_port_bmi_stats_t { uint32_t cnt_cycle; uint32_t cnt_task_util; uint32_t cnt_queue_util; uint32_t cnt_dma_util; uint32_t cnt_fifo_util; uint32_t cnt_rx_pause_activation; uint32_t cnt_frame; uint32_t cnt_discard_frame; uint32_t cnt_dealloc_buf; uint32_t cnt_rx_bad_frame; uint32_t cnt_rx_large_frame; uint32_t cnt_rx_filter_frame; uint32_t cnt_rx_list_dma_err; uint32_t cnt_rx_out_of_buffers_discard; uint32_t cnt_wred_discard; uint32_t cnt_length_err; uint32_t cnt_unsupported_format; } ioc_fm_port_bmi_stats_t; /* * @Description Structure for Port id parameters. * (Description may be inaccurate; * must match struct t_fm_port_congestion_grps defined in * fm_port_ext.h) * * Fields commented 'IN' are passed by the port module to be used * by the FM module. Fields commented 'OUT' will be filled by FM * before returning to port. */ typedef struct ioc_fm_port_congestion_groups_t { uint16_t num_of_congestion_grps_to_consider; /**< The number of required congestion groups to define * the size of the following array */ uint8_t congestion_grps_to_consider[FM_NUM_CONG_GRPS]; /**< An array of CG indexes; Note that the size of the * array should be 'num_of_congestion_grps_to_consider'. */ bool pfc_priorities_enable[FM_NUM_CONG_GRPS][FM_MAX_PFC_PRIO]; /**< A matrix that represents the map between the CG ids * defined in 'congestion_grps_to_consider' to the * priorities mapping array. */ } ioc_fm_port_congestion_groups_t; /* * @Function fm_port_disable * * @Description Gracefully disable an FM port. The port will not start new * tasks after all tasks associated with the port are terminated. * * @Return 0 on success; error code otherwise. * * @Cautions This is a blocking routine, it returns after port is * gracefully stopped, i.e. the port will not except new frames, * but it will finish all frames or tasks which were already * began */ #define FM_PORT_IOC_DISABLE _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(1)) /* * @Function fm_port_enable * * @Description A runtime routine provided to allow disable/enable of port. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_ENABLE _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(2)) /* * @Function fm_port_set_rate_limit * * @Description Calling this routine enables rate limit algorithm. * By default, this functionality is disabled. * * Note that rate - limit mechanism uses the FM time stamp. * The selected rate limit specified here would be * rounded DOWN to the nearest 16M. * * May be used for Tx and offline parsing ports only * * @Param[in] ioc_fm_port_rate_limit A structure of rate limit * parameters * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_SET_RATE_LIMIT \ IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(3), ioc_fm_port_rate_limit_t) /* * @Function fm_port_delete_rate_limit * * @Description Calling this routine disables the previously enabled rate * limit. * * May be used for Tx and offline parsing ports only * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_DELETE_RATE_LIMIT _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(5)) #define FM_PORT_IOC_REMOVE_RATE_LIMIT FM_PORT_IOC_DELETE_RATE_LIMIT /* * @Function fm_port_add_congestion_grps * * @Description This routine effects the corresponding Tx port. * It should be called in order to enable pause frame * transmission in case of congestion in one or more of the * congestion groups relevant to this port. * Each call to this routine may add one or more congestion * groups to be considered relevant to this port. * * May be used for Rx, or RX+OP ports only (depending on chip) * * @Param[in] ioc_fm_port_congestion_groups_t A pointer to an array of * congestion group ids to * consider. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_ADD_CONGESTION_GRPS \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(34), \ ioc_fm_port_congestion_groups_t) /* * @Function fm_port_remove_congestion_grps * * @Description This routine effects the corresponding Tx port. It should be * called when congestion groups were defined for this port and * are no longer relevant, or pause frames transmitting is not * required on their behalf. Each call to this routine may remove * one or more congestion groups to be considered relevant to * this port. * * May be used for Rx, or RX+OP ports only (depending on chip) * * @Param[in] ioc_fm_port_congestion_groups_t A pointer to an array of * congestion group ids to * consider. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_REMOVE_CONGESTION_GRPS \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(35), \ ioc_fm_port_congestion_groups_t) /* * @Function fm_port_set_errors_route * * @Description Errors selected for this routine will cause a frame with that * error to be enqueued to error queue. * Errors not selected for this routine will cause a frame with * that error to be enqueued to the one of the other port queues. * By default all errors are defined to be enqueued to error * queue. Errors that were configured to be discarded (at * initialization) may not be selected here. * * May be used for Rx and offline parsing ports only * * @Param[in] ioc_fm_port_frame_err_select_t A list of errors to * enqueue to error queue * * @Return 0 on success; error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). * (szbs001: How is it possible to have one function that needs * to be called BEFORE fm_port_init() implemented as an ioctl, * which will ALWAYS be called AFTER the fm_port_init() for that I port!?!?!?!???!?!??!?!?) */ #define FM_PORT_IOC_SET_ERRORS_ROUTE \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(4), \ ioc_fm_port_frame_err_select_t) /* * @Group lnx_ioctl_FM_PORT_pcd_runtime_control_grp FM Port PCD Runtime * Control Unit * * @Description FM Port PCD Runtime control unit API functions, definitions * and enums. * * @{ */ /* * @Description A structure defining the KG scheme after the parser. * (Must match struct ioc_fm_pcd_kg_scheme_select_t defined in * fm_port_ext.h) * * This is relevant only to change scheme selection mode - from * direct to indirect and vice versa, or when the scheme is * selected directly, to select the scheme id. * */ typedef struct ioc_fm_pcd_kg_scheme_select_t { bool direct; /**< TRUE to use 'scheme_id' directly, FALSE to use LCV.*/ void *scheme_id; /**< Relevant for 'direct'=TRUE only. 'scheme_id' selects the * scheme after parser. */ } ioc_fm_pcd_kg_scheme_select_t; /* * @Description Scheme IDs structure * (Must match struct ioc_fm_pcd_port_schemes_params_t defined * in fm_port_ext.h) */ typedef struct ioc_fm_pcd_port_schemes_params_t { uint8_t num_schemes; /**< Number of schemes for port to be bound to. */ void *scheme_ids[FM_PCD_KG_NUM_OF_SCHEMES]; /**< Array of 'num_schemes' schemes for the port to be bound * to */ } ioc_fm_pcd_port_schemes_params_t; /* * @Description A union for defining port protocol parameters for parser * (Must match union u_FmPcdHdrPrsOpts defined in fm_port_ext.h) */ typedef union ioc_fm_pcd_hdr_prs_opts_u { /* MPLS */ struct { bool label_interpretation_enable; /**< When this bit is set, the last MPLS label will be * interpreted as described in HW spec table. When the bit is * cleared, the parser will advance to MPLS next parse */ ioc_net_header_type next_parse; /**< must be equal or higher than IPv4 */ } mpls_prs_options; /* VLAN */ struct { uint16_t tag_protocol_id1; /**< User defined Tag Protocol Identifier, to be recognized on * VLAN TAG on top of 0x8100 and 0x88A8 */ uint16_t tag_protocol_id2; /**< User defined Tag Protocol Identifier, to be recognized on * VLAN TAG on top of 0x8100 and 0x88A8 */ } vlan_prs_options; /* PPP */ struct{ bool enable_mtu_check; /**< Check validity of MTU according to RFC2516 */ } pppoe_prs_options; /* IPV6 */ struct { bool routing_hdr_disable; /**< Disable routing header */ } ipv6_prs_options; /* UDP */ struct { bool pad_ignore_checksum; /**< TRUE to ignore pad in checksum */ } udp_prs_options; /* TCP */ struct { bool pad_ignore_checksum; /**< TRUE to ignore pad in checksum */ } tcp_prs_options; } ioc_fm_pcd_hdr_prs_opts_u; /* * @Description A structure for defining each header for the parser * (must match struct t_FmPcdPrsAdditionalHdrParams defined in * fm_port_ext.h) */ typedef struct ioc_fm_pcd_prs_additional_hdr_params_t { ioc_net_header_type hdr; /**< Selected header */ bool err_disable; /**< TRUE to disable error indication */ bool soft_prs_enable; /**< Enable jump to SW parser when this header is recognized by * the HW parser. */ uint8_t index_per_hdr; /**< Normally 0, if more than one sw parser attachments exists * for the same header, (in the main sw parser code) use this * index to distinguish between them. */ bool use_prs_opts; /**< TRUE to use parser options. */ ioc_fm_pcd_hdr_prs_opts_u prs_opts; /**< A unuion according to header type, defining the parser * options selected. */ } ioc_fm_pcd_prs_additional_hdr_params_t; /* * @Description A structure for defining port PCD parameters * (Must match t_fm_portPcdPrsParams defined in fm_port_ext.h) */ typedef struct ioc_fm_port_pcd_prs_params_t { uint8_t prs_res_priv_info; /**< The private info provides a method of inserting port * information into the parser result. This information may be * extracted by KeyGen and be used for frames distribution when * a per-port distinction is required, it may also be used as a * port logical id for analyzing incoming frames. */ uint8_t parsing_offset; /**< Number of bytes from beginning of packet to start parsing */ ioc_net_header_type first_prs_hdr; /**< The type of the first header axpected at 'parsing_offset' */ bool include_in_prs_statistics; /**< TRUE to include this port in the parser statistics */ uint8_t num_of_hdrs_with_additional_params; /**< Normally 0, some headers may get special parameters */ ioc_fm_pcd_prs_additional_hdr_params_t additional_params[IOC_FM_PCD_PRS_NUM_OF_HDRS]; /**< 'num_of_hdrs_with_additional_params' structures additional * parameters for each header that requires them */ bool set_vlan_tpid1; /**< TRUE to configure user selection of Ethertype to indicate a * VLAN tag (in addition to the TPID values 0x8100 and 0x88A8). */ uint16_t vlan_tpid1; /**< extra tag to use if set_vlan_tpid1=TRUE. */ bool set_vlan_tpid2; /**< TRUE to configure user selection of Ethertype to indicate a * VLAN tag (in addition to the TPID values 0x8100 and 0x88A8). */ uint16_t vlan_tpid2; /**< extra tag to use if set_vlan_tpid1=TRUE. */ } ioc_fm_port_pcd_prs_params_t; /* * @Description A structure for defining coarse alassification parameters * (Must match t_fm_portPcdCcParams defined in fm_port_ext.h) */ typedef struct ioc_fm_port_pcd_cc_params_t { void *cc_tree_id; /**< CC tree id */ } ioc_fm_port_pcd_cc_params_t; /* * @Description A structure for defining keygen parameters * (Must match t_fm_portPcdKgParams defined in fm_port_ext.h) */ typedef struct ioc_fm_port_pcd_kg_params_t { uint8_t num_schemes; /**< Number of schemes for port to be bound to. */ void *scheme_ids[FM_PCD_KG_NUM_OF_SCHEMES]; /**< Array of 'num_schemes' schemes for the port to * be bound to */ bool direct_scheme; /**< TRUE for going from parser to a specific scheme, * regardless of parser result */ void *direct_scheme_id; /**< Scheme id, as returned by FM_PCD_KgSetScheme; * relevant only if direct=TRUE. */ } ioc_fm_port_pcd_kg_params_t; /* * @Description A structure for defining policer parameters * (Must match t_fm_portPcdPlcrParams defined in fm_port_ext.h) */ typedef struct ioc_fm_port_pcd_plcr_params_t { void *plcr_profile_id; /**< Selected profile handle; * relevant in one of the following cases: * e_IOC_FM_PCD_PLCR_ONLY or * e_IOC_FM_PCD_PRS_PLCR were selected, or if * any flow uses a KG scheme where policer profile is not * generated (bypass_plcr_profile_generation selected) */ } ioc_fm_port_pcd_plcr_params_t; /* * @Description A structure for defining port PCD parameters * (Must match struct t_fm_portPcdParams defined in * fm_port_ext.h) */ typedef struct ioc_fm_port_pcd_params_t { ioc_fm_port_pcd_support pcd_support; /**< Relevant for Rx and offline ports only. * Describes the active PCD engines for this port. */ void *net_env_id; /**< HL Unused in PLCR only mode */ ioc_fm_port_pcd_prs_params_t *p_prs_params; /**< Parser parameters for this port */ ioc_fm_port_pcd_cc_params_t *p_cc_params; /**< Coarse classification parameters for this port */ ioc_fm_port_pcd_kg_params_t *p_kg_params; /**< Keygen parameters for this port */ ioc_fm_port_pcd_plcr_params_t *p_plcr_params; /**< Policer parameters for this port */ void *p_ip_reassembly_manip; /**< IP Reassembly manipulation */ void *p_capwap_reassembly_manip; /**< CAPWAP Reassembly manipulation */ } ioc_fm_port_pcd_params_t; /* * @Description A structure for defining the Parser starting point * (Must match struct ioc_fm_pcd_prs_start_t defined in * fm_port_ext.h) */ typedef struct ioc_fm_pcd_prs_start_t { uint8_t parsing_offset; /**< Number of bytes from beginning of packet to start parsing */ ioc_net_header_type first_prs_hdr; /**< The type of the first header axpected at 'parsing_offset' */ } ioc_fm_pcd_prs_start_t; /* * @Description FQID parameters structure */ typedef struct ioc_fm_port_pcd_fqids_params_t { uint32_t num_fqids; /**< Number of fqids to be allocated for the port */ uint8_t alignment; /**< Alignment required for this port */ uint32_t base_fqid; /**< output parameter - the base fqid */ } ioc_fm_port_pcd_fqids_params_t; /* * @Function FM_PORT_IOC_ALLOC_PCD_FQIDS * * @Description Allocates FQID's * May be used for Rx and offline parsing ports only * * @Param[in,out] ioc_fm_port_pcd_fqids_params_t Parameters for * allocating FQID's * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_ALLOC_PCD_FQIDS \ _IOWR(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(19), \ ioc_fm_port_pcd_fqids_params_t) /* * @Function FM_PORT_IOC_FREE_PCD_FQIDS * * @Description Frees previously-allocated FQIDs * May be used for Rx and offline parsing ports only * * @Param[in] uint32_t Base FQID of previously allocated range. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_FREE_PCD_FQIDS \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(19), uint32_t) /* * @Function fm_port_set_pcd * * @Description Calling this routine defines the port's PCD configuration. * It changes it from its default configuration which is PCD * disabled (BMI to BMI) and configures it according to the * passed parameters. * May be used for Rx and offline parsing ports only * * @Param[in] ioc_fm_port_pcd_params_t A Structure of parameters * defining the port's PCD * configuration. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_SET_PCD \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(20), ioc_fm_port_pcd_params_t) /* * @Function fm_port_delete_pcd * * @Description Calling this routine releases the port's PCD configuration. * The port returns to its default configuration which is PCD * disabled (BMI to BMI) and all PCD configuration is removed. * May be used for Rx and offline parsing ports which are in PCD * mode only * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_DELETE_PCD _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(21)) /* * @Function fm_port_attach_pcd * * @Description This routine may be called after fm_port_detach_pcd was * called, to return to the originally configured PCD support * flow. The couple of routines are used to allow PCD * configuration changes that demand that PCD will not be used * while changes take place. * * May be used for Rx and offline parsing ports which are in PCD * mode only * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_ATTACH_PCD _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(23)) /* * @Function fm_port_detach_pcd * * @Description Calling this routine detaches the port from its PCD * functionality. The port returns to its default flow which is * BMI to BMI. * * May be used for Rx and offline parsing ports which are in PCD * mode only * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_DETACH_PCD _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(22)) /* * @Function fm_port_pcd_plcr_alloc_profiles * * @Description This routine may be called only for ports that use the Policer * in order to allocate private policer profiles. * * @Param[in] uint16_t The number of required policer profiles * * @Return 0 on success; error code otherwise. * * @Cautions Allowed before fm_port_set_pcd() only. */ #define FM_PORT_IOC_PCD_PLCR_ALLOC_PROFILES \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(24), uint16_t) /* * @Function fm_port_pcd_plcr_free_profiles * * @Description This routine should be called for freeing private policer * profiles. * * @Return 0 on success; error code otherwise. * * @Cautions Allowed before fm_port_set_pcd() only. */ #define FM_PORT_IOC_PCD_PLCR_FREE_PROFILES \ _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(25)) /* * @Function fm_port_pcd_kg_modify_initial_scheme * * @Description This routine may be called only for ports that use the keygen * in order to change the initial scheme frame should be routed * to.The change may be of a scheme id (in case of direct mode), * from direct to indirect, or from indirect to direct - * specifying the scheme id. * * @Param[in] ioc_fm_pcd_kg_scheme_select_t * A structure of parameters for defining whether a scheme is * direct/indirect, and if direct - scheme id. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_PCD_KG_MODIFY_INITIAL_SCHEME \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(26), \ ioc_fm_pcd_kg_scheme_select_t) /* * @Function fm_port_pcd_plcr_modify_initial_profile * * @Description This routine may be called for ports with flows * e_IOC_FM_PCD_SUPPORT_PLCR_ONLY or * e_IOC_FM_PCD_SUPPORT_PRS_AND_PLCR only, to change the initial * Policer profile frame should be routed to. * The change may be of a profile and / or absolute / direct mode * selection. * * @Param[in] ioc_fm_obj_t Policer profile Id as returned from * FM_PCD_PlcrSetProfile. * * @Return 0 on success; error code otherwise. */ #define FM_PORT_IOC_PCD_PLCR_MODIFY_INITIAL_PROFILE \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(27), ioc_fm_obj_t) /* * @Function fm_port_pcd_cc_modify_tree * * @Description This routine may be called to change this port connection to * a pre - initializes coarse classification Tree. * * @Param[in] ioc_fm_obj_t Id of new coarse classification tree selected * for this port. * * @Return 0 on success; error code otherwise. * * @Cautions Allowed only following fm_port_set_pcd() and * fm_port_detach_pcd() */ #define FM_PORT_IOC_PCD_CC_MODIFY_TREE \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(28), ioc_fm_obj_t) /* * @Function fm_port_pcd_kg_bind_schemes * * @Description These routines may be called for modifying the binding of * ports to schemes. The scheme itself is not added, just this * specific port starts using it. * * @Param[in] ioc_fm_pcd_port_schemes_params_t Schemes parameters * structure * * @Return 0 on success; error code otherwise. * * @Cautions Allowed only following fm_port_set_pcd(). */ #define FM_PORT_IOC_PCD_KG_BIND_SCHEMES \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(30), \ ioc_fm_pcd_port_schemes_params_t) /* * @Function fm_port_pcd_kg_unbind_schemes * * @Description These routines may be called for modifying the binding of * ports to schemes. The scheme itself is not removed or * invalidated, just this specific port stops using it. * * @Param[in] ioc_fm_pcd_port_schemes_params_t Schemes parameters * structure * * @Return 0 on success; error code otherwise. * * @Cautions Allowed only following fm_port_set_pcd(). */ #define FM_PORT_IOC_PCD_KG_UNBIND_SCHEMES \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(31), \ ioc_fm_pcd_port_schemes_params_t) #define ENET_NUM_OCTETS_PER_ADDRESS 6 /**< Number of octets (8-bit bytes) in an ethernet address */ typedef struct ioc_fm_port_mac_addr_params_t { uint8_t addr[ENET_NUM_OCTETS_PER_ADDRESS]; } ioc_fm_port_mac_addr_params_t; /* * @Function FM_MAC_AddHashMacAddr * * @Description Add an Address to the hash table. This is for filter purpose * only. * * @Param[in] ioc_fm_port_mac_addr_params_t Ethernet Mac address * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following FM_MAC_Init(). It is a filter only * address. * @Cautions Some address need to be filtered out in upper FM blocks. */ #define FM_PORT_IOC_ADD_RX_HASH_MAC_ADDR \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(36), \ ioc_fm_port_mac_addr_params_t) /* * @Function FM_MAC_RemoveHashMacAddr * * @Description Delete an Address to the hash table. This is for filter * purpose only. * * @Param[in] ioc_fm_port_mac_addr_params_t Ethernet Mac address * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following FM_MAC_Init(). */ #define FM_PORT_IOC_REMOVE_RX_HASH_MAC_ADDR \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(37), \ ioc_fm_port_mac_addr_params_t) typedef struct ioc_fm_port_tx_pause_frames_t { uint8_t priority; uint16_t pause_time; uint16_t thresh_time; } ioc_fm_port_tx_pause_frames_t; /* * @Function FM_MAC_SetTxPauseFrames * * @Description Enable/Disable transmission of Pause-Frames. The routine * changes the default configuration: pause-time - [0xf000] * threshold-time - [0] * * @Param[in] ioc_fm_port_tx_pause_frames_params_t * A structure holding the required parameters. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following FM_MAC_Init(). PFC is supported only on * new mEMAC; i.e. in MACs that don't have PFC support (10G-MAC * and dTSEC), user should use 'FM_MAC_NO_PFC' in the 'priority' * field. */ #define FM_PORT_IOC_SET_TX_PAUSE_FRAMES \ _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(40), \ ioc_fm_port_tx_pause_frames_t) typedef struct ioc_fm_port_mac_statistics_t { /* RMON */ uint64_t e_stat_pkts_64; /**< r-10G tr-DT 64 byte frame counter */ uint64_t e_stat_pkts_65_to_127; /**< r-10G 65 to 127 byte frame counter */ uint64_t e_stat_pkts_128_to_255; /**< r-10G 128 to 255 byte frame counter */ uint64_t e_stat_pkts_256_to_511; /**< r-10G 256 to 511 byte frame counter */ uint64_t e_stat_pkts_512_to_1023; /**< r-10G 512 to 1023 byte frame counter*/ uint64_t e_stat_pkts_1024_to_1518; /**< r-10G 1024 to 1518 byte frame counter */ uint64_t e_stat_pkts_1519_to_1522; /**< r-10G 1519 to 1522 byte good frame count */ /* */ uint64_t e_stat_fragments; /**< Total number of packets that were less than 64 octets long * with a wrong CRC. */ uint64_t e_stat_jabbers; /**< Total number of packets longer than valid maximum length * octets */ uint64_t e_stat_drop_events; /**< number of dropped packets due to internal errors of the MAC * Client (during receive). */ uint64_t e_stat_CRC_align_errors; /**< Incremented when frames of correct length but with CRC * error are received. */ uint64_t e_stat_undersize_pkts; /**< Incremented for frames under 64 bytes with a valid FCS and * otherwise well formed; This count does not include range * length errors */ uint64_t e_stat_oversize_pkts; /**< Incremented for frames which exceed 1518 (non VLAN) or 1522 * (VLAN) and contains a valid FCS and otherwise well formed */ /* Pause */ uint64_t rx_stat_pause; /**< Pause MAC Control received */ uint64_t tx_stat_pause; /**< Pause MAC Control sent */ /* MIB II */ uint64_t if_in_octets; /**< Total number of byte received. */ uint64_t if_in_pkts; /**< Total number of packets received.*/ uint64_t if_in_ucast_pkts; /**< Total number of unicast frame received; * NOTE: this counter is not supported on dTSEC MAC */ uint64_t if_in_mcast_pkts; /**< Total number of multicast frame received*/ uint64_t if_in_bcast_pkts; /**< Total number of broadcast frame received */ uint64_t if_in_discards; /**< Frames received, but discarded due to problems within the * MAC RX. */ uint64_t if_in_errors; /**< Number of frames received with error: * - FIFO Overflow Error * - CRC Error * - Frame Too Long Error * - Alignment Error * - The dedicated Error Code (0xfe, not a code error) was * received */ uint64_t if_out_octets; /**< Total number of byte sent. */ uint64_t if_out_pkts; /**< Total number of packets sent .*/ uint64_t if_out_ucast_pkts; /**< Total number of unicast frame sent; * NOTE: this counter is not supported on dTSEC MAC */ uint64_t if_out_mcast_pkts; /**< Total number of multicast frame sent */ uint64_t if_out_bcast_pkts; /**< Total number of multicast frame sent */ uint64_t if_out_discards; /**< Frames received, but discarded due to problems within the * MAC TX N/A!. */ uint64_t if_out_errors; /**< Number of frames transmitted with error: * - FIFO Overflow Error * - FIFO Underflow Error * - Other */ } ioc_fm_port_mac_statistics_t; /* * @Function FM_MAC_GetStatistics * * @Description get all MAC statistics counters * * @Param[out] ioc_fm_port_mac_statistics_t A structure holding the * statistics * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following FM_Init(). */ #define FM_PORT_IOC_GET_MAC_STATISTICS \ _IOR(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(41), \ ioc_fm_port_mac_statistics_t) /* * @Function fm_port_get_bmi_counters * * @Description Read port's BMI stat counters and place them into * a designated structure of counters. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[out] p_bmi_stats counters structure * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ #define FM_PORT_IOC_GET_BMI_COUNTERS \ _IOR(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(42), ioc_fm_port_bmi_stats_t) /** @} */ /* end of lnx_ioctl_FM_PORT_pcd_runtime_control_grp group */ /** @} */ /* end of lnx_ioctl_FM_PORT_runtime_control_grp group */ /** @} */ /* end of lnx_ioctl_FM_PORT_grp group */ /** @} */ /* end of lnx_ioctl_FM_grp group */ /* * @Group gen_id General Drivers Utilities * * @Description External routines. * * @{ */ /* * @Group gen_error_id Errors, Events and Debug * * @Description External routines. * * @{ */ /* * The scheme below provides the bits description for error codes: * * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 * | Reserved (should be zero) | Module ID | * * 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 * | Error Type | */ #define ERROR_CODE(_err) ((((uint32_t)_err) & 0x0000FFFF) | __ERR_MODULE__) #define GET_ERROR_TYPE(_errcode) ((_errcode) & 0x0000FFFF) /**< Extract module code from error code (#uint32_t) */ #define GET_ERROR_MODULE(_errcode) ((_errcode) & 0x00FF0000) /**< Extract error type (#e_error_type) from * error code (#uint32_t) */ #define RETURN_ERROR(_level, _err, _vmsg) { return ERROR_CODE(_err); } /* * @Description Error Type Enumeration */ typedef enum e_error_type { E_OK = 0 /* Never use "RETURN_ERROR" with E_OK; Use "return E_OK;"*/ , E_WRITE_FAILED = EIO /**< Write access failed on memory/device.*/ /* String: none, or device name.*/ , E_NO_DEVICE = ENXIO /**< The associated device is not initialized.*/ /* String: none.*/ , E_NOT_AVAILABLE = EAGAIN /**< Resource is unavailable.*/ /* String: none, unless the operation is not the main goal of * the function (in this case add resource description). */ , E_NO_MEMORY = ENOMEM /**< External memory allocation failed.*/ /* String: description of item for which allocation failed. */ , E_INVALID_ADDRESS = EFAULT /**< Invalid address.*/ /* String: description of the specific violation.*/ , E_BUSY = EBUSY /**< Resource or module is busy.*/ /* String: none, unless the operation is not the main goal * of the function (in this case add resource * description). */ , E_ALREADY_EXISTS = EEXIST /**< Requested resource or item already exists.*/ /* Use when resource duplication or sharing are not allowed. * String: none, unless the operation is not the main goal * of the function (in this case add item description). */ , E_INVALID_OPERATION = ENODEV /**< The operation/command is invalid (unrecognized).*/ /* String: none.*/ , E_INVALID_VALUE = EDOM /**< Invalid value.*/ /* Use for non-enumeration parameters, and only when other error * types are not suitable. * String: parameter description + "(should be )", * e.g: "Maximum Rx buffer length (should be divisible * by 8)", "Channel number (should be even)". */ , E_NOT_IN_RANGE = ERANGE /**< Parameter value is out of range.*/ /* Don't use this error for enumeration parameters. * String: parameter description + "(should be %d-%d)", * e.g: "Number of pad characters (should be 0-15)". */ , E_NOT_SUPPORTED = ENOSYS /**< The function is not supported or not implemented.*/ /* String: none.*/ , E_INVALID_STATE /**< The operation is not allowed in current module state.*/ /* String: none.*/ , E_INVALID_HANDLE /**< Invalid handle of module or object.*/ /* String: none, unless the function takes in more than one * handle (in this case add the handle description) */ , E_INVALID_ID /**< Invalid module ID (usually enumeration or index).*/ /* String: none, unless the function takes in more than one ID * (in this case add the ID description) */ , E_NULL_POINTER /**< Unexpected NULL pointer.*/ /* String: pointer description.*/ , E_INVALID_SELECTION /**< Invalid selection or mode.*/ /* Use for enumeration values, only when other error types are * not suitable. * String: parameter description. */ , E_INVALID_COMM_MODE /**< Invalid communication mode.*/ /* String: none, unless the function takes in more than one * communication mode indications (in this case add * parameter description). */ , E_INVALID_MEMORY_TYPE /**< Invalid memory type.*/ /* String: none, unless the function takes in more than one * memory types (in this case add memory description, * e.g: "Data memory", "Buffer descriptors memory"). */ , E_INVALID_CLOCK /**< Invalid clock.*/ /* String: none, unless the function takes in more than one * clocks (in this case add clock description, e.g: "Rx * clock", "Tx clock"). */ , E_CONFLICT /**< Some setting conflicts with another setting.*/ /* String: description of the conflicting settings.*/ , E_NOT_ALIGNED /**< Non-aligned address.*/ /* String: parameter description + "(should be %d-bytes * aligned)", e.g: "Rx data buffer (should be 32-bytes * aligned)". */ , E_NOT_FOUND /**< Requested resource or item was not found.*/ /* Use only when the resource/item is uniquely identified. * String: none, unless the operation is not the main goal * of the function (in this case add item description). */ , E_FULL /**< Resource is full.*/ /* String: none, unless the operation is not the main goal of * the function (in this case add resource description). */ , E_EMPTY /**< Resource is empty.*/ /* String: none, unless the operation is not the main goal of * the function (in this case add resource description). */ , E_ALREADY_FREE /**< Specified resource or item is already free or deleted.*/ /* String: none, unless the operation is not the main goal * of the function (in this case add item description). */ , E_READ_FAILED /**< Read access failed on memory/device.*/ /* String: none, or device name.*/ , E_INVALID_FRAME /**< Invalid frame object (NULL handle or missing buffers).*/ /* String: none.*/ , E_SEND_FAILED /**< Send operation failed on device.*/ /* String: none, or device name.*/ , E_RECEIVE_FAILED /**< Receive operation failed on device.*/ /* String: none, or device name.*/ , E_TIMEOUT/* = ETIMEDOUT*/ /**< The operation timed out.*/ /* String: none.*/ , E_DUMMY_LAST /* NEVER USED */ } e_error_type; /* * * @Group FM_grp Frame Manager API * * @Description FM API functions, definitions and enums * * @{ */ /* * @Group FM_PORT_grp FM Port * * @Description FM Port API * * The FM uses a general module called "port" to represent a Tx * port (MAC), an Rx port (MAC) or Offline Parsing port. The * number of ports in an FM varies between SOCs. The SW driver * manages these ports as sub-modules of the FM, i.e. after an FM * is initialized, its ports may be initialized and operated * upon. * * The port is initialized aware of its type, but other functions * on a port may be indifferent to its type. When necessary, the * driver verifies coherence and returns error if applicable. * * On initialization, user specifies the port type and it's index * (relative to the port's type) - always starting at 0. * * @{ */ /* * @Description An enum for defining port PCD modes. * This enum defines the superset of PCD engines support - i.e. * not all engines have to be used, but all have to be enabled. * The real flow of a specific frame depends on the PCD * configuration and the frame headers and payload. Note: the * first engine and the first engine after the parser (if exists) * should be in order, the order is important as it will define * the flow of the port. However, as for the rest engines (the * ones that follows), the order is not important anymore as it * is defined by the PCD graph itself. */ typedef enum e_fm_port_pcd_support { e_FM_PORT_PCD_SUPPORT_NONE = 0 /**< BMI to BMI, PCD is not used */ , e_FM_PORT_PCD_SUPPORT_PRS_ONLY /**< Use only Parser */ , e_FM_PORT_PCD_SUPPORT_PLCR_ONLY /**< Use only Policer */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR /**< Use Parser and Policer */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_KG /**< Use Parser and Keygen */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC /**< Use Parser, Keygen and Coarse Classification */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC_AND_PLCR /**< Use all PCD engines */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_PLCR /**< Use Parser, Keygen and Policer */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_CC /**< Use Parser and Coarse Classification */ , e_FM_PORT_PCD_SUPPORT_PRS_AND_CC_AND_PLCR /**< Use Parser and Coarse Classification and Policer */ , e_FM_PORT_PCD_SUPPORT_CC_ONLY /**< Use only Coarse Classification */ #ifdef FM_CAPWAP_SUPPORT , e_FM_PORT_PCD_SUPPORT_CC_AND_KG /**< Use Coarse Classification,and Keygen */ , e_FM_PORT_PCD_SUPPORT_CC_AND_KG_AND_PLCR /**< Use Coarse Classification, Keygen and Policer */ #endif /* FM_CAPWAP_SUPPORT */ } e_fm_port_pcd_support; /* * @Description Port interrupts */ typedef enum e_fm_port_exceptions { e_FM_PORT_EXCEPTION_IM_BUSY /**< Independent-Mode Rx-BUSY */ } e_fm_port_exceptions; /* * @Collection General FM Port defines */ #define FM_PORT_PRS_RESULT_NUM_OF_WORDS 8 /**< Number of 4 bytes words in parser result */ /* @} */ /* * @Collection FM Frame error */ typedef uint32_t fm_port_frame_err_select_t; /**< typedef for defining Frame Descriptor errors */ #define FM_PORT_FRM_ERR_UNSUPPORTED_FORMAT FM_FD_ERR_UNSUPPORTED_FORMAT /**< Not for Rx-Port! Unsupported Format */ #define FM_PORT_FRM_ERR_LENGTH FM_FD_ERR_LENGTH /**< Not for Rx-Port! Length Error */ #define FM_PORT_FRM_ERR_DMA FM_FD_ERR_DMA /**< DMA Data error */ #define FM_PORT_FRM_ERR_NON_FM FM_FD_RX_STATUS_ERR_NON_FM /**< non Frame-Manager error; probably come from SEC * that was chained to FM */ #define FM_PORT_FRM_ERR_IPRE (FM_FD_ERR_IPR & ~FM_FD_IPR) /**< IPR error */ #define FM_PORT_FRM_ERR_IPR_NCSP (FM_FD_ERR_IPR_NCSP & ~FM_FD_IPR) /**< IPR non-consistent-sp */ #define FM_PORT_FRM_ERR_IPFE 0 /**< Obsolete; will be removed in the future */ #ifdef FM_CAPWAP_SUPPORT #define FM_PORT_FRM_ERR_CRE FM_FD_ERR_CRE #define FM_PORT_FRM_ERR_CHE FM_FD_ERR_CHE #endif /* FM_CAPWAP_SUPPORT */ #define FM_PORT_FRM_ERR_PHYSICAL FM_FD_ERR_PHYSICAL /**< Rx FIFO overflow, FCS error, code error, running * disparity error (SGMII and TBI modes), FIFO parity * error. PHY Sequence error, PHY error control * character detected. */ #define FM_PORT_FRM_ERR_SIZE FM_FD_ERR_SIZE /**< Frame too long OR Frame size exceeds * max_length_frame */ #define FM_PORT_FRM_ERR_CLS_DISCARD FM_FD_ERR_CLS_DISCARD /**< indicates a classifier "drop" operation */ #define FM_PORT_FRM_ERR_EXTRACTION FM_FD_ERR_EXTRACTION /**< Extract Out of Frame */ #define FM_PORT_FRM_ERR_NO_SCHEME FM_FD_ERR_NO_SCHEME /**< No Scheme Selected */ #define FM_PORT_FRM_ERR_KEYSIZE_OVERFLOW FM_FD_ERR_KEYSIZE_OVERFLOW /**< Keysize Overflow */ #define FM_PORT_FRM_ERR_COLOR_RED FM_FD_ERR_COLOR_RED /**< Frame color is red */ #define FM_PORT_FRM_ERR_COLOR_YELLOW FM_FD_ERR_COLOR_YELLOW /**< Frame color is yellow */ #define FM_PORT_FRM_ERR_ILL_PLCR FM_FD_ERR_ILL_PLCR /**< Illegal Policer Profile selected */ #define FM_PORT_FRM_ERR_PLCR_FRAME_LEN FM_FD_ERR_PLCR_FRAME_LEN /**< Policer frame length error */ #define FM_PORT_FRM_ERR_PRS_TIMEOUT FM_FD_ERR_PRS_TIMEOUT /**< Parser Time out Exceed */ #define FM_PORT_FRM_ERR_PRS_ILL_INSTRUCT FM_FD_ERR_PRS_ILL_INSTRUCT /**< Invalid Soft Parser instruction */ #define FM_PORT_FRM_ERR_PRS_HDR_ERR FM_FD_ERR_PRS_HDR_ERR /**< Header error was identified during parsing */ #define FM_PORT_FRM_ERR_BLOCK_LIMIT_EXCEEDED FM_FD_ERR_BLOCK_LIMIT_EXCEEDED /**< Frame parsed beyind 256 first bytes */ #define FM_PORT_FRM_ERR_PROCESS_TIMEOUT 0x00000001 /**< FPM Frame Processing Timeout Exceeded */ /* @} */ /* * @Group FM_PORT_init_grp FM Port Initialization Unit * * @Description FM Port Initialization Unit * * @{ */ /* * @Description Exceptions user callback routine, will be called upon an * exception passing the exception identification. * * @Param[in] h_app User's application descriptor. * @Param[in] exception The exception. */ typedef void (t_fm_port_exception_callback) (t_handle h_app, e_fm_port_exceptions exception); /* * @Description User callback function called by driver with received data. * User provides this function. Driver invokes it. * * @Param[in] h_app Application's handle originally specified to * the API Config function * @Param[in] p_data A pointer to data received * @Param[in] length length of received data * @Param[in] status receive status and errors * @Param[in] position position of buffer in frame * @Param[in] h_buf_context A handle of the user acossiated with this buffer * * @Retval e_RX_STORE_RESPONSE_CONTINUE * order the driver to continue Rx operation for all ready data. * @Retval e_RX_STORE_RESPONSE_PAUSE * order the driver to stop Rx operation. */ typedef e_rx_store_response(t_fm_port_im_rx_store_callback) (t_handle h_app, uint8_t *p_data, uint16_t length, uint16_t status, uint8_t position, t_handle h_buf_context); /* * @Description User callback function called by driver when transmit * completed. * User provides this function. Driver invokes it. * * @Param[in] h_app Application's handle originally specified to * the API Config function * @Param[in] p_data A pointer to data received * @Param[in] status transmit status and errors * @Param[in] last_buffer is last buffer in frame * @Param[in] h_buf_context A handle of the user acossiated with this buffer */ typedef void (t_fm_port_im_tx_conf_callback) (t_handle h_app, uint8_t *p_data, uint16_t status, t_handle h_buf_context); /* * @Description A structure for additional Rx port parameters */ typedef struct t_fm_port_rx_params { uint32_t err_fqid; /**< Error Queue Id. */ uint32_t dflt_fqid; /**< Default Queue Id.*/ uint16_t liodn_offset; /**< Port's LIODN offset. */ t_fm_ext_pools ext_buf_pools; /**< Which external buffer pools are used * (up to FM_PORT_MAX_NUM_OF_EXT_POOLS), and their sizes */ } t_fm_port_rx_params; /* * @Description A structure for additional non-Rx port parameters */ typedef struct t_fm_port_non_rx_params { uint32_t err_fqid; /**< Error Queue Id. */ uint32_t dflt_fqid; /**< For Tx - Default Confirmation queue, * 0 means no Tx confirmation for processed frames. * For OP port - default Rx queue. */ uint32_t qm_channel; /**< QM-channel dedicated to this port; will be used by * the FM for dequeue. */ } t_fm_port_non_rx_params; /* * @Description A structure for additional Rx port parameters */ typedef struct t_fm_port_im_rx_tx_params { t_handle h_fm_muram; /**< A handle of the FM-MURAM partition */ uint16_t liodn_offset; /**< For Rx ports only. Port's LIODN Offset. */ uint8_t data_mem_id; /**< Memory partition ID for data buffers */ uint32_t data_mem_attributes; /**< Memory attributes for data buffers */ t_buffer_pool_info rx_pool_params; /**< For Rx ports only. */ t_fm_port_im_rx_store_callback *f_rx_store; /**< For Rx ports only. */ t_fm_port_im_tx_conf_callback *f_tx_conf; /**< For Tx ports only. */ } t_fm_port_im_rx_tx_params; /* * @Description A union for additional parameters depending on port type */ typedef union u_fm_port_specific_params { t_fm_port_im_rx_tx_params im_rx_tx_params; /**< Rx/Tx Independent-Mode port parameter structure */ t_fm_port_rx_params rx_params; /**< Rx port parameters structure */ t_fm_port_non_rx_params non_rx_params; /**< Non-Rx port parameters structure */ } u_fm_port_specific_params; /* * @Description A structure representing FM initialization parameters */ typedef struct t_fm_port_params { uintptr_t base_addr; /**< Virtual Address of memory mapped FM Port registers. */ t_handle h_fm; /**< A handle to the FM object this port related to */ e_fm_port_type port_type; /**< Port type */ uint8_t port_id; /**< Port Id - relative to type; * NOTE: When configuring Offline Parsing port for * FMANv3 devices (DPAA_VERSION 11 and higher), * it is highly recommended NOT to use port_id=0 due to * lack of HW resources on port_id=0. */ bool independent_mode_enable; /**< This port is Independent-Mode - Used for Rx/Tx * ports only! */ uint16_t liodn_base; /**< Irrelevant for P4080 rev 1. LIODN base for this * port, to be used together with LIODN offset. */ u_fm_port_specific_params specific_params; /**< Additional parameters depending on port type. */ t_fm_port_exception_callback *f_exception; /**< Relevant for IM only Callback routine to be called * on BUSY exception */ t_handle h_app; /**< A handle to an application layer object; This * handle will be passed by the driver upon calling the * above callbacks */ } t_fm_port_params; /* * @Function fm_port_config * * @Description Creates a descriptor for the FM PORT module. * * The routine returns a handle(descriptor) to the FM PORT * object. This descriptor must be passed as first parameter to * all other FM PORT function calls. * * No actual initialization or configuration of FM hardware is * done by this routine. * * @Param[in] p_fm_port_params Pointer to data structure of parameters * * @Retval Handle to FM object, or NULL for Failure. */ t_handle fm_port_config(t_fm_port_params *p_fm_port_params); /* * @Function fm_port_init * * @Description Initializes the FM PORT module by defining the software * structure and configuring the hardware registers. * * @Param[in] h_fm_port - FM PORT module descriptor * * @Return E_OK on success; Error code otherwise. */ uint32_t fm_port_init(t_handle h_fm_port); /* * @Function fm_port_free * * @Description Frees all resources that were assigned to FM PORT module. * * Calling this routine invalidates the descriptor. * * @Param[in] h_fm_port - FM PORT module descriptor * * @Return E_OK on success; Error code otherwise. */ uint32_t fm_port_free(t_handle h_fm_port); t_handle fm_port_open(t_fm_port_params *p_fm_port_params); void fm_port_close(t_handle h_fm_port); /* * @Group FM_PORT_advanced_init_grp FM Port Advanced Configuration * Unit * * @Description Configuration functions used to change default values. * * @{ */ /* * @Description enum for defining QM frame dequeue */ typedef enum e_fm_port_deq_type { e_FM_PORT_DEQ_TYPE1, /**< Dequeue from the SP channel - with priority precedence, * and Intra-Class Scheduling respected. */ e_FM_PORT_DEQ_TYPE2, /**< Dequeue from the SP channel - with active FQ precedence, * and Intra-Class Scheduling respected. */ e_FM_PORT_DEQ_TYPE3 /**< Dequeue from the SP channel - with active FQ precedence, * and override Intra-Class Scheduling */ } e_fm_port_deq_type; /* * @Description enum for defining QM frame dequeue */ typedef enum e_fm_port_deq_prefetch_option { e_FM_PORT_DEQ_NO_PREFETCH, /**< QMI performs a dequeue action for a single frame * only when a dedicated portID Tnum is waiting. */ e_FM_PORT_DEQ_PARTIAL_PREFETCH, /**< QMI performs a dequeue action for 3 frames * when one dedicated port_id tnum is waiting. */ e_FM_PORT_DEQ_FULL_PREFETCH /**< QMI performs a dequeue action for 3 frames when * no dedicated port_id tnums are waiting. */ } e_fm_port_deq_prefetch_option; /* * @Description enum for defining port default color */ typedef enum e_fm_port_color { e_FM_PORT_COLOR_GREEN, /**< Default port color is green */ e_FM_PORT_COLOR_YELLOW, /**< Default port color is yellow */ e_FM_PORT_COLOR_RED, /**< Default port color is red */ e_FM_PORT_COLOR_OVERRIDE/**< Ignore color */ } e_fm_port_color; /* * @Description A structure for defining Dual Tx rate limiting scale */ typedef enum e_fm_port_dual_rate_limiter_scale_down { e_FM_PORT_DUAL_RATE_LIMITER_NONE = 0, /**< Use only single rate limiter*/ e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_2, /**< Divide high rate limiter by 2 */ e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_4, /**< Divide high rate limiter by 4 */ e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_8 /**< Divide high rate limiter by 8 */ } e_fm_port_dual_rate_limiter_scale_down; /* * @Description A structure for defining FM port resources */ typedef struct t_fm_port_rsrc { uint32_t num; /**< Committed required resource */ uint32_t extra; /**< Extra (not committed) required resource */ } t_fm_port_rsrc; /* * @Description A structure for defining Tx rate limiting */ typedef struct t_fm_port_rate_limit { uint16_t max_burst_size; /**< in KBytes for Tx ports, in frames for OP * ports. (note that for early chips burst size * is rounded up to a multiply of 1000 frames). */ uint32_t rate_limit; /**< in Kb/sec for Tx ports, in frame/sec for OP * ports. Rate limit refers to data rate * (rather than line rate). */ e_fm_port_dual_rate_limiter_scale_down rate_limit_divider; /**< For OP ports only. Not-valid for some * earlier chip revisions */ } t_fm_port_rate_limit; /* * @Description A structure for defining the parameters of * the Rx port performance counters */ typedef struct t_fm_port_performance_cnt { uint8_t task_comp_val; /**< Task compare value */ uint8_t queue_comp_val; /**< Rx queue/Tx confirm queue compare value (unused for H/O) */ uint8_t dma_comp_val; /**< Dma compare value */ uint32_t fifo_comp_val; /**< Fifo compare value (in bytes) */ } t_fm_port_performance_cnt; /* * @Function fm_port_config_num_of_open_dmas * * @Description Calling this routine changes the max number of open DMA's * available for this port. It changes this parameter in the * internal driver data base from its default configuration * [OP: 1] * [1G-RX, 1G-TX: 1 (+1)] * [10G-RX, 10G-TX: 8 (+8)] * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_open_dmas A pointer to a structure of parameters defining * the open DMA allocation. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_num_of_open_dmas(t_handle h_fm_port, t_fm_port_rsrc *p_open_dmas); /* * @Function fm_port_config_num_of_tasks * * @Description Calling this routine changes the max number of tasks available * for this port. It changes this parameter in the internal * driver data base from its default configuration * [OP : 1] * [1G - RX, 1G - TX : 3 ( + 2)] * [10G - RX, 10G - TX : 16 ( + 8)] * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_num_of_tasks A pointer to a structure of parameters * defining the tasks allocation. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_num_of_tasks(t_handle h_fm_port, t_fm_port_rsrc *p_num_of_tasks); /* * @Function fm_port_config_size_of_fifo * * @Description Calling this routine changes the max FIFO size configured for * this port. * * This function changes the internal driver data base from its * default configuration. Please refer to the driver's User Guide * for information on default FIFO sizes in the various devices. * [OP: 2KB] * [1G-RX, 1G-TX: 11KB] * [10G-RX, 10G-TX: 12KB] * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_size_of_fifo A pointer to a structure of parameters * defining the FIFO allocation. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_size_of_fifo(t_handle h_fm_port, t_fm_port_rsrc *p_size_of_fifo); /* * @Function fm_port_config_deq_high_priority * * @Description Calling this routine changes the dequeue priority in the * internal driver data base from its default configuration * 1G: [DEFAULT_PORT_deqHighPriority_1G] * 10G: [DEFAULT_PORT_deqHighPriority_10G] * * May be used for Non - Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] high_pri TRUE to select high priority, FALSE for normal * operation. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_deq_high_priority(t_handle h_fm_port, bool high_pri); /* * @Function fm_port_config_deq_type * * @Description Calling this routine changes the dequeue type parameter in the * internal driver data base from its default configuration * [DEFAULT_PORT_deq_type]. * * May be used for Non - Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] deq_type According to QM definition. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_deq_type(t_handle h_fm_port, e_fm_port_deq_type deq_type); /* * @Function fm_port_config_deq_prefetch_option * * @Description Calling this routine changes the dequeue prefetch option * parameter in the internal driver data base from its default * configuration [DEFAULT_PORT_deq_prefetch_option] * Note: Available for some chips only * * May be used for Non - Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] deq_prefetch_option New option * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_deq_prefetch_option(t_handle h_fm_port, e_fm_port_deq_prefetch_option deq_prefetch_option); /* * @Function fm_port_config_deq_byte_cnt * * @Description Calling this routine changes the dequeue byte count parameter * in the internal driver data base from its default * configuration. * 1G:[DEFAULT_PORT_deq_byte_cnt_1G]. * 10G:[DEFAULT_PORT_deq_byte_cnt_10G]. * * May be used for Non - Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] deq_byte_cnt New byte count * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_deq_byte_cnt(t_handle h_fm_port, uint16_t deq_byte_cnt); /* * @Function fm_port_config_buffer_prefix_content * * @Description Defines the structure, size and content of the application * buffer. The prefix will In Tx ports, if 'pass_prs_result', the * application should set a value to their offsets in the prefix * of the FM will save the first 'priv_data_size', than, * depending on 'pass_prs_result' and 'pass_time_stamp', copy * parse result and timeStamp, and the packet itself (in this * order), to the application buffer, and to offset. * Calling this routine changes the buffer margins definitions in * the internal driver data base from its default configuration: * Data size: [DEFAULT_PORT_bufferPrefixContent_priv_data_size] * Pass Parser result: * [DEFAULT_PORT_bufferPrefixContent_pass_prs_result]. * Pass timestamp: * [DEFAULT_PORT_bufferPrefixContent_pass_time_stamp]. * * May be used for all ports * * * @Param[in] h_fm_port A handle to a FM Port * module. * @Param[in,out] p_fm_buffer_prefix_content A structure of * parameters describing * the structure of the * buffer. * Out parameter: Start * margin - offset of data * from start of external * buffer. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_buffer_prefix_content(t_handle h_fm_port, t_fm_buffer_prefix_content *p_fm_buffer_prefix_content); /* * @Function fm_port_config_checksum_last_bytes_ignore * * @Description Calling this routine changes the number of checksum bytes to * ignore parameter in the internal driver data base from its * default configuration. * * May be used by Tx & Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] checksum_last_bytes_ignore New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_checksum_last_bytes_ignore(t_handle h_fm_port, uint8_t checksum_last_bytes_ignore); /* * @Function fm_port_config_cut_bytes_from_end * * @Description Calling this routine changes the number of bytes to cut from a * frame's end parameter in the internal driver data base * from its default configuration * [DEFAULT_PORT_cut_bytes_from_end] * Note that if the result of (frame length before chop - * cut_bytes_from_end) is less than 14 bytes, the chop operation * is not executed. * * May be used for Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] cut_bytes_from_end New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_cut_bytes_from_end(t_handle h_fm_port, uint8_t cut_bytes_from_end); /* * @Function fm_port_config_ext_buf_pools * * @Description This routine should be called for OP ports that internally use * BM buffer pools. In such cases, e.g. for fragmentation and * re-assembly, the FM needs new BM buffers. By calling this * routine the user specifies the BM buffer pools that should be * used. * * Note: Available for some chips only * * May be used for OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_fm_ext_pools A structure of parameters for the * external pools. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_ext_buf_pools(t_handle h_fm_port, t_fm_ext_pools *p_fm_ext_pools); /* * @Function fm_port_config_backup_pools * * @Description Calling this routine allows the configuration of some of the * BM pools defined for this port as backup pools. * A pool configured to be a backup pool will be used only if all * other enabled non - backup pools are depleted. * * May be used for Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_fm_port_backup_bm_pools An array of pool id's. All pools * specified here will be defined * as backup pools. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_backup_pools(t_handle h_fm_port, t_fm_backup_bm_pools *p_fm_port_backup_bm_pools); /* * @Function fm_port_config_frm_discard_override * * @Description Calling this routine changes the error frames destination * parameter in the internal driver data base from its default * configuration: override =[DEFAULT_PORT_frmDiscardOverride] * * May be used for Rx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] override TRUE to override discarding of error frames and * enqueueing them to error queue. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_frm_discard_override(t_handle h_fm_port, bool override); /* * @Function fm_port_config_errors_to_discard * * @Description Calling this routine changes the behaviour on error parameter * in the internal driver data base from its default * configuration: [DEFAULT_PORT_errorsToDiscard]. * If a requested error was previously defined as * "ErrorsToEnqueue" it's definition will change and the frame * will be discarded. Errors that were not defined either as * "ErrorsToEnqueue" nor as "ErrorsToDiscard", will be forwarded * to CPU. * * May be used for Rx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] errs A list of errors to discard * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_errors_to_discard(t_handle h_fm_port, fm_port_frame_err_select_t errs); /* * @Function fm_port_config_dma_ic_cache_attr * * @Description Calling this routine changes the internal context cache * attribute parameter in the internal driver data base * from its default configuration: * [DEFAULT_PORT_dmaIntContextCacheAttr] * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] int_context_cache_attr New selection * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_dma_ic_cache_attr(t_handle h_fm_port, e_fm_dma_cache_option int_context_cache_attr); /* * @Function fm_port_config_dma_hdr_attr * * @Description Calling this routine changes the header cache attribute * parameter in the internal driver data base from its default * configuration[DEFAULT_PORT_dmaHeaderCacheAttr] * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] header_cache_attr New selection * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_dma_hdr_attr(t_handle h_fm_port, e_fm_dma_cache_option header_cache_attr); /* * @Function fm_port_config_dma_scatter_gather_attr * * @Description Calling this routine changes the scatter gather cache * attribute parameter in the internal driver data base from its * default configuration[DEFAULT_PORT_dmaScatterGatherCacheAttr] * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] scatter_gather_cache_attr New selection * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_dma_scatter_gather_attr(t_handle h_fm_port, e_fm_dma_cache_option scatter_gather_cache_attr); /* * @Function fm_port_config_dma_write_optimize * * @Description Calling this routine changes the write optimization parameter * in the internal driver data base from its default * configuration : By default optimize = * [DEFAULT_PORT_dmaWriteOptimize]. * Note: * 1. For head optimization, data alignment must be >= 16 * (supported by default). * * 2. For tail optimization, note that the optimization is * performed by extending the write transaction of the frame * payload at the tail as needed to achieve optimal bus * transfers, so that the last write is extended to be on * 16 / 64 bytes aligned block (chip dependent). * * Relevant for non - Tx port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] optimize TRUE to enable optimization, FALSE for normal * operation * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_dma_write_optimize(t_handle h_fm_port, bool optimize); /* * @Function fm_port_config_no_scather_gather * * @Description Calling this routine changes the no_scather_gather parameter * in internal driver data base from its default configuration. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] no_scather_gather TRUE - frame is discarded if can not be * stored in single buffer, * FALSE - frame can be stored in scatter * gather (S / G) format. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_no_scather_gather(t_handle h_fm_port, bool no_scather_gather); /* * @Function fm_port_config_dflt_color * * @Description Calling this routine changes the internal default color * parameter in the internal driver data base * from its default configuration[DEFAULT_PORT_color] * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] color New selection * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_dflt_color(t_handle h_fm_port, e_fm_port_color color); /* * @Function fm_port_config_sync_req * * @Description Calling this routine changes the synchronization attribute * parameter in the internal driver data base from its default * configuration: sync_req =[DEFAULT_PORT_sync_req] * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] sync_req TRUE to request synchronization, FALSE * otherwise. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_sync_req(t_handle h_fm_port, bool sync_req); /* * @Function fm_port_config_forward_reuse_int_context * * @Description This routine is relevant for Rx ports that are routed to OP * port. It changes the internal context reuse option in the * internal driver data base from its default configuration: * reuse =[DEFAULT_PORT_forwardIntContextReuse] * * May be used for Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] reuse TRUE to reuse internal context on frames * forwarded to OP port. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_forward_reuse_int_context(t_handle h_fm_port, bool reuse); /* * @Function fm_port_config_donot_release_tx_buf_to_bm * * @Description This routine should be called if no Tx confirmation * is done, and yet buffers should not be released to the BM. * * Normally, buffers are returned using the Tx confirmation * process. When Tx confirmation is not used (defFqid = 0), * buffers are typically released to the BM. This routine * may be called to avoid this behavior and not release the * buffers. * * May be used for Tx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_donot_release_tx_buf_to_bm(t_handle h_fm_port); /* * @Function fm_port_config_immax_rx_buf_length * * @Description Changes the maximum receive buffer length from its default * configuration: Closest rounded down power of 2 value of the * data buffer size. * * The maximum receive buffer length directly affects the * structure of received frames (single- or multi-buffered) and * the performance of both the FM and the driver. * * The selection between single- or multi-buffered frames should * be done according to the characteristics of the specific * application. The recommended mode is to use a single data * buffer per packet, as this mode provides the best performance. * However, the user can select to use multiple data buffers per * packet. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] new_val Maximum receive buffer length (in bytes). * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). This routine is to be used only if * Independent-Mode is enabled. */ uint32_t fm_port_config_immax_rx_buf_length(t_handle h_fm_port, uint16_t new_val); /* * @Function fm_port_config_imrx_bd_ring_length * * @Description Changes the receive BD ring length from its default * configuration:[DEFAULT_PORT_rxBdRingLength] * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] new_val The desired BD ring length. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). This routine is to be used only if * Independent-Mode is enabled. */ uint32_t fm_port_config_imrx_bd_ring_length(t_handle h_fm_port, uint16_t new_val); /* * @Function fm_port_config_imtx_bd_ring_length * * @Description Changes the transmit BD ring length from its default * configuration:[DEFAULT_PORT_txBdRingLength] * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] new_val The desired BD ring length. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). This routine is to be used only if * Independent-Mode is enabled. */ uint32_t fm_port_config_imtx_bd_ring_length(t_handle h_fm_port, uint16_t new_val); /* * @Function fm_port_config_imfman_ctrl_external_structs_memory * * @Description Configures memory partition and attributes for FMan-Controller * data structures (e.g. BD rings). * Calling this routine changes the internal driver data base * from its default configuration * [DEFAULT_PORT_ImfwExtStructsMemId, * DEFAULT_PORT_ImfwExtStructsMemAttr]. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] mem_id Memory partition ID. * @Param[in] mem_attributes Memory attributes mask (a combination of * MEMORY_ATTR_x flags). * * @Return E_OK on success; Error code otherwise. */ uint32_t fm_port_config_imfman_ctrl_external_structs_memory(t_handle h_fm_port, uint8_t mem_id, uint32_t mem_attributes); /* * @Function fm_port_config_impolling * * @Description Changes the Rx flow from interrupt driven (default) to * polling. * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). * This routine is to be used only if Independent-Mode is * enabled. */ uint32_t fm_port_config_impolling(t_handle h_fm_port); /* * @Function fm_port_config_max_frame_length * * @Description Changes the definition of the max size of frame that should be * transmitted/received on this port from its default value * [DEFAULT_PORT_maxFrameLength]. * This parameter is used for confirmation of the minimum Fifo * size calculations and only for Tx ports or ports working in * independent mode. This should be larger than the maximum * possible MTU that will be used for this port (i.e. its MAC). * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] length Max size of frame * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). This routine is to be used only if * Independent-Mode is enabled. */ uint32_t fm_port_config_max_frame_length(t_handle h_fm_port, uint16_t length); /* * @Function fm_port_config_tx_fifo_min_fill_level * * @Description Calling this routine changes the fifo minimum fill level * parameter in the internal driver data base from its default * configuration[DEFAULT_PORT_txFifoMinFillLevel] * * May be used for Tx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] min_fill_level New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_tx_fifo_min_fill_level(t_handle h_fm_port, uint32_t min_fill_level); /* * @Function fm_port_config_fifo_deq_pipeline_depth * * @Description Calling this routine changes the fifo dequeue pipeline depth * parameter in the internal driver data base * * from its default configuration : * 1G ports : [DEFAULT_PORT_fifoDeqPipelineDepth_1G], * 10G port : [DEFAULT_PORT_fifoDeqPipelineDepth_10G], * OP port : [DEFAULT_PORT_fifoDeqPipelineDepth_OH] * * May be used for Tx / OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] deq_pipeline_depth New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_fifo_deq_pipeline_depth(t_handle h_fm_port, uint8_t deq_pipeline_depth); /* * @Function fm_port_config_tx_fifo_low_comf_level * * @Description Calling this routine changes the fifo low comfort level * parameter in internal driver data base from its default * configuration[DEFAULT_PORT_txFifoLowComfLevel] * * May be used for Tx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] fifo_low_comf_level New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_tx_fifo_low_comf_level(t_handle h_fm_port, uint32_t fifo_low_comf_level); /* * @Function fm_port_config_rx_fifo_threshold * * @Description Calling this routine changes the threshold of the FIFO fill * level parameter in the internal driver data base from its * default configuration[DEFAULT_PORT_rxFifoThreshold] * * If the total number of buffers which are currently in use and * associated with the specific RX port exceed this threshold, * the BMI will signal the MAC to send a pause frame over the * link. * * May be used for Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] fifo_threshold New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_rx_fifo_threshold(t_handle h_fm_port, uint32_t fifo_threshold); /* * @Function fm_port_config_rx_fifo_pri_elevation_level * * @Description Calling this routine changes the priority elevation level * parameter in the internal driver data base from its default * configuration[DEFAULT_PORT_rxFifoPriElevationLevel] * * If the total number of buffers which are currently in use and * associated with the specific RX port exceed the amount * specified in pri_elevation_level, BMI will signal the main * FM's DMA to elevate the FM priority on the system bus. * * May be used for Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] pri_elevation_level New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_rx_fifo_pri_elevation_level(t_handle h_fm_port, uint32_t pri_elevation_level); #ifdef FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669 /* * @Function fm_port_config_bcbworkaround * * @Description Configures BCB errata workaround. * * When BCB errata is applicable, the workaround is always * performed by FM Controller. Thus, this function does not * actually enable errata workaround but rather allows driver to * perform adjustments required due to errata workaround * execution in FM controller. * * Applying BCB workaround also configures * FM_PORT_FRM_ERR_PHYSICAL errors to be discarded. Thus * FM_PORT_FRM_ERR_PHYSICAL can't be set by * fm_port_set_errors_route() function. * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_bcbworkaround(t_handle h_fm_port); #endif /* FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669 */ /* * @Function fm_port_config_internal_buff_offset * * @Description Configures internal buffer offset. * * May be used for Rx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] val New value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_config_internal_buff_offset(t_handle h_fm_port, uint8_t val); /** @} */ /* end of FM_PORT_advanced_init_grp group */ /** @} */ /* end of FM_PORT_init_grp group */ /* * @Group FM_PORT_runtime_control_grp FM Port Runtime Control Unit * * @Description FM Port Runtime control unit API functions, definitions and * enums. * * @{ */ /* * @Description enum for defining FM Port counters */ typedef enum e_fm_port_counters { e_FM_PORT_COUNTERS_CYCLE, /**< BMI performance counter */ e_FM_PORT_COUNTERS_TASK_UTIL, /**< BMI performance counter */ e_FM_PORT_COUNTERS_QUEUE_UTIL, /**< BMI performance counter */ e_FM_PORT_COUNTERS_DMA_UTIL, /**< BMI performance counter */ e_FM_PORT_COUNTERS_FIFO_UTIL, /**< BMI performance counter */ e_FM_PORT_COUNTERS_RX_PAUSE_ACTIVATION, /**< BMI Rx only performance counter */ e_FM_PORT_COUNTERS_FRAME, /**< BMI statistics counter */ e_FM_PORT_COUNTERS_DISCARD_FRAME, /**< BMI statistics counter */ e_FM_PORT_COUNTERS_DEALLOC_BUF, /**< BMI deallocate buffer statistics counter */ e_FM_PORT_COUNTERS_RX_BAD_FRAME, /**< BMI Rx only statistics counter */ e_FM_PORT_COUNTERS_RX_LARGE_FRAME, /**< BMI Rx only statistics counter */ e_FM_PORT_COUNTERS_RX_FILTER_FRAME, /**< BMI Rx & OP only statistics counter */ e_FM_PORT_COUNTERS_RX_LIST_DMA_ERR, /**< BMI Rx, OP & HC only statistics counter */ e_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD, /**< BMI Rx, OP & HC statistics counter */ e_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER, /**< BMI Rx, OP & HC only statistics counter */ e_FM_PORT_COUNTERS_WRED_DISCARD, /**< BMI OP & HC only statistics counter */ e_FM_PORT_COUNTERS_LENGTH_ERR, /**< BMI non-Rx statistics counter */ e_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT, /**< BMI non-Rx statistics counter */ e_FM_PORT_COUNTERS_DEQ_TOTAL, /**< QMI total QM dequeues counter */ e_FM_PORT_COUNTERS_ENQ_TOTAL, /**< QMI total QM enqueues counter */ e_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT, /**< QMI counter */ e_FM_PORT_COUNTERS_DEQ_CONFIRM /**< QMI counter */ } e_fm_port_counters; typedef struct t_fm_port_bmi_stats { uint32_t cnt_cycle; uint32_t cnt_task_util; uint32_t cnt_queue_util; uint32_t cnt_dma_util; uint32_t cnt_fifo_util; uint32_t cnt_rx_pause_activation; uint32_t cnt_frame; uint32_t cnt_discard_frame; uint32_t cnt_dealloc_buf; uint32_t cnt_rx_bad_frame; uint32_t cnt_rx_large_frame; uint32_t cnt_rx_filter_frame; uint32_t cnt_rx_list_dma_err; uint32_t cnt_rx_out_of_buffers_discard; uint32_t cnt_wred_discard; uint32_t cnt_length_err; uint32_t cnt_unsupported_format; } t_fm_port_bmi_stats; /* * @Description Structure for Port id parameters. * Fields commented 'IN' are passed by the port module to be used * by the FM module. * Fields commented 'OUT' will be filled by FM before returning * to port. */ typedef struct t_fm_port_congestion_grps { uint16_t num_of_congestion_grps_to_consider; /**< The number of required CGs to define the size of * the following array */ uint8_t congestion_grps_to_consider[FM_NUM_CONG_GRPS]; /**< An array of CG indexes; Note that the size of the * array should be 'num_of_congestion_grps_to_consider'. */ bool pfc_prio_enable[FM_NUM_CONG_GRPS][FM_MAX_PFC_PRIO]; /**< a matrix that represents the map between the CG ids * defined in 'congestion_grps_to_consider' to the * priorties mapping array. */ } t_fm_port_congestion_grps; #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) /* * @Function fm_port_dump_regs * * @Description Dump all regs. * * Calling this routine invalidates the descriptor. * * @Param[in] h_fm_port FM PORT module descriptor * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_dump_regs(t_handle h_fm_port); #endif /* (defined(DEBUG_ERRORS) && ... */ /* * @Function fm_port_get_buffer_data_offset * * @Description Relevant for Rx ports. Returns the data offset from the * beginning of the data buffer * * @Param[in] h_fm_port FM PORT module descriptor * * @Return data offset. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_get_buffer_data_offset(t_handle h_fm_port); /* * @Function fm_port_get_buffer_icinfo * * @Description Returns the Internal Context offset from the beginning of the * data buffer * * @Param[in] h_fm_port FM PORT module descriptor * @Param[in] p_data A pointer to the data buffer. * * @Return Internal context info pointer on success, NULL if * 'allOtherInfo' was not configured for this port. * * @Cautions Allowed only following fm_port_init(). */ uint8_t *fm_port_get_buffer_icinfo(t_handle h_fm_port, char *p_data); /* * @Function fm_port_get_buffer_prs_result * * @Description Returns the pointer to the parse result in the data buffer. * In Rx ports this is relevant after reception, if parse result * is configured to be part of the data passed to the * application. For non Rx ports it may be used to get the * pointer of the area in the buffer where parse result should be * initialized - if so configured. * See fm_port_config_buffer_prefix_content for data buffer * prefix configuration. * * @Param[in] h_fm_port FM PORT module descriptor * @Param[in] p_data A pointer to the data buffer. * * @Return Parse result pointer on success, NULL if parse result was not * configured for this port. * * @Cautions Allowed only following fm_port_init(). */ t_fm_prs_result *fm_port_get_buffer_prs_result(t_handle h_fm_port, char *p_data); /* * @Function fm_port_get_buffer_time_stamp * * @Description Returns the time stamp in the data buffer. * Relevant for Rx ports for getting the buffer time stamp. * See fm_port_config_buffer_prefix_content for data buffer * prefix configuration. * * @Param[in] h_fm_port FM PORT module descriptor * @Param[in] p_data A pointer to the data buffer. * * @Return A pointer to the hash result on success, NULL otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint64_t *fm_port_get_buffer_time_stamp(t_handle h_fm_port, char *p_data); /* * @Function fm_port_get_buffer_hash_result * * @Description Given a data buffer, on the condition that hash result was * defined as a part of the buffer content(see * fm_port_config_buffer_prefix_content) this routine will return * the pointer to the hash result location in the buffer prefix. * * @Param[in] h_fm_port FM PORT module descriptor * @Param[in] p_data A pointer to the data buffer. * * @Return A pointer to the hash result on success, NULL otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint8_t *fm_port_get_buffer_hash_result(t_handle h_fm_port, char *p_data); /* * @Function fm_port_disable * * @Description Gracefully disable an FM port. The port will not start new * tasks after all tasks associated with the port are terminated. * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). * This is a blocking routine, it returns after port is * gracefully stopped, i.e. the port will not except new frames, * but it will finish all frames or tasks which were already * began */ uint32_t fm_port_disable(t_handle h_fm_port); /* * @Function fm_port_enable * * @Description A runtime routine provided to allow disable/enable of port. * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_enable(t_handle h_fm_port); /* * @Function fm_port_set_rate_limit * * @Description Calling this routine enables rate limit algorithm. * By default, this functionality is disabled. * * Note that rate - limit mechanism uses the FM time stamp. * The selected rate limit specified here would be * rounded DOWN to the nearest 16M. * * May be used for Tx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_rate_limit A structure of rate limit parameters * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). If rate limit is set * on a port that need to send PFC frames, it might violate the * stop transmit timing. */ uint32_t fm_port_set_rate_limit(t_handle h_fm_port, t_fm_port_rate_limit *p_rate_limit); /* * @Function fm_port_delete_rate_limit * * @Description Calling this routine disables and clears rate limit * initialization. * * May be used for Tx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_delete_rate_limit(t_handle h_fm_port); /* * @Function fm_port_set_pfc_priorities_mapping_to_qman_wq * @Description Calling this routine maps each PFC received priority to the * transmit WQ. This WQ will be blocked upon receiving a PFC * frame with this priority. * * May be used for Tx ports only. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] prio PFC priority (0 - 7). * @Param[in] wq Work Queue (0 - 7). * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_pfc_priorities_mapping_to_qman_wq(t_handle h_fm_port, uint8_t prio, uint8_t wq); /* * @Function fm_port_set_statistics_counters * * @Description Calling this routine enables/disables port's statistics * counters. By default, counters are enabled. * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] enable TRUE to enable, FALSE to disable. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_statistics_counters(t_handle h_fm_port, bool enable); /* * @Function fm_port_set_frame_queue_counters * * @Description Calling this routine enables/disables port's enqueue/dequeue * counters. By default, counters are enabled. * * May be used for all ports * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] enable TRUE to enable, FALSE to disable. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_frame_queue_counters(t_handle h_fm_port, bool enable); /* * @Function fm_port_analyze_performance_params * * @Description User may call this routine to so the driver will analyze if * the basic performance parameters are correct and also the * driver may suggest of improvements; The basic parameters are * FIFO sizes, number of DMAs and number of TNUMs for the port. * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_analyze_performance_params(t_handle h_fm_port); /* * @Function fm_port_set_alloc_buf_counter * * @Description Calling this routine enables/disables BM pool allocate * buffer counters. * By default, counters are enabled. * * May be used for Rx ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] pool_id BM pool id. * @Param[in] enable TRUE to enable, FALSE to disable. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_alloc_buf_counter(t_handle h_fm_port, uint8_t pool_id, bool enable); /* * @Function fm_port_get_bmi_counters * * @Description Read port's BMI stat counters and place them into * a designated structure of counters. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[out] p_bmi_stats counters structure * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_get_bmi_counters(t_handle h_fm_port, t_fm_port_bmi_stats *p_bmi_stats); /* * @Function fm_port_get_counter * * @Description Reads one of the FM PORT counters. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] fm_port_counter The requested counter. * * @Return Counter's current value. * * @Cautions Allowed only following fm_port_init(). * Note that it is user's responsibility to call this routine * only for enabled counters, and there will be no indication if * a disabled counter is accessed. */ uint32_t fm_port_get_counter(t_handle h_fm_port, e_fm_port_counters fm_port_counter); /* * @Function fm_port_modify_counter * * @Description Sets a value to an enabled counter. Use "0" to reset the * counter. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] fm_port_counter The requested counter. * @Param[in] value The requested value to be written into * the counter. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_modify_counter(t_handle h_fm_port, e_fm_port_counters fm_port_counter, uint32_t value); /* * @Function fm_port_get_alloc_buf_counter * * @Description Reads one of the FM PORT buffer counters. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] pool_id The requested pool. * * @Return Counter's current value. * * @Cautions Allowed only following fm_port_init(). * Note that it is user's responsibility to call this routine * only for enabled counters, and there will be no indication if * a disabled counter is accessed. */ uint32_t fm_port_get_alloc_buf_counter(t_handle h_fm_port, uint8_t pool_id); /* * @Function fm_port_modify_alloc_buf_counter * * @Description Sets a value to an enabled counter. Use "0" to reset the * counter. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] pool_id The requested pool. * @Param[in] value The requested value to be written into the * counter. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_modify_alloc_buf_counter(t_handle h_fm_port, uint8_t pool_id, uint32_t value); /* * @Function fm_port_add_congestion_grps * * @Description This routine effects the corresponding Tx port. * It should be called in order to enable pause * frame transmission in case of congestion in one or more * of the congestion groups relevant to this port. * Each call to this routine may add one or more congestion * groups to be considered relevant to this port. * * May be used for Rx, or RX + OP ports only (depending on chip) * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_congestion_grps A pointer to an array of congestion * groups id's to consider. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_add_congestion_grps(t_handle h_fm_port, t_fm_port_congestion_grps *p_congestion_grps); /* * @Function fm_port_remove_congestion_grps * * @Description This routine effects the corresponding Tx port. It should be * called when congestion groups were defined for this port and * are no longer relevant, or pause frames transmitting is not * required on their behalf. * Each call to this routine may remove one or more congestion * groups to be considered relevant to this port. * * May be used for Rx, or RX + OP ports only (depending on chip) * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_congestion_grps A pointer to an array of congestion * groups id's to consider. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_remove_congestion_grps(t_handle h_fm_port, t_fm_port_congestion_grps *p_congestion_grps); /* * @Function fm_port_is_stalled * * @Description A routine for checking whether the specified port is stalled. * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return TRUE if port is stalled, FALSE otherwise * * @Cautions Allowed only following fm_port_init(). */ bool fm_port_is_stalled(t_handle h_fm_port); /* * @Function fm_port_release_stalled * * @Description This routine may be called in case the port was stalled and * may now be released. * Note that this routine is available only on older FMan * revisions (FMan v2, DPAA v1.0 only). * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_release_stalled(t_handle h_fm_port); /* * @Function fm_port_set_rx_l4checksum_verify * * @Description This routine is relevant for Rx ports (1G and 10G). The * routine set / clear the L3 / L4 checksum verification (on RX * side). Note that this takes affect only if hw - parser is * enabled ! * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] l_4checksum boolean indicates whether to do L3/L4 checksum * on frames or not. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_rx_l4checksum_verify(t_handle h_fm_port, bool l_4checksum); /* * @Function fm_port_set_errors_route * * @Description Errors selected for this routine will cause a frame with that * error to be enqueued to error queue. * Errors not selected for this routine will cause a frame with * that error to be enqueued to the one of the other port queues. * By default all errors are defined to be enqueued to error * queue. Errors that were configured to be discarded(at * initialization) may not be selected here. * * May be used for Rx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] errs A list of errors to enqueue to error queue * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_config() and before * fm_port_init(). */ uint32_t fm_port_set_errors_route(t_handle h_fm_port, fm_port_frame_err_select_t errs); /* * @Function fm_port_set_imexceptions * * @Description Calling this routine enables/disables FM PORT interrupts. * * @Param[in] h_fm_port FM PORT module descriptor. * @Param[in] exception The exception to be selected. * @Param[in] enable TRUE to enable interrupt, FALSE to mask it. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). * This routine should NOT be called from guest-partition * (i.e. guestId != NCSW_PRIMARY_ID) */ uint32_t fm_port_set_imexceptions(t_handle h_fm_port, e_fm_port_exceptions exception, bool enable); /* * @Function fm_port_set_performance_counters * * @Description Calling this routine enables/disables port's performance * counters. By default, counters are enabled. * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] enable TRUE to enable, FALSE to disable. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_performance_counters(t_handle h_fm_port, bool enable); /* * @Function fm_port_set_performance_counters_params * * @Description Calling this routine defines port's performance counters * parameters. * * May be used for all port types * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_fm_port_performance_cnt A pointer to a structure of * performance counters parameters. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_performance_counters_params(t_handle h_fm_port, t_fm_port_performance_cnt *p_fm_port_performance_cnt); /* * @Group FM_PORT_pcd_runtime_control_grp * FM Port PCD Runtime Control Unit * * @Description FM Port PCD Runtime control unit API functions, definitions * and enums. * * @Function fm_port_set_pcd * * @Description Calling this routine defines the port's PCD configuration. It * changes it from its default configuration which is PCD * disabled (BMI to BMI) and configures it according to the * passed parameters. * * May be used for Rx and OP ports only * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_fm_port_pcd A Structure of parameters defining the port's * PCD configuration. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_set_pcd(t_handle h_fm_port, ioc_fm_port_pcd_params_t *p_fm_port_pcd); /* * @Function fm_port_delete_pcd * * @Description Calling this routine releases the port's PCD configuration. * The port returns to its default configuration which is PCD * disabled (BMI to BMI) and all PCD configuration is removed. * * May be used for Rx and OP ports which are in PCD mode only * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_delete_pcd(t_handle h_fm_port); /* * @Function fm_port_attach_pcd * * @Description This routine may be called after fm_port_detach_pcd was * called, to return to the originally configured PCD support * flow. The couple of routines are used to allow PCD * configuration changes that demand that PCD will not be used * while changes take place. * * May be used for Rx and OP ports which are in PCD mode only * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(). */ uint32_t fm_port_attach_pcd(t_handle h_fm_port); /* * @Function fm_port_detach_pcd * * @Description Calling this routine detaches the port from its PCD * functionality. The port returns to its default flow which is * BMI to BMI. * * May be used for Rx and OP ports which are in PCD mode only * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_attach_pcd(). */ uint32_t fm_port_detach_pcd(t_handle h_fm_port); /* * @Function fm_port_pcd_plcr_alloc_profiles * * @Description This routine may be called only for ports that use the Policer * in order to allocate private policer profiles. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] num_of_profiles The number of required policer profiles * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() and fm_pcd_init(), and * before fm_port_set_pcd(). */ uint32_t fm_port_pcd_plcr_alloc_profiles(t_handle h_fm_port, uint16_t num_of_profiles); /* * @Function fm_port_pcd_plcr_free_profiles * * @Description This routine should be called for freeing private policer * profiles. * * @Param[in] h_fm_port A handle to a FM Port module. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() and fm_pcd_init(), and * before fm_port_set_pcd(). */ uint32_t fm_port_pcd_plcr_free_profiles(t_handle h_fm_port); /* * @Function fm_port_pcd_kg_modify_initial_scheme * * @Description This routine may be called only for ports that use the keygen * in order to change the initial scheme frame should be routed * to. The change may be of a scheme id(in case of direct mode), * from direct to indirect, or from indirect to direct - * specifying the scheme id. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_fm_pcd_kg_scheme A structure of parameters for defining * whether a scheme is direct / indirect, * and if direct - scheme id. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() and fm_port_set_pcd(). */ uint32_t fm_port_pcd_kg_modify_initial_scheme(t_handle h_fm_port, ioc_fm_pcd_kg_scheme_select_t *p_fm_pcd_kg_scheme); /* * @Function fm_port_pcd_plcr_modify_initial_profile * * @Description This routine may be called for ports with flows * e_FM_PORT_PCD_SUPPORT_PLCR_ONLY or * e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR only, to change the initial * Policer profile frame should be routed to. The change may be * of a profile and / or absolute / direct mode selection. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] h_profile Policer profile handle * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() and fm_port_set_pcd(). */ uint32_t fm_port_pcd_plcr_modify_initial_profile(t_handle h_fm_port, t_handle h_profile); /* * @Function fm_port_pcd_cc_modify_tree * * @Description This routine may be called for ports that use coarse * classification tree if the user wishes to replace the tree. * The routine may not be called while port receives packets * using the PCD functionalities, therefore port must be first * detached from the PCD, only than the routine may be called, * and than port be attached to PCD again. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] h_cc_tree A CC tree that was already built. The tree id as * returned from the BuildTree routine. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init(), fm_port_set_pcd() and * fm_port_detach_pcd() */ uint32_t fm_port_pcd_cc_modify_tree(t_handle h_fm_port, t_handle h_cc_tree); /* * @Function fm_port_pcd_kg_bind_schemes * * @Description These routines may be called for adding more schemes for the * port to be bound to. The selected schemes are not added, just * this specific port starts using them. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_port_scheme A structure defining the list of schemes * to be added. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() and fm_port_set_pcd(). */ uint32_t fm_port_pcd_kg_bind_schemes(t_handle h_fm_port, ioc_fm_pcd_port_schemes_params_t *p_port_scheme); /* * @Function fm_port_pcd_kg_unbind_schemes * * @Description These routines may be called for adding more schemes for the * port to be bound to. The selected schemes are not removed or * invalidated, just this specific port stops using them. * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[in] p_port_scheme A structure defining the list of schemes * to be added. * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() and fm_port_set_pcd(). */ uint32_t fm_port_pcd_kg_unbind_schemes(t_handle h_fm_port, ioc_fm_pcd_port_schemes_params_t *p_port_scheme); /* * @Function fm_port_get_ipv_4options_count * * @Description TODO * * @Param[in] h_fm_port A handle to a FM Port module. * @Param[out] p_ipv_4options_count will hold the counter value * * @Return E_OK on success; Error code otherwise. * * @Cautions Allowed only following fm_port_init() */ uint32_t fm_port_get_ipv_4options_count(t_handle h_fm_port, uint32_t *p_ipv_4options_count); /** @} */ /* end of FM_PORT_pcd_runtime_control_grp group */ /** @} */ /* end of FM_PORT_runtime_control_grp group */ /** @} */ /* end of FM_PORT_grp group */ /** @} */ /* end of FM_grp group */ #endif /* __FM_PORT_EXT_H */