Commit 01e6f8ad authored by Christian Marangi's avatar Christian Marangi Committed by Paolo Abeni

net: dsa: qca8k: use dsa_for_each macro instead of for loop

Convert for loop to dsa_for_each macro to save some redundant write on
unconnected/unused port and tidy things up.
Signed-off-by: default avatarChristian Marangi <ansuelsmth@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Link: https://lore.kernel.org/r/20230730074113.21889-5-ansuelsmth@gmail.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent a9108b07
...@@ -1800,7 +1800,8 @@ static int ...@@ -1800,7 +1800,8 @@ static int
qca8k_setup(struct dsa_switch *ds) qca8k_setup(struct dsa_switch *ds)
{ {
struct qca8k_priv *priv = ds->priv; struct qca8k_priv *priv = ds->priv;
int cpu_port, ret, i; struct dsa_port *dp;
int cpu_port, ret;
u32 mask; u32 mask;
cpu_port = qca8k_find_cpu_port(ds); cpu_port = qca8k_find_cpu_port(ds);
...@@ -1855,27 +1856,27 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1855,27 +1856,27 @@ qca8k_setup(struct dsa_switch *ds)
dev_warn(priv->dev, "mib init failed"); dev_warn(priv->dev, "mib init failed");
/* Initial setup of all ports */ /* Initial setup of all ports */
for (i = 0; i < QCA8K_NUM_PORTS; i++) { dsa_switch_for_each_port(dp, ds) {
/* Disable forwarding by default on all ports */ /* Disable forwarding by default on all ports */
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(dp->index),
QCA8K_PORT_LOOKUP_MEMBER, 0); QCA8K_PORT_LOOKUP_MEMBER, 0);
if (ret) if (ret)
return ret; return ret;
}
/* Enable QCA header mode on all cpu ports */ /* Disable MAC by default on all user ports */
if (dsa_is_cpu_port(ds, i)) { dsa_switch_for_each_user_port(dp, ds)
ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), qca8k_port_set_status(priv, dp->index, 0);
FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); /* Enable QCA header mode on all cpu ports */
if (ret) { dsa_switch_for_each_cpu_port(dp, ds) {
dev_err(priv->dev, "failed enabling QCA header mode"); ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(dp->index),
return ret; FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
} FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
if (ret) {
dev_err(priv->dev, "failed enabling QCA header mode on port %d", dp->index);
return ret;
} }
/* Disable MAC by default on all user ports */
if (dsa_is_user_port(ds, i))
qca8k_port_set_status(priv, i, 0);
} }
/* Forward all unknown frames to CPU port for Linux processing /* Forward all unknown frames to CPU port for Linux processing
...@@ -1897,48 +1898,48 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1897,48 +1898,48 @@ qca8k_setup(struct dsa_switch *ds)
return ret; return ret;
/* Setup connection between CPU port & user ports /* Setup connection between CPU port & user ports
* Configure specific switch configuration for ports * Individual user ports get connected to CPU port only
*/ */
for (i = 0; i < QCA8K_NUM_PORTS; i++) { dsa_switch_for_each_user_port(dp, ds) {
/* Individual user ports get connected to CPU port only */ u8 port = dp->index;
if (dsa_is_user_port(ds, i)) {
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
QCA8K_PORT_LOOKUP_MEMBER, QCA8K_PORT_LOOKUP_MEMBER,
BIT(cpu_port)); BIT(cpu_port));
if (ret) if (ret)
return ret; return ret;
ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i), ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(port),
QCA8K_PORT_LOOKUP_LEARN); QCA8K_PORT_LOOKUP_LEARN);
if (ret) if (ret)
return ret; return ret;
/* For port based vlans to work we need to set the
* default egress vid
*/
ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i),
QCA8K_EGREES_VLAN_PORT_MASK(i),
QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF));
if (ret)
return ret;
ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i),
QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
if (ret)
return ret;
}
/* The port 5 of the qca8337 have some problem in flood condition. The /* For port based vlans to work we need to set the
* original legacy driver had some specific buffer and priority settings * default egress vid
* for the different port suggested by the QCA switch team. Add this
* missing settings to improve switch stability under load condition.
* This problem is limited to qca8337 and other qca8k switch are not affected.
*/ */
if (priv->switch_id == QCA8K_ID_QCA8337) ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port),
qca8k_setup_hol_fixup(priv, i); QCA8K_EGREES_VLAN_PORT_MASK(port),
QCA8K_EGREES_VLAN_PORT(port, QCA8K_PORT_VID_DEF));
if (ret)
return ret;
ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port),
QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
if (ret)
return ret;
} }
/* The port 5 of the qca8337 have some problem in flood condition. The
* original legacy driver had some specific buffer and priority settings
* for the different port suggested by the QCA switch team. Add this
* missing settings to improve switch stability under load condition.
* This problem is limited to qca8337 and other qca8k switch are not affected.
*/
if (priv->switch_id == QCA8K_ID_QCA8337)
dsa_switch_for_each_available_port(dp, ds)
qca8k_setup_hol_fixup(priv, dp->index);
/* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
if (priv->switch_id == QCA8K_ID_QCA8327) { if (priv->switch_id == QCA8K_ID_QCA8327) {
mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment