Skip to content

Instantly share code, notes, and snippets.

@Ansuel
Last active May 11, 2024 21:01
Show Gist options
  • Save Ansuel/9524fb1b431a64d60af821a6396e0af1 to your computer and use it in GitHub Desktop.
Save Ansuel/9524fb1b431a64d60af821a6396e0af1 to your computer and use it in GitHub Desktop.
From a083dfc11eb45637ffd57813cc47d0fc6b2b9766 Mon Sep 17 00:00:00 2001
From: Christian Marangi <ansuelsmth@gmail.com>
Date: Sat, 11 May 2024 16:18:27 +0200
Subject: [PATCH] HACK
---
drivers/net/dsa/qca/qca8k-8xxx.c | 58 ++++++++++++++++++++++++++------
1 file changed, 47 insertions(+), 11 deletions(-)
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -508,9 +508,27 @@ qca8k_bulk_read(void *ctx, const void *r
struct qca8k_priv *priv = ctx;
u32 reg = *(u16 *)reg_buf;
- if (priv->mgmt_master &&
- !qca8k_read_eth(priv, reg, val_buf, val_len))
+ if (priv->mgmt_master) {
+ u32 *val_buf2;
+
+ qca8k_read_eth(priv, reg, val_buf, val_len);
+
+ val_buf2 = kmalloc(val_len, GFP_KERNEL);
+ for (i = 0; i < count; i++, reg += sizeof(u32)) {
+ ret = qca8k_read_mii(priv, reg, val_buf2 + i);
+ if (ret < 0)
+ return ret;
+ }
+
+ reg = *(u16 *)reg_buf;
+ for (i = 0; i < count; i++, reg += sizeof(u32))
+ if (val_buf[i] != val_buf2[i])
+ pr_info("REG %x read diff MGMT_ETH: %x MII: %x\n", reg, val_buf[i], val_buf2[i]);
+
+ kfree(val_buf2);
+
return 0;
+ }
/* loop count times and increment reg of 4 */
for (i = 0; i < count; i++, reg += sizeof(u32)) {
@@ -531,9 +549,27 @@ qca8k_bulk_gather_write(void *ctx, const
u32 reg = *(u16 *)reg_buf;
u32 *val = (u32 *)val_buf;
- if (priv->mgmt_master &&
- !qca8k_write_eth(priv, reg, val, val_len))
+ if (priv->mgmt_master) {
+ u32 *val_buf2;
+
+ qca8k_write_eth(priv, reg, val, val_len);
+
+ val_buf2 = kmalloc(val_len, GFP_KERNEL);
+ for (i = 0; i < count; i++, reg += sizeof(u32)) {
+ ret = qca8k_read_mii(priv, reg, val_buf2 + i);
+ if (ret < 0)
+ return ret;
+ }
+
+ reg = *(u16 *)reg_buf;
+ for (i = 0; i < count; i++, reg += sizeof(u32))
+ if (val_buf[i] != val_buf2[i])
+ pr_info("REG %x write diff MGMT_ETH: %x MII: %x\n", reg, val_buf[i], val_buf2[i]);
+
+ kfree(val_buf2);
+
return 0;
+ }
/* loop count times, increment reg of 4 and increment val ptr to
* the next value
@@ -900,10 +936,10 @@ qca8k_internal_mdio_write(struct mii_bus
struct qca8k_priv *priv = slave_bus->priv;
int ret;
- /* Use mdio Ethernet when available, fallback to legacy one on error */
- ret = qca8k_phy_eth_command(priv, false, phy, regnum, data);
- if (!ret)
- return 0;
+ // /* Use mdio Ethernet when available, fallback to legacy one on error */
+ // ret = qca8k_phy_eth_command(priv, false, phy, regnum, data);
+ // if (!ret)
+ // return 0;
return qca8k_mdio_write(priv, phy, regnum, data);
}
@@ -915,9 +951,9 @@ qca8k_internal_mdio_read(struct mii_bus
int ret;
/* Use mdio Ethernet when available, fallback to legacy one on error */
- ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0);
- if (ret >= 0)
- return ret;
+ // ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0);
+ // if (ret >= 0)
+ // return ret;
ret = qca8k_mdio_read(priv, phy, regnum);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment