forked from openwrt/openwrt
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kernel: 5.10: backport qca8k stability improvements
This is a backport of Ansuel Smith's "Multiple improvement to qca8k stability" series. The QCA8337 switch is available on multiple platforms including ipq806x, ath79 and bcm53xx. Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
- Loading branch information
Showing
26 changed files
with
2,660 additions
and
5 deletions.
There are no files selected for viewing
35 changes: 35 additions & 0 deletions
35
...generic/backport-5.10/785-v5.14-01-net-dsa-qca8k-change-simple-print-to-dev-variant.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
From 5d9e068402dcf7354cc8ee66c2152845306d2ccb Mon Sep 17 00:00:00 2001 | ||
From: Ansuel Smith <ansuelsmth@gmail.com> | ||
Date: Fri, 14 May 2021 22:59:51 +0200 | ||
Subject: [PATCH] net: dsa: qca8k: change simple print to dev variant | ||
|
||
Change pr_err and pr_warn to dev variant. | ||
|
||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> | ||
Reviewed-by: Andrew Lunn <andrew@lunn.ch> | ||
Signed-off-by: David S. Miller <davem@davemloft.net> | ||
--- | ||
drivers/net/dsa/qca8k.c | 4 ++-- | ||
1 file changed, 2 insertions(+), 2 deletions(-) | ||
|
||
--- a/drivers/net/dsa/qca8k.c | ||
+++ b/drivers/net/dsa/qca8k.c | ||
@@ -701,7 +701,7 @@ qca8k_setup(struct dsa_switch *ds) | ||
|
||
/* Make sure that port 0 is the cpu port */ | ||
if (!dsa_is_cpu_port(ds, 0)) { | ||
- pr_err("port 0 is not the CPU port\n"); | ||
+ dev_err(priv->dev, "port 0 is not the CPU port"); | ||
return -EINVAL; | ||
} | ||
|
||
@@ -711,7 +711,7 @@ qca8k_setup(struct dsa_switch *ds) | ||
priv->regmap = devm_regmap_init(ds->dev, NULL, priv, | ||
&qca8k_regmap_config); | ||
if (IS_ERR(priv->regmap)) | ||
- pr_warn("regmap initialization failed"); | ||
+ dev_warn(priv->dev, "regmap initialization failed"); | ||
|
||
ret = qca8k_setup_mdio_bus(priv); | ||
if (ret) |
61 changes: 61 additions & 0 deletions
61
...neric/backport-5.10/785-v5.14-02-net-dsa-qca8k-use-iopoll-macro-for-qca8k_busy_wait.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
From 2ad255f2faaffb3af786031fba2e7955454b558a Mon Sep 17 00:00:00 2001 | ||
From: Ansuel Smith <ansuelsmth@gmail.com> | ||
Date: Fri, 14 May 2021 22:59:52 +0200 | ||
Subject: [PATCH] net: dsa: qca8k: use iopoll macro for qca8k_busy_wait | ||
|
||
Use iopoll macro instead of while loop. | ||
|
||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||
Reviewed-by: Andrew Lunn <andrew@lunn.ch> | ||
Signed-off-by: David S. Miller <davem@davemloft.net> | ||
--- | ||
drivers/net/dsa/qca8k.c | 23 +++++++++++------------ | ||
drivers/net/dsa/qca8k.h | 2 ++ | ||
2 files changed, 13 insertions(+), 12 deletions(-) | ||
|
||
--- a/drivers/net/dsa/qca8k.c | ||
+++ b/drivers/net/dsa/qca8k.c | ||
@@ -262,21 +262,20 @@ static struct regmap_config qca8k_regmap | ||
static int | ||
qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) | ||
{ | ||
- unsigned long timeout; | ||
+ u32 val; | ||
+ int ret; | ||
|
||
- timeout = jiffies + msecs_to_jiffies(20); | ||
+ ret = read_poll_timeout(qca8k_read, val, !(val & mask), | ||
+ 0, QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, | ||
+ priv, reg); | ||
|
||
- /* loop until the busy flag has cleared */ | ||
- do { | ||
- u32 val = qca8k_read(priv, reg); | ||
- int busy = val & mask; | ||
+ /* Check if qca8k_read has failed for a different reason | ||
+ * before returning -ETIMEDOUT | ||
+ */ | ||
+ if (ret < 0 && val < 0) | ||
+ return val; | ||
|
||
- if (!busy) | ||
- break; | ||
- cond_resched(); | ||
- } while (!time_after_eq(jiffies, timeout)); | ||
- | ||
- return time_after_eq(jiffies, timeout); | ||
+ return ret; | ||
} | ||
|
||
static void | ||
--- a/drivers/net/dsa/qca8k.h | ||
+++ b/drivers/net/dsa/qca8k.h | ||
@@ -18,6 +18,8 @@ | ||
#define PHY_ID_QCA8337 0x004dd036 | ||
#define QCA8K_ID_QCA8337 0x13 | ||
|
||
+#define QCA8K_BUSY_WAIT_TIMEOUT 20 | ||
+ | ||
#define QCA8K_NUM_FDB_RECORDS 2048 | ||
|
||
#define QCA8K_CPU_PORT 0 |
86 changes: 86 additions & 0 deletions
86
...ric/backport-5.10/785-v5.14-03-net-dsa-qca8k-improve-qca8k-read-write-rmw-bus-acces.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
From 504bf65931824eda83494e5b5d75686e27ace03e Mon Sep 17 00:00:00 2001 | ||
From: Ansuel Smith <ansuelsmth@gmail.com> | ||
Date: Fri, 14 May 2021 22:59:53 +0200 | ||
Subject: [PATCH] net: dsa: qca8k: improve qca8k read/write/rmw bus access | ||
|
||
Put bus in local variable to improve faster access to the mdio bus. | ||
|
||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||
Reviewed-by: Andrew Lunn <andrew@lunn.ch> | ||
Signed-off-by: David S. Miller <davem@davemloft.net> | ||
--- | ||
drivers/net/dsa/qca8k.c | 29 ++++++++++++++++------------- | ||
1 file changed, 16 insertions(+), 13 deletions(-) | ||
|
||
--- a/drivers/net/dsa/qca8k.c | ||
+++ b/drivers/net/dsa/qca8k.c | ||
@@ -142,17 +142,18 @@ qca8k_set_page(struct mii_bus *bus, u16 | ||
static u32 | ||
qca8k_read(struct qca8k_priv *priv, u32 reg) | ||
{ | ||
+ struct mii_bus *bus = priv->bus; | ||
u16 r1, r2, page; | ||
u32 val; | ||
|
||
qca8k_split_addr(reg, &r1, &r2, &page); | ||
|
||
- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
|
||
- qca8k_set_page(priv->bus, page); | ||
- val = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); | ||
+ qca8k_set_page(bus, page); | ||
+ val = qca8k_mii_read32(bus, 0x10 | r2, r1); | ||
|
||
- mutex_unlock(&priv->bus->mdio_lock); | ||
+ mutex_unlock(&bus->mdio_lock); | ||
|
||
return val; | ||
} | ||
@@ -160,35 +161,37 @@ qca8k_read(struct qca8k_priv *priv, u32 | ||
static void | ||
qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) | ||
{ | ||
+ struct mii_bus *bus = priv->bus; | ||
u16 r1, r2, page; | ||
|
||
qca8k_split_addr(reg, &r1, &r2, &page); | ||
|
||
- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
|
||
- qca8k_set_page(priv->bus, page); | ||
- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val); | ||
+ qca8k_set_page(bus, page); | ||
+ qca8k_mii_write32(bus, 0x10 | r2, r1, val); | ||
|
||
- mutex_unlock(&priv->bus->mdio_lock); | ||
+ mutex_unlock(&bus->mdio_lock); | ||
} | ||
|
||
static u32 | ||
qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 val) | ||
{ | ||
+ struct mii_bus *bus = priv->bus; | ||
u16 r1, r2, page; | ||
u32 ret; | ||
|
||
qca8k_split_addr(reg, &r1, &r2, &page); | ||
|
||
- mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
+ mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
|
||
- qca8k_set_page(priv->bus, page); | ||
- ret = qca8k_mii_read32(priv->bus, 0x10 | r2, r1); | ||
+ qca8k_set_page(bus, page); | ||
+ ret = qca8k_mii_read32(bus, 0x10 | r2, r1); | ||
ret &= ~mask; | ||
ret |= val; | ||
- qca8k_mii_write32(priv->bus, 0x10 | r2, r1, ret); | ||
+ qca8k_mii_write32(bus, 0x10 | r2, r1, ret); | ||
|
||
- mutex_unlock(&priv->bus->mdio_lock); | ||
+ mutex_unlock(&bus->mdio_lock); | ||
|
||
return ret; | ||
} |
101 changes: 101 additions & 0 deletions
101
...linux/generic/backport-5.10/785-v5.14-04-net-dsa-qca8k-handle-qca8k_set_page-errors.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
From ba5707ec58cfb6853dff41c2aae72deb6a03d389 Mon Sep 17 00:00:00 2001 | ||
From: Ansuel Smith <ansuelsmth@gmail.com> | ||
Date: Fri, 14 May 2021 22:59:54 +0200 | ||
Subject: [PATCH] net: dsa: qca8k: handle qca8k_set_page errors | ||
|
||
With a remote possibility, the set_page function can fail. Since this is | ||
a critical part of the write/read qca8k regs, propagate the error and | ||
terminate any read/write operation. | ||
|
||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||
Reviewed-by: Andrew Lunn <andrew@lunn.ch> | ||
Signed-off-by: David S. Miller <davem@davemloft.net> | ||
--- | ||
drivers/net/dsa/qca8k.c | 33 ++++++++++++++++++++++++++------- | ||
1 file changed, 26 insertions(+), 7 deletions(-) | ||
|
||
--- a/drivers/net/dsa/qca8k.c | ||
+++ b/drivers/net/dsa/qca8k.c | ||
@@ -127,16 +127,23 @@ qca8k_mii_write32(struct mii_bus *bus, i | ||
"failed to write qca8k 32bit register\n"); | ||
} | ||
|
||
-static void | ||
+static int | ||
qca8k_set_page(struct mii_bus *bus, u16 page) | ||
{ | ||
+ int ret; | ||
+ | ||
if (page == qca8k_current_page) | ||
- return; | ||
+ return 0; | ||
|
||
- if (bus->write(bus, 0x18, 0, page) < 0) | ||
+ ret = bus->write(bus, 0x18, 0, page); | ||
+ if (ret < 0) { | ||
dev_err_ratelimited(&bus->dev, | ||
"failed to set qca8k page\n"); | ||
+ return ret; | ||
+ } | ||
+ | ||
qca8k_current_page = page; | ||
+ return 0; | ||
} | ||
|
||
static u32 | ||
@@ -150,11 +157,14 @@ qca8k_read(struct qca8k_priv *priv, u32 | ||
|
||
mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
|
||
- qca8k_set_page(bus, page); | ||
+ val = qca8k_set_page(bus, page); | ||
+ if (val < 0) | ||
+ goto exit; | ||
+ | ||
val = qca8k_mii_read32(bus, 0x10 | r2, r1); | ||
|
||
+exit: | ||
mutex_unlock(&bus->mdio_lock); | ||
- | ||
return val; | ||
} | ||
|
||
@@ -163,14 +173,19 @@ qca8k_write(struct qca8k_priv *priv, u32 | ||
{ | ||
struct mii_bus *bus = priv->bus; | ||
u16 r1, r2, page; | ||
+ int ret; | ||
|
||
qca8k_split_addr(reg, &r1, &r2, &page); | ||
|
||
mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
|
||
- qca8k_set_page(bus, page); | ||
+ ret = qca8k_set_page(bus, page); | ||
+ if (ret < 0) | ||
+ goto exit; | ||
+ | ||
qca8k_mii_write32(bus, 0x10 | r2, r1, val); | ||
|
||
+exit: | ||
mutex_unlock(&bus->mdio_lock); | ||
} | ||
|
||
@@ -185,12 +200,16 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r | ||
|
||
mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); | ||
|
||
- qca8k_set_page(bus, page); | ||
+ ret = qca8k_set_page(bus, page); | ||
+ if (ret < 0) | ||
+ goto exit; | ||
+ | ||
ret = qca8k_mii_read32(bus, 0x10 | r2, r1); | ||
ret &= ~mask; | ||
ret |= val; | ||
qca8k_mii_write32(bus, 0x10 | r2, r1, ret); | ||
|
||
+exit: | ||
mutex_unlock(&bus->mdio_lock); | ||
|
||
return ret; |
Oops, something went wrong.