1 // SPDX-License-Identifier: GPL-2.0-or-later
3 #include <net/switchdev.h>
5 #include "br_private_mrp.h"
7 int br_mrp_switchdev_add(struct net_bridge
*br
, struct br_mrp
*mrp
)
9 struct switchdev_obj_mrp mrp_obj
= {
10 .obj
.orig_dev
= br
->dev
,
11 .obj
.id
= SWITCHDEV_OBJ_ID_MRP
,
12 .p_port
= rtnl_dereference(mrp
->p_port
)->dev
,
13 .s_port
= rtnl_dereference(mrp
->s_port
)->dev
,
14 .ring_id
= mrp
->ring_id
,
19 err
= switchdev_port_obj_add(br
->dev
, &mrp_obj
.obj
, NULL
);
21 if (err
&& err
!= -EOPNOTSUPP
)
27 int br_mrp_switchdev_del(struct net_bridge
*br
, struct br_mrp
*mrp
)
29 struct switchdev_obj_mrp mrp_obj
= {
30 .obj
.orig_dev
= br
->dev
,
31 .obj
.id
= SWITCHDEV_OBJ_ID_MRP
,
34 .ring_id
= mrp
->ring_id
,
38 err
= switchdev_port_obj_del(br
->dev
, &mrp_obj
.obj
);
40 if (err
&& err
!= -EOPNOTSUPP
)
46 int br_mrp_switchdev_set_ring_role(struct net_bridge
*br
,
48 enum br_mrp_ring_role_type role
)
50 struct switchdev_obj_ring_role_mrp mrp_role
= {
51 .obj
.orig_dev
= br
->dev
,
52 .obj
.id
= SWITCHDEV_OBJ_ID_RING_ROLE_MRP
,
54 .ring_id
= mrp
->ring_id
,
58 if (role
== BR_MRP_RING_ROLE_DISABLED
)
59 err
= switchdev_port_obj_del(br
->dev
, &mrp_role
.obj
);
61 err
= switchdev_port_obj_add(br
->dev
, &mrp_role
.obj
, NULL
);
66 int br_mrp_switchdev_send_ring_test(struct net_bridge
*br
,
67 struct br_mrp
*mrp
, u32 interval
,
68 u8 max_miss
, u32 period
,
71 struct switchdev_obj_ring_test_mrp test
= {
72 .obj
.orig_dev
= br
->dev
,
73 .obj
.id
= SWITCHDEV_OBJ_ID_RING_TEST_MRP
,
76 .ring_id
= mrp
->ring_id
,
83 err
= switchdev_port_obj_del(br
->dev
, &test
.obj
);
85 err
= switchdev_port_obj_add(br
->dev
, &test
.obj
, NULL
);
90 int br_mrp_switchdev_set_ring_state(struct net_bridge
*br
,
92 enum br_mrp_ring_state_type state
)
94 struct switchdev_obj_ring_state_mrp mrp_state
= {
95 .obj
.orig_dev
= br
->dev
,
96 .obj
.id
= SWITCHDEV_OBJ_ID_RING_STATE_MRP
,
98 .ring_id
= mrp
->ring_id
,
102 err
= switchdev_port_obj_add(br
->dev
, &mrp_state
.obj
, NULL
);
104 if (err
&& err
!= -EOPNOTSUPP
)
110 int br_mrp_port_switchdev_set_state(struct net_bridge_port
*p
,
111 enum br_mrp_port_state_type state
)
113 struct switchdev_attr attr
= {
115 .id
= SWITCHDEV_ATTR_ID_MRP_PORT_STATE
,
116 .u
.mrp_port_state
= state
,
120 err
= switchdev_port_attr_set(p
->dev
, &attr
);
121 if (err
&& err
!= -EOPNOTSUPP
)
122 br_warn(p
->br
, "error setting offload MRP state on port %u(%s)\n",
123 (unsigned int)p
->port_no
, p
->dev
->name
);
128 int br_mrp_port_switchdev_set_role(struct net_bridge_port
*p
,
129 enum br_mrp_port_role_type role
)
131 struct switchdev_attr attr
= {
133 .id
= SWITCHDEV_ATTR_ID_MRP_PORT_ROLE
,
134 .u
.mrp_port_role
= role
,
138 err
= switchdev_port_attr_set(p
->dev
, &attr
);
139 if (err
&& err
!= -EOPNOTSUPP
)