OSDN Git Service

net: mscc: ocelot: move NPI port configuration to DSA
authorVladimir Oltean <vladimir.oltean@nxp.com>
Sat, 26 Sep 2020 19:32:01 +0000 (22:32 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 26 Sep 2020 21:17:58 +0000 (14:17 -0700)
Remove the ocelot_configure_cpu() function, which was in fact bringing
up 2 ports: the CPU port module, which both switchdev and DSA have, and
the NPI port, which only DSA has.

The (non-Ethernet) CPU port module is at a fixed index in the analyzer,
whereas the NPI port is selected through the "ethernet" property in the
device tree.

Therefore, the function to set up an NPI port is DSA-specific, so we
move it there, simplifying the ocelot switch library a little bit.

Cc: Horatiu Vultur <horatiu.vultur@microchip.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: UNGLinuxDriver <UNGLinuxDriver@microchip.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/ocelot/felix.c
drivers/net/ethernet/mscc/ocelot.c
drivers/net/ethernet/mscc/ocelot_vsc7514.c
include/soc/mscc/ocelot.h

index a56fc50..b8e1923 100644 (file)
@@ -439,6 +439,8 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
        ocelot->vcap_is2_actions= felix->info->vcap_is2_actions;
        ocelot->vcap            = felix->info->vcap;
        ocelot->ops             = felix->info->ops;
+       ocelot->inj_prefix      = OCELOT_TAG_PREFIX_NONE;
+       ocelot->xtr_prefix      = OCELOT_TAG_PREFIX_LONG;
 
        port_phy_modes = kcalloc(num_phys_ports, sizeof(phy_interface_t),
                                 GFP_KERNEL);
@@ -538,6 +540,28 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
        return 0;
 }
 
+/* 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.
+ */
+static void felix_npi_port_init(struct ocelot *ocelot, int port)
+{
+       ocelot->npi = port;
+
+       ocelot_write(ocelot, QSYS_EXT_CPU_CFG_EXT_CPUQ_MSK_M |
+                    QSYS_EXT_CPU_CFG_EXT_CPU_PORT(port),
+                    QSYS_EXT_CPU_CFG);
+
+       /* NPI port Injection/Extraction configuration */
+       ocelot_fields_write(ocelot, port, SYS_PORT_MODE_INCL_XTR_HDR,
+                           ocelot->xtr_prefix);
+       ocelot_fields_write(ocelot, port, SYS_PORT_MODE_INCL_INJ_HDR,
+                           ocelot->inj_prefix);
+
+       /* Disable transmission of pause frames */
+       ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, 0);
+}
+
 /* Hardware initialization done here so that we can allocate structures with
  * devm without fear of dsa_register_switch returning -EPROBE_DEFER and causing
  * us to allocate structures twice (leak memory) and map PCI memory twice
@@ -570,11 +594,8 @@ static int felix_setup(struct dsa_switch *ds)
        for (port = 0; port < ds->num_ports; port++) {
                ocelot_init_port(ocelot, port);
 
-               /* Bring up the CPU port module and configure the NPI port */
                if (dsa_is_cpu_port(ds, port))
-                       ocelot_configure_cpu(ocelot, port,
-                                            OCELOT_TAG_PREFIX_NONE,
-                                            OCELOT_TAG_PREFIX_LONG);
+                       felix_npi_port_init(ocelot, port);
 
                /* Set the default QoS Classification based on PCP and DEI
                 * bits of vlan tag.
index 0445c5e..b9375d9 100644 (file)
@@ -1346,22 +1346,14 @@ void ocelot_init_port(struct ocelot *ocelot, int port)
 }
 EXPORT_SYMBOL(ocelot_init_port);
 
-/* 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.
+/* Configure and enable the CPU port module, which is a set of queues
+ * accessible through register MMIO, frame DMA or Ethernet (in case
+ * NPI mode is used).
  */
-void ocelot_configure_cpu(struct ocelot *ocelot, int npi,
-                         enum ocelot_tag_prefix injection,
-                         enum ocelot_tag_prefix extraction)
+static void ocelot_cpu_port_init(struct ocelot *ocelot)
 {
        int cpu = ocelot->num_phys_ports;
 
-       ocelot->npi = npi;
-       ocelot->inj_prefix = injection;
-       ocelot->xtr_prefix = extraction;
-
        /* 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
@@ -1373,31 +1365,13 @@ void ocelot_configure_cpu(struct ocelot *ocelot, int npi,
                         ANA_PORT_PORT_CFG_PORTID_VAL(cpu),
                         ANA_PORT_PORT_CFG, cpu);
 
-       if (npi >= 0 && npi < ocelot->num_phys_ports) {
-               ocelot_write(ocelot, QSYS_EXT_CPU_CFG_EXT_CPUQ_MSK_M |
-                            QSYS_EXT_CPU_CFG_EXT_CPU_PORT(npi),
-                            QSYS_EXT_CPU_CFG);
-
-               /* Enable NPI port */
-               ocelot_fields_write(ocelot, npi,
-                                   QSYS_SWITCH_PORT_MODE_PORT_ENA, 1);
-               /* NPI port Injection/Extraction configuration */
-               ocelot_fields_write(ocelot, npi, SYS_PORT_MODE_INCL_XTR_HDR,
-                                   extraction);
-               ocelot_fields_write(ocelot, npi, SYS_PORT_MODE_INCL_INJ_HDR,
-                                   injection);
-
-               /* Disable transmission of pause frames */
-               ocelot_fields_write(ocelot, npi, SYS_PAUSE_CFG_PAUSE_ENA, 0);
-       }
-
        /* Enable CPU port module */
        ocelot_fields_write(ocelot, cpu, QSYS_SWITCH_PORT_MODE_PORT_ENA, 1);
        /* CPU port Injection/Extraction configuration */
        ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_XTR_HDR,
-                           extraction);
+                           ocelot->xtr_prefix);
        ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_INJ_HDR,
-                           injection);
+                           ocelot->inj_prefix);
 
        /* Configure the CPU port to be VLAN aware */
        ocelot_write_gix(ocelot, ANA_PORT_VLAN_CFG_VLAN_VID(0) |
@@ -1405,7 +1379,6 @@ void ocelot_configure_cpu(struct ocelot *ocelot, int npi,
                                 ANA_PORT_VLAN_CFG_VLAN_POP_CNT(1),
                         ANA_PORT_VLAN_CFG, cpu);
 }
-EXPORT_SYMBOL(ocelot_configure_cpu);
 
 int ocelot_init(struct ocelot *ocelot)
 {
@@ -1445,6 +1418,7 @@ int ocelot_init(struct ocelot *ocelot)
        ocelot_mact_init(ocelot);
        ocelot_vlan_init(ocelot);
        ocelot_vcap_init(ocelot);
+       ocelot_cpu_port_init(ocelot);
 
        for (port = 0; port < ocelot->num_phys_ports; port++) {
                /* Clear all counters (5 groups) */
index dfb1535..d7aef2f 100644 (file)
@@ -930,10 +930,6 @@ static int mscc_ocelot_init_ports(struct platform_device *pdev,
        if (!ocelot->ports)
                return -ENOMEM;
 
-       /* No NPI port */
-       ocelot_configure_cpu(ocelot, -1, OCELOT_TAG_PREFIX_NONE,
-                            OCELOT_TAG_PREFIX_NONE);
-
        for_each_available_child_of_node(ports, portnp) {
                struct ocelot_port_private *priv;
                struct ocelot_port *ocelot_port;
@@ -1120,6 +1116,9 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
        ocelot->vcap_is2_keys = vsc7514_vcap_is2_keys;
        ocelot->vcap_is2_actions = vsc7514_vcap_is2_actions;
        ocelot->vcap = vsc7514_vcap_props;
+       ocelot->inj_prefix = OCELOT_TAG_PREFIX_NONE;
+       ocelot->xtr_prefix = OCELOT_TAG_PREFIX_NONE;
+       ocelot->npi = -1;
 
        err = ocelot_init(ocelot);
        if (err)
index 3105bbb..349e839 100644 (file)
@@ -672,9 +672,6 @@ void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg,
 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_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);