Lines Matching full:dp

18  * @dp: port on which change occurred
28 static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v) in dsa_port_notify() argument
30 return dsa_tree_notify(dp->ds->dst, e, v); in dsa_port_notify()
33 static void dsa_port_notify_bridge_fdb_flush(const struct dsa_port *dp) in dsa_port_notify_bridge_fdb_flush() argument
35 struct net_device *brport_dev = dsa_port_to_bridge_port(dp); in dsa_port_notify_bridge_fdb_flush()
51 static void dsa_port_fast_age(const struct dsa_port *dp) in dsa_port_fast_age() argument
53 struct dsa_switch *ds = dp->ds; in dsa_port_fast_age()
58 ds->ops->port_fast_age(ds, dp->index); in dsa_port_fast_age()
60 dsa_port_notify_bridge_fdb_flush(dp); in dsa_port_fast_age()
63 static bool dsa_port_can_configure_learning(struct dsa_port *dp) in dsa_port_can_configure_learning() argument
68 struct dsa_switch *ds = dp->ds; in dsa_port_can_configure_learning()
74 err = ds->ops->port_pre_bridge_flags(ds, dp->index, flags, NULL); in dsa_port_can_configure_learning()
78 int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age) in dsa_port_set_state() argument
80 struct dsa_switch *ds = dp->ds; in dsa_port_set_state()
81 int port = dp->index; in dsa_port_set_state()
88 if (!dsa_port_can_configure_learning(dp) || in dsa_port_set_state()
89 (do_fast_age && dp->learning)) { in dsa_port_set_state()
98 if ((dp->stp_state == BR_STATE_LEARNING || in dsa_port_set_state()
99 dp->stp_state == BR_STATE_FORWARDING) && in dsa_port_set_state()
103 dsa_port_fast_age(dp); in dsa_port_set_state()
106 dp->stp_state = state; in dsa_port_set_state()
111 static void dsa_port_set_state_now(struct dsa_port *dp, u8 state, in dsa_port_set_state_now() argument
116 err = dsa_port_set_state(dp, state, do_fast_age); in dsa_port_set_state_now()
121 int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy) in dsa_port_enable_rt() argument
123 struct dsa_switch *ds = dp->ds; in dsa_port_enable_rt()
124 int port = dp->index; in dsa_port_enable_rt()
133 if (!dp->bridge_dev) in dsa_port_enable_rt()
134 dsa_port_set_state_now(dp, BR_STATE_FORWARDING, false); in dsa_port_enable_rt()
136 if (dp->pl) in dsa_port_enable_rt()
137 phylink_start(dp->pl); in dsa_port_enable_rt()
142 int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) in dsa_port_enable() argument
147 err = dsa_port_enable_rt(dp, phy); in dsa_port_enable()
153 void dsa_port_disable_rt(struct dsa_port *dp) in dsa_port_disable_rt() argument
155 struct dsa_switch *ds = dp->ds; in dsa_port_disable_rt()
156 int port = dp->index; in dsa_port_disable_rt()
158 if (dp->pl) in dsa_port_disable_rt()
159 phylink_stop(dp->pl); in dsa_port_disable_rt()
161 if (!dp->bridge_dev) in dsa_port_disable_rt()
162 dsa_port_set_state_now(dp, BR_STATE_DISABLED, false); in dsa_port_disable_rt()
168 void dsa_port_disable(struct dsa_port *dp) in dsa_port_disable() argument
171 dsa_port_disable_rt(dp); in dsa_port_disable()
175 static int dsa_port_inherit_brport_flags(struct dsa_port *dp, in dsa_port_inherit_brport_flags() argument
180 struct net_device *brport_dev = dsa_port_to_bridge_port(dp); in dsa_port_inherit_brport_flags()
191 err = dsa_port_bridge_flags(dp, flags, extack); in dsa_port_inherit_brport_flags()
199 static void dsa_port_clear_brport_flags(struct dsa_port *dp) in dsa_port_clear_brport_flags() argument
212 err = dsa_port_bridge_flags(dp, flags, NULL); in dsa_port_clear_brport_flags()
214 dev_err(dp->ds->dev, in dsa_port_clear_brport_flags()
220 static int dsa_port_switchdev_sync_attrs(struct dsa_port *dp, in dsa_port_switchdev_sync_attrs() argument
223 struct net_device *brport_dev = dsa_port_to_bridge_port(dp); in dsa_port_switchdev_sync_attrs()
224 struct net_device *br = dp->bridge_dev; in dsa_port_switchdev_sync_attrs()
227 err = dsa_port_inherit_brport_flags(dp, extack); in dsa_port_switchdev_sync_attrs()
231 err = dsa_port_set_state(dp, br_port_get_stp_state(brport_dev), false); in dsa_port_switchdev_sync_attrs()
235 err = dsa_port_vlan_filtering(dp, br_vlan_enabled(br), extack); in dsa_port_switchdev_sync_attrs()
239 err = dsa_port_ageing_time(dp, br_get_ageing_time(br)); in dsa_port_switchdev_sync_attrs()
246 static void dsa_port_switchdev_unsync_attrs(struct dsa_port *dp) in dsa_port_switchdev_unsync_attrs() argument
259 dsa_port_clear_brport_flags(dp); in dsa_port_switchdev_unsync_attrs()
264 dsa_port_set_state_now(dp, BR_STATE_FORWARDING, true); in dsa_port_switchdev_unsync_attrs()
273 static void dsa_port_bridge_tx_fwd_unoffload(struct dsa_port *dp, in dsa_port_bridge_tx_fwd_unoffload() argument
276 int bridge_num = dp->bridge_num; in dsa_port_bridge_tx_fwd_unoffload()
277 struct dsa_switch *ds = dp->ds; in dsa_port_bridge_tx_fwd_unoffload()
280 if (!ds->ops->port_bridge_tx_fwd_unoffload || dp->bridge_num == -1) in dsa_port_bridge_tx_fwd_unoffload()
283 dp->bridge_num = -1; in dsa_port_bridge_tx_fwd_unoffload()
290 ds->ops->port_bridge_tx_fwd_unoffload(ds, dp->index, bridge_dev, in dsa_port_bridge_tx_fwd_unoffload()
294 static bool dsa_port_bridge_tx_fwd_offload(struct dsa_port *dp, in dsa_port_bridge_tx_fwd_offload() argument
297 struct dsa_switch *ds = dp->ds; in dsa_port_bridge_tx_fwd_offload()
308 dp->bridge_num = bridge_num; in dsa_port_bridge_tx_fwd_offload()
311 err = ds->ops->port_bridge_tx_fwd_offload(ds, dp->index, bridge_dev, in dsa_port_bridge_tx_fwd_offload()
314 dsa_port_bridge_tx_fwd_unoffload(dp, bridge_dev); in dsa_port_bridge_tx_fwd_offload()
321 int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br, in dsa_port_bridge_join() argument
325 .tree_index = dp->ds->dst->index, in dsa_port_bridge_join()
326 .sw_index = dp->ds->index, in dsa_port_bridge_join()
327 .port = dp->index, in dsa_port_bridge_join()
330 struct net_device *dev = dp->slave; in dsa_port_bridge_join()
338 dp->bridge_dev = br; in dsa_port_bridge_join()
340 brport_dev = dsa_port_to_bridge_port(dp); in dsa_port_bridge_join()
346 tx_fwd_offload = dsa_port_bridge_tx_fwd_offload(dp, br); in dsa_port_bridge_join()
348 err = switchdev_bridge_port_offload(brport_dev, dev, dp, in dsa_port_bridge_join()
355 err = dsa_port_switchdev_sync_attrs(dp, extack); in dsa_port_bridge_join()
362 switchdev_bridge_port_unoffload(brport_dev, dp, in dsa_port_bridge_join()
368 dp->bridge_dev = NULL; in dsa_port_bridge_join()
372 void dsa_port_pre_bridge_leave(struct dsa_port *dp, struct net_device *br) in dsa_port_pre_bridge_leave() argument
374 struct net_device *brport_dev = dsa_port_to_bridge_port(dp); in dsa_port_pre_bridge_leave()
380 switchdev_bridge_port_unoffload(brport_dev, dp, in dsa_port_pre_bridge_leave()
385 void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) in dsa_port_bridge_leave() argument
388 .tree_index = dp->ds->dst->index, in dsa_port_bridge_leave()
389 .sw_index = dp->ds->index, in dsa_port_bridge_leave()
390 .port = dp->index, in dsa_port_bridge_leave()
398 dp->bridge_dev = NULL; in dsa_port_bridge_leave()
400 dsa_port_bridge_tx_fwd_unoffload(dp, br); in dsa_port_bridge_leave()
404 dev_err(dp->ds->dev, in dsa_port_bridge_leave()
406 dp->index, ERR_PTR(err)); in dsa_port_bridge_leave()
408 dsa_port_switchdev_unsync_attrs(dp); in dsa_port_bridge_leave()
411 int dsa_port_lag_change(struct dsa_port *dp, in dsa_port_lag_change() argument
415 .sw_index = dp->ds->index, in dsa_port_lag_change()
416 .port = dp->index, in dsa_port_lag_change()
420 if (!dp->lag_dev) in dsa_port_lag_change()
430 if (tx_enabled == dp->lag_tx_enabled) in dsa_port_lag_change()
433 dp->lag_tx_enabled = tx_enabled; in dsa_port_lag_change()
435 return dsa_port_notify(dp, DSA_NOTIFIER_LAG_CHANGE, &info); in dsa_port_lag_change()
438 int dsa_port_lag_join(struct dsa_port *dp, struct net_device *lag, in dsa_port_lag_join() argument
443 .sw_index = dp->ds->index, in dsa_port_lag_join()
444 .port = dp->index, in dsa_port_lag_join()
451 dsa_lag_map(dp->ds->dst, lag); in dsa_port_lag_join()
452 dp->lag_dev = lag; in dsa_port_lag_join()
454 err = dsa_port_notify(dp, DSA_NOTIFIER_LAG_JOIN, &info); in dsa_port_lag_join()
462 err = dsa_port_bridge_join(dp, bridge_dev, extack); in dsa_port_lag_join()
469 dsa_port_notify(dp, DSA_NOTIFIER_LAG_LEAVE, &info); in dsa_port_lag_join()
471 dp->lag_dev = NULL; in dsa_port_lag_join()
472 dsa_lag_unmap(dp->ds->dst, lag); in dsa_port_lag_join()
476 void dsa_port_pre_lag_leave(struct dsa_port *dp, struct net_device *lag) in dsa_port_pre_lag_leave() argument
478 if (dp->bridge_dev) in dsa_port_pre_lag_leave()
479 dsa_port_pre_bridge_leave(dp, dp->bridge_dev); in dsa_port_pre_lag_leave()
482 void dsa_port_lag_leave(struct dsa_port *dp, struct net_device *lag) in dsa_port_lag_leave() argument
485 .sw_index = dp->ds->index, in dsa_port_lag_leave()
486 .port = dp->index, in dsa_port_lag_leave()
491 if (!dp->lag_dev) in dsa_port_lag_leave()
497 if (dp->bridge_dev) in dsa_port_lag_leave()
498 dsa_port_bridge_leave(dp, dp->bridge_dev); in dsa_port_lag_leave()
500 dp->lag_tx_enabled = false; in dsa_port_lag_leave()
501 dp->lag_dev = NULL; in dsa_port_lag_leave()
503 err = dsa_port_notify(dp, DSA_NOTIFIER_LAG_LEAVE, &info); in dsa_port_lag_leave()
505 dev_err(dp->ds->dev, in dsa_port_lag_leave()
507 dp->index, ERR_PTR(err)); in dsa_port_lag_leave()
509 dsa_lag_unmap(dp->ds->dst, lag); in dsa_port_lag_leave()
513 static bool dsa_port_can_apply_vlan_filtering(struct dsa_port *dp, in dsa_port_can_apply_vlan_filtering() argument
517 struct dsa_switch *ds = dp->ds; in dsa_port_can_apply_vlan_filtering()
525 if (vlan_filtering && dsa_is_user_port(ds, dp->index)) { in dsa_port_can_apply_vlan_filtering()
526 struct net_device *upper_dev, *slave = dp->slave; in dsa_port_can_apply_vlan_filtering()
527 struct net_device *br = dp->bridge_dev; in dsa_port_can_apply_vlan_filtering()
569 if (other_bridge == dp->bridge_dev) in dsa_port_can_apply_vlan_filtering()
580 int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, in dsa_port_vlan_filtering() argument
583 bool old_vlan_filtering = dsa_port_is_vlan_filtering(dp); in dsa_port_vlan_filtering()
584 struct dsa_switch *ds = dp->ds; in dsa_port_vlan_filtering()
596 apply = dsa_port_can_apply_vlan_filtering(dp, vlan_filtering, extack); in dsa_port_vlan_filtering()
601 if (dsa_port_is_vlan_filtering(dp) == vlan_filtering) in dsa_port_vlan_filtering()
604 err = ds->ops->port_vlan_filtering(ds, dp->index, vlan_filtering, in dsa_port_vlan_filtering()
633 dp->vlan_filtering = vlan_filtering; in dsa_port_vlan_filtering()
635 err = dsa_slave_manage_vlan_filtering(dp->slave, in dsa_port_vlan_filtering()
644 ds->ops->port_vlan_filtering(ds, dp->index, old_vlan_filtering, NULL); in dsa_port_vlan_filtering()
649 dp->vlan_filtering = old_vlan_filtering; in dsa_port_vlan_filtering()
657 bool dsa_port_skip_vlan_configuration(struct dsa_port *dp) in dsa_port_skip_vlan_configuration() argument
659 struct dsa_switch *ds = dp->ds; in dsa_port_skip_vlan_configuration()
661 if (!dp->bridge_dev) in dsa_port_skip_vlan_configuration()
665 !br_vlan_enabled(dp->bridge_dev)); in dsa_port_skip_vlan_configuration()
668 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock) in dsa_port_ageing_time() argument
677 err = dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); in dsa_port_ageing_time()
681 dp->ageing_time = ageing_time; in dsa_port_ageing_time()
686 int dsa_port_pre_bridge_flags(const struct dsa_port *dp, in dsa_port_pre_bridge_flags() argument
690 struct dsa_switch *ds = dp->ds; in dsa_port_pre_bridge_flags()
695 return ds->ops->port_pre_bridge_flags(ds, dp->index, flags, extack); in dsa_port_pre_bridge_flags()
698 int dsa_port_bridge_flags(struct dsa_port *dp, in dsa_port_bridge_flags() argument
702 struct dsa_switch *ds = dp->ds; in dsa_port_bridge_flags()
708 err = ds->ops->port_bridge_flags(ds, dp->index, flags, extack); in dsa_port_bridge_flags()
715 if (learning == dp->learning) in dsa_port_bridge_flags()
718 if ((dp->learning && !learning) && in dsa_port_bridge_flags()
719 (dp->stp_state == BR_STATE_LEARNING || in dsa_port_bridge_flags()
720 dp->stp_state == BR_STATE_FORWARDING)) in dsa_port_bridge_flags()
721 dsa_port_fast_age(dp); in dsa_port_bridge_flags()
723 dp->learning = learning; in dsa_port_bridge_flags()
729 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu, in dsa_port_mtu_change() argument
733 .sw_index = dp->ds->index, in dsa_port_mtu_change()
735 .port = dp->index, in dsa_port_mtu_change()
739 return dsa_port_notify(dp, DSA_NOTIFIER_MTU, &info); in dsa_port_mtu_change()
742 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr, in dsa_port_fdb_add() argument
746 .sw_index = dp->ds->index, in dsa_port_fdb_add()
747 .port = dp->index, in dsa_port_fdb_add()
752 return dsa_port_notify(dp, DSA_NOTIFIER_FDB_ADD, &info); in dsa_port_fdb_add()
755 int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr, in dsa_port_fdb_del() argument
759 .sw_index = dp->ds->index, in dsa_port_fdb_del()
760 .port = dp->index, in dsa_port_fdb_del()
766 return dsa_port_notify(dp, DSA_NOTIFIER_FDB_DEL, &info); in dsa_port_fdb_del()
769 int dsa_port_host_fdb_add(struct dsa_port *dp, const unsigned char *addr, in dsa_port_host_fdb_add() argument
773 .sw_index = dp->ds->index, in dsa_port_host_fdb_add()
774 .port = dp->index, in dsa_port_host_fdb_add()
778 struct dsa_port *cpu_dp = dp->cpu_dp; in dsa_port_host_fdb_add()
785 return dsa_port_notify(dp, DSA_NOTIFIER_HOST_FDB_ADD, &info); in dsa_port_host_fdb_add()
788 int dsa_port_host_fdb_del(struct dsa_port *dp, const unsigned char *addr, in dsa_port_host_fdb_del() argument
792 .sw_index = dp->ds->index, in dsa_port_host_fdb_del()
793 .port = dp->index, in dsa_port_host_fdb_del()
797 struct dsa_port *cpu_dp = dp->cpu_dp; in dsa_port_host_fdb_del()
804 return dsa_port_notify(dp, DSA_NOTIFIER_HOST_FDB_DEL, &info); in dsa_port_host_fdb_del()
807 int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data) in dsa_port_fdb_dump() argument
809 struct dsa_switch *ds = dp->ds; in dsa_port_fdb_dump()
810 int port = dp->index; in dsa_port_fdb_dump()
818 int dsa_port_mdb_add(const struct dsa_port *dp, in dsa_port_mdb_add() argument
822 .sw_index = dp->ds->index, in dsa_port_mdb_add()
823 .port = dp->index, in dsa_port_mdb_add()
827 return dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info); in dsa_port_mdb_add()
830 int dsa_port_mdb_del(const struct dsa_port *dp, in dsa_port_mdb_del() argument
834 .sw_index = dp->ds->index, in dsa_port_mdb_del()
835 .port = dp->index, in dsa_port_mdb_del()
839 return dsa_port_notify(dp, DSA_NOTIFIER_MDB_DEL, &info); in dsa_port_mdb_del()
842 int dsa_port_host_mdb_add(const struct dsa_port *dp, in dsa_port_host_mdb_add() argument
846 .sw_index = dp->ds->index, in dsa_port_host_mdb_add()
847 .port = dp->index, in dsa_port_host_mdb_add()
850 struct dsa_port *cpu_dp = dp->cpu_dp; in dsa_port_host_mdb_add()
857 return dsa_port_notify(dp, DSA_NOTIFIER_HOST_MDB_ADD, &info); in dsa_port_host_mdb_add()
860 int dsa_port_host_mdb_del(const struct dsa_port *dp, in dsa_port_host_mdb_del() argument
864 .sw_index = dp->ds->index, in dsa_port_host_mdb_del()
865 .port = dp->index, in dsa_port_host_mdb_del()
868 struct dsa_port *cpu_dp = dp->cpu_dp; in dsa_port_host_mdb_del()
875 return dsa_port_notify(dp, DSA_NOTIFIER_HOST_MDB_DEL, &info); in dsa_port_host_mdb_del()
878 int dsa_port_vlan_add(struct dsa_port *dp, in dsa_port_vlan_add() argument
883 .sw_index = dp->ds->index, in dsa_port_vlan_add()
884 .port = dp->index, in dsa_port_vlan_add()
889 return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info); in dsa_port_vlan_add()
892 int dsa_port_vlan_del(struct dsa_port *dp, in dsa_port_vlan_del() argument
896 .sw_index = dp->ds->index, in dsa_port_vlan_del()
897 .port = dp->index, in dsa_port_vlan_del()
901 return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info); in dsa_port_vlan_del()
904 int dsa_port_mrp_add(const struct dsa_port *dp, in dsa_port_mrp_add() argument
908 .sw_index = dp->ds->index, in dsa_port_mrp_add()
909 .port = dp->index, in dsa_port_mrp_add()
913 return dsa_port_notify(dp, DSA_NOTIFIER_MRP_ADD, &info); in dsa_port_mrp_add()
916 int dsa_port_mrp_del(const struct dsa_port *dp, in dsa_port_mrp_del() argument
920 .sw_index = dp->ds->index, in dsa_port_mrp_del()
921 .port = dp->index, in dsa_port_mrp_del()
925 return dsa_port_notify(dp, DSA_NOTIFIER_MRP_DEL, &info); in dsa_port_mrp_del()
928 int dsa_port_mrp_add_ring_role(const struct dsa_port *dp, in dsa_port_mrp_add_ring_role() argument
932 .sw_index = dp->ds->index, in dsa_port_mrp_add_ring_role()
933 .port = dp->index, in dsa_port_mrp_add_ring_role()
937 return dsa_port_notify(dp, DSA_NOTIFIER_MRP_ADD_RING_ROLE, &info); in dsa_port_mrp_add_ring_role()
940 int dsa_port_mrp_del_ring_role(const struct dsa_port *dp, in dsa_port_mrp_del_ring_role() argument
944 .sw_index = dp->ds->index, in dsa_port_mrp_del_ring_role()
945 .port = dp->index, in dsa_port_mrp_del_ring_role()
949 return dsa_port_notify(dp, DSA_NOTIFIER_MRP_DEL_RING_ROLE, &info); in dsa_port_mrp_del_ring_role()
959 static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp) in dsa_port_get_phy_device() argument
964 phy_dn = of_parse_phandle(dp->dn, "phy-handle", 0); in dsa_port_get_phy_device()
982 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_validate() local
983 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_validate()
988 ds->ops->phylink_validate(ds, dp->index, supported, state); in dsa_port_phylink_validate()
994 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_pcs_get_state() local
995 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_pcs_get_state()
1004 err = ds->ops->phylink_mac_link_state(ds, dp->index, state); in dsa_port_phylink_mac_pcs_get_state()
1007 dp->index, err); in dsa_port_phylink_mac_pcs_get_state()
1016 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_config() local
1017 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_config()
1022 ds->ops->phylink_mac_config(ds, dp->index, mode, state); in dsa_port_phylink_mac_config()
1027 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_an_restart() local
1028 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_an_restart()
1033 ds->ops->phylink_mac_an_restart(ds, dp->index); in dsa_port_phylink_mac_an_restart()
1040 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_link_down() local
1042 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_link_down()
1044 if (dsa_is_user_port(ds, dp->index)) in dsa_port_phylink_mac_link_down()
1045 phydev = dp->slave->phydev; in dsa_port_phylink_mac_link_down()
1049 ds->ops->adjust_link(ds, dp->index, phydev); in dsa_port_phylink_mac_link_down()
1053 ds->ops->phylink_mac_link_down(ds, dp->index, mode, interface); in dsa_port_phylink_mac_link_down()
1063 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_port_phylink_mac_link_up() local
1064 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_mac_link_up()
1068 ds->ops->adjust_link(ds, dp->index, phydev); in dsa_port_phylink_mac_link_up()
1072 ds->ops->phylink_mac_link_up(ds, dp->index, mode, interface, phydev, in dsa_port_phylink_mac_link_up()
1085 static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) in dsa_port_setup_phy_of() argument
1087 struct dsa_switch *ds = dp->ds; in dsa_port_setup_phy_of()
1089 int port = dp->index; in dsa_port_setup_phy_of()
1092 phydev = dsa_port_get_phy_device(dp); in dsa_port_setup_phy_of()
1123 static int dsa_port_fixed_link_register_of(struct dsa_port *dp) in dsa_port_fixed_link_register_of() argument
1125 struct device_node *dn = dp->dn; in dsa_port_fixed_link_register_of()
1126 struct dsa_switch *ds = dp->ds; in dsa_port_fixed_link_register_of()
1128 int port = dp->index; in dsa_port_fixed_link_register_of()
1157 static int dsa_port_phylink_register(struct dsa_port *dp) in dsa_port_phylink_register() argument
1159 struct dsa_switch *ds = dp->ds; in dsa_port_phylink_register()
1160 struct device_node *port_dn = dp->dn; in dsa_port_phylink_register()
1168 dp->pl_config.dev = ds->dev; in dsa_port_phylink_register()
1169 dp->pl_config.type = PHYLINK_DEV; in dsa_port_phylink_register()
1170 dp->pl_config.pcs_poll = ds->pcs_poll; in dsa_port_phylink_register()
1172 dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), in dsa_port_phylink_register()
1174 if (IS_ERR(dp->pl)) { in dsa_port_phylink_register()
1175 pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); in dsa_port_phylink_register()
1176 return PTR_ERR(dp->pl); in dsa_port_phylink_register()
1179 err = phylink_of_phy_connect(dp->pl, port_dn, 0); in dsa_port_phylink_register()
1188 phylink_destroy(dp->pl); in dsa_port_phylink_register()
1192 int dsa_port_link_register_of(struct dsa_port *dp) in dsa_port_link_register_of() argument
1194 struct dsa_switch *ds = dp->ds; in dsa_port_link_register_of()
1196 int port = dp->index; in dsa_port_link_register_of()
1199 phy_np = of_parse_phandle(dp->dn, "phy-handle", 0); in dsa_port_link_register_of()
1200 if (of_phy_is_fixed_link(dp->dn) || phy_np) { in dsa_port_link_register_of()
1204 return dsa_port_phylink_register(dp); in dsa_port_link_register_of()
1212 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_link_register_of()
1213 return dsa_port_fixed_link_register_of(dp); in dsa_port_link_register_of()
1215 return dsa_port_setup_phy_of(dp, true); in dsa_port_link_register_of()
1218 void dsa_port_link_unregister_of(struct dsa_port *dp) in dsa_port_link_unregister_of() argument
1220 struct dsa_switch *ds = dp->ds; in dsa_port_link_unregister_of()
1222 if (!ds->ops->adjust_link && dp->pl) { in dsa_port_link_unregister_of()
1224 phylink_disconnect_phy(dp->pl); in dsa_port_link_unregister_of()
1226 phylink_destroy(dp->pl); in dsa_port_link_unregister_of()
1227 dp->pl = NULL; in dsa_port_link_unregister_of()
1231 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_link_unregister_of()
1232 of_phy_deregister_fixed_link(dp->dn); in dsa_port_link_unregister_of()
1234 dsa_port_setup_phy_of(dp, false); in dsa_port_link_unregister_of()
1237 int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data) in dsa_port_get_phy_strings() argument
1242 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_phy_strings()
1245 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_phy_strings()
1256 int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data) in dsa_port_get_ethtool_phy_stats() argument
1261 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_ethtool_phy_stats()
1264 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_ethtool_phy_stats()
1275 int dsa_port_get_phy_sset_count(struct dsa_port *dp) in dsa_port_get_phy_sset_count() argument
1280 if (of_phy_is_fixed_link(dp->dn)) in dsa_port_get_phy_sset_count()
1283 phydev = dsa_port_get_phy_device(dp); in dsa_port_get_phy_sset_count()
1294 int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr) in dsa_port_hsr_join() argument
1297 .sw_index = dp->ds->index, in dsa_port_hsr_join()
1298 .port = dp->index, in dsa_port_hsr_join()
1303 dp->hsr_dev = hsr; in dsa_port_hsr_join()
1305 err = dsa_port_notify(dp, DSA_NOTIFIER_HSR_JOIN, &info); in dsa_port_hsr_join()
1307 dp->hsr_dev = NULL; in dsa_port_hsr_join()
1312 void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr) in dsa_port_hsr_leave() argument
1315 .sw_index = dp->ds->index, in dsa_port_hsr_leave()
1316 .port = dp->index, in dsa_port_hsr_leave()
1321 dp->hsr_dev = NULL; in dsa_port_hsr_leave()
1323 err = dsa_port_notify(dp, DSA_NOTIFIER_HSR_LEAVE, &info); in dsa_port_hsr_leave()
1325 dev_err(dp->ds->dev, in dsa_port_hsr_leave()
1327 dp->index, ERR_PTR(err)); in dsa_port_hsr_leave()
1330 int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast) in dsa_port_tag_8021q_vlan_add() argument
1333 .tree_index = dp->ds->dst->index, in dsa_port_tag_8021q_vlan_add()
1334 .sw_index = dp->ds->index, in dsa_port_tag_8021q_vlan_add()
1335 .port = dp->index, in dsa_port_tag_8021q_vlan_add()
1342 return dsa_port_notify(dp, DSA_NOTIFIER_TAG_8021Q_VLAN_ADD, &info); in dsa_port_tag_8021q_vlan_add()
1345 void dsa_port_tag_8021q_vlan_del(struct dsa_port *dp, u16 vid, bool broadcast) in dsa_port_tag_8021q_vlan_del() argument
1348 .tree_index = dp->ds->dst->index, in dsa_port_tag_8021q_vlan_del()
1349 .sw_index = dp->ds->index, in dsa_port_tag_8021q_vlan_del()
1350 .port = dp->index, in dsa_port_tag_8021q_vlan_del()
1358 err = dsa_port_notify(dp, DSA_NOTIFIER_TAG_8021Q_VLAN_DEL, &info); in dsa_port_tag_8021q_vlan_del()
1360 dev_err(dp->ds->dev, in dsa_port_tag_8021q_vlan_del()
1362 dp->index, vid, ERR_PTR(err)); in dsa_port_tag_8021q_vlan_del()