162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2014-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * Copyright 2017-2021 NXP 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/fsl/mc.h> 962306a36Sopenharmony_ci#include "dpsw.h" 1062306a36Sopenharmony_ci#include "dpsw-cmd.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic void build_if_id_bitmap(__le64 *bmap, const u16 *id, const u16 num_ifs) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci int i; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci for (i = 0; (i < num_ifs) && (i < DPSW_MAX_IF); i++) { 1762306a36Sopenharmony_ci if (id[i] < DPSW_MAX_IF) 1862306a36Sopenharmony_ci bmap[id[i] / 64] |= cpu_to_le64(BIT_MASK(id[i] % 64)); 1962306a36Sopenharmony_ci } 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/** 2362306a36Sopenharmony_ci * dpsw_open() - Open a control session for the specified object 2462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 2562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2662306a36Sopenharmony_ci * @dpsw_id: DPSW unique ID 2762306a36Sopenharmony_ci * @token: Returned token; use in subsequent API calls 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci * This function can be used to open a control session for an 3062306a36Sopenharmony_ci * already created object; an object may have been declared in 3162306a36Sopenharmony_ci * the DPL or by calling the dpsw_create() function. 3262306a36Sopenharmony_ci * This function returns a unique authentication token, 3362306a36Sopenharmony_ci * associated with the specific object ID and the specific MC 3462306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for 3562306a36Sopenharmony_ci * this specific object 3662306a36Sopenharmony_ci * 3762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ciint dpsw_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpsw_id, u16 *token) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 4262306a36Sopenharmony_ci struct dpsw_cmd_open *cmd_params; 4362306a36Sopenharmony_ci int err; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci /* prepare command */ 4662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_OPEN, 4762306a36Sopenharmony_ci cmd_flags, 4862306a36Sopenharmony_ci 0); 4962306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_open *)cmd.params; 5062306a36Sopenharmony_ci cmd_params->dpsw_id = cpu_to_le32(dpsw_id); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci /* send command to mc*/ 5362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 5462306a36Sopenharmony_ci if (err) 5562306a36Sopenharmony_ci return err; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci /* retrieve response parameters */ 5862306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci return 0; 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/** 6462306a36Sopenharmony_ci * dpsw_close() - Close the control session of the object 6562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 6662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 6762306a36Sopenharmony_ci * @token: Token of DPSW object 6862306a36Sopenharmony_ci * 6962306a36Sopenharmony_ci * After this function is called, no further operations are 7062306a36Sopenharmony_ci * allowed on the object without opening a new control session. 7162306a36Sopenharmony_ci * 7262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ciint dpsw_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci /* prepare command */ 7962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CLOSE, 8062306a36Sopenharmony_ci cmd_flags, 8162306a36Sopenharmony_ci token); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci /* send command to mc*/ 8462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/** 8862306a36Sopenharmony_ci * dpsw_enable() - Enable DPSW functionality 8962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 9062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 9162306a36Sopenharmony_ci * @token: Token of DPSW object 9262306a36Sopenharmony_ci * 9362306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 9462306a36Sopenharmony_ci */ 9562306a36Sopenharmony_ciint dpsw_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* prepare command */ 10062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ENABLE, 10162306a36Sopenharmony_ci cmd_flags, 10262306a36Sopenharmony_ci token); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci /* send command to mc*/ 10562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/** 10962306a36Sopenharmony_ci * dpsw_disable() - Disable DPSW functionality 11062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 11162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 11262306a36Sopenharmony_ci * @token: Token of DPSW object 11362306a36Sopenharmony_ci * 11462306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 11562306a36Sopenharmony_ci */ 11662306a36Sopenharmony_ciint dpsw_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci /* prepare command */ 12162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_DISABLE, 12262306a36Sopenharmony_ci cmd_flags, 12362306a36Sopenharmony_ci token); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* send command to mc*/ 12662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 12762306a36Sopenharmony_ci} 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/** 13062306a36Sopenharmony_ci * dpsw_reset() - Reset the DPSW, returns the object to initial state. 13162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 13262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 13362306a36Sopenharmony_ci * @token: Token of DPSW object 13462306a36Sopenharmony_ci * 13562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ciint dpsw_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* prepare command */ 14262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_RESET, 14362306a36Sopenharmony_ci cmd_flags, 14462306a36Sopenharmony_ci token); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci /* send command to mc*/ 14762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci/** 15162306a36Sopenharmony_ci * dpsw_set_irq_enable() - Set overall interrupt state. 15262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 15362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15462306a36Sopenharmony_ci * @token: Token of DPCI object 15562306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 15662306a36Sopenharmony_ci * @en: Interrupt state - enable = 1, disable = 0 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * Allows GPP software to control when interrupts are generated. 15962306a36Sopenharmony_ci * Each interrupt can have up to 32 causes. The enable/disable control's the 16062306a36Sopenharmony_ci * overall interrupt state. if the interrupt is disabled no causes will cause 16162306a36Sopenharmony_ci * an interrupt 16262306a36Sopenharmony_ci * 16362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 16462306a36Sopenharmony_ci */ 16562306a36Sopenharmony_ciint dpsw_set_irq_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 16662306a36Sopenharmony_ci u8 irq_index, u8 en) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 16962306a36Sopenharmony_ci struct dpsw_cmd_set_irq_enable *cmd_params; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci /* prepare command */ 17262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_SET_IRQ_ENABLE, 17362306a36Sopenharmony_ci cmd_flags, 17462306a36Sopenharmony_ci token); 17562306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_set_irq_enable *)cmd.params; 17662306a36Sopenharmony_ci dpsw_set_field(cmd_params->enable_state, ENABLE, en); 17762306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci /* send command to mc*/ 18062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/** 18462306a36Sopenharmony_ci * dpsw_set_irq_mask() - Set interrupt mask. 18562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 18662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 18762306a36Sopenharmony_ci * @token: Token of DPCI object 18862306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 18962306a36Sopenharmony_ci * @mask: Event mask to trigger interrupt; 19062306a36Sopenharmony_ci * each bit: 19162306a36Sopenharmony_ci * 0 = ignore event 19262306a36Sopenharmony_ci * 1 = consider event for asserting IRQ 19362306a36Sopenharmony_ci * 19462306a36Sopenharmony_ci * Every interrupt can have up to 32 causes and the interrupt model supports 19562306a36Sopenharmony_ci * masking/unmasking each cause independently 19662306a36Sopenharmony_ci * 19762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 19862306a36Sopenharmony_ci */ 19962306a36Sopenharmony_ciint dpsw_set_irq_mask(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 20062306a36Sopenharmony_ci u8 irq_index, u32 mask) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 20362306a36Sopenharmony_ci struct dpsw_cmd_set_irq_mask *cmd_params; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci /* prepare command */ 20662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_SET_IRQ_MASK, 20762306a36Sopenharmony_ci cmd_flags, 20862306a36Sopenharmony_ci token); 20962306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_set_irq_mask *)cmd.params; 21062306a36Sopenharmony_ci cmd_params->mask = cpu_to_le32(mask); 21162306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci /* send command to mc*/ 21462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 21562306a36Sopenharmony_ci} 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/** 21862306a36Sopenharmony_ci * dpsw_get_irq_status() - Get the current status of any pending interrupts 21962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 22062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 22162306a36Sopenharmony_ci * @token: Token of DPSW object 22262306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 22362306a36Sopenharmony_ci * @status: Returned interrupts status - one bit per cause: 22462306a36Sopenharmony_ci * 0 = no interrupt pending 22562306a36Sopenharmony_ci * 1 = interrupt pending 22662306a36Sopenharmony_ci * 22762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 22862306a36Sopenharmony_ci */ 22962306a36Sopenharmony_ciint dpsw_get_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 23062306a36Sopenharmony_ci u8 irq_index, u32 *status) 23162306a36Sopenharmony_ci{ 23262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 23362306a36Sopenharmony_ci struct dpsw_cmd_get_irq_status *cmd_params; 23462306a36Sopenharmony_ci struct dpsw_rsp_get_irq_status *rsp_params; 23562306a36Sopenharmony_ci int err; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /* prepare command */ 23862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_GET_IRQ_STATUS, 23962306a36Sopenharmony_ci cmd_flags, 24062306a36Sopenharmony_ci token); 24162306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_get_irq_status *)cmd.params; 24262306a36Sopenharmony_ci cmd_params->status = cpu_to_le32(*status); 24362306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* send command to mc*/ 24662306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 24762306a36Sopenharmony_ci if (err) 24862306a36Sopenharmony_ci return err; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci /* retrieve response parameters */ 25162306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_get_irq_status *)cmd.params; 25262306a36Sopenharmony_ci *status = le32_to_cpu(rsp_params->status); 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci return 0; 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/** 25862306a36Sopenharmony_ci * dpsw_clear_irq_status() - Clear a pending interrupt's status 25962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 26062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 26162306a36Sopenharmony_ci * @token: Token of DPCI object 26262306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 26362306a36Sopenharmony_ci * @status: bits to clear (W1C) - one bit per cause: 26462306a36Sopenharmony_ci * 0 = don't change 26562306a36Sopenharmony_ci * 1 = clear status bit 26662306a36Sopenharmony_ci * 26762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 26862306a36Sopenharmony_ci */ 26962306a36Sopenharmony_ciint dpsw_clear_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 27062306a36Sopenharmony_ci u8 irq_index, u32 status) 27162306a36Sopenharmony_ci{ 27262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 27362306a36Sopenharmony_ci struct dpsw_cmd_clear_irq_status *cmd_params; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci /* prepare command */ 27662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CLEAR_IRQ_STATUS, 27762306a36Sopenharmony_ci cmd_flags, 27862306a36Sopenharmony_ci token); 27962306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_clear_irq_status *)cmd.params; 28062306a36Sopenharmony_ci cmd_params->status = cpu_to_le32(status); 28162306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci /* send command to mc*/ 28462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 28562306a36Sopenharmony_ci} 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci/** 28862306a36Sopenharmony_ci * dpsw_get_attributes() - Retrieve DPSW attributes 28962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 29062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 29162306a36Sopenharmony_ci * @token: Token of DPSW object 29262306a36Sopenharmony_ci * @attr: Returned DPSW attributes 29362306a36Sopenharmony_ci * 29462306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 29562306a36Sopenharmony_ci */ 29662306a36Sopenharmony_ciint dpsw_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 29762306a36Sopenharmony_ci struct dpsw_attr *attr) 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 30062306a36Sopenharmony_ci struct dpsw_rsp_get_attr *rsp_params; 30162306a36Sopenharmony_ci int err; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci /* prepare command */ 30462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_GET_ATTR, 30562306a36Sopenharmony_ci cmd_flags, 30662306a36Sopenharmony_ci token); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci /* send command to mc*/ 30962306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 31062306a36Sopenharmony_ci if (err) 31162306a36Sopenharmony_ci return err; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci /* retrieve response parameters */ 31462306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_get_attr *)cmd.params; 31562306a36Sopenharmony_ci attr->num_ifs = le16_to_cpu(rsp_params->num_ifs); 31662306a36Sopenharmony_ci attr->max_fdbs = rsp_params->max_fdbs; 31762306a36Sopenharmony_ci attr->num_fdbs = rsp_params->num_fdbs; 31862306a36Sopenharmony_ci attr->max_vlans = le16_to_cpu(rsp_params->max_vlans); 31962306a36Sopenharmony_ci attr->num_vlans = le16_to_cpu(rsp_params->num_vlans); 32062306a36Sopenharmony_ci attr->max_fdb_entries = le16_to_cpu(rsp_params->max_fdb_entries); 32162306a36Sopenharmony_ci attr->fdb_aging_time = le16_to_cpu(rsp_params->fdb_aging_time); 32262306a36Sopenharmony_ci attr->id = le32_to_cpu(rsp_params->dpsw_id); 32362306a36Sopenharmony_ci attr->mem_size = le16_to_cpu(rsp_params->mem_size); 32462306a36Sopenharmony_ci attr->max_fdb_mc_groups = le16_to_cpu(rsp_params->max_fdb_mc_groups); 32562306a36Sopenharmony_ci attr->max_meters_per_if = rsp_params->max_meters_per_if; 32662306a36Sopenharmony_ci attr->options = le64_to_cpu(rsp_params->options); 32762306a36Sopenharmony_ci attr->component_type = dpsw_get_field(rsp_params->component_type, COMPONENT_TYPE); 32862306a36Sopenharmony_ci attr->flooding_cfg = dpsw_get_field(rsp_params->repl_cfg, FLOODING_CFG); 32962306a36Sopenharmony_ci attr->broadcast_cfg = dpsw_get_field(rsp_params->repl_cfg, BROADCAST_CFG); 33062306a36Sopenharmony_ci return 0; 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci/** 33462306a36Sopenharmony_ci * dpsw_if_set_link_cfg() - Set the link configuration. 33562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 33662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 33762306a36Sopenharmony_ci * @token: Token of DPSW object 33862306a36Sopenharmony_ci * @if_id: Interface id 33962306a36Sopenharmony_ci * @cfg: Link configuration 34062306a36Sopenharmony_ci * 34162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 34262306a36Sopenharmony_ci */ 34362306a36Sopenharmony_ciint dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 34462306a36Sopenharmony_ci struct dpsw_link_cfg *cfg) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 34762306a36Sopenharmony_ci struct dpsw_cmd_if_set_link_cfg *cmd_params; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci /* prepare command */ 35062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_LINK_CFG, 35162306a36Sopenharmony_ci cmd_flags, 35262306a36Sopenharmony_ci token); 35362306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_set_link_cfg *)cmd.params; 35462306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 35562306a36Sopenharmony_ci cmd_params->rate = cpu_to_le32(cfg->rate); 35662306a36Sopenharmony_ci cmd_params->options = cpu_to_le64(cfg->options); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci /* send command to mc*/ 35962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 36062306a36Sopenharmony_ci} 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci/** 36362306a36Sopenharmony_ci * dpsw_if_get_link_state - Return the link state 36462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 36562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 36662306a36Sopenharmony_ci * @token: Token of DPSW object 36762306a36Sopenharmony_ci * @if_id: Interface id 36862306a36Sopenharmony_ci * @state: Link state 1 - linkup, 0 - link down or disconnected 36962306a36Sopenharmony_ci * 37062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 37162306a36Sopenharmony_ci */ 37262306a36Sopenharmony_ciint dpsw_if_get_link_state(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 37362306a36Sopenharmony_ci u16 if_id, struct dpsw_link_state *state) 37462306a36Sopenharmony_ci{ 37562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 37662306a36Sopenharmony_ci struct dpsw_cmd_if_get_link_state *cmd_params; 37762306a36Sopenharmony_ci struct dpsw_rsp_if_get_link_state *rsp_params; 37862306a36Sopenharmony_ci int err; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci /* prepare command */ 38162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_LINK_STATE, 38262306a36Sopenharmony_ci cmd_flags, 38362306a36Sopenharmony_ci token); 38462306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_get_link_state *)cmd.params; 38562306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci /* send command to mc*/ 38862306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 38962306a36Sopenharmony_ci if (err) 39062306a36Sopenharmony_ci return err; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* retrieve response parameters */ 39362306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_if_get_link_state *)cmd.params; 39462306a36Sopenharmony_ci state->rate = le32_to_cpu(rsp_params->rate); 39562306a36Sopenharmony_ci state->options = le64_to_cpu(rsp_params->options); 39662306a36Sopenharmony_ci state->up = dpsw_get_field(rsp_params->up, UP); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci return 0; 39962306a36Sopenharmony_ci} 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci/** 40262306a36Sopenharmony_ci * dpsw_if_set_tci() - Set default VLAN Tag Control Information (TCI) 40362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 40462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 40562306a36Sopenharmony_ci * @token: Token of DPSW object 40662306a36Sopenharmony_ci * @if_id: Interface Identifier 40762306a36Sopenharmony_ci * @cfg: Tag Control Information Configuration 40862306a36Sopenharmony_ci * 40962306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 41062306a36Sopenharmony_ci */ 41162306a36Sopenharmony_ciint dpsw_if_set_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 41262306a36Sopenharmony_ci const struct dpsw_tci_cfg *cfg) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 41562306a36Sopenharmony_ci struct dpsw_cmd_if_set_tci *cmd_params; 41662306a36Sopenharmony_ci u16 tmp_conf = 0; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci /* prepare command */ 41962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_TCI, 42062306a36Sopenharmony_ci cmd_flags, 42162306a36Sopenharmony_ci token); 42262306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_set_tci *)cmd.params; 42362306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 42462306a36Sopenharmony_ci dpsw_set_field(tmp_conf, VLAN_ID, cfg->vlan_id); 42562306a36Sopenharmony_ci dpsw_set_field(tmp_conf, DEI, cfg->dei); 42662306a36Sopenharmony_ci dpsw_set_field(tmp_conf, PCP, cfg->pcp); 42762306a36Sopenharmony_ci cmd_params->conf = cpu_to_le16(tmp_conf); 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci /* send command to mc*/ 43062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 43162306a36Sopenharmony_ci} 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci/** 43462306a36Sopenharmony_ci * dpsw_if_get_tci() - Get default VLAN Tag Control Information (TCI) 43562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 43662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 43762306a36Sopenharmony_ci * @token: Token of DPSW object 43862306a36Sopenharmony_ci * @if_id: Interface Identifier 43962306a36Sopenharmony_ci * @cfg: Tag Control Information Configuration 44062306a36Sopenharmony_ci * 44162306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 44262306a36Sopenharmony_ci */ 44362306a36Sopenharmony_ciint dpsw_if_get_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 44462306a36Sopenharmony_ci struct dpsw_tci_cfg *cfg) 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 44762306a36Sopenharmony_ci struct dpsw_cmd_if_get_tci *cmd_params; 44862306a36Sopenharmony_ci struct dpsw_rsp_if_get_tci *rsp_params; 44962306a36Sopenharmony_ci int err; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci /* prepare command */ 45262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_TCI, 45362306a36Sopenharmony_ci cmd_flags, 45462306a36Sopenharmony_ci token); 45562306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_get_tci *)cmd.params; 45662306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci /* send command to mc*/ 45962306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 46062306a36Sopenharmony_ci if (err) 46162306a36Sopenharmony_ci return err; 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci /* retrieve response parameters */ 46462306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_if_get_tci *)cmd.params; 46562306a36Sopenharmony_ci cfg->pcp = rsp_params->pcp; 46662306a36Sopenharmony_ci cfg->dei = rsp_params->dei; 46762306a36Sopenharmony_ci cfg->vlan_id = le16_to_cpu(rsp_params->vlan_id); 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci return 0; 47062306a36Sopenharmony_ci} 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci/** 47362306a36Sopenharmony_ci * dpsw_if_set_stp() - Function sets Spanning Tree Protocol (STP) state. 47462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 47562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 47662306a36Sopenharmony_ci * @token: Token of DPSW object 47762306a36Sopenharmony_ci * @if_id: Interface Identifier 47862306a36Sopenharmony_ci * @cfg: STP State configuration parameters 47962306a36Sopenharmony_ci * 48062306a36Sopenharmony_ci * The following STP states are supported - 48162306a36Sopenharmony_ci * blocking, listening, learning, forwarding and disabled. 48262306a36Sopenharmony_ci * 48362306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 48462306a36Sopenharmony_ci */ 48562306a36Sopenharmony_ciint dpsw_if_set_stp(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 48662306a36Sopenharmony_ci const struct dpsw_stp_cfg *cfg) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 48962306a36Sopenharmony_ci struct dpsw_cmd_if_set_stp *cmd_params; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci /* prepare command */ 49262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_STP, 49362306a36Sopenharmony_ci cmd_flags, 49462306a36Sopenharmony_ci token); 49562306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_set_stp *)cmd.params; 49662306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 49762306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(cfg->vlan_id); 49862306a36Sopenharmony_ci dpsw_set_field(cmd_params->state, STATE, cfg->state); 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci /* send command to mc*/ 50162306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 50262306a36Sopenharmony_ci} 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci/** 50562306a36Sopenharmony_ci * dpsw_if_get_counter() - Get specific counter of particular interface 50662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 50762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 50862306a36Sopenharmony_ci * @token: Token of DPSW object 50962306a36Sopenharmony_ci * @if_id: Interface Identifier 51062306a36Sopenharmony_ci * @type: Counter type 51162306a36Sopenharmony_ci * @counter: return value 51262306a36Sopenharmony_ci * 51362306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 51462306a36Sopenharmony_ci */ 51562306a36Sopenharmony_ciint dpsw_if_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 51662306a36Sopenharmony_ci u16 if_id, enum dpsw_counter type, u64 *counter) 51762306a36Sopenharmony_ci{ 51862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 51962306a36Sopenharmony_ci struct dpsw_cmd_if_get_counter *cmd_params; 52062306a36Sopenharmony_ci struct dpsw_rsp_if_get_counter *rsp_params; 52162306a36Sopenharmony_ci int err; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci /* prepare command */ 52462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_COUNTER, 52562306a36Sopenharmony_ci cmd_flags, 52662306a36Sopenharmony_ci token); 52762306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_get_counter *)cmd.params; 52862306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 52962306a36Sopenharmony_ci dpsw_set_field(cmd_params->type, COUNTER_TYPE, type); 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci /* send command to mc*/ 53262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 53362306a36Sopenharmony_ci if (err) 53462306a36Sopenharmony_ci return err; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci /* retrieve response parameters */ 53762306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_if_get_counter *)cmd.params; 53862306a36Sopenharmony_ci *counter = le64_to_cpu(rsp_params->counter); 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci return 0; 54162306a36Sopenharmony_ci} 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci/** 54462306a36Sopenharmony_ci * dpsw_if_enable() - Enable Interface 54562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 54662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 54762306a36Sopenharmony_ci * @token: Token of DPSW object 54862306a36Sopenharmony_ci * @if_id: Interface Identifier 54962306a36Sopenharmony_ci * 55062306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 55162306a36Sopenharmony_ci */ 55262306a36Sopenharmony_ciint dpsw_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id) 55362306a36Sopenharmony_ci{ 55462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 55562306a36Sopenharmony_ci struct dpsw_cmd_if *cmd_params; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci /* prepare command */ 55862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_ENABLE, 55962306a36Sopenharmony_ci cmd_flags, 56062306a36Sopenharmony_ci token); 56162306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if *)cmd.params; 56262306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci /* send command to mc*/ 56562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 56662306a36Sopenharmony_ci} 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci/** 56962306a36Sopenharmony_ci * dpsw_if_disable() - Disable Interface 57062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 57162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 57262306a36Sopenharmony_ci * @token: Token of DPSW object 57362306a36Sopenharmony_ci * @if_id: Interface Identifier 57462306a36Sopenharmony_ci * 57562306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 57662306a36Sopenharmony_ci */ 57762306a36Sopenharmony_ciint dpsw_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id) 57862306a36Sopenharmony_ci{ 57962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 58062306a36Sopenharmony_ci struct dpsw_cmd_if *cmd_params; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci /* prepare command */ 58362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_DISABLE, 58462306a36Sopenharmony_ci cmd_flags, 58562306a36Sopenharmony_ci token); 58662306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if *)cmd.params; 58762306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci /* send command to mc*/ 59062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 59162306a36Sopenharmony_ci} 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_ci/** 59462306a36Sopenharmony_ci * dpsw_if_get_attributes() - Function obtains attributes of interface 59562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 59662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 59762306a36Sopenharmony_ci * @token: Token of DPSW object 59862306a36Sopenharmony_ci * @if_id: Interface Identifier 59962306a36Sopenharmony_ci * @attr: Returned interface attributes 60062306a36Sopenharmony_ci * 60162306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 60262306a36Sopenharmony_ci */ 60362306a36Sopenharmony_ciint dpsw_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 60462306a36Sopenharmony_ci u16 if_id, struct dpsw_if_attr *attr) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci struct dpsw_rsp_if_get_attr *rsp_params; 60762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 60862306a36Sopenharmony_ci struct dpsw_cmd_if *cmd_params; 60962306a36Sopenharmony_ci int err; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_ATTR, cmd_flags, 61262306a36Sopenharmony_ci token); 61362306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if *)cmd.params; 61462306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 61762306a36Sopenharmony_ci if (err) 61862306a36Sopenharmony_ci return err; 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_if_get_attr *)cmd.params; 62162306a36Sopenharmony_ci attr->num_tcs = rsp_params->num_tcs; 62262306a36Sopenharmony_ci attr->rate = le32_to_cpu(rsp_params->rate); 62362306a36Sopenharmony_ci attr->options = le32_to_cpu(rsp_params->options); 62462306a36Sopenharmony_ci attr->qdid = le16_to_cpu(rsp_params->qdid); 62562306a36Sopenharmony_ci attr->enabled = dpsw_get_field(rsp_params->conf, ENABLED); 62662306a36Sopenharmony_ci attr->accept_all_vlan = dpsw_get_field(rsp_params->conf, 62762306a36Sopenharmony_ci ACCEPT_ALL_VLAN); 62862306a36Sopenharmony_ci attr->admit_untagged = dpsw_get_field(rsp_params->conf, 62962306a36Sopenharmony_ci ADMIT_UNTAGGED); 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci return 0; 63262306a36Sopenharmony_ci} 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci/** 63562306a36Sopenharmony_ci * dpsw_if_set_max_frame_length() - Set Maximum Receive frame length. 63662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 63762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 63862306a36Sopenharmony_ci * @token: Token of DPSW object 63962306a36Sopenharmony_ci * @if_id: Interface Identifier 64062306a36Sopenharmony_ci * @frame_length: Maximum Frame Length 64162306a36Sopenharmony_ci * 64262306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 64362306a36Sopenharmony_ci */ 64462306a36Sopenharmony_ciint dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 64562306a36Sopenharmony_ci u16 if_id, u16 frame_length) 64662306a36Sopenharmony_ci{ 64762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 64862306a36Sopenharmony_ci struct dpsw_cmd_if_set_max_frame_length *cmd_params; 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci /* prepare command */ 65162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_MAX_FRAME_LENGTH, 65262306a36Sopenharmony_ci cmd_flags, 65362306a36Sopenharmony_ci token); 65462306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_set_max_frame_length *)cmd.params; 65562306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 65662306a36Sopenharmony_ci cmd_params->frame_length = cpu_to_le16(frame_length); 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci /* send command to mc*/ 65962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 66062306a36Sopenharmony_ci} 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci/** 66362306a36Sopenharmony_ci * dpsw_vlan_add() - Adding new VLAN to DPSW. 66462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 66562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 66662306a36Sopenharmony_ci * @token: Token of DPSW object 66762306a36Sopenharmony_ci * @vlan_id: VLAN Identifier 66862306a36Sopenharmony_ci * @cfg: VLAN configuration 66962306a36Sopenharmony_ci * 67062306a36Sopenharmony_ci * Only VLAN ID and FDB ID are required parameters here. 67162306a36Sopenharmony_ci * 12 bit VLAN ID is defined in IEEE802.1Q. 67262306a36Sopenharmony_ci * Adding a duplicate VLAN ID is not allowed. 67362306a36Sopenharmony_ci * FDB ID can be shared across multiple VLANs. Shared learning 67462306a36Sopenharmony_ci * is obtained by calling dpsw_vlan_add for multiple VLAN IDs 67562306a36Sopenharmony_ci * with same fdb_id 67662306a36Sopenharmony_ci * 67762306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 67862306a36Sopenharmony_ci */ 67962306a36Sopenharmony_ciint dpsw_vlan_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 68062306a36Sopenharmony_ci u16 vlan_id, const struct dpsw_vlan_cfg *cfg) 68162306a36Sopenharmony_ci{ 68262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 68362306a36Sopenharmony_ci struct dpsw_vlan_add *cmd_params; 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_ci /* prepare command */ 68662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_ADD, 68762306a36Sopenharmony_ci cmd_flags, 68862306a36Sopenharmony_ci token); 68962306a36Sopenharmony_ci cmd_params = (struct dpsw_vlan_add *)cmd.params; 69062306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(cfg->fdb_id); 69162306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci /* send command to mc*/ 69462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 69562306a36Sopenharmony_ci} 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci/** 69862306a36Sopenharmony_ci * dpsw_vlan_add_if() - Adding a set of interfaces to an existing VLAN. 69962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 70062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 70162306a36Sopenharmony_ci * @token: Token of DPSW object 70262306a36Sopenharmony_ci * @vlan_id: VLAN Identifier 70362306a36Sopenharmony_ci * @cfg: Set of interfaces to add 70462306a36Sopenharmony_ci * 70562306a36Sopenharmony_ci * It adds only interfaces not belonging to this VLAN yet, 70662306a36Sopenharmony_ci * otherwise an error is generated and an entire command is 70762306a36Sopenharmony_ci * ignored. This function can be called numerous times always 70862306a36Sopenharmony_ci * providing required interfaces delta. 70962306a36Sopenharmony_ci * 71062306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 71162306a36Sopenharmony_ci */ 71262306a36Sopenharmony_ciint dpsw_vlan_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 71362306a36Sopenharmony_ci u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg) 71462306a36Sopenharmony_ci{ 71562306a36Sopenharmony_ci struct dpsw_cmd_vlan_add_if *cmd_params; 71662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci /* prepare command */ 71962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_ADD_IF, 72062306a36Sopenharmony_ci cmd_flags, 72162306a36Sopenharmony_ci token); 72262306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_vlan_add_if *)cmd.params; 72362306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 72462306a36Sopenharmony_ci cmd_params->options = cpu_to_le16(cfg->options); 72562306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(cfg->fdb_id); 72662306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci /* send command to mc*/ 72962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 73062306a36Sopenharmony_ci} 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci/** 73362306a36Sopenharmony_ci * dpsw_vlan_add_if_untagged() - Defining a set of interfaces that should be 73462306a36Sopenharmony_ci * transmitted as untagged. 73562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 73662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 73762306a36Sopenharmony_ci * @token: Token of DPSW object 73862306a36Sopenharmony_ci * @vlan_id: VLAN Identifier 73962306a36Sopenharmony_ci * @cfg: Set of interfaces that should be transmitted as untagged 74062306a36Sopenharmony_ci * 74162306a36Sopenharmony_ci * These interfaces should already belong to this VLAN. 74262306a36Sopenharmony_ci * By default all interfaces are transmitted as tagged. 74362306a36Sopenharmony_ci * Providing un-existing interface or untagged interface that is 74462306a36Sopenharmony_ci * configured untagged already generates an error and the entire 74562306a36Sopenharmony_ci * command is ignored. 74662306a36Sopenharmony_ci * 74762306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 74862306a36Sopenharmony_ci */ 74962306a36Sopenharmony_ciint dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 75062306a36Sopenharmony_ci u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg) 75162306a36Sopenharmony_ci{ 75262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 75362306a36Sopenharmony_ci struct dpsw_cmd_vlan_manage_if *cmd_params; 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci /* prepare command */ 75662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_ADD_IF_UNTAGGED, 75762306a36Sopenharmony_ci cmd_flags, 75862306a36Sopenharmony_ci token); 75962306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params; 76062306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 76162306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci /* send command to mc*/ 76462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 76562306a36Sopenharmony_ci} 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ci/** 76862306a36Sopenharmony_ci * dpsw_vlan_remove_if() - Remove interfaces from an existing VLAN. 76962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 77062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 77162306a36Sopenharmony_ci * @token: Token of DPSW object 77262306a36Sopenharmony_ci * @vlan_id: VLAN Identifier 77362306a36Sopenharmony_ci * @cfg: Set of interfaces that should be removed 77462306a36Sopenharmony_ci * 77562306a36Sopenharmony_ci * Interfaces must belong to this VLAN, otherwise an error 77662306a36Sopenharmony_ci * is returned and an the command is ignored 77762306a36Sopenharmony_ci * 77862306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 77962306a36Sopenharmony_ci */ 78062306a36Sopenharmony_ciint dpsw_vlan_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 78162306a36Sopenharmony_ci u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg) 78262306a36Sopenharmony_ci{ 78362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 78462306a36Sopenharmony_ci struct dpsw_cmd_vlan_manage_if *cmd_params; 78562306a36Sopenharmony_ci 78662306a36Sopenharmony_ci /* prepare command */ 78762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_REMOVE_IF, 78862306a36Sopenharmony_ci cmd_flags, 78962306a36Sopenharmony_ci token); 79062306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params; 79162306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 79262306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci /* send command to mc*/ 79562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 79662306a36Sopenharmony_ci} 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci/** 79962306a36Sopenharmony_ci * dpsw_vlan_remove_if_untagged() - Define a set of interfaces that should be 80062306a36Sopenharmony_ci * converted from transmitted as untagged to transmit as tagged. 80162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 80262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 80362306a36Sopenharmony_ci * @token: Token of DPSW object 80462306a36Sopenharmony_ci * @vlan_id: VLAN Identifier 80562306a36Sopenharmony_ci * @cfg: Set of interfaces that should be removed 80662306a36Sopenharmony_ci * 80762306a36Sopenharmony_ci * Interfaces provided by API have to belong to this VLAN and 80862306a36Sopenharmony_ci * configured untagged, otherwise an error is returned and the 80962306a36Sopenharmony_ci * command is ignored 81062306a36Sopenharmony_ci * 81162306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 81262306a36Sopenharmony_ci */ 81362306a36Sopenharmony_ciint dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 81462306a36Sopenharmony_ci u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg) 81562306a36Sopenharmony_ci{ 81662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 81762306a36Sopenharmony_ci struct dpsw_cmd_vlan_manage_if *cmd_params; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci /* prepare command */ 82062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_REMOVE_IF_UNTAGGED, 82162306a36Sopenharmony_ci cmd_flags, 82262306a36Sopenharmony_ci token); 82362306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params; 82462306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 82562306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci /* send command to mc*/ 82862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 82962306a36Sopenharmony_ci} 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci/** 83262306a36Sopenharmony_ci * dpsw_vlan_remove() - Remove an entire VLAN 83362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 83462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 83562306a36Sopenharmony_ci * @token: Token of DPSW object 83662306a36Sopenharmony_ci * @vlan_id: VLAN Identifier 83762306a36Sopenharmony_ci * 83862306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 83962306a36Sopenharmony_ci */ 84062306a36Sopenharmony_ciint dpsw_vlan_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 84162306a36Sopenharmony_ci u16 vlan_id) 84262306a36Sopenharmony_ci{ 84362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 84462306a36Sopenharmony_ci struct dpsw_cmd_vlan_remove *cmd_params; 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci /* prepare command */ 84762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_REMOVE, 84862306a36Sopenharmony_ci cmd_flags, 84962306a36Sopenharmony_ci token); 85062306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_vlan_remove *)cmd.params; 85162306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(vlan_id); 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci /* send command to mc*/ 85462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 85562306a36Sopenharmony_ci} 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci/** 85862306a36Sopenharmony_ci * dpsw_fdb_add() - Add FDB to switch and Returns handle to FDB table for 85962306a36Sopenharmony_ci * the reference 86062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 86162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 86262306a36Sopenharmony_ci * @token: Token of DPSW object 86362306a36Sopenharmony_ci * @fdb_id: Returned Forwarding Database Identifier 86462306a36Sopenharmony_ci * @cfg: FDB Configuration 86562306a36Sopenharmony_ci * 86662306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 86762306a36Sopenharmony_ci */ 86862306a36Sopenharmony_ciint dpsw_fdb_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *fdb_id, 86962306a36Sopenharmony_ci const struct dpsw_fdb_cfg *cfg) 87062306a36Sopenharmony_ci{ 87162306a36Sopenharmony_ci struct dpsw_cmd_fdb_add *cmd_params; 87262306a36Sopenharmony_ci struct dpsw_rsp_fdb_add *rsp_params; 87362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 87462306a36Sopenharmony_ci int err; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_ADD, 87762306a36Sopenharmony_ci cmd_flags, 87862306a36Sopenharmony_ci token); 87962306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_add *)cmd.params; 88062306a36Sopenharmony_ci cmd_params->fdb_ageing_time = cpu_to_le16(cfg->fdb_ageing_time); 88162306a36Sopenharmony_ci cmd_params->num_fdb_entries = cpu_to_le16(cfg->num_fdb_entries); 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 88462306a36Sopenharmony_ci if (err) 88562306a36Sopenharmony_ci return err; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_fdb_add *)cmd.params; 88862306a36Sopenharmony_ci *fdb_id = le16_to_cpu(rsp_params->fdb_id); 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_ci return 0; 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci/** 89462306a36Sopenharmony_ci * dpsw_fdb_remove() - Remove FDB from switch 89562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 89662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 89762306a36Sopenharmony_ci * @token: Token of DPSW object 89862306a36Sopenharmony_ci * @fdb_id: Forwarding Database Identifier 89962306a36Sopenharmony_ci * 90062306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 90162306a36Sopenharmony_ci */ 90262306a36Sopenharmony_ciint dpsw_fdb_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id) 90362306a36Sopenharmony_ci{ 90462306a36Sopenharmony_ci struct dpsw_cmd_fdb_remove *cmd_params; 90562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_ci /* prepare command */ 90862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_REMOVE, 90962306a36Sopenharmony_ci cmd_flags, 91062306a36Sopenharmony_ci token); 91162306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_remove *)cmd.params; 91262306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(fdb_id); 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 91562306a36Sopenharmony_ci} 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_ci/** 91862306a36Sopenharmony_ci * dpsw_fdb_add_unicast() - Function adds an unicast entry into MAC lookup table 91962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 92062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 92162306a36Sopenharmony_ci * @token: Token of DPSW object 92262306a36Sopenharmony_ci * @fdb_id: Forwarding Database Identifier 92362306a36Sopenharmony_ci * @cfg: Unicast entry configuration 92462306a36Sopenharmony_ci * 92562306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 92662306a36Sopenharmony_ci */ 92762306a36Sopenharmony_ciint dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 92862306a36Sopenharmony_ci u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg) 92962306a36Sopenharmony_ci{ 93062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 93162306a36Sopenharmony_ci struct dpsw_cmd_fdb_unicast_op *cmd_params; 93262306a36Sopenharmony_ci int i; 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci /* prepare command */ 93562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_ADD_UNICAST, 93662306a36Sopenharmony_ci cmd_flags, 93762306a36Sopenharmony_ci token); 93862306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_unicast_op *)cmd.params; 93962306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(fdb_id); 94062306a36Sopenharmony_ci cmd_params->if_egress = cpu_to_le16(cfg->if_egress); 94162306a36Sopenharmony_ci for (i = 0; i < 6; i++) 94262306a36Sopenharmony_ci cmd_params->mac_addr[i] = cfg->mac_addr[5 - i]; 94362306a36Sopenharmony_ci dpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type); 94462306a36Sopenharmony_ci 94562306a36Sopenharmony_ci /* send command to mc*/ 94662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 94762306a36Sopenharmony_ci} 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci/** 95062306a36Sopenharmony_ci * dpsw_fdb_dump() - Dump the content of FDB table into memory. 95162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 95262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 95362306a36Sopenharmony_ci * @token: Token of DPSW object 95462306a36Sopenharmony_ci * @fdb_id: Forwarding Database Identifier 95562306a36Sopenharmony_ci * @iova_addr: Data will be stored here as an array of struct fdb_dump_entry 95662306a36Sopenharmony_ci * @iova_size: Memory size allocated at iova_addr 95762306a36Sopenharmony_ci * @num_entries:Number of entries written at iova_addr 95862306a36Sopenharmony_ci * 95962306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 96062306a36Sopenharmony_ci * 96162306a36Sopenharmony_ci * The memory allocated at iova_addr must be initialized with zero before 96262306a36Sopenharmony_ci * command execution. If the FDB table does not fit into memory MC will stop 96362306a36Sopenharmony_ci * after the memory is filled up. 96462306a36Sopenharmony_ci * The struct fdb_dump_entry array must be parsed until the end of memory 96562306a36Sopenharmony_ci * area or until an entry with mac_addr set to zero is found. 96662306a36Sopenharmony_ci */ 96762306a36Sopenharmony_ciint dpsw_fdb_dump(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id, 96862306a36Sopenharmony_ci u64 iova_addr, u32 iova_size, u16 *num_entries) 96962306a36Sopenharmony_ci{ 97062306a36Sopenharmony_ci struct dpsw_cmd_fdb_dump *cmd_params; 97162306a36Sopenharmony_ci struct dpsw_rsp_fdb_dump *rsp_params; 97262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 97362306a36Sopenharmony_ci int err; 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci /* prepare command */ 97662306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_DUMP, 97762306a36Sopenharmony_ci cmd_flags, 97862306a36Sopenharmony_ci token); 97962306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_dump *)cmd.params; 98062306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(fdb_id); 98162306a36Sopenharmony_ci cmd_params->iova_addr = cpu_to_le64(iova_addr); 98262306a36Sopenharmony_ci cmd_params->iova_size = cpu_to_le32(iova_size); 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_ci /* send command to mc */ 98562306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 98662306a36Sopenharmony_ci if (err) 98762306a36Sopenharmony_ci return err; 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_fdb_dump *)cmd.params; 99062306a36Sopenharmony_ci *num_entries = le16_to_cpu(rsp_params->num_entries); 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_ci return 0; 99362306a36Sopenharmony_ci} 99462306a36Sopenharmony_ci 99562306a36Sopenharmony_ci/** 99662306a36Sopenharmony_ci * dpsw_fdb_remove_unicast() - removes an entry from MAC lookup table 99762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 99862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 99962306a36Sopenharmony_ci * @token: Token of DPSW object 100062306a36Sopenharmony_ci * @fdb_id: Forwarding Database Identifier 100162306a36Sopenharmony_ci * @cfg: Unicast entry configuration 100262306a36Sopenharmony_ci * 100362306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 100462306a36Sopenharmony_ci */ 100562306a36Sopenharmony_ciint dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 100662306a36Sopenharmony_ci u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg) 100762306a36Sopenharmony_ci{ 100862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 100962306a36Sopenharmony_ci struct dpsw_cmd_fdb_unicast_op *cmd_params; 101062306a36Sopenharmony_ci int i; 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_ci /* prepare command */ 101362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_REMOVE_UNICAST, 101462306a36Sopenharmony_ci cmd_flags, 101562306a36Sopenharmony_ci token); 101662306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_unicast_op *)cmd.params; 101762306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(fdb_id); 101862306a36Sopenharmony_ci for (i = 0; i < 6; i++) 101962306a36Sopenharmony_ci cmd_params->mac_addr[i] = cfg->mac_addr[5 - i]; 102062306a36Sopenharmony_ci cmd_params->if_egress = cpu_to_le16(cfg->if_egress); 102162306a36Sopenharmony_ci dpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type); 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci /* send command to mc*/ 102462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 102562306a36Sopenharmony_ci} 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci/** 102862306a36Sopenharmony_ci * dpsw_fdb_add_multicast() - Add a set of egress interfaces to multi-cast group 102962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 103062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 103162306a36Sopenharmony_ci * @token: Token of DPSW object 103262306a36Sopenharmony_ci * @fdb_id: Forwarding Database Identifier 103362306a36Sopenharmony_ci * @cfg: Multicast entry configuration 103462306a36Sopenharmony_ci * 103562306a36Sopenharmony_ci * If group doesn't exist, it will be created. 103662306a36Sopenharmony_ci * It adds only interfaces not belonging to this multicast group 103762306a36Sopenharmony_ci * yet, otherwise error will be generated and the command is 103862306a36Sopenharmony_ci * ignored. 103962306a36Sopenharmony_ci * This function may be called numerous times always providing 104062306a36Sopenharmony_ci * required interfaces delta. 104162306a36Sopenharmony_ci * 104262306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 104362306a36Sopenharmony_ci */ 104462306a36Sopenharmony_ciint dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 104562306a36Sopenharmony_ci u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg) 104662306a36Sopenharmony_ci{ 104762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 104862306a36Sopenharmony_ci struct dpsw_cmd_fdb_multicast_op *cmd_params; 104962306a36Sopenharmony_ci int i; 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_ci /* prepare command */ 105262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_ADD_MULTICAST, 105362306a36Sopenharmony_ci cmd_flags, 105462306a36Sopenharmony_ci token); 105562306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_multicast_op *)cmd.params; 105662306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(fdb_id); 105762306a36Sopenharmony_ci cmd_params->num_ifs = cpu_to_le16(cfg->num_ifs); 105862306a36Sopenharmony_ci dpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type); 105962306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 106062306a36Sopenharmony_ci for (i = 0; i < 6; i++) 106162306a36Sopenharmony_ci cmd_params->mac_addr[i] = cfg->mac_addr[5 - i]; 106262306a36Sopenharmony_ci 106362306a36Sopenharmony_ci /* send command to mc*/ 106462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 106562306a36Sopenharmony_ci} 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_ci/** 106862306a36Sopenharmony_ci * dpsw_fdb_remove_multicast() - Removing interfaces from an existing multicast 106962306a36Sopenharmony_ci * group. 107062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 107162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 107262306a36Sopenharmony_ci * @token: Token of DPSW object 107362306a36Sopenharmony_ci * @fdb_id: Forwarding Database Identifier 107462306a36Sopenharmony_ci * @cfg: Multicast entry configuration 107562306a36Sopenharmony_ci * 107662306a36Sopenharmony_ci * Interfaces provided by this API have to exist in the group, 107762306a36Sopenharmony_ci * otherwise an error will be returned and an entire command 107862306a36Sopenharmony_ci * ignored. If there is no interface left in the group, 107962306a36Sopenharmony_ci * an entire group is deleted 108062306a36Sopenharmony_ci * 108162306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 108262306a36Sopenharmony_ci */ 108362306a36Sopenharmony_ciint dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 108462306a36Sopenharmony_ci u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg) 108562306a36Sopenharmony_ci{ 108662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 108762306a36Sopenharmony_ci struct dpsw_cmd_fdb_multicast_op *cmd_params; 108862306a36Sopenharmony_ci int i; 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_ci /* prepare command */ 109162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_REMOVE_MULTICAST, 109262306a36Sopenharmony_ci cmd_flags, 109362306a36Sopenharmony_ci token); 109462306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_fdb_multicast_op *)cmd.params; 109562306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(fdb_id); 109662306a36Sopenharmony_ci cmd_params->num_ifs = cpu_to_le16(cfg->num_ifs); 109762306a36Sopenharmony_ci dpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type); 109862306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 109962306a36Sopenharmony_ci for (i = 0; i < 6; i++) 110062306a36Sopenharmony_ci cmd_params->mac_addr[i] = cfg->mac_addr[5 - i]; 110162306a36Sopenharmony_ci 110262306a36Sopenharmony_ci /* send command to mc*/ 110362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 110462306a36Sopenharmony_ci} 110562306a36Sopenharmony_ci 110662306a36Sopenharmony_ci/** 110762306a36Sopenharmony_ci * dpsw_ctrl_if_get_attributes() - Obtain control interface attributes 110862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 110962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 111062306a36Sopenharmony_ci * @token: Token of DPSW object 111162306a36Sopenharmony_ci * @attr: Returned control interface attributes 111262306a36Sopenharmony_ci * 111362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 111462306a36Sopenharmony_ci */ 111562306a36Sopenharmony_ciint dpsw_ctrl_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, 111662306a36Sopenharmony_ci u16 token, struct dpsw_ctrl_if_attr *attr) 111762306a36Sopenharmony_ci{ 111862306a36Sopenharmony_ci struct dpsw_rsp_ctrl_if_get_attr *rsp_params; 111962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 112062306a36Sopenharmony_ci int err; 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CTRL_IF_GET_ATTR, 112362306a36Sopenharmony_ci cmd_flags, token); 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 112662306a36Sopenharmony_ci if (err) 112762306a36Sopenharmony_ci return err; 112862306a36Sopenharmony_ci 112962306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_ctrl_if_get_attr *)cmd.params; 113062306a36Sopenharmony_ci attr->rx_fqid = le32_to_cpu(rsp_params->rx_fqid); 113162306a36Sopenharmony_ci attr->rx_err_fqid = le32_to_cpu(rsp_params->rx_err_fqid); 113262306a36Sopenharmony_ci attr->tx_err_conf_fqid = le32_to_cpu(rsp_params->tx_err_conf_fqid); 113362306a36Sopenharmony_ci 113462306a36Sopenharmony_ci return 0; 113562306a36Sopenharmony_ci} 113662306a36Sopenharmony_ci 113762306a36Sopenharmony_ci/** 113862306a36Sopenharmony_ci * dpsw_ctrl_if_set_pools() - Set control interface buffer pools 113962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 114062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 114162306a36Sopenharmony_ci * @token: Token of DPSW object 114262306a36Sopenharmony_ci * @cfg: Buffer pools configuration 114362306a36Sopenharmony_ci * 114462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 114562306a36Sopenharmony_ci */ 114662306a36Sopenharmony_ciint dpsw_ctrl_if_set_pools(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 114762306a36Sopenharmony_ci const struct dpsw_ctrl_if_pools_cfg *cfg) 114862306a36Sopenharmony_ci{ 114962306a36Sopenharmony_ci struct dpsw_cmd_ctrl_if_set_pools *cmd_params; 115062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 115162306a36Sopenharmony_ci int i; 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CTRL_IF_SET_POOLS, 115462306a36Sopenharmony_ci cmd_flags, token); 115562306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_ctrl_if_set_pools *)cmd.params; 115662306a36Sopenharmony_ci cmd_params->num_dpbp = cfg->num_dpbp; 115762306a36Sopenharmony_ci for (i = 0; i < DPSW_MAX_DPBP; i++) { 115862306a36Sopenharmony_ci cmd_params->dpbp_id[i] = cpu_to_le32(cfg->pools[i].dpbp_id); 115962306a36Sopenharmony_ci cmd_params->buffer_size[i] = 116062306a36Sopenharmony_ci cpu_to_le16(cfg->pools[i].buffer_size); 116162306a36Sopenharmony_ci cmd_params->backup_pool_mask |= 116262306a36Sopenharmony_ci DPSW_BACKUP_POOL(cfg->pools[i].backup_pool, i); 116362306a36Sopenharmony_ci } 116462306a36Sopenharmony_ci 116562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 116662306a36Sopenharmony_ci} 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci/** 116962306a36Sopenharmony_ci * dpsw_ctrl_if_set_queue() - Set Rx queue configuration 117062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 117162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 117262306a36Sopenharmony_ci * @token: Token of dpsw object 117362306a36Sopenharmony_ci * @qtype: dpsw_queue_type of the targeted queue 117462306a36Sopenharmony_ci * @cfg: Rx queue configuration 117562306a36Sopenharmony_ci * 117662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 117762306a36Sopenharmony_ci */ 117862306a36Sopenharmony_ciint dpsw_ctrl_if_set_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 117962306a36Sopenharmony_ci enum dpsw_queue_type qtype, 118062306a36Sopenharmony_ci const struct dpsw_ctrl_if_queue_cfg *cfg) 118162306a36Sopenharmony_ci{ 118262306a36Sopenharmony_ci struct dpsw_cmd_ctrl_if_set_queue *cmd_params; 118362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 118462306a36Sopenharmony_ci 118562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CTRL_IF_SET_QUEUE, 118662306a36Sopenharmony_ci cmd_flags, 118762306a36Sopenharmony_ci token); 118862306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_ctrl_if_set_queue *)cmd.params; 118962306a36Sopenharmony_ci cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 119062306a36Sopenharmony_ci cmd_params->dest_priority = cfg->dest_cfg.priority; 119162306a36Sopenharmony_ci cmd_params->qtype = qtype; 119262306a36Sopenharmony_ci cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx); 119362306a36Sopenharmony_ci cmd_params->options = cpu_to_le32(cfg->options); 119462306a36Sopenharmony_ci dpsw_set_field(cmd_params->dest_type, 119562306a36Sopenharmony_ci DEST_TYPE, 119662306a36Sopenharmony_ci cfg->dest_cfg.dest_type); 119762306a36Sopenharmony_ci 119862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 119962306a36Sopenharmony_ci} 120062306a36Sopenharmony_ci 120162306a36Sopenharmony_ci/** 120262306a36Sopenharmony_ci * dpsw_get_api_version() - Get Data Path Switch API version 120362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 120462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 120562306a36Sopenharmony_ci * @major_ver: Major version of data path switch API 120662306a36Sopenharmony_ci * @minor_ver: Minor version of data path switch API 120762306a36Sopenharmony_ci * 120862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 120962306a36Sopenharmony_ci */ 121062306a36Sopenharmony_ciint dpsw_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, 121162306a36Sopenharmony_ci u16 *major_ver, u16 *minor_ver) 121262306a36Sopenharmony_ci{ 121362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 121462306a36Sopenharmony_ci struct dpsw_rsp_get_api_version *rsp_params; 121562306a36Sopenharmony_ci int err; 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_GET_API_VERSION, 121862306a36Sopenharmony_ci cmd_flags, 121962306a36Sopenharmony_ci 0); 122062306a36Sopenharmony_ci 122162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 122262306a36Sopenharmony_ci if (err) 122362306a36Sopenharmony_ci return err; 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_get_api_version *)cmd.params; 122662306a36Sopenharmony_ci *major_ver = le16_to_cpu(rsp_params->version_major); 122762306a36Sopenharmony_ci *minor_ver = le16_to_cpu(rsp_params->version_minor); 122862306a36Sopenharmony_ci 122962306a36Sopenharmony_ci return 0; 123062306a36Sopenharmony_ci} 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci/** 123362306a36Sopenharmony_ci * dpsw_if_get_port_mac_addr() - Retrieve MAC address associated to the physical port 123462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 123562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 123662306a36Sopenharmony_ci * @token: Token of DPSW object 123762306a36Sopenharmony_ci * @if_id: Interface Identifier 123862306a36Sopenharmony_ci * @mac_addr: MAC address of the physical port, if any, otherwise 0 123962306a36Sopenharmony_ci * 124062306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 124162306a36Sopenharmony_ci */ 124262306a36Sopenharmony_ciint dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 124362306a36Sopenharmony_ci u16 if_id, u8 mac_addr[6]) 124462306a36Sopenharmony_ci{ 124562306a36Sopenharmony_ci struct dpsw_rsp_if_get_mac_addr *rsp_params; 124662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 124762306a36Sopenharmony_ci struct dpsw_cmd_if *cmd_params; 124862306a36Sopenharmony_ci int err, i; 124962306a36Sopenharmony_ci 125062306a36Sopenharmony_ci /* prepare command */ 125162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_PORT_MAC_ADDR, 125262306a36Sopenharmony_ci cmd_flags, 125362306a36Sopenharmony_ci token); 125462306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if *)cmd.params; 125562306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 125662306a36Sopenharmony_ci 125762306a36Sopenharmony_ci /* send command to mc*/ 125862306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 125962306a36Sopenharmony_ci if (err) 126062306a36Sopenharmony_ci return err; 126162306a36Sopenharmony_ci 126262306a36Sopenharmony_ci /* retrieve response parameters */ 126362306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_if_get_mac_addr *)cmd.params; 126462306a36Sopenharmony_ci for (i = 0; i < 6; i++) 126562306a36Sopenharmony_ci mac_addr[5 - i] = rsp_params->mac_addr[i]; 126662306a36Sopenharmony_ci 126762306a36Sopenharmony_ci return 0; 126862306a36Sopenharmony_ci} 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci/** 127162306a36Sopenharmony_ci * dpsw_ctrl_if_enable() - Enable control interface 127262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 127362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 127462306a36Sopenharmony_ci * @token: Token of DPSW object 127562306a36Sopenharmony_ci * 127662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 127762306a36Sopenharmony_ci */ 127862306a36Sopenharmony_ciint dpsw_ctrl_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 127962306a36Sopenharmony_ci{ 128062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CTRL_IF_ENABLE, cmd_flags, 128362306a36Sopenharmony_ci token); 128462306a36Sopenharmony_ci 128562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 128662306a36Sopenharmony_ci} 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci/** 128962306a36Sopenharmony_ci * dpsw_ctrl_if_disable() - Function disables control interface 129062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 129162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 129262306a36Sopenharmony_ci * @token: Token of DPSW object 129362306a36Sopenharmony_ci * 129462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 129562306a36Sopenharmony_ci */ 129662306a36Sopenharmony_ciint dpsw_ctrl_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token) 129762306a36Sopenharmony_ci{ 129862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_CTRL_IF_DISABLE, 130162306a36Sopenharmony_ci cmd_flags, 130262306a36Sopenharmony_ci token); 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 130562306a36Sopenharmony_ci} 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci/** 130862306a36Sopenharmony_ci * dpsw_set_egress_flood() - Set egress parameters associated with an FDB ID 130962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 131062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 131162306a36Sopenharmony_ci * @token: Token of DPSW object 131262306a36Sopenharmony_ci * @cfg: Egress flooding configuration 131362306a36Sopenharmony_ci * 131462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 131562306a36Sopenharmony_ci */ 131662306a36Sopenharmony_ciint dpsw_set_egress_flood(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 131762306a36Sopenharmony_ci const struct dpsw_egress_flood_cfg *cfg) 131862306a36Sopenharmony_ci{ 131962306a36Sopenharmony_ci struct dpsw_cmd_set_egress_flood *cmd_params; 132062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_SET_EGRESS_FLOOD, cmd_flags, token); 132362306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_set_egress_flood *)cmd.params; 132462306a36Sopenharmony_ci cmd_params->fdb_id = cpu_to_le16(cfg->fdb_id); 132562306a36Sopenharmony_ci cmd_params->flood_type = cfg->flood_type; 132662306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 132762306a36Sopenharmony_ci 132862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 132962306a36Sopenharmony_ci} 133062306a36Sopenharmony_ci 133162306a36Sopenharmony_ci/** 133262306a36Sopenharmony_ci * dpsw_if_set_learning_mode() - Configure the learning mode on an interface. 133362306a36Sopenharmony_ci * If this API is used, it will take precedence over the FDB configuration. 133462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 133562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 133662306a36Sopenharmony_ci * @token: Token of DPSW object 133762306a36Sopenharmony_ci * @if_id: InterfaceID 133862306a36Sopenharmony_ci * @mode: Learning mode 133962306a36Sopenharmony_ci * 134062306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 134162306a36Sopenharmony_ci */ 134262306a36Sopenharmony_ciint dpsw_if_set_learning_mode(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 134362306a36Sopenharmony_ci u16 if_id, enum dpsw_learning_mode mode) 134462306a36Sopenharmony_ci{ 134562306a36Sopenharmony_ci struct dpsw_cmd_if_set_learning_mode *cmd_params; 134662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_LEARNING_MODE, 134962306a36Sopenharmony_ci cmd_flags, 135062306a36Sopenharmony_ci token); 135162306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_set_learning_mode *)cmd.params; 135262306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 135362306a36Sopenharmony_ci dpsw_set_field(cmd_params->mode, LEARNING_MODE, mode); 135462306a36Sopenharmony_ci 135562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 135662306a36Sopenharmony_ci} 135762306a36Sopenharmony_ci 135862306a36Sopenharmony_ci/** 135962306a36Sopenharmony_ci * dpsw_acl_add() - Create an ACL table 136062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 136162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 136262306a36Sopenharmony_ci * @token: Token of DPSW object 136362306a36Sopenharmony_ci * @acl_id: Returned ACL ID, for future references 136462306a36Sopenharmony_ci * @cfg: ACL configuration 136562306a36Sopenharmony_ci * 136662306a36Sopenharmony_ci * Create Access Control List table. Multiple ACLs can be created and 136762306a36Sopenharmony_ci * co-exist in L2 switch 136862306a36Sopenharmony_ci * 136962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 137062306a36Sopenharmony_ci */ 137162306a36Sopenharmony_ciint dpsw_acl_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *acl_id, 137262306a36Sopenharmony_ci const struct dpsw_acl_cfg *cfg) 137362306a36Sopenharmony_ci{ 137462306a36Sopenharmony_ci struct dpsw_cmd_acl_add *cmd_params; 137562306a36Sopenharmony_ci struct dpsw_rsp_acl_add *rsp_params; 137662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 137762306a36Sopenharmony_ci int err; 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ACL_ADD, cmd_flags, token); 138062306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_acl_add *)cmd.params; 138162306a36Sopenharmony_ci cmd_params->max_entries = cpu_to_le16(cfg->max_entries); 138262306a36Sopenharmony_ci 138362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 138462306a36Sopenharmony_ci if (err) 138562306a36Sopenharmony_ci return err; 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci rsp_params = (struct dpsw_rsp_acl_add *)cmd.params; 138862306a36Sopenharmony_ci *acl_id = le16_to_cpu(rsp_params->acl_id); 138962306a36Sopenharmony_ci 139062306a36Sopenharmony_ci return 0; 139162306a36Sopenharmony_ci} 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci/** 139462306a36Sopenharmony_ci * dpsw_acl_remove() - Remove an ACL table from L2 switch. 139562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 139662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 139762306a36Sopenharmony_ci * @token: Token of DPSW object 139862306a36Sopenharmony_ci * @acl_id: ACL ID 139962306a36Sopenharmony_ci * 140062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 140162306a36Sopenharmony_ci */ 140262306a36Sopenharmony_ciint dpsw_acl_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 140362306a36Sopenharmony_ci u16 acl_id) 140462306a36Sopenharmony_ci{ 140562306a36Sopenharmony_ci struct dpsw_cmd_acl_remove *cmd_params; 140662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 140762306a36Sopenharmony_ci 140862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ACL_REMOVE, cmd_flags, 140962306a36Sopenharmony_ci token); 141062306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_acl_remove *)cmd.params; 141162306a36Sopenharmony_ci cmd_params->acl_id = cpu_to_le16(acl_id); 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 141462306a36Sopenharmony_ci} 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci/** 141762306a36Sopenharmony_ci * dpsw_acl_add_if() - Associate interface/interfaces with an ACL table. 141862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 141962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 142062306a36Sopenharmony_ci * @token: Token of DPSW object 142162306a36Sopenharmony_ci * @acl_id: ACL ID 142262306a36Sopenharmony_ci * @cfg: Interfaces list 142362306a36Sopenharmony_ci * 142462306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 142562306a36Sopenharmony_ci */ 142662306a36Sopenharmony_ciint dpsw_acl_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 142762306a36Sopenharmony_ci u16 acl_id, const struct dpsw_acl_if_cfg *cfg) 142862306a36Sopenharmony_ci{ 142962306a36Sopenharmony_ci struct dpsw_cmd_acl_if *cmd_params; 143062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ACL_ADD_IF, cmd_flags, 143362306a36Sopenharmony_ci token); 143462306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_acl_if *)cmd.params; 143562306a36Sopenharmony_ci cmd_params->acl_id = cpu_to_le16(acl_id); 143662306a36Sopenharmony_ci cmd_params->num_ifs = cpu_to_le16(cfg->num_ifs); 143762306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 144062306a36Sopenharmony_ci} 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_ci/** 144362306a36Sopenharmony_ci * dpsw_acl_remove_if() - De-associate interface/interfaces from an ACL table 144462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 144562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 144662306a36Sopenharmony_ci * @token: Token of DPSW object 144762306a36Sopenharmony_ci * @acl_id: ACL ID 144862306a36Sopenharmony_ci * @cfg: Interfaces list 144962306a36Sopenharmony_ci * 145062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 145162306a36Sopenharmony_ci */ 145262306a36Sopenharmony_ciint dpsw_acl_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 145362306a36Sopenharmony_ci u16 acl_id, const struct dpsw_acl_if_cfg *cfg) 145462306a36Sopenharmony_ci{ 145562306a36Sopenharmony_ci struct dpsw_cmd_acl_if *cmd_params; 145662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 145762306a36Sopenharmony_ci 145862306a36Sopenharmony_ci /* prepare command */ 145962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ACL_REMOVE_IF, cmd_flags, 146062306a36Sopenharmony_ci token); 146162306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_acl_if *)cmd.params; 146262306a36Sopenharmony_ci cmd_params->acl_id = cpu_to_le16(acl_id); 146362306a36Sopenharmony_ci cmd_params->num_ifs = cpu_to_le16(cfg->num_ifs); 146462306a36Sopenharmony_ci build_if_id_bitmap(&cmd_params->if_id, cfg->if_id, cfg->num_ifs); 146562306a36Sopenharmony_ci 146662306a36Sopenharmony_ci /* send command to mc*/ 146762306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 146862306a36Sopenharmony_ci} 146962306a36Sopenharmony_ci 147062306a36Sopenharmony_ci/** 147162306a36Sopenharmony_ci * dpsw_acl_prepare_entry_cfg() - Setup an ACL entry 147262306a36Sopenharmony_ci * @key: Key 147362306a36Sopenharmony_ci * @entry_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA 147462306a36Sopenharmony_ci * 147562306a36Sopenharmony_ci * This function has to be called before adding or removing acl_entry 147662306a36Sopenharmony_ci * 147762306a36Sopenharmony_ci */ 147862306a36Sopenharmony_civoid dpsw_acl_prepare_entry_cfg(const struct dpsw_acl_key *key, 147962306a36Sopenharmony_ci u8 *entry_cfg_buf) 148062306a36Sopenharmony_ci{ 148162306a36Sopenharmony_ci struct dpsw_prep_acl_entry *ext_params; 148262306a36Sopenharmony_ci int i; 148362306a36Sopenharmony_ci 148462306a36Sopenharmony_ci ext_params = (struct dpsw_prep_acl_entry *)entry_cfg_buf; 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 148762306a36Sopenharmony_ci ext_params->match_l2_dest_mac[i] = key->match.l2_dest_mac[5 - i]; 148862306a36Sopenharmony_ci ext_params->match_l2_source_mac[i] = key->match.l2_source_mac[5 - i]; 148962306a36Sopenharmony_ci ext_params->mask_l2_dest_mac[i] = key->mask.l2_dest_mac[5 - i]; 149062306a36Sopenharmony_ci ext_params->mask_l2_source_mac[i] = key->mask.l2_source_mac[5 - i]; 149162306a36Sopenharmony_ci } 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_ci ext_params->match_l2_tpid = cpu_to_le16(key->match.l2_tpid); 149462306a36Sopenharmony_ci ext_params->match_l2_vlan_id = cpu_to_le16(key->match.l2_vlan_id); 149562306a36Sopenharmony_ci ext_params->match_l3_dest_ip = cpu_to_le32(key->match.l3_dest_ip); 149662306a36Sopenharmony_ci ext_params->match_l3_source_ip = cpu_to_le32(key->match.l3_source_ip); 149762306a36Sopenharmony_ci ext_params->match_l4_dest_port = cpu_to_le16(key->match.l4_dest_port); 149862306a36Sopenharmony_ci ext_params->match_l4_source_port = cpu_to_le16(key->match.l4_source_port); 149962306a36Sopenharmony_ci ext_params->match_l2_ether_type = cpu_to_le16(key->match.l2_ether_type); 150062306a36Sopenharmony_ci ext_params->match_l2_pcp_dei = key->match.l2_pcp_dei; 150162306a36Sopenharmony_ci ext_params->match_l3_dscp = key->match.l3_dscp; 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci ext_params->mask_l2_tpid = cpu_to_le16(key->mask.l2_tpid); 150462306a36Sopenharmony_ci ext_params->mask_l2_vlan_id = cpu_to_le16(key->mask.l2_vlan_id); 150562306a36Sopenharmony_ci ext_params->mask_l3_dest_ip = cpu_to_le32(key->mask.l3_dest_ip); 150662306a36Sopenharmony_ci ext_params->mask_l3_source_ip = cpu_to_le32(key->mask.l3_source_ip); 150762306a36Sopenharmony_ci ext_params->mask_l4_dest_port = cpu_to_le16(key->mask.l4_dest_port); 150862306a36Sopenharmony_ci ext_params->mask_l4_source_port = cpu_to_le16(key->mask.l4_source_port); 150962306a36Sopenharmony_ci ext_params->mask_l2_ether_type = cpu_to_le16(key->mask.l2_ether_type); 151062306a36Sopenharmony_ci ext_params->mask_l2_pcp_dei = key->mask.l2_pcp_dei; 151162306a36Sopenharmony_ci ext_params->mask_l3_dscp = key->mask.l3_dscp; 151262306a36Sopenharmony_ci ext_params->match_l3_protocol = key->match.l3_protocol; 151362306a36Sopenharmony_ci ext_params->mask_l3_protocol = key->mask.l3_protocol; 151462306a36Sopenharmony_ci} 151562306a36Sopenharmony_ci 151662306a36Sopenharmony_ci/** 151762306a36Sopenharmony_ci * dpsw_acl_add_entry() - Add a rule to the ACL table. 151862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 151962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 152062306a36Sopenharmony_ci * @token: Token of DPSW object 152162306a36Sopenharmony_ci * @acl_id: ACL ID 152262306a36Sopenharmony_ci * @cfg: Entry configuration 152362306a36Sopenharmony_ci * 152462306a36Sopenharmony_ci * warning: This function has to be called after dpsw_acl_prepare_entry_cfg() 152562306a36Sopenharmony_ci * 152662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 152762306a36Sopenharmony_ci */ 152862306a36Sopenharmony_ciint dpsw_acl_add_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 152962306a36Sopenharmony_ci u16 acl_id, const struct dpsw_acl_entry_cfg *cfg) 153062306a36Sopenharmony_ci{ 153162306a36Sopenharmony_ci struct dpsw_cmd_acl_entry *cmd_params; 153262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 153362306a36Sopenharmony_ci 153462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ACL_ADD_ENTRY, cmd_flags, 153562306a36Sopenharmony_ci token); 153662306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_acl_entry *)cmd.params; 153762306a36Sopenharmony_ci cmd_params->acl_id = cpu_to_le16(acl_id); 153862306a36Sopenharmony_ci cmd_params->result_if_id = cpu_to_le16(cfg->result.if_id); 153962306a36Sopenharmony_ci cmd_params->precedence = cpu_to_le32(cfg->precedence); 154062306a36Sopenharmony_ci cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 154162306a36Sopenharmony_ci dpsw_set_field(cmd_params->result_action, 154262306a36Sopenharmony_ci RESULT_ACTION, 154362306a36Sopenharmony_ci cfg->result.action); 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 154662306a36Sopenharmony_ci} 154762306a36Sopenharmony_ci 154862306a36Sopenharmony_ci/** 154962306a36Sopenharmony_ci * dpsw_acl_remove_entry() - Removes an entry from ACL. 155062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 155162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 155262306a36Sopenharmony_ci * @token: Token of DPSW object 155362306a36Sopenharmony_ci * @acl_id: ACL ID 155462306a36Sopenharmony_ci * @cfg: Entry configuration 155562306a36Sopenharmony_ci * 155662306a36Sopenharmony_ci * warning: This function has to be called after dpsw_acl_set_entry_cfg() 155762306a36Sopenharmony_ci * 155862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 155962306a36Sopenharmony_ci */ 156062306a36Sopenharmony_ciint dpsw_acl_remove_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 156162306a36Sopenharmony_ci u16 acl_id, const struct dpsw_acl_entry_cfg *cfg) 156262306a36Sopenharmony_ci{ 156362306a36Sopenharmony_ci struct dpsw_cmd_acl_entry *cmd_params; 156462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 156562306a36Sopenharmony_ci 156662306a36Sopenharmony_ci /* prepare command */ 156762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_ACL_REMOVE_ENTRY, 156862306a36Sopenharmony_ci cmd_flags, 156962306a36Sopenharmony_ci token); 157062306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_acl_entry *)cmd.params; 157162306a36Sopenharmony_ci cmd_params->acl_id = cpu_to_le16(acl_id); 157262306a36Sopenharmony_ci cmd_params->result_if_id = cpu_to_le16(cfg->result.if_id); 157362306a36Sopenharmony_ci cmd_params->precedence = cpu_to_le32(cfg->precedence); 157462306a36Sopenharmony_ci cmd_params->key_iova = cpu_to_le64(cfg->key_iova); 157562306a36Sopenharmony_ci dpsw_set_field(cmd_params->result_action, 157662306a36Sopenharmony_ci RESULT_ACTION, 157762306a36Sopenharmony_ci cfg->result.action); 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_ci /* send command to mc*/ 158062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 158162306a36Sopenharmony_ci} 158262306a36Sopenharmony_ci 158362306a36Sopenharmony_ci/** 158462306a36Sopenharmony_ci * dpsw_set_reflection_if() - Set target interface for traffic mirrored 158562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 158662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 158762306a36Sopenharmony_ci * @token: Token of DPSW object 158862306a36Sopenharmony_ci * @if_id: Interface Id 158962306a36Sopenharmony_ci * 159062306a36Sopenharmony_ci * Only one mirroring destination is allowed per switch 159162306a36Sopenharmony_ci * 159262306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 159362306a36Sopenharmony_ci */ 159462306a36Sopenharmony_ciint dpsw_set_reflection_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 159562306a36Sopenharmony_ci u16 if_id) 159662306a36Sopenharmony_ci{ 159762306a36Sopenharmony_ci struct dpsw_cmd_set_reflection_if *cmd_params; 159862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 159962306a36Sopenharmony_ci 160062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_SET_REFLECTION_IF, 160162306a36Sopenharmony_ci cmd_flags, 160262306a36Sopenharmony_ci token); 160362306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_set_reflection_if *)cmd.params; 160462306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 160562306a36Sopenharmony_ci 160662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 160762306a36Sopenharmony_ci} 160862306a36Sopenharmony_ci 160962306a36Sopenharmony_ci/** 161062306a36Sopenharmony_ci * dpsw_if_add_reflection() - Setup mirroring rule 161162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 161262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 161362306a36Sopenharmony_ci * @token: Token of DPSW object 161462306a36Sopenharmony_ci * @if_id: Interface Identifier 161562306a36Sopenharmony_ci * @cfg: Reflection configuration 161662306a36Sopenharmony_ci * 161762306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 161862306a36Sopenharmony_ci */ 161962306a36Sopenharmony_ciint dpsw_if_add_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 162062306a36Sopenharmony_ci u16 if_id, const struct dpsw_reflection_cfg *cfg) 162162306a36Sopenharmony_ci{ 162262306a36Sopenharmony_ci struct dpsw_cmd_if_reflection *cmd_params; 162362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 162462306a36Sopenharmony_ci 162562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_ADD_REFLECTION, 162662306a36Sopenharmony_ci cmd_flags, 162762306a36Sopenharmony_ci token); 162862306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_reflection *)cmd.params; 162962306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 163062306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(cfg->vlan_id); 163162306a36Sopenharmony_ci dpsw_set_field(cmd_params->filter, FILTER, cfg->filter); 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 163462306a36Sopenharmony_ci} 163562306a36Sopenharmony_ci 163662306a36Sopenharmony_ci/** 163762306a36Sopenharmony_ci * dpsw_if_remove_reflection() - Remove mirroring rule 163862306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 163962306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 164062306a36Sopenharmony_ci * @token: Token of DPSW object 164162306a36Sopenharmony_ci * @if_id: Interface Identifier 164262306a36Sopenharmony_ci * @cfg: Reflection configuration 164362306a36Sopenharmony_ci * 164462306a36Sopenharmony_ci * Return: Completion status. '0' on Success; Error code otherwise. 164562306a36Sopenharmony_ci */ 164662306a36Sopenharmony_ciint dpsw_if_remove_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 164762306a36Sopenharmony_ci u16 if_id, const struct dpsw_reflection_cfg *cfg) 164862306a36Sopenharmony_ci{ 164962306a36Sopenharmony_ci struct dpsw_cmd_if_reflection *cmd_params; 165062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 165162306a36Sopenharmony_ci 165262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_REMOVE_REFLECTION, 165362306a36Sopenharmony_ci cmd_flags, 165462306a36Sopenharmony_ci token); 165562306a36Sopenharmony_ci cmd_params = (struct dpsw_cmd_if_reflection *)cmd.params; 165662306a36Sopenharmony_ci cmd_params->if_id = cpu_to_le16(if_id); 165762306a36Sopenharmony_ci cmd_params->vlan_id = cpu_to_le16(cfg->vlan_id); 165862306a36Sopenharmony_ci dpsw_set_field(cmd_params->filter, FILTER, cfg->filter); 165962306a36Sopenharmony_ci 166062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 166162306a36Sopenharmony_ci} 1662