mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-15 03:53:12 -05:00
Since the introduction of HSR_PT_INTERLINK in commit 5055cccfc2 ("net:
hsr: Provide RedBox support (HSR-SAN)"), we see that different port
types require different settings for hardware offload, which was not the
case before when we only had HSR_PT_SLAVE_A and HSR_PT_SLAVE_B. But
there is currently no way to know which port is which type, so create
the hsr_get_port_type() API function and export it.
When hsr_get_port_type() is called from the device driver, the port can
must be found in the HSR port list. An important use case is for this
function to work from offloading drivers' NETDEV_CHANGEUPPER handler,
which is triggered by hsr_portdev_setup() -> netdev_master_upper_dev_link().
Therefore, we need to move the addition of the hsr_port to the HSR port
list prior to calling hsr_portdev_setup(). This makes the error
restoration path also more similar to hsr_del_port(), where
kfree_rcu(port) is already used.
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Lukasz Majewski <lukma@denx.de>
Signed-off-by: Xiaoliang Yang <xiaoliang.yang_1@nxp.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Łukasz Majewski <lukma@nabladev.com>
Link: https://patch.msgid.link/20251130131657.65080-3-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
74 lines
1.8 KiB
C
74 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_IF_HSR_H_
|
|
#define _LINUX_IF_HSR_H_
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct net_device;
|
|
|
|
/* used to differentiate various protocols */
|
|
enum hsr_version {
|
|
HSR_V0 = 0,
|
|
HSR_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.
|
|
* 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,
|
|
* h_source, h_proto = 0x88FB }, and add { path, LSDU_size, sequence Nr,
|
|
* encapsulated protocol } instead.
|
|
*
|
|
* Field names as defined in the IEC:2010 standard for HSR.
|
|
*/
|
|
struct hsr_tag {
|
|
__be16 path_and_LSDU_size;
|
|
__be16 sequence_nr;
|
|
__be16 encap_proto;
|
|
} __packed;
|
|
|
|
#define HSR_HLEN 6
|
|
|
|
#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);
|
|
int hsr_get_port_type(struct net_device *hsr_dev, struct net_device *dev,
|
|
enum hsr_port_type *type);
|
|
#else
|
|
static inline bool is_hsr_master(struct net_device *dev)
|
|
{
|
|
return false;
|
|
}
|
|
static inline int hsr_get_version(struct net_device *dev,
|
|
enum hsr_version *ver)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline struct net_device *hsr_get_port_ndev(struct net_device *ndev,
|
|
enum hsr_port_type pt)
|
|
{
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
static inline int hsr_get_port_type(struct net_device *hsr_dev,
|
|
struct net_device *dev,
|
|
enum hsr_port_type *type)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
#endif /* CONFIG_HSR */
|
|
|
|
#endif /*_LINUX_IF_HSR_H_*/
|