Lines Matching +full:dp +full:- +full:phy

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 2017 Savoir-faire Linux Inc.
22 struct raw_notifier_head *nh = &dst->nh; in dsa_broadcast()
33 static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v) in dsa_port_notify() argument
35 struct raw_notifier_head *nh = &dp->ds->dst->nh; in dsa_port_notify()
43 int dsa_port_set_state(struct dsa_port *dp, u8 state, in dsa_port_set_state() argument
46 struct dsa_switch *ds = dp->ds; in dsa_port_set_state()
47 int port = dp->index; in dsa_port_set_state()
50 return ds->ops->port_stp_state_set ? 0 : -EOPNOTSUPP; in dsa_port_set_state()
52 if (ds->ops->port_stp_state_set) in dsa_port_set_state()
53 ds->ops->port_stp_state_set(ds, port, state); in dsa_port_set_state()
55 if (ds->ops->port_fast_age) { in dsa_port_set_state()
61 if ((dp->stp_state == BR_STATE_LEARNING || in dsa_port_set_state()
62 dp->stp_state == BR_STATE_FORWARDING) && in dsa_port_set_state()
66 ds->ops->port_fast_age(ds, port); in dsa_port_set_state()
69 dp->stp_state = state; in dsa_port_set_state()
74 static void dsa_port_set_state_now(struct dsa_port *dp, u8 state) in dsa_port_set_state_now() argument
78 err = dsa_port_set_state(dp, state, NULL); in dsa_port_set_state_now()
83 int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy) in dsa_port_enable_rt() argument
85 struct dsa_switch *ds = dp->ds; in dsa_port_enable_rt()
86 int port = dp->index; in dsa_port_enable_rt()
89 if (ds->ops->port_enable) { in dsa_port_enable_rt()
90 err = ds->ops->port_enable(ds, port, phy); in dsa_port_enable_rt()
95 if (!dp->bridge_dev) in dsa_port_enable_rt()
96 dsa_port_set_state_now(dp, BR_STATE_FORWARDING); in dsa_port_enable_rt()
98 if (dp->pl) in dsa_port_enable_rt()
99 phylink_start(dp->pl); in dsa_port_enable_rt()
104 int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) in dsa_port_enable() argument
109 err = dsa_port_enable_rt(dp, phy); in dsa_port_enable()
115 void dsa_port_disable_rt(struct dsa_port *dp) in dsa_port_disable_rt() argument
117 struct dsa_switch *ds = dp->ds; in dsa_port_disable_rt()
118 int port = dp->index; in dsa_port_disable_rt()
120 if (dp->pl) in dsa_port_disable_rt()
121 phylink_stop(dp->pl); in dsa_port_disable_rt()
123 if (!dp->bridge_dev) in dsa_port_disable_rt()
124 dsa_port_set_state_now(dp, BR_STATE_DISABLED); in dsa_port_disable_rt()
126 if (ds->ops->port_disable) in dsa_port_disable_rt()
127 ds->ops->port_disable(ds, port); in dsa_port_disable_rt()
130 void dsa_port_disable(struct dsa_port *dp) in dsa_port_disable() argument
133 dsa_port_disable_rt(dp); in dsa_port_disable()
137 int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br) in dsa_port_bridge_join() argument
140 .tree_index = dp->ds->dst->index, in dsa_port_bridge_join()
141 .sw_index = dp->ds->index, in dsa_port_bridge_join()
142 .port = dp->index, in dsa_port_bridge_join()
148 err = dsa_port_bridge_flags(dp, BR_FLOOD | BR_MCAST_FLOOD, NULL); in dsa_port_bridge_join()
155 dp->bridge_dev = br; in dsa_port_bridge_join()
161 dsa_port_bridge_flags(dp, 0, NULL); in dsa_port_bridge_join()
162 dp->bridge_dev = NULL; in dsa_port_bridge_join()
168 void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) in dsa_port_bridge_leave() argument
171 .tree_index = dp->ds->dst->index, in dsa_port_bridge_leave()
172 .sw_index = dp->ds->index, in dsa_port_bridge_leave()
173 .port = dp->index, in dsa_port_bridge_leave()
181 dp->bridge_dev = NULL; in dsa_port_bridge_leave()
188 dsa_port_bridge_flags(dp, 0, NULL); in dsa_port_bridge_leave()
193 dsa_port_set_state_now(dp, BR_STATE_FORWARDING); in dsa_port_bridge_leave()
197 static bool dsa_port_can_apply_vlan_filtering(struct dsa_port *dp, in dsa_port_can_apply_vlan_filtering() argument
200 struct dsa_switch *ds = dp->ds; in dsa_port_can_apply_vlan_filtering()
208 if (vlan_filtering && dsa_is_user_port(ds, dp->index)) { in dsa_port_can_apply_vlan_filtering()
209 struct net_device *upper_dev, *slave = dp->slave; in dsa_port_can_apply_vlan_filtering()
210 struct net_device *br = dp->bridge_dev; in dsa_port_can_apply_vlan_filtering()
222 /* br_vlan_get_info() returns -EINVAL or -ENOENT if the in dsa_port_can_apply_vlan_filtering()
228 dev_err(ds->dev, "Must remove upper %s first\n", in dsa_port_can_apply_vlan_filtering()
229 upper_dev->name); in dsa_port_can_apply_vlan_filtering()
235 if (!ds->vlan_filtering_is_global) in dsa_port_can_apply_vlan_filtering()
243 for (i = 0; i < ds->num_ports; i++) { in dsa_port_can_apply_vlan_filtering()
246 other_bridge = dsa_to_port(ds, i)->bridge_dev; in dsa_port_can_apply_vlan_filtering()
252 if (other_bridge == dp->bridge_dev) in dsa_port_can_apply_vlan_filtering()
255 dev_err(ds->dev, "VLAN filtering is a global setting\n"); in dsa_port_can_apply_vlan_filtering()
262 int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, in dsa_port_vlan_filtering() argument
265 struct dsa_switch *ds = dp->ds; in dsa_port_vlan_filtering()
271 if (!ds->ops->port_vlan_filtering) in dsa_port_vlan_filtering()
272 return -EOPNOTSUPP; in dsa_port_vlan_filtering()
279 apply = dsa_port_can_apply_vlan_filtering(dp, vlan_filtering); in dsa_port_vlan_filtering()
282 return -EINVAL; in dsa_port_vlan_filtering()
285 if (dsa_port_is_vlan_filtering(dp) == vlan_filtering) in dsa_port_vlan_filtering()
288 err = ds->ops->port_vlan_filtering(ds, dp->index, vlan_filtering, in dsa_port_vlan_filtering()
294 if (ds->vlan_filtering_is_global) in dsa_port_vlan_filtering()
295 ds->vlan_filtering = vlan_filtering; in dsa_port_vlan_filtering()
297 dp->vlan_filtering = vlan_filtering; in dsa_port_vlan_filtering()
306 bool dsa_port_skip_vlan_configuration(struct dsa_port *dp) in dsa_port_skip_vlan_configuration() argument
308 struct dsa_switch *ds = dp->ds; in dsa_port_skip_vlan_configuration()
310 if (!dp->bridge_dev) in dsa_port_skip_vlan_configuration()
313 return (!ds->configure_vlan_while_not_filtering && in dsa_port_skip_vlan_configuration()
314 !br_vlan_enabled(dp->bridge_dev)); in dsa_port_skip_vlan_configuration()
317 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, in dsa_port_ageing_time() argument
328 return dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); in dsa_port_ageing_time()
330 dp->ageing_time = ageing_time; in dsa_port_ageing_time()
332 return dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); in dsa_port_ageing_time()
335 int dsa_port_pre_bridge_flags(const struct dsa_port *dp, unsigned long flags, in dsa_port_pre_bridge_flags() argument
338 struct dsa_switch *ds = dp->ds; in dsa_port_pre_bridge_flags()
340 if (!ds->ops->port_egress_floods || in dsa_port_pre_bridge_flags()
342 return -EINVAL; in dsa_port_pre_bridge_flags()
347 int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags, in dsa_port_bridge_flags() argument
350 struct dsa_switch *ds = dp->ds; in dsa_port_bridge_flags()
351 int port = dp->index; in dsa_port_bridge_flags()
357 if (ds->ops->port_egress_floods) in dsa_port_bridge_flags()
358 err = ds->ops->port_egress_floods(ds, port, flags & BR_FLOOD, in dsa_port_bridge_flags()
364 int dsa_port_mrouter(struct dsa_port *dp, bool mrouter, in dsa_port_mrouter() argument
367 struct dsa_switch *ds = dp->ds; in dsa_port_mrouter()
368 int port = dp->index; in dsa_port_mrouter()
371 return ds->ops->port_egress_floods ? 0 : -EOPNOTSUPP; in dsa_port_mrouter()
373 return ds->ops->port_egress_floods(ds, port, true, mrouter); in dsa_port_mrouter()
376 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu, in dsa_port_mtu_change() argument
380 .sw_index = dp->ds->index, in dsa_port_mtu_change()
382 .port = dp->index, in dsa_port_mtu_change()
386 return dsa_port_notify(dp, DSA_NOTIFIER_MTU, &info); in dsa_port_mtu_change()
389 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr, in dsa_port_fdb_add() argument
393 .sw_index = dp->ds->index, in dsa_port_fdb_add()
394 .port = dp->index, in dsa_port_fdb_add()
399 return dsa_port_notify(dp, DSA_NOTIFIER_FDB_ADD, &info); in dsa_port_fdb_add()
402 int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr, in dsa_port_fdb_del() argument
406 .sw_index = dp->ds->index, in dsa_port_fdb_del()
407 .port = dp->index, in dsa_port_fdb_del()
413 return dsa_port_notify(dp, DSA_NOTIFIER_FDB_DEL, &info); in dsa_port_fdb_del()
416 int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data) in dsa_port_fdb_dump() argument
418 struct dsa_switch *ds = dp->ds; in dsa_port_fdb_dump()
419 int port = dp->index; in dsa_port_fdb_dump()
421 if (!ds->ops->port_fdb_dump) in dsa_port_fdb_dump()
422 return -EOPNOTSUPP; in dsa_port_fdb_dump()
424 return ds->ops->port_fdb_dump(ds, port, cb, data); in dsa_port_fdb_dump()
427 int dsa_port_mdb_add(const struct dsa_port *dp, in dsa_port_mdb_add() argument
432 .sw_index = dp->ds->index, in dsa_port_mdb_add()
433 .port = dp->index, in dsa_port_mdb_add()
438 return dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info); in dsa_port_mdb_add()
441 int dsa_port_mdb_del(const struct dsa_port *dp, in dsa_port_mdb_del() argument
445 .sw_index = dp->ds->index, in dsa_port_mdb_del()
446 .port = dp->index, in dsa_port_mdb_del()
450 return dsa_port_notify(dp, DSA_NOTIFIER_MDB_DEL, &info); in dsa_port_mdb_del()
453 int dsa_port_vlan_add(struct dsa_port *dp, in dsa_port_vlan_add() argument
458 .sw_index = dp->ds->index, in dsa_port_vlan_add()
459 .port = dp->index, in dsa_port_vlan_add()
464 return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info); in dsa_port_vlan_add()
467 int dsa_port_vlan_del(struct dsa_port *dp, in dsa_port_vlan_del() argument
471 .sw_index = dp->ds->index, in dsa_port_vlan_del()
472 .port = dp->index, in dsa_port_vlan_del()
476 return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info); in dsa_port_vlan_del()
479 static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp) in dsa_port_get_phy_device() argument
484 phy_dn = of_parse_phandle(dp->dn, "phy-handle", 0); in dsa_port_get_phy_device()
491 return ERR_PTR(-EPROBE_DEFER); in dsa_port_get_phy_device()
502 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_validate() local
503 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_validate()
505 if (!ds->ops->phylink_validate) in dsa_port_phylink_validate()
508 ds->ops->phylink_validate(ds, dp->index, supported, state); in dsa_port_phylink_validate()
514 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_pcs_get_state() local
515 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_pcs_get_state()
519 if (!ds->ops->phylink_mac_link_state) { in dsa_port_phylink_mac_pcs_get_state()
520 state->link = 0; in dsa_port_phylink_mac_pcs_get_state()
524 err = ds->ops->phylink_mac_link_state(ds, dp->index, state); in dsa_port_phylink_mac_pcs_get_state()
526 dev_err(ds->dev, "p%d: phylink_mac_link_state() failed: %d\n", in dsa_port_phylink_mac_pcs_get_state()
527 dp->index, err); in dsa_port_phylink_mac_pcs_get_state()
528 state->link = 0; in dsa_port_phylink_mac_pcs_get_state()
536 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_config() local
537 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_config()
539 if (!ds->ops->phylink_mac_config) in dsa_port_phylink_mac_config()
542 ds->ops->phylink_mac_config(ds, dp->index, mode, state); in dsa_port_phylink_mac_config()
547 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_an_restart() local
548 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_an_restart()
550 if (!ds->ops->phylink_mac_an_restart) in dsa_port_phylink_mac_an_restart()
553 ds->ops->phylink_mac_an_restart(ds, dp->index); in dsa_port_phylink_mac_an_restart()
560 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_link_down() local
562 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_link_down()
564 if (dsa_is_user_port(ds, dp->index)) in dsa_port_phylink_mac_link_down()
565 phydev = dp->slave->phydev; in dsa_port_phylink_mac_link_down()
567 if (!ds->ops->phylink_mac_link_down) { in dsa_port_phylink_mac_link_down()
568 if (ds->ops->adjust_link && phydev) in dsa_port_phylink_mac_link_down()
569 ds->ops->adjust_link(ds, dp->index, phydev); in dsa_port_phylink_mac_link_down()
573 ds->ops->phylink_mac_link_down(ds, dp->index, mode, interface); in dsa_port_phylink_mac_link_down()
583 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_link_up() local
584 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_link_up()
586 if (!ds->ops->phylink_mac_link_up) { in dsa_port_phylink_mac_link_up()
587 if (ds->ops->adjust_link && phydev) in dsa_port_phylink_mac_link_up()
588 ds->ops->adjust_link(ds, dp->index, phydev); in dsa_port_phylink_mac_link_up()
592 ds->ops->phylink_mac_link_up(ds, dp->index, mode, interface, phydev, in dsa_port_phylink_mac_link_up()
605 static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) in dsa_port_setup_phy_of() argument
607 struct dsa_switch *ds = dp->ds; in dsa_port_setup_phy_of()
609 int port = dp->index; in dsa_port_setup_phy_of()
612 phydev = dsa_port_get_phy_device(dp); in dsa_port_setup_phy_of()
633 if (ds->ops->adjust_link) in dsa_port_setup_phy_of()
634 ds->ops->adjust_link(ds, port, phydev); in dsa_port_setup_phy_of()
636 dev_dbg(ds->dev, "enabled port's phy: %s", phydev_name(phydev)); in dsa_port_setup_phy_of()
639 put_device(&phydev->mdio.dev); in dsa_port_setup_phy_of()
643 static int dsa_port_fixed_link_register_of(struct dsa_port *dp) in dsa_port_fixed_link_register_of() argument
645 struct device_node *dn = dp->dn; in dsa_port_fixed_link_register_of()
646 struct dsa_switch *ds = dp->ds; in dsa_port_fixed_link_register_of()
648 int port = dp->index; in dsa_port_fixed_link_register_of()
654 dev_err(ds->dev, in dsa_port_fixed_link_register_of()
655 "failed to register the fixed PHY of port %d\n", in dsa_port_fixed_link_register_of()
665 phydev->interface = mode; in dsa_port_fixed_link_register_of()
669 if (ds->ops->adjust_link) in dsa_port_fixed_link_register_of()
670 ds->ops->adjust_link(ds, port, phydev); in dsa_port_fixed_link_register_of()
672 put_device(&phydev->mdio.dev); in dsa_port_fixed_link_register_of()
677 static int dsa_port_phylink_register(struct dsa_port *dp) in dsa_port_phylink_register() argument
679 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_register()
680 struct device_node *port_dn = dp->dn; in dsa_port_phylink_register()
688 dp->pl_config.dev = ds->dev; in dsa_port_phylink_register()
689 dp->pl_config.type = PHYLINK_DEV; in dsa_port_phylink_register()
690 dp->pl_config.pcs_poll = ds->pcs_poll; in dsa_port_phylink_register()
692 dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), in dsa_port_phylink_register()
694 if (IS_ERR(dp->pl)) { in dsa_port_phylink_register()
695 pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); in dsa_port_phylink_register()
696 return PTR_ERR(dp->pl); in dsa_port_phylink_register()
699 err = phylink_of_phy_connect(dp->pl, port_dn, 0); in dsa_port_phylink_register()
700 if (err && err != -ENODEV) { in dsa_port_phylink_register()
701 pr_err("could not attach to PHY: %d\n", err); in dsa_port_phylink_register()
708 phylink_destroy(dp->pl); in dsa_port_phylink_register()
712 int dsa_port_link_register_of(struct dsa_port *dp) in dsa_port_link_register_of() argument
714 struct dsa_switch *ds = dp->ds; in dsa_port_link_register_of()
716 int port = dp->index; in dsa_port_link_register_of()
718 if (!ds->ops->adjust_link) { in dsa_port_link_register_of()
719 phy_np = of_parse_phandle(dp->dn, "phy-handle", 0); in dsa_port_link_register_of()
720 if (of_phy_is_fixed_link(dp->dn) || phy_np) { in dsa_port_link_register_of()
721 if (ds->ops->phylink_mac_link_down) in dsa_port_link_register_of()
722 ds->ops->phylink_mac_link_down(ds, port, in dsa_port_link_register_of()
724 return dsa_port_phylink_register(dp); in dsa_port_link_register_of()
729 dev_warn(ds->dev, in dsa_port_link_register_of()
732 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_link_register_of()
733 return dsa_port_fixed_link_register_of(dp); in dsa_port_link_register_of()
735 return dsa_port_setup_phy_of(dp, true); in dsa_port_link_register_of()
738 void dsa_port_link_unregister_of(struct dsa_port *dp) in dsa_port_link_unregister_of() argument
740 struct dsa_switch *ds = dp->ds; in dsa_port_link_unregister_of()
742 if (!ds->ops->adjust_link && dp->pl) { in dsa_port_link_unregister_of()
744 phylink_disconnect_phy(dp->pl); in dsa_port_link_unregister_of()
746 phylink_destroy(dp->pl); in dsa_port_link_unregister_of()
747 dp->pl = NULL; in dsa_port_link_unregister_of()
751 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_link_unregister_of()
752 of_phy_deregister_fixed_link(dp->dn); in dsa_port_link_unregister_of()
754 dsa_port_setup_phy_of(dp, false); in dsa_port_link_unregister_of()
757 int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data) in dsa_port_get_phy_strings() argument
760 int ret = -EOPNOTSUPP; in dsa_port_get_phy_strings()
762 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_phy_strings()
765 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_phy_strings()
770 put_device(&phydev->mdio.dev); in dsa_port_get_phy_strings()
776 int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data) in dsa_port_get_ethtool_phy_stats() argument
779 int ret = -EOPNOTSUPP; in dsa_port_get_ethtool_phy_stats()
781 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_ethtool_phy_stats()
784 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_ethtool_phy_stats()
789 put_device(&phydev->mdio.dev); in dsa_port_get_ethtool_phy_stats()
795 int dsa_port_get_phy_sset_count(struct dsa_port *dp) in dsa_port_get_phy_sset_count() argument
798 int ret = -EOPNOTSUPP; in dsa_port_get_phy_sset_count()
800 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_phy_sset_count()
803 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_phy_sset_count()
808 put_device(&phydev->mdio.dev); in dsa_port_get_phy_sset_count()