Commit cd605d45 authored by Horatiu Vultur's avatar Horatiu Vultur Committed by David S. Miller

bridge: mrp: Update br_mrp to use new return values of br_mrp_switchdev

Check the return values of the br_mrp_switchdev function.
In case of:
- BR_MRP_NONE, return the error to userspace,
- BR_MRP_SW, continue with SW implementation,
- BR_MRP_HW, continue without SW implementation,
Signed-off-by: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1a3ddb0b
...@@ -639,7 +639,7 @@ int br_mrp_set_ring_role(struct net_bridge *br, ...@@ -639,7 +639,7 @@ int br_mrp_set_ring_role(struct net_bridge *br,
struct br_mrp_ring_role *role) struct br_mrp_ring_role *role)
{ {
struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id); struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
int err; enum br_mrp_hw_support support;
if (!mrp) if (!mrp)
return -EINVAL; return -EINVAL;
...@@ -647,9 +647,9 @@ int br_mrp_set_ring_role(struct net_bridge *br, ...@@ -647,9 +647,9 @@ int br_mrp_set_ring_role(struct net_bridge *br,
mrp->ring_role = role->ring_role; mrp->ring_role = role->ring_role;
/* If there is an error just bailed out */ /* If there is an error just bailed out */
err = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role); support = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role);
if (err && err != -EOPNOTSUPP) if (support == BR_MRP_NONE)
return err; return -EOPNOTSUPP;
/* Now detect if the HW actually applied the role or not. If the HW /* Now detect if the HW actually applied the role or not. If the HW
* applied the role it means that the SW will not to do those operations * applied the role it means that the SW will not to do those operations
...@@ -657,7 +657,7 @@ int br_mrp_set_ring_role(struct net_bridge *br, ...@@ -657,7 +657,7 @@ int br_mrp_set_ring_role(struct net_bridge *br,
* SW when ring is open, but if the is not pushed to the HW the SW will * SW when ring is open, but if the is not pushed to the HW the SW will
* need to detect when the ring is open * need to detect when the ring is open
*/ */
mrp->ring_role_offloaded = err == -EOPNOTSUPP ? 0 : 1; mrp->ring_role_offloaded = support == BR_MRP_SW ? 0 : 1;
return 0; return 0;
} }
...@@ -670,6 +670,7 @@ int br_mrp_start_test(struct net_bridge *br, ...@@ -670,6 +670,7 @@ int br_mrp_start_test(struct net_bridge *br,
struct br_mrp_start_test *test) struct br_mrp_start_test *test)
{ {
struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id); struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id);
enum br_mrp_hw_support support;
if (!mrp) if (!mrp)
return -EINVAL; return -EINVAL;
...@@ -677,9 +678,13 @@ int br_mrp_start_test(struct net_bridge *br, ...@@ -677,9 +678,13 @@ int br_mrp_start_test(struct net_bridge *br,
/* Try to push it to the HW and if it fails then continue with SW /* Try to push it to the HW and if it fails then continue with SW
* implementation and if that also fails then return error. * implementation and if that also fails then return error.
*/ */
if (!br_mrp_switchdev_send_ring_test(br, mrp, test->interval, support = br_mrp_switchdev_send_ring_test(br, mrp, test->interval,
test->max_miss, test->period, test->max_miss, test->period,
test->monitor)) test->monitor);
if (support == BR_MRP_NONE)
return -EOPNOTSUPP;
if (support == BR_MRP_HW)
return 0; return 0;
mrp->test_interval = test->interval; mrp->test_interval = test->interval;
...@@ -721,8 +726,8 @@ int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state) ...@@ -721,8 +726,8 @@ int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state)
int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role) int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role)
{ {
struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id); struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
enum br_mrp_hw_support support;
struct net_bridge_port *p; struct net_bridge_port *p;
int err;
if (!mrp) if (!mrp)
return -EINVAL; return -EINVAL;
...@@ -780,10 +785,10 @@ int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role) ...@@ -780,10 +785,10 @@ int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role)
mrp->in_id = role->in_id; mrp->in_id = role->in_id;
/* If there is an error just bailed out */ /* If there is an error just bailed out */
err = br_mrp_switchdev_set_in_role(br, mrp, role->in_id, support = br_mrp_switchdev_set_in_role(br, mrp, role->in_id,
role->ring_id, role->in_role); role->ring_id, role->in_role);
if (err && err != -EOPNOTSUPP) if (support == BR_MRP_NONE)
return err; return -EOPNOTSUPP;
/* Now detect if the HW actually applied the role or not. If the HW /* Now detect if the HW actually applied the role or not. If the HW
* applied the role it means that the SW will not to do those operations * applied the role it means that the SW will not to do those operations
...@@ -791,7 +796,7 @@ int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role) ...@@ -791,7 +796,7 @@ int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role)
* SW when interconnect ring is open, but if the is not pushed to the HW * SW when interconnect ring is open, but if the is not pushed to the HW
* the SW will need to detect when the interconnect ring is open. * the SW will need to detect when the interconnect ring is open.
*/ */
mrp->in_role_offloaded = err == -EOPNOTSUPP ? 0 : 1; mrp->in_role_offloaded = support == BR_MRP_SW ? 0 : 1;
return 0; return 0;
} }
...@@ -804,6 +809,7 @@ int br_mrp_start_in_test(struct net_bridge *br, ...@@ -804,6 +809,7 @@ int br_mrp_start_in_test(struct net_bridge *br,
struct br_mrp_start_in_test *in_test) struct br_mrp_start_in_test *in_test)
{ {
struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id); struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id);
enum br_mrp_hw_support support;
if (!mrp) if (!mrp)
return -EINVAL; return -EINVAL;
...@@ -814,8 +820,13 @@ int br_mrp_start_in_test(struct net_bridge *br, ...@@ -814,8 +820,13 @@ int br_mrp_start_in_test(struct net_bridge *br,
/* Try to push it to the HW and if it fails then continue with SW /* Try to push it to the HW and if it fails then continue with SW
* implementation and if that also fails then return error. * implementation and if that also fails then return error.
*/ */
if (!br_mrp_switchdev_send_in_test(br, mrp, in_test->interval, support = br_mrp_switchdev_send_in_test(br, mrp, in_test->interval,
in_test->max_miss, in_test->period)) in_test->max_miss,
in_test->period);
if (support == BR_MRP_NONE)
return -EOPNOTSUPP;
if (support == BR_MRP_HW)
return 0; return 0;
mrp->in_test_interval = in_test->interval; mrp->in_test_interval = in_test->interval;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment