forked from Openwrt/openwrt
7ace30aeb6
Backport upstream code split patch for qca8k needed for ipq40xx target to correctly implement a DSA driver. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
117 lines
3.6 KiB
Diff
117 lines
3.6 KiB
Diff
From 2b8fd87af7f156942971789abac8ee2bb60c03bc Mon Sep 17 00:00:00 2001
|
|
From: Ansuel Smith <ansuelsmth@gmail.com>
|
|
Date: Sat, 16 Apr 2022 01:30:13 +0200
|
|
Subject: [PATCH 2/6] net: dsa: qca8k: drop port_sts from qca8k_priv
|
|
|
|
Port_sts is a thing of the past for this driver. It was something
|
|
present on the initial implementation of this driver and parts of the
|
|
original struct were dropped over time. Using an array of int to store if
|
|
a port is enabled or not to handle PM operation seems overkill. Switch
|
|
and use a simple u8 to store the port status where each bit correspond
|
|
to a port. (bit is set port is enabled, bit is not set, port is disabled)
|
|
Also add some comments to better describe why we need to track port
|
|
status.
|
|
|
|
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
|
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/dsa/qca8k.c | 15 +++++++++------
|
|
drivers/net/dsa/qca8k.h | 9 ++++-----
|
|
2 files changed, 13 insertions(+), 11 deletions(-)
|
|
|
|
--- a/drivers/net/dsa/qca8k.c
|
|
+++ b/drivers/net/dsa/qca8k.c
|
|
@@ -2494,7 +2494,7 @@ qca8k_port_enable(struct dsa_switch *ds,
|
|
struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
|
|
|
|
qca8k_port_set_status(priv, port, 1);
|
|
- priv->port_sts[port].enabled = 1;
|
|
+ priv->port_enabled_map |= BIT(port);
|
|
|
|
if (dsa_is_user_port(ds, port))
|
|
phy_support_asym_pause(phy);
|
|
@@ -2508,7 +2508,7 @@ qca8k_port_disable(struct dsa_switch *ds
|
|
struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
|
|
|
|
qca8k_port_set_status(priv, port, 0);
|
|
- priv->port_sts[port].enabled = 0;
|
|
+ priv->port_enabled_map &= ~BIT(port);
|
|
}
|
|
|
|
static int
|
|
@@ -2531,19 +2531,19 @@ qca8k_port_change_mtu(struct dsa_switch
|
|
* Turn off both cpu ports before applying the new value to prevent
|
|
* this.
|
|
*/
|
|
- if (priv->port_sts[0].enabled)
|
|
+ if (priv->port_enabled_map & BIT(0))
|
|
qca8k_port_set_status(priv, 0, 0);
|
|
|
|
- if (priv->port_sts[6].enabled)
|
|
+ if (priv->port_enabled_map & BIT(6))
|
|
qca8k_port_set_status(priv, 6, 0);
|
|
|
|
/* Include L2 header / FCS length */
|
|
ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN);
|
|
|
|
- if (priv->port_sts[0].enabled)
|
|
+ if (priv->port_enabled_map & BIT(0))
|
|
qca8k_port_set_status(priv, 0, 1);
|
|
|
|
- if (priv->port_sts[6].enabled)
|
|
+ if (priv->port_enabled_map & BIT(6))
|
|
qca8k_port_set_status(priv, 6, 1);
|
|
|
|
return ret;
|
|
@@ -3199,13 +3199,16 @@ static void qca8k_sw_shutdown(struct mdi
|
|
static void
|
|
qca8k_set_pm(struct qca8k_priv *priv, int enable)
|
|
{
|
|
- int i;
|
|
+ int port;
|
|
|
|
- for (i = 0; i < QCA8K_NUM_PORTS; i++) {
|
|
- if (!priv->port_sts[i].enabled)
|
|
+ for (port = 0; port < QCA8K_NUM_PORTS; port++) {
|
|
+ /* Do not enable on resume if the port was
|
|
+ * disabled before.
|
|
+ */
|
|
+ if (!(priv->port_enabled_map & BIT(port)))
|
|
continue;
|
|
|
|
- qca8k_port_set_status(priv, i, enable);
|
|
+ qca8k_port_set_status(priv, port, enable);
|
|
}
|
|
}
|
|
|
|
--- a/drivers/net/dsa/qca8k.h
|
|
+++ b/drivers/net/dsa/qca8k.h
|
|
@@ -324,10 +324,6 @@ enum qca8k_mid_cmd {
|
|
QCA8K_MIB_CAST = 3,
|
|
};
|
|
|
|
-struct ar8xxx_port_status {
|
|
- int enabled;
|
|
-};
|
|
-
|
|
struct qca8k_match_data {
|
|
u8 id;
|
|
bool reduced_package;
|
|
@@ -382,11 +378,14 @@ struct qca8k_priv {
|
|
u8 mirror_rx;
|
|
u8 mirror_tx;
|
|
u8 lag_hash_mode;
|
|
+ /* Each bit correspond to a port. This switch can support a max of 7 port.
|
|
+ * Bit 1: port enabled. Bit 0: port disabled.
|
|
+ */
|
|
+ u8 port_enabled_map;
|
|
bool legacy_phy_port_mapping;
|
|
struct qca8k_ports_config ports_config;
|
|
struct regmap *regmap;
|
|
struct mii_bus *bus;
|
|
- struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS];
|
|
struct dsa_switch *ds;
|
|
struct mutex reg_mutex;
|
|
struct device *dev;
|