diff options
| author | Ingo Molnar <mingo@kernel.org> | 2024-03-25 13:32:29 +0300 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2024-03-25 13:32:29 +0300 | 
| commit | f4566a1e73957800df75a3dd2dccee8a4697f327 (patch) | |
| tree | b043b875228c0b25988af66c680d60cae69d761d /drivers/net/ethernet/intel/ice/ice_devlink.c | |
| parent | b9e6e28663928cab836a19abbdec3d036a07db3b (diff) | |
| parent | 4cece764965020c22cff7665b18a012006359095 (diff) | |
| download | linux-f4566a1e73957800df75a3dd2dccee8a4697f327.tar.xz | |
Merge tag 'v6.9-rc1' into sched/core, to pick up fixes and to refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_devlink.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_devlink.c | 68 | 
1 files changed, 62 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c index 65be56f2af9e..b516e42b41f0 100644 --- a/drivers/net/ethernet/intel/ice/ice_devlink.c +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c @@ -445,6 +445,20 @@ ice_devlink_reload_empr_start(struct ice_pf *pf,  }  /** + * ice_devlink_reinit_down - unload given PF + * @pf: pointer to the PF struct + */ +static void ice_devlink_reinit_down(struct ice_pf *pf) +{ +	/* No need to take devl_lock, it's already taken by devlink API */ +	ice_unload(pf); +	rtnl_lock(); +	ice_vsi_decfg(ice_get_main_vsi(pf)); +	rtnl_unlock(); +	ice_deinit_dev(pf); +} + +/**   * ice_devlink_reload_down - prepare for reload   * @devlink: pointer to the devlink instance to reload   * @netns_change: if true, the network namespace is changing @@ -477,7 +491,7 @@ ice_devlink_reload_down(struct devlink *devlink, bool netns_change,  					   "Remove all VFs before doing reinit\n");  			return -EOPNOTSUPP;  		} -		ice_unload(pf); +		ice_devlink_reinit_down(pf);  		return 0;  	case DEVLINK_RELOAD_ACTION_FW_ACTIVATE:  		return ice_devlink_reload_empr_start(pf, extack); @@ -1270,6 +1284,45 @@ static int ice_devlink_set_parent(struct devlink_rate *devlink_rate,  }  /** + * ice_devlink_reinit_up - do reinit of the given PF + * @pf: pointer to the PF struct + */ +static int ice_devlink_reinit_up(struct ice_pf *pf) +{ +	struct ice_vsi *vsi = ice_get_main_vsi(pf); +	struct ice_vsi_cfg_params params; +	int err; + +	err = ice_init_dev(pf); +	if (err) +		return err; + +	params = ice_vsi_to_params(vsi); +	params.flags = ICE_VSI_FLAG_INIT; + +	rtnl_lock(); +	err = ice_vsi_cfg(vsi, ¶ms); +	rtnl_unlock(); +	if (err) +		goto err_vsi_cfg; + +	/* No need to take devl_lock, it's already taken by devlink API */ +	err = ice_load(pf); +	if (err) +		goto err_load; + +	return 0; + +err_load: +	rtnl_lock(); +	ice_vsi_decfg(vsi); +	rtnl_unlock(); +err_vsi_cfg: +	ice_deinit_dev(pf); +	return err; +} + +/**   * ice_devlink_reload_up - do reload up after reinit   * @devlink: pointer to the devlink instance reloading   * @action: the action requested @@ -1289,7 +1342,7 @@ ice_devlink_reload_up(struct devlink *devlink,  	switch (action) {  	case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:  		*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT); -		return ice_load(pf); +		return ice_devlink_reinit_up(pf);  	case DEVLINK_RELOAD_ACTION_FW_ACTIVATE:  		*actions_performed = BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE);  		return ice_devlink_reload_empr_finish(pf, extack); @@ -1569,6 +1622,7 @@ static const struct devlink_port_ops ice_devlink_port_ops = {   * @pf: the PF to create a devlink port for   *   * Create and register a devlink_port for this PF. + * This function has to be called under devl_lock.   *   * Return: zero on success or an error code on failure.   */ @@ -1581,6 +1635,8 @@ int ice_devlink_create_pf_port(struct ice_pf *pf)  	struct device *dev;  	int err; +	devlink = priv_to_devlink(pf); +  	dev = ice_pf_to_dev(pf);  	devlink_port = &pf->devlink_port; @@ -1601,10 +1657,9 @@ int ice_devlink_create_pf_port(struct ice_pf *pf)  	ice_devlink_set_switch_id(pf, &attrs.switch_id);  	devlink_port_attrs_set(devlink_port, &attrs); -	devlink = priv_to_devlink(pf); -	err = devlink_port_register_with_ops(devlink, devlink_port, vsi->idx, -					     &ice_devlink_port_ops); +	err = devl_port_register_with_ops(devlink, devlink_port, vsi->idx, +					  &ice_devlink_port_ops);  	if (err) {  		dev_err(dev, "Failed to create devlink port for PF %d, error %d\n",  			pf->hw.pf_id, err); @@ -1619,10 +1674,11 @@ int ice_devlink_create_pf_port(struct ice_pf *pf)   * @pf: the PF to cleanup   *   * Unregisters the devlink_port structure associated with this PF. + * This function has to be called under devl_lock.   */  void ice_devlink_destroy_pf_port(struct ice_pf *pf)  { -	devlink_port_unregister(&pf->devlink_port); +	devl_port_unregister(&pf->devlink_port);  }  /**  | 
