Skip to content

Commit 557aa19

Browse files
fchanfrank-w
authored andcommitted
Support cl22-extended and force-isolate option for special purpose.
1 parent 93ad8a3 commit 557aa19

3 files changed

Lines changed: 97 additions & 2 deletions

File tree

drivers/net/dsa/mxl862xx/mxl862xx-host.c

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,92 @@
2828
#define MMD_API_GET_DATA_0 (0x0 + 0x5)
2929
#define MMD_API_RST_DATA (0x0 + 0x8)
3030

31+
/* Clause 22 extended read/write access */
32+
#define MXL862XX_MMD_DATA 0xE
33+
#define MXL862XX_MMD_CTRL 0xD
34+
#define MXL862XX_ACTYPE_ADDRESS (0 << 14)
35+
#define MXL862XX_ACTYPE_DATA (1 << 14)
36+
37+
/**
38+
* write access to MMD register of PHYs via Clause 22 extended access
39+
*/
40+
static int __mxl862xx_c22_ext_mmd_write(const struct mxl862xx_priv *dev, struct mii_bus *bus, int sw_addr, int mmd,
41+
int reg, u16 data)
42+
{
43+
int res;
44+
45+
/* Set the DevID for Write Command */
46+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_CTRL, mmd);
47+
if (res < 0)
48+
goto error;
49+
50+
/* Issue the write command */
51+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_DATA, reg);
52+
if (res < 0)
53+
goto error;
54+
55+
/* Set the DevID for Write Command */
56+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_CTRL, MXL862XX_ACTYPE_DATA | mmd);
57+
if (res < 0)
58+
goto error;
59+
60+
/* Issue the write command */
61+
if (mmd == 0x1e && reg == 0) /* ctrl register can't write twice */
62+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_DATA, data);
63+
else
64+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_DATA, data);
65+
if (res < 0)
66+
goto error;
67+
68+
error:
69+
return res;
70+
}
71+
72+
/**
73+
* read access to MMD register of PHYs via Clause 22 extended access
74+
*/
75+
static int __mxl862xx_c22_ext_mmd_read(const struct mxl862xx_priv *dev, struct mii_bus *bus, int sw_addr, int mmd, int reg)
76+
{
77+
int res;
78+
79+
/* Set the DevID for Write Command */
80+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_CTRL, mmd);
81+
if (res < 0)
82+
goto error;
83+
84+
/* Issue the write command */
85+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_DATA, reg);
86+
if (res < 0)
87+
goto error;
88+
89+
/* Set the DevID for Write Command */
90+
res = __mdiobus_write(bus, sw_addr, MXL862XX_MMD_CTRL, MXL862XX_ACTYPE_DATA | mmd);
91+
if (res < 0)
92+
goto error;
93+
94+
/* Read the data */
95+
res = __mdiobus_read(bus, sw_addr, MXL862XX_MMD_DATA);
96+
if (res < 0)
97+
goto error;
98+
99+
error:
100+
return res;
101+
}
102+
31103
static int mxl862xx_read(struct mxl862xx_priv *dev, u32 addr)
32104
{
33-
return __mdiobus_c45_read(dev->bus, dev->sw_addr, MXL862XX_MMD_DEV, addr);
105+
if (dev->c22_extended)
106+
return __mxl862xx_c22_ext_mmd_read(dev, dev->bus, dev->sw_addr, MXL862XX_MMD_DEV, addr);
107+
else
108+
return __mdiobus_c45_read(dev->bus, dev->sw_addr, MXL862XX_MMD_DEV, addr);
34109
}
35110

36111
int mxl862xx_write(struct mxl862xx_priv *dev, u32 addr, u16 data)
37112
{
38-
return __mdiobus_c45_write(dev->bus, dev->sw_addr, MXL862XX_MMD_DEV, addr, data);
113+
if (dev->c22_extended)
114+
return __mxl862xx_c22_ext_mmd_write(dev, dev->bus, dev->sw_addr, MXL862XX_MMD_DEV, addr, data);
115+
else
116+
return __mdiobus_c45_write(dev->bus, dev->sw_addr, MXL862XX_MMD_DEV, addr, data);
39117
}
40118

41119
static int mxl862xx_busy_wait(struct mxl862xx_priv *dev)

drivers/net/dsa/mxl862xx/mxl862xx.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2741,6 +2741,11 @@ static int mxl862xx_port_bridge_join(struct dsa_switch *ds, int port, struct dsa
27412741
int bridge_id;
27422742
int ret;
27432743

2744+
if (priv->force_isolate) {
2745+
dev_info(priv->dev, "ignore bridge join due to force isolate\n");
2746+
return 0;
2747+
}
2748+
27442749
mxl862xx_deisolate_port(ds, port);
27452750

27462751
bridge_id = mxl862xx_find_bridge_id(ds, bridge.dev);
@@ -3489,6 +3494,11 @@ static int mxl862xx_probe(struct mdio_device *mdiodev)
34893494
if (!priv->hw_info)
34903495
return -EINVAL;
34913496

3497+
if (of_property_read_bool(dev->of_node, "c22-extended")) {
3498+
priv->c22_extended = true;
3499+
dev_info(dev, "%s:%u: Enable c22 extended", __func__, __LINE__);
3500+
}
3501+
34923502
mutex_init(&priv->pce_table_lock);
34933503

34943504
ds = devm_kzalloc(dev, sizeof(*ds), GFP_KERNEL);
@@ -3522,6 +3532,11 @@ static int mxl862xx_probe(struct mdio_device *mdiodev)
35223532
fw_version.iv_major, fw_version.iv_minor,
35233533
fw_version.iv_revision, fw_version.iv_build_num);
35243534

3535+
if (of_property_read_bool(dev->of_node, "force-isolate")) {
3536+
priv->force_isolate = true;
3537+
dev_info(dev, "%s:%u: Enable force isolate", __func__, __LINE__);
3538+
}
3539+
35253540
return 0;
35263541
}
35273542

drivers/net/dsa/mxl862xx/mxl862xx.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,6 @@ struct mxl862xx_priv {
8383
* might cause dead-locks / hang in previous versions
8484
*/
8585
struct mutex pce_table_lock;
86+
bool force_isolate;
87+
bool c22_extended;
8688
};

0 commit comments

Comments
 (0)