mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 23:48:53 +07:00
ice: Use ice_ena_vsi and ice_dis_vsi in DCB configuration flow
DCB configuration flow needs to disable and enable only the PF (main) VSI, so use ice_ena_vsi and ice_dis_vsi. To avoid the use of ifdef to control the staticness of these functions, move them to ice_lib.c. Also replace the allocate and copy of old_cfg to kmemdup() in ice_pf_dcb_cfg(). Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
c8119fa892
commit
9d614b6425
@ -502,10 +502,6 @@ int ice_set_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
|
||||
int ice_get_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
|
||||
void ice_fill_rss_lut(u8 *lut, u16 rss_table_size, u16 rss_size);
|
||||
void ice_print_link_msg(struct ice_vsi *vsi, bool isup);
|
||||
#ifdef CONFIG_DCB
|
||||
int ice_pf_ena_all_vsi(struct ice_pf *pf, bool locked);
|
||||
void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked);
|
||||
#endif /* CONFIG_DCB */
|
||||
int ice_open(struct net_device *netdev);
|
||||
int ice_stop(struct net_device *netdev);
|
||||
|
||||
|
@ -150,6 +150,7 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
|
||||
{
|
||||
struct ice_dcbx_cfg *old_cfg, *curr_cfg;
|
||||
struct ice_aqc_port_ets_elem buf = { 0 };
|
||||
struct ice_vsi *pf_vsi;
|
||||
int ret = 0;
|
||||
|
||||
curr_cfg = &pf->hw.port_info->local_dcbx_cfg;
|
||||
@ -169,15 +170,23 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
|
||||
}
|
||||
|
||||
/* Store old config in case FW config fails */
|
||||
old_cfg = devm_kzalloc(&pf->pdev->dev, sizeof(*old_cfg), GFP_KERNEL);
|
||||
memcpy(old_cfg, curr_cfg, sizeof(*old_cfg));
|
||||
old_cfg = kmemdup(curr_cfg, sizeof(*old_cfg), GFP_KERNEL);
|
||||
if (!old_cfg)
|
||||
return -ENOMEM;
|
||||
|
||||
pf_vsi = ice_get_main_vsi(pf);
|
||||
if (!pf_vsi) {
|
||||
dev_dbg(&pf->pdev->dev, "PF VSI doesn't exist\n");
|
||||
ret = -EINVAL;
|
||||
goto free_cfg;
|
||||
}
|
||||
|
||||
/* avoid race conditions by holding the lock while disabling and
|
||||
* re-enabling the VSI
|
||||
*/
|
||||
if (!locked)
|
||||
rtnl_lock();
|
||||
ice_pf_dis_all_vsi(pf, true);
|
||||
ice_dis_vsi(pf_vsi, true);
|
||||
|
||||
memcpy(curr_cfg, new_cfg, sizeof(*curr_cfg));
|
||||
memcpy(&curr_cfg->etsrec, &curr_cfg->etscfg, sizeof(curr_cfg->etsrec));
|
||||
@ -204,10 +213,11 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
|
||||
ice_pf_dcb_recfg(pf);
|
||||
|
||||
out:
|
||||
ice_pf_ena_all_vsi(pf, true);
|
||||
ice_ena_vsi(pf_vsi, true);
|
||||
if (!locked)
|
||||
rtnl_unlock();
|
||||
devm_kfree(&pf->pdev->dev, old_cfg);
|
||||
free_cfg:
|
||||
kfree(old_cfg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -690,6 +700,7 @@ ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
|
||||
struct ice_dcbx_cfg tmp_dcbx_cfg;
|
||||
bool need_reconfig = false;
|
||||
struct ice_port_info *pi;
|
||||
struct ice_vsi *pf_vsi;
|
||||
u8 type;
|
||||
int ret;
|
||||
|
||||
@ -761,8 +772,14 @@ ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
|
||||
clear_bit(ICE_FLAG_DCB_ENA, pf->flags);
|
||||
}
|
||||
|
||||
pf_vsi = ice_get_main_vsi(pf);
|
||||
if (!pf_vsi) {
|
||||
dev_dbg(&pf->pdev->dev, "PF VSI doesn't exist\n");
|
||||
return;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
ice_pf_dis_all_vsi(pf, true);
|
||||
ice_dis_vsi(pf_vsi, true);
|
||||
|
||||
ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
|
||||
if (ret) {
|
||||
@ -774,6 +791,6 @@ ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
|
||||
/* changes in configuration update VSI */
|
||||
ice_pf_dcb_recfg(pf);
|
||||
|
||||
ice_pf_ena_all_vsi(pf, true);
|
||||
ice_ena_vsi(pf_vsi, true);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
@ -2040,6 +2040,62 @@ void ice_vsi_close(struct ice_vsi *vsi)
|
||||
ice_vsi_free_rx_rings(vsi);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_ena_vsi - resume a VSI
|
||||
* @vsi: the VSI being resume
|
||||
* @locked: is the rtnl_lock already held
|
||||
*/
|
||||
int ice_ena_vsi(struct ice_vsi *vsi, bool locked)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (!test_bit(__ICE_NEEDS_RESTART, vsi->state))
|
||||
return 0;
|
||||
|
||||
clear_bit(__ICE_NEEDS_RESTART, vsi->state);
|
||||
|
||||
if (vsi->netdev && vsi->type == ICE_VSI_PF) {
|
||||
if (netif_running(vsi->netdev)) {
|
||||
if (!locked)
|
||||
rtnl_lock();
|
||||
|
||||
err = ice_open(vsi->netdev);
|
||||
|
||||
if (!locked)
|
||||
rtnl_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_dis_vsi - pause a VSI
|
||||
* @vsi: the VSI being paused
|
||||
* @locked: is the rtnl_lock already held
|
||||
*/
|
||||
void ice_dis_vsi(struct ice_vsi *vsi, bool locked)
|
||||
{
|
||||
if (test_bit(__ICE_DOWN, vsi->state))
|
||||
return;
|
||||
|
||||
set_bit(__ICE_NEEDS_RESTART, vsi->state);
|
||||
|
||||
if (vsi->type == ICE_VSI_PF && vsi->netdev) {
|
||||
if (netif_running(vsi->netdev)) {
|
||||
if (!locked)
|
||||
rtnl_lock();
|
||||
|
||||
ice_stop(vsi->netdev);
|
||||
|
||||
if (!locked)
|
||||
rtnl_unlock();
|
||||
} else {
|
||||
ice_vsi_close(vsi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_free_res - free a block of resources
|
||||
* @res: pointer to the resource
|
||||
|
@ -62,6 +62,10 @@ int ice_vsi_release(struct ice_vsi *vsi);
|
||||
|
||||
void ice_vsi_close(struct ice_vsi *vsi);
|
||||
|
||||
int ice_ena_vsi(struct ice_vsi *vsi, bool locked);
|
||||
|
||||
void ice_dis_vsi(struct ice_vsi *vsi, bool locked);
|
||||
|
||||
int ice_free_res(struct ice_res_tracker *res, u16 index, u16 id);
|
||||
|
||||
int
|
||||
|
@ -435,43 +435,12 @@ static void ice_sync_fltr_subtask(struct ice_pf *pf)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_dis_vsi - pause a VSI
|
||||
* @vsi: the VSI being paused
|
||||
* @locked: is the rtnl_lock already held
|
||||
*/
|
||||
static void ice_dis_vsi(struct ice_vsi *vsi, bool locked)
|
||||
{
|
||||
if (test_bit(__ICE_DOWN, vsi->state))
|
||||
return;
|
||||
|
||||
set_bit(__ICE_NEEDS_RESTART, vsi->state);
|
||||
|
||||
if (vsi->type == ICE_VSI_PF && vsi->netdev) {
|
||||
if (netif_running(vsi->netdev)) {
|
||||
if (!locked)
|
||||
rtnl_lock();
|
||||
|
||||
ice_stop(vsi->netdev);
|
||||
|
||||
if (!locked)
|
||||
rtnl_unlock();
|
||||
} else {
|
||||
ice_vsi_close(vsi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_pf_dis_all_vsi - Pause all VSIs on a PF
|
||||
* @pf: the PF
|
||||
* @locked: is the rtnl_lock already held
|
||||
*/
|
||||
#ifdef CONFIG_DCB
|
||||
void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked)
|
||||
#else
|
||||
static void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked)
|
||||
#endif /* CONFIG_DCB */
|
||||
{
|
||||
int v;
|
||||
|
||||
@ -4440,54 +4409,6 @@ static void ice_vsi_release_all(struct ice_pf *pf)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_ena_vsi - resume a VSI
|
||||
* @vsi: the VSI being resume
|
||||
* @locked: is the rtnl_lock already held
|
||||
*/
|
||||
static int ice_ena_vsi(struct ice_vsi *vsi, bool locked)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (!test_bit(__ICE_NEEDS_RESTART, vsi->state))
|
||||
return 0;
|
||||
|
||||
clear_bit(__ICE_NEEDS_RESTART, vsi->state);
|
||||
|
||||
if (vsi->netdev && vsi->type == ICE_VSI_PF) {
|
||||
if (netif_running(vsi->netdev)) {
|
||||
if (!locked)
|
||||
rtnl_lock();
|
||||
|
||||
err = ice_open(vsi->netdev);
|
||||
|
||||
if (!locked)
|
||||
rtnl_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_pf_ena_all_vsi - Resume all VSIs on a PF
|
||||
* @pf: the PF
|
||||
* @locked: is the rtnl_lock already held
|
||||
*/
|
||||
#ifdef CONFIG_DCB
|
||||
int ice_pf_ena_all_vsi(struct ice_pf *pf, bool locked)
|
||||
{
|
||||
int v;
|
||||
|
||||
ice_for_each_vsi(pf, v)
|
||||
if (pf->vsi[v])
|
||||
if (ice_ena_vsi(pf->vsi[v], locked))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_DCB */
|
||||
|
||||
/**
|
||||
* ice_vsi_rebuild_by_type - Rebuild VSI of a given type
|
||||
* @pf: pointer to the PF instance
|
||||
|
Loading…
Reference in New Issue
Block a user