2 * Handling of a single switch port
4 * Copyright (c) 2017 Savoir-faire Linux Inc.
5 * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
13 #include <linux/if_bridge.h>
14 #include <linux/notifier.h>
15 #include <linux/of_mdio.h>
16 #include <linux/of_net.h>
20 static int dsa_port_notify(const struct dsa_port
*dp
, unsigned long e
, void *v
)
22 struct raw_notifier_head
*nh
= &dp
->ds
->dst
->nh
;
25 err
= raw_notifier_call_chain(nh
, e
, v
);
27 return notifier_to_errno(err
);
30 int dsa_port_set_state(struct dsa_port
*dp
, u8 state
,
31 struct switchdev_trans
*trans
)
33 struct dsa_switch
*ds
= dp
->ds
;
36 if (switchdev_trans_ph_prepare(trans
))
37 return ds
->ops
->port_stp_state_set
? 0 : -EOPNOTSUPP
;
39 if (ds
->ops
->port_stp_state_set
)
40 ds
->ops
->port_stp_state_set(ds
, port
, state
);
42 if (ds
->ops
->port_fast_age
) {
43 /* Fast age FDB entries or flush appropriate forwarding database
44 * for the given port, if we are moving it from Learning or
45 * Forwarding state, to Disabled or Blocking or Listening state.
48 if ((dp
->stp_state
== BR_STATE_LEARNING
||
49 dp
->stp_state
== BR_STATE_FORWARDING
) &&
50 (state
== BR_STATE_DISABLED
||
51 state
== BR_STATE_BLOCKING
||
52 state
== BR_STATE_LISTENING
))
53 ds
->ops
->port_fast_age(ds
, port
);
56 dp
->stp_state
= state
;
61 static void dsa_port_set_state_now(struct dsa_port
*dp
, u8 state
)
65 err
= dsa_port_set_state(dp
, state
, NULL
);
67 pr_err("DSA: failed to set STP state %u (%d)\n", state
, err
);
70 int dsa_port_enable(struct dsa_port
*dp
, struct phy_device
*phy
)
72 u8 stp_state
= dp
->bridge_dev
? BR_STATE_BLOCKING
: BR_STATE_FORWARDING
;
73 struct dsa_switch
*ds
= dp
->ds
;
77 if (ds
->ops
->port_enable
) {
78 err
= ds
->ops
->port_enable(ds
, port
, phy
);
83 dsa_port_set_state_now(dp
, stp_state
);
88 void dsa_port_disable(struct dsa_port
*dp
, struct phy_device
*phy
)
90 struct dsa_switch
*ds
= dp
->ds
;
93 dsa_port_set_state_now(dp
, BR_STATE_DISABLED
);
95 if (ds
->ops
->port_disable
)
96 ds
->ops
->port_disable(ds
, port
, phy
);
99 int dsa_port_bridge_join(struct dsa_port
*dp
, struct net_device
*br
)
101 struct dsa_notifier_bridge_info info
= {
102 .sw_index
= dp
->ds
->index
,
108 /* Here the port is already bridged. Reflect the current configuration
109 * so that drivers can program their chips accordingly.
113 err
= dsa_port_notify(dp
, DSA_NOTIFIER_BRIDGE_JOIN
, &info
);
115 /* The bridging is rolled back on error */
117 dp
->bridge_dev
= NULL
;
122 void dsa_port_bridge_leave(struct dsa_port
*dp
, struct net_device
*br
)
124 struct dsa_notifier_bridge_info info
= {
125 .sw_index
= dp
->ds
->index
,
131 /* Here the port is already unbridged. Reflect the current configuration
132 * so that drivers can program their chips accordingly.
134 dp
->bridge_dev
= NULL
;
136 err
= dsa_port_notify(dp
, DSA_NOTIFIER_BRIDGE_LEAVE
, &info
);
138 pr_err("DSA: failed to notify DSA_NOTIFIER_BRIDGE_LEAVE\n");
140 /* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
141 * so allow it to be in BR_STATE_FORWARDING to be kept functional
143 dsa_port_set_state_now(dp
, BR_STATE_FORWARDING
);
146 int dsa_port_vlan_filtering(struct dsa_port
*dp
, bool vlan_filtering
,
147 struct switchdev_trans
*trans
)
149 struct dsa_switch
*ds
= dp
->ds
;
151 /* bridge skips -EOPNOTSUPP, so skip the prepare phase */
152 if (switchdev_trans_ph_prepare(trans
))
155 if (ds
->ops
->port_vlan_filtering
)
156 return ds
->ops
->port_vlan_filtering(ds
, dp
->index
,
162 int dsa_port_ageing_time(struct dsa_port
*dp
, clock_t ageing_clock
,
163 struct switchdev_trans
*trans
)
165 unsigned long ageing_jiffies
= clock_t_to_jiffies(ageing_clock
);
166 unsigned int ageing_time
= jiffies_to_msecs(ageing_jiffies
);
167 struct dsa_notifier_ageing_time_info info
= {
168 .ageing_time
= ageing_time
,
172 if (switchdev_trans_ph_prepare(trans
))
173 return dsa_port_notify(dp
, DSA_NOTIFIER_AGEING_TIME
, &info
);
175 dp
->ageing_time
= ageing_time
;
177 return dsa_port_notify(dp
, DSA_NOTIFIER_AGEING_TIME
, &info
);
180 int dsa_port_fdb_add(struct dsa_port
*dp
, const unsigned char *addr
,
183 struct dsa_notifier_fdb_info info
= {
184 .sw_index
= dp
->ds
->index
,
190 return dsa_port_notify(dp
, DSA_NOTIFIER_FDB_ADD
, &info
);
193 int dsa_port_fdb_del(struct dsa_port
*dp
, const unsigned char *addr
,
196 struct dsa_notifier_fdb_info info
= {
197 .sw_index
= dp
->ds
->index
,
204 return dsa_port_notify(dp
, DSA_NOTIFIER_FDB_DEL
, &info
);
207 int dsa_port_fdb_dump(struct dsa_port
*dp
, dsa_fdb_dump_cb_t
*cb
, void *data
)
209 struct dsa_switch
*ds
= dp
->ds
;
210 int port
= dp
->index
;
212 if (!ds
->ops
->port_fdb_dump
)
215 return ds
->ops
->port_fdb_dump(ds
, port
, cb
, data
);
218 int dsa_port_mdb_add(const struct dsa_port
*dp
,
219 const struct switchdev_obj_port_mdb
*mdb
,
220 struct switchdev_trans
*trans
)
222 struct dsa_notifier_mdb_info info
= {
223 .sw_index
= dp
->ds
->index
,
229 return dsa_port_notify(dp
, DSA_NOTIFIER_MDB_ADD
, &info
);
232 int dsa_port_mdb_del(const struct dsa_port
*dp
,
233 const struct switchdev_obj_port_mdb
*mdb
)
235 struct dsa_notifier_mdb_info info
= {
236 .sw_index
= dp
->ds
->index
,
241 return dsa_port_notify(dp
, DSA_NOTIFIER_MDB_DEL
, &info
);
244 int dsa_port_vlan_add(struct dsa_port
*dp
,
245 const struct switchdev_obj_port_vlan
*vlan
,
246 struct switchdev_trans
*trans
)
248 struct dsa_notifier_vlan_info info
= {
249 .sw_index
= dp
->ds
->index
,
255 if (br_vlan_enabled(dp
->bridge_dev
))
256 return dsa_port_notify(dp
, DSA_NOTIFIER_VLAN_ADD
, &info
);
261 int dsa_port_vlan_del(struct dsa_port
*dp
,
262 const struct switchdev_obj_port_vlan
*vlan
)
264 struct dsa_notifier_vlan_info info
= {
265 .sw_index
= dp
->ds
->index
,
270 if (br_vlan_enabled(dp
->bridge_dev
))
271 return dsa_port_notify(dp
, DSA_NOTIFIER_VLAN_DEL
, &info
);
276 static int dsa_port_setup_phy_of(struct dsa_port
*dp
, bool enable
)
278 struct device_node
*port_dn
= dp
->dn
;
279 struct device_node
*phy_dn
;
280 struct dsa_switch
*ds
= dp
->ds
;
281 struct phy_device
*phydev
;
282 int port
= dp
->index
;
285 phy_dn
= of_parse_phandle(port_dn
, "phy-handle", 0);
289 phydev
= of_phy_find_device(phy_dn
);
296 err
= genphy_config_init(phydev
);
300 err
= genphy_resume(phydev
);
304 err
= genphy_read_status(phydev
);
308 err
= genphy_suspend(phydev
);
313 if (ds
->ops
->adjust_link
)
314 ds
->ops
->adjust_link(ds
, port
, phydev
);
316 dev_dbg(ds
->dev
, "enabled port's phy: %s", phydev_name(phydev
));
319 put_device(&phydev
->mdio
.dev
);
325 static int dsa_port_fixed_link_register_of(struct dsa_port
*dp
)
327 struct device_node
*dn
= dp
->dn
;
328 struct dsa_switch
*ds
= dp
->ds
;
329 struct phy_device
*phydev
;
330 int port
= dp
->index
;
334 err
= of_phy_register_fixed_link(dn
);
337 "failed to register the fixed PHY of port %d\n",
342 phydev
= of_phy_find_device(dn
);
344 mode
= of_get_phy_mode(dn
);
346 mode
= PHY_INTERFACE_MODE_NA
;
347 phydev
->interface
= mode
;
349 genphy_config_init(phydev
);
350 genphy_read_status(phydev
);
352 if (ds
->ops
->adjust_link
)
353 ds
->ops
->adjust_link(ds
, port
, phydev
);
355 put_device(&phydev
->mdio
.dev
);
360 int dsa_port_link_register_of(struct dsa_port
*dp
)
362 if (of_phy_is_fixed_link(dp
->dn
))
363 return dsa_port_fixed_link_register_of(dp
);
365 return dsa_port_setup_phy_of(dp
, true);
368 void dsa_port_link_unregister_of(struct dsa_port
*dp
)
370 if (of_phy_is_fixed_link(dp
->dn
))
371 of_phy_deregister_fixed_link(dp
->dn
);
373 dsa_port_setup_phy_of(dp
, false);