]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: hsr: Create and export hsr_get_port_ndev()
authorMD Danish Anwar <danishanwar@ti.com>
Fri, 10 Jan 2025 08:28:51 +0000 (13:58 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 12:55:14 +0000 (13:55 +0100)
[ Upstream commit 9c10dd8eed74de9e8adeb820939f8745cd566d4a ]

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>
Stable-dep-of: 30296ac76426 ("net: dsa: xrs700x: reject unsupported HSR configurations")
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/linux/if_hsr.h
net/hsr/hsr_device.c
net/hsr/hsr_main.h

index 0404f5bf4f30f46becc306a9ee9a70b69a521ca3..d7941fd8803295beb356cbb9d5b45fa801a08516 100644 (file)
@@ -13,6 +13,15 @@ enum hsr_version {
        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.
  * 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,
@@ -32,6 +41,8 @@ struct hsr_tag {
 #if IS_ENABLED(CONFIG_HSR)
 extern bool is_hsr_master(struct net_device *dev);
 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
 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;
 }
+
+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 /*_LINUX_IF_HSR_H_*/
index ae368cdcbd9363eeeca8276bf2a765c5a4b93ef0..c568d91764235819f2fe3f48430fb67fa3ff9b0d 100644 (file)
@@ -676,6 +676,19 @@ bool is_hsr_master(struct net_device *dev)
 }
 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 */
 static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
        0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
index 37beb40763dba5cebbbb6979073a9b9442851c96..677371bc36ea7c5b440c4b2119c222c819a349ac 100644 (file)
@@ -121,15 +121,6 @@ struct hsrv1_ethhdr_sp {
        struct hsr_sup_tag      hsr_sup;
 } __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).
  * As defined in IEC-62439-4:2012, the PRP RCT is really { sequence Nr,
  * Lan indentifier (LanId), LSDU_size and PRP_suffix = 0x88FB }.