mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
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:
parent
42b2331081
commit
b699c81af0
@ -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
|
||||
---------------------
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user