Commit 040e926f authored by Ansuel Smith's avatar Ansuel Smith Committed by David S. Miller

net: dsa: qca8k: tidy for loop in setup and add cpu port check

Tidy and organize qca8k setup function from multiple for loop.
Change for loop in bridge leave/join to scan all port and skip cpu port.
No functional change intended.
Signed-off-by: default avatarAnsuel Smith <ansuelsmth@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 37ba803d
...@@ -1122,28 +1122,34 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1122,28 +1122,34 @@ qca8k_setup(struct dsa_switch *ds)
if (ret) if (ret)
dev_warn(priv->dev, "mib init failed"); dev_warn(priv->dev, "mib init failed");
/* Enable QCA header mode on the cpu port */ /* Initial setup of all ports */
ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(cpu_port), for (i = 0; i < QCA8K_NUM_PORTS; i++) {
/* Disable forwarding by default on all ports */
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
QCA8K_PORT_LOOKUP_MEMBER, 0);
if (ret)
return ret;
/* Enable QCA header mode on all cpu ports */
if (dsa_is_cpu_port(ds, i)) {
ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i),
QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S | QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S |
QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S); QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S);
if (ret) { if (ret) {
dev_err(priv->dev, "failed enabling QCA header mode"); dev_err(priv->dev, "failed enabling QCA header mode");
return ret; return ret;
} }
/* Disable forwarding by default on all ports */
for (i = 0; i < QCA8K_NUM_PORTS; i++) {
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
QCA8K_PORT_LOOKUP_MEMBER, 0);
if (ret)
return ret;
} }
/* Disable MAC by default on all ports */ /* Disable MAC by default on all user ports */
for (i = 1; i < QCA8K_NUM_PORTS; i++) if (dsa_is_user_port(ds, i))
qca8k_port_set_status(priv, i, 0); 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
* Notice that in multi-cpu config only one port should be set
* for igmp, unknown, multicast and broadcast packet
*/
ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1,
BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S | BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S |
BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S | BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S |
...@@ -1152,11 +1158,13 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1152,11 +1158,13 @@ qca8k_setup(struct dsa_switch *ds)
if (ret) if (ret)
return ret; return ret;
/* Setup connection between CPU port & user ports */ /* Setup connection between CPU port & user ports
* Configure specific switch configuration for ports
*/
for (i = 0; i < QCA8K_NUM_PORTS; i++) { for (i = 0; i < QCA8K_NUM_PORTS; i++) {
/* CPU port gets connected to all user ports of the switch */ /* CPU port gets connected to all user ports of the switch */
if (dsa_is_cpu_port(ds, i)) { if (dsa_is_cpu_port(ds, i)) {
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port), ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
if (ret) if (ret)
return ret; return ret;
...@@ -1193,7 +1201,6 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1193,7 +1201,6 @@ qca8k_setup(struct dsa_switch *ds)
if (ret) if (ret)
return ret; return ret;
} }
}
/* The port 5 of the qca8337 have some problem in flood condition. The /* The port 5 of the qca8337 have some problem in flood condition. The
* original legacy driver had some specific buffer and priority settings * original legacy driver had some specific buffer and priority settings
...@@ -1202,7 +1209,6 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1202,7 +1209,6 @@ qca8k_setup(struct dsa_switch *ds)
* This problem is limited to qca8337 and other qca8k switch are not affected. * This problem is limited to qca8337 and other qca8k switch are not affected.
*/ */
if (priv->switch_id == QCA8K_ID_QCA8337) { if (priv->switch_id == QCA8K_ID_QCA8337) {
for (i = 0; i < QCA8K_NUM_PORTS; i++) {
switch (i) { switch (i) {
/* The 2 CPU port and port 5 requires some different /* The 2 CPU port and port 5 requires some different
* priority than any other ports. * priority than any other ports.
...@@ -1238,6 +1244,12 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1238,6 +1244,12 @@ qca8k_setup(struct dsa_switch *ds)
QCA8K_PORT_HOL_CTRL1_WRED_EN, QCA8K_PORT_HOL_CTRL1_WRED_EN,
mask); mask);
} }
/* Set initial MTU for every port.
* We have only have a general MTU setting. So track
* every port and set the max across all port.
*/
priv->port_mtu[i] = ETH_FRAME_LEN + ETH_FCS_LEN;
} }
/* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
...@@ -1251,8 +1263,6 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -1251,8 +1263,6 @@ qca8k_setup(struct dsa_switch *ds)
} }
/* Setup our port MTUs to match power on defaults */ /* Setup our port MTUs to match power on defaults */
for (i = 0; i < QCA8K_NUM_PORTS; i++)
priv->port_mtu[i] = ETH_FRAME_LEN + ETH_FCS_LEN;
ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN);
if (ret) if (ret)
dev_warn(priv->dev, "failed setting MTU settings"); dev_warn(priv->dev, "failed setting MTU settings");
...@@ -1728,7 +1738,9 @@ qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br) ...@@ -1728,7 +1738,9 @@ qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br)
cpu_port = dsa_to_port(ds, port)->cpu_dp->index; cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
port_mask = BIT(cpu_port); port_mask = BIT(cpu_port);
for (i = 1; i < QCA8K_NUM_PORTS; i++) { for (i = 0; i < QCA8K_NUM_PORTS; i++) {
if (dsa_is_cpu_port(ds, i))
continue;
if (dsa_to_port(ds, i)->bridge_dev != br) if (dsa_to_port(ds, i)->bridge_dev != br)
continue; continue;
/* Add this port to the portvlan mask of the other ports /* Add this port to the portvlan mask of the other ports
...@@ -1758,7 +1770,9 @@ qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br) ...@@ -1758,7 +1770,9 @@ qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br)
cpu_port = dsa_to_port(ds, port)->cpu_dp->index; cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
for (i = 1; i < QCA8K_NUM_PORTS; i++) { for (i = 0; i < QCA8K_NUM_PORTS; i++) {
if (dsa_is_cpu_port(ds, i))
continue;
if (dsa_to_port(ds, i)->bridge_dev != br) if (dsa_to_port(ds, i)->bridge_dev != br)
continue; continue;
/* Remove this port to the portvlan mask of the other ports /* Remove this port to the portvlan mask of the other ports
......
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