diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-09-22 16:49:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-09-23 08:38:50 -0400 |
commit | 4acfee8143b33efa8bda6f03fe1462d545ff8170 (patch) | |
tree | b621cbd0d15c99e8724527eda7ccf25265d14180 /net/dsa/slave.c | |
parent | e3978673f514fa4999f04dfad9bbd5bb70d0edc6 (diff) |
net: dsa: add port STP state helper
Add a void helper to set the STP state of a port, checking first if the
required routine is provided by the driver.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa/slave.c')
-rw-r--r-- | net/dsa/slave.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 9ecbe787f102..fd78d4c9b197 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
@@ -69,6 +69,12 @@ static inline bool dsa_port_is_bridged(struct dsa_slave_priv *p) | |||
69 | return !!p->bridge_dev; | 69 | return !!p->bridge_dev; |
70 | } | 70 | } |
71 | 71 | ||
72 | static void dsa_port_set_stp_state(struct dsa_switch *ds, int port, u8 state) | ||
73 | { | ||
74 | if (ds->ops->port_stp_state_set) | ||
75 | ds->ops->port_stp_state_set(ds, port, state); | ||
76 | } | ||
77 | |||
72 | static int dsa_slave_open(struct net_device *dev) | 78 | static int dsa_slave_open(struct net_device *dev) |
73 | { | 79 | { |
74 | struct dsa_slave_priv *p = netdev_priv(dev); | 80 | struct dsa_slave_priv *p = netdev_priv(dev); |
@@ -104,8 +110,7 @@ static int dsa_slave_open(struct net_device *dev) | |||
104 | goto clear_promisc; | 110 | goto clear_promisc; |
105 | } | 111 | } |
106 | 112 | ||
107 | if (ds->ops->port_stp_state_set) | 113 | dsa_port_set_stp_state(ds, p->port, stp_state); |
108 | ds->ops->port_stp_state_set(ds, p->port, stp_state); | ||
109 | 114 | ||
110 | if (p->phy) | 115 | if (p->phy) |
111 | phy_start(p->phy); | 116 | phy_start(p->phy); |
@@ -147,8 +152,7 @@ static int dsa_slave_close(struct net_device *dev) | |||
147 | if (ds->ops->port_disable) | 152 | if (ds->ops->port_disable) |
148 | ds->ops->port_disable(ds, p->port, p->phy); | 153 | ds->ops->port_disable(ds, p->port, p->phy); |
149 | 154 | ||
150 | if (ds->ops->port_stp_state_set) | 155 | dsa_port_set_stp_state(ds, p->port, BR_STATE_DISABLED); |
151 | ds->ops->port_stp_state_set(ds, p->port, BR_STATE_DISABLED); | ||
152 | 156 | ||
153 | return 0; | 157 | return 0; |
154 | } | 158 | } |
@@ -354,7 +358,7 @@ static int dsa_slave_stp_state_set(struct net_device *dev, | |||
354 | if (switchdev_trans_ph_prepare(trans)) | 358 | if (switchdev_trans_ph_prepare(trans)) |
355 | return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP; | 359 | return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP; |
356 | 360 | ||
357 | ds->ops->port_stp_state_set(ds, p->port, attr->u.stp_state); | 361 | dsa_port_set_stp_state(ds, p->port, attr->u.stp_state); |
358 | 362 | ||
359 | return 0; | 363 | return 0; |
360 | } | 364 | } |
@@ -556,8 +560,7 @@ static void dsa_slave_bridge_port_leave(struct net_device *dev) | |||
556 | /* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer, | 560 | /* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer, |
557 | * so allow it to be in BR_STATE_FORWARDING to be kept functional | 561 | * so allow it to be in BR_STATE_FORWARDING to be kept functional |
558 | */ | 562 | */ |
559 | if (ds->ops->port_stp_state_set) | 563 | dsa_port_set_stp_state(ds, p->port, BR_STATE_FORWARDING); |
560 | ds->ops->port_stp_state_set(ds, p->port, BR_STATE_FORWARDING); | ||
561 | } | 564 | } |
562 | 565 | ||
563 | static int dsa_slave_port_attr_get(struct net_device *dev, | 566 | static int dsa_slave_port_attr_get(struct net_device *dev, |