ice: refactor FC functions
Create a helper function for configuring requested flow control so that it can be utilized by other functions looking to configure flow control settings. Utilize the existing helper ice_copy_phy_caps_to_cfg() to copy a PHY capability to configuration instead duplicating the code for it. Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
769c500dcc
commit
2ffb60856a
|
@ -2515,28 +2515,19 @@ enum ice_status ice_update_link_info(struct ice_port_info *pi)
|
|||
}
|
||||
|
||||
/**
|
||||
* ice_set_fc
|
||||
* @pi: port information structure
|
||||
* @aq_failures: pointer to status code, specific to ice_set_fc routine
|
||||
* @ena_auto_link_update: enable automatic link update
|
||||
*
|
||||
* Set the requested flow control mode.
|
||||
* ice_cfg_phy_fc - Configure PHY FC data based on FC mode
|
||||
* @cfg: PHY configuration data to set FC mode
|
||||
* @req_mode: FC mode to configure
|
||||
*/
|
||||
enum ice_status
|
||||
ice_set_fc(struct ice_port_info *pi, u8 *aq_failures, bool ena_auto_link_update)
|
||||
static enum ice_status
|
||||
ice_cfg_phy_fc(struct ice_aqc_set_phy_cfg_data *cfg, enum ice_fc_mode req_mode)
|
||||
{
|
||||
struct ice_aqc_set_phy_cfg_data cfg = { 0 };
|
||||
struct ice_aqc_get_phy_caps_data *pcaps;
|
||||
enum ice_status status;
|
||||
u8 pause_mask = 0x0;
|
||||
struct ice_hw *hw;
|
||||
|
||||
if (!pi)
|
||||
return ICE_ERR_PARAM;
|
||||
hw = pi->hw;
|
||||
*aq_failures = ICE_SET_FC_AQ_FAIL_NONE;
|
||||
if (!cfg)
|
||||
return ICE_ERR_BAD_PTR;
|
||||
|
||||
switch (pi->fc.req_mode) {
|
||||
switch (req_mode) {
|
||||
case ICE_FC_FULL:
|
||||
pause_mask |= ICE_AQC_PHY_EN_TX_LINK_PAUSE;
|
||||
pause_mask |= ICE_AQC_PHY_EN_RX_LINK_PAUSE;
|
||||
|
@ -2551,6 +2542,38 @@ ice_set_fc(struct ice_port_info *pi, u8 *aq_failures, bool ena_auto_link_update)
|
|||
break;
|
||||
}
|
||||
|
||||
/* clear the old pause settings */
|
||||
cfg->caps &= ~(ICE_AQC_PHY_EN_TX_LINK_PAUSE |
|
||||
ICE_AQC_PHY_EN_RX_LINK_PAUSE);
|
||||
|
||||
/* set the new capabilities */
|
||||
cfg->caps |= pause_mask;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_set_fc
|
||||
* @pi: port information structure
|
||||
* @aq_failures: pointer to status code, specific to ice_set_fc routine
|
||||
* @ena_auto_link_update: enable automatic link update
|
||||
*
|
||||
* Set the requested flow control mode.
|
||||
*/
|
||||
enum ice_status
|
||||
ice_set_fc(struct ice_port_info *pi, u8 *aq_failures, bool ena_auto_link_update)
|
||||
{
|
||||
struct ice_aqc_set_phy_cfg_data cfg = { 0 };
|
||||
struct ice_aqc_get_phy_caps_data *pcaps;
|
||||
enum ice_status status;
|
||||
struct ice_hw *hw;
|
||||
|
||||
if (!pi)
|
||||
return ICE_ERR_BAD_PTR;
|
||||
|
||||
*aq_failures = 0;
|
||||
hw = pi->hw;
|
||||
|
||||
pcaps = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*pcaps), GFP_KERNEL);
|
||||
if (!pcaps)
|
||||
return ICE_ERR_NO_MEMORY;
|
||||
|
@ -2563,12 +2586,12 @@ ice_set_fc(struct ice_port_info *pi, u8 *aq_failures, bool ena_auto_link_update)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* clear the old pause settings */
|
||||
cfg.caps = pcaps->caps & ~(ICE_AQC_PHY_EN_TX_LINK_PAUSE |
|
||||
ICE_AQC_PHY_EN_RX_LINK_PAUSE);
|
||||
ice_copy_phy_caps_to_cfg(pcaps, &cfg);
|
||||
|
||||
/* set the new capabilities */
|
||||
cfg.caps |= pause_mask;
|
||||
/* Configure the set PHY data */
|
||||
status = ice_cfg_phy_fc(&cfg, pi->fc.req_mode);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
/* If the capabilities have changed, then set the new config */
|
||||
if (cfg.caps != pcaps->caps) {
|
||||
|
@ -2577,13 +2600,6 @@ ice_set_fc(struct ice_port_info *pi, u8 *aq_failures, bool ena_auto_link_update)
|
|||
/* Auto restart link so settings take effect */
|
||||
if (ena_auto_link_update)
|
||||
cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
|
||||
/* Copy over all the old settings */
|
||||
cfg.phy_type_high = pcaps->phy_type_high;
|
||||
cfg.phy_type_low = pcaps->phy_type_low;
|
||||
cfg.low_power_ctrl = pcaps->low_power_ctrl;
|
||||
cfg.eee_cap = pcaps->eee_cap;
|
||||
cfg.eeer_value = pcaps->eeer_value;
|
||||
cfg.link_fec_opt = pcaps->link_fec_options;
|
||||
|
||||
status = ice_aq_set_phy_cfg(hw, pi->lport, &cfg, NULL);
|
||||
if (status) {
|
||||
|
@ -2629,6 +2645,7 @@ ice_copy_phy_caps_to_cfg(struct ice_aqc_get_phy_caps_data *caps,
|
|||
if (!caps || !cfg)
|
||||
return;
|
||||
|
||||
memset(cfg, 0, sizeof(*cfg));
|
||||
cfg->phy_type_low = caps->phy_type_low;
|
||||
cfg->phy_type_high = caps->phy_type_high;
|
||||
cfg->caps = caps->caps;
|
||||
|
|
Loading…
Reference in New Issue