linux-imx/include/linux/ethtool_netlink.h
Po Liu 8bad9bdf1f net: tsn: netlink interface to configure TSN capabilities on hardware ports
Provide a genetlink family to configure TSN features on NXP hardware.
Its user space consumer is https://github.com/nxp-qoriq/tsntool.

TSN guaranteed packet transport with bounded low latency, low packet
delay variation, and low packet loss by hardware and software methods.

The three basic components of TSN are:

1. Time synchronization: This is covered by the IEEE 1588 Precision Time
   Protocol (or the 802.1AS profile). PTP has its own kernel subsystem
   and is not covered by this netlink framework.

2. Scheduling, traffic shaping and per-stream filter and policing:
   Qbv/Qci/Qbu/8021CB/Qav etc.

3. Selection of communication paths:
   This framework does not support the pure software TSN protocols
   (like Qcc), but hardware related configuration.

TSN features supported by this framework:
- 802.1Qbv (legacy - kernel equivalent: tc-taprio)
- 802.1Qci (partially legacy - less featured kernel equivalent:
  tc-gate/tc-police)
- 802.1Qbu/802.3br (legacy - kernel equivalent: tc-mqprio/tc-taprio +
  ethtool-mm)
- 802.1Qav (legacy - kernel equivalent: tc-cbs)
- 802.1CB
- VLAN PCP QoS classification

Where applicable, using the in-kernel equivalents for configuring TSN
features is highly preferable to using the NXP API variants.

Signed-off-by: Po Liu <Po.Liu@nxp.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2023-10-30 16:01:14 +08:00

130 lines
3.5 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef _LINUX_ETHTOOL_NETLINK_H_
#define _LINUX_ETHTOOL_NETLINK_H_
#include <uapi/linux/ethtool_netlink.h>
#include <linux/ethtool.h>
#include <linux/netdevice.h>
#define __ETHTOOL_LINK_MODE_MASK_NWORDS \
DIV_ROUND_UP(__ETHTOOL_LINK_MODE_MASK_NBITS, 32)
#define ETHTOOL_PAUSE_STAT_CNT (__ETHTOOL_A_PAUSE_STAT_CNT - \
ETHTOOL_A_PAUSE_STAT_TX_FRAMES)
enum ethtool_multicast_groups {
ETHNL_MCGRP_MONITOR,
};
struct phy_device;
#if IS_ENABLED(CONFIG_ETHTOOL_NETLINK)
int ethnl_cable_test_alloc(struct phy_device *phydev, u8 cmd);
void ethnl_cable_test_free(struct phy_device *phydev);
void ethnl_cable_test_finished(struct phy_device *phydev);
int ethnl_cable_test_result(struct phy_device *phydev, u8 pair, u8 result);
int ethnl_cable_test_fault_length(struct phy_device *phydev, u8 pair, u32 cm);
int ethnl_cable_test_amplitude(struct phy_device *phydev, u8 pair, s16 mV);
int ethnl_cable_test_pulse(struct phy_device *phydev, u16 mV);
int ethnl_cable_test_step(struct phy_device *phydev, u32 first, u32 last,
u32 step);
void ethtool_aggregate_mac_stats(struct net_device *dev,
struct ethtool_eth_mac_stats *mac_stats);
void ethtool_aggregate_phy_stats(struct net_device *dev,
struct ethtool_eth_phy_stats *phy_stats);
void ethtool_aggregate_ctrl_stats(struct net_device *dev,
struct ethtool_eth_ctrl_stats *ctrl_stats);
void ethtool_aggregate_pause_stats(struct net_device *dev,
struct ethtool_pause_stats *pause_stats);
void ethtool_aggregate_rmon_stats(struct net_device *dev,
struct ethtool_rmon_stats *rmon_stats);
bool ethtool_dev_mm_supported(struct net_device *dev);
void mm_state_to_cfg(const struct ethtool_mm_state *state,
struct ethtool_mm_cfg *cfg);
#else
static inline int ethnl_cable_test_alloc(struct phy_device *phydev, u8 cmd)
{
return -EOPNOTSUPP;
}
static inline void ethnl_cable_test_free(struct phy_device *phydev)
{
}
static inline void ethnl_cable_test_finished(struct phy_device *phydev)
{
}
static inline int ethnl_cable_test_result(struct phy_device *phydev, u8 pair,
u8 result)
{
return -EOPNOTSUPP;
}
static inline int ethnl_cable_test_fault_length(struct phy_device *phydev,
u8 pair, u32 cm)
{
return -EOPNOTSUPP;
}
static inline int ethnl_cable_test_amplitude(struct phy_device *phydev,
u8 pair, s16 mV)
{
return -EOPNOTSUPP;
}
static inline int ethnl_cable_test_pulse(struct phy_device *phydev, u16 mV)
{
return -EOPNOTSUPP;
}
static inline int ethnl_cable_test_step(struct phy_device *phydev, u32 first,
u32 last, u32 step)
{
return -EOPNOTSUPP;
}
static inline void
ethtool_aggregate_mac_stats(struct net_device *dev,
struct ethtool_eth_mac_stats *mac_stats)
{
}
static inline void
ethtool_aggregate_phy_stats(struct net_device *dev,
struct ethtool_eth_phy_stats *phy_stats)
{
}
static inline void
ethtool_aggregate_ctrl_stats(struct net_device *dev,
struct ethtool_eth_ctrl_stats *ctrl_stats)
{
}
static inline void
ethtool_aggregate_pause_stats(struct net_device *dev,
struct ethtool_pause_stats *pause_stats)
{
}
static inline void
ethtool_aggregate_rmon_stats(struct net_device *dev,
struct ethtool_rmon_stats *rmon_stats)
{
}
static inline bool ethtool_dev_mm_supported(struct net_device *dev)
{
return false;
}
static inline void mm_state_to_cfg(const struct ethtool_mm_state *state,
struct ethtool_mm_cfg *cfg)
{
}
#endif /* IS_ENABLED(CONFIG_ETHTOOL_NETLINK) */
#endif /* _LINUX_ETHTOOL_NETLINK_H_ */