162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 262306a36Sopenharmony_ci/* Copyright 2013-2016 Freescale Semiconductor Inc. 362306a36Sopenharmony_ci * Copyright 2016 NXP 462306a36Sopenharmony_ci * Copyright 2020 NXP 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#include <linux/kernel.h> 762306a36Sopenharmony_ci#include <linux/errno.h> 862306a36Sopenharmony_ci#include <linux/fsl/mc.h> 962306a36Sopenharmony_ci#include "dpni.h" 1062306a36Sopenharmony_ci#include "dpni-cmd.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/** 1362306a36Sopenharmony_ci * dpni_prepare_key_cfg() - function prepare extract parameters 1462306a36Sopenharmony_ci * @cfg: defining a full Key Generation profile (rule) 1562306a36Sopenharmony_ci * @key_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * This function has to be called before the following functions: 1862306a36Sopenharmony_ci * - dpni_set_rx_tc_dist() 1962306a36Sopenharmony_ci * - dpni_set_qos_table() 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ciint dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, u8 *key_cfg_buf) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci int i, j; 2662306a36Sopenharmony_ci struct dpni_ext_set_rx_tc_dist *dpni_ext; 2762306a36Sopenharmony_ci struct dpni_dist_extract *extr; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS) 3062306a36Sopenharmony_ci return -EINVAL; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci dpni_ext = (struct dpni_ext_set_rx_tc_dist *)key_cfg_buf; 3362306a36Sopenharmony_ci dpni_ext->num_extracts = cfg->num_extracts; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci for (i = 0; i < cfg->num_extracts; i++) { 3662306a36Sopenharmony_ci extr = &dpni_ext->extracts[i]; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci switch (cfg->extracts[i].type) { 3962306a36Sopenharmony_ci case DPKG_EXTRACT_FROM_HDR: 4062306a36Sopenharmony_ci extr->prot = cfg->extracts[i].extract.from_hdr.prot; 4162306a36Sopenharmony_ci dpni_set_field(extr->efh_type, EFH_TYPE, 4262306a36Sopenharmony_ci cfg->extracts[i].extract.from_hdr.type); 4362306a36Sopenharmony_ci extr->size = cfg->extracts[i].extract.from_hdr.size; 4462306a36Sopenharmony_ci extr->offset = cfg->extracts[i].extract.from_hdr.offset; 4562306a36Sopenharmony_ci extr->field = cpu_to_le32( 4662306a36Sopenharmony_ci cfg->extracts[i].extract.from_hdr.field); 4762306a36Sopenharmony_ci extr->hdr_index = 4862306a36Sopenharmony_ci cfg->extracts[i].extract.from_hdr.hdr_index; 4962306a36Sopenharmony_ci break; 5062306a36Sopenharmony_ci case DPKG_EXTRACT_FROM_DATA: 5162306a36Sopenharmony_ci extr->size = cfg->extracts[i].extract.from_data.size; 5262306a36Sopenharmony_ci extr->offset = 5362306a36Sopenharmony_ci cfg->extracts[i].extract.from_data.offset; 5462306a36Sopenharmony_ci break; 5562306a36Sopenharmony_ci case DPKG_EXTRACT_FROM_PARSE: 5662306a36Sopenharmony_ci extr->size = cfg->extracts[i].extract.from_parse.size; 5762306a36Sopenharmony_ci extr->offset = 5862306a36Sopenharmony_ci cfg->extracts[i].extract.from_parse.offset; 5962306a36Sopenharmony_ci break; 6062306a36Sopenharmony_ci default: 6162306a36Sopenharmony_ci return -EINVAL; 6262306a36Sopenharmony_ci } 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks; 6562306a36Sopenharmony_ci dpni_set_field(extr->extract_type, EXTRACT_TYPE, 6662306a36Sopenharmony_ci cfg->extracts[i].type); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci for (j = 0; j < DPKG_NUM_OF_MASKS; j++) { 6962306a36Sopenharmony_ci extr->masks[j].mask = cfg->extracts[i].masks[j].mask; 7062306a36Sopenharmony_ci extr->masks[j].offset = 7162306a36Sopenharmony_ci cfg->extracts[i].masks[j].offset; 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci return 0; 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/** 7962306a36Sopenharmony_ci * dpni_open() - Open a control session for the specified object 8062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 8162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 8262306a36Sopenharmony_ci * @dpni_id: DPNI unique ID 8362306a36Sopenharmony_ci * @token: Returned token; use in subsequent API calls 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * This function can be used to open a control session for an 8662306a36Sopenharmony_ci * already created object; an object may have been declared in 8762306a36Sopenharmony_ci * the DPL or by calling the dpni_create() function. 8862306a36Sopenharmony_ci * This function returns a unique authentication token, 8962306a36Sopenharmony_ci * associated with the specific object ID and the specific MC 9062306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for 9162306a36Sopenharmony_ci * this specific object. 9262306a36Sopenharmony_ci * 9362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 9462306a36Sopenharmony_ci */ 9562306a36Sopenharmony_ciint dpni_open(struct fsl_mc_io *mc_io, 9662306a36Sopenharmony_ci u32 cmd_flags, 9762306a36Sopenharmony_ci int dpni_id, 9862306a36Sopenharmony_ci u16 *token) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 10162306a36Sopenharmony_ci struct dpni_cmd_open *cmd_params; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci int err; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci /* prepare command */ 10662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN, 10762306a36Sopenharmony_ci cmd_flags, 10862306a36Sopenharmony_ci 0); 10962306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_open *)cmd.params; 11062306a36Sopenharmony_ci cmd_params->dpni_id = cpu_to_le32(dpni_id); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci /* send command to mc*/ 11362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 11462306a36Sopenharmony_ci if (err) 11562306a36Sopenharmony_ci return err; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci /* retrieve response parameters */ 11862306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci return 0; 12162306a36Sopenharmony_ci} 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci/** 12462306a36Sopenharmony_ci * dpni_close() - Close the control session of the object 12562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 12662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 12762306a36Sopenharmony_ci * @token: Token of DPNI object 12862306a36Sopenharmony_ci * 12962306a36Sopenharmony_ci * After this function is called, no further operations are 13062306a36Sopenharmony_ci * allowed on the object without opening a new control session. 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_ciint dpni_close(struct fsl_mc_io *mc_io, 13562306a36Sopenharmony_ci u32 cmd_flags, 13662306a36Sopenharmony_ci u16 token) 13762306a36Sopenharmony_ci{ 13862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci /* prepare command */ 14162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE, 14262306a36Sopenharmony_ci cmd_flags, 14362306a36Sopenharmony_ci token); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* send command to mc*/ 14662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/** 15062306a36Sopenharmony_ci * dpni_set_pools() - Set buffer pools configuration 15162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 15262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15362306a36Sopenharmony_ci * @token: Token of DPNI object 15462306a36Sopenharmony_ci * @cfg: Buffer pools configuration 15562306a36Sopenharmony_ci * 15662306a36Sopenharmony_ci * mandatory for DPNI operation 15762306a36Sopenharmony_ci * warning:Allowed only when DPNI is disabled 15862306a36Sopenharmony_ci * 15962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_ciint dpni_set_pools(struct fsl_mc_io *mc_io, 16262306a36Sopenharmony_ci u32 cmd_flags, 16362306a36Sopenharmony_ci u16 token, 16462306a36Sopenharmony_ci const struct dpni_pools_cfg *cfg) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 16762306a36Sopenharmony_ci struct dpni_cmd_set_pools *cmd_params; 16862306a36Sopenharmony_ci int i; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci /* prepare command */ 17162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS, 17262306a36Sopenharmony_ci cmd_flags, 17362306a36Sopenharmony_ci token); 17462306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_pools *)cmd.params; 17562306a36Sopenharmony_ci cmd_params->num_dpbp = cfg->num_dpbp; 17662306a36Sopenharmony_ci cmd_params->pool_options = cfg->pool_options; 17762306a36Sopenharmony_ci for (i = 0; i < DPNI_MAX_DPBP; i++) { 17862306a36Sopenharmony_ci cmd_params->pool[i].dpbp_id = 17962306a36Sopenharmony_ci cpu_to_le16(cfg->pools[i].dpbp_id); 18062306a36Sopenharmony_ci cmd_params->pool[i].priority_mask = 18162306a36Sopenharmony_ci cfg->pools[i].priority_mask; 18262306a36Sopenharmony_ci cmd_params->buffer_size[i] = 18362306a36Sopenharmony_ci cpu_to_le16(cfg->pools[i].buffer_size); 18462306a36Sopenharmony_ci cmd_params->backup_pool_mask |= 18562306a36Sopenharmony_ci DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i); 18662306a36Sopenharmony_ci } 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci /* send command to mc*/ 18962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/** 19362306a36Sopenharmony_ci * dpni_enable() - Enable the DPNI, allow sending and receiving frames. 19462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 19562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 19662306a36Sopenharmony_ci * @token: Token of DPNI object 19762306a36Sopenharmony_ci * 19862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 19962306a36Sopenharmony_ci */ 20062306a36Sopenharmony_ciint dpni_enable(struct fsl_mc_io *mc_io, 20162306a36Sopenharmony_ci u32 cmd_flags, 20262306a36Sopenharmony_ci u16 token) 20362306a36Sopenharmony_ci{ 20462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci /* prepare command */ 20762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE, 20862306a36Sopenharmony_ci cmd_flags, 20962306a36Sopenharmony_ci token); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci /* send command to mc*/ 21262306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 21362306a36Sopenharmony_ci} 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci/** 21662306a36Sopenharmony_ci * dpni_disable() - Disable the DPNI, stop sending and receiving frames. 21762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 21862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 21962306a36Sopenharmony_ci * @token: Token of DPNI object 22062306a36Sopenharmony_ci * 22162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 22262306a36Sopenharmony_ci */ 22362306a36Sopenharmony_ciint dpni_disable(struct fsl_mc_io *mc_io, 22462306a36Sopenharmony_ci u32 cmd_flags, 22562306a36Sopenharmony_ci u16 token) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci /* prepare command */ 23062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE, 23162306a36Sopenharmony_ci cmd_flags, 23262306a36Sopenharmony_ci token); 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci /* send command to mc*/ 23562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 23662306a36Sopenharmony_ci} 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/** 23962306a36Sopenharmony_ci * dpni_is_enabled() - Check if the DPNI is enabled. 24062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 24162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 24262306a36Sopenharmony_ci * @token: Token of DPNI object 24362306a36Sopenharmony_ci * @en: Returns '1' if object is enabled; '0' otherwise 24462306a36Sopenharmony_ci * 24562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 24662306a36Sopenharmony_ci */ 24762306a36Sopenharmony_ciint dpni_is_enabled(struct fsl_mc_io *mc_io, 24862306a36Sopenharmony_ci u32 cmd_flags, 24962306a36Sopenharmony_ci u16 token, 25062306a36Sopenharmony_ci int *en) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 25362306a36Sopenharmony_ci struct dpni_rsp_is_enabled *rsp_params; 25462306a36Sopenharmony_ci int err; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci /* prepare command */ 25762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED, 25862306a36Sopenharmony_ci cmd_flags, 25962306a36Sopenharmony_ci token); 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci /* send command to mc*/ 26262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 26362306a36Sopenharmony_ci if (err) 26462306a36Sopenharmony_ci return err; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci /* retrieve response parameters */ 26762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_is_enabled *)cmd.params; 26862306a36Sopenharmony_ci *en = dpni_get_field(rsp_params->enabled, ENABLE); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci return 0; 27162306a36Sopenharmony_ci} 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/** 27462306a36Sopenharmony_ci * dpni_reset() - Reset the DPNI, returns the object to initial state. 27562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 27662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 27762306a36Sopenharmony_ci * @token: Token of DPNI object 27862306a36Sopenharmony_ci * 27962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 28062306a36Sopenharmony_ci */ 28162306a36Sopenharmony_ciint dpni_reset(struct fsl_mc_io *mc_io, 28262306a36Sopenharmony_ci u32 cmd_flags, 28362306a36Sopenharmony_ci u16 token) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci /* prepare command */ 28862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET, 28962306a36Sopenharmony_ci cmd_flags, 29062306a36Sopenharmony_ci token); 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci /* send command to mc*/ 29362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/** 29762306a36Sopenharmony_ci * dpni_set_irq_enable() - Set overall interrupt state. 29862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 29962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 30062306a36Sopenharmony_ci * @token: Token of DPNI object 30162306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 30262306a36Sopenharmony_ci * @en: Interrupt state: - enable = 1, disable = 0 30362306a36Sopenharmony_ci * 30462306a36Sopenharmony_ci * Allows GPP software to control when interrupts are generated. 30562306a36Sopenharmony_ci * Each interrupt can have up to 32 causes. The enable/disable control's the 30662306a36Sopenharmony_ci * overall interrupt state. if the interrupt is disabled no causes will cause 30762306a36Sopenharmony_ci * an interrupt. 30862306a36Sopenharmony_ci * 30962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 31062306a36Sopenharmony_ci */ 31162306a36Sopenharmony_ciint dpni_set_irq_enable(struct fsl_mc_io *mc_io, 31262306a36Sopenharmony_ci u32 cmd_flags, 31362306a36Sopenharmony_ci u16 token, 31462306a36Sopenharmony_ci u8 irq_index, 31562306a36Sopenharmony_ci u8 en) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 31862306a36Sopenharmony_ci struct dpni_cmd_set_irq_enable *cmd_params; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci /* prepare command */ 32162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE, 32262306a36Sopenharmony_ci cmd_flags, 32362306a36Sopenharmony_ci token); 32462306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params; 32562306a36Sopenharmony_ci dpni_set_field(cmd_params->enable, ENABLE, en); 32662306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci /* send command to mc*/ 32962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci/** 33362306a36Sopenharmony_ci * dpni_get_irq_enable() - Get overall interrupt state 33462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 33562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 33662306a36Sopenharmony_ci * @token: Token of DPNI object 33762306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 33862306a36Sopenharmony_ci * @en: Returned interrupt state - enable = 1, disable = 0 33962306a36Sopenharmony_ci * 34062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 34162306a36Sopenharmony_ci */ 34262306a36Sopenharmony_ciint dpni_get_irq_enable(struct fsl_mc_io *mc_io, 34362306a36Sopenharmony_ci u32 cmd_flags, 34462306a36Sopenharmony_ci u16 token, 34562306a36Sopenharmony_ci u8 irq_index, 34662306a36Sopenharmony_ci u8 *en) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 34962306a36Sopenharmony_ci struct dpni_cmd_get_irq_enable *cmd_params; 35062306a36Sopenharmony_ci struct dpni_rsp_get_irq_enable *rsp_params; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci int err; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci /* prepare command */ 35562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE, 35662306a36Sopenharmony_ci cmd_flags, 35762306a36Sopenharmony_ci token); 35862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params; 35962306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci /* send command to mc*/ 36262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 36362306a36Sopenharmony_ci if (err) 36462306a36Sopenharmony_ci return err; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci /* retrieve response parameters */ 36762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params; 36862306a36Sopenharmony_ci *en = dpni_get_field(rsp_params->enabled, ENABLE); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci return 0; 37162306a36Sopenharmony_ci} 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci/** 37462306a36Sopenharmony_ci * dpni_set_irq_mask() - Set interrupt mask. 37562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 37662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 37762306a36Sopenharmony_ci * @token: Token of DPNI object 37862306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 37962306a36Sopenharmony_ci * @mask: event mask to trigger interrupt; 38062306a36Sopenharmony_ci * each bit: 38162306a36Sopenharmony_ci * 0 = ignore event 38262306a36Sopenharmony_ci * 1 = consider event for asserting IRQ 38362306a36Sopenharmony_ci * 38462306a36Sopenharmony_ci * Every interrupt can have up to 32 causes and the interrupt model supports 38562306a36Sopenharmony_ci * masking/unmasking each cause independently 38662306a36Sopenharmony_ci * 38762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 38862306a36Sopenharmony_ci */ 38962306a36Sopenharmony_ciint dpni_set_irq_mask(struct fsl_mc_io *mc_io, 39062306a36Sopenharmony_ci u32 cmd_flags, 39162306a36Sopenharmony_ci u16 token, 39262306a36Sopenharmony_ci u8 irq_index, 39362306a36Sopenharmony_ci u32 mask) 39462306a36Sopenharmony_ci{ 39562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 39662306a36Sopenharmony_ci struct dpni_cmd_set_irq_mask *cmd_params; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci /* prepare command */ 39962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK, 40062306a36Sopenharmony_ci cmd_flags, 40162306a36Sopenharmony_ci token); 40262306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params; 40362306a36Sopenharmony_ci cmd_params->mask = cpu_to_le32(mask); 40462306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci /* send command to mc*/ 40762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 40862306a36Sopenharmony_ci} 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci/** 41162306a36Sopenharmony_ci * dpni_get_irq_mask() - Get interrupt mask. 41262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 41362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 41462306a36Sopenharmony_ci * @token: Token of DPNI object 41562306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 41662306a36Sopenharmony_ci * @mask: Returned event mask to trigger interrupt 41762306a36Sopenharmony_ci * 41862306a36Sopenharmony_ci * Every interrupt can have up to 32 causes and the interrupt model supports 41962306a36Sopenharmony_ci * masking/unmasking each cause independently 42062306a36Sopenharmony_ci * 42162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 42262306a36Sopenharmony_ci */ 42362306a36Sopenharmony_ciint dpni_get_irq_mask(struct fsl_mc_io *mc_io, 42462306a36Sopenharmony_ci u32 cmd_flags, 42562306a36Sopenharmony_ci u16 token, 42662306a36Sopenharmony_ci u8 irq_index, 42762306a36Sopenharmony_ci u32 *mask) 42862306a36Sopenharmony_ci{ 42962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 43062306a36Sopenharmony_ci struct dpni_cmd_get_irq_mask *cmd_params; 43162306a36Sopenharmony_ci struct dpni_rsp_get_irq_mask *rsp_params; 43262306a36Sopenharmony_ci int err; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci /* prepare command */ 43562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK, 43662306a36Sopenharmony_ci cmd_flags, 43762306a36Sopenharmony_ci token); 43862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params; 43962306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci /* send command to mc*/ 44262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 44362306a36Sopenharmony_ci if (err) 44462306a36Sopenharmony_ci return err; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci /* retrieve response parameters */ 44762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params; 44862306a36Sopenharmony_ci *mask = le32_to_cpu(rsp_params->mask); 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci return 0; 45162306a36Sopenharmony_ci} 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci/** 45462306a36Sopenharmony_ci * dpni_get_irq_status() - Get the current status of any pending interrupts. 45562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 45662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 45762306a36Sopenharmony_ci * @token: Token of DPNI object 45862306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 45962306a36Sopenharmony_ci * @status: Returned interrupts status - one bit per cause: 46062306a36Sopenharmony_ci * 0 = no interrupt pending 46162306a36Sopenharmony_ci * 1 = interrupt pending 46262306a36Sopenharmony_ci * 46362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 46462306a36Sopenharmony_ci */ 46562306a36Sopenharmony_ciint dpni_get_irq_status(struct fsl_mc_io *mc_io, 46662306a36Sopenharmony_ci u32 cmd_flags, 46762306a36Sopenharmony_ci u16 token, 46862306a36Sopenharmony_ci u8 irq_index, 46962306a36Sopenharmony_ci u32 *status) 47062306a36Sopenharmony_ci{ 47162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 47262306a36Sopenharmony_ci struct dpni_cmd_get_irq_status *cmd_params; 47362306a36Sopenharmony_ci struct dpni_rsp_get_irq_status *rsp_params; 47462306a36Sopenharmony_ci int err; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci /* prepare command */ 47762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS, 47862306a36Sopenharmony_ci cmd_flags, 47962306a36Sopenharmony_ci token); 48062306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params; 48162306a36Sopenharmony_ci cmd_params->status = cpu_to_le32(*status); 48262306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci /* send command to mc*/ 48562306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 48662306a36Sopenharmony_ci if (err) 48762306a36Sopenharmony_ci return err; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci /* retrieve response parameters */ 49062306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params; 49162306a36Sopenharmony_ci *status = le32_to_cpu(rsp_params->status); 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci return 0; 49462306a36Sopenharmony_ci} 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci/** 49762306a36Sopenharmony_ci * dpni_clear_irq_status() - Clear a pending interrupt's status 49862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 49962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 50062306a36Sopenharmony_ci * @token: Token of DPNI object 50162306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 50262306a36Sopenharmony_ci * @status: bits to clear (W1C) - one bit per cause: 50362306a36Sopenharmony_ci * 0 = don't change 50462306a36Sopenharmony_ci * 1 = clear status bit 50562306a36Sopenharmony_ci * 50662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 50762306a36Sopenharmony_ci */ 50862306a36Sopenharmony_ciint dpni_clear_irq_status(struct fsl_mc_io *mc_io, 50962306a36Sopenharmony_ci u32 cmd_flags, 51062306a36Sopenharmony_ci u16 token, 51162306a36Sopenharmony_ci u8 irq_index, 51262306a36Sopenharmony_ci u32 status) 51362306a36Sopenharmony_ci{ 51462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 51562306a36Sopenharmony_ci struct dpni_cmd_clear_irq_status *cmd_params; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci /* prepare command */ 51862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS, 51962306a36Sopenharmony_ci cmd_flags, 52062306a36Sopenharmony_ci token); 52162306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params; 52262306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 52362306a36Sopenharmony_ci cmd_params->status = cpu_to_le32(status); 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci /* send command to mc*/ 52662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 52762306a36Sopenharmony_ci} 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci/** 53062306a36Sopenharmony_ci * dpni_get_attributes() - Retrieve DPNI attributes. 53162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 53262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 53362306a36Sopenharmony_ci * @token: Token of DPNI object 53462306a36Sopenharmony_ci * @attr: Object's attributes 53562306a36Sopenharmony_ci * 53662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 53762306a36Sopenharmony_ci */ 53862306a36Sopenharmony_ciint dpni_get_attributes(struct fsl_mc_io *mc_io, 53962306a36Sopenharmony_ci u32 cmd_flags, 54062306a36Sopenharmony_ci u16 token, 54162306a36Sopenharmony_ci struct dpni_attr *attr) 54262306a36Sopenharmony_ci{ 54362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 54462306a36Sopenharmony_ci struct dpni_rsp_get_attr *rsp_params; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_ci int err; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci /* prepare command */ 54962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR, 55062306a36Sopenharmony_ci cmd_flags, 55162306a36Sopenharmony_ci token); 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci /* send command to mc*/ 55462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 55562306a36Sopenharmony_ci if (err) 55662306a36Sopenharmony_ci return err; 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci /* retrieve response parameters */ 55962306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_attr *)cmd.params; 56062306a36Sopenharmony_ci attr->options = le32_to_cpu(rsp_params->options); 56162306a36Sopenharmony_ci attr->num_queues = rsp_params->num_queues; 56262306a36Sopenharmony_ci attr->num_tcs = rsp_params->num_tcs; 56362306a36Sopenharmony_ci attr->mac_filter_entries = rsp_params->mac_filter_entries; 56462306a36Sopenharmony_ci attr->vlan_filter_entries = rsp_params->vlan_filter_entries; 56562306a36Sopenharmony_ci attr->qos_entries = rsp_params->qos_entries; 56662306a36Sopenharmony_ci attr->fs_entries = le16_to_cpu(rsp_params->fs_entries); 56762306a36Sopenharmony_ci attr->qos_key_size = rsp_params->qos_key_size; 56862306a36Sopenharmony_ci attr->fs_key_size = rsp_params->fs_key_size; 56962306a36Sopenharmony_ci attr->wriop_version = le16_to_cpu(rsp_params->wriop_version); 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci return 0; 57262306a36Sopenharmony_ci} 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci/** 57562306a36Sopenharmony_ci * dpni_set_errors_behavior() - Set errors behavior 57662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 57762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 57862306a36Sopenharmony_ci * @token: Token of DPNI object 57962306a36Sopenharmony_ci * @cfg: Errors configuration 58062306a36Sopenharmony_ci * 58162306a36Sopenharmony_ci * this function may be called numerous times with different 58262306a36Sopenharmony_ci * error masks 58362306a36Sopenharmony_ci * 58462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 58562306a36Sopenharmony_ci */ 58662306a36Sopenharmony_ciint dpni_set_errors_behavior(struct fsl_mc_io *mc_io, 58762306a36Sopenharmony_ci u32 cmd_flags, 58862306a36Sopenharmony_ci u16 token, 58962306a36Sopenharmony_ci struct dpni_error_cfg *cfg) 59062306a36Sopenharmony_ci{ 59162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 59262306a36Sopenharmony_ci struct dpni_cmd_set_errors_behavior *cmd_params; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci /* prepare command */ 59562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR, 59662306a36Sopenharmony_ci cmd_flags, 59762306a36Sopenharmony_ci token); 59862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params; 59962306a36Sopenharmony_ci cmd_params->errors = cpu_to_le32(cfg->errors); 60062306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action); 60162306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation); 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci /* send command to mc*/ 60462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 60562306a36Sopenharmony_ci} 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci/** 60862306a36Sopenharmony_ci * dpni_get_buffer_layout() - Retrieve buffer layout attributes. 60962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 61062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 61162306a36Sopenharmony_ci * @token: Token of DPNI object 61262306a36Sopenharmony_ci * @qtype: Type of queue to retrieve configuration for 61362306a36Sopenharmony_ci * @layout: Returns buffer layout attributes 61462306a36Sopenharmony_ci * 61562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 61662306a36Sopenharmony_ci */ 61762306a36Sopenharmony_ciint dpni_get_buffer_layout(struct fsl_mc_io *mc_io, 61862306a36Sopenharmony_ci u32 cmd_flags, 61962306a36Sopenharmony_ci u16 token, 62062306a36Sopenharmony_ci enum dpni_queue_type qtype, 62162306a36Sopenharmony_ci struct dpni_buffer_layout *layout) 62262306a36Sopenharmony_ci{ 62362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 62462306a36Sopenharmony_ci struct dpni_cmd_get_buffer_layout *cmd_params; 62562306a36Sopenharmony_ci struct dpni_rsp_get_buffer_layout *rsp_params; 62662306a36Sopenharmony_ci int err; 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci /* prepare command */ 62962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT, 63062306a36Sopenharmony_ci cmd_flags, 63162306a36Sopenharmony_ci token); 63262306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params; 63362306a36Sopenharmony_ci cmd_params->qtype = qtype; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci /* send command to mc*/ 63662306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 63762306a36Sopenharmony_ci if (err) 63862306a36Sopenharmony_ci return err; 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci /* retrieve response parameters */ 64162306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params; 64262306a36Sopenharmony_ci layout->pass_timestamp = dpni_get_field(rsp_params->flags, PASS_TS); 64362306a36Sopenharmony_ci layout->pass_parser_result = dpni_get_field(rsp_params->flags, PASS_PR); 64462306a36Sopenharmony_ci layout->pass_frame_status = dpni_get_field(rsp_params->flags, PASS_FS); 64562306a36Sopenharmony_ci layout->private_data_size = le16_to_cpu(rsp_params->private_data_size); 64662306a36Sopenharmony_ci layout->data_align = le16_to_cpu(rsp_params->data_align); 64762306a36Sopenharmony_ci layout->data_head_room = le16_to_cpu(rsp_params->head_room); 64862306a36Sopenharmony_ci layout->data_tail_room = le16_to_cpu(rsp_params->tail_room); 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci return 0; 65162306a36Sopenharmony_ci} 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci/** 65462306a36Sopenharmony_ci * dpni_set_buffer_layout() - Set buffer layout configuration. 65562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 65662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 65762306a36Sopenharmony_ci * @token: Token of DPNI object 65862306a36Sopenharmony_ci * @qtype: Type of queue this configuration applies to 65962306a36Sopenharmony_ci * @layout: Buffer layout configuration 66062306a36Sopenharmony_ci * 66162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 66262306a36Sopenharmony_ci * 66362306a36Sopenharmony_ci * @warning Allowed only when DPNI is disabled 66462306a36Sopenharmony_ci */ 66562306a36Sopenharmony_ciint dpni_set_buffer_layout(struct fsl_mc_io *mc_io, 66662306a36Sopenharmony_ci u32 cmd_flags, 66762306a36Sopenharmony_ci u16 token, 66862306a36Sopenharmony_ci enum dpni_queue_type qtype, 66962306a36Sopenharmony_ci const struct dpni_buffer_layout *layout) 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 67262306a36Sopenharmony_ci struct dpni_cmd_set_buffer_layout *cmd_params; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci /* prepare command */ 67562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT, 67662306a36Sopenharmony_ci cmd_flags, 67762306a36Sopenharmony_ci token); 67862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params; 67962306a36Sopenharmony_ci cmd_params->qtype = qtype; 68062306a36Sopenharmony_ci cmd_params->options = cpu_to_le16(layout->options); 68162306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp); 68262306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result); 68362306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status); 68462306a36Sopenharmony_ci cmd_params->private_data_size = cpu_to_le16(layout->private_data_size); 68562306a36Sopenharmony_ci cmd_params->data_align = cpu_to_le16(layout->data_align); 68662306a36Sopenharmony_ci cmd_params->head_room = cpu_to_le16(layout->data_head_room); 68762306a36Sopenharmony_ci cmd_params->tail_room = cpu_to_le16(layout->data_tail_room); 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci /* send command to mc*/ 69062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 69162306a36Sopenharmony_ci} 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci/** 69462306a36Sopenharmony_ci * dpni_set_offload() - Set DPNI offload configuration. 69562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 69662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 69762306a36Sopenharmony_ci * @token: Token of DPNI object 69862306a36Sopenharmony_ci * @type: Type of DPNI offload 69962306a36Sopenharmony_ci * @config: Offload configuration. 70062306a36Sopenharmony_ci * For checksum offloads, non-zero value enables the offload 70162306a36Sopenharmony_ci * 70262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 70362306a36Sopenharmony_ci * 70462306a36Sopenharmony_ci * @warning Allowed only when DPNI is disabled 70562306a36Sopenharmony_ci */ 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ciint dpni_set_offload(struct fsl_mc_io *mc_io, 70862306a36Sopenharmony_ci u32 cmd_flags, 70962306a36Sopenharmony_ci u16 token, 71062306a36Sopenharmony_ci enum dpni_offload type, 71162306a36Sopenharmony_ci u32 config) 71262306a36Sopenharmony_ci{ 71362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 71462306a36Sopenharmony_ci struct dpni_cmd_set_offload *cmd_params; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD, 71762306a36Sopenharmony_ci cmd_flags, 71862306a36Sopenharmony_ci token); 71962306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_offload *)cmd.params; 72062306a36Sopenharmony_ci cmd_params->dpni_offload = type; 72162306a36Sopenharmony_ci cmd_params->config = cpu_to_le32(config); 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 72462306a36Sopenharmony_ci} 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ciint dpni_get_offload(struct fsl_mc_io *mc_io, 72762306a36Sopenharmony_ci u32 cmd_flags, 72862306a36Sopenharmony_ci u16 token, 72962306a36Sopenharmony_ci enum dpni_offload type, 73062306a36Sopenharmony_ci u32 *config) 73162306a36Sopenharmony_ci{ 73262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 73362306a36Sopenharmony_ci struct dpni_cmd_get_offload *cmd_params; 73462306a36Sopenharmony_ci struct dpni_rsp_get_offload *rsp_params; 73562306a36Sopenharmony_ci int err; 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci /* prepare command */ 73862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD, 73962306a36Sopenharmony_ci cmd_flags, 74062306a36Sopenharmony_ci token); 74162306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_offload *)cmd.params; 74262306a36Sopenharmony_ci cmd_params->dpni_offload = type; 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci /* send command to mc*/ 74562306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 74662306a36Sopenharmony_ci if (err) 74762306a36Sopenharmony_ci return err; 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci /* retrieve response parameters */ 75062306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_offload *)cmd.params; 75162306a36Sopenharmony_ci *config = le32_to_cpu(rsp_params->config); 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci return 0; 75462306a36Sopenharmony_ci} 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci/** 75762306a36Sopenharmony_ci * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used 75862306a36Sopenharmony_ci * for enqueue operations 75962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 76062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 76162306a36Sopenharmony_ci * @token: Token of DPNI object 76262306a36Sopenharmony_ci * @qtype: Type of queue to receive QDID for 76362306a36Sopenharmony_ci * @qdid: Returned virtual QDID value that should be used as an argument 76462306a36Sopenharmony_ci * in all enqueue operations 76562306a36Sopenharmony_ci * 76662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 76762306a36Sopenharmony_ci */ 76862306a36Sopenharmony_ciint dpni_get_qdid(struct fsl_mc_io *mc_io, 76962306a36Sopenharmony_ci u32 cmd_flags, 77062306a36Sopenharmony_ci u16 token, 77162306a36Sopenharmony_ci enum dpni_queue_type qtype, 77262306a36Sopenharmony_ci u16 *qdid) 77362306a36Sopenharmony_ci{ 77462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 77562306a36Sopenharmony_ci struct dpni_cmd_get_qdid *cmd_params; 77662306a36Sopenharmony_ci struct dpni_rsp_get_qdid *rsp_params; 77762306a36Sopenharmony_ci int err; 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci /* prepare command */ 78062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID, 78162306a36Sopenharmony_ci cmd_flags, 78262306a36Sopenharmony_ci token); 78362306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_qdid *)cmd.params; 78462306a36Sopenharmony_ci cmd_params->qtype = qtype; 78562306a36Sopenharmony_ci 78662306a36Sopenharmony_ci /* send command to mc*/ 78762306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 78862306a36Sopenharmony_ci if (err) 78962306a36Sopenharmony_ci return err; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci /* retrieve response parameters */ 79262306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_qdid *)cmd.params; 79362306a36Sopenharmony_ci *qdid = le16_to_cpu(rsp_params->qdid); 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_ci return 0; 79662306a36Sopenharmony_ci} 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci/** 79962306a36Sopenharmony_ci * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer) 80062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 80162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 80262306a36Sopenharmony_ci * @token: Token of DPNI object 80362306a36Sopenharmony_ci * @data_offset: Tx data offset (from start of buffer) 80462306a36Sopenharmony_ci * 80562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 80662306a36Sopenharmony_ci */ 80762306a36Sopenharmony_ciint dpni_get_tx_data_offset(struct fsl_mc_io *mc_io, 80862306a36Sopenharmony_ci u32 cmd_flags, 80962306a36Sopenharmony_ci u16 token, 81062306a36Sopenharmony_ci u16 *data_offset) 81162306a36Sopenharmony_ci{ 81262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 81362306a36Sopenharmony_ci struct dpni_rsp_get_tx_data_offset *rsp_params; 81462306a36Sopenharmony_ci int err; 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci /* prepare command */ 81762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET, 81862306a36Sopenharmony_ci cmd_flags, 81962306a36Sopenharmony_ci token); 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci /* send command to mc*/ 82262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 82362306a36Sopenharmony_ci if (err) 82462306a36Sopenharmony_ci return err; 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_ci /* retrieve response parameters */ 82762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params; 82862306a36Sopenharmony_ci *data_offset = le16_to_cpu(rsp_params->data_offset); 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci return 0; 83162306a36Sopenharmony_ci} 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_ci/** 83462306a36Sopenharmony_ci * dpni_set_link_cfg() - set the link configuration. 83562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 83662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 83762306a36Sopenharmony_ci * @token: Token of DPNI object 83862306a36Sopenharmony_ci * @cfg: Link configuration 83962306a36Sopenharmony_ci * 84062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 84162306a36Sopenharmony_ci */ 84262306a36Sopenharmony_ciint dpni_set_link_cfg(struct fsl_mc_io *mc_io, 84362306a36Sopenharmony_ci u32 cmd_flags, 84462306a36Sopenharmony_ci u16 token, 84562306a36Sopenharmony_ci const struct dpni_link_cfg *cfg) 84662306a36Sopenharmony_ci{ 84762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 84862306a36Sopenharmony_ci struct dpni_cmd_link_cfg *cmd_params; 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci /* prepare command */ 85162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG, 85262306a36Sopenharmony_ci cmd_flags, 85362306a36Sopenharmony_ci token); 85462306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_link_cfg *)cmd.params; 85562306a36Sopenharmony_ci cmd_params->rate = cpu_to_le32(cfg->rate); 85662306a36Sopenharmony_ci cmd_params->options = cpu_to_le64(cfg->options); 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci /* send command to mc*/ 85962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 86062306a36Sopenharmony_ci} 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci/** 86362306a36Sopenharmony_ci * dpni_get_link_cfg() - return the link configuration 86462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 86562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 86662306a36Sopenharmony_ci * @token: Token of DPNI object 86762306a36Sopenharmony_ci * @cfg: Link configuration from dpni object 86862306a36Sopenharmony_ci * 86962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 87062306a36Sopenharmony_ci */ 87162306a36Sopenharmony_ciint dpni_get_link_cfg(struct fsl_mc_io *mc_io, 87262306a36Sopenharmony_ci u32 cmd_flags, 87362306a36Sopenharmony_ci u16 token, 87462306a36Sopenharmony_ci struct dpni_link_cfg *cfg) 87562306a36Sopenharmony_ci{ 87662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 87762306a36Sopenharmony_ci struct dpni_cmd_link_cfg *rsp_params; 87862306a36Sopenharmony_ci int err; 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_ci /* prepare command */ 88162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_CFG, 88262306a36Sopenharmony_ci cmd_flags, 88362306a36Sopenharmony_ci token); 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci /* send command to mc*/ 88662306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 88762306a36Sopenharmony_ci if (err) 88862306a36Sopenharmony_ci return err; 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_ci /* retrieve response parameters */ 89162306a36Sopenharmony_ci rsp_params = (struct dpni_cmd_link_cfg *)cmd.params; 89262306a36Sopenharmony_ci cfg->rate = le32_to_cpu(rsp_params->rate); 89362306a36Sopenharmony_ci cfg->options = le64_to_cpu(rsp_params->options); 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci return err; 89662306a36Sopenharmony_ci} 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci/** 89962306a36Sopenharmony_ci * dpni_get_link_state() - Return the link state (either up or down) 90062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 90162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 90262306a36Sopenharmony_ci * @token: Token of DPNI object 90362306a36Sopenharmony_ci * @state: Returned link state; 90462306a36Sopenharmony_ci * 90562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 90662306a36Sopenharmony_ci */ 90762306a36Sopenharmony_ciint dpni_get_link_state(struct fsl_mc_io *mc_io, 90862306a36Sopenharmony_ci u32 cmd_flags, 90962306a36Sopenharmony_ci u16 token, 91062306a36Sopenharmony_ci struct dpni_link_state *state) 91162306a36Sopenharmony_ci{ 91262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 91362306a36Sopenharmony_ci struct dpni_rsp_get_link_state *rsp_params; 91462306a36Sopenharmony_ci int err; 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_ci /* prepare command */ 91762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE, 91862306a36Sopenharmony_ci cmd_flags, 91962306a36Sopenharmony_ci token); 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_ci /* send command to mc*/ 92262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 92362306a36Sopenharmony_ci if (err) 92462306a36Sopenharmony_ci return err; 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci /* retrieve response parameters */ 92762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_link_state *)cmd.params; 92862306a36Sopenharmony_ci state->up = dpni_get_field(rsp_params->flags, LINK_STATE); 92962306a36Sopenharmony_ci state->rate = le32_to_cpu(rsp_params->rate); 93062306a36Sopenharmony_ci state->options = le64_to_cpu(rsp_params->options); 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci return 0; 93362306a36Sopenharmony_ci} 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_ci/** 93662306a36Sopenharmony_ci * dpni_set_max_frame_length() - Set the maximum received frame length. 93762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 93862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 93962306a36Sopenharmony_ci * @token: Token of DPNI object 94062306a36Sopenharmony_ci * @max_frame_length: Maximum received frame length (in 94162306a36Sopenharmony_ci * bytes); frame is discarded if its 94262306a36Sopenharmony_ci * length exceeds this value 94362306a36Sopenharmony_ci * 94462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 94562306a36Sopenharmony_ci */ 94662306a36Sopenharmony_ciint dpni_set_max_frame_length(struct fsl_mc_io *mc_io, 94762306a36Sopenharmony_ci u32 cmd_flags, 94862306a36Sopenharmony_ci u16 token, 94962306a36Sopenharmony_ci u16 max_frame_length) 95062306a36Sopenharmony_ci{ 95162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 95262306a36Sopenharmony_ci struct dpni_cmd_set_max_frame_length *cmd_params; 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_ci /* prepare command */ 95562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH, 95662306a36Sopenharmony_ci cmd_flags, 95762306a36Sopenharmony_ci token); 95862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params; 95962306a36Sopenharmony_ci cmd_params->max_frame_length = cpu_to_le16(max_frame_length); 96062306a36Sopenharmony_ci 96162306a36Sopenharmony_ci /* send command to mc*/ 96262306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 96362306a36Sopenharmony_ci} 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci/** 96662306a36Sopenharmony_ci * dpni_get_max_frame_length() - Get the maximum received frame length. 96762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 96862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 96962306a36Sopenharmony_ci * @token: Token of DPNI object 97062306a36Sopenharmony_ci * @max_frame_length: Maximum received frame length (in 97162306a36Sopenharmony_ci * bytes); frame is discarded if its 97262306a36Sopenharmony_ci * length exceeds this value 97362306a36Sopenharmony_ci * 97462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 97562306a36Sopenharmony_ci */ 97662306a36Sopenharmony_ciint dpni_get_max_frame_length(struct fsl_mc_io *mc_io, 97762306a36Sopenharmony_ci u32 cmd_flags, 97862306a36Sopenharmony_ci u16 token, 97962306a36Sopenharmony_ci u16 *max_frame_length) 98062306a36Sopenharmony_ci{ 98162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 98262306a36Sopenharmony_ci struct dpni_rsp_get_max_frame_length *rsp_params; 98362306a36Sopenharmony_ci int err; 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci /* prepare command */ 98662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH, 98762306a36Sopenharmony_ci cmd_flags, 98862306a36Sopenharmony_ci token); 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_ci /* send command to mc*/ 99162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 99262306a36Sopenharmony_ci if (err) 99362306a36Sopenharmony_ci return err; 99462306a36Sopenharmony_ci 99562306a36Sopenharmony_ci /* retrieve response parameters */ 99662306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params; 99762306a36Sopenharmony_ci *max_frame_length = le16_to_cpu(rsp_params->max_frame_length); 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_ci return 0; 100062306a36Sopenharmony_ci} 100162306a36Sopenharmony_ci 100262306a36Sopenharmony_ci/** 100362306a36Sopenharmony_ci * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode 100462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 100562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 100662306a36Sopenharmony_ci * @token: Token of DPNI object 100762306a36Sopenharmony_ci * @en: Set to '1' to enable; '0' to disable 100862306a36Sopenharmony_ci * 100962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 101062306a36Sopenharmony_ci */ 101162306a36Sopenharmony_ciint dpni_set_multicast_promisc(struct fsl_mc_io *mc_io, 101262306a36Sopenharmony_ci u32 cmd_flags, 101362306a36Sopenharmony_ci u16 token, 101462306a36Sopenharmony_ci int en) 101562306a36Sopenharmony_ci{ 101662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 101762306a36Sopenharmony_ci struct dpni_cmd_set_multicast_promisc *cmd_params; 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci /* prepare command */ 102062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC, 102162306a36Sopenharmony_ci cmd_flags, 102262306a36Sopenharmony_ci token); 102362306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params; 102462306a36Sopenharmony_ci dpni_set_field(cmd_params->enable, ENABLE, en); 102562306a36Sopenharmony_ci 102662306a36Sopenharmony_ci /* send command to mc*/ 102762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 102862306a36Sopenharmony_ci} 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_ci/** 103162306a36Sopenharmony_ci * dpni_get_multicast_promisc() - Get multicast promiscuous mode 103262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 103362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 103462306a36Sopenharmony_ci * @token: Token of DPNI object 103562306a36Sopenharmony_ci * @en: Returns '1' if enabled; '0' otherwise 103662306a36Sopenharmony_ci * 103762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 103862306a36Sopenharmony_ci */ 103962306a36Sopenharmony_ciint dpni_get_multicast_promisc(struct fsl_mc_io *mc_io, 104062306a36Sopenharmony_ci u32 cmd_flags, 104162306a36Sopenharmony_ci u16 token, 104262306a36Sopenharmony_ci int *en) 104362306a36Sopenharmony_ci{ 104462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 104562306a36Sopenharmony_ci struct dpni_rsp_get_multicast_promisc *rsp_params; 104662306a36Sopenharmony_ci int err; 104762306a36Sopenharmony_ci 104862306a36Sopenharmony_ci /* prepare command */ 104962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC, 105062306a36Sopenharmony_ci cmd_flags, 105162306a36Sopenharmony_ci token); 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ci /* send command to mc*/ 105462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 105562306a36Sopenharmony_ci if (err) 105662306a36Sopenharmony_ci return err; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci /* retrieve response parameters */ 105962306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params; 106062306a36Sopenharmony_ci *en = dpni_get_field(rsp_params->enabled, ENABLE); 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci return 0; 106362306a36Sopenharmony_ci} 106462306a36Sopenharmony_ci 106562306a36Sopenharmony_ci/** 106662306a36Sopenharmony_ci * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode 106762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 106862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 106962306a36Sopenharmony_ci * @token: Token of DPNI object 107062306a36Sopenharmony_ci * @en: Set to '1' to enable; '0' to disable 107162306a36Sopenharmony_ci * 107262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 107362306a36Sopenharmony_ci */ 107462306a36Sopenharmony_ciint dpni_set_unicast_promisc(struct fsl_mc_io *mc_io, 107562306a36Sopenharmony_ci u32 cmd_flags, 107662306a36Sopenharmony_ci u16 token, 107762306a36Sopenharmony_ci int en) 107862306a36Sopenharmony_ci{ 107962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 108062306a36Sopenharmony_ci struct dpni_cmd_set_unicast_promisc *cmd_params; 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_ci /* prepare command */ 108362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC, 108462306a36Sopenharmony_ci cmd_flags, 108562306a36Sopenharmony_ci token); 108662306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params; 108762306a36Sopenharmony_ci dpni_set_field(cmd_params->enable, ENABLE, en); 108862306a36Sopenharmony_ci 108962306a36Sopenharmony_ci /* send command to mc*/ 109062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 109162306a36Sopenharmony_ci} 109262306a36Sopenharmony_ci 109362306a36Sopenharmony_ci/** 109462306a36Sopenharmony_ci * dpni_get_unicast_promisc() - Get unicast promiscuous mode 109562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 109662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 109762306a36Sopenharmony_ci * @token: Token of DPNI object 109862306a36Sopenharmony_ci * @en: Returns '1' if enabled; '0' otherwise 109962306a36Sopenharmony_ci * 110062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 110162306a36Sopenharmony_ci */ 110262306a36Sopenharmony_ciint dpni_get_unicast_promisc(struct fsl_mc_io *mc_io, 110362306a36Sopenharmony_ci u32 cmd_flags, 110462306a36Sopenharmony_ci u16 token, 110562306a36Sopenharmony_ci int *en) 110662306a36Sopenharmony_ci{ 110762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 110862306a36Sopenharmony_ci struct dpni_rsp_get_unicast_promisc *rsp_params; 110962306a36Sopenharmony_ci int err; 111062306a36Sopenharmony_ci 111162306a36Sopenharmony_ci /* prepare command */ 111262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC, 111362306a36Sopenharmony_ci cmd_flags, 111462306a36Sopenharmony_ci token); 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci /* send command to mc*/ 111762306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 111862306a36Sopenharmony_ci if (err) 111962306a36Sopenharmony_ci return err; 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_ci /* retrieve response parameters */ 112262306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params; 112362306a36Sopenharmony_ci *en = dpni_get_field(rsp_params->enabled, ENABLE); 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_ci return 0; 112662306a36Sopenharmony_ci} 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_ci/** 112962306a36Sopenharmony_ci * dpni_set_primary_mac_addr() - Set the primary MAC address 113062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 113162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 113262306a36Sopenharmony_ci * @token: Token of DPNI object 113362306a36Sopenharmony_ci * @mac_addr: MAC address to set as primary address 113462306a36Sopenharmony_ci * 113562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 113662306a36Sopenharmony_ci */ 113762306a36Sopenharmony_ciint dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io, 113862306a36Sopenharmony_ci u32 cmd_flags, 113962306a36Sopenharmony_ci u16 token, 114062306a36Sopenharmony_ci const u8 mac_addr[6]) 114162306a36Sopenharmony_ci{ 114262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 114362306a36Sopenharmony_ci struct dpni_cmd_set_primary_mac_addr *cmd_params; 114462306a36Sopenharmony_ci int i; 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci /* prepare command */ 114762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC, 114862306a36Sopenharmony_ci cmd_flags, 114962306a36Sopenharmony_ci token); 115062306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params; 115162306a36Sopenharmony_ci for (i = 0; i < 6; i++) 115262306a36Sopenharmony_ci cmd_params->mac_addr[i] = mac_addr[5 - i]; 115362306a36Sopenharmony_ci 115462306a36Sopenharmony_ci /* send command to mc*/ 115562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 115662306a36Sopenharmony_ci} 115762306a36Sopenharmony_ci 115862306a36Sopenharmony_ci/** 115962306a36Sopenharmony_ci * dpni_get_primary_mac_addr() - Get the primary MAC address 116062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 116162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 116262306a36Sopenharmony_ci * @token: Token of DPNI object 116362306a36Sopenharmony_ci * @mac_addr: Returned MAC address 116462306a36Sopenharmony_ci * 116562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 116662306a36Sopenharmony_ci */ 116762306a36Sopenharmony_ciint dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io, 116862306a36Sopenharmony_ci u32 cmd_flags, 116962306a36Sopenharmony_ci u16 token, 117062306a36Sopenharmony_ci u8 mac_addr[6]) 117162306a36Sopenharmony_ci{ 117262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 117362306a36Sopenharmony_ci struct dpni_rsp_get_primary_mac_addr *rsp_params; 117462306a36Sopenharmony_ci int i, err; 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci /* prepare command */ 117762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC, 117862306a36Sopenharmony_ci cmd_flags, 117962306a36Sopenharmony_ci token); 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_ci /* send command to mc*/ 118262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 118362306a36Sopenharmony_ci if (err) 118462306a36Sopenharmony_ci return err; 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_ci /* retrieve response parameters */ 118762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params; 118862306a36Sopenharmony_ci for (i = 0; i < 6; i++) 118962306a36Sopenharmony_ci mac_addr[5 - i] = rsp_params->mac_addr[i]; 119062306a36Sopenharmony_ci 119162306a36Sopenharmony_ci return 0; 119262306a36Sopenharmony_ci} 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci/** 119562306a36Sopenharmony_ci * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical 119662306a36Sopenharmony_ci * port the DPNI is attached to 119762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 119862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 119962306a36Sopenharmony_ci * @token: Token of DPNI object 120062306a36Sopenharmony_ci * @mac_addr: MAC address of the physical port, if any, otherwise 0 120162306a36Sopenharmony_ci * 120262306a36Sopenharmony_ci * The primary MAC address is not cleared by this operation. 120362306a36Sopenharmony_ci * 120462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 120562306a36Sopenharmony_ci */ 120662306a36Sopenharmony_ciint dpni_get_port_mac_addr(struct fsl_mc_io *mc_io, 120762306a36Sopenharmony_ci u32 cmd_flags, 120862306a36Sopenharmony_ci u16 token, 120962306a36Sopenharmony_ci u8 mac_addr[6]) 121062306a36Sopenharmony_ci{ 121162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 121262306a36Sopenharmony_ci struct dpni_rsp_get_port_mac_addr *rsp_params; 121362306a36Sopenharmony_ci int i, err; 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci /* prepare command */ 121662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR, 121762306a36Sopenharmony_ci cmd_flags, 121862306a36Sopenharmony_ci token); 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci /* send command to mc*/ 122162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 122262306a36Sopenharmony_ci if (err) 122362306a36Sopenharmony_ci return err; 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci /* retrieve response parameters */ 122662306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params; 122762306a36Sopenharmony_ci for (i = 0; i < 6; i++) 122862306a36Sopenharmony_ci mac_addr[5 - i] = rsp_params->mac_addr[i]; 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_ci return 0; 123162306a36Sopenharmony_ci} 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci/** 123462306a36Sopenharmony_ci * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode 123562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 123662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 123762306a36Sopenharmony_ci * @token: Token of DPNI object 123862306a36Sopenharmony_ci * @en: Set to '1' to enable; '0' to disable 123962306a36Sopenharmony_ci * 124062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 124162306a36Sopenharmony_ci */ 124262306a36Sopenharmony_ciint dpni_enable_vlan_filter(struct fsl_mc_io *mc_io, 124362306a36Sopenharmony_ci u32 cmd_flags, 124462306a36Sopenharmony_ci u16 token, 124562306a36Sopenharmony_ci u32 en) 124662306a36Sopenharmony_ci{ 124762306a36Sopenharmony_ci struct dpni_cmd_enable_vlan_filter *cmd_params; 124862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 124962306a36Sopenharmony_ci 125062306a36Sopenharmony_ci /* prepare command */ 125162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER, 125262306a36Sopenharmony_ci cmd_flags, 125362306a36Sopenharmony_ci token); 125462306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params; 125562306a36Sopenharmony_ci dpni_set_field(cmd_params->en, ENABLE, en); 125662306a36Sopenharmony_ci 125762306a36Sopenharmony_ci /* send command to mc*/ 125862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 125962306a36Sopenharmony_ci} 126062306a36Sopenharmony_ci 126162306a36Sopenharmony_ci/** 126262306a36Sopenharmony_ci * dpni_add_vlan_id() - Add VLAN ID filter 126362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 126462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 126562306a36Sopenharmony_ci * @token: Token of DPNI object 126662306a36Sopenharmony_ci * @vlan_id: VLAN ID to add 126762306a36Sopenharmony_ci * @flags: 0 - tc_id and flow_id will be ignored. 126862306a36Sopenharmony_ci * Pkt with this vlan_id will be passed to the next 126962306a36Sopenharmony_ci * classification stages 127062306a36Sopenharmony_ci * DPNI_VLAN_SET_QUEUE_ACTION 127162306a36Sopenharmony_ci * Pkt with this vlan_id will be forward directly to 127262306a36Sopenharmony_ci * queue defined by the tc_id and flow_id 127362306a36Sopenharmony_ci * 127462306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7) 127562306a36Sopenharmony_ci * @flow_id: Selects the specific queue out of the set allocated for the 127662306a36Sopenharmony_ci * same as tc_id. Value must be in range 0 to NUM_QUEUES - 1 127762306a36Sopenharmony_ci * 127862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 127962306a36Sopenharmony_ci */ 128062306a36Sopenharmony_ciint dpni_add_vlan_id(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 128162306a36Sopenharmony_ci u16 vlan_id, u8 flags, u8 tc_id, u8 flow_id) 128262306a36Sopenharmony_ci{ 128362306a36Sopenharmony_ci struct dpni_cmd_vlan_id *cmd_params; 128462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 128562306a36Sopenharmony_ci 128662306a36Sopenharmony_ci /* prepare command */ 128762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID, 128862306a36Sopenharmony_ci cmd_flags, 128962306a36Sopenharmony_ci token); 129062306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_vlan_id *)cmd.params; 129162306a36Sopenharmony_ci cmd_params->flags = flags; 129262306a36Sopenharmony_ci cmd_params->tc_id = tc_id; 129362306a36Sopenharmony_ci cmd_params->flow_id = flow_id; 129462306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 129562306a36Sopenharmony_ci 129662306a36Sopenharmony_ci /* send command to mc*/ 129762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 129862306a36Sopenharmony_ci} 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci/** 130162306a36Sopenharmony_ci * dpni_remove_vlan_id() - Remove VLAN ID filter 130262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 130362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 130462306a36Sopenharmony_ci * @token: Token of DPNI object 130562306a36Sopenharmony_ci * @vlan_id: VLAN ID to remove 130662306a36Sopenharmony_ci * 130762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 130862306a36Sopenharmony_ci */ 130962306a36Sopenharmony_ciint dpni_remove_vlan_id(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 131062306a36Sopenharmony_ci u16 vlan_id) 131162306a36Sopenharmony_ci{ 131262306a36Sopenharmony_ci struct dpni_cmd_vlan_id *cmd_params; 131362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 131462306a36Sopenharmony_ci 131562306a36Sopenharmony_ci /* prepare command */ 131662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID, 131762306a36Sopenharmony_ci cmd_flags, 131862306a36Sopenharmony_ci token); 131962306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_vlan_id *)cmd.params; 132062306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci /* send command to mc*/ 132362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 132462306a36Sopenharmony_ci} 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci/** 132762306a36Sopenharmony_ci * dpni_add_mac_addr() - Add MAC address filter 132862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 132962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 133062306a36Sopenharmony_ci * @token: Token of DPNI object 133162306a36Sopenharmony_ci * @mac_addr: MAC address to add 133262306a36Sopenharmony_ci * 133362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 133462306a36Sopenharmony_ci */ 133562306a36Sopenharmony_ciint dpni_add_mac_addr(struct fsl_mc_io *mc_io, 133662306a36Sopenharmony_ci u32 cmd_flags, 133762306a36Sopenharmony_ci u16 token, 133862306a36Sopenharmony_ci const u8 mac_addr[6]) 133962306a36Sopenharmony_ci{ 134062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 134162306a36Sopenharmony_ci struct dpni_cmd_add_mac_addr *cmd_params; 134262306a36Sopenharmony_ci int i; 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_ci /* prepare command */ 134562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR, 134662306a36Sopenharmony_ci cmd_flags, 134762306a36Sopenharmony_ci token); 134862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params; 134962306a36Sopenharmony_ci for (i = 0; i < 6; i++) 135062306a36Sopenharmony_ci cmd_params->mac_addr[i] = mac_addr[5 - i]; 135162306a36Sopenharmony_ci 135262306a36Sopenharmony_ci /* send command to mc*/ 135362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 135462306a36Sopenharmony_ci} 135562306a36Sopenharmony_ci 135662306a36Sopenharmony_ci/** 135762306a36Sopenharmony_ci * dpni_remove_mac_addr() - Remove MAC address filter 135862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 135962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 136062306a36Sopenharmony_ci * @token: Token of DPNI object 136162306a36Sopenharmony_ci * @mac_addr: MAC address to remove 136262306a36Sopenharmony_ci * 136362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 136462306a36Sopenharmony_ci */ 136562306a36Sopenharmony_ciint dpni_remove_mac_addr(struct fsl_mc_io *mc_io, 136662306a36Sopenharmony_ci u32 cmd_flags, 136762306a36Sopenharmony_ci u16 token, 136862306a36Sopenharmony_ci const u8 mac_addr[6]) 136962306a36Sopenharmony_ci{ 137062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 137162306a36Sopenharmony_ci struct dpni_cmd_remove_mac_addr *cmd_params; 137262306a36Sopenharmony_ci int i; 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_ci /* prepare command */ 137562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR, 137662306a36Sopenharmony_ci cmd_flags, 137762306a36Sopenharmony_ci token); 137862306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params; 137962306a36Sopenharmony_ci for (i = 0; i < 6; i++) 138062306a36Sopenharmony_ci cmd_params->mac_addr[i] = mac_addr[5 - i]; 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci /* send command to mc*/ 138362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 138462306a36Sopenharmony_ci} 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci/** 138762306a36Sopenharmony_ci * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters 138862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 138962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 139062306a36Sopenharmony_ci * @token: Token of DPNI object 139162306a36Sopenharmony_ci * @unicast: Set to '1' to clear unicast addresses 139262306a36Sopenharmony_ci * @multicast: Set to '1' to clear multicast addresses 139362306a36Sopenharmony_ci * 139462306a36Sopenharmony_ci * The primary MAC address is not cleared by this operation. 139562306a36Sopenharmony_ci * 139662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 139762306a36Sopenharmony_ci */ 139862306a36Sopenharmony_ciint dpni_clear_mac_filters(struct fsl_mc_io *mc_io, 139962306a36Sopenharmony_ci u32 cmd_flags, 140062306a36Sopenharmony_ci u16 token, 140162306a36Sopenharmony_ci int unicast, 140262306a36Sopenharmony_ci int multicast) 140362306a36Sopenharmony_ci{ 140462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 140562306a36Sopenharmony_ci struct dpni_cmd_clear_mac_filters *cmd_params; 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci /* prepare command */ 140862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS, 140962306a36Sopenharmony_ci cmd_flags, 141062306a36Sopenharmony_ci token); 141162306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params; 141262306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast); 141362306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast); 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci /* send command to mc*/ 141662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 141762306a36Sopenharmony_ci} 141862306a36Sopenharmony_ci 141962306a36Sopenharmony_ci/** 142062306a36Sopenharmony_ci * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration 142162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 142262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 142362306a36Sopenharmony_ci * @token: Token of DPNI object 142462306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7) 142562306a36Sopenharmony_ci * @cfg: Traffic class distribution configuration 142662306a36Sopenharmony_ci * 142762306a36Sopenharmony_ci * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpni_prepare_key_cfg() 142862306a36Sopenharmony_ci * first to prepare the key_cfg_iova parameter 142962306a36Sopenharmony_ci * 143062306a36Sopenharmony_ci * Return: '0' on Success; error code otherwise. 143162306a36Sopenharmony_ci */ 143262306a36Sopenharmony_ciint dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io, 143362306a36Sopenharmony_ci u32 cmd_flags, 143462306a36Sopenharmony_ci u16 token, 143562306a36Sopenharmony_ci u8 tc_id, 143662306a36Sopenharmony_ci const struct dpni_rx_tc_dist_cfg *cfg) 143762306a36Sopenharmony_ci{ 143862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 143962306a36Sopenharmony_ci struct dpni_cmd_set_rx_tc_dist *cmd_params; 144062306a36Sopenharmony_ci 144162306a36Sopenharmony_ci /* prepare command */ 144262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST, 144362306a36Sopenharmony_ci cmd_flags, 144462306a36Sopenharmony_ci token); 144562306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params; 144662306a36Sopenharmony_ci cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 144762306a36Sopenharmony_ci cmd_params->tc_id = tc_id; 144862306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, DIST_MODE, cfg->dist_mode); 144962306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, MISS_ACTION, cfg->fs_cfg.miss_action); 145062306a36Sopenharmony_ci cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id); 145162306a36Sopenharmony_ci cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci /* send command to mc*/ 145462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 145562306a36Sopenharmony_ci} 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_ci/** 145862306a36Sopenharmony_ci * dpni_set_congestion_notification() - Set traffic class congestion 145962306a36Sopenharmony_ci * notification configuration 146062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 146162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 146262306a36Sopenharmony_ci * @token: Token of DPNI object 146362306a36Sopenharmony_ci * @qtype: Type of queue - Rx, Tx and Tx confirm types are supported 146462306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7) 146562306a36Sopenharmony_ci * @cfg: Congestion notification configuration 146662306a36Sopenharmony_ci * 146762306a36Sopenharmony_ci * Return: '0' on Success; error code otherwise. 146862306a36Sopenharmony_ci */ 146962306a36Sopenharmony_ciint dpni_set_congestion_notification( 147062306a36Sopenharmony_ci struct fsl_mc_io *mc_io, 147162306a36Sopenharmony_ci u32 cmd_flags, 147262306a36Sopenharmony_ci u16 token, 147362306a36Sopenharmony_ci enum dpni_queue_type qtype, 147462306a36Sopenharmony_ci u8 tc_id, 147562306a36Sopenharmony_ci const struct dpni_congestion_notification_cfg *cfg) 147662306a36Sopenharmony_ci{ 147762306a36Sopenharmony_ci struct dpni_cmd_set_congestion_notification *cmd_params; 147862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 147962306a36Sopenharmony_ci 148062306a36Sopenharmony_ci /* prepare command */ 148162306a36Sopenharmony_ci cmd.header = 148262306a36Sopenharmony_ci mc_encode_cmd_header(DPNI_CMDID_SET_CONGESTION_NOTIFICATION, 148362306a36Sopenharmony_ci cmd_flags, 148462306a36Sopenharmony_ci token); 148562306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params; 148662306a36Sopenharmony_ci cmd_params->qtype = qtype; 148762306a36Sopenharmony_ci cmd_params->tc = tc_id; 148862306a36Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 148962306a36Sopenharmony_ci cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode); 149062306a36Sopenharmony_ci cmd_params->dest_priority = cfg->dest_cfg.priority; 149162306a36Sopenharmony_ci dpni_set_field(cmd_params->type_units, DEST_TYPE, 149262306a36Sopenharmony_ci cfg->dest_cfg.dest_type); 149362306a36Sopenharmony_ci dpni_set_field(cmd_params->type_units, CONG_UNITS, cfg->units); 149462306a36Sopenharmony_ci cmd_params->message_iova = cpu_to_le64(cfg->message_iova); 149562306a36Sopenharmony_ci cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx); 149662306a36Sopenharmony_ci cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry); 149762306a36Sopenharmony_ci cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit); 149862306a36Sopenharmony_ci 149962306a36Sopenharmony_ci /* send command to mc*/ 150062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 150162306a36Sopenharmony_ci} 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci/** 150462306a36Sopenharmony_ci * dpni_set_queue() - Set queue parameters 150562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 150662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 150762306a36Sopenharmony_ci * @token: Token of DPNI object 150862306a36Sopenharmony_ci * @qtype: Type of queue - all queue types are supported, although 150962306a36Sopenharmony_ci * the command is ignored for Tx 151062306a36Sopenharmony_ci * @tc: Traffic class, in range 0 to NUM_TCS - 1 151162306a36Sopenharmony_ci * @index: Selects the specific queue out of the set allocated for the 151262306a36Sopenharmony_ci * same TC. Value must be in range 0 to NUM_QUEUES - 1 151362306a36Sopenharmony_ci * @options: A combination of DPNI_QUEUE_OPT_ values that control what 151462306a36Sopenharmony_ci * configuration options are set on the queue 151562306a36Sopenharmony_ci * @queue: Queue structure 151662306a36Sopenharmony_ci * 151762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 151862306a36Sopenharmony_ci */ 151962306a36Sopenharmony_ciint dpni_set_queue(struct fsl_mc_io *mc_io, 152062306a36Sopenharmony_ci u32 cmd_flags, 152162306a36Sopenharmony_ci u16 token, 152262306a36Sopenharmony_ci enum dpni_queue_type qtype, 152362306a36Sopenharmony_ci u8 tc, 152462306a36Sopenharmony_ci u8 index, 152562306a36Sopenharmony_ci u8 options, 152662306a36Sopenharmony_ci const struct dpni_queue *queue) 152762306a36Sopenharmony_ci{ 152862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 152962306a36Sopenharmony_ci struct dpni_cmd_set_queue *cmd_params; 153062306a36Sopenharmony_ci 153162306a36Sopenharmony_ci /* prepare command */ 153262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE, 153362306a36Sopenharmony_ci cmd_flags, 153462306a36Sopenharmony_ci token); 153562306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_queue *)cmd.params; 153662306a36Sopenharmony_ci cmd_params->qtype = qtype; 153762306a36Sopenharmony_ci cmd_params->tc = tc; 153862306a36Sopenharmony_ci cmd_params->index = index; 153962306a36Sopenharmony_ci cmd_params->options = options; 154062306a36Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(queue->destination.id); 154162306a36Sopenharmony_ci cmd_params->dest_prio = queue->destination.priority; 154262306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type); 154362306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control); 154462306a36Sopenharmony_ci dpni_set_field(cmd_params->flags, HOLD_ACTIVE, 154562306a36Sopenharmony_ci queue->destination.hold_active); 154662306a36Sopenharmony_ci cmd_params->flc = cpu_to_le64(queue->flc.value); 154762306a36Sopenharmony_ci cmd_params->user_context = cpu_to_le64(queue->user_context); 154862306a36Sopenharmony_ci 154962306a36Sopenharmony_ci /* send command to mc */ 155062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 155162306a36Sopenharmony_ci} 155262306a36Sopenharmony_ci 155362306a36Sopenharmony_ci/** 155462306a36Sopenharmony_ci * dpni_get_queue() - Get queue parameters 155562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 155662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 155762306a36Sopenharmony_ci * @token: Token of DPNI object 155862306a36Sopenharmony_ci * @qtype: Type of queue - all queue types are supported 155962306a36Sopenharmony_ci * @tc: Traffic class, in range 0 to NUM_TCS - 1 156062306a36Sopenharmony_ci * @index: Selects the specific queue out of the set allocated for the 156162306a36Sopenharmony_ci * same TC. Value must be in range 0 to NUM_QUEUES - 1 156262306a36Sopenharmony_ci * @queue: Queue configuration structure 156362306a36Sopenharmony_ci * @qid: Queue identification 156462306a36Sopenharmony_ci * 156562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 156662306a36Sopenharmony_ci */ 156762306a36Sopenharmony_ciint dpni_get_queue(struct fsl_mc_io *mc_io, 156862306a36Sopenharmony_ci u32 cmd_flags, 156962306a36Sopenharmony_ci u16 token, 157062306a36Sopenharmony_ci enum dpni_queue_type qtype, 157162306a36Sopenharmony_ci u8 tc, 157262306a36Sopenharmony_ci u8 index, 157362306a36Sopenharmony_ci struct dpni_queue *queue, 157462306a36Sopenharmony_ci struct dpni_queue_id *qid) 157562306a36Sopenharmony_ci{ 157662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 157762306a36Sopenharmony_ci struct dpni_cmd_get_queue *cmd_params; 157862306a36Sopenharmony_ci struct dpni_rsp_get_queue *rsp_params; 157962306a36Sopenharmony_ci int err; 158062306a36Sopenharmony_ci 158162306a36Sopenharmony_ci /* prepare command */ 158262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE, 158362306a36Sopenharmony_ci cmd_flags, 158462306a36Sopenharmony_ci token); 158562306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_queue *)cmd.params; 158662306a36Sopenharmony_ci cmd_params->qtype = qtype; 158762306a36Sopenharmony_ci cmd_params->tc = tc; 158862306a36Sopenharmony_ci cmd_params->index = index; 158962306a36Sopenharmony_ci 159062306a36Sopenharmony_ci /* send command to mc */ 159162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 159262306a36Sopenharmony_ci if (err) 159362306a36Sopenharmony_ci return err; 159462306a36Sopenharmony_ci 159562306a36Sopenharmony_ci /* retrieve response parameters */ 159662306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_queue *)cmd.params; 159762306a36Sopenharmony_ci queue->destination.id = le32_to_cpu(rsp_params->dest_id); 159862306a36Sopenharmony_ci queue->destination.priority = rsp_params->dest_prio; 159962306a36Sopenharmony_ci queue->destination.type = dpni_get_field(rsp_params->flags, 160062306a36Sopenharmony_ci DEST_TYPE); 160162306a36Sopenharmony_ci queue->flc.stash_control = dpni_get_field(rsp_params->flags, 160262306a36Sopenharmony_ci STASH_CTRL); 160362306a36Sopenharmony_ci queue->destination.hold_active = dpni_get_field(rsp_params->flags, 160462306a36Sopenharmony_ci HOLD_ACTIVE); 160562306a36Sopenharmony_ci queue->flc.value = le64_to_cpu(rsp_params->flc); 160662306a36Sopenharmony_ci queue->user_context = le64_to_cpu(rsp_params->user_context); 160762306a36Sopenharmony_ci qid->fqid = le32_to_cpu(rsp_params->fqid); 160862306a36Sopenharmony_ci qid->qdbin = le16_to_cpu(rsp_params->qdbin); 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_ci return 0; 161162306a36Sopenharmony_ci} 161262306a36Sopenharmony_ci 161362306a36Sopenharmony_ci/** 161462306a36Sopenharmony_ci * dpni_get_statistics() - Get DPNI statistics 161562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 161662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 161762306a36Sopenharmony_ci * @token: Token of DPNI object 161862306a36Sopenharmony_ci * @page: Selects the statistics page to retrieve, see 161962306a36Sopenharmony_ci * DPNI_GET_STATISTICS output. Pages are numbered 0 to 6. 162062306a36Sopenharmony_ci * @stat: Structure containing the statistics 162162306a36Sopenharmony_ci * 162262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 162362306a36Sopenharmony_ci */ 162462306a36Sopenharmony_ciint dpni_get_statistics(struct fsl_mc_io *mc_io, 162562306a36Sopenharmony_ci u32 cmd_flags, 162662306a36Sopenharmony_ci u16 token, 162762306a36Sopenharmony_ci u8 page, 162862306a36Sopenharmony_ci union dpni_statistics *stat) 162962306a36Sopenharmony_ci{ 163062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 163162306a36Sopenharmony_ci struct dpni_cmd_get_statistics *cmd_params; 163262306a36Sopenharmony_ci struct dpni_rsp_get_statistics *rsp_params; 163362306a36Sopenharmony_ci int i, err; 163462306a36Sopenharmony_ci 163562306a36Sopenharmony_ci /* prepare command */ 163662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS, 163762306a36Sopenharmony_ci cmd_flags, 163862306a36Sopenharmony_ci token); 163962306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_statistics *)cmd.params; 164062306a36Sopenharmony_ci cmd_params->page_number = page; 164162306a36Sopenharmony_ci 164262306a36Sopenharmony_ci /* send command to mc */ 164362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 164462306a36Sopenharmony_ci if (err) 164562306a36Sopenharmony_ci return err; 164662306a36Sopenharmony_ci 164762306a36Sopenharmony_ci /* retrieve response parameters */ 164862306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_statistics *)cmd.params; 164962306a36Sopenharmony_ci for (i = 0; i < DPNI_STATISTICS_CNT; i++) 165062306a36Sopenharmony_ci stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]); 165162306a36Sopenharmony_ci 165262306a36Sopenharmony_ci return 0; 165362306a36Sopenharmony_ci} 165462306a36Sopenharmony_ci 165562306a36Sopenharmony_ci/** 165662306a36Sopenharmony_ci * dpni_set_taildrop() - Set taildrop per queue or TC 165762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 165862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 165962306a36Sopenharmony_ci * @token: Token of DPNI object 166062306a36Sopenharmony_ci * @cg_point: Congestion point 166162306a36Sopenharmony_ci * @qtype: Queue type on which the taildrop is configured. 166262306a36Sopenharmony_ci * Only Rx queues are supported for now 166362306a36Sopenharmony_ci * @tc: Traffic class to apply this taildrop to 166462306a36Sopenharmony_ci * @index: Index of the queue if the DPNI supports multiple queues for 166562306a36Sopenharmony_ci * traffic distribution. Ignored if CONGESTION_POINT is not 0. 166662306a36Sopenharmony_ci * @taildrop: Taildrop structure 166762306a36Sopenharmony_ci * 166862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 166962306a36Sopenharmony_ci */ 167062306a36Sopenharmony_ciint dpni_set_taildrop(struct fsl_mc_io *mc_io, 167162306a36Sopenharmony_ci u32 cmd_flags, 167262306a36Sopenharmony_ci u16 token, 167362306a36Sopenharmony_ci enum dpni_congestion_point cg_point, 167462306a36Sopenharmony_ci enum dpni_queue_type qtype, 167562306a36Sopenharmony_ci u8 tc, 167662306a36Sopenharmony_ci u8 index, 167762306a36Sopenharmony_ci struct dpni_taildrop *taildrop) 167862306a36Sopenharmony_ci{ 167962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 168062306a36Sopenharmony_ci struct dpni_cmd_set_taildrop *cmd_params; 168162306a36Sopenharmony_ci 168262306a36Sopenharmony_ci /* prepare command */ 168362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP, 168462306a36Sopenharmony_ci cmd_flags, 168562306a36Sopenharmony_ci token); 168662306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params; 168762306a36Sopenharmony_ci cmd_params->congestion_point = cg_point; 168862306a36Sopenharmony_ci cmd_params->qtype = qtype; 168962306a36Sopenharmony_ci cmd_params->tc = tc; 169062306a36Sopenharmony_ci cmd_params->index = index; 169162306a36Sopenharmony_ci dpni_set_field(cmd_params->enable, ENABLE, taildrop->enable); 169262306a36Sopenharmony_ci cmd_params->units = taildrop->units; 169362306a36Sopenharmony_ci cmd_params->threshold = cpu_to_le32(taildrop->threshold); 169462306a36Sopenharmony_ci 169562306a36Sopenharmony_ci /* send command to mc */ 169662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 169762306a36Sopenharmony_ci} 169862306a36Sopenharmony_ci 169962306a36Sopenharmony_ci/** 170062306a36Sopenharmony_ci * dpni_get_taildrop() - Get taildrop information 170162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 170262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 170362306a36Sopenharmony_ci * @token: Token of DPNI object 170462306a36Sopenharmony_ci * @cg_point: Congestion point 170562306a36Sopenharmony_ci * @qtype: Queue type on which the taildrop is configured. 170662306a36Sopenharmony_ci * Only Rx queues are supported for now 170762306a36Sopenharmony_ci * @tc: Traffic class to apply this taildrop to 170862306a36Sopenharmony_ci * @index: Index of the queue if the DPNI supports multiple queues for 170962306a36Sopenharmony_ci * traffic distribution. Ignored if CONGESTION_POINT is not 0. 171062306a36Sopenharmony_ci * @taildrop: Taildrop structure 171162306a36Sopenharmony_ci * 171262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 171362306a36Sopenharmony_ci */ 171462306a36Sopenharmony_ciint dpni_get_taildrop(struct fsl_mc_io *mc_io, 171562306a36Sopenharmony_ci u32 cmd_flags, 171662306a36Sopenharmony_ci u16 token, 171762306a36Sopenharmony_ci enum dpni_congestion_point cg_point, 171862306a36Sopenharmony_ci enum dpni_queue_type qtype, 171962306a36Sopenharmony_ci u8 tc, 172062306a36Sopenharmony_ci u8 index, 172162306a36Sopenharmony_ci struct dpni_taildrop *taildrop) 172262306a36Sopenharmony_ci{ 172362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 172462306a36Sopenharmony_ci struct dpni_cmd_get_taildrop *cmd_params; 172562306a36Sopenharmony_ci struct dpni_rsp_get_taildrop *rsp_params; 172662306a36Sopenharmony_ci int err; 172762306a36Sopenharmony_ci 172862306a36Sopenharmony_ci /* prepare command */ 172962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP, 173062306a36Sopenharmony_ci cmd_flags, 173162306a36Sopenharmony_ci token); 173262306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params; 173362306a36Sopenharmony_ci cmd_params->congestion_point = cg_point; 173462306a36Sopenharmony_ci cmd_params->qtype = qtype; 173562306a36Sopenharmony_ci cmd_params->tc = tc; 173662306a36Sopenharmony_ci cmd_params->index = index; 173762306a36Sopenharmony_ci 173862306a36Sopenharmony_ci /* send command to mc */ 173962306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 174062306a36Sopenharmony_ci if (err) 174162306a36Sopenharmony_ci return err; 174262306a36Sopenharmony_ci 174362306a36Sopenharmony_ci /* retrieve response parameters */ 174462306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params; 174562306a36Sopenharmony_ci taildrop->enable = dpni_get_field(rsp_params->enable, ENABLE); 174662306a36Sopenharmony_ci taildrop->units = rsp_params->units; 174762306a36Sopenharmony_ci taildrop->threshold = le32_to_cpu(rsp_params->threshold); 174862306a36Sopenharmony_ci 174962306a36Sopenharmony_ci return 0; 175062306a36Sopenharmony_ci} 175162306a36Sopenharmony_ci 175262306a36Sopenharmony_ci/** 175362306a36Sopenharmony_ci * dpni_get_api_version() - Get Data Path Network Interface API version 175462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 175562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 175662306a36Sopenharmony_ci * @major_ver: Major version of data path network interface API 175762306a36Sopenharmony_ci * @minor_ver: Minor version of data path network interface API 175862306a36Sopenharmony_ci * 175962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 176062306a36Sopenharmony_ci */ 176162306a36Sopenharmony_ciint dpni_get_api_version(struct fsl_mc_io *mc_io, 176262306a36Sopenharmony_ci u32 cmd_flags, 176362306a36Sopenharmony_ci u16 *major_ver, 176462306a36Sopenharmony_ci u16 *minor_ver) 176562306a36Sopenharmony_ci{ 176662306a36Sopenharmony_ci struct dpni_rsp_get_api_version *rsp_params; 176762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 176862306a36Sopenharmony_ci int err; 176962306a36Sopenharmony_ci 177062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION, 177162306a36Sopenharmony_ci cmd_flags, 0); 177262306a36Sopenharmony_ci 177362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 177462306a36Sopenharmony_ci if (err) 177562306a36Sopenharmony_ci return err; 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_get_api_version *)cmd.params; 177862306a36Sopenharmony_ci *major_ver = le16_to_cpu(rsp_params->major); 177962306a36Sopenharmony_ci *minor_ver = le16_to_cpu(rsp_params->minor); 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci return 0; 178262306a36Sopenharmony_ci} 178362306a36Sopenharmony_ci 178462306a36Sopenharmony_ci/** 178562306a36Sopenharmony_ci * dpni_set_rx_fs_dist() - Set Rx flow steering distribution 178662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 178762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 178862306a36Sopenharmony_ci * @token: Token of DPNI object 178962306a36Sopenharmony_ci * @cfg: Distribution configuration 179062306a36Sopenharmony_ci * 179162306a36Sopenharmony_ci * If the FS is already enabled with a previous call the classification 179262306a36Sopenharmony_ci * key will be changed but all the table rules are kept. If the 179362306a36Sopenharmony_ci * existing rules do not match the key the results will not be 179462306a36Sopenharmony_ci * predictable. It is the user responsibility to keep key integrity. 179562306a36Sopenharmony_ci * If cfg.enable is set to 1 the command will create a flow steering table 179662306a36Sopenharmony_ci * and will classify packets according to this table. The packets that 179762306a36Sopenharmony_ci * miss all the table rules will be classified according to settings 179862306a36Sopenharmony_ci * made in dpni_set_rx_hash_dist() 179962306a36Sopenharmony_ci * If cfg.enable is set to 0 the command will clear flow steering table. 180062306a36Sopenharmony_ci * The packets will be classified according to settings made in 180162306a36Sopenharmony_ci * dpni_set_rx_hash_dist() 180262306a36Sopenharmony_ci * 180362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 180462306a36Sopenharmony_ci */ 180562306a36Sopenharmony_ciint dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, 180662306a36Sopenharmony_ci u32 cmd_flags, 180762306a36Sopenharmony_ci u16 token, 180862306a36Sopenharmony_ci const struct dpni_rx_dist_cfg *cfg) 180962306a36Sopenharmony_ci{ 181062306a36Sopenharmony_ci struct dpni_cmd_set_rx_fs_dist *cmd_params; 181162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci /* prepare command */ 181462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST, 181562306a36Sopenharmony_ci cmd_flags, 181662306a36Sopenharmony_ci token); 181762306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params; 181862306a36Sopenharmony_ci cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 181962306a36Sopenharmony_ci dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable); 182062306a36Sopenharmony_ci cmd_params->tc = cfg->tc; 182162306a36Sopenharmony_ci cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id); 182262306a36Sopenharmony_ci cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 182362306a36Sopenharmony_ci 182462306a36Sopenharmony_ci /* send command to mc*/ 182562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 182662306a36Sopenharmony_ci} 182762306a36Sopenharmony_ci 182862306a36Sopenharmony_ci/** 182962306a36Sopenharmony_ci * dpni_set_rx_hash_dist() - Set Rx hash distribution 183062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 183162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 183262306a36Sopenharmony_ci * @token: Token of DPNI object 183362306a36Sopenharmony_ci * @cfg: Distribution configuration 183462306a36Sopenharmony_ci * If cfg.enable is set to 1 the packets will be classified using a hash 183562306a36Sopenharmony_ci * function based on the key received in cfg.key_cfg_iova parameter. 183662306a36Sopenharmony_ci * If cfg.enable is set to 0 the packets will be sent to the default queue 183762306a36Sopenharmony_ci * 183862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 183962306a36Sopenharmony_ci */ 184062306a36Sopenharmony_ciint dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, 184162306a36Sopenharmony_ci u32 cmd_flags, 184262306a36Sopenharmony_ci u16 token, 184362306a36Sopenharmony_ci const struct dpni_rx_dist_cfg *cfg) 184462306a36Sopenharmony_ci{ 184562306a36Sopenharmony_ci struct dpni_cmd_set_rx_hash_dist *cmd_params; 184662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 184762306a36Sopenharmony_ci 184862306a36Sopenharmony_ci /* prepare command */ 184962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST, 185062306a36Sopenharmony_ci cmd_flags, 185162306a36Sopenharmony_ci token); 185262306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params; 185362306a36Sopenharmony_ci cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 185462306a36Sopenharmony_ci dpni_set_field(cmd_params->enable, RX_HASH_DIST_ENABLE, cfg->enable); 185562306a36Sopenharmony_ci cmd_params->tc = cfg->tc; 185662306a36Sopenharmony_ci cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 185762306a36Sopenharmony_ci 185862306a36Sopenharmony_ci /* send command to mc*/ 185962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 186062306a36Sopenharmony_ci} 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci/** 186362306a36Sopenharmony_ci * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class 186462306a36Sopenharmony_ci * (to select a flow ID) 186562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 186662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 186762306a36Sopenharmony_ci * @token: Token of DPNI object 186862306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7) 186962306a36Sopenharmony_ci * @index: Location in the FS table where to insert the entry. 187062306a36Sopenharmony_ci * Only relevant if MASKING is enabled for FS 187162306a36Sopenharmony_ci * classification on this DPNI, it is ignored for exact match. 187262306a36Sopenharmony_ci * @cfg: Flow steering rule to add 187362306a36Sopenharmony_ci * @action: Action to be taken as result of a classification hit 187462306a36Sopenharmony_ci * 187562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 187662306a36Sopenharmony_ci */ 187762306a36Sopenharmony_ciint dpni_add_fs_entry(struct fsl_mc_io *mc_io, 187862306a36Sopenharmony_ci u32 cmd_flags, 187962306a36Sopenharmony_ci u16 token, 188062306a36Sopenharmony_ci u8 tc_id, 188162306a36Sopenharmony_ci u16 index, 188262306a36Sopenharmony_ci const struct dpni_rule_cfg *cfg, 188362306a36Sopenharmony_ci const struct dpni_fs_action_cfg *action) 188462306a36Sopenharmony_ci{ 188562306a36Sopenharmony_ci struct dpni_cmd_add_fs_entry *cmd_params; 188662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 188762306a36Sopenharmony_ci 188862306a36Sopenharmony_ci /* prepare command */ 188962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT, 189062306a36Sopenharmony_ci cmd_flags, 189162306a36Sopenharmony_ci token); 189262306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params; 189362306a36Sopenharmony_ci cmd_params->tc_id = tc_id; 189462306a36Sopenharmony_ci cmd_params->key_size = cfg->key_size; 189562306a36Sopenharmony_ci cmd_params->index = cpu_to_le16(index); 189662306a36Sopenharmony_ci cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 189762306a36Sopenharmony_ci cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 189862306a36Sopenharmony_ci cmd_params->options = cpu_to_le16(action->options); 189962306a36Sopenharmony_ci cmd_params->flow_id = cpu_to_le16(action->flow_id); 190062306a36Sopenharmony_ci cmd_params->flc = cpu_to_le64(action->flc); 190162306a36Sopenharmony_ci 190262306a36Sopenharmony_ci /* send command to mc*/ 190362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 190462306a36Sopenharmony_ci} 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_ci/** 190762306a36Sopenharmony_ci * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific 190862306a36Sopenharmony_ci * traffic class 190962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 191062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 191162306a36Sopenharmony_ci * @token: Token of DPNI object 191262306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7) 191362306a36Sopenharmony_ci * @cfg: Flow steering rule to remove 191462306a36Sopenharmony_ci * 191562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 191662306a36Sopenharmony_ci */ 191762306a36Sopenharmony_ciint dpni_remove_fs_entry(struct fsl_mc_io *mc_io, 191862306a36Sopenharmony_ci u32 cmd_flags, 191962306a36Sopenharmony_ci u16 token, 192062306a36Sopenharmony_ci u8 tc_id, 192162306a36Sopenharmony_ci const struct dpni_rule_cfg *cfg) 192262306a36Sopenharmony_ci{ 192362306a36Sopenharmony_ci struct dpni_cmd_remove_fs_entry *cmd_params; 192462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 192562306a36Sopenharmony_ci 192662306a36Sopenharmony_ci /* prepare command */ 192762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT, 192862306a36Sopenharmony_ci cmd_flags, 192962306a36Sopenharmony_ci token); 193062306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params; 193162306a36Sopenharmony_ci cmd_params->tc_id = tc_id; 193262306a36Sopenharmony_ci cmd_params->key_size = cfg->key_size; 193362306a36Sopenharmony_ci cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 193462306a36Sopenharmony_ci cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci /* send command to mc*/ 193762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 193862306a36Sopenharmony_ci} 193962306a36Sopenharmony_ci 194062306a36Sopenharmony_ci/** 194162306a36Sopenharmony_ci * dpni_set_qos_table() - Set QoS mapping table 194262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 194362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 194462306a36Sopenharmony_ci * @token: Token of DPNI object 194562306a36Sopenharmony_ci * @cfg: QoS table configuration 194662306a36Sopenharmony_ci * 194762306a36Sopenharmony_ci * This function and all QoS-related functions require that 194862306a36Sopenharmony_ci *'max_tcs > 1' was set at DPNI creation. 194962306a36Sopenharmony_ci * 195062306a36Sopenharmony_ci * warning: Before calling this function, call dpkg_prepare_key_cfg() to 195162306a36Sopenharmony_ci * prepare the key_cfg_iova parameter 195262306a36Sopenharmony_ci * 195362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 195462306a36Sopenharmony_ci */ 195562306a36Sopenharmony_ciint dpni_set_qos_table(struct fsl_mc_io *mc_io, 195662306a36Sopenharmony_ci u32 cmd_flags, 195762306a36Sopenharmony_ci u16 token, 195862306a36Sopenharmony_ci const struct dpni_qos_tbl_cfg *cfg) 195962306a36Sopenharmony_ci{ 196062306a36Sopenharmony_ci struct dpni_cmd_set_qos_table *cmd_params; 196162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 196262306a36Sopenharmony_ci 196362306a36Sopenharmony_ci /* prepare command */ 196462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL, 196562306a36Sopenharmony_ci cmd_flags, 196662306a36Sopenharmony_ci token); 196762306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params; 196862306a36Sopenharmony_ci cmd_params->default_tc = cfg->default_tc; 196962306a36Sopenharmony_ci cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 197062306a36Sopenharmony_ci dpni_set_field(cmd_params->discard_on_miss, DISCARD_ON_MISS, 197162306a36Sopenharmony_ci cfg->discard_on_miss); 197262306a36Sopenharmony_ci 197362306a36Sopenharmony_ci /* send command to mc*/ 197462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 197562306a36Sopenharmony_ci} 197662306a36Sopenharmony_ci 197762306a36Sopenharmony_ci/** 197862306a36Sopenharmony_ci * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class) 197962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 198062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 198162306a36Sopenharmony_ci * @token: Token of DPNI object 198262306a36Sopenharmony_ci * @cfg: QoS rule to add 198362306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7) 198462306a36Sopenharmony_ci * @index: Location in the QoS table where to insert the entry. 198562306a36Sopenharmony_ci * Only relevant if MASKING is enabled for QoS classification on 198662306a36Sopenharmony_ci * this DPNI, it is ignored for exact match. 198762306a36Sopenharmony_ci * 198862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 198962306a36Sopenharmony_ci */ 199062306a36Sopenharmony_ciint dpni_add_qos_entry(struct fsl_mc_io *mc_io, 199162306a36Sopenharmony_ci u32 cmd_flags, 199262306a36Sopenharmony_ci u16 token, 199362306a36Sopenharmony_ci const struct dpni_rule_cfg *cfg, 199462306a36Sopenharmony_ci u8 tc_id, 199562306a36Sopenharmony_ci u16 index) 199662306a36Sopenharmony_ci{ 199762306a36Sopenharmony_ci struct dpni_cmd_add_qos_entry *cmd_params; 199862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 199962306a36Sopenharmony_ci 200062306a36Sopenharmony_ci /* prepare command */ 200162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT, 200262306a36Sopenharmony_ci cmd_flags, 200362306a36Sopenharmony_ci token); 200462306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params; 200562306a36Sopenharmony_ci cmd_params->tc_id = tc_id; 200662306a36Sopenharmony_ci cmd_params->key_size = cfg->key_size; 200762306a36Sopenharmony_ci cmd_params->index = cpu_to_le16(index); 200862306a36Sopenharmony_ci cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 200962306a36Sopenharmony_ci cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 201062306a36Sopenharmony_ci 201162306a36Sopenharmony_ci /* send command to mc*/ 201262306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 201362306a36Sopenharmony_ci} 201462306a36Sopenharmony_ci 201562306a36Sopenharmony_ci/** 201662306a36Sopenharmony_ci * dpni_remove_qos_entry() - Remove QoS mapping entry 201762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 201862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 201962306a36Sopenharmony_ci * @token: Token of DPNI object 202062306a36Sopenharmony_ci * @cfg: QoS rule to remove 202162306a36Sopenharmony_ci * 202262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 202362306a36Sopenharmony_ci */ 202462306a36Sopenharmony_ciint dpni_remove_qos_entry(struct fsl_mc_io *mc_io, 202562306a36Sopenharmony_ci u32 cmd_flags, 202662306a36Sopenharmony_ci u16 token, 202762306a36Sopenharmony_ci const struct dpni_rule_cfg *cfg) 202862306a36Sopenharmony_ci{ 202962306a36Sopenharmony_ci struct dpni_cmd_remove_qos_entry *cmd_params; 203062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 203162306a36Sopenharmony_ci 203262306a36Sopenharmony_ci /* prepare command */ 203362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT, 203462306a36Sopenharmony_ci cmd_flags, 203562306a36Sopenharmony_ci token); 203662306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params; 203762306a36Sopenharmony_ci cmd_params->key_size = cfg->key_size; 203862306a36Sopenharmony_ci cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 203962306a36Sopenharmony_ci cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova); 204062306a36Sopenharmony_ci 204162306a36Sopenharmony_ci /* send command to mc*/ 204262306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 204362306a36Sopenharmony_ci} 204462306a36Sopenharmony_ci 204562306a36Sopenharmony_ci/** 204662306a36Sopenharmony_ci * dpni_clear_qos_table() - Clear all QoS mapping entries 204762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 204862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 204962306a36Sopenharmony_ci * @token: Token of DPNI object 205062306a36Sopenharmony_ci * 205162306a36Sopenharmony_ci * Following this function call, all frames are directed to 205262306a36Sopenharmony_ci * the default traffic class (0) 205362306a36Sopenharmony_ci * 205462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 205562306a36Sopenharmony_ci */ 205662306a36Sopenharmony_ciint dpni_clear_qos_table(struct fsl_mc_io *mc_io, 205762306a36Sopenharmony_ci u32 cmd_flags, 205862306a36Sopenharmony_ci u16 token) 205962306a36Sopenharmony_ci{ 206062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 206162306a36Sopenharmony_ci 206262306a36Sopenharmony_ci /* prepare command */ 206362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL, 206462306a36Sopenharmony_ci cmd_flags, 206562306a36Sopenharmony_ci token); 206662306a36Sopenharmony_ci 206762306a36Sopenharmony_ci /* send command to mc*/ 206862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 206962306a36Sopenharmony_ci} 207062306a36Sopenharmony_ci 207162306a36Sopenharmony_ci/** 207262306a36Sopenharmony_ci * dpni_set_tx_shaping() - Set the transmit shaping 207362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 207462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 207562306a36Sopenharmony_ci * @token: Token of DPNI object 207662306a36Sopenharmony_ci * @tx_cr_shaper: TX committed rate shaping configuration 207762306a36Sopenharmony_ci * @tx_er_shaper: TX excess rate shaping configuration 207862306a36Sopenharmony_ci * @coupled: Committed and excess rate shapers are coupled 207962306a36Sopenharmony_ci * 208062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 208162306a36Sopenharmony_ci */ 208262306a36Sopenharmony_ciint dpni_set_tx_shaping(struct fsl_mc_io *mc_io, 208362306a36Sopenharmony_ci u32 cmd_flags, 208462306a36Sopenharmony_ci u16 token, 208562306a36Sopenharmony_ci const struct dpni_tx_shaping_cfg *tx_cr_shaper, 208662306a36Sopenharmony_ci const struct dpni_tx_shaping_cfg *tx_er_shaper, 208762306a36Sopenharmony_ci int coupled) 208862306a36Sopenharmony_ci{ 208962306a36Sopenharmony_ci struct dpni_cmd_set_tx_shaping *cmd_params; 209062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 209162306a36Sopenharmony_ci 209262306a36Sopenharmony_ci /* prepare command */ 209362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_SHAPING, 209462306a36Sopenharmony_ci cmd_flags, 209562306a36Sopenharmony_ci token); 209662306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_set_tx_shaping *)cmd.params; 209762306a36Sopenharmony_ci cmd_params->tx_cr_max_burst_size = cpu_to_le16(tx_cr_shaper->max_burst_size); 209862306a36Sopenharmony_ci cmd_params->tx_er_max_burst_size = cpu_to_le16(tx_er_shaper->max_burst_size); 209962306a36Sopenharmony_ci cmd_params->tx_cr_rate_limit = cpu_to_le32(tx_cr_shaper->rate_limit); 210062306a36Sopenharmony_ci cmd_params->tx_er_rate_limit = cpu_to_le32(tx_er_shaper->rate_limit); 210162306a36Sopenharmony_ci dpni_set_field(cmd_params->coupled, COUPLED, coupled); 210262306a36Sopenharmony_ci 210362306a36Sopenharmony_ci /* send command to mc*/ 210462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 210562306a36Sopenharmony_ci} 210662306a36Sopenharmony_ci 210762306a36Sopenharmony_ci/** 210862306a36Sopenharmony_ci * dpni_get_single_step_cfg() - return current configuration for 210962306a36Sopenharmony_ci * single step PTP 211062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 211162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 211262306a36Sopenharmony_ci * @token: Token of DPNI object 211362306a36Sopenharmony_ci * @ptp_cfg: ptp single step configuration 211462306a36Sopenharmony_ci * 211562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 211662306a36Sopenharmony_ci * 211762306a36Sopenharmony_ci */ 211862306a36Sopenharmony_ciint dpni_get_single_step_cfg(struct fsl_mc_io *mc_io, 211962306a36Sopenharmony_ci u32 cmd_flags, 212062306a36Sopenharmony_ci u16 token, 212162306a36Sopenharmony_ci struct dpni_single_step_cfg *ptp_cfg) 212262306a36Sopenharmony_ci{ 212362306a36Sopenharmony_ci struct dpni_rsp_single_step_cfg *rsp_params; 212462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 212562306a36Sopenharmony_ci int err; 212662306a36Sopenharmony_ci 212762306a36Sopenharmony_ci /* prepare command */ 212862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG, 212962306a36Sopenharmony_ci cmd_flags, token); 213062306a36Sopenharmony_ci /* send command to mc*/ 213162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 213262306a36Sopenharmony_ci if (err) 213362306a36Sopenharmony_ci return err; 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci /* read command response */ 213662306a36Sopenharmony_ci rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params; 213762306a36Sopenharmony_ci ptp_cfg->offset = le16_to_cpu(rsp_params->offset); 213862306a36Sopenharmony_ci ptp_cfg->en = dpni_get_field(le16_to_cpu(rsp_params->flags), 213962306a36Sopenharmony_ci PTP_ENABLE) ? 1 : 0; 214062306a36Sopenharmony_ci ptp_cfg->ch_update = dpni_get_field(le16_to_cpu(rsp_params->flags), 214162306a36Sopenharmony_ci PTP_CH_UPDATE) ? 1 : 0; 214262306a36Sopenharmony_ci ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay); 214362306a36Sopenharmony_ci ptp_cfg->ptp_onestep_reg_base = 214462306a36Sopenharmony_ci le32_to_cpu(rsp_params->ptp_onestep_reg_base); 214562306a36Sopenharmony_ci 214662306a36Sopenharmony_ci return err; 214762306a36Sopenharmony_ci} 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci/** 215062306a36Sopenharmony_ci * dpni_set_single_step_cfg() - enable/disable and configure single step PTP 215162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 215262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 215362306a36Sopenharmony_ci * @token: Token of DPNI object 215462306a36Sopenharmony_ci * @ptp_cfg: ptp single step configuration 215562306a36Sopenharmony_ci * 215662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 215762306a36Sopenharmony_ci * 215862306a36Sopenharmony_ci * The function has effect only when dpni object is connected to a dpmac 215962306a36Sopenharmony_ci * object. If the dpni is not connected to a dpmac the configuration will 216062306a36Sopenharmony_ci * be stored inside and applied when connection is made. 216162306a36Sopenharmony_ci */ 216262306a36Sopenharmony_ciint dpni_set_single_step_cfg(struct fsl_mc_io *mc_io, 216362306a36Sopenharmony_ci u32 cmd_flags, 216462306a36Sopenharmony_ci u16 token, 216562306a36Sopenharmony_ci struct dpni_single_step_cfg *ptp_cfg) 216662306a36Sopenharmony_ci{ 216762306a36Sopenharmony_ci struct dpni_cmd_single_step_cfg *cmd_params; 216862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 216962306a36Sopenharmony_ci u16 flags; 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci /* prepare command */ 217262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG, 217362306a36Sopenharmony_ci cmd_flags, token); 217462306a36Sopenharmony_ci cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params; 217562306a36Sopenharmony_ci cmd_params->offset = cpu_to_le16(ptp_cfg->offset); 217662306a36Sopenharmony_ci cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay); 217762306a36Sopenharmony_ci 217862306a36Sopenharmony_ci flags = le16_to_cpu(cmd_params->flags); 217962306a36Sopenharmony_ci dpni_set_field(flags, PTP_ENABLE, !!ptp_cfg->en); 218062306a36Sopenharmony_ci dpni_set_field(flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update); 218162306a36Sopenharmony_ci cmd_params->flags = cpu_to_le16(flags); 218262306a36Sopenharmony_ci 218362306a36Sopenharmony_ci /* send command to mc*/ 218462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 218562306a36Sopenharmony_ci} 2186