ice: c827: move wait for FW to ice_init_hw()

JIRA: https://issues.redhat.com/browse/RHEL-63642

Upstream commit(s):
commit c37dd67c423308c5a58c1a6e5b53229a95e19c3f
Author: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Date:   Wed Oct 2 13:50:21 2024 +0200

    ice: c827: move wait for FW to ice_init_hw()

    Move call to ice_wait_for_fw() from ice_init_dev() into ice_init_hw(),
    where it fits better. This requires also to move ice_wait_for_fw()
    to ice_common.c.

    ice_is_pf_c827() is now used only in ice_common.c, so it could be static.

    Reviewed-by: Marcin Szycik <marcin.szycik@linux.intel.com>
    Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
    Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>

Signed-off-by: Petr Oros <poros@redhat.com>
This commit is contained in:
Petr Oros 2025-02-19 13:37:34 +01:00
parent 5150d3a815
commit 8a26b1a718
3 changed files with 75 additions and 73 deletions

View File

@ -307,6 +307,42 @@ bool ice_is_e825c(struct ice_hw *hw)
}
}
/**
* ice_is_pf_c827 - check if pf contains c827 phy
* @hw: pointer to the hw struct
*
* Return: true if the device has c827 phy.
*/
static bool ice_is_pf_c827(struct ice_hw *hw)
{
struct ice_aqc_get_link_topo cmd = {};
u8 node_part_number;
u16 node_handle;
int status;
if (hw->mac_type != ICE_MAC_E810)
return false;
if (hw->device_id != ICE_DEV_ID_E810C_QSFP)
return true;
cmd.addr.topo_params.node_type_ctx =
FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_TYPE_M, ICE_AQC_LINK_TOPO_NODE_TYPE_PHY) |
FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_CTX_M, ICE_AQC_LINK_TOPO_NODE_CTX_PORT);
cmd.addr.topo_params.index = 0;
status = ice_aq_get_netlist_node(hw, &cmd, &node_part_number,
&node_handle);
if (status || node_part_number != ICE_AQC_GET_LINK_TOPO_NODE_NR_C827)
return false;
if (node_handle == E810C_QSFP_C827_0_HANDLE || node_handle == E810C_QSFP_C827_1_HANDLE)
return true;
return false;
}
/**
* ice_clear_pf_cfg - Clear PF configuration
* @hw: pointer to the hardware structure
@ -1021,6 +1057,33 @@ static void ice_get_itr_intrl_gran(struct ice_hw *hw)
}
}
/**
* ice_wait_for_fw - wait for full FW readiness
* @hw: pointer to the hardware structure
* @timeout: milliseconds that can elapse before timing out
*
* Return: 0 on success, -ETIMEDOUT on timeout.
*/
static int ice_wait_for_fw(struct ice_hw *hw, u32 timeout)
{
int fw_loading;
u32 elapsed = 0;
while (elapsed <= timeout) {
fw_loading = rd32(hw, GL_MNG_FWSM) & GL_MNG_FWSM_FW_LOADING_M;
/* firmware was not yet loaded, we have to wait more */
if (fw_loading) {
elapsed += 100;
msleep(100);
continue;
}
return 0;
}
return -ETIMEDOUT;
}
/**
* ice_init_hw - main hardware initialization routine
* @hw: pointer to the hardware structure
@ -1170,8 +1233,19 @@ int ice_init_hw(struct ice_hw *hw)
mutex_init(&hw->tnl_lock);
ice_init_chk_recipe_reuse_support(hw);
return 0;
/* Some cards require longer initialization times
* due to necessity of loading FW from an external source.
* This can take even half a minute.
*/
if (ice_is_pf_c827(hw)) {
status = ice_wait_for_fw(hw, 30000);
if (status) {
dev_err(ice_hw_to_dev(hw), "ice_wait_for_fw timed out");
goto err_unroll_fltr_mgmt_struct;
}
}
return 0;
err_unroll_fltr_mgmt_struct:
ice_cleanup_fltr_mgmt_struct(hw);
err_unroll_sched:
@ -2687,40 +2761,6 @@ ice_parse_dev_caps(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p,
ice_recalc_port_limited_caps(hw, &dev_p->common_cap);
}
/**
* ice_is_pf_c827 - check if pf contains c827 phy
* @hw: pointer to the hw struct
*/
bool ice_is_pf_c827(struct ice_hw *hw)
{
struct ice_aqc_get_link_topo cmd = {};
u8 node_part_number;
u16 node_handle;
int status;
if (hw->mac_type != ICE_MAC_E810)
return false;
if (hw->device_id != ICE_DEV_ID_E810C_QSFP)
return true;
cmd.addr.topo_params.node_type_ctx =
FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_TYPE_M, ICE_AQC_LINK_TOPO_NODE_TYPE_PHY) |
FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_CTX_M, ICE_AQC_LINK_TOPO_NODE_CTX_PORT);
cmd.addr.topo_params.index = 0;
status = ice_aq_get_netlist_node(hw, &cmd, &node_part_number,
&node_handle);
if (status || node_part_number != ICE_AQC_GET_LINK_TOPO_NODE_NR_C827)
return false;
if (node_handle == E810C_QSFP_C827_0_HANDLE || node_handle == E810C_QSFP_C827_1_HANDLE)
return true;
return false;
}
/**
* ice_is_phy_rclk_in_netlist
* @hw: pointer to the hw struct

View File

@ -113,7 +113,6 @@ int
ice_aq_get_phy_caps(struct ice_port_info *pi, bool qual_mods, u8 report_mode,
struct ice_aqc_get_phy_caps_data *caps,
struct ice_sq_cd *cd);
bool ice_is_pf_c827(struct ice_hw *hw);
bool ice_is_phy_rclk_in_netlist(struct ice_hw *hw);
bool ice_is_clock_mux_in_netlist(struct ice_hw *hw);
bool ice_is_cgu_in_netlist(struct ice_hw *hw);

View File

@ -4712,31 +4712,6 @@ static void ice_decfg_netdev(struct ice_vsi *vsi)
vsi->netdev = NULL;
}
/**
* ice_wait_for_fw - wait for full FW readiness
* @hw: pointer to the hardware structure
* @timeout: milliseconds that can elapse before timing out
*/
static int ice_wait_for_fw(struct ice_hw *hw, u32 timeout)
{
int fw_loading;
u32 elapsed = 0;
while (elapsed <= timeout) {
fw_loading = rd32(hw, GL_MNG_FWSM) & GL_MNG_FWSM_FW_LOADING_M;
/* firmware was not yet loaded, we have to wait more */
if (fw_loading) {
elapsed += 100;
msleep(100);
continue;
}
return 0;
}
return -ETIMEDOUT;
}
int ice_init_dev(struct ice_pf *pf)
{
struct device *dev = ice_pf_to_dev(pf);
@ -4749,18 +4724,6 @@ int ice_init_dev(struct ice_pf *pf)
return err;
}
/* Some cards require longer initialization times
* due to necessity of loading FW from an external source.
* This can take even half a minute.
*/
if (ice_is_pf_c827(hw)) {
err = ice_wait_for_fw(hw, 30000);
if (err) {
dev_err(dev, "ice_wait_for_fw timed out");
return err;
}
}
ice_init_feature_support(pf);
err = ice_init_ddp_config(hw, pf);