mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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: Horatiu Vultur <horatiu.vultur@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1a3ddb0b75
commit
cd605d455a
1 changed files with 27 additions and 16 deletions
|
@ -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,
|
||||||
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,
|
||||||
* 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,
|
||||||
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,
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
* 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,
|
||||||
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,
|
||||||
/* 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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue