Lines Matching +full:dp +full:- +full:phy
4 * Copyright (c) 2017 Savoir-faire Linux Inc.
20 static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v) in dsa_port_notify() argument
22 struct raw_notifier_head *nh = &dp->ds->dst->nh; in dsa_port_notify()
30 int dsa_port_set_state(struct dsa_port *dp, u8 state, in dsa_port_set_state() argument
33 struct dsa_switch *ds = dp->ds; in dsa_port_set_state()
34 int port = dp->index; in dsa_port_set_state()
37 return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP; in dsa_port_set_state()
39 if (ds->ops->port_stp_state_set) in dsa_port_set_state()
40 ds->ops->port_stp_state_set(ds, port, state); in dsa_port_set_state()
42 if (ds->ops->port_fast_age) { in dsa_port_set_state()
48 if ((dp->stp_state == BR_STATE_LEARNING || in dsa_port_set_state()
49 dp->stp_state == BR_STATE_FORWARDING) && in dsa_port_set_state()
53 ds->ops->port_fast_age(ds, port); in dsa_port_set_state()
56 dp->stp_state = state; in dsa_port_set_state()
61 static void dsa_port_set_state_now(struct dsa_port *dp, u8 state) in dsa_port_set_state_now() argument
65 err = dsa_port_set_state(dp, state, NULL); in dsa_port_set_state_now()
70 int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) in dsa_port_enable() argument
72 struct dsa_switch *ds = dp->ds; in dsa_port_enable()
73 int port = dp->index; in dsa_port_enable()
76 if (ds->ops->port_enable) { in dsa_port_enable()
77 err = ds->ops->port_enable(ds, port, phy); in dsa_port_enable()
82 if (!dp->bridge_dev) in dsa_port_enable()
83 dsa_port_set_state_now(dp, BR_STATE_FORWARDING); in dsa_port_enable()
88 void dsa_port_disable(struct dsa_port *dp, struct phy_device *phy) in dsa_port_disable() argument
90 struct dsa_switch *ds = dp->ds; in dsa_port_disable()
91 int port = dp->index; in dsa_port_disable()
93 if (!dp->bridge_dev) in dsa_port_disable()
94 dsa_port_set_state_now(dp, BR_STATE_DISABLED); in dsa_port_disable()
96 if (ds->ops->port_disable) in dsa_port_disable()
97 ds->ops->port_disable(ds, port, phy); in dsa_port_disable()
100 int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br) in dsa_port_bridge_join() argument
103 .sw_index = dp->ds->index, in dsa_port_bridge_join()
104 .port = dp->index, in dsa_port_bridge_join()
112 dp->bridge_dev = br; in dsa_port_bridge_join()
114 err = dsa_port_notify(dp, DSA_NOTIFIER_BRIDGE_JOIN, &info); in dsa_port_bridge_join()
118 dp->bridge_dev = NULL; in dsa_port_bridge_join()
123 void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) in dsa_port_bridge_leave() argument
126 .sw_index = dp->ds->index, in dsa_port_bridge_leave()
127 .port = dp->index, in dsa_port_bridge_leave()
135 dp->bridge_dev = NULL; in dsa_port_bridge_leave()
137 err = dsa_port_notify(dp, DSA_NOTIFIER_BRIDGE_LEAVE, &info); in dsa_port_bridge_leave()
144 dsa_port_set_state_now(dp, BR_STATE_FORWARDING); in dsa_port_bridge_leave()
147 int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, in dsa_port_vlan_filtering() argument
150 struct dsa_switch *ds = dp->ds; in dsa_port_vlan_filtering()
152 /* bridge skips -EOPNOTSUPP, so skip the prepare phase */ in dsa_port_vlan_filtering()
156 if (ds->ops->port_vlan_filtering) in dsa_port_vlan_filtering()
157 return ds->ops->port_vlan_filtering(ds, dp->index, in dsa_port_vlan_filtering()
163 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, in dsa_port_ageing_time() argument
174 return dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); in dsa_port_ageing_time()
176 dp->ageing_time = ageing_time; in dsa_port_ageing_time()
178 return dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); in dsa_port_ageing_time()
181 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr, in dsa_port_fdb_add() argument
185 .sw_index = dp->ds->index, in dsa_port_fdb_add()
186 .port = dp->index, in dsa_port_fdb_add()
191 return dsa_port_notify(dp, DSA_NOTIFIER_FDB_ADD, &info); in dsa_port_fdb_add()
194 int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr, in dsa_port_fdb_del() argument
198 .sw_index = dp->ds->index, in dsa_port_fdb_del()
199 .port = dp->index, in dsa_port_fdb_del()
205 return dsa_port_notify(dp, DSA_NOTIFIER_FDB_DEL, &info); in dsa_port_fdb_del()
208 int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data) in dsa_port_fdb_dump() argument
210 struct dsa_switch *ds = dp->ds; in dsa_port_fdb_dump()
211 int port = dp->index; in dsa_port_fdb_dump()
213 if (!ds->ops->port_fdb_dump) in dsa_port_fdb_dump()
214 return -EOPNOTSUPP; in dsa_port_fdb_dump()
216 return ds->ops->port_fdb_dump(ds, port, cb, data); in dsa_port_fdb_dump()
219 int dsa_port_mdb_add(const struct dsa_port *dp, in dsa_port_mdb_add() argument
224 .sw_index = dp->ds->index, in dsa_port_mdb_add()
225 .port = dp->index, in dsa_port_mdb_add()
230 return dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info); in dsa_port_mdb_add()
233 int dsa_port_mdb_del(const struct dsa_port *dp, in dsa_port_mdb_del() argument
237 .sw_index = dp->ds->index, in dsa_port_mdb_del()
238 .port = dp->index, in dsa_port_mdb_del()
242 return dsa_port_notify(dp, DSA_NOTIFIER_MDB_DEL, &info); in dsa_port_mdb_del()
245 int dsa_port_vlan_add(struct dsa_port *dp, in dsa_port_vlan_add() argument
250 .sw_index = dp->ds->index, in dsa_port_vlan_add()
251 .port = dp->index, in dsa_port_vlan_add()
256 if (netif_is_bridge_master(vlan->obj.orig_dev)) in dsa_port_vlan_add()
257 return -EOPNOTSUPP; in dsa_port_vlan_add()
259 if (br_vlan_enabled(dp->bridge_dev)) in dsa_port_vlan_add()
260 return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info); in dsa_port_vlan_add()
265 int dsa_port_vlan_del(struct dsa_port *dp, in dsa_port_vlan_del() argument
269 .sw_index = dp->ds->index, in dsa_port_vlan_del()
270 .port = dp->index, in dsa_port_vlan_del()
274 if (netif_is_bridge_master(vlan->obj.orig_dev)) in dsa_port_vlan_del()
275 return -EOPNOTSUPP; in dsa_port_vlan_del()
277 if (br_vlan_enabled(dp->bridge_dev)) in dsa_port_vlan_del()
278 return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info); in dsa_port_vlan_del()
283 static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp) in dsa_port_get_phy_device() argument
288 phy_dn = of_parse_phandle(dp->dn, "phy-handle", 0); in dsa_port_get_phy_device()
295 return ERR_PTR(-EPROBE_DEFER); in dsa_port_get_phy_device()
301 static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) in dsa_port_setup_phy_of() argument
303 struct dsa_switch *ds = dp->ds; in dsa_port_setup_phy_of()
305 int port = dp->index; in dsa_port_setup_phy_of()
308 phydev = dsa_port_get_phy_device(dp); in dsa_port_setup_phy_of()
333 if (ds->ops->adjust_link) in dsa_port_setup_phy_of()
334 ds->ops->adjust_link(ds, port, phydev); in dsa_port_setup_phy_of()
336 dev_dbg(ds->dev, "enabled port's phy: %s", phydev_name(phydev)); in dsa_port_setup_phy_of()
339 put_device(&phydev->mdio.dev); in dsa_port_setup_phy_of()
343 static int dsa_port_fixed_link_register_of(struct dsa_port *dp) in dsa_port_fixed_link_register_of() argument
345 struct device_node *dn = dp->dn; in dsa_port_fixed_link_register_of()
346 struct dsa_switch *ds = dp->ds; in dsa_port_fixed_link_register_of()
348 int port = dp->index; in dsa_port_fixed_link_register_of()
354 dev_err(ds->dev, in dsa_port_fixed_link_register_of()
355 "failed to register the fixed PHY of port %d\n", in dsa_port_fixed_link_register_of()
365 phydev->interface = mode; in dsa_port_fixed_link_register_of()
370 if (ds->ops->adjust_link) in dsa_port_fixed_link_register_of()
371 ds->ops->adjust_link(ds, port, phydev); in dsa_port_fixed_link_register_of()
373 put_device(&phydev->mdio.dev); in dsa_port_fixed_link_register_of()
378 int dsa_port_link_register_of(struct dsa_port *dp) in dsa_port_link_register_of() argument
380 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_link_register_of()
381 return dsa_port_fixed_link_register_of(dp); in dsa_port_link_register_of()
383 return dsa_port_setup_phy_of(dp, true); in dsa_port_link_register_of()
386 void dsa_port_link_unregister_of(struct dsa_port *dp) in dsa_port_link_unregister_of() argument
388 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_link_unregister_of()
389 of_phy_deregister_fixed_link(dp->dn); in dsa_port_link_unregister_of()
391 dsa_port_setup_phy_of(dp, false); in dsa_port_link_unregister_of()
394 int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data) in dsa_port_get_phy_strings() argument
397 int ret = -EOPNOTSUPP; in dsa_port_get_phy_strings()
399 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_phy_strings()
402 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_phy_strings()
407 put_device(&phydev->mdio.dev); in dsa_port_get_phy_strings()
413 int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data) in dsa_port_get_ethtool_phy_stats() argument
416 int ret = -EOPNOTSUPP; in dsa_port_get_ethtool_phy_stats()
418 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_ethtool_phy_stats()
421 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_ethtool_phy_stats()
426 put_device(&phydev->mdio.dev); in dsa_port_get_ethtool_phy_stats()
432 int dsa_port_get_phy_sset_count(struct dsa_port *dp) in dsa_port_get_phy_sset_count() argument
435 int ret = -EOPNOTSUPP; in dsa_port_get_phy_sset_count()
437 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_phy_sset_count()
440 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_phy_sset_count()
445 put_device(&phydev->mdio.dev); in dsa_port_get_phy_sset_count()