• Home
  • Raw
  • Download

Lines Matching +full:ocelot +full:- +full:hsio

1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
3 * Microsemi Ocelot Switch driver
7 #include <linux/dsa/ocelot.h>
14 #include "ocelot.h"
30 /* Caller must hold &ocelot->mact_lock */
31 static inline u32 ocelot_mact_read_macaccess(struct ocelot *ocelot) in ocelot_mact_read_macaccess() argument
33 return ocelot_read(ocelot, ANA_TABLES_MACACCESS); in ocelot_mact_read_macaccess()
36 /* Caller must hold &ocelot->mact_lock */
37 static inline int ocelot_mact_wait_for_completion(struct ocelot *ocelot) in ocelot_mact_wait_for_completion() argument
42 ocelot, val, in ocelot_mact_wait_for_completion()
48 /* Caller must hold &ocelot->mact_lock */
49 static void ocelot_mact_select(struct ocelot *ocelot, in ocelot_mact_select() argument
66 ocelot_write(ocelot, macl, ANA_TABLES_MACLDATA); in ocelot_mact_select()
67 ocelot_write(ocelot, mach, ANA_TABLES_MACHDATA); in ocelot_mact_select()
71 static int __ocelot_mact_learn(struct ocelot *ocelot, int port, in __ocelot_mact_learn() argument
90 if (mc_ports & BIT(ocelot->num_phys_ports)) in __ocelot_mact_learn()
93 ocelot_mact_select(ocelot, mac, vid); in __ocelot_mact_learn()
96 ocelot_write(ocelot, cmd, ANA_TABLES_MACACCESS); in __ocelot_mact_learn()
98 err = ocelot_mact_wait_for_completion(ocelot); in __ocelot_mact_learn()
103 int ocelot_mact_learn(struct ocelot *ocelot, int port, in ocelot_mact_learn() argument
109 mutex_lock(&ocelot->mact_lock); in ocelot_mact_learn()
110 ret = __ocelot_mact_learn(ocelot, port, mac, vid, type); in ocelot_mact_learn()
111 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_learn()
117 int ocelot_mact_forget(struct ocelot *ocelot, in ocelot_mact_forget() argument
122 mutex_lock(&ocelot->mact_lock); in ocelot_mact_forget()
124 ocelot_mact_select(ocelot, mac, vid); in ocelot_mact_forget()
127 ocelot_write(ocelot, in ocelot_mact_forget()
131 err = ocelot_mact_wait_for_completion(ocelot); in ocelot_mact_forget()
133 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_forget()
139 int ocelot_mact_lookup(struct ocelot *ocelot, int *dst_idx, in ocelot_mact_lookup() argument
145 mutex_lock(&ocelot->mact_lock); in ocelot_mact_lookup()
147 ocelot_mact_select(ocelot, mac, vid); in ocelot_mact_lookup()
150 ocelot_write(ocelot, ANA_TABLES_MACACCESS_VALID | in ocelot_mact_lookup()
154 if (ocelot_mact_wait_for_completion(ocelot)) { in ocelot_mact_lookup()
155 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_lookup()
156 return -ETIMEDOUT; in ocelot_mact_lookup()
160 val = ocelot_read(ocelot, ANA_TABLES_MACACCESS); in ocelot_mact_lookup()
162 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_lookup()
165 return -ENOENT; in ocelot_mact_lookup()
174 int ocelot_mact_learn_streamdata(struct ocelot *ocelot, int dst_idx, in ocelot_mact_learn_streamdata() argument
182 mutex_lock(&ocelot->mact_lock); in ocelot_mact_learn_streamdata()
184 ocelot_write(ocelot, in ocelot_mact_learn_streamdata()
191 ret = __ocelot_mact_learn(ocelot, dst_idx, mac, vid, type); in ocelot_mact_learn_streamdata()
193 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_learn_streamdata()
199 static void ocelot_mact_init(struct ocelot *ocelot) in ocelot_mact_init() argument
202 * - Do not copy the frame to the CPU extraction queues. in ocelot_mact_init()
203 * - Use the vlan and mac_cpoy for dmac lookup. in ocelot_mact_init()
205 ocelot_rmw(ocelot, 0, in ocelot_mact_init()
212 * holding &ocelot->mact_lock is pointless. in ocelot_mact_init()
214 ocelot_write(ocelot, MACACCESS_CMD_INIT, ANA_TABLES_MACACCESS); in ocelot_mact_init()
217 void ocelot_pll5_init(struct ocelot *ocelot) in ocelot_pll5_init() argument
220 * The values are coming from the VTSS API for Ocelot in ocelot_pll5_init()
222 regmap_write(ocelot->targets[HSIO], HSIO_PLL5G_CFG4, in ocelot_pll5_init()
225 regmap_write(ocelot->targets[HSIO], HSIO_PLL5G_CFG0, in ocelot_pll5_init()
237 regmap_write(ocelot->targets[HSIO], HSIO_PLL5G_CFG2, in ocelot_pll5_init()
247 static void ocelot_vcap_enable(struct ocelot *ocelot, int port) in ocelot_vcap_enable() argument
249 ocelot_write_gix(ocelot, ANA_PORT_VCAP_S2_CFG_S2_ENA | in ocelot_vcap_enable()
253 ocelot_write_gix(ocelot, ANA_PORT_VCAP_CFG_S1_ENA, in ocelot_vcap_enable()
256 ocelot_rmw_gix(ocelot, REW_PORT_CFG_ES0_EN, in ocelot_vcap_enable()
261 static int ocelot_single_vlan_aware_bridge(struct ocelot *ocelot, in ocelot_single_vlan_aware_bridge() argument
267 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_single_vlan_aware_bridge()
268 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_single_vlan_aware_bridge()
270 if (!ocelot_port || !ocelot_port->bridge || in ocelot_single_vlan_aware_bridge()
271 !br_vlan_enabled(ocelot_port->bridge)) in ocelot_single_vlan_aware_bridge()
275 bridge = ocelot_port->bridge; in ocelot_single_vlan_aware_bridge()
279 if (bridge == ocelot_port->bridge) in ocelot_single_vlan_aware_bridge()
283 "Only one VLAN-aware bridge is supported"); in ocelot_single_vlan_aware_bridge()
284 return -EBUSY; in ocelot_single_vlan_aware_bridge()
290 static inline u32 ocelot_vlant_read_vlanaccess(struct ocelot *ocelot) in ocelot_vlant_read_vlanaccess() argument
292 return ocelot_read(ocelot, ANA_TABLES_VLANACCESS); in ocelot_vlant_read_vlanaccess()
295 static inline int ocelot_vlant_wait_for_completion(struct ocelot *ocelot) in ocelot_vlant_wait_for_completion() argument
300 ocelot, in ocelot_vlant_wait_for_completion()
307 static int ocelot_vlant_set_mask(struct ocelot *ocelot, u16 vid, u32 mask) in ocelot_vlant_set_mask() argument
310 ocelot_write(ocelot, ANA_TABLES_VLANTIDX_V_INDEX(vid), in ocelot_vlant_set_mask()
313 ocelot_write(ocelot, ANA_TABLES_VLANACCESS_VLAN_PORT_MASK(mask) | in ocelot_vlant_set_mask()
317 return ocelot_vlant_wait_for_completion(ocelot); in ocelot_vlant_set_mask()
320 static int ocelot_port_num_untagged_vlans(struct ocelot *ocelot, int port) in ocelot_port_num_untagged_vlans() argument
325 list_for_each_entry(vlan, &ocelot->vlans, list) { in ocelot_port_num_untagged_vlans()
326 if (!(vlan->portmask & BIT(port))) in ocelot_port_num_untagged_vlans()
331 * the bridge VLANs, which only matter in VLAN-aware mode. in ocelot_port_num_untagged_vlans()
333 if (vlan->vid >= OCELOT_RSV_VLAN_RANGE_START) in ocelot_port_num_untagged_vlans()
336 if (vlan->untagged & BIT(port)) in ocelot_port_num_untagged_vlans()
343 static int ocelot_port_num_tagged_vlans(struct ocelot *ocelot, int port) in ocelot_port_num_tagged_vlans() argument
348 list_for_each_entry(vlan, &ocelot->vlans, list) { in ocelot_port_num_tagged_vlans()
349 if (!(vlan->portmask & BIT(port))) in ocelot_port_num_tagged_vlans()
352 if (!(vlan->untagged & BIT(port))) in ocelot_port_num_tagged_vlans()
359 /* We use native VLAN when we have to mix egress-tagged VLANs with exactly
360 * _one_ egress-untagged VLAN (_the_ native VLAN)
362 static bool ocelot_port_uses_native_vlan(struct ocelot *ocelot, int port) in ocelot_port_uses_native_vlan() argument
364 return ocelot_port_num_tagged_vlans(ocelot, port) && in ocelot_port_uses_native_vlan()
365 ocelot_port_num_untagged_vlans(ocelot, port) == 1; in ocelot_port_uses_native_vlan()
369 ocelot_port_find_native_vlan(struct ocelot *ocelot, int port) in ocelot_port_find_native_vlan() argument
373 list_for_each_entry(vlan, &ocelot->vlans, list) in ocelot_port_find_native_vlan()
374 if (vlan->portmask & BIT(port) && vlan->untagged & BIT(port)) in ocelot_port_find_native_vlan()
384 static void ocelot_port_manage_port_tag(struct ocelot *ocelot, int port) in ocelot_port_manage_port_tag() argument
386 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_manage_port_tag()
390 if (ocelot_port->vlan_aware) { in ocelot_port_manage_port_tag()
391 uses_native_vlan = ocelot_port_uses_native_vlan(ocelot, port); in ocelot_port_manage_port_tag()
395 else if (ocelot_port_num_untagged_vlans(ocelot, port)) in ocelot_port_manage_port_tag()
403 ocelot_rmw_gix(ocelot, REW_TAG_CFG_TAG_CFG(tag_cfg), in ocelot_port_manage_port_tag()
414 native_vlan = ocelot_port_find_native_vlan(ocelot, port); in ocelot_port_manage_port_tag()
416 ocelot_rmw_gix(ocelot, in ocelot_port_manage_port_tag()
417 REW_PORT_VLAN_CFG_PORT_VID(native_vlan->vid), in ocelot_port_manage_port_tag()
423 int ocelot_bridge_num_find(struct ocelot *ocelot, in ocelot_bridge_num_find() argument
428 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_bridge_num_find()
429 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_bridge_num_find()
431 if (ocelot_port && ocelot_port->bridge == bridge) in ocelot_bridge_num_find()
432 return ocelot_port->bridge_num; in ocelot_bridge_num_find()
435 return -1; in ocelot_bridge_num_find()
439 static u16 ocelot_vlan_unaware_pvid(struct ocelot *ocelot, in ocelot_vlan_unaware_pvid() argument
448 bridge_num = ocelot_bridge_num_find(ocelot, bridge); in ocelot_vlan_unaware_pvid()
452 /* VLAN-unaware bridges use a reserved VID going from 4095 downwards */ in ocelot_vlan_unaware_pvid()
453 return VLAN_N_VID - bridge_num - 1; in ocelot_vlan_unaware_pvid()
457 * ocelot_update_vlan_reclassify_rule() - Make switch aware only to bridge VLAN TPID
459 * @ocelot: Switch private data structure
462 * IEEE 802.1Q-2018 clauses "5.5 C-VLAN component conformance" and "5.6 S-VLAN
463 * component conformance" suggest that a C-VLAN component should only recognize
464 * and filter on C-Tags, and an S-VLAN component should only recognize and
465 * process based on C-Tags.
467 * In Linux, as per commit 1a0b20b25732 ("Merge branch 'bridge-next'"), C-VLAN
469 * and S-VLAN components by a bridge with vlan_protocol 802.1ad.
472 * design is non-conformant, because the switch assigns each frame to a VLAN
476 * Set TAG_TYPE, PCP, DEI, VID to port-default values in VLAN_CFG register
492 * In the VLAN Table, the TAG_TYPE information is not accessible - just the
493 * classified VID is - so it is as if each VLAN Table entry is for 2 VLANs:
494 * C-VLAN X, and S-VLAN X.
497 * equal to the vlan_protocol, and treat everything else as VLAN-untagged.
501 * should be treated as 802.1Q-untagged, and classified to the PVID of that
510 * if those packets were processed as VLAN-untagged.
514 * VLAN-unaware.
516 static int ocelot_update_vlan_reclassify_rule(struct ocelot *ocelot, int port) in ocelot_update_vlan_reclassify_rule() argument
518 unsigned long cookie = OCELOT_VCAP_IS1_VLAN_RECLASSIFY(ocelot, port); in ocelot_update_vlan_reclassify_rule()
519 struct ocelot_vcap_block *block_vcap_is1 = &ocelot->block[VCAP_IS1]; in ocelot_update_vlan_reclassify_rule()
520 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_update_vlan_reclassify_rule()
527 pvid_vlan = ocelot_port->pvid_vlan; in ocelot_update_vlan_reclassify_rule()
528 vid_replace_ena = ocelot_port->vlan_aware && pvid_vlan; in ocelot_update_vlan_reclassify_rule()
538 return ocelot_vcap_filter_del(ocelot, filter); in ocelot_update_vlan_reclassify_rule()
547 /* Treating as VLAN-untagged means using as classified VID equal to in ocelot_update_vlan_reclassify_rule()
550 vid = pvid_vlan->vid; in ocelot_update_vlan_reclassify_rule()
551 val = ocelot_read_gix(ocelot, ANA_PORT_QOS_CFG, port); in ocelot_update_vlan_reclassify_rule()
559 if (filter->action.vid != vid) { in ocelot_update_vlan_reclassify_rule()
560 filter->action.vid = vid; in ocelot_update_vlan_reclassify_rule()
563 if (filter->action.pcp != pcp) { in ocelot_update_vlan_reclassify_rule()
564 filter->action.pcp = pcp; in ocelot_update_vlan_reclassify_rule()
567 if (filter->action.dei != dei) { in ocelot_update_vlan_reclassify_rule()
568 filter->action.dei = dei; in ocelot_update_vlan_reclassify_rule()
575 return ocelot_vcap_filter_replace(ocelot, filter); in ocelot_update_vlan_reclassify_rule()
581 return -ENOMEM; in ocelot_update_vlan_reclassify_rule()
583 filter->key_type = OCELOT_VCAP_KEY_ANY; in ocelot_update_vlan_reclassify_rule()
584 filter->ingress_port_mask = BIT(port); in ocelot_update_vlan_reclassify_rule()
585 filter->vlan.tpid = OCELOT_VCAP_BIT_1; in ocelot_update_vlan_reclassify_rule()
586 filter->prio = 1; in ocelot_update_vlan_reclassify_rule()
587 filter->id.cookie = cookie; in ocelot_update_vlan_reclassify_rule()
588 filter->id.tc_offload = false; in ocelot_update_vlan_reclassify_rule()
589 filter->block_id = VCAP_IS1; in ocelot_update_vlan_reclassify_rule()
590 filter->type = OCELOT_VCAP_FILTER_OFFLOAD; in ocelot_update_vlan_reclassify_rule()
591 filter->lookup = 0; in ocelot_update_vlan_reclassify_rule()
592 filter->action.vid_replace_ena = true; in ocelot_update_vlan_reclassify_rule()
593 filter->action.pcp_dei_ena = true; in ocelot_update_vlan_reclassify_rule()
594 filter->action.vid = vid; in ocelot_update_vlan_reclassify_rule()
595 filter->action.pcp = pcp; in ocelot_update_vlan_reclassify_rule()
596 filter->action.dei = dei; in ocelot_update_vlan_reclassify_rule()
598 err = ocelot_vcap_filter_add(ocelot, filter, NULL); in ocelot_update_vlan_reclassify_rule()
606 static int ocelot_port_set_pvid(struct ocelot *ocelot, int port, in ocelot_port_set_pvid() argument
609 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_set_pvid()
610 u16 pvid = ocelot_vlan_unaware_pvid(ocelot, ocelot_port->bridge); in ocelot_port_set_pvid()
613 ocelot_port->pvid_vlan = pvid_vlan; in ocelot_port_set_pvid()
615 if (ocelot_port->vlan_aware && pvid_vlan) in ocelot_port_set_pvid()
616 pvid = pvid_vlan->vid; in ocelot_port_set_pvid()
618 ocelot_rmw_gix(ocelot, in ocelot_port_set_pvid()
629 * 802.1ad-tagged frames (carrying S-Tags) should be considered in ocelot_port_set_pvid()
630 * 802.1Q-untagged, and also dropped. in ocelot_port_set_pvid()
632 if (!pvid_vlan && ocelot_port->vlan_aware) in ocelot_port_set_pvid()
637 ocelot_rmw_gix(ocelot, val, in ocelot_port_set_pvid()
643 return ocelot_update_vlan_reclassify_rule(ocelot, port); in ocelot_port_set_pvid()
646 static struct ocelot_bridge_vlan *ocelot_bridge_vlan_find(struct ocelot *ocelot, in ocelot_bridge_vlan_find() argument
651 list_for_each_entry(vlan, &ocelot->vlans, list) in ocelot_bridge_vlan_find()
652 if (vlan->vid == vid) in ocelot_bridge_vlan_find()
658 static int ocelot_vlan_member_add(struct ocelot *ocelot, int port, u16 vid, in ocelot_vlan_member_add() argument
661 struct ocelot_bridge_vlan *vlan = ocelot_bridge_vlan_find(ocelot, vid); in ocelot_vlan_member_add()
666 portmask = vlan->portmask | BIT(port); in ocelot_vlan_member_add()
668 err = ocelot_vlant_set_mask(ocelot, vid, portmask); in ocelot_vlan_member_add()
672 vlan->portmask = portmask; in ocelot_vlan_member_add()
674 * egress-tagging setting, so make sure to override an untagged in ocelot_vlan_member_add()
678 vlan->untagged |= BIT(port); in ocelot_vlan_member_add()
680 vlan->untagged &= ~BIT(port); in ocelot_vlan_member_add()
687 return -ENOMEM; in ocelot_vlan_member_add()
691 err = ocelot_vlant_set_mask(ocelot, vid, portmask); in ocelot_vlan_member_add()
697 vlan->vid = vid; in ocelot_vlan_member_add()
698 vlan->portmask = portmask; in ocelot_vlan_member_add()
700 vlan->untagged = BIT(port); in ocelot_vlan_member_add()
701 INIT_LIST_HEAD(&vlan->list); in ocelot_vlan_member_add()
702 list_add_tail(&vlan->list, &ocelot->vlans); in ocelot_vlan_member_add()
707 static int ocelot_vlan_member_del(struct ocelot *ocelot, int port, u16 vid) in ocelot_vlan_member_del() argument
709 struct ocelot_bridge_vlan *vlan = ocelot_bridge_vlan_find(ocelot, vid); in ocelot_vlan_member_del()
716 portmask = vlan->portmask & ~BIT(port); in ocelot_vlan_member_del()
718 err = ocelot_vlant_set_mask(ocelot, vid, portmask); in ocelot_vlan_member_del()
722 vlan->portmask = portmask; in ocelot_vlan_member_del()
723 if (vlan->portmask) in ocelot_vlan_member_del()
726 list_del(&vlan->list); in ocelot_vlan_member_del()
732 static int ocelot_add_vlan_unaware_pvid(struct ocelot *ocelot, int port, in ocelot_add_vlan_unaware_pvid() argument
735 u16 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_add_vlan_unaware_pvid()
737 return ocelot_vlan_member_add(ocelot, port, vid, true); in ocelot_add_vlan_unaware_pvid()
740 static int ocelot_del_vlan_unaware_pvid(struct ocelot *ocelot, int port, in ocelot_del_vlan_unaware_pvid() argument
743 u16 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_del_vlan_unaware_pvid()
745 return ocelot_vlan_member_del(ocelot, port, vid); in ocelot_del_vlan_unaware_pvid()
748 int ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, in ocelot_port_vlan_filtering() argument
751 struct ocelot_vcap_block *block = &ocelot->block[VCAP_IS1]; in ocelot_port_vlan_filtering()
752 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_vlan_filtering()
757 list_for_each_entry(filter, &block->rules, list) { in ocelot_port_vlan_filtering()
758 if (filter->ingress_port_mask & BIT(port) && in ocelot_port_vlan_filtering()
759 filter->action.vid_replace_ena) { in ocelot_port_vlan_filtering()
762 return -EBUSY; in ocelot_port_vlan_filtering()
766 err = ocelot_single_vlan_aware_bridge(ocelot, extack); in ocelot_port_vlan_filtering()
771 err = ocelot_del_vlan_unaware_pvid(ocelot, port, in ocelot_port_vlan_filtering()
772 ocelot_port->bridge); in ocelot_port_vlan_filtering()
773 else if (ocelot_port->bridge) in ocelot_port_vlan_filtering()
774 err = ocelot_add_vlan_unaware_pvid(ocelot, port, in ocelot_port_vlan_filtering()
775 ocelot_port->bridge); in ocelot_port_vlan_filtering()
779 ocelot_port->vlan_aware = vlan_aware; in ocelot_port_vlan_filtering()
786 ocelot_rmw_gix(ocelot, val, in ocelot_port_vlan_filtering()
791 err = ocelot_port_set_pvid(ocelot, port, ocelot_port->pvid_vlan); in ocelot_port_vlan_filtering()
795 ocelot_port_manage_port_tag(ocelot, port); in ocelot_port_vlan_filtering()
801 int ocelot_vlan_prepare(struct ocelot *ocelot, int port, u16 vid, bool pvid, in ocelot_vlan_prepare() argument
805 /* We are adding an egress-tagged VLAN */ in ocelot_vlan_prepare()
806 if (ocelot_port_uses_native_vlan(ocelot, port)) { in ocelot_vlan_prepare()
808 "Port with egress-tagged VLANs cannot have more than one egress-untagged (native) VLAN"); in ocelot_vlan_prepare()
809 return -EBUSY; in ocelot_vlan_prepare()
812 /* We are adding an egress-tagged VLAN */ in ocelot_vlan_prepare()
813 if (ocelot_port_num_untagged_vlans(ocelot, port) > 1) { in ocelot_vlan_prepare()
815 "Port with more than one egress-untagged VLAN cannot have egress-tagged VLANs"); in ocelot_vlan_prepare()
816 return -EBUSY; in ocelot_vlan_prepare()
822 "VLAN range 4000-4095 reserved for VLAN-unaware bridging"); in ocelot_vlan_prepare()
823 return -EBUSY; in ocelot_vlan_prepare()
830 int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, in ocelot_vlan_add() argument
833 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_vlan_add()
838 * egress-untagged to egress-tagged. in ocelot_vlan_add()
843 err = ocelot_vlan_member_add(ocelot, port, vid, untagged); in ocelot_vlan_add()
849 err = ocelot_port_set_pvid(ocelot, port, in ocelot_vlan_add()
850 ocelot_bridge_vlan_find(ocelot, vid)); in ocelot_vlan_add()
853 } else if (ocelot_port->pvid_vlan && in ocelot_vlan_add()
854 ocelot_bridge_vlan_find(ocelot, vid) == ocelot_port->pvid_vlan) { in ocelot_vlan_add()
855 err = ocelot_port_set_pvid(ocelot, port, NULL); in ocelot_vlan_add()
861 ocelot_port_manage_port_tag(ocelot, port); in ocelot_vlan_add()
867 int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid) in ocelot_vlan_del() argument
869 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_vlan_del()
876 if (ocelot_port->pvid_vlan && ocelot_port->pvid_vlan->vid == vid) in ocelot_vlan_del()
879 err = ocelot_vlan_member_del(ocelot, port, vid); in ocelot_vlan_del()
885 err = ocelot_port_set_pvid(ocelot, port, NULL); in ocelot_vlan_del()
891 ocelot_port_manage_port_tag(ocelot, port); in ocelot_vlan_del()
897 static void ocelot_vlan_init(struct ocelot *ocelot) in ocelot_vlan_init() argument
899 unsigned long all_ports = GENMASK(ocelot->num_phys_ports - 1, 0); in ocelot_vlan_init()
903 ocelot_write(ocelot, ANA_TABLES_VLANACCESS_CMD_INIT, in ocelot_vlan_init()
905 ocelot_vlant_wait_for_completion(ocelot); in ocelot_vlan_init()
909 ocelot_vlant_set_mask(ocelot, vid, 0); in ocelot_vlan_init()
915 ocelot_vlant_set_mask(ocelot, OCELOT_STANDALONE_PVID, all_ports); in ocelot_vlan_init()
920 ocelot_write(ocelot, all_ports, ANA_VLANMASK); in ocelot_vlan_init()
922 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_vlan_init()
923 ocelot_write_gix(ocelot, 0, REW_PORT_VLAN_CFG, port); in ocelot_vlan_init()
924 ocelot_write_gix(ocelot, 0, REW_TAG_CFG, port); in ocelot_vlan_init()
928 static u32 ocelot_read_eq_avail(struct ocelot *ocelot, int port) in ocelot_read_eq_avail() argument
930 return ocelot_read_rix(ocelot, QSYS_SW_STATUS, port); in ocelot_read_eq_avail()
933 static int ocelot_port_flush(struct ocelot *ocelot, int port) in ocelot_port_flush() argument
939 ocelot_rmw_rix(ocelot, QSYS_PORT_MODE_DEQUEUE_DIS, in ocelot_port_flush()
944 ocelot_fields_read(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, &pause_ena); in ocelot_port_flush()
945 ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, 0); in ocelot_port_flush()
948 ocelot_fields_write(ocelot, port, in ocelot_port_flush()
953 * Worst-case delays for 10 kilobyte jumbo frames are: in ocelot_port_flush()
962 ocelot_rmw_rix(ocelot, 0, SYS_FRONT_PORT_MODE_HDX_MODE, in ocelot_port_flush()
966 ocelot_rmw_gix(ocelot, REW_PORT_CFG_FLUSH_ENA, REW_PORT_CFG_FLUSH_ENA, in ocelot_port_flush()
970 ocelot_rmw_rix(ocelot, 0, QSYS_PORT_MODE_DEQUEUE_DIS, QSYS_PORT_MODE, in ocelot_port_flush()
975 100, 2000000, false, ocelot, port); in ocelot_port_flush()
978 ocelot_rmw_gix(ocelot, 0, REW_PORT_CFG_FLUSH_ENA, REW_PORT_CFG, port); in ocelot_port_flush()
980 /* Re-enable flow control */ in ocelot_port_flush()
981 ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, pause_ena); in ocelot_port_flush()
986 int ocelot_port_configure_serdes(struct ocelot *ocelot, int port, in ocelot_port_configure_serdes() argument
989 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_configure_serdes()
990 struct device *dev = ocelot->dev; in ocelot_port_configure_serdes()
994 if (ocelot_port->phy_mode == PHY_INTERFACE_MODE_QSGMII) in ocelot_port_configure_serdes()
1000 if (ocelot_port->phy_mode != PHY_INTERFACE_MODE_INTERNAL) { in ocelot_port_configure_serdes()
1012 ocelot_port->phy_mode); in ocelot_port_configure_serdes()
1025 void ocelot_phylink_mac_config(struct ocelot *ocelot, int port, in ocelot_phylink_mac_config() argument
1029 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_phylink_mac_config()
1051 void ocelot_phylink_mac_link_down(struct ocelot *ocelot, int port, in ocelot_phylink_mac_link_down() argument
1056 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_phylink_mac_link_down()
1059 ocelot_port->speed = SPEED_UNKNOWN; in ocelot_phylink_mac_link_down()
1064 if (ocelot->ops->cut_through_fwd) { in ocelot_phylink_mac_link_down()
1065 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_phylink_mac_link_down()
1066 ocelot->ops->cut_through_fwd(ocelot); in ocelot_phylink_mac_link_down()
1067 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_phylink_mac_link_down()
1070 ocelot_fields_write(ocelot, port, QSYS_SWITCH_PORT_MODE_PORT_ENA, 0); in ocelot_phylink_mac_link_down()
1072 err = ocelot_port_flush(ocelot, port); in ocelot_phylink_mac_link_down()
1074 dev_err(ocelot->dev, "failed to flush port %d: %d\n", in ocelot_phylink_mac_link_down()
1089 void ocelot_phylink_mac_link_up(struct ocelot *ocelot, int port, in ocelot_phylink_mac_link_up() argument
1097 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_phylink_mac_link_up()
1101 ocelot_port->speed = speed; in ocelot_phylink_mac_link_up()
1144 dev_err(ocelot->dev, "Unsupported speed on port %d: %d\n", in ocelot_phylink_mac_link_up()
1161 ocelot_write_rix(ocelot, mac_fc_cfg, SYS_MAC_FC_CFG, port); in ocelot_phylink_mac_link_up()
1163 ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, port); in ocelot_phylink_mac_link_up()
1166 if (port != ocelot->npi) in ocelot_phylink_mac_link_up()
1167 ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, in ocelot_phylink_mac_link_up()
1176 /* If the port supports cut-through forwarding, update the masks before in ocelot_phylink_mac_link_up()
1179 if (ocelot->ops->cut_through_fwd) { in ocelot_phylink_mac_link_up()
1180 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_phylink_mac_link_up()
1181 /* Workaround for hardware bug - FP doesn't work in ocelot_phylink_mac_link_up()
1183 * below also calls ocelot->ops->cut_through_fwd(), in ocelot_phylink_mac_link_up()
1186 ocelot_port_update_active_preemptible_tcs(ocelot, port); in ocelot_phylink_mac_link_up()
1187 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_phylink_mac_link_up()
1191 ocelot_fields_write(ocelot, port, in ocelot_phylink_mac_link_up()
1196 static int ocelot_rx_frame_word(struct ocelot *ocelot, u8 grp, bool ifh, in ocelot_rx_frame_word() argument
1201 val = ocelot_read_rix(ocelot, QS_XTR_RD, grp); in ocelot_rx_frame_word()
1204 return -EIO; in ocelot_rx_frame_word()
1207 val = ocelot_read_rix(ocelot, QS_XTR_RD, grp); in ocelot_rx_frame_word()
1213 return -EIO; in ocelot_rx_frame_word()
1220 val = ocelot_read_rix(ocelot, QS_XTR_RD, grp); in ocelot_rx_frame_word()
1222 *rval = ocelot_read_rix(ocelot, QS_XTR_RD, grp); in ocelot_rx_frame_word()
1228 *rval = ocelot_read_rix(ocelot, QS_XTR_RD, grp); in ocelot_rx_frame_word()
1238 static int ocelot_xtr_poll_xfh(struct ocelot *ocelot, int grp, u32 *xfh) in ocelot_xtr_poll_xfh() argument
1243 err = ocelot_rx_frame_word(ocelot, grp, true, &xfh[i]); in ocelot_xtr_poll_xfh()
1245 return (err < 0) ? err : -EIO; in ocelot_xtr_poll_xfh()
1251 void ocelot_ptp_rx_timestamp(struct ocelot *ocelot, struct sk_buff *skb, in ocelot_ptp_rx_timestamp() argument
1258 ocelot_ptp_gettime64(&ocelot->ptp_info, &ts); in ocelot_ptp_rx_timestamp()
1262 full_ts_in_ns = (((tod_in_ns >> 32) - 1) << 32) | in ocelot_ptp_rx_timestamp()
1270 shhwtstamps->hwtstamp = full_ts_in_ns; in ocelot_ptp_rx_timestamp()
1274 void ocelot_lock_inj_grp(struct ocelot *ocelot, int grp) in ocelot_lock_inj_grp() argument
1275 __acquires(&ocelot->inj_lock) in ocelot_lock_inj_grp()
1277 spin_lock(&ocelot->inj_lock); in ocelot_lock_inj_grp()
1281 void ocelot_unlock_inj_grp(struct ocelot *ocelot, int grp) in ocelot_unlock_inj_grp() argument
1282 __releases(&ocelot->inj_lock) in ocelot_unlock_inj_grp()
1284 spin_unlock(&ocelot->inj_lock); in ocelot_unlock_inj_grp()
1288 void ocelot_lock_xtr_grp(struct ocelot *ocelot, int grp) in ocelot_lock_xtr_grp() argument
1289 __acquires(&ocelot->inj_lock) in ocelot_lock_xtr_grp()
1291 spin_lock(&ocelot->inj_lock); in ocelot_lock_xtr_grp()
1295 void ocelot_unlock_xtr_grp(struct ocelot *ocelot, int grp) in ocelot_unlock_xtr_grp() argument
1296 __releases(&ocelot->inj_lock) in ocelot_unlock_xtr_grp()
1298 spin_unlock(&ocelot->inj_lock); in ocelot_unlock_xtr_grp()
1302 void ocelot_lock_xtr_grp_bh(struct ocelot *ocelot, int grp) in ocelot_lock_xtr_grp_bh() argument
1303 __acquires(&ocelot->xtr_lock) in ocelot_lock_xtr_grp_bh()
1305 spin_lock_bh(&ocelot->xtr_lock); in ocelot_lock_xtr_grp_bh()
1309 void ocelot_unlock_xtr_grp_bh(struct ocelot *ocelot, int grp) in ocelot_unlock_xtr_grp_bh() argument
1310 __releases(&ocelot->xtr_lock) in ocelot_unlock_xtr_grp_bh()
1312 spin_unlock_bh(&ocelot->xtr_lock); in ocelot_unlock_xtr_grp_bh()
1316 int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **nskb) in ocelot_xtr_poll_frame() argument
1326 lockdep_assert_held(&ocelot->xtr_lock); in ocelot_xtr_poll_frame()
1328 err = ocelot_xtr_poll_xfh(ocelot, grp, xfh); in ocelot_xtr_poll_frame()
1336 if (WARN_ON(src_port >= ocelot->num_phys_ports)) in ocelot_xtr_poll_frame()
1337 return -EINVAL; in ocelot_xtr_poll_frame()
1339 dev = ocelot->ops->port_to_netdev(ocelot, src_port); in ocelot_xtr_poll_frame()
1341 return -EINVAL; in ocelot_xtr_poll_frame()
1346 return -ENOMEM; in ocelot_xtr_poll_frame()
1349 buf_len = len - ETH_FCS_LEN; in ocelot_xtr_poll_frame()
1354 sz = ocelot_rx_frame_word(ocelot, grp, false, &val); in ocelot_xtr_poll_frame()
1364 sz = ocelot_rx_frame_word(ocelot, grp, false, &val); in ocelot_xtr_poll_frame()
1371 len -= ETH_FCS_LEN - sz; in ocelot_xtr_poll_frame()
1373 if (unlikely(dev->features & NETIF_F_RXFCS)) { in ocelot_xtr_poll_frame()
1378 if (ocelot->ptp) in ocelot_xtr_poll_frame()
1379 ocelot_ptp_rx_timestamp(ocelot, skb, timestamp); in ocelot_xtr_poll_frame()
1384 if (ocelot->ports[src_port]->bridge) in ocelot_xtr_poll_frame()
1385 skb->offload_fwd_mark = 1; in ocelot_xtr_poll_frame()
1387 skb->protocol = eth_type_trans(skb, dev); in ocelot_xtr_poll_frame()
1399 bool ocelot_can_inject(struct ocelot *ocelot, int grp) in ocelot_can_inject() argument
1401 u32 val = ocelot_read(ocelot, QS_INJ_STATUS); in ocelot_can_inject()
1403 lockdep_assert_held(&ocelot->inj_lock); in ocelot_can_inject()
1415 * ocelot_ifh_set_basic - Set basic information in Injection Frame Header
1417 * @ocelot: Switch private data structure
1425 void ocelot_ifh_set_basic(void *ifh, struct ocelot *ocelot, int port, in ocelot_ifh_set_basic() argument
1428 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_ifh_set_basic()
1429 struct net_device *dev = skb->dev; in ocelot_ifh_set_basic()
1433 ocelot_xmit_get_vlan_info(skb, ocelot_port->bridge, &vlan_tci, in ocelot_ifh_set_basic()
1437 netdev_get_prio_tc_map(dev, skb->priority) : skb->priority; in ocelot_ifh_set_basic()
1441 ocelot_ifh_set_src(ifh, ocelot->num_phys_ports); in ocelot_ifh_set_basic()
1451 void ocelot_port_inject_frame(struct ocelot *ocelot, int port, int grp, in ocelot_port_inject_frame() argument
1457 lockdep_assert_held(&ocelot->inj_lock); in ocelot_port_inject_frame()
1459 ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) | in ocelot_port_inject_frame()
1462 ocelot_ifh_set_basic(ifh, ocelot, port, rew_op, skb); in ocelot_port_inject_frame()
1465 ocelot_write_rix(ocelot, ifh[i], QS_INJ_WR, grp); in ocelot_port_inject_frame()
1467 count = DIV_ROUND_UP(skb->len, 4); in ocelot_port_inject_frame()
1468 last = skb->len % 4; in ocelot_port_inject_frame()
1470 ocelot_write_rix(ocelot, ((u32 *)skb->data)[i], QS_INJ_WR, grp); in ocelot_port_inject_frame()
1474 ocelot_write_rix(ocelot, 0, QS_INJ_WR, grp); in ocelot_port_inject_frame()
1479 ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) | in ocelot_port_inject_frame()
1480 QS_INJ_CTRL_VLD_BYTES(skb->len < OCELOT_BUFFER_CELL_SZ ? 0 : last) | in ocelot_port_inject_frame()
1485 ocelot_write_rix(ocelot, 0, QS_INJ_WR, grp); in ocelot_port_inject_frame()
1488 skb->dev->stats.tx_packets++; in ocelot_port_inject_frame()
1489 skb->dev->stats.tx_bytes += skb->len; in ocelot_port_inject_frame()
1493 void ocelot_drain_cpu_queue(struct ocelot *ocelot, int grp) in ocelot_drain_cpu_queue() argument
1495 lockdep_assert_held(&ocelot->xtr_lock); in ocelot_drain_cpu_queue()
1497 while (ocelot_read(ocelot, QS_XTR_DATA_PRESENT) & BIT(grp)) in ocelot_drain_cpu_queue()
1498 ocelot_read_rix(ocelot, QS_XTR_RD, grp); in ocelot_drain_cpu_queue()
1502 int ocelot_fdb_add(struct ocelot *ocelot, int port, const unsigned char *addr, in ocelot_fdb_add() argument
1506 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_fdb_add()
1508 return ocelot_mact_learn(ocelot, port, addr, vid, ENTRYTYPE_LOCKED); in ocelot_fdb_add()
1512 int ocelot_fdb_del(struct ocelot *ocelot, int port, const unsigned char *addr, in ocelot_fdb_del() argument
1516 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_fdb_del()
1518 return ocelot_mact_forget(ocelot, addr, vid); in ocelot_fdb_del()
1522 /* Caller must hold &ocelot->mact_lock */
1523 static int ocelot_mact_read(struct ocelot *ocelot, int port, int row, int col, in ocelot_mact_read() argument
1530 ocelot_field_write(ocelot, ANA_TABLES_MACTINDX_M_INDEX, row); in ocelot_mact_read()
1531 ocelot_field_write(ocelot, ANA_TABLES_MACTINDX_BUCKET, col); in ocelot_mact_read()
1534 ocelot_write(ocelot, in ocelot_mact_read()
1538 if (ocelot_mact_wait_for_completion(ocelot)) in ocelot_mact_read()
1539 return -ETIMEDOUT; in ocelot_mact_read()
1542 val = ocelot_read(ocelot, ANA_TABLES_MACACCESS); in ocelot_mact_read()
1544 return -EINVAL; in ocelot_mact_read()
1551 return -EINVAL; in ocelot_mact_read()
1554 macl = ocelot_read(ocelot, ANA_TABLES_MACLDATA); in ocelot_mact_read()
1555 mach = ocelot_read(ocelot, ANA_TABLES_MACHDATA); in ocelot_mact_read()
1564 entry->vid = (mach >> 16) & 0xfff; in ocelot_mact_read()
1565 ether_addr_copy(entry->mac, mac); in ocelot_mact_read()
1570 int ocelot_mact_flush(struct ocelot *ocelot, int port) in ocelot_mact_flush() argument
1574 mutex_lock(&ocelot->mact_lock); in ocelot_mact_flush()
1577 ocelot_write(ocelot, ANA_ANAGEFIL_PID_EN | ANA_ANAGEFIL_PID_VAL(port), in ocelot_mact_flush()
1581 ocelot_write(ocelot, in ocelot_mact_flush()
1585 err = ocelot_mact_wait_for_completion(ocelot); in ocelot_mact_flush()
1587 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_flush()
1592 ocelot_write(ocelot, in ocelot_mact_flush()
1596 err = ocelot_mact_wait_for_completion(ocelot); in ocelot_mact_flush()
1599 ocelot_write(ocelot, 0, ANA_ANAGEFIL); in ocelot_mact_flush()
1601 mutex_unlock(&ocelot->mact_lock); in ocelot_mact_flush()
1607 int ocelot_fdb_dump(struct ocelot *ocelot, int port, in ocelot_fdb_dump() argument
1616 mutex_lock(&ocelot->mact_lock); in ocelot_fdb_dump()
1619 for (i = 0; i < ocelot->num_mact_rows; i++) { in ocelot_fdb_dump()
1624 err = ocelot_mact_read(ocelot, port, i, j, &entry); in ocelot_fdb_dump()
1628 if (err == -EINVAL) in ocelot_fdb_dump()
1636 * VLAN-unaware bridging. in ocelot_fdb_dump()
1647 mutex_unlock(&ocelot->mact_lock); in ocelot_fdb_dump()
1653 int ocelot_trap_add(struct ocelot *ocelot, int port, in ocelot_trap_add() argument
1662 block_vcap_is2 = &ocelot->block[VCAP_IS2]; in ocelot_trap_add()
1669 return -ENOMEM; in ocelot_trap_add()
1672 trap->prio = 1; in ocelot_trap_add()
1673 trap->id.cookie = cookie; in ocelot_trap_add()
1674 trap->id.tc_offload = false; in ocelot_trap_add()
1675 trap->block_id = VCAP_IS2; in ocelot_trap_add()
1676 trap->type = OCELOT_VCAP_FILTER_OFFLOAD; in ocelot_trap_add()
1677 trap->lookup = 0; in ocelot_trap_add()
1678 trap->action.cpu_copy_ena = true; in ocelot_trap_add()
1679 trap->action.mask_mode = OCELOT_MASK_MODE_PERMIT_DENY; in ocelot_trap_add()
1680 trap->action.port_mask = 0; in ocelot_trap_add()
1681 trap->take_ts = take_ts; in ocelot_trap_add()
1682 trap->is_trap = true; in ocelot_trap_add()
1686 trap->ingress_port_mask |= BIT(port); in ocelot_trap_add()
1689 err = ocelot_vcap_filter_add(ocelot, trap, NULL); in ocelot_trap_add()
1691 err = ocelot_vcap_filter_replace(ocelot, trap); in ocelot_trap_add()
1693 trap->ingress_port_mask &= ~BIT(port); in ocelot_trap_add()
1694 if (!trap->ingress_port_mask) in ocelot_trap_add()
1702 int ocelot_trap_del(struct ocelot *ocelot, int port, unsigned long cookie) in ocelot_trap_del() argument
1707 block_vcap_is2 = &ocelot->block[VCAP_IS2]; in ocelot_trap_del()
1714 trap->ingress_port_mask &= ~BIT(port); in ocelot_trap_del()
1715 if (!trap->ingress_port_mask) in ocelot_trap_del()
1716 return ocelot_vcap_filter_del(ocelot, trap); in ocelot_trap_del()
1718 return ocelot_vcap_filter_replace(ocelot, trap); in ocelot_trap_del()
1721 static u32 ocelot_get_bond_mask(struct ocelot *ocelot, struct net_device *bond) in ocelot_get_bond_mask() argument
1726 lockdep_assert_held(&ocelot->fwd_domain_lock); in ocelot_get_bond_mask()
1728 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_get_bond_mask()
1729 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_get_bond_mask()
1734 if (ocelot_port->bond == bond) in ocelot_get_bond_mask()
1744 int ocelot_bond_get_id(struct ocelot *ocelot, struct net_device *bond) in ocelot_bond_get_id() argument
1746 int bond_mask = ocelot_get_bond_mask(ocelot, bond); in ocelot_bond_get_id()
1749 return -ENOENT; in ocelot_bond_get_id()
1765 static u32 ocelot_dsa_8021q_cpu_assigned_ports(struct ocelot *ocelot, in ocelot_dsa_8021q_cpu_assigned_ports() argument
1771 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_dsa_8021q_cpu_assigned_ports()
1772 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_dsa_8021q_cpu_assigned_ports()
1777 if (ocelot_port->dsa_8021q_cpu == cpu) in ocelot_dsa_8021q_cpu_assigned_ports()
1781 if (cpu->bond) in ocelot_dsa_8021q_cpu_assigned_ports()
1782 mask &= ~ocelot_get_bond_mask(ocelot, cpu->bond); in ocelot_dsa_8021q_cpu_assigned_ports()
1790 u32 ocelot_port_assigned_dsa_8021q_cpu_mask(struct ocelot *ocelot, int port) in ocelot_port_assigned_dsa_8021q_cpu_mask() argument
1792 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_assigned_dsa_8021q_cpu_mask()
1793 struct ocelot_port *cpu_port = ocelot_port->dsa_8021q_cpu; in ocelot_port_assigned_dsa_8021q_cpu_mask()
1798 if (cpu_port->bond) in ocelot_port_assigned_dsa_8021q_cpu_mask()
1799 return ocelot_get_bond_mask(ocelot, cpu_port->bond); in ocelot_port_assigned_dsa_8021q_cpu_mask()
1801 return BIT(cpu_port->index); in ocelot_port_assigned_dsa_8021q_cpu_mask()
1805 u32 ocelot_get_bridge_fwd_mask(struct ocelot *ocelot, int src_port) in ocelot_get_bridge_fwd_mask() argument
1807 struct ocelot_port *ocelot_port = ocelot->ports[src_port]; in ocelot_get_bridge_fwd_mask()
1812 if (!ocelot_port || ocelot_port->stp_state != BR_STATE_FORWARDING) in ocelot_get_bridge_fwd_mask()
1815 bridge = ocelot_port->bridge; in ocelot_get_bridge_fwd_mask()
1819 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_get_bridge_fwd_mask()
1820 ocelot_port = ocelot->ports[port]; in ocelot_get_bridge_fwd_mask()
1825 if (ocelot_port->stp_state == BR_STATE_FORWARDING && in ocelot_get_bridge_fwd_mask()
1826 ocelot_port->bridge == bridge) in ocelot_get_bridge_fwd_mask()
1834 static void ocelot_apply_bridge_fwd_mask(struct ocelot *ocelot, bool joining) in ocelot_apply_bridge_fwd_mask() argument
1838 lockdep_assert_held(&ocelot->fwd_domain_lock); in ocelot_apply_bridge_fwd_mask()
1840 /* If cut-through forwarding is supported, update the masks before a in ocelot_apply_bridge_fwd_mask()
1844 if (joining && ocelot->ops->cut_through_fwd) in ocelot_apply_bridge_fwd_mask()
1845 ocelot->ops->cut_through_fwd(ocelot); in ocelot_apply_bridge_fwd_mask()
1850 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_apply_bridge_fwd_mask()
1851 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_apply_bridge_fwd_mask()
1857 } else if (ocelot_port->is_dsa_8021q_cpu) { in ocelot_apply_bridge_fwd_mask()
1861 mask = ocelot_dsa_8021q_cpu_assigned_ports(ocelot, in ocelot_apply_bridge_fwd_mask()
1863 } else if (ocelot_port->bridge) { in ocelot_apply_bridge_fwd_mask()
1864 struct net_device *bond = ocelot_port->bond; in ocelot_apply_bridge_fwd_mask()
1866 mask = ocelot_get_bridge_fwd_mask(ocelot, port); in ocelot_apply_bridge_fwd_mask()
1869 mask |= ocelot_port_assigned_dsa_8021q_cpu_mask(ocelot, in ocelot_apply_bridge_fwd_mask()
1873 mask &= ~ocelot_get_bond_mask(ocelot, bond); in ocelot_apply_bridge_fwd_mask()
1879 mask = ocelot_port_assigned_dsa_8021q_cpu_mask(ocelot, in ocelot_apply_bridge_fwd_mask()
1883 ocelot_write_rix(ocelot, mask, ANA_PGID_PGID, PGID_SRC + port); in ocelot_apply_bridge_fwd_mask()
1886 /* If cut-through forwarding is supported and a port is leaving, there in ocelot_apply_bridge_fwd_mask()
1887 * is a chance that cut-through was disabled on the other ports due to in ocelot_apply_bridge_fwd_mask()
1889 * update the cut-through masks of the remaining ports no earlier than in ocelot_apply_bridge_fwd_mask()
1891 * the cut-through update and the forwarding domain update. in ocelot_apply_bridge_fwd_mask()
1893 if (!joining && ocelot->ops->cut_through_fwd) in ocelot_apply_bridge_fwd_mask()
1894 ocelot->ops->cut_through_fwd(ocelot); in ocelot_apply_bridge_fwd_mask()
1904 static void ocelot_update_pgid_cpu(struct ocelot *ocelot) in ocelot_update_pgid_cpu() argument
1909 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_update_pgid_cpu()
1910 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_update_pgid_cpu()
1912 if (!ocelot_port || !ocelot_port->is_dsa_8021q_cpu) in ocelot_update_pgid_cpu()
1919 pgid_cpu = BIT(ocelot->num_phys_ports); in ocelot_update_pgid_cpu()
1921 ocelot_write_rix(ocelot, pgid_cpu, ANA_PGID_PGID, PGID_CPU); in ocelot_update_pgid_cpu()
1924 void ocelot_port_setup_dsa_8021q_cpu(struct ocelot *ocelot, int cpu) in ocelot_port_setup_dsa_8021q_cpu() argument
1926 struct ocelot_port *cpu_port = ocelot->ports[cpu]; in ocelot_port_setup_dsa_8021q_cpu()
1929 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_setup_dsa_8021q_cpu()
1931 cpu_port->is_dsa_8021q_cpu = true; in ocelot_port_setup_dsa_8021q_cpu()
1934 ocelot_vlan_member_add(ocelot, cpu, vid, true); in ocelot_port_setup_dsa_8021q_cpu()
1936 ocelot_update_pgid_cpu(ocelot); in ocelot_port_setup_dsa_8021q_cpu()
1938 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_setup_dsa_8021q_cpu()
1942 void ocelot_port_teardown_dsa_8021q_cpu(struct ocelot *ocelot, int cpu) in ocelot_port_teardown_dsa_8021q_cpu() argument
1944 struct ocelot_port *cpu_port = ocelot->ports[cpu]; in ocelot_port_teardown_dsa_8021q_cpu()
1947 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_teardown_dsa_8021q_cpu()
1949 cpu_port->is_dsa_8021q_cpu = false; in ocelot_port_teardown_dsa_8021q_cpu()
1952 ocelot_vlan_member_del(ocelot, cpu_port->index, vid); in ocelot_port_teardown_dsa_8021q_cpu()
1954 ocelot_update_pgid_cpu(ocelot); in ocelot_port_teardown_dsa_8021q_cpu()
1956 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_teardown_dsa_8021q_cpu()
1960 void ocelot_port_assign_dsa_8021q_cpu(struct ocelot *ocelot, int port, in ocelot_port_assign_dsa_8021q_cpu() argument
1963 struct ocelot_port *cpu_port = ocelot->ports[cpu]; in ocelot_port_assign_dsa_8021q_cpu()
1965 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_assign_dsa_8021q_cpu()
1967 ocelot->ports[port]->dsa_8021q_cpu = cpu_port; in ocelot_port_assign_dsa_8021q_cpu()
1968 ocelot_apply_bridge_fwd_mask(ocelot, true); in ocelot_port_assign_dsa_8021q_cpu()
1970 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_assign_dsa_8021q_cpu()
1974 void ocelot_port_unassign_dsa_8021q_cpu(struct ocelot *ocelot, int port) in ocelot_port_unassign_dsa_8021q_cpu() argument
1976 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_unassign_dsa_8021q_cpu()
1978 ocelot->ports[port]->dsa_8021q_cpu = NULL; in ocelot_port_unassign_dsa_8021q_cpu()
1979 ocelot_apply_bridge_fwd_mask(ocelot, true); in ocelot_port_unassign_dsa_8021q_cpu()
1981 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_unassign_dsa_8021q_cpu()
1985 void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, u8 state) in ocelot_bridge_stp_state_set() argument
1987 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_bridge_stp_state_set()
1990 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_bridge_stp_state_set()
1992 ocelot_port->stp_state = state; in ocelot_bridge_stp_state_set()
1995 ocelot_port->learn_ena) in ocelot_bridge_stp_state_set()
1998 ocelot_rmw_gix(ocelot, learn_ena, ANA_PORT_PORT_CFG_LEARN_ENA, in ocelot_bridge_stp_state_set()
2001 ocelot_apply_bridge_fwd_mask(ocelot, state == BR_STATE_FORWARDING); in ocelot_bridge_stp_state_set()
2003 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_bridge_stp_state_set()
2007 void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs) in ocelot_set_ageing_time() argument
2017 ocelot_rmw(ocelot, age_period, ANA_AUTOAGE_AGE_PERIOD_M, ANA_AUTOAGE); in ocelot_set_ageing_time()
2021 static struct ocelot_multicast *ocelot_multicast_get(struct ocelot *ocelot, in ocelot_multicast_get() argument
2027 list_for_each_entry(mc, &ocelot->multicast, list) { in ocelot_multicast_get()
2028 if (ether_addr_equal(mc->addr, addr) && mc->vid == vid) in ocelot_multicast_get()
2044 static struct ocelot_pgid *ocelot_pgid_alloc(struct ocelot *ocelot, int index, in ocelot_pgid_alloc() argument
2051 return ERR_PTR(-ENOMEM); in ocelot_pgid_alloc()
2053 pgid->ports = ports; in ocelot_pgid_alloc()
2054 pgid->index = index; in ocelot_pgid_alloc()
2055 refcount_set(&pgid->refcount, 1); in ocelot_pgid_alloc()
2056 list_add_tail(&pgid->list, &ocelot->pgids); in ocelot_pgid_alloc()
2061 static void ocelot_pgid_free(struct ocelot *ocelot, struct ocelot_pgid *pgid) in ocelot_pgid_free() argument
2063 if (!refcount_dec_and_test(&pgid->refcount)) in ocelot_pgid_free()
2066 list_del(&pgid->list); in ocelot_pgid_free()
2070 static struct ocelot_pgid *ocelot_mdb_get_pgid(struct ocelot *ocelot, in ocelot_mdb_get_pgid() argument
2081 if (mc->entry_type == ENTRYTYPE_MACv4 || in ocelot_mdb_get_pgid()
2082 mc->entry_type == ENTRYTYPE_MACv6) in ocelot_mdb_get_pgid()
2083 return ocelot_pgid_alloc(ocelot, 0, mc->ports); in ocelot_mdb_get_pgid()
2085 list_for_each_entry(pgid, &ocelot->pgids, list) { in ocelot_mdb_get_pgid()
2089 if (pgid->index && pgid->ports == mc->ports) { in ocelot_mdb_get_pgid()
2090 refcount_inc(&pgid->refcount); in ocelot_mdb_get_pgid()
2096 for_each_nonreserved_multicast_dest_pgid(ocelot, index) { in ocelot_mdb_get_pgid()
2099 list_for_each_entry(pgid, &ocelot->pgids, list) { in ocelot_mdb_get_pgid()
2100 if (pgid->index == index) { in ocelot_mdb_get_pgid()
2107 return ocelot_pgid_alloc(ocelot, index, mc->ports); in ocelot_mdb_get_pgid()
2110 return ERR_PTR(-ENOSPC); in ocelot_mdb_get_pgid()
2116 ether_addr_copy(addr, mc->addr); in ocelot_encode_ports_to_mdb()
2118 if (mc->entry_type == ENTRYTYPE_MACv4) { in ocelot_encode_ports_to_mdb()
2120 addr[1] = mc->ports >> 8; in ocelot_encode_ports_to_mdb()
2121 addr[2] = mc->ports & 0xff; in ocelot_encode_ports_to_mdb()
2122 } else if (mc->entry_type == ENTRYTYPE_MACv6) { in ocelot_encode_ports_to_mdb()
2123 addr[0] = mc->ports >> 8; in ocelot_encode_ports_to_mdb()
2124 addr[1] = mc->ports & 0xff; in ocelot_encode_ports_to_mdb()
2128 int ocelot_port_mdb_add(struct ocelot *ocelot, int port, in ocelot_port_mdb_add() argument
2135 u16 vid = mdb->vid; in ocelot_port_mdb_add()
2138 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_port_mdb_add()
2140 mc = ocelot_multicast_get(ocelot, mdb->addr, vid); in ocelot_port_mdb_add()
2143 mc = devm_kzalloc(ocelot->dev, sizeof(*mc), GFP_KERNEL); in ocelot_port_mdb_add()
2145 return -ENOMEM; in ocelot_port_mdb_add()
2147 mc->entry_type = ocelot_classify_mdb(mdb->addr); in ocelot_port_mdb_add()
2148 ether_addr_copy(mc->addr, mdb->addr); in ocelot_port_mdb_add()
2149 mc->vid = vid; in ocelot_port_mdb_add()
2151 list_add_tail(&mc->list, &ocelot->multicast); in ocelot_port_mdb_add()
2156 ocelot_pgid_free(ocelot, mc->pgid); in ocelot_port_mdb_add()
2158 ocelot_mact_forget(ocelot, addr, vid); in ocelot_port_mdb_add()
2161 mc->ports |= BIT(port); in ocelot_port_mdb_add()
2163 pgid = ocelot_mdb_get_pgid(ocelot, mc); in ocelot_port_mdb_add()
2165 dev_err(ocelot->dev, in ocelot_port_mdb_add()
2167 mc->addr, mc->vid); in ocelot_port_mdb_add()
2168 devm_kfree(ocelot->dev, mc); in ocelot_port_mdb_add()
2171 mc->pgid = pgid; in ocelot_port_mdb_add()
2175 if (mc->entry_type != ENTRYTYPE_MACv4 && in ocelot_port_mdb_add()
2176 mc->entry_type != ENTRYTYPE_MACv6) in ocelot_port_mdb_add()
2177 ocelot_write_rix(ocelot, pgid->ports, ANA_PGID_PGID, in ocelot_port_mdb_add()
2178 pgid->index); in ocelot_port_mdb_add()
2180 return ocelot_mact_learn(ocelot, pgid->index, addr, vid, in ocelot_port_mdb_add()
2181 mc->entry_type); in ocelot_port_mdb_add()
2185 int ocelot_port_mdb_del(struct ocelot *ocelot, int port, in ocelot_port_mdb_del() argument
2192 u16 vid = mdb->vid; in ocelot_port_mdb_del()
2195 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_port_mdb_del()
2197 mc = ocelot_multicast_get(ocelot, mdb->addr, vid); in ocelot_port_mdb_del()
2199 return -ENOENT; in ocelot_port_mdb_del()
2202 ocelot_mact_forget(ocelot, addr, vid); in ocelot_port_mdb_del()
2204 ocelot_pgid_free(ocelot, mc->pgid); in ocelot_port_mdb_del()
2205 mc->ports &= ~BIT(port); in ocelot_port_mdb_del()
2206 if (!mc->ports) { in ocelot_port_mdb_del()
2207 list_del(&mc->list); in ocelot_port_mdb_del()
2208 devm_kfree(ocelot->dev, mc); in ocelot_port_mdb_del()
2213 pgid = ocelot_mdb_get_pgid(ocelot, mc); in ocelot_port_mdb_del()
2216 mc->pgid = pgid; in ocelot_port_mdb_del()
2220 if (mc->entry_type != ENTRYTYPE_MACv4 && in ocelot_port_mdb_del()
2221 mc->entry_type != ENTRYTYPE_MACv6) in ocelot_port_mdb_del()
2222 ocelot_write_rix(ocelot, pgid->ports, ANA_PGID_PGID, in ocelot_port_mdb_del()
2223 pgid->index); in ocelot_port_mdb_del()
2225 return ocelot_mact_learn(ocelot, pgid->index, addr, vid, in ocelot_port_mdb_del()
2226 mc->entry_type); in ocelot_port_mdb_del()
2230 int ocelot_port_bridge_join(struct ocelot *ocelot, int port, in ocelot_port_bridge_join() argument
2234 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_bridge_join()
2237 err = ocelot_single_vlan_aware_bridge(ocelot, extack); in ocelot_port_bridge_join()
2241 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_bridge_join()
2243 ocelot_port->bridge = bridge; in ocelot_port_bridge_join()
2244 ocelot_port->bridge_num = bridge_num; in ocelot_port_bridge_join()
2246 ocelot_apply_bridge_fwd_mask(ocelot, true); in ocelot_port_bridge_join()
2248 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_bridge_join()
2253 return ocelot_add_vlan_unaware_pvid(ocelot, port, bridge); in ocelot_port_bridge_join()
2257 void ocelot_port_bridge_leave(struct ocelot *ocelot, int port, in ocelot_port_bridge_leave() argument
2260 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_bridge_leave()
2262 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_bridge_leave()
2265 ocelot_del_vlan_unaware_pvid(ocelot, port, bridge); in ocelot_port_bridge_leave()
2267 ocelot_port->bridge = NULL; in ocelot_port_bridge_leave()
2268 ocelot_port->bridge_num = -1; in ocelot_port_bridge_leave()
2270 ocelot_port_set_pvid(ocelot, port, NULL); in ocelot_port_bridge_leave()
2271 ocelot_port_manage_port_tag(ocelot, port); in ocelot_port_bridge_leave()
2272 ocelot_apply_bridge_fwd_mask(ocelot, false); in ocelot_port_bridge_leave()
2274 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_bridge_leave()
2278 static void ocelot_set_aggr_pgids(struct ocelot *ocelot) in ocelot_set_aggr_pgids() argument
2280 unsigned long visited = GENMASK(ocelot->num_phys_ports - 1, 0); in ocelot_set_aggr_pgids()
2284 for_each_unicast_dest_pgid(ocelot, port) in ocelot_set_aggr_pgids()
2285 ocelot_write_rix(ocelot, BIT(port), ANA_PGID_PGID, port); in ocelot_set_aggr_pgids()
2287 for_each_aggr_pgid(ocelot, i) in ocelot_set_aggr_pgids()
2288 ocelot_write_rix(ocelot, GENMASK(ocelot->num_phys_ports - 1, 0), in ocelot_set_aggr_pgids()
2299 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_set_aggr_pgids()
2300 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_set_aggr_pgids()
2302 if (!ocelot_port || !ocelot_port->bond) in ocelot_set_aggr_pgids()
2309 for (lag = 0; lag < ocelot->num_phys_ports; lag++) { in ocelot_set_aggr_pgids()
2310 struct net_device *bond = ocelot->ports[lag]->bond; in ocelot_set_aggr_pgids()
2318 bond_mask = ocelot_get_bond_mask(ocelot, bond); in ocelot_set_aggr_pgids()
2320 for_each_set_bit(port, &bond_mask, ocelot->num_phys_ports) { in ocelot_set_aggr_pgids()
2321 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_set_aggr_pgids()
2324 ocelot_write_rix(ocelot, bond_mask, in ocelot_set_aggr_pgids()
2327 if (ocelot_port->lag_tx_active) in ocelot_set_aggr_pgids()
2331 for_each_aggr_pgid(ocelot, i) { in ocelot_set_aggr_pgids()
2334 ac = ocelot_read_rix(ocelot, ANA_PGID_PGID, i); in ocelot_set_aggr_pgids()
2341 ocelot_write_rix(ocelot, ac, ANA_PGID_PGID, i); in ocelot_set_aggr_pgids()
2347 for (port = lag; port < ocelot->num_phys_ports; port++) { in ocelot_set_aggr_pgids()
2348 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_set_aggr_pgids()
2353 if (ocelot_port->bond == bond) in ocelot_set_aggr_pgids()
2364 static void ocelot_setup_logical_port_ids(struct ocelot *ocelot) in ocelot_setup_logical_port_ids() argument
2368 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_setup_logical_port_ids()
2369 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_setup_logical_port_ids()
2375 bond = ocelot_port->bond; in ocelot_setup_logical_port_ids()
2377 int lag = ocelot_bond_get_id(ocelot, bond); in ocelot_setup_logical_port_ids()
2379 ocelot_rmw_gix(ocelot, in ocelot_setup_logical_port_ids()
2384 ocelot_rmw_gix(ocelot, in ocelot_setup_logical_port_ids()
2392 static int ocelot_migrate_mc(struct ocelot *ocelot, struct ocelot_multicast *mc, in ocelot_migrate_mc() argument
2397 u16 vid = mc->vid; in ocelot_migrate_mc()
2399 dev_dbg(ocelot->dev, in ocelot_migrate_mc()
2401 mc->addr, mc->vid, from_mask, to_mask); in ocelot_migrate_mc()
2406 ocelot_pgid_free(ocelot, mc->pgid); in ocelot_migrate_mc()
2408 ocelot_mact_forget(ocelot, addr, vid); in ocelot_migrate_mc()
2410 mc->ports &= ~from_mask; in ocelot_migrate_mc()
2411 mc->ports |= to_mask; in ocelot_migrate_mc()
2413 pgid = ocelot_mdb_get_pgid(ocelot, mc); in ocelot_migrate_mc()
2415 dev_err(ocelot->dev, in ocelot_migrate_mc()
2417 mc->addr, mc->vid); in ocelot_migrate_mc()
2418 devm_kfree(ocelot->dev, mc); in ocelot_migrate_mc()
2421 mc->pgid = pgid; in ocelot_migrate_mc()
2425 if (mc->entry_type != ENTRYTYPE_MACv4 && in ocelot_migrate_mc()
2426 mc->entry_type != ENTRYTYPE_MACv6) in ocelot_migrate_mc()
2427 ocelot_write_rix(ocelot, pgid->ports, ANA_PGID_PGID, in ocelot_migrate_mc()
2428 pgid->index); in ocelot_migrate_mc()
2430 return ocelot_mact_learn(ocelot, pgid->index, addr, vid, in ocelot_migrate_mc()
2431 mc->entry_type); in ocelot_migrate_mc()
2434 int ocelot_migrate_mdbs(struct ocelot *ocelot, unsigned long from_mask, in ocelot_migrate_mdbs() argument
2440 list_for_each_entry(mc, &ocelot->multicast, list) { in ocelot_migrate_mdbs()
2441 if (!(mc->ports & from_mask)) in ocelot_migrate_mdbs()
2444 err = ocelot_migrate_mc(ocelot, mc, from_mask, to_mask); in ocelot_migrate_mdbs()
2463 static void ocelot_migrate_lag_fdbs(struct ocelot *ocelot, in ocelot_migrate_lag_fdbs() argument
2470 lockdep_assert_held(&ocelot->fwd_domain_lock); in ocelot_migrate_lag_fdbs()
2472 list_for_each_entry(fdb, &ocelot->lag_fdbs, list) { in ocelot_migrate_lag_fdbs()
2473 if (fdb->bond != bond) in ocelot_migrate_lag_fdbs()
2476 err = ocelot_mact_forget(ocelot, fdb->addr, fdb->vid); in ocelot_migrate_lag_fdbs()
2478 dev_err(ocelot->dev, in ocelot_migrate_lag_fdbs()
2480 bond->name, fdb->addr, fdb->vid, ERR_PTR(err)); in ocelot_migrate_lag_fdbs()
2483 err = ocelot_mact_learn(ocelot, lag, fdb->addr, fdb->vid, in ocelot_migrate_lag_fdbs()
2486 dev_err(ocelot->dev, in ocelot_migrate_lag_fdbs()
2488 bond->name, fdb->addr, fdb->vid, ERR_PTR(err)); in ocelot_migrate_lag_fdbs()
2493 int ocelot_port_lag_join(struct ocelot *ocelot, int port, in ocelot_port_lag_join() argument
2498 if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) { in ocelot_port_lag_join()
2501 return -EOPNOTSUPP; in ocelot_port_lag_join()
2504 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_lag_join()
2506 ocelot->ports[port]->bond = bond; in ocelot_port_lag_join()
2508 ocelot_setup_logical_port_ids(ocelot); in ocelot_port_lag_join()
2509 ocelot_apply_bridge_fwd_mask(ocelot, true); in ocelot_port_lag_join()
2510 ocelot_set_aggr_pgids(ocelot); in ocelot_port_lag_join()
2512 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_lag_join()
2518 void ocelot_port_lag_leave(struct ocelot *ocelot, int port, in ocelot_port_lag_leave() argument
2523 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_lag_leave()
2525 old_lag_id = ocelot_bond_get_id(ocelot, bond); in ocelot_port_lag_leave()
2527 ocelot->ports[port]->bond = NULL; in ocelot_port_lag_leave()
2529 ocelot_setup_logical_port_ids(ocelot); in ocelot_port_lag_leave()
2530 ocelot_apply_bridge_fwd_mask(ocelot, false); in ocelot_port_lag_leave()
2531 ocelot_set_aggr_pgids(ocelot); in ocelot_port_lag_leave()
2533 new_lag_id = ocelot_bond_get_id(ocelot, bond); in ocelot_port_lag_leave()
2536 ocelot_migrate_lag_fdbs(ocelot, bond, new_lag_id); in ocelot_port_lag_leave()
2538 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_lag_leave()
2542 void ocelot_port_lag_change(struct ocelot *ocelot, int port, bool lag_tx_active) in ocelot_port_lag_change() argument
2544 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_lag_change()
2546 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_port_lag_change()
2548 ocelot_port->lag_tx_active = lag_tx_active; in ocelot_port_lag_change()
2551 ocelot_set_aggr_pgids(ocelot); in ocelot_port_lag_change()
2553 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_port_lag_change()
2557 int ocelot_lag_fdb_add(struct ocelot *ocelot, struct net_device *bond, in ocelot_lag_fdb_add() argument
2566 return -ENOMEM; in ocelot_lag_fdb_add()
2568 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_lag_fdb_add()
2571 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_lag_fdb_add()
2573 ether_addr_copy(fdb->addr, addr); in ocelot_lag_fdb_add()
2574 fdb->vid = vid; in ocelot_lag_fdb_add()
2575 fdb->bond = bond; in ocelot_lag_fdb_add()
2577 lag = ocelot_bond_get_id(ocelot, bond); in ocelot_lag_fdb_add()
2579 err = ocelot_mact_learn(ocelot, lag, addr, vid, ENTRYTYPE_LOCKED); in ocelot_lag_fdb_add()
2581 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_lag_fdb_add()
2586 list_add_tail(&fdb->list, &ocelot->lag_fdbs); in ocelot_lag_fdb_add()
2587 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_lag_fdb_add()
2593 int ocelot_lag_fdb_del(struct ocelot *ocelot, struct net_device *bond, in ocelot_lag_fdb_del() argument
2599 mutex_lock(&ocelot->fwd_domain_lock); in ocelot_lag_fdb_del()
2602 vid = ocelot_vlan_unaware_pvid(ocelot, bridge); in ocelot_lag_fdb_del()
2604 list_for_each_entry_safe(fdb, tmp, &ocelot->lag_fdbs, list) { in ocelot_lag_fdb_del()
2605 if (!ether_addr_equal(fdb->addr, addr) || fdb->vid != vid || in ocelot_lag_fdb_del()
2606 fdb->bond != bond) in ocelot_lag_fdb_del()
2609 ocelot_mact_forget(ocelot, addr, vid); in ocelot_lag_fdb_del()
2610 list_del(&fdb->list); in ocelot_lag_fdb_del()
2611 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_lag_fdb_del()
2617 mutex_unlock(&ocelot->fwd_domain_lock); in ocelot_lag_fdb_del()
2619 return -ENOENT; in ocelot_lag_fdb_del()
2629 void ocelot_port_set_maxlen(struct ocelot *ocelot, int port, size_t sdu) in ocelot_port_set_maxlen() argument
2631 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_set_maxlen()
2636 if (port == ocelot->npi) { in ocelot_port_set_maxlen()
2639 if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_SHORT) in ocelot_port_set_maxlen()
2641 else if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_LONG) in ocelot_port_set_maxlen()
2650 ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_START, in ocelot_port_set_maxlen()
2652 ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_STOP, in ocelot_port_set_maxlen()
2656 atop_tot = (ocelot->packet_buffer_size - 9 * maxlen) / in ocelot_port_set_maxlen()
2659 ocelot_write_rix(ocelot, ocelot->ops->wm_enc(atop), SYS_ATOP, port); in ocelot_port_set_maxlen()
2660 ocelot_write(ocelot, ocelot->ops->wm_enc(atop_tot), SYS_ATOP_TOT_CFG); in ocelot_port_set_maxlen()
2664 int ocelot_get_max_mtu(struct ocelot *ocelot, int port) in ocelot_get_max_mtu() argument
2666 int max_mtu = 65535 - ETH_HLEN - ETH_FCS_LEN; in ocelot_get_max_mtu()
2668 if (port == ocelot->npi) { in ocelot_get_max_mtu()
2669 max_mtu -= OCELOT_TAG_LEN; in ocelot_get_max_mtu()
2671 if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_SHORT) in ocelot_get_max_mtu()
2672 max_mtu -= OCELOT_SHORT_PREFIX_LEN; in ocelot_get_max_mtu()
2673 else if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_LONG) in ocelot_get_max_mtu()
2674 max_mtu -= OCELOT_LONG_PREFIX_LEN; in ocelot_get_max_mtu()
2681 static void ocelot_port_set_learning(struct ocelot *ocelot, int port, in ocelot_port_set_learning() argument
2684 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_port_set_learning()
2690 ocelot_rmw_gix(ocelot, val, ANA_PORT_PORT_CFG_LEARN_ENA, in ocelot_port_set_learning()
2693 ocelot_port->learn_ena = enabled; in ocelot_port_set_learning()
2696 static void ocelot_port_set_ucast_flood(struct ocelot *ocelot, int port, in ocelot_port_set_ucast_flood() argument
2704 ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_UC); in ocelot_port_set_ucast_flood()
2707 static void ocelot_port_set_mcast_flood(struct ocelot *ocelot, int port, in ocelot_port_set_mcast_flood() argument
2715 ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_MC); in ocelot_port_set_mcast_flood()
2716 ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_MCIPV4); in ocelot_port_set_mcast_flood()
2717 ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_MCIPV6); in ocelot_port_set_mcast_flood()
2720 static void ocelot_port_set_bcast_flood(struct ocelot *ocelot, int port, in ocelot_port_set_bcast_flood() argument
2728 ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_BC); in ocelot_port_set_bcast_flood()
2731 int ocelot_port_pre_bridge_flags(struct ocelot *ocelot, int port, in ocelot_port_pre_bridge_flags() argument
2736 return -EINVAL; in ocelot_port_pre_bridge_flags()
2742 void ocelot_port_bridge_flags(struct ocelot *ocelot, int port, in ocelot_port_bridge_flags() argument
2746 ocelot_port_set_learning(ocelot, port, in ocelot_port_bridge_flags()
2750 ocelot_port_set_ucast_flood(ocelot, port, in ocelot_port_bridge_flags()
2754 ocelot_port_set_mcast_flood(ocelot, port, in ocelot_port_bridge_flags()
2758 ocelot_port_set_bcast_flood(ocelot, port, in ocelot_port_bridge_flags()
2763 int ocelot_port_get_default_prio(struct ocelot *ocelot, int port) in ocelot_port_get_default_prio() argument
2765 int val = ocelot_read_gix(ocelot, ANA_PORT_QOS_CFG, port); in ocelot_port_get_default_prio()
2771 int ocelot_port_set_default_prio(struct ocelot *ocelot, int port, u8 prio) in ocelot_port_set_default_prio() argument
2774 return -ERANGE; in ocelot_port_set_default_prio()
2776 ocelot_rmw_gix(ocelot, in ocelot_port_set_default_prio()
2782 return ocelot_update_vlan_reclassify_rule(ocelot, port); in ocelot_port_set_default_prio()
2786 int ocelot_port_get_dscp_prio(struct ocelot *ocelot, int port, u8 dscp) in ocelot_port_get_dscp_prio() argument
2788 int qos_cfg = ocelot_read_gix(ocelot, ANA_PORT_QOS_CFG, port); in ocelot_port_get_dscp_prio()
2789 int dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, dscp); in ocelot_port_get_dscp_prio()
2793 return -EOPNOTSUPP; in ocelot_port_get_dscp_prio()
2797 /* Re-read ANA_DSCP_CFG for the translated DSCP */ in ocelot_port_get_dscp_prio()
2798 dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, dscp); in ocelot_port_get_dscp_prio()
2802 * to VLAN PCP or port-based default. in ocelot_port_get_dscp_prio()
2805 return -EOPNOTSUPP; in ocelot_port_get_dscp_prio()
2811 int ocelot_port_add_dscp_prio(struct ocelot *ocelot, int port, u8 dscp, u8 prio) in ocelot_port_add_dscp_prio() argument
2816 return -ERANGE; in ocelot_port_add_dscp_prio()
2826 ocelot_rmw_gix(ocelot, ANA_PORT_QOS_CFG_QOS_DSCP_ENA, mask, in ocelot_port_add_dscp_prio()
2832 ocelot_write_rix(ocelot, val, ANA_DSCP_CFG, dscp); in ocelot_port_add_dscp_prio()
2838 int ocelot_port_del_dscp_prio(struct ocelot *ocelot, int port, u8 dscp, u8 prio) in ocelot_port_del_dscp_prio() argument
2840 int dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, dscp); in ocelot_port_del_dscp_prio()
2855 ocelot_write_rix(ocelot, 0, ANA_DSCP_CFG, dscp); in ocelot_port_del_dscp_prio()
2858 int dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, i); in ocelot_port_del_dscp_prio()
2873 ocelot_rmw_gix(ocelot, 0, mask, ANA_PORT_QOS_CFG, port); in ocelot_port_del_dscp_prio()
2879 struct ocelot_mirror *ocelot_mirror_get(struct ocelot *ocelot, int to, in ocelot_mirror_get() argument
2882 struct ocelot_mirror *m = ocelot->mirror; in ocelot_mirror_get()
2885 if (m->to != to) { in ocelot_mirror_get()
2888 return ERR_PTR(-EBUSY); in ocelot_mirror_get()
2891 refcount_inc(&m->refcount); in ocelot_mirror_get()
2897 return ERR_PTR(-ENOMEM); in ocelot_mirror_get()
2899 m->to = to; in ocelot_mirror_get()
2900 refcount_set(&m->refcount, 1); in ocelot_mirror_get()
2901 ocelot->mirror = m; in ocelot_mirror_get()
2904 ocelot_write(ocelot, BIT(to), ANA_MIRRORPORTS); in ocelot_mirror_get()
2909 void ocelot_mirror_put(struct ocelot *ocelot) in ocelot_mirror_put() argument
2911 struct ocelot_mirror *m = ocelot->mirror; in ocelot_mirror_put()
2913 if (!refcount_dec_and_test(&m->refcount)) in ocelot_mirror_put()
2916 ocelot_write(ocelot, 0, ANA_MIRRORPORTS); in ocelot_mirror_put()
2917 ocelot->mirror = NULL; in ocelot_mirror_put()
2921 int ocelot_port_mirror_add(struct ocelot *ocelot, int from, int to, in ocelot_port_mirror_add() argument
2924 struct ocelot_mirror *m = ocelot_mirror_get(ocelot, to, extack); in ocelot_port_mirror_add()
2930 ocelot_rmw_gix(ocelot, ANA_PORT_PORT_CFG_SRC_MIRROR_ENA, in ocelot_port_mirror_add()
2934 ocelot_rmw(ocelot, BIT(from), BIT(from), in ocelot_port_mirror_add()
2942 void ocelot_port_mirror_del(struct ocelot *ocelot, int from, bool ingress) in ocelot_port_mirror_del() argument
2945 ocelot_rmw_gix(ocelot, 0, ANA_PORT_PORT_CFG_SRC_MIRROR_ENA, in ocelot_port_mirror_del()
2948 ocelot_rmw(ocelot, 0, BIT(from), ANA_EMIRRORPORTS); in ocelot_port_mirror_del()
2951 ocelot_mirror_put(ocelot); in ocelot_port_mirror_del()
2955 static void ocelot_port_reset_mqprio(struct ocelot *ocelot, int port) in ocelot_port_reset_mqprio() argument
2957 struct net_device *dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_reset_mqprio()
2960 ocelot_port_change_fp(ocelot, port, 0); in ocelot_port_reset_mqprio()
2963 int ocelot_port_mqprio(struct ocelot *ocelot, int port, in ocelot_port_mqprio() argument
2966 struct net_device *dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_mqprio()
2967 struct netlink_ext_ack *extack = mqprio->extack; in ocelot_port_mqprio()
2968 struct tc_mqprio_qopt *qopt = &mqprio->qopt; in ocelot_port_mqprio()
2969 int num_tc = qopt->num_tc; in ocelot_port_mqprio()
2973 ocelot_port_reset_mqprio(ocelot, port); in ocelot_port_mqprio()
2982 if (qopt->count[tc] != 1) { in ocelot_port_mqprio()
2985 return -EINVAL; in ocelot_port_mqprio()
2988 err = netdev_set_tc_queue(dev, tc, 1, qopt->offset[tc]); in ocelot_port_mqprio()
2997 ocelot_port_change_fp(ocelot, port, mqprio->preemptible_tcs); in ocelot_port_mqprio()
3002 ocelot_port_reset_mqprio(ocelot, port); in ocelot_port_mqprio()
3007 void ocelot_init_port(struct ocelot *ocelot, int port) in ocelot_init_port() argument
3009 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_init_port()
3011 skb_queue_head_init(&ocelot_port->tx_skbs); in ocelot_init_port()
3031 ocelot_port_set_maxlen(ocelot, port, ETH_DATA_LEN); in ocelot_init_port()
3043 ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, 1); in ocelot_init_port()
3046 ocelot_rmw_gix(ocelot, ANA_PORT_DROP_CFG_DROP_MC_SMAC_ENA, in ocelot_init_port()
3051 ocelot_rmw_gix(ocelot, REW_PORT_VLAN_CFG_PORT_TPID(ETH_P_8021Q), in ocelot_init_port()
3056 ocelot_port_set_learning(ocelot, port, false); in ocelot_init_port()
3062 ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_LEARNAUTO | in ocelot_init_port()
3068 ocelot_vcap_enable(ocelot, port); in ocelot_init_port()
3076 static void ocelot_cpu_port_init(struct ocelot *ocelot) in ocelot_cpu_port_init() argument
3078 int cpu = ocelot->num_phys_ports; in ocelot_cpu_port_init()
3081 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, cpu); in ocelot_cpu_port_init()
3086 ocelot_write_rix(ocelot, BIT(cpu), ANA_PGID_PGID, PGID_CPU); in ocelot_cpu_port_init()
3087 ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_RECV_ENA | in ocelot_cpu_port_init()
3092 ocelot_fields_write(ocelot, cpu, QSYS_SWITCH_PORT_MODE_PORT_ENA, 1); in ocelot_cpu_port_init()
3094 ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_XTR_HDR, in ocelot_cpu_port_init()
3096 ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_INJ_HDR, in ocelot_cpu_port_init()
3100 ocelot_write_gix(ocelot, in ocelot_cpu_port_init()
3107 static void ocelot_detect_features(struct ocelot *ocelot) in ocelot_detect_features() argument
3111 /* For Ocelot, Felix, Seville, Serval etc, SYS:MMGT:MMGT:FREECNT holds in ocelot_detect_features()
3112 * the number of 240-byte free memory words (aka 4-cell chunks) and not in ocelot_detect_features()
3115 mmgt = ocelot_read(ocelot, SYS_MMGT); in ocelot_detect_features()
3116 ocelot->packet_buffer_size = 240 * SYS_MMGT_FREECNT(mmgt); in ocelot_detect_features()
3118 eq_ctrl = ocelot_read(ocelot, QSYS_EQ_CTRL); in ocelot_detect_features()
3119 ocelot->num_frame_refs = QSYS_MMGT_EQ_CTRL_FP_FREE_CNT(eq_ctrl); in ocelot_detect_features()
3122 static int ocelot_mem_init_status(struct ocelot *ocelot) in ocelot_mem_init_status() argument
3127 err = regmap_field_read(ocelot->regfields[SYS_RESET_CFG_MEM_INIT], in ocelot_mem_init_status()
3133 int ocelot_reset(struct ocelot *ocelot) in ocelot_reset() argument
3138 err = regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_INIT], 1); in ocelot_reset()
3142 err = regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_ENA], 1); in ocelot_reset()
3146 /* MEM_INIT is a self-clearing bit. Wait for it to be cleared (should be in ocelot_reset()
3149 err = readx_poll_timeout(ocelot_mem_init_status, ocelot, val, !val, in ocelot_reset()
3154 err = regmap_field_write(ocelot->regfields[SYS_RESET_CFG_MEM_ENA], 1); in ocelot_reset()
3158 return regmap_field_write(ocelot->regfields[SYS_RESET_CFG_CORE_ENA], 1); in ocelot_reset()
3162 int ocelot_init(struct ocelot *ocelot) in ocelot_init() argument
3167 if (ocelot->ops->reset) { in ocelot_init()
3168 ret = ocelot->ops->reset(ocelot); in ocelot_init()
3170 dev_err(ocelot->dev, "Switch reset failed\n"); in ocelot_init()
3175 mutex_init(&ocelot->mact_lock); in ocelot_init()
3176 mutex_init(&ocelot->fwd_domain_lock); in ocelot_init()
3177 spin_lock_init(&ocelot->ptp_clock_lock); in ocelot_init()
3178 spin_lock_init(&ocelot->ts_id_lock); in ocelot_init()
3179 spin_lock_init(&ocelot->inj_lock); in ocelot_init()
3180 spin_lock_init(&ocelot->xtr_lock); in ocelot_init()
3182 ocelot->owq = alloc_ordered_workqueue("ocelot-owq", 0); in ocelot_init()
3183 if (!ocelot->owq) in ocelot_init()
3184 return -ENOMEM; in ocelot_init()
3186 ret = ocelot_stats_init(ocelot); in ocelot_init()
3190 INIT_LIST_HEAD(&ocelot->multicast); in ocelot_init()
3191 INIT_LIST_HEAD(&ocelot->pgids); in ocelot_init()
3192 INIT_LIST_HEAD(&ocelot->vlans); in ocelot_init()
3193 INIT_LIST_HEAD(&ocelot->lag_fdbs); in ocelot_init()
3194 ocelot_detect_features(ocelot); in ocelot_init()
3195 ocelot_mact_init(ocelot); in ocelot_init()
3196 ocelot_vlan_init(ocelot); in ocelot_init()
3197 ocelot_vcap_init(ocelot); in ocelot_init()
3198 ocelot_cpu_port_init(ocelot); in ocelot_init()
3200 if (ocelot->ops->psfp_init) in ocelot_init()
3201 ocelot->ops->psfp_init(ocelot); in ocelot_init()
3203 if (ocelot->mm_supported) { in ocelot_init()
3204 ret = ocelot_mm_init(ocelot); in ocelot_init()
3209 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_init()
3211 ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port) | in ocelot_init()
3216 /* Only use S-Tag */ in ocelot_init()
3217 ocelot_write(ocelot, ETH_P_8021AD, SYS_VLAN_ETYPE_CFG); in ocelot_init()
3220 ocelot_write(ocelot, ANA_AGGR_CFG_AC_SMAC_ENA | in ocelot_init()
3231 ocelot_write(ocelot, in ocelot_init()
3236 regmap_field_write(ocelot->regfields[ANA_ADVLEARN_VLAN_CHK], 1); in ocelot_init()
3238 /* Setup frame ageing - fixed value "2 sec" - in 6.5 us units */ in ocelot_init()
3239 ocelot_write(ocelot, SYS_FRM_AGING_AGE_TX_ENA | in ocelot_init()
3243 for (i = 0; i < ocelot->num_flooding_pgids; i++) in ocelot_init()
3244 ocelot_write_rix(ocelot, ANA_FLOODING_FLD_MULTICAST(PGID_MC) | in ocelot_init()
3248 ocelot_write(ocelot, ANA_FLOODING_IPMC_FLD_MC6_DATA(PGID_MCIPV6) | in ocelot_init()
3254 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_init()
3256 ocelot_write_rix(ocelot, BIT(port), ANA_PGID_PGID, port); in ocelot_init()
3258 ocelot_write_gix(ocelot, in ocelot_init()
3263 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_SRC + port); in ocelot_init()
3266 for_each_nonreserved_multicast_dest_pgid(ocelot, i) { in ocelot_init()
3267 u32 val = ANA_PGID_PGID_PGID(GENMASK(ocelot->num_phys_ports - 1, 0)); in ocelot_init()
3269 ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i); in ocelot_init()
3272 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_BLACKHOLE); in ocelot_init()
3275 ocelot_rmw_rix(ocelot, ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)), in ocelot_init()
3276 ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)), in ocelot_init()
3278 ocelot_rmw_rix(ocelot, ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)), in ocelot_init()
3279 ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)), in ocelot_init()
3281 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_MCIPV4); in ocelot_init()
3282 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_MCIPV6); in ocelot_init()
3287 ocelot_write_rix(ocelot, QS_INJ_GRP_CFG_BYTE_SWAP | in ocelot_init()
3289 ocelot_write_rix(ocelot, QS_XTR_GRP_CFG_BYTE_SWAP | in ocelot_init()
3291 ocelot_write(ocelot, ANA_CPUQ_CFG_CPUQ_MIRROR(2) | in ocelot_init()
3301 ocelot_write_rix(ocelot, ANA_CPUQ_8021_CFG_CPUQ_GARP_VAL(6) | in ocelot_init()
3308 ocelot_stats_deinit(ocelot); in ocelot_init()
3310 destroy_workqueue(ocelot->owq); in ocelot_init()
3315 void ocelot_deinit(struct ocelot *ocelot) in ocelot_deinit() argument
3317 ocelot_stats_deinit(ocelot); in ocelot_deinit()
3318 destroy_workqueue(ocelot->owq); in ocelot_deinit()
3322 void ocelot_deinit_port(struct ocelot *ocelot, int port) in ocelot_deinit_port() argument
3324 struct ocelot_port *ocelot_port = ocelot->ports[port]; in ocelot_deinit_port()
3326 skb_queue_purge(&ocelot_port->tx_skbs); in ocelot_deinit_port()