ice: Implement ethtool reset support

Enable ethtool reset support. Ethtool reset flags are mapped to the
E810 reset type:
PF reset:
  $ ethtool --reset <ethX> irq dma filter offload
CORE reset:
  $ ethtool --reset <ethX> irq-shared dma-shared filter-shared \
    offload-shared ram-shared
GLOBAL reset:
  $ ethtool --reset <ethX> irq-shared dma-shared filter-shared \
    offload-shared mac-shared phy-shared ram-shared

Calling the same set of flags as in PF reset case on port representor
triggers VF reset.

Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Wojciech Drewek <wojciech.drewek@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>
This commit is contained in:
Wojciech Drewek 2024-08-07 12:35:05 +02:00 committed by Tony Nguyen
parent 42b2331081
commit b699c81af0
2 changed files with 108 additions and 0 deletions

View File

@ -101,6 +101,37 @@ example, if Rx packets are 10 and Netdev (software statistics) displays
rx_bytes as "X", then ethtool (hardware statistics) will display rx_bytes as
"X+40" (4 bytes CRC x 10 packets).
ethtool reset
-------------
The driver supports 3 types of resets:
- PF reset - resets only components associated with the given PF, does not
impact other PFs
- CORE reset - whole adapter is affected, reset all PFs
- GLOBAL reset - same as CORE but mac and phy components are also reinitialized
These are mapped to ethtool reset flags as follow:
- PF reset:
# ethtool --reset <ethX> irq dma filter offload
- CORE reset:
# ethtool --reset <ethX> irq-shared dma-shared filter-shared offload-shared \
ram-shared
- GLOBAL reset:
# ethtool --reset <ethX> irq-shared dma-shared filter-shared offload-shared \
mac-shared phy-shared ram-shared
In switchdev mode you can reset a VF using port representor:
# ethtool --reset <repr> irq dma filter offload
Viewing Link Messages
---------------------

View File

@ -4716,6 +4716,81 @@ static void ice_get_fec_stats(struct net_device *netdev,
pi->lport, err);
}
#define ICE_ETHTOOL_PFR (ETH_RESET_IRQ | ETH_RESET_DMA | \
ETH_RESET_FILTER | ETH_RESET_OFFLOAD)
#define ICE_ETHTOOL_CORER ((ICE_ETHTOOL_PFR | ETH_RESET_RAM) << \
ETH_RESET_SHARED_SHIFT)
#define ICE_ETHTOOL_GLOBR (ICE_ETHTOOL_CORER | \
(ETH_RESET_MAC << ETH_RESET_SHARED_SHIFT) | \
(ETH_RESET_PHY << ETH_RESET_SHARED_SHIFT))
#define ICE_ETHTOOL_VFR ICE_ETHTOOL_PFR
/**
* ice_ethtool_reset - triggers a given type of reset
* @dev: network interface device structure
* @flags: set of reset flags
*
* Return: 0 on success, -EOPNOTSUPP when using unsupported set of flags.
*/
static int ice_ethtool_reset(struct net_device *dev, u32 *flags)
{
struct ice_netdev_priv *np = netdev_priv(dev);
struct ice_pf *pf = np->vsi->back;
enum ice_reset_req reset;
switch (*flags) {
case ICE_ETHTOOL_CORER:
reset = ICE_RESET_CORER;
break;
case ICE_ETHTOOL_GLOBR:
reset = ICE_RESET_GLOBR;
break;
case ICE_ETHTOOL_PFR:
reset = ICE_RESET_PFR;
break;
default:
netdev_info(dev, "Unsupported set of ethtool flags");
return -EOPNOTSUPP;
}
ice_schedule_reset(pf, reset);
*flags = 0;
return 0;
}
/**
* ice_repr_ethtool_reset - triggers a VF reset
* @dev: network interface device structure
* @flags: set of reset flags
*
* Return: 0 on success,
* -EOPNOTSUPP when using unsupported set of flags
* -EBUSY when VF is not ready for reset.
*/
static int ice_repr_ethtool_reset(struct net_device *dev, u32 *flags)
{
struct ice_repr *repr = ice_netdev_to_repr(dev);
struct ice_vf *vf;
if (repr->type != ICE_REPR_TYPE_VF ||
*flags != ICE_ETHTOOL_VFR)
return -EOPNOTSUPP;
vf = repr->vf;
if (ice_check_vf_ready_for_cfg(vf))
return -EBUSY;
*flags = 0;
return ice_reset_vf(vf, ICE_VF_RESET_VFLR | ICE_VF_RESET_LOCK);
}
static const struct ethtool_ops ice_ethtool_ops = {
.cap_rss_ctx_supported = true,
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
@ -4752,6 +4827,7 @@ static const struct ethtool_ops ice_ethtool_ops = {
.nway_reset = ice_nway_reset,
.get_pauseparam = ice_get_pauseparam,
.set_pauseparam = ice_set_pauseparam,
.reset = ice_ethtool_reset,
.get_rxfh_key_size = ice_get_rxfh_key_size,
.get_rxfh_indir_size = ice_get_rxfh_indir_size,
.get_rxfh = ice_get_rxfh,
@ -4804,6 +4880,7 @@ static const struct ethtool_ops ice_ethtool_repr_ops = {
.get_strings = ice_repr_get_strings,
.get_ethtool_stats = ice_repr_get_ethtool_stats,
.get_sset_count = ice_repr_get_sset_count,
.reset = ice_repr_ethtool_reset,
};
/**