lkml.org 
[lkml]   [2021]   [Aug]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 09/35] net: dsa: sja1105: parameterize the number of ports
    Date
    From: Vladimir Oltean <vladimir.oltean@nxp.com>

    [ Upstream commit 542043e91df452ed09f382d8c41cdf3788f31b5e ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/dsa/sja1105/sja1105_clocking.c | 3 +-
    drivers/net/dsa/sja1105/sja1105_flower.c | 9 ++--
    drivers/net/dsa/sja1105/sja1105_main.c | 61 +++++++++++++---------
    drivers/net/dsa/sja1105/sja1105_spi.c | 4 +-
    drivers/net/dsa/sja1105/sja1105_tas.c | 14 ++---
    5 files changed, 53 insertions(+), 38 deletions(-)

    diff --git a/drivers/net/dsa/sja1105/sja1105_clocking.c b/drivers/net/dsa/sja1105/sja1105_clocking.c
    index 2a9b8a6a5306..f54b4d03a002 100644
    --- a/drivers/net/dsa/sja1105/sja1105_clocking.c
    +++ b/drivers/net/dsa/sja1105/sja1105_clocking.c
    @@ -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;
    diff --git a/drivers/net/dsa/sja1105/sja1105_flower.c b/drivers/net/dsa/sja1105/sja1105_flower.c
    index 973761132fc3..77c54126b3fc 100644
    --- a/drivers/net/dsa/sja1105/sja1105_flower.c
    +++ b/drivers/net/dsa/sja1105/sja1105_flower.c
    @@ -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;
    }

    diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c
    index 6e5dbe9f3892..ebb6966eba8e 100644
    --- a/drivers/net/dsa/sja1105/sja1105_main.c
    +++ b/drivers/net/dsa/sja1105/sja1105_main.c
    @@ -107,6 +107,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;

    @@ -118,16 +119,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
    @@ -162,6 +163,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;

    @@ -183,7 +185,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;

    @@ -267,8 +269,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),
    @@ -276,8 +276,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
    @@ -301,6 +299,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];

    @@ -393,6 +400,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;

    @@ -413,7 +421,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++)
    @@ -441,8 +449,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;
    }
    @@ -538,7 +546,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
    @@ -546,7 +554,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,
    @@ -667,6 +675,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;

    @@ -688,8 +697,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;
    @@ -698,7 +707,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))
    @@ -764,9 +773,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;

    @@ -1641,7 +1651,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.
    */
    @@ -1863,7 +1873,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;
    }
    @@ -1915,7 +1925,7 @@ int sja1105_static_config_reload(struct sja1105_private *priv,
    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;
    @@ -3055,7 +3065,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))
    @@ -3258,6 +3268,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;
    @@ -3268,7 +3279,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",
    @@ -3282,7 +3293,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;
    @@ -3290,7 +3301,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;
    @@ -3686,7 +3697,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;
    diff --git a/drivers/net/dsa/sja1105/sja1105_spi.c b/drivers/net/dsa/sja1105/sja1105_spi.c
    index f7a1514f81e8..923d617cbec6 100644
    --- a/drivers/net/dsa/sja1105/sja1105_spi.c
    +++ b/drivers/net/dsa/sja1105/sja1105_spi.c
    @@ -339,10 +339,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;
    @@ -363,7 +363,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;
    diff --git a/drivers/net/dsa/sja1105/sja1105_tas.c b/drivers/net/dsa/sja1105/sja1105_tas.c
    index 31d8acff1f01..e6153848a950 100644
    --- a/drivers/net/dsa/sja1105/sja1105_tas.c
    +++ b/drivers/net/dsa/sja1105/sja1105_tas.c
    @@ -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;
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-08-06 10:25    [W:4.966 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site