net: mscc: ocelot: move NPI port configuration to DSA
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>
This commit is contained in:
parent
435be28b07
commit
2d44b097bb
|
@ -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_is2_actions= felix->info->vcap_is2_actions;
|
||||||
ocelot->vcap = felix->info->vcap;
|
ocelot->vcap = felix->info->vcap;
|
||||||
ocelot->ops = felix->info->ops;
|
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),
|
port_phy_modes = kcalloc(num_phys_ports, sizeof(phy_interface_t),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
@ -538,6 +540,28 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
|
||||||
return 0;
|
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
|
/* Hardware initialization done here so that we can allocate structures with
|
||||||
* devm without fear of dsa_register_switch returning -EPROBE_DEFER and causing
|
* devm without fear of dsa_register_switch returning -EPROBE_DEFER and causing
|
||||||
* us to allocate structures twice (leak memory) and map PCI memory twice
|
* 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++) {
|
for (port = 0; port < ds->num_ports; port++) {
|
||||||
ocelot_init_port(ocelot, port);
|
ocelot_init_port(ocelot, port);
|
||||||
|
|
||||||
/* Bring up the CPU port module and configure the NPI port */
|
|
||||||
if (dsa_is_cpu_port(ds, port))
|
if (dsa_is_cpu_port(ds, port))
|
||||||
ocelot_configure_cpu(ocelot, port,
|
felix_npi_port_init(ocelot, port);
|
||||||
OCELOT_TAG_PREFIX_NONE,
|
|
||||||
OCELOT_TAG_PREFIX_LONG);
|
|
||||||
|
|
||||||
/* Set the default QoS Classification based on PCP and DEI
|
/* Set the default QoS Classification based on PCP and DEI
|
||||||
* bits of vlan tag.
|
* bits of vlan tag.
|
||||||
|
|
|
@ -1346,22 +1346,14 @@ void ocelot_init_port(struct ocelot *ocelot, int port)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ocelot_init_port);
|
EXPORT_SYMBOL(ocelot_init_port);
|
||||||
|
|
||||||
/* Configure and enable the CPU port module, which is a set of queues.
|
/* 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
|
* accessible through register MMIO, frame DMA or Ethernet (in case
|
||||||
* to the Node Processor Interface (NPI). This is the mode through which
|
* NPI mode is used).
|
||||||
* frames can be injected from and extracted to an external CPU,
|
|
||||||
* over Ethernet.
|
|
||||||
*/
|
*/
|
||||||
void ocelot_configure_cpu(struct ocelot *ocelot, int npi,
|
static void ocelot_cpu_port_init(struct ocelot *ocelot)
|
||||||
enum ocelot_tag_prefix injection,
|
|
||||||
enum ocelot_tag_prefix extraction)
|
|
||||||
{
|
{
|
||||||
int cpu = ocelot->num_phys_ports;
|
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 */
|
/* The unicast destination PGID for the CPU port module is unused */
|
||||||
ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, cpu);
|
ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, cpu);
|
||||||
/* Instead set up a multicast destination PGID for traffic copied to
|
/* 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_PORTID_VAL(cpu),
|
||||||
ANA_PORT_PORT_CFG, 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 */
|
/* Enable CPU port module */
|
||||||
ocelot_fields_write(ocelot, cpu, QSYS_SWITCH_PORT_MODE_PORT_ENA, 1);
|
ocelot_fields_write(ocelot, cpu, QSYS_SWITCH_PORT_MODE_PORT_ENA, 1);
|
||||||
/* CPU port Injection/Extraction configuration */
|
/* CPU port Injection/Extraction configuration */
|
||||||
ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_XTR_HDR,
|
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,
|
ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_INJ_HDR,
|
||||||
injection);
|
ocelot->inj_prefix);
|
||||||
|
|
||||||
/* Configure the CPU port to be VLAN aware */
|
/* Configure the CPU port to be VLAN aware */
|
||||||
ocelot_write_gix(ocelot, ANA_PORT_VLAN_CFG_VLAN_VID(0) |
|
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_VLAN_POP_CNT(1),
|
||||||
ANA_PORT_VLAN_CFG, cpu);
|
ANA_PORT_VLAN_CFG, cpu);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ocelot_configure_cpu);
|
|
||||||
|
|
||||||
int ocelot_init(struct ocelot *ocelot)
|
int ocelot_init(struct ocelot *ocelot)
|
||||||
{
|
{
|
||||||
|
@ -1445,6 +1418,7 @@ int ocelot_init(struct ocelot *ocelot)
|
||||||
ocelot_mact_init(ocelot);
|
ocelot_mact_init(ocelot);
|
||||||
ocelot_vlan_init(ocelot);
|
ocelot_vlan_init(ocelot);
|
||||||
ocelot_vcap_init(ocelot);
|
ocelot_vcap_init(ocelot);
|
||||||
|
ocelot_cpu_port_init(ocelot);
|
||||||
|
|
||||||
for (port = 0; port < ocelot->num_phys_ports; port++) {
|
for (port = 0; port < ocelot->num_phys_ports; port++) {
|
||||||
/* Clear all counters (5 groups) */
|
/* Clear all counters (5 groups) */
|
||||||
|
|
|
@ -930,10 +930,6 @@ static int mscc_ocelot_init_ports(struct platform_device *pdev,
|
||||||
if (!ocelot->ports)
|
if (!ocelot->ports)
|
||||||
return -ENOMEM;
|
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) {
|
for_each_available_child_of_node(ports, portnp) {
|
||||||
struct ocelot_port_private *priv;
|
struct ocelot_port_private *priv;
|
||||||
struct ocelot_port *ocelot_port;
|
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_keys = vsc7514_vcap_is2_keys;
|
||||||
ocelot->vcap_is2_actions = vsc7514_vcap_is2_actions;
|
ocelot->vcap_is2_actions = vsc7514_vcap_is2_actions;
|
||||||
ocelot->vcap = vsc7514_vcap_props;
|
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);
|
err = ocelot_init(ocelot);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -672,9 +672,6 @@ void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg,
|
||||||
int ocelot_regfields_init(struct ocelot *ocelot,
|
int ocelot_regfields_init(struct ocelot *ocelot,
|
||||||
const struct reg_field *const regfields);
|
const struct reg_field *const regfields);
|
||||||
struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res);
|
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);
|
int ocelot_init(struct ocelot *ocelot);
|
||||||
void ocelot_deinit(struct ocelot *ocelot);
|
void ocelot_deinit(struct ocelot *ocelot);
|
||||||
void ocelot_init_port(struct ocelot *ocelot, int port);
|
void ocelot_init_port(struct ocelot *ocelot, int port);
|
||||||
|
|
Loading…
Reference in New Issue