net: hsr: Create and export hsr_get_port_ndev()

Create an API to get the net_device to the slave port of HSR device. The
API will take hsr net_device and enum hsr_port_type for which we want the
net_device as arguments.

This API can be used by client drivers who support HSR and want to get
the net_devcie of slave ports from the hsr device. Export this API for
the same.

This API needs the enum hsr_port_type to be accessible by the drivers using
hsr. Move the enum hsr_port_type from net/hsr/hsr_main.h to
include/linux/if_hsr.h for the same.

Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
MD Danish Anwar 2025-01-10 13:58:51 +05:30 committed by Paolo Abeni
parent 04508d20b0
commit 9c10dd8eed
3 changed files with 30 additions and 9 deletions

View File

@ -13,6 +13,15 @@ enum hsr_version {
PRP_V1, PRP_V1,
}; };
enum hsr_port_type {
HSR_PT_NONE = 0, /* Must be 0, used by framereg */
HSR_PT_SLAVE_A,
HSR_PT_SLAVE_B,
HSR_PT_INTERLINK,
HSR_PT_MASTER,
HSR_PT_PORTS, /* This must be the last item in the enum */
};
/* HSR Tag. /* HSR Tag.
* As defined in IEC-62439-3:2010, the HSR tag is really { ethertype = 0x88FB, * As defined in IEC-62439-3:2010, the HSR tag is really { ethertype = 0x88FB,
* path, LSDU_size, sequence Nr }. But we let eth_header() create { h_dest, * path, LSDU_size, sequence Nr }. But we let eth_header() create { h_dest,
@ -32,6 +41,8 @@ struct hsr_tag {
#if IS_ENABLED(CONFIG_HSR) #if IS_ENABLED(CONFIG_HSR)
extern bool is_hsr_master(struct net_device *dev); extern bool is_hsr_master(struct net_device *dev);
extern int hsr_get_version(struct net_device *dev, enum hsr_version *ver); extern int hsr_get_version(struct net_device *dev, enum hsr_version *ver);
struct net_device *hsr_get_port_ndev(struct net_device *ndev,
enum hsr_port_type pt);
#else #else
static inline bool is_hsr_master(struct net_device *dev) static inline bool is_hsr_master(struct net_device *dev)
{ {
@ -42,6 +53,12 @@ static inline int hsr_get_version(struct net_device *dev,
{ {
return -EINVAL; return -EINVAL;
} }
static inline struct net_device *hsr_get_port_ndev(struct net_device *ndev,
enum hsr_port_type pt)
{
return ERR_PTR(-EINVAL);
}
#endif /* CONFIG_HSR */ #endif /* CONFIG_HSR */
#endif /*_LINUX_IF_HSR_H_*/ #endif /*_LINUX_IF_HSR_H_*/

View File

@ -663,6 +663,19 @@ bool is_hsr_master(struct net_device *dev)
} }
EXPORT_SYMBOL(is_hsr_master); EXPORT_SYMBOL(is_hsr_master);
struct net_device *hsr_get_port_ndev(struct net_device *ndev,
enum hsr_port_type pt)
{
struct hsr_priv *hsr = netdev_priv(ndev);
struct hsr_port *port;
hsr_for_each_port(hsr, port)
if (port->type == pt)
return port->dev;
return NULL;
}
EXPORT_SYMBOL(hsr_get_port_ndev);
/* Default multicast address for HSR Supervision frames */ /* Default multicast address for HSR Supervision frames */
static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = { static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
0x01, 0x15, 0x4e, 0x00, 0x01, 0x00 0x01, 0x15, 0x4e, 0x00, 0x01, 0x00

View File

@ -121,15 +121,6 @@ struct hsrv1_ethhdr_sp {
struct hsr_sup_tag hsr_sup; struct hsr_sup_tag hsr_sup;
} __packed; } __packed;
enum hsr_port_type {
HSR_PT_NONE = 0, /* Must be 0, used by framereg */
HSR_PT_SLAVE_A,
HSR_PT_SLAVE_B,
HSR_PT_INTERLINK,
HSR_PT_MASTER,
HSR_PT_PORTS, /* This must be the last item in the enum */
};
/* PRP Redunancy Control Trailor (RCT). /* PRP Redunancy Control Trailor (RCT).
* As defined in IEC-62439-4:2012, the PRP RCT is really { sequence Nr, * As defined in IEC-62439-4:2012, the PRP RCT is really { sequence Nr,
* Lan indentifier (LanId), LSDU_size and PRP_suffix = 0x88FB }. * Lan indentifier (LanId), LSDU_size and PRP_suffix = 0x88FB }.