[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