Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bridge: switchdev: mrp: Extend MRP API for switchdev for MRP Interconnect

Implement the MRP API for interconnect switchdev. Similar with the other
br_mrp_switchdev function, these function will just eventually call the
switchdev functions: switchdev_port_obj_add/del.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Horatiu Vultur and committed by
David S. Miller
f23f0db3 4139d4b5

+69
+62
net/bridge/br_mrp_switchdev.c
··· 107 107 return 0; 108 108 } 109 109 110 + int br_mrp_switchdev_set_in_role(struct net_bridge *br, struct br_mrp *mrp, 111 + u16 in_id, u32 ring_id, 112 + enum br_mrp_in_role_type role) 113 + { 114 + struct switchdev_obj_in_role_mrp mrp_role = { 115 + .obj.orig_dev = br->dev, 116 + .obj.id = SWITCHDEV_OBJ_ID_IN_ROLE_MRP, 117 + .in_role = role, 118 + .in_id = mrp->in_id, 119 + .ring_id = mrp->ring_id, 120 + .i_port = rtnl_dereference(mrp->i_port)->dev, 121 + }; 122 + int err; 123 + 124 + if (role == BR_MRP_IN_ROLE_DISABLED) 125 + err = switchdev_port_obj_del(br->dev, &mrp_role.obj); 126 + else 127 + err = switchdev_port_obj_add(br->dev, &mrp_role.obj, NULL); 128 + 129 + return err; 130 + } 131 + 132 + int br_mrp_switchdev_set_in_state(struct net_bridge *br, struct br_mrp *mrp, 133 + enum br_mrp_in_state_type state) 134 + { 135 + struct switchdev_obj_in_state_mrp mrp_state = { 136 + .obj.orig_dev = br->dev, 137 + .obj.id = SWITCHDEV_OBJ_ID_IN_STATE_MRP, 138 + .in_state = state, 139 + .in_id = mrp->in_id, 140 + }; 141 + int err; 142 + 143 + err = switchdev_port_obj_add(br->dev, &mrp_state.obj, NULL); 144 + 145 + if (err && err != -EOPNOTSUPP) 146 + return err; 147 + 148 + return 0; 149 + } 150 + 151 + int br_mrp_switchdev_send_in_test(struct net_bridge *br, struct br_mrp *mrp, 152 + u32 interval, u8 max_miss, u32 period) 153 + { 154 + struct switchdev_obj_in_test_mrp test = { 155 + .obj.orig_dev = br->dev, 156 + .obj.id = SWITCHDEV_OBJ_ID_IN_TEST_MRP, 157 + .interval = interval, 158 + .max_miss = max_miss, 159 + .in_id = mrp->in_id, 160 + .period = period, 161 + }; 162 + int err; 163 + 164 + if (interval == 0) 165 + err = switchdev_port_obj_del(br->dev, &test.obj); 166 + else 167 + err = switchdev_port_obj_add(br->dev, &test.obj, NULL); 168 + 169 + return err; 170 + } 171 + 110 172 int br_mrp_port_switchdev_set_state(struct net_bridge_port *p, 111 173 enum br_mrp_port_state_type state) 112 174 {
+7
net/bridge/br_private_mrp.h
··· 72 72 enum br_mrp_port_state_type state); 73 73 int br_mrp_port_switchdev_set_role(struct net_bridge_port *p, 74 74 enum br_mrp_port_role_type role); 75 + int br_mrp_switchdev_set_in_role(struct net_bridge *br, struct br_mrp *mrp, 76 + u16 in_id, u32 ring_id, 77 + enum br_mrp_in_role_type role); 78 + int br_mrp_switchdev_set_in_state(struct net_bridge *br, struct br_mrp *mrp, 79 + enum br_mrp_in_state_type state); 80 + int br_mrp_switchdev_send_in_test(struct net_bridge *br, struct br_mrp *mrp, 81 + u32 interval, u8 max_miss, u32 period); 75 82 76 83 /* br_mrp_netlink.c */ 77 84 int br_mrp_ring_port_open(struct net_device *dev, u8 loc);