net: dsa: sja1105: parameterize the number of ports
authorVladimir Oltean <vladimir.oltean@nxp.com>
Mon, 24 May 2021 13:14:13 +0000 (16:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 May 2021 20:59:03 +0000 (13:59 -0700)
The sja1105 driver will gain support for the next-gen SJA1110 switch,
which is very similar except for the fact it has more than 5 ports.

So we need to replace the hardcoded SJA1105_NUM_PORTS in this driver
with ds->num_ports. This patch is as mechanical as possible (save for
the fact that ds->num_ports is not an integer constant expression).

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/sja1105/sja1105_clocking.c
drivers/net/dsa/sja1105/sja1105_flower.c
drivers/net/dsa/sja1105/sja1105_main.c
drivers/net/dsa/sja1105/sja1105_spi.c
drivers/net/dsa/sja1105/sja1105_tas.c

index 2a9b8a6..f54b4d0 100644 (file)
@@ -721,9 +721,10 @@ int sja1105_clocking_setup_port(struct sja1105_private *priv, int port)
 
 int sja1105_clocking_setup(struct sja1105_private *priv)
 {
+       struct dsa_switch *ds = priv->ds;
        int port, rc;
 
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                rc = sja1105_clocking_setup_port(priv, port);
                if (rc < 0)
                        return rc;
index 9737611..77c5412 100644 (file)
@@ -35,6 +35,7 @@ static int sja1105_setup_bcast_policer(struct sja1105_private *priv,
 {
        struct sja1105_rule *rule = sja1105_rule_find(priv, cookie);
        struct sja1105_l2_policing_entry *policing;
+       struct dsa_switch *ds = priv->ds;
        bool new_rule = false;
        unsigned long p;
        int rc;
@@ -59,7 +60,7 @@ static int sja1105_setup_bcast_policer(struct sja1105_private *priv,
 
        policing = priv->static_config.tables[BLK_IDX_L2_POLICING].entries;
 
-       if (policing[(SJA1105_NUM_PORTS * SJA1105_NUM_TC) + port].sharindx != port) {
+       if (policing[(ds->num_ports * SJA1105_NUM_TC) + port].sharindx != port) {
                NL_SET_ERR_MSG_MOD(extack,
                                   "Port already has a broadcast policer");
                rc = -EEXIST;
@@ -72,7 +73,7 @@ static int sja1105_setup_bcast_policer(struct sja1105_private *priv,
         * point to the newly allocated policer
         */
        for_each_set_bit(p, &rule->port_mask, SJA1105_NUM_PORTS) {
-               int bcast = (SJA1105_NUM_PORTS * SJA1105_NUM_TC) + p;
+               int bcast = (ds->num_ports * SJA1105_NUM_TC) + p;
 
                policing[bcast].sharindx = rule->bcast_pol.sharindx;
        }
@@ -435,7 +436,7 @@ int sja1105_cls_flower_del(struct dsa_switch *ds, int port,
        policing = priv->static_config.tables[BLK_IDX_L2_POLICING].entries;
 
        if (rule->type == SJA1105_RULE_BCAST_POLICER) {
-               int bcast = (SJA1105_NUM_PORTS * SJA1105_NUM_TC) + port;
+               int bcast = (ds->num_ports * SJA1105_NUM_TC) + port;
 
                old_sharindx = policing[bcast].sharindx;
                policing[bcast].sharindx = port;
@@ -486,7 +487,7 @@ void sja1105_flower_setup(struct dsa_switch *ds)
 
        INIT_LIST_HEAD(&priv->flow_block.rules);
 
-       for (port = 0; port < SJA1105_NUM_PORTS; port++)
+       for (port = 0; port < ds->num_ports; port++)
                priv->flow_block.l2_policer_used[port] = true;
 }
 
index 802314e..ed98bb5 100644 (file)
@@ -106,6 +106,7 @@ static int sja1105_init_mac_settings(struct sja1105_private *priv)
                .ingress = false,
        };
        struct sja1105_mac_config_entry *mac;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_table *table;
        int i;
 
@@ -117,16 +118,16 @@ static int sja1105_init_mac_settings(struct sja1105_private *priv)
                table->entry_count = 0;
        }
 
-       table->entries = kcalloc(SJA1105_NUM_PORTS,
+       table->entries = kcalloc(ds->num_ports,
                                 table->ops->unpacked_entry_size, GFP_KERNEL);
        if (!table->entries)
                return -ENOMEM;
 
-       table->entry_count = SJA1105_NUM_PORTS;
+       table->entry_count = ds->num_ports;
 
        mac = table->entries;
 
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                mac[i] = default_mac;
                if (i == dsa_upstream_port(priv->ds, i)) {
                        /* STP doesn't get called for CPU port, so we need to
@@ -161,6 +162,7 @@ static int sja1105_init_mii_settings(struct sja1105_private *priv,
 {
        struct device *dev = &priv->spidev->dev;
        struct sja1105_xmii_params_entry *mii;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_table *table;
        int i;
 
@@ -182,7 +184,7 @@ static int sja1105_init_mii_settings(struct sja1105_private *priv,
 
        mii = table->entries;
 
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                if (dsa_is_unused_port(priv->ds, i))
                        continue;
 
@@ -265,8 +267,6 @@ static int sja1105_init_static_fdb(struct sja1105_private *priv)
 
 static int sja1105_init_l2_lookup_params(struct sja1105_private *priv)
 {
-       struct sja1105_table *table;
-       u64 max_fdb_entries = SJA1105_MAX_L2_LOOKUP_COUNT / SJA1105_NUM_PORTS;
        struct sja1105_l2_lookup_params_entry default_l2_lookup_params = {
                /* Learned FDB entries are forgotten after 300 seconds */
                .maxage = SJA1105_AGEING_TIME_MS(300000),
@@ -274,8 +274,6 @@ static int sja1105_init_l2_lookup_params(struct sja1105_private *priv)
                .dyn_tbsz = SJA1105ET_FDB_BIN_SIZE,
                /* And the P/Q/R/S equivalent setting: */
                .start_dynspc = 0,
-               .maxaddrp = {max_fdb_entries, max_fdb_entries, max_fdb_entries,
-                            max_fdb_entries, max_fdb_entries, },
                /* 2^8 + 2^5 + 2^3 + 2^2 + 2^1 + 1 in Koopman notation */
                .poly = 0x97,
                /* This selects between Independent VLAN Learning (IVL) and
@@ -299,6 +297,15 @@ static int sja1105_init_l2_lookup_params(struct sja1105_private *priv)
                .owr_dyn = true,
                .drpnolearn = true,
        };
+       struct dsa_switch *ds = priv->ds;
+       struct sja1105_table *table;
+       u64 max_fdb_entries;
+       int port;
+
+       max_fdb_entries = SJA1105_MAX_L2_LOOKUP_COUNT / ds->num_ports;
+
+       for (port = 0; port < ds->num_ports; port++)
+               default_l2_lookup_params.maxaddrp[port] = max_fdb_entries;
 
        table = &priv->static_config.tables[BLK_IDX_L2_LOOKUP_PARAMS];
 
@@ -388,6 +395,7 @@ static int sja1105_init_static_vlan(struct sja1105_private *priv)
 static int sja1105_init_l2_forwarding(struct sja1105_private *priv)
 {
        struct sja1105_l2_forwarding_entry *l2fwd;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_table *table;
        int i, j;
 
@@ -408,7 +416,7 @@ static int sja1105_init_l2_forwarding(struct sja1105_private *priv)
        l2fwd = table->entries;
 
        /* First 5 entries define the forwarding rules */
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                unsigned int upstream = dsa_upstream_port(priv->ds, i);
 
                for (j = 0; j < SJA1105_NUM_TC; j++)
@@ -436,8 +444,8 @@ static int sja1105_init_l2_forwarding(struct sja1105_private *priv)
         * Create a one-to-one mapping.
         */
        for (i = 0; i < SJA1105_NUM_TC; i++)
-               for (j = 0; j < SJA1105_NUM_PORTS; j++)
-                       l2fwd[SJA1105_NUM_PORTS + i].vlan_pmap[j] = i;
+               for (j = 0; j < ds->num_ports; j++)
+                       l2fwd[ds->num_ports + i].vlan_pmap[j] = i;
 
        return 0;
 }
@@ -533,7 +541,7 @@ static int sja1105_init_general_params(struct sja1105_private *priv)
                 */
                .host_port = dsa_upstream_port(priv->ds, 0),
                /* Default to an invalid value */
-               .mirr_port = SJA1105_NUM_PORTS,
+               .mirr_port = priv->ds->num_ports,
                /* Link-local traffic received on casc_port will be forwarded
                 * to host_port without embedding the source port and device ID
                 * info in the destination MAC address (presumably because it
@@ -541,7 +549,7 @@ static int sja1105_init_general_params(struct sja1105_private *priv)
                 * that). Default to an invalid port (to disable the feature)
                 * and overwrite this if we find any DSA (cascaded) ports.
                 */
-               .casc_port = SJA1105_NUM_PORTS,
+               .casc_port = priv->ds->num_ports,
                /* No TTEthernet */
                .vllupformat = SJA1105_VL_FORMAT_PSFP,
                .vlmarker = 0,
@@ -662,6 +670,7 @@ static int sja1105_init_avb_params(struct sja1105_private *priv)
 static int sja1105_init_l2_policing(struct sja1105_private *priv)
 {
        struct sja1105_l2_policing_entry *policing;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_table *table;
        int port, tc;
 
@@ -683,8 +692,8 @@ static int sja1105_init_l2_policing(struct sja1105_private *priv)
        policing = table->entries;
 
        /* Setup shared indices for the matchall policers */
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
-               int bcast = (SJA1105_NUM_PORTS * SJA1105_NUM_TC) + port;
+       for (port = 0; port < ds->num_ports; port++) {
+               int bcast = (ds->num_ports * SJA1105_NUM_TC) + port;
 
                for (tc = 0; tc < SJA1105_NUM_TC; tc++)
                        policing[port * SJA1105_NUM_TC + tc].sharindx = port;
@@ -693,7 +702,7 @@ static int sja1105_init_l2_policing(struct sja1105_private *priv)
        }
 
        /* Setup the matchall policer parameters */
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                int mtu = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN;
 
                if (dsa_is_cpu_port(priv->ds, port))
@@ -759,9 +768,10 @@ static int sja1105_static_config_load(struct sja1105_private *priv,
 static int sja1105_parse_rgmii_delays(struct sja1105_private *priv,
                                      const struct sja1105_dt_port *ports)
 {
+       struct dsa_switch *ds = priv->ds;
        int i;
 
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                if (ports[i].role == XMII_MAC)
                        continue;
 
@@ -1636,7 +1646,7 @@ static int sja1105_bridge_member(struct dsa_switch *ds, int port,
 
        l2_fwd = priv->static_config.tables[BLK_IDX_L2_FORWARDING].entries;
 
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                /* Add this port to the forwarding matrix of the
                 * other ports in the same bridge, and viceversa.
                 */
@@ -1852,7 +1862,7 @@ int sja1105_static_config_reload(struct sja1105_private *priv,
         * switch wants to see in the static config in order to allow us to
         * change it through the dynamic interface later.
         */
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                speed_mbps[i] = sja1105_speed[mac[i].speed];
                mac[i].speed = SJA1105_SPEED_AUTO;
        }
@@ -1904,7 +1914,7 @@ out_unlock_ptp:
        if (rc < 0)
                goto out;
 
-       for (i = 0; i < SJA1105_NUM_PORTS; i++) {
+       for (i = 0; i < ds->num_ports; i++) {
                rc = sja1105_adjust_port_config(priv, i, speed_mbps[i]);
                if (rc < 0)
                        goto out;
@@ -3022,7 +3032,7 @@ static void sja1105_teardown(struct dsa_switch *ds)
        struct sja1105_bridge_vlan *v, *n;
        int port;
 
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                struct sja1105_port *sp = &priv->ports[port];
 
                if (!dsa_is_user_port(ds, port))
@@ -3225,6 +3235,7 @@ static int sja1105_mirror_apply(struct sja1105_private *priv, int from, int to,
 {
        struct sja1105_general_params_entry *general_params;
        struct sja1105_mac_config_entry *mac;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_table *table;
        bool already_enabled;
        u64 new_mirr_port;
@@ -3235,7 +3246,7 @@ static int sja1105_mirror_apply(struct sja1105_private *priv, int from, int to,
 
        mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
 
-       already_enabled = (general_params->mirr_port != SJA1105_NUM_PORTS);
+       already_enabled = (general_params->mirr_port != ds->num_ports);
        if (already_enabled && enabled && general_params->mirr_port != to) {
                dev_err(priv->ds->dev,
                        "Delete mirroring rules towards port %llu first\n",
@@ -3249,7 +3260,7 @@ static int sja1105_mirror_apply(struct sja1105_private *priv, int from, int to,
                int port;
 
                /* Anybody still referencing mirr_port? */
-               for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+               for (port = 0; port < ds->num_ports; port++) {
                        if (mac[port].ing_mirr || mac[port].egr_mirr) {
                                keep = true;
                                break;
@@ -3257,7 +3268,7 @@ static int sja1105_mirror_apply(struct sja1105_private *priv, int from, int to,
                }
                /* Unset already_enabled for next time */
                if (!keep)
-                       new_mirr_port = SJA1105_NUM_PORTS;
+                       new_mirr_port = ds->num_ports;
        }
        if (new_mirr_port != general_params->mirr_port) {
                general_params->mirr_port = new_mirr_port;
@@ -3679,7 +3690,7 @@ static int sja1105_probe(struct spi_device *spi)
        }
 
        /* Connections between dsa_port and sja1105_port */
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                struct sja1105_port *sp = &priv->ports[port];
                struct dsa_port *dp = dsa_to_port(ds, port);
                struct net_device *slave;
index df3a780..f22340e 100644 (file)
@@ -309,10 +309,10 @@ int static_config_buf_prepare_for_upload(struct sja1105_private *priv,
 
 int sja1105_static_config_upload(struct sja1105_private *priv)
 {
-       unsigned long port_bitmap = GENMASK_ULL(SJA1105_NUM_PORTS - 1, 0);
        struct sja1105_static_config *config = &priv->static_config;
        const struct sja1105_regs *regs = priv->info->regs;
        struct device *dev = &priv->spidev->dev;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_status status;
        int rc, retries = RETRIES;
        u8 *config_buf;
@@ -333,7 +333,7 @@ int sja1105_static_config_upload(struct sja1105_private *priv)
         * Tx on all ports and waiting for current packet to drain.
         * Otherwise, the PHY will see an unterminated Ethernet packet.
         */
-       rc = sja1105_inhibit_tx(priv, port_bitmap, true);
+       rc = sja1105_inhibit_tx(priv, GENMASK_ULL(ds->num_ports - 1, 0), true);
        if (rc < 0) {
                dev_err(dev, "Failed to inhibit Tx on ports\n");
                rc = -ENXIO;
index 31d8acf..e615384 100644 (file)
@@ -27,7 +27,7 @@ static int sja1105_tas_set_runtime_params(struct sja1105_private *priv)
 
        tas_data->enabled = false;
 
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                const struct tc_taprio_qopt_offload *offload;
 
                offload = tas_data->offload[port];
@@ -164,6 +164,7 @@ int sja1105_init_scheduling(struct sja1105_private *priv)
        struct sja1105_tas_data *tas_data = &priv->tas_data;
        struct sja1105_gating_config *gating_cfg = &tas_data->gating_cfg;
        struct sja1105_schedule_entry *schedule;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_table *table;
        int schedule_start_idx;
        s64 entry_point_delta;
@@ -207,7 +208,7 @@ int sja1105_init_scheduling(struct sja1105_private *priv)
        }
 
        /* Figure out the dimensioning of the problem */
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                if (tas_data->offload[port]) {
                        num_entries += tas_data->offload[port]->num_entries;
                        num_cycles++;
@@ -269,7 +270,7 @@ int sja1105_init_scheduling(struct sja1105_private *priv)
        schedule_entry_points_params->clksrc = SJA1105_TAS_CLKSRC_PTP;
        schedule_entry_points_params->actsubsch = num_cycles - 1;
 
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                const struct tc_taprio_qopt_offload *offload;
                /* Relative base time */
                s64 rbt;
@@ -468,6 +469,7 @@ bool sja1105_gating_check_conflicts(struct sja1105_private *priv, int port,
        struct sja1105_gating_config *gating_cfg = &priv->tas_data.gating_cfg;
        size_t num_entries = gating_cfg->num_entries;
        struct tc_taprio_qopt_offload *dummy;
+       struct dsa_switch *ds = priv->ds;
        struct sja1105_gate_entry *e;
        bool conflict;
        int i = 0;
@@ -491,7 +493,7 @@ bool sja1105_gating_check_conflicts(struct sja1105_private *priv, int port,
        if (port != -1) {
                conflict = sja1105_tas_check_conflicts(priv, port, dummy);
        } else {
-               for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+               for (port = 0; port < ds->num_ports; port++) {
                        conflict = sja1105_tas_check_conflicts(priv, port,
                                                               dummy);
                        if (conflict)
@@ -554,7 +556,7 @@ int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
                }
        }
 
-       for (other_port = 0; other_port < SJA1105_NUM_PORTS; other_port++) {
+       for (other_port = 0; other_port < ds->num_ports; other_port++) {
                if (other_port == port)
                        continue;
 
@@ -885,7 +887,7 @@ void sja1105_tas_teardown(struct dsa_switch *ds)
 
        cancel_work_sync(&priv->tas_data.tas_work);
 
-       for (port = 0; port < SJA1105_NUM_PORTS; port++) {
+       for (port = 0; port < ds->num_ports; port++) {
                offload = priv->tas_data.offload[port];
                if (!offload)
                        continue;