[OpenWrt-Devel] AR8334 switch support

Heiner Kallweit hkallweit1 at gmail.com
Fri Apr 24 14:05:01 EDT 2015


Am 23.04.2015 um 14:43 schrieb Christian Mehlis:
> Am 22.04.2015 um 19:01 schrieb Heiner Kallweit:
>> Can you provide a complete dmesg output?
> 
> Bootlog is available here:
> http://wiki.openwrt.org/toh/compex/wpj344#openwrt_upstream_bootlog
> 
> Dmesg is attached.
> 
>> W/o having seen the datasheets for AR8337/AR8334 I'm hesitant to propose a patch.
>> 1. AR8334 identifies itself as AR8337/rev.2. There might be a real AR8337/rev.2 with 7 ports. How to tell between these two chips?
> 
> Perhaps there are some other registers where the number of ports are available? But I don't have any datasheets to look into...
> 
> Best
> Christian

This patch tries to identify an AR8334/AR8335 by checking for non-existent PHYs.
I have systems with AR8327 only, the patch doesn't do any harm on them at least.
Could you please test this patch and provide the dmesg output?

Rgds, Heiner

---
 target/linux/generic/files/drivers/net/phy/ar8216.c |  8 ++++----
 target/linux/generic/files/drivers/net/phy/ar8216.h | 21 +++++++++++++++++++--
 target/linux/generic/files/drivers/net/phy/ar8327.c | 17 ++++++++++++++---
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
index e39d540..25bbfc2 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
@@ -38,7 +38,7 @@
 #include "ar8216.h"
 
 extern const struct ar8xxx_chip ar8327_chip;
-extern const struct ar8xxx_chip ar8337_chip;
+extern const struct ar8xxx_chip ar833x_chip;
 
 #define AR8XXX_MIB_WORK_DELAY	2000 /* msecs */
 
@@ -1576,8 +1576,8 @@ ar8xxx_id_chip(struct ar8xxx_priv *priv)
 	case AR8XXX_VER_AR8327:
 		priv->chip = &ar8327_chip;
 		break;
-	case AR8XXX_VER_AR8337:
-		priv->chip = &ar8337_chip;
+	case AR8XXX_VER_AR833X:
+		priv->chip = &ar833x_chip;
 		break;
 	default:
 		pr_err("ar8216: Unknown Atheros device [ver=%d, rev=%d]\n",
@@ -1856,7 +1856,7 @@ ar8xxx_phy_config_aneg(struct phy_device *phydev)
 static const u32 ar8xxx_phy_ids[] = {
 	0x004dd033,
 	0x004dd034, /* AR8327 */
-	0x004dd036, /* AR8337 */
+	0x004dd036, /* AR833X */
 	0x004dd041,
 	0x004dd042,
 	0x004dd043, /* AR8236 */
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h
index 0f53f23..a50fb9d 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.h
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.h
@@ -334,7 +334,7 @@ enum {
 	AR8XXX_VER_AR8236 = 0x03,
 	AR8XXX_VER_AR8316 = 0x10,
 	AR8XXX_VER_AR8327 = 0x12,
-	AR8XXX_VER_AR8337 = 0x13,
+	AR8XXX_VER_AR833X = 0x13,
 };
 
 #define AR8XXX_NUM_ARL_RECORDS	100
@@ -409,6 +409,8 @@ struct ar8xxx_priv {
 	void *chip_data;
 	bool initialized;
 	bool port4_phy;
+	bool unavailable_phys[AR8XXX_NUM_PHYS];
+	int num_unavailable_phys;
 	char buf[2048];
 	struct arl_entry arl_table[AR8XXX_NUM_ARL_RECORDS];
 	char arl_buf[AR8XXX_NUM_ARL_RECORDS * 32 + 256];
@@ -562,9 +564,24 @@ static inline bool chip_is_ar8327(struct ar8xxx_priv *priv)
 	return priv->chip_ver == AR8XXX_VER_AR8327;
 }
 
+static inline bool chip_is_ar833x(struct ar8xxx_priv *priv)
+{
+	return priv->chip_ver == AR8XXX_VER_AR833X;
+}
+
+static inline bool chip_is_ar8334(struct ar8xxx_priv *priv)
+{
+	return chip_is_ar833x(priv) && priv->num_unavailable_phys == 3;
+}
+
+static inline bool chip_is_ar8335(struct ar8xxx_priv *priv)
+{
+	return chip_is_ar833x(priv) && priv->num_unavailable_phys == 2;
+}
+
 static inline bool chip_is_ar8337(struct ar8xxx_priv *priv)
 {
-	return priv->chip_ver == AR8XXX_VER_AR8337;
+	return chip_is_ar833x(priv) && priv->num_unavailable_phys == 0;
 }
 
 static inline void
diff --git a/target/linux/generic/files/drivers/net/phy/ar8327.c b/target/linux/generic/files/drivers/net/phy/ar8327.c
index 07e837e..a25372f 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8327.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8327.c
@@ -620,7 +620,18 @@ ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np)
 static int
 ar8327_hw_init(struct ar8xxx_priv *priv)
 {
-	int ret;
+	int i, ret;
+
+	for (i = 0; i < AR8XXX_NUM_PHYS; i++)
+		/* certain bits are always set if the PHY exists */
+		if (!mdiobus_read(priv->mii_bus, i, MII_BMSR)) {
+			priv->unavailable_phys[i] = true;
+			priv->num_unavailable_phys++;
+			dev_info(&priv->phy->dev, "PHY %d not available\n", i);
+		}
+	if (chip_is_ar833x(priv))
+                dev_info(&priv->phy->dev, "Detected AR833%d switch\n",
+                         AR8327_NUM_PORTS - priv->num_unavailable_phys);
 
 	priv->chip_data = kzalloc(sizeof(struct ar8327_data), GFP_KERNEL);
 	if (!priv->chip_data)
@@ -1201,12 +1212,12 @@ const struct ar8xxx_chip ar8327_chip = {
 	.mib_func = AR8327_REG_MIB_FUNC
 };
 
-const struct ar8xxx_chip ar8337_chip = {
+const struct ar8xxx_chip ar833x_chip = {
 	.caps = AR8XXX_CAP_GIGE | AR8XXX_CAP_MIB_COUNTERS,
 	.config_at_probe = true,
 	.mii_lo_first = true,
 
-	.name = "Atheros AR8337",
+	.name = "Atheros AR833X",
 	.ports = AR8327_NUM_PORTS,
 	.vlans = AR8X16_MAX_VLANS,
 	.swops = &ar8327_sw_ops,
-- 
2.3.5
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list