Lines Matching +full:dp +full:- +full:bridge
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
28 struct dsa_switch *ds = bus->priv; in dsa_slave_phy_read()
30 if (ds->phys_mii_mask & (1 << addr)) in dsa_slave_phy_read()
31 return ds->ops->phy_read(ds, addr, reg); in dsa_slave_phy_read()
38 struct dsa_switch *ds = bus->priv; in dsa_slave_phy_write()
40 if (ds->phys_mii_mask & (1 << addr)) in dsa_slave_phy_write()
41 return ds->ops->phy_write(ds, addr, reg, val); in dsa_slave_phy_write()
48 ds->slave_mii_bus->priv = (void *)ds; in dsa_slave_mii_bus_init()
49 ds->slave_mii_bus->name = "dsa slave smi"; in dsa_slave_mii_bus_init()
50 ds->slave_mii_bus->read = dsa_slave_phy_read; in dsa_slave_mii_bus_init()
51 ds->slave_mii_bus->write = dsa_slave_phy_write; in dsa_slave_mii_bus_init()
52 snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d", in dsa_slave_mii_bus_init()
53 ds->dst->index, ds->index); in dsa_slave_mii_bus_init()
54 ds->slave_mii_bus->parent = ds->dev; in dsa_slave_mii_bus_init()
55 ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask; in dsa_slave_mii_bus_init()
62 return dsa_slave_to_master(dev)->ifindex; in dsa_slave_get_iflink()
68 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_open() local
71 if (!(master->flags & IFF_UP)) in dsa_slave_open()
72 return -ENETDOWN; in dsa_slave_open()
74 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) { in dsa_slave_open()
75 err = dev_uc_add(master, dev->dev_addr); in dsa_slave_open()
80 if (dev->flags & IFF_ALLMULTI) { in dsa_slave_open()
85 if (dev->flags & IFF_PROMISC) { in dsa_slave_open()
91 err = dsa_port_enable_rt(dp, dev->phydev); in dsa_slave_open()
98 if (dev->flags & IFF_PROMISC) in dsa_slave_open()
99 dev_set_promiscuity(master, -1); in dsa_slave_open()
101 if (dev->flags & IFF_ALLMULTI) in dsa_slave_open()
102 dev_set_allmulti(master, -1); in dsa_slave_open()
104 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) in dsa_slave_open()
105 dev_uc_del(master, dev->dev_addr); in dsa_slave_open()
113 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_close() local
115 dsa_port_disable_rt(dp); in dsa_slave_close()
119 if (dev->flags & IFF_ALLMULTI) in dsa_slave_close()
120 dev_set_allmulti(master, -1); in dsa_slave_close()
121 if (dev->flags & IFF_PROMISC) in dsa_slave_close()
122 dev_set_promiscuity(master, -1); in dsa_slave_close()
124 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) in dsa_slave_close()
125 dev_uc_del(master, dev->dev_addr); in dsa_slave_close()
133 if (dev->flags & IFF_UP) { in dsa_slave_change_rx_flags()
136 dev->flags & IFF_ALLMULTI ? 1 : -1); in dsa_slave_change_rx_flags()
139 dev->flags & IFF_PROMISC ? 1 : -1); in dsa_slave_change_rx_flags()
157 if (!is_valid_ether_addr(addr->sa_data)) in dsa_slave_set_mac_address()
158 return -EADDRNOTAVAIL; in dsa_slave_set_mac_address()
160 if (!(dev->flags & IFF_UP)) in dsa_slave_set_mac_address()
163 if (!ether_addr_equal(addr->sa_data, master->dev_addr)) { in dsa_slave_set_mac_address()
164 err = dev_uc_add(master, addr->sa_data); in dsa_slave_set_mac_address()
169 if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) in dsa_slave_set_mac_address()
170 dev_uc_del(master, dev->dev_addr); in dsa_slave_set_mac_address()
173 ether_addr_copy(dev->dev_addr, addr->sa_data); in dsa_slave_set_mac_address()
190 u32 portid = NETLINK_CB(dump->cb->skb).portid; in dsa_slave_port_fdb_do_dump()
191 u32 seq = dump->cb->nlh->nlmsg_seq; in dsa_slave_port_fdb_do_dump()
195 if (dump->idx < dump->cb->args[2]) in dsa_slave_port_fdb_do_dump()
198 nlh = nlmsg_put(dump->skb, portid, seq, RTM_NEWNEIGH, in dsa_slave_port_fdb_do_dump()
201 return -EMSGSIZE; in dsa_slave_port_fdb_do_dump()
204 ndm->ndm_family = AF_BRIDGE; in dsa_slave_port_fdb_do_dump()
205 ndm->ndm_pad1 = 0; in dsa_slave_port_fdb_do_dump()
206 ndm->ndm_pad2 = 0; in dsa_slave_port_fdb_do_dump()
207 ndm->ndm_flags = NTF_SELF; in dsa_slave_port_fdb_do_dump()
208 ndm->ndm_type = 0; in dsa_slave_port_fdb_do_dump()
209 ndm->ndm_ifindex = dump->dev->ifindex; in dsa_slave_port_fdb_do_dump()
210 ndm->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE; in dsa_slave_port_fdb_do_dump()
212 if (nla_put(dump->skb, NDA_LLADDR, ETH_ALEN, addr)) in dsa_slave_port_fdb_do_dump()
215 if (vid && nla_put_u16(dump->skb, NDA_VLAN, vid)) in dsa_slave_port_fdb_do_dump()
218 nlmsg_end(dump->skb, nlh); in dsa_slave_port_fdb_do_dump()
221 dump->idx++; in dsa_slave_port_fdb_do_dump()
225 nlmsg_cancel(dump->skb, nlh); in dsa_slave_port_fdb_do_dump()
226 return -EMSGSIZE; in dsa_slave_port_fdb_do_dump()
234 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_fdb_dump() local
243 err = dsa_port_fdb_dump(dp, dsa_slave_port_fdb_do_dump, &dump); in dsa_slave_fdb_dump()
252 struct dsa_switch *ds = p->dp->ds; in dsa_slave_ioctl()
253 int port = p->dp->index; in dsa_slave_ioctl()
258 if (ds->ops->port_hwtstamp_get) in dsa_slave_ioctl()
259 return ds->ops->port_hwtstamp_get(ds, port, ifr); in dsa_slave_ioctl()
262 if (ds->ops->port_hwtstamp_set) in dsa_slave_ioctl()
263 return ds->ops->port_hwtstamp_set(ds, port, ifr); in dsa_slave_ioctl()
267 return phylink_mii_ioctl(p->dp->pl, ifr, cmd); in dsa_slave_ioctl()
274 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_port_attr_set() local
277 switch (attr->id) { in dsa_slave_port_attr_set()
279 ret = dsa_port_set_state(dp, attr->u.stp_state, trans); in dsa_slave_port_attr_set()
282 ret = dsa_port_vlan_filtering(dp, attr->u.vlan_filtering, in dsa_slave_port_attr_set()
286 ret = dsa_port_ageing_time(dp, attr->u.ageing_time, trans); in dsa_slave_port_attr_set()
289 ret = dsa_port_pre_bridge_flags(dp, attr->u.brport_flags, in dsa_slave_port_attr_set()
293 ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans); in dsa_slave_port_attr_set()
296 ret = dsa_port_mrouter(dp->cpu_dp, attr->u.mrouter, trans); in dsa_slave_port_attr_set()
299 ret = -EOPNOTSUPP; in dsa_slave_port_attr_set()
321 if (vid >= vlan->vid_begin && vid <= vlan->vid_end) in dsa_slave_vlan_check_for_8021q_uppers()
322 return -EBUSY; in dsa_slave_vlan_check_for_8021q_uppers()
333 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_vlan_add() local
337 if (obj->orig_dev != dev) in dsa_slave_vlan_add()
338 return -EOPNOTSUPP; in dsa_slave_vlan_add()
340 if (dsa_port_skip_vlan_configuration(dp)) in dsa_slave_vlan_add()
345 /* Deny adding a bridge VLAN when there is already an 802.1Q upper with in dsa_slave_vlan_add()
348 if (trans->ph_prepare && br_vlan_enabled(dp->bridge_dev)) { in dsa_slave_vlan_add()
356 err = dsa_port_vlan_add(dp, &vlan, trans); in dsa_slave_vlan_add()
366 err = dsa_port_vlan_add(dp->cpu_dp, &vlan, trans); in dsa_slave_vlan_add()
384 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_port_obj_add() local
389 * supported, return -EOPNOTSUPP. in dsa_slave_port_obj_add()
392 switch (obj->id) { in dsa_slave_port_obj_add()
394 if (obj->orig_dev != dev) in dsa_slave_port_obj_add()
395 return -EOPNOTSUPP; in dsa_slave_port_obj_add()
396 err = dsa_port_mdb_add(dp, SWITCHDEV_OBJ_PORT_MDB(obj), trans); in dsa_slave_port_obj_add()
402 err = dsa_port_mdb_add(dp->cpu_dp, SWITCHDEV_OBJ_PORT_MDB(obj), in dsa_slave_port_obj_add()
409 err = -EOPNOTSUPP; in dsa_slave_port_obj_add()
420 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_vlan_del() local
424 if (obj->orig_dev != dev) in dsa_slave_vlan_del()
425 return -EOPNOTSUPP; in dsa_slave_vlan_del()
427 if (dsa_port_skip_vlan_configuration(dp)) in dsa_slave_vlan_del()
435 err = dsa_port_vlan_del(dp, vlan); in dsa_slave_vlan_del()
439 for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) in dsa_slave_vlan_del()
448 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_port_obj_del() local
451 switch (obj->id) { in dsa_slave_port_obj_del()
453 if (obj->orig_dev != dev) in dsa_slave_port_obj_del()
454 return -EOPNOTSUPP; in dsa_slave_port_obj_del()
455 err = dsa_port_mdb_del(dp, SWITCHDEV_OBJ_PORT_MDB(obj)); in dsa_slave_port_obj_del()
461 err = dsa_port_mdb_del(dp->cpu_dp, SWITCHDEV_OBJ_PORT_MDB(obj)); in dsa_slave_port_obj_del()
467 err = -EOPNOTSUPP; in dsa_slave_port_obj_del()
477 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_port_parent_id() local
478 struct dsa_switch *ds = dp->ds; in dsa_slave_get_port_parent_id()
479 struct dsa_switch_tree *dst = ds->dst; in dsa_slave_get_port_parent_id()
481 /* For non-legacy ports, devlink is used and it takes in dsa_slave_get_port_parent_id()
485 if (dp->ds->devlink) in dsa_slave_get_port_parent_id()
486 return -EOPNOTSUPP; in dsa_slave_get_port_parent_id()
488 ppid->id_len = sizeof(dst->index); in dsa_slave_get_port_parent_id()
489 memcpy(&ppid->id, &dst->index, ppid->id_len); in dsa_slave_get_port_parent_id()
500 return netpoll_send_skb(p->netpoll, skb); in dsa_slave_netpoll_send_skb()
510 struct dsa_switch *ds = p->dp->ds; in dsa_skb_tx_timestamp()
518 if (!ds->ops->port_txtstamp) in dsa_skb_tx_timestamp()
525 DSA_SKB_CB(skb)->clone = clone; in dsa_skb_tx_timestamp()
527 if (ds->ops->port_txtstamp(ds, p->dp->index, clone, type)) in dsa_skb_tx_timestamp()
535 /* SKB for netpoll still need to be mangled with the protocol-specific in dsa_enqueue_skb()
544 skb->dev = dsa_slave_to_master(dev); in dsa_enqueue_skb()
553 int needed_headroom = dev->needed_headroom; in dsa_realloc_skb()
554 int needed_tailroom = dev->needed_tailroom; in dsa_realloc_skb()
561 if (unlikely(needed_tailroom && skb->len < ETH_ZLEN)) in dsa_realloc_skb()
562 needed_tailroom += ETH_ZLEN - skb->len; in dsa_realloc_skb()
564 needed_headroom = max_t(int, needed_headroom - skb_headroom(skb), 0); in dsa_realloc_skb()
565 needed_tailroom = max_t(int, needed_tailroom - skb_tailroom(skb), 0); in dsa_realloc_skb()
581 s = this_cpu_ptr(p->stats64); in dsa_slave_xmit()
582 u64_stats_update_begin(&s->syncp); in dsa_slave_xmit()
583 s->tx_packets++; in dsa_slave_xmit()
584 s->tx_bytes += skb->len; in dsa_slave_xmit()
585 u64_stats_update_end(&s->syncp); in dsa_slave_xmit()
587 DSA_SKB_CB(skb)->clone = NULL; in dsa_slave_xmit()
602 if (dev->needed_tailroom) in dsa_slave_xmit()
608 nskb = p->xmit(skb, dev); in dsa_slave_xmit()
622 strlcpy(drvinfo->driver, "dsa", sizeof(drvinfo->driver)); in dsa_slave_get_drvinfo()
623 strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version)); in dsa_slave_get_drvinfo()
624 strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info)); in dsa_slave_get_drvinfo()
629 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_regs_len() local
630 struct dsa_switch *ds = dp->ds; in dsa_slave_get_regs_len()
632 if (ds->ops->get_regs_len) in dsa_slave_get_regs_len()
633 return ds->ops->get_regs_len(ds, dp->index); in dsa_slave_get_regs_len()
635 return -EOPNOTSUPP; in dsa_slave_get_regs_len()
641 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_regs() local
642 struct dsa_switch *ds = dp->ds; in dsa_slave_get_regs()
644 if (ds->ops->get_regs) in dsa_slave_get_regs()
645 ds->ops->get_regs(ds, dp->index, regs, _p); in dsa_slave_get_regs()
650 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_nway_reset() local
652 return phylink_ethtool_nway_reset(dp->pl); in dsa_slave_nway_reset()
657 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_eeprom_len() local
658 struct dsa_switch *ds = dp->ds; in dsa_slave_get_eeprom_len()
660 if (ds->cd && ds->cd->eeprom_len) in dsa_slave_get_eeprom_len()
661 return ds->cd->eeprom_len; in dsa_slave_get_eeprom_len()
663 if (ds->ops->get_eeprom_len) in dsa_slave_get_eeprom_len()
664 return ds->ops->get_eeprom_len(ds); in dsa_slave_get_eeprom_len()
672 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_eeprom() local
673 struct dsa_switch *ds = dp->ds; in dsa_slave_get_eeprom()
675 if (ds->ops->get_eeprom) in dsa_slave_get_eeprom()
676 return ds->ops->get_eeprom(ds, eeprom, data); in dsa_slave_get_eeprom()
678 return -EOPNOTSUPP; in dsa_slave_get_eeprom()
684 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_set_eeprom() local
685 struct dsa_switch *ds = dp->ds; in dsa_slave_set_eeprom()
687 if (ds->ops->set_eeprom) in dsa_slave_set_eeprom()
688 return ds->ops->set_eeprom(ds, eeprom, data); in dsa_slave_set_eeprom()
690 return -EOPNOTSUPP; in dsa_slave_set_eeprom()
696 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_strings() local
697 struct dsa_switch *ds = dp->ds; in dsa_slave_get_strings()
706 if (ds->ops->get_strings) in dsa_slave_get_strings()
707 ds->ops->get_strings(ds, dp->index, stringset, in dsa_slave_get_strings()
716 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_ethtool_stats() local
718 struct dsa_switch *ds = dp->ds; in dsa_slave_get_ethtool_stats()
726 s = per_cpu_ptr(p->stats64, i); in dsa_slave_get_ethtool_stats()
728 start = u64_stats_fetch_begin_irq(&s->syncp); in dsa_slave_get_ethtool_stats()
729 tx_packets = s->tx_packets; in dsa_slave_get_ethtool_stats()
730 tx_bytes = s->tx_bytes; in dsa_slave_get_ethtool_stats()
731 rx_packets = s->rx_packets; in dsa_slave_get_ethtool_stats()
732 rx_bytes = s->rx_bytes; in dsa_slave_get_ethtool_stats()
733 } while (u64_stats_fetch_retry_irq(&s->syncp, start)); in dsa_slave_get_ethtool_stats()
739 if (ds->ops->get_ethtool_stats) in dsa_slave_get_ethtool_stats()
740 ds->ops->get_ethtool_stats(ds, dp->index, data + 4); in dsa_slave_get_ethtool_stats()
745 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_sset_count() local
746 struct dsa_switch *ds = dp->ds; in dsa_slave_get_sset_count()
751 if (ds->ops->get_sset_count) { in dsa_slave_get_sset_count()
752 count = ds->ops->get_sset_count(ds, dp->index, sset); in dsa_slave_get_sset_count()
760 return -EOPNOTSUPP; in dsa_slave_get_sset_count()
765 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_wol() local
766 struct dsa_switch *ds = dp->ds; in dsa_slave_get_wol()
768 phylink_ethtool_get_wol(dp->pl, w); in dsa_slave_get_wol()
770 if (ds->ops->get_wol) in dsa_slave_get_wol()
771 ds->ops->get_wol(ds, dp->index, w); in dsa_slave_get_wol()
776 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_set_wol() local
777 struct dsa_switch *ds = dp->ds; in dsa_slave_set_wol()
778 int ret = -EOPNOTSUPP; in dsa_slave_set_wol()
780 phylink_ethtool_set_wol(dp->pl, w); in dsa_slave_set_wol()
782 if (ds->ops->set_wol) in dsa_slave_set_wol()
783 ret = ds->ops->set_wol(ds, dp->index, w); in dsa_slave_set_wol()
790 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_set_eee() local
791 struct dsa_switch *ds = dp->ds; in dsa_slave_set_eee()
795 if (!dev->phydev || !dp->pl) in dsa_slave_set_eee()
796 return -ENODEV; in dsa_slave_set_eee()
798 if (!ds->ops->set_mac_eee) in dsa_slave_set_eee()
799 return -EOPNOTSUPP; in dsa_slave_set_eee()
801 ret = ds->ops->set_mac_eee(ds, dp->index, e); in dsa_slave_set_eee()
805 return phylink_ethtool_set_eee(dp->pl, e); in dsa_slave_set_eee()
810 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_eee() local
811 struct dsa_switch *ds = dp->ds; in dsa_slave_get_eee()
815 if (!dev->phydev || !dp->pl) in dsa_slave_get_eee()
816 return -ENODEV; in dsa_slave_get_eee()
818 if (!ds->ops->get_mac_eee) in dsa_slave_get_eee()
819 return -EOPNOTSUPP; in dsa_slave_get_eee()
821 ret = ds->ops->get_mac_eee(ds, dp->index, e); in dsa_slave_get_eee()
825 return phylink_ethtool_get_eee(dp->pl, e); in dsa_slave_get_eee()
831 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_link_ksettings() local
833 return phylink_ethtool_ksettings_get(dp->pl, cmd); in dsa_slave_get_link_ksettings()
839 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_set_link_ksettings() local
841 return phylink_ethtool_ksettings_set(dp->pl, cmd); in dsa_slave_set_link_ksettings()
847 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_pauseparam() local
849 phylink_ethtool_get_pauseparam(dp->pl, pause); in dsa_slave_get_pauseparam()
855 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_set_pauseparam() local
857 return phylink_ethtool_set_pauseparam(dp->pl, pause); in dsa_slave_set_pauseparam()
871 return -ENOMEM; in dsa_slave_netpoll_setup()
879 p->netpoll = netpoll; in dsa_slave_netpoll_setup()
887 struct netpoll *netpoll = p->netpoll; in dsa_slave_netpoll_cleanup()
892 p->netpoll = NULL; in dsa_slave_netpoll_cleanup()
905 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_phys_port_name() local
907 /* For non-legacy ports, devlink is used and it takes in dsa_slave_get_phys_port_name()
911 if (dp->ds->devlink) in dsa_slave_get_phys_port_name()
912 return -EOPNOTSUPP; in dsa_slave_get_phys_port_name()
914 if (snprintf(name, len, "p%d", dp->index) >= len) in dsa_slave_get_phys_port_name()
915 return -EINVAL; in dsa_slave_get_phys_port_name()
926 list_for_each_entry(mall_tc_entry, &p->mall_tc_list, list) in dsa_slave_mall_tc_entry_find()
927 if (mall_tc_entry->cookie == cookie) in dsa_slave_mall_tc_entry_find()
938 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_add_cls_matchall_mirred() local
942 struct dsa_switch *ds = dp->ds; in dsa_slave_add_cls_matchall_mirred()
947 if (!ds->ops->port_mirror_add) in dsa_slave_add_cls_matchall_mirred()
948 return -EOPNOTSUPP; in dsa_slave_add_cls_matchall_mirred()
950 if (!flow_action_basic_hw_stats_check(&cls->rule->action, in dsa_slave_add_cls_matchall_mirred()
951 cls->common.extack)) in dsa_slave_add_cls_matchall_mirred()
952 return -EOPNOTSUPP; in dsa_slave_add_cls_matchall_mirred()
954 act = &cls->rule->action.entries[0]; in dsa_slave_add_cls_matchall_mirred()
956 if (!act->dev) in dsa_slave_add_cls_matchall_mirred()
957 return -EINVAL; in dsa_slave_add_cls_matchall_mirred()
959 if (!dsa_slave_dev_check(act->dev)) in dsa_slave_add_cls_matchall_mirred()
960 return -EOPNOTSUPP; in dsa_slave_add_cls_matchall_mirred()
964 return -ENOMEM; in dsa_slave_add_cls_matchall_mirred()
966 mall_tc_entry->cookie = cls->cookie; in dsa_slave_add_cls_matchall_mirred()
967 mall_tc_entry->type = DSA_PORT_MALL_MIRROR; in dsa_slave_add_cls_matchall_mirred()
968 mirror = &mall_tc_entry->mirror; in dsa_slave_add_cls_matchall_mirred()
970 to_dp = dsa_slave_to_port(act->dev); in dsa_slave_add_cls_matchall_mirred()
972 mirror->to_local_port = to_dp->index; in dsa_slave_add_cls_matchall_mirred()
973 mirror->ingress = ingress; in dsa_slave_add_cls_matchall_mirred()
975 err = ds->ops->port_mirror_add(ds, dp->index, mirror, ingress); in dsa_slave_add_cls_matchall_mirred()
981 list_add_tail(&mall_tc_entry->list, &p->mall_tc_list); in dsa_slave_add_cls_matchall_mirred()
991 struct netlink_ext_ack *extack = cls->common.extack; in dsa_slave_add_cls_matchall_police()
992 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_add_cls_matchall_police() local
996 struct dsa_switch *ds = dp->ds; in dsa_slave_add_cls_matchall_police()
1000 if (!ds->ops->port_policer_add) { in dsa_slave_add_cls_matchall_police()
1003 return -EOPNOTSUPP; in dsa_slave_add_cls_matchall_police()
1009 return -EOPNOTSUPP; in dsa_slave_add_cls_matchall_police()
1012 if (!flow_action_basic_hw_stats_check(&cls->rule->action, in dsa_slave_add_cls_matchall_police()
1013 cls->common.extack)) in dsa_slave_add_cls_matchall_police()
1014 return -EOPNOTSUPP; in dsa_slave_add_cls_matchall_police()
1016 list_for_each_entry(mall_tc_entry, &p->mall_tc_list, list) { in dsa_slave_add_cls_matchall_police()
1017 if (mall_tc_entry->type == DSA_PORT_MALL_POLICER) { in dsa_slave_add_cls_matchall_police()
1020 return -EEXIST; in dsa_slave_add_cls_matchall_police()
1024 act = &cls->rule->action.entries[0]; in dsa_slave_add_cls_matchall_police()
1028 return -ENOMEM; in dsa_slave_add_cls_matchall_police()
1030 mall_tc_entry->cookie = cls->cookie; in dsa_slave_add_cls_matchall_police()
1031 mall_tc_entry->type = DSA_PORT_MALL_POLICER; in dsa_slave_add_cls_matchall_police()
1032 policer = &mall_tc_entry->policer; in dsa_slave_add_cls_matchall_police()
1033 policer->rate_bytes_per_sec = act->police.rate_bytes_ps; in dsa_slave_add_cls_matchall_police()
1034 policer->burst = act->police.burst; in dsa_slave_add_cls_matchall_police()
1036 err = ds->ops->port_policer_add(ds, dp->index, policer); in dsa_slave_add_cls_matchall_police()
1042 list_add_tail(&mall_tc_entry->list, &p->mall_tc_list); in dsa_slave_add_cls_matchall_police()
1051 int err = -EOPNOTSUPP; in dsa_slave_add_cls_matchall()
1053 if (cls->common.protocol == htons(ETH_P_ALL) && in dsa_slave_add_cls_matchall()
1054 flow_offload_has_one_action(&cls->rule->action) && in dsa_slave_add_cls_matchall()
1055 cls->rule->action.entries[0].id == FLOW_ACTION_MIRRED) in dsa_slave_add_cls_matchall()
1057 else if (flow_offload_has_one_action(&cls->rule->action) && in dsa_slave_add_cls_matchall()
1058 cls->rule->action.entries[0].id == FLOW_ACTION_POLICE) in dsa_slave_add_cls_matchall()
1067 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_del_cls_matchall() local
1069 struct dsa_switch *ds = dp->ds; in dsa_slave_del_cls_matchall()
1071 mall_tc_entry = dsa_slave_mall_tc_entry_find(dev, cls->cookie); in dsa_slave_del_cls_matchall()
1075 list_del(&mall_tc_entry->list); in dsa_slave_del_cls_matchall()
1077 switch (mall_tc_entry->type) { in dsa_slave_del_cls_matchall()
1079 if (ds->ops->port_mirror_del) in dsa_slave_del_cls_matchall()
1080 ds->ops->port_mirror_del(ds, dp->index, in dsa_slave_del_cls_matchall()
1081 &mall_tc_entry->mirror); in dsa_slave_del_cls_matchall()
1084 if (ds->ops->port_policer_del) in dsa_slave_del_cls_matchall()
1085 ds->ops->port_policer_del(ds, dp->index); in dsa_slave_del_cls_matchall()
1098 if (cls->common.chain_index) in dsa_slave_setup_tc_cls_matchall()
1099 return -EOPNOTSUPP; in dsa_slave_setup_tc_cls_matchall()
1101 switch (cls->command) { in dsa_slave_setup_tc_cls_matchall()
1108 return -EOPNOTSUPP; in dsa_slave_setup_tc_cls_matchall()
1116 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_add_cls_flower() local
1117 struct dsa_switch *ds = dp->ds; in dsa_slave_add_cls_flower()
1118 int port = dp->index; in dsa_slave_add_cls_flower()
1120 if (!ds->ops->cls_flower_add) in dsa_slave_add_cls_flower()
1121 return -EOPNOTSUPP; in dsa_slave_add_cls_flower()
1123 return ds->ops->cls_flower_add(ds, port, cls, ingress); in dsa_slave_add_cls_flower()
1130 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_del_cls_flower() local
1131 struct dsa_switch *ds = dp->ds; in dsa_slave_del_cls_flower()
1132 int port = dp->index; in dsa_slave_del_cls_flower()
1134 if (!ds->ops->cls_flower_del) in dsa_slave_del_cls_flower()
1135 return -EOPNOTSUPP; in dsa_slave_del_cls_flower()
1137 return ds->ops->cls_flower_del(ds, port, cls, ingress); in dsa_slave_del_cls_flower()
1144 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_stats_cls_flower() local
1145 struct dsa_switch *ds = dp->ds; in dsa_slave_stats_cls_flower()
1146 int port = dp->index; in dsa_slave_stats_cls_flower()
1148 if (!ds->ops->cls_flower_stats) in dsa_slave_stats_cls_flower()
1149 return -EOPNOTSUPP; in dsa_slave_stats_cls_flower()
1151 return ds->ops->cls_flower_stats(ds, port, cls, ingress); in dsa_slave_stats_cls_flower()
1158 switch (cls->command) { in dsa_slave_setup_tc_cls_flower()
1166 return -EOPNOTSUPP; in dsa_slave_setup_tc_cls_flower()
1176 return -EOPNOTSUPP; in dsa_slave_setup_tc_block_cb()
1184 return -EOPNOTSUPP; in dsa_slave_setup_tc_block_cb()
1208 if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in dsa_slave_setup_tc_block()
1210 else if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS) in dsa_slave_setup_tc_block()
1213 return -EOPNOTSUPP; in dsa_slave_setup_tc_block()
1215 f->driver_block_list = &dsa_slave_block_cb_list; in dsa_slave_setup_tc_block()
1217 switch (f->command) { in dsa_slave_setup_tc_block()
1220 return -EBUSY; in dsa_slave_setup_tc_block()
1227 list_add_tail(&block_cb->driver_list, &dsa_slave_block_cb_list); in dsa_slave_setup_tc_block()
1230 block_cb = flow_block_cb_lookup(f->block, cb, dev); in dsa_slave_setup_tc_block()
1232 return -ENOENT; in dsa_slave_setup_tc_block()
1235 list_del(&block_cb->driver_list); in dsa_slave_setup_tc_block()
1238 return -EOPNOTSUPP; in dsa_slave_setup_tc_block()
1245 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_setup_tc() local
1246 struct dsa_switch *ds = dp->ds; in dsa_slave_setup_tc()
1251 if (!ds->ops->port_setup_tc) in dsa_slave_setup_tc()
1252 return -EOPNOTSUPP; in dsa_slave_setup_tc()
1254 return ds->ops->port_setup_tc(ds, dp->index, type, type_data); in dsa_slave_setup_tc()
1262 netdev_stats_to_stats64(stats, &dev->stats); in dsa_slave_get_stats64()
1263 dev_fetch_sw_netstats(stats, p->stats64); in dsa_slave_get_stats64()
1269 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_rxnfc() local
1270 struct dsa_switch *ds = dp->ds; in dsa_slave_get_rxnfc()
1272 if (!ds->ops->get_rxnfc) in dsa_slave_get_rxnfc()
1273 return -EOPNOTSUPP; in dsa_slave_get_rxnfc()
1275 return ds->ops->get_rxnfc(ds, dp->index, nfc, rule_locs); in dsa_slave_get_rxnfc()
1281 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_set_rxnfc() local
1282 struct dsa_switch *ds = dp->ds; in dsa_slave_set_rxnfc()
1284 if (!ds->ops->set_rxnfc) in dsa_slave_set_rxnfc()
1285 return -EOPNOTSUPP; in dsa_slave_set_rxnfc()
1287 return ds->ops->set_rxnfc(ds, dp->index, nfc); in dsa_slave_set_rxnfc()
1294 struct dsa_switch *ds = p->dp->ds; in dsa_slave_get_ts_info()
1296 if (!ds->ops->get_ts_info) in dsa_slave_get_ts_info()
1297 return -EOPNOTSUPP; in dsa_slave_get_ts_info()
1299 return ds->ops->get_ts_info(ds, p->dp->index, ts); in dsa_slave_get_ts_info()
1306 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_vlan_rx_add_vid() local
1311 /* This API only allows programming tagged, non-PVID VIDs */ in dsa_slave_vlan_rx_add_vid()
1319 ret = dsa_port_vlan_add(dp, &vlan, &trans); in dsa_slave_vlan_rx_add_vid()
1324 ret = dsa_port_vlan_add(dp, &vlan, &trans); in dsa_slave_vlan_rx_add_vid()
1330 ret = dsa_port_vlan_add(dp->cpu_dp, &vlan, &trans); in dsa_slave_vlan_rx_add_vid()
1335 ret = dsa_port_vlan_add(dp->cpu_dp, &vlan, &trans); in dsa_slave_vlan_rx_add_vid()
1346 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_vlan_rx_kill_vid() local
1350 /* This API only allows programming tagged, non-PVID VIDs */ in dsa_slave_vlan_rx_kill_vid()
1358 err = dsa_port_vlan_del(dp, &vlan); in dsa_slave_vlan_rx_kill_vid()
1379 if (p->dev->mtu == mtu) in dsa_hw_port_list_set_mtu()
1382 err = dev_set_mtu(p->dev, mtu); in dsa_hw_port_list_set_mtu()
1391 if (p->dev->mtu == p->old_mtu) in dsa_hw_port_list_set_mtu()
1394 if (dev_set_mtu(p->dev, p->old_mtu)) in dsa_hw_port_list_set_mtu()
1395 netdev_err(p->dev, "Failed to restore MTU\n"); in dsa_hw_port_list_set_mtu()
1410 static void dsa_bridge_mtu_normalization(struct dsa_port *dp) in dsa_bridge_mtu_normalization() argument
1418 if (!dp->ds->mtu_enforcement_ingress) in dsa_bridge_mtu_normalization()
1421 if (!dp->bridge_dev) in dsa_bridge_mtu_normalization()
1426 /* Populate the list of ports that are part of the same bridge in dsa_bridge_mtu_normalization()
1430 list_for_each_entry(other_dp, &dst->ports, list) { in dsa_bridge_mtu_normalization()
1434 if (other_dp->type != DSA_PORT_TYPE_USER) in dsa_bridge_mtu_normalization()
1437 if (other_dp->bridge_dev != dp->bridge_dev) in dsa_bridge_mtu_normalization()
1440 if (!other_dp->ds->mtu_enforcement_ingress) in dsa_bridge_mtu_normalization()
1443 slave = other_dp->slave; in dsa_bridge_mtu_normalization()
1445 if (min_mtu > slave->mtu) in dsa_bridge_mtu_normalization()
1446 min_mtu = slave->mtu; in dsa_bridge_mtu_normalization()
1452 hw_port->dev = slave; in dsa_bridge_mtu_normalization()
1453 hw_port->old_mtu = slave->mtu; in dsa_bridge_mtu_normalization()
1455 list_add(&hw_port->list, &hw_port_list); in dsa_bridge_mtu_normalization()
1459 /* Attempt to configure the entire hardware bridge to the newly added in dsa_bridge_mtu_normalization()
1463 err = dsa_hw_port_list_set_mtu(&hw_port_list, dp->slave->mtu); in dsa_bridge_mtu_normalization()
1468 * all hardware bridge ports now. If this fails too, then all ports will in dsa_bridge_mtu_normalization()
1480 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_change_mtu() local
1482 struct dsa_switch *ds = p->dp->ds; in dsa_slave_change_mtu()
1484 int port = p->dp->index; in dsa_slave_change_mtu()
1492 if (!ds->ops->port_change_mtu) in dsa_slave_change_mtu()
1493 return -EOPNOTSUPP; in dsa_slave_change_mtu()
1495 for (i = 0; i < ds->num_ports; i++) { in dsa_slave_change_mtu()
1505 if (!dsa_to_port(ds, i)->slave) in dsa_slave_change_mtu()
1514 slave_mtu = dsa_to_port(ds, i)->slave->mtu; in dsa_slave_change_mtu()
1520 cpu_dp = dsa_to_port(ds, port)->cpu_dp; in dsa_slave_change_mtu()
1522 mtu_limit = min_t(int, master->max_mtu, dev->max_mtu); in dsa_slave_change_mtu()
1523 old_master_mtu = master->mtu; in dsa_slave_change_mtu()
1524 new_master_mtu = largest_mtu + cpu_dp->tag_ops->overhead; in dsa_slave_change_mtu()
1526 return -ERANGE; in dsa_slave_change_mtu()
1547 err = dsa_port_mtu_change(dp, new_mtu, false); in dsa_slave_change_mtu()
1551 dev->mtu = new_mtu; in dsa_slave_change_mtu()
1553 dsa_bridge_mtu_normalization(dp); in dsa_slave_change_mtu()
1559 dsa_port_mtu_change(cpu_dp, old_master_mtu - in dsa_slave_change_mtu()
1560 cpu_dp->tag_ops->overhead, in dsa_slave_change_mtu()
1594 /* legacy way, bypassing the bridge *****************************************/
1601 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_legacy_fdb_add() local
1603 return dsa_port_fdb_add(dp, addr, vid); in dsa_legacy_fdb_add()
1610 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_legacy_fdb_del() local
1612 return dsa_port_fdb_del(dp, addr, vid); in dsa_legacy_fdb_del()
1617 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_get_devlink_port() local
1619 return dp->ds->devlink ? &dp->devlink_port : NULL; in dsa_slave_get_devlink_port()
1655 const struct dsa_port *dp = dsa_to_port(ds, port); in dsa_port_phylink_mac_change() local
1657 if (dp->pl) in dsa_port_phylink_mac_change()
1658 phylink_mac_change(dp->pl, up); in dsa_port_phylink_mac_change()
1665 struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); in dsa_slave_phylink_fixed_state() local
1666 struct dsa_switch *ds = dp->ds; in dsa_slave_phylink_fixed_state()
1671 ds->ops->phylink_fixed_state(ds, dp->index, state); in dsa_slave_phylink_fixed_state()
1677 struct dsa_port *dp = dsa_slave_to_port(slave_dev); in dsa_slave_phy_connect() local
1678 struct dsa_switch *ds = dp->ds; in dsa_slave_phy_connect()
1680 slave_dev->phydev = mdiobus_get_phy(ds->slave_mii_bus, addr); in dsa_slave_phy_connect()
1681 if (!slave_dev->phydev) { in dsa_slave_phy_connect()
1683 return -ENODEV; in dsa_slave_phy_connect()
1686 return phylink_connect_phy(dp->pl, slave_dev->phydev); in dsa_slave_phy_connect()
1691 struct dsa_port *dp = dsa_slave_to_port(slave_dev); in dsa_slave_phy_setup() local
1692 struct device_node *port_dn = dp->dn; in dsa_slave_phy_setup()
1693 struct dsa_switch *ds = dp->ds; in dsa_slave_phy_setup()
1702 dp->pl_config.dev = &slave_dev->dev; in dsa_slave_phy_setup()
1703 dp->pl_config.type = PHYLINK_NETDEV; in dsa_slave_phy_setup()
1709 if (ds->ops->phylink_fixed_state) { in dsa_slave_phy_setup()
1710 dp->pl_config.get_fixed_state = dsa_slave_phylink_fixed_state; in dsa_slave_phy_setup()
1711 dp->pl_config.poll_fixed_state = true; in dsa_slave_phy_setup()
1714 dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), mode, in dsa_slave_phy_setup()
1716 if (IS_ERR(dp->pl)) { in dsa_slave_phy_setup()
1718 "error creating PHYLINK: %ld\n", PTR_ERR(dp->pl)); in dsa_slave_phy_setup()
1719 return PTR_ERR(dp->pl); in dsa_slave_phy_setup()
1722 if (ds->ops->get_phy_flags) in dsa_slave_phy_setup()
1723 phy_flags = ds->ops->get_phy_flags(ds, dp->index); in dsa_slave_phy_setup()
1725 ret = phylink_of_phy_connect(dp->pl, port_dn, phy_flags); in dsa_slave_phy_setup()
1726 if (ret == -ENODEV && ds->slave_mii_bus) { in dsa_slave_phy_setup()
1730 ret = dsa_slave_phy_connect(slave_dev, dp->index); in dsa_slave_phy_setup()
1735 phylink_destroy(dp->pl); in dsa_slave_phy_setup()
1746 lockdep_set_class(&txq->_xmit_lock, in dsa_slave_set_lockdep_class_one()
1752 struct dsa_port *dp = dsa_slave_to_port(slave_dev); in dsa_slave_suspend() local
1760 phylink_stop(dp->pl); in dsa_slave_suspend()
1768 struct dsa_port *dp = dsa_slave_to_port(slave_dev); in dsa_slave_resume() local
1776 phylink_start(dp->pl); in dsa_slave_resume()
1785 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_notify() local
1787 .switch_number = dp->ds->index, in dsa_slave_notify()
1788 .port_number = dp->index, in dsa_slave_notify()
1798 const struct dsa_port *cpu_dp = port->cpu_dp; in dsa_slave_create()
1799 struct net_device *master = cpu_dp->master; in dsa_slave_create()
1800 struct dsa_switch *ds = port->ds; in dsa_slave_create()
1801 const char *name = port->name; in dsa_slave_create()
1806 if (!ds->num_tx_queues) in dsa_slave_create()
1807 ds->num_tx_queues = 1; in dsa_slave_create()
1811 ds->num_tx_queues, 1); in dsa_slave_create()
1813 return -ENOMEM; in dsa_slave_create()
1815 slave_dev->features = master->vlan_features | NETIF_F_HW_TC; in dsa_slave_create()
1816 if (ds->ops->port_vlan_add && ds->ops->port_vlan_del) in dsa_slave_create()
1817 slave_dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; in dsa_slave_create()
1818 slave_dev->hw_features |= NETIF_F_HW_TC; in dsa_slave_create()
1819 slave_dev->features |= NETIF_F_LLTX; in dsa_slave_create()
1820 slave_dev->ethtool_ops = &dsa_slave_ethtool_ops; in dsa_slave_create()
1821 if (!IS_ERR_OR_NULL(port->mac)) in dsa_slave_create()
1822 ether_addr_copy(slave_dev->dev_addr, port->mac); in dsa_slave_create()
1825 slave_dev->priv_flags |= IFF_NO_QUEUE; in dsa_slave_create()
1826 slave_dev->netdev_ops = &dsa_slave_netdev_ops; in dsa_slave_create()
1827 if (ds->ops->port_max_mtu) in dsa_slave_create()
1828 slave_dev->max_mtu = ds->ops->port_max_mtu(ds, port->index); in dsa_slave_create()
1829 if (cpu_dp->tag_ops->tail_tag) in dsa_slave_create()
1830 slave_dev->needed_tailroom = cpu_dp->tag_ops->overhead; in dsa_slave_create()
1832 slave_dev->needed_headroom = cpu_dp->tag_ops->overhead; in dsa_slave_create()
1837 slave_dev->needed_headroom += master->needed_headroom; in dsa_slave_create()
1838 slave_dev->needed_tailroom += master->needed_tailroom; in dsa_slave_create()
1844 SET_NETDEV_DEV(slave_dev, port->ds->dev); in dsa_slave_create()
1845 slave_dev->dev.of_node = port->dn; in dsa_slave_create()
1846 slave_dev->vlan_features = master->vlan_features; in dsa_slave_create()
1849 p->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); in dsa_slave_create()
1850 if (!p->stats64) { in dsa_slave_create()
1852 return -ENOMEM; in dsa_slave_create()
1855 ret = gro_cells_init(&p->gcells, slave_dev); in dsa_slave_create()
1859 p->dp = port; in dsa_slave_create()
1860 INIT_LIST_HEAD(&p->mall_tc_list); in dsa_slave_create()
1861 p->xmit = cpu_dp->tag_ops->xmit; in dsa_slave_create()
1862 port->slave = slave_dev; in dsa_slave_create()
1867 if (ret && ret != -EOPNOTSUPP) in dsa_slave_create()
1868 dev_warn(ds->dev, "nonfatal error %d setting MTU on port %d\n", in dsa_slave_create()
1869 ret, port->index); in dsa_slave_create()
1877 ret, ds->dst->index, ds->index, port->index); in dsa_slave_create()
1888 ret, slave_dev->name); in dsa_slave_create()
1906 phylink_disconnect_phy(p->dp->pl); in dsa_slave_create()
1908 phylink_destroy(p->dp->pl); in dsa_slave_create()
1910 gro_cells_destroy(&p->gcells); in dsa_slave_create()
1912 free_percpu(p->stats64); in dsa_slave_create()
1914 port->slave = NULL; in dsa_slave_create()
1921 struct dsa_port *dp = dsa_slave_to_port(slave_dev); in dsa_slave_destroy() local
1928 phylink_disconnect_phy(dp->pl); in dsa_slave_destroy()
1932 phylink_destroy(dp->pl); in dsa_slave_destroy()
1933 gro_cells_destroy(&p->gcells); in dsa_slave_destroy()
1934 free_percpu(p->stats64); in dsa_slave_destroy()
1940 return dev->netdev_ops == &dsa_slave_netdev_ops; in dsa_slave_dev_check()
1946 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_changeupper() local
1949 if (netif_is_bridge_master(info->upper_dev)) { in dsa_slave_changeupper()
1950 if (info->linking) { in dsa_slave_changeupper()
1951 err = dsa_port_bridge_join(dp, info->upper_dev); in dsa_slave_changeupper()
1953 dsa_bridge_mtu_normalization(dp); in dsa_slave_changeupper()
1956 dsa_port_bridge_leave(dp, info->upper_dev); in dsa_slave_changeupper()
1970 struct dsa_port *dp; in dsa_prevent_bridging_8021q_upper() local
1972 ext_ack = netdev_notifier_info_to_extack(&info->info); in dsa_prevent_bridging_8021q_upper()
1981 dp = dsa_slave_to_port(slave); in dsa_prevent_bridging_8021q_upper()
1982 if (!dp->bridge_dev) in dsa_prevent_bridging_8021q_upper()
1985 /* Deny enslaving a VLAN device into a VLAN-aware bridge */ in dsa_prevent_bridging_8021q_upper()
1986 if (br_vlan_enabled(dp->bridge_dev) && in dsa_prevent_bridging_8021q_upper()
1987 netif_is_bridge_master(info->upper_dev) && info->linking) { in dsa_prevent_bridging_8021q_upper()
1989 "Cannot enslave VLAN device into VLAN aware bridge"); in dsa_prevent_bridging_8021q_upper()
1990 return notifier_from_errno(-EINVAL); in dsa_prevent_bridging_8021q_upper()
2000 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_check_8021q_upper() local
2001 struct net_device *br = dp->bridge_dev; in dsa_slave_check_8021q_upper()
2010 extack = netdev_notifier_info_to_extack(&info->info); in dsa_slave_check_8021q_upper()
2011 vid = vlan_dev_vlan_id(info->upper_dev); in dsa_slave_check_8021q_upper()
2013 /* br_vlan_get_info() returns -EINVAL or -ENOENT if the in dsa_slave_check_8021q_upper()
2020 "This VLAN is already configured by the bridge"); in dsa_slave_check_8021q_upper()
2021 return notifier_from_errno(-EBUSY); in dsa_slave_check_8021q_upper()
2039 if (is_vlan_dev(info->upper_dev)) in dsa_slave_netdevice_event()
2064 struct net_device *dev = switchdev_work->dev; in dsa_slave_switchdev_event_work()
2066 struct dsa_port *dp = dsa_slave_to_port(dev); in dsa_slave_switchdev_event_work() local
2070 switch (switchdev_work->event) { in dsa_slave_switchdev_event_work()
2072 fdb_info = &switchdev_work->fdb_info; in dsa_slave_switchdev_event_work()
2073 if (!fdb_info->added_by_user) in dsa_slave_switchdev_event_work()
2076 err = dsa_port_fdb_add(dp, fdb_info->addr, fdb_info->vid); in dsa_slave_switchdev_event_work()
2081 fdb_info->offloaded = true; in dsa_slave_switchdev_event_work()
2083 &fdb_info->info, NULL); in dsa_slave_switchdev_event_work()
2087 fdb_info = &switchdev_work->fdb_info; in dsa_slave_switchdev_event_work()
2088 if (!fdb_info->added_by_user) in dsa_slave_switchdev_event_work()
2091 err = dsa_port_fdb_del(dp, fdb_info->addr, fdb_info->vid); in dsa_slave_switchdev_event_work()
2100 kfree(switchdev_work->fdb_info.addr); in dsa_slave_switchdev_event_work()
2111 memcpy(&switchdev_work->fdb_info, fdb_info, in dsa_slave_switchdev_fdb_work_init()
2112 sizeof(switchdev_work->fdb_info)); in dsa_slave_switchdev_fdb_work_init()
2113 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC); in dsa_slave_switchdev_fdb_work_init()
2114 if (!switchdev_work->fdb_info.addr) in dsa_slave_switchdev_fdb_work_init()
2115 return -ENOMEM; in dsa_slave_switchdev_fdb_work_init()
2116 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr, in dsa_slave_switchdev_fdb_work_init()
2117 fdb_info->addr); in dsa_slave_switchdev_fdb_work_init()
2143 INIT_WORK(&switchdev_work->work, in dsa_slave_switchdev_event()
2145 switchdev_work->dev = dev; in dsa_slave_switchdev_event()
2146 switchdev_work->event = event; in dsa_slave_switchdev_event()
2160 dsa_schedule_work(&switchdev_work->work); in dsa_slave_switchdev_event()