* a source for the other ports.
         */
        for (p = 0; p < ocelot->num_phys_ports; p++) {
-               if (p == ocelot->cpu || (ocelot->bridge_fwd_mask & BIT(p))) {
+               if (ocelot->bridge_fwd_mask & BIT(p)) {
                        unsigned long mask = ocelot->bridge_fwd_mask & ~BIT(p);
 
                        for (i = 0; i < ocelot->num_phys_ports; i++) {
                                }
                        }
 
-                       /* Avoid the NPI port from looping back to itself */
-                       if (p != ocelot->cpu)
-                               mask |= BIT(ocelot->cpu);
-
                        ocelot_write_rix(ocelot, mask,
                                         ANA_PGID_PGID, PGID_SRC + p);
                } else {
-                       /* Only the CPU port, this is compatible with link
-                        * aggregation.
-                        */
-                       ocelot_write_rix(ocelot,
-                                        BIT(ocelot->cpu),
+                       ocelot_write_rix(ocelot, 0,
                                         ANA_PGID_PGID, PGID_SRC + p);
                }
        }
 }
 EXPORT_SYMBOL(ocelot_probe_port);
 
-void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu,
-                        enum ocelot_tag_prefix injection,
-                        enum ocelot_tag_prefix extraction)
+/* Configure and enable the CPU port module, which is a set of queues.
+ * If @npi contains a valid port index, the CPU port module is connected
+ * to the Node Processor Interface (NPI). This is the mode through which
+ * frames can be injected from and extracted to an external CPU,
+ * over Ethernet.
+ */
+void ocelot_configure_cpu(struct ocelot *ocelot, int npi,
+                         enum ocelot_tag_prefix injection,
+                         enum ocelot_tag_prefix extraction)
 {
-       /* Configure and enable the CPU port. */
+       int cpu = ocelot->num_phys_ports;
+
+       /* The unicast destination PGID for the CPU port module is unused */
        ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, cpu);
+       /* Instead set up a multicast destination PGID for traffic copied to
+        * the CPU. Whitelisted MAC addresses like the port netdevice MAC
+        * addresses will be copied to the CPU via this PGID.
+        */
        ocelot_write_rix(ocelot, BIT(cpu), ANA_PGID_PGID, PGID_CPU);
        ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_RECV_ENA |
                         ANA_PORT_PORT_CFG_PORTID_VAL(cpu),
                         ANA_PORT_PORT_CFG, cpu);
 
-       /* If the CPU port is a physical port, set up the port in Node
-        * Processor Interface (NPI) mode. This is the mode through which
-        * frames can be injected from and extracted to an external CPU.
-        * Only one port can be an NPI at the same time.
-        */
-       if (cpu < ocelot->num_phys_ports) {
+       if (npi >= 0 && npi < ocelot->num_phys_ports) {
                int mtu = VLAN_ETH_FRAME_LEN + OCELOT_TAG_LEN;
 
                ocelot_write(ocelot, QSYS_EXT_CPU_CFG_EXT_CPUQ_MSK_M |
-                            QSYS_EXT_CPU_CFG_EXT_CPU_PORT(cpu),
+                            QSYS_EXT_CPU_CFG_EXT_CPU_PORT(npi),
                             QSYS_EXT_CPU_CFG);
 
                if (injection == OCELOT_TAG_PREFIX_SHORT)
                else if (injection == OCELOT_TAG_PREFIX_LONG)
                        mtu += OCELOT_LONG_PREFIX_LEN;
 
-               ocelot_port_set_mtu(ocelot, cpu, mtu);
+               ocelot_port_set_mtu(ocelot, npi, mtu);
+
+               /* Enable NPI port */
+               ocelot_write_rix(ocelot,
+                                QSYS_SWITCH_PORT_MODE_INGRESS_DROP_MODE |
+                                QSYS_SWITCH_PORT_MODE_SCH_NEXT_CFG(1) |
+                                QSYS_SWITCH_PORT_MODE_PORT_ENA,
+                                QSYS_SWITCH_PORT_MODE, npi);
+               /* NPI port Injection/Extraction configuration */
+               ocelot_write_rix(ocelot,
+                                SYS_PORT_MODE_INCL_XTR_HDR(extraction) |
+                                SYS_PORT_MODE_INCL_INJ_HDR(injection),
+                                SYS_PORT_MODE, npi);
        }
 
-       /* CPU port Injection/Extraction configuration */
+       /* Enable CPU port module */
        ocelot_write_rix(ocelot, QSYS_SWITCH_PORT_MODE_INGRESS_DROP_MODE |
                         QSYS_SWITCH_PORT_MODE_SCH_NEXT_CFG(1) |
                         QSYS_SWITCH_PORT_MODE_PORT_ENA,
                         QSYS_SWITCH_PORT_MODE, cpu);
+       /* CPU port Injection/Extraction configuration */
        ocelot_write_rix(ocelot, SYS_PORT_MODE_INCL_XTR_HDR(extraction) |
                         SYS_PORT_MODE_INCL_INJ_HDR(injection),
                         SYS_PORT_MODE, cpu);
                                 ANA_PORT_VLAN_CFG_VLAN_AWARE_ENA |
                                 ANA_PORT_VLAN_CFG_VLAN_POP_CNT(1),
                         ANA_PORT_VLAN_CFG, cpu);
-
-       ocelot->cpu = cpu;
 }
-EXPORT_SYMBOL(ocelot_set_cpu_port);
+EXPORT_SYMBOL(ocelot_configure_cpu);
 
 int ocelot_init(struct ocelot *ocelot)
 {
 
        /* Keep track of the vlan port masks */
        u32                             vlan_mask[VLAN_N_VID];
 
+       /* In tables like ANA:PORT and the ANA:PGID:PGID mask,
+        * the CPU is located after the physical ports (at the
+        * num_phys_ports index).
+        */
        u8                              num_phys_ports;
-       u8                              num_cpu_ports;
-       u8                              cpu;
 
        u32                             *lags;
 
 int ocelot_regfields_init(struct ocelot *ocelot,
                          const struct reg_field *const regfields);
 struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res);
-void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu,
-                        enum ocelot_tag_prefix injection,
-                        enum ocelot_tag_prefix extraction);
+void ocelot_configure_cpu(struct ocelot *ocelot, int npi,
+                         enum ocelot_tag_prefix injection,
+                         enum ocelot_tag_prefix extraction);
 int ocelot_init(struct ocelot *ocelot);
 void ocelot_deinit(struct ocelot *ocelot);
 void ocelot_init_port(struct ocelot *ocelot, int port);