ice: Add port option admin queue commands
Implement support for Get/Set Port Options admin queue commands (0x06EA/0x06EB). These firmware commands allow the driver to change port specific options and will be used in the next patch. Co-developed-by: Lev Faerman <lev.faerman@intel.com> Signed-off-by: Lev Faerman <lev.faerman@intel.com> Co-developed-by: Damian Milosek <damian.milosek@intel.com> Signed-off-by: Damian Milosek <damian.milosek@intel.com> Co-developed-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Anatolii Gerasymenko <anatolii.gerasymenko@intel.com> Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
4c99bc96e0
commit
781f15eac0
|
@ -1423,6 +1423,56 @@ struct ice_aqc_set_port_id_led {
|
|||
u8 rsvd[13];
|
||||
};
|
||||
|
||||
/* Get Port Options (indirect, 0x06EA) */
|
||||
struct ice_aqc_get_port_options {
|
||||
u8 lport_num;
|
||||
u8 lport_num_valid;
|
||||
u8 port_options_count;
|
||||
#define ICE_AQC_PORT_OPT_COUNT_M GENMASK(3, 0)
|
||||
#define ICE_AQC_PORT_OPT_MAX 16
|
||||
|
||||
u8 innermost_phy_index;
|
||||
u8 port_options;
|
||||
#define ICE_AQC_PORT_OPT_ACTIVE_M GENMASK(3, 0)
|
||||
#define ICE_AQC_PORT_OPT_VALID BIT(7)
|
||||
|
||||
u8 pending_port_option_status;
|
||||
#define ICE_AQC_PENDING_PORT_OPT_IDX_M GENMASK(3, 0)
|
||||
#define ICE_AQC_PENDING_PORT_OPT_VALID BIT(7)
|
||||
|
||||
u8 rsvd[2];
|
||||
__le32 addr_high;
|
||||
__le32 addr_low;
|
||||
};
|
||||
|
||||
struct ice_aqc_get_port_options_elem {
|
||||
u8 pmd;
|
||||
#define ICE_AQC_PORT_OPT_PMD_COUNT_M GENMASK(3, 0)
|
||||
|
||||
u8 max_lane_speed;
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_M GENMASK(3, 0)
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_100M 0
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_1G 1
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_2500M 2
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_5G 3
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_10G 4
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_25G 5
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_50G 6
|
||||
#define ICE_AQC_PORT_OPT_MAX_LANE_100G 7
|
||||
|
||||
u8 global_scid[2];
|
||||
u8 phy_scid[2];
|
||||
u8 pf2port_cid[2];
|
||||
};
|
||||
|
||||
/* Set Port Option (direct, 0x06EB) */
|
||||
struct ice_aqc_set_port_option {
|
||||
u8 lport_num;
|
||||
u8 lport_num_valid;
|
||||
u8 selected_port_option;
|
||||
u8 rsvd[13];
|
||||
};
|
||||
|
||||
/* Set/Get GPIO (direct, 0x06EC/0x06ED) */
|
||||
struct ice_aqc_gpio {
|
||||
__le16 gpio_ctrl_handle;
|
||||
|
@ -2082,6 +2132,8 @@ struct ice_aq_desc {
|
|||
struct ice_aqc_gpio read_write_gpio;
|
||||
struct ice_aqc_sff_eeprom read_write_sff_param;
|
||||
struct ice_aqc_set_port_id_led set_port_id_led;
|
||||
struct ice_aqc_get_port_options get_port_options;
|
||||
struct ice_aqc_set_port_option set_port_option;
|
||||
struct ice_aqc_get_sw_cfg get_sw_conf;
|
||||
struct ice_aqc_set_port_params set_port_params;
|
||||
struct ice_aqc_sw_rules sw_rules;
|
||||
|
@ -2243,6 +2295,8 @@ enum ice_adminq_opc {
|
|||
ice_aqc_opc_read_i2c = 0x06E2,
|
||||
ice_aqc_opc_write_i2c = 0x06E3,
|
||||
ice_aqc_opc_set_port_id_led = 0x06E9,
|
||||
ice_aqc_opc_get_port_options = 0x06EA,
|
||||
ice_aqc_opc_set_port_option = 0x06EB,
|
||||
ice_aqc_opc_set_gpio = 0x06EC,
|
||||
ice_aqc_opc_get_gpio = 0x06ED,
|
||||
ice_aqc_opc_sff_eeprom = 0x06EE,
|
||||
|
|
|
@ -3554,6 +3554,121 @@ ice_aq_set_port_id_led(struct ice_port_info *pi, bool is_orig_mode,
|
|||
return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_aq_get_port_options
|
||||
* @hw: pointer to the HW struct
|
||||
* @options: buffer for the resultant port options
|
||||
* @option_count: input - size of the buffer in port options structures,
|
||||
* output - number of returned port options
|
||||
* @lport: logical port to call the command with (optional)
|
||||
* @lport_valid: when false, FW uses port owned by the PF instead of lport,
|
||||
* when PF owns more than 1 port it must be true
|
||||
* @active_option_idx: index of active port option in returned buffer
|
||||
* @active_option_valid: active option in returned buffer is valid
|
||||
* @pending_option_idx: index of pending port option in returned buffer
|
||||
* @pending_option_valid: pending option in returned buffer is valid
|
||||
*
|
||||
* Calls Get Port Options AQC (0x06ea) and verifies result.
|
||||
*/
|
||||
int
|
||||
ice_aq_get_port_options(struct ice_hw *hw,
|
||||
struct ice_aqc_get_port_options_elem *options,
|
||||
u8 *option_count, u8 lport, bool lport_valid,
|
||||
u8 *active_option_idx, bool *active_option_valid,
|
||||
u8 *pending_option_idx, bool *pending_option_valid)
|
||||
{
|
||||
struct ice_aqc_get_port_options *cmd;
|
||||
struct ice_aq_desc desc;
|
||||
int status;
|
||||
u8 i;
|
||||
|
||||
/* options buffer shall be able to hold max returned options */
|
||||
if (*option_count < ICE_AQC_PORT_OPT_COUNT_M)
|
||||
return -EINVAL;
|
||||
|
||||
cmd = &desc.params.get_port_options;
|
||||
ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_port_options);
|
||||
|
||||
if (lport_valid)
|
||||
cmd->lport_num = lport;
|
||||
cmd->lport_num_valid = lport_valid;
|
||||
|
||||
status = ice_aq_send_cmd(hw, &desc, options,
|
||||
*option_count * sizeof(*options), NULL);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* verify direct FW response & set output parameters */
|
||||
*option_count = FIELD_GET(ICE_AQC_PORT_OPT_COUNT_M,
|
||||
cmd->port_options_count);
|
||||
ice_debug(hw, ICE_DBG_PHY, "options: %x\n", *option_count);
|
||||
*active_option_valid = FIELD_GET(ICE_AQC_PORT_OPT_VALID,
|
||||
cmd->port_options);
|
||||
if (*active_option_valid) {
|
||||
*active_option_idx = FIELD_GET(ICE_AQC_PORT_OPT_ACTIVE_M,
|
||||
cmd->port_options);
|
||||
if (*active_option_idx > (*option_count - 1))
|
||||
return -EIO;
|
||||
ice_debug(hw, ICE_DBG_PHY, "active idx: %x\n",
|
||||
*active_option_idx);
|
||||
}
|
||||
|
||||
*pending_option_valid = FIELD_GET(ICE_AQC_PENDING_PORT_OPT_VALID,
|
||||
cmd->pending_port_option_status);
|
||||
if (*pending_option_valid) {
|
||||
*pending_option_idx = FIELD_GET(ICE_AQC_PENDING_PORT_OPT_IDX_M,
|
||||
cmd->pending_port_option_status);
|
||||
if (*pending_option_idx > (*option_count - 1))
|
||||
return -EIO;
|
||||
ice_debug(hw, ICE_DBG_PHY, "pending idx: %x\n",
|
||||
*pending_option_idx);
|
||||
}
|
||||
|
||||
/* mask output options fields */
|
||||
for (i = 0; i < *option_count; i++) {
|
||||
options[i].pmd = FIELD_GET(ICE_AQC_PORT_OPT_PMD_COUNT_M,
|
||||
options[i].pmd);
|
||||
options[i].max_lane_speed = FIELD_GET(ICE_AQC_PORT_OPT_MAX_LANE_M,
|
||||
options[i].max_lane_speed);
|
||||
ice_debug(hw, ICE_DBG_PHY, "pmds: %x max speed: %x\n",
|
||||
options[i].pmd, options[i].max_lane_speed);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_aq_set_port_option
|
||||
* @hw: pointer to the HW struct
|
||||
* @lport: logical port to call the command with
|
||||
* @lport_valid: when false, FW uses port owned by the PF instead of lport,
|
||||
* when PF owns more than 1 port it must be true
|
||||
* @new_option: new port option to be written
|
||||
*
|
||||
* Calls Set Port Options AQC (0x06eb).
|
||||
*/
|
||||
int
|
||||
ice_aq_set_port_option(struct ice_hw *hw, u8 lport, u8 lport_valid,
|
||||
u8 new_option)
|
||||
{
|
||||
struct ice_aqc_set_port_option *cmd;
|
||||
struct ice_aq_desc desc;
|
||||
|
||||
if (new_option > ICE_AQC_PORT_OPT_COUNT_M)
|
||||
return -EINVAL;
|
||||
|
||||
cmd = &desc.params.set_port_option;
|
||||
ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_port_option);
|
||||
|
||||
if (lport_valid)
|
||||
cmd->lport_num = lport;
|
||||
|
||||
cmd->lport_num_valid = lport_valid;
|
||||
cmd->selected_port_option = new_option;
|
||||
|
||||
return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_aq_sff_eeprom
|
||||
* @hw: pointer to the HW struct
|
||||
|
|
|
@ -151,6 +151,15 @@ int
|
|||
ice_aq_set_port_id_led(struct ice_port_info *pi, bool is_orig_mode,
|
||||
struct ice_sq_cd *cd);
|
||||
int
|
||||
ice_aq_get_port_options(struct ice_hw *hw,
|
||||
struct ice_aqc_get_port_options_elem *options,
|
||||
u8 *option_count, u8 lport, bool lport_valid,
|
||||
u8 *active_option_idx, bool *active_option_valid,
|
||||
u8 *pending_option_idx, bool *pending_option_valid);
|
||||
int
|
||||
ice_aq_set_port_option(struct ice_hw *hw, u8 lport, u8 lport_valid,
|
||||
u8 new_option);
|
||||
int
|
||||
ice_aq_sff_eeprom(struct ice_hw *hw, u16 lport, u8 bus_addr,
|
||||
u16 mem_addr, u8 page, u8 set_page, u8 *data, u8 length,
|
||||
bool write, struct ice_sq_cd *cd);
|
||||
|
|
Loading…
Reference in New Issue