Skip to content

Commit 2b2be8d

Browse files
drivers: mdio_nxp_enet_qos: Add Clause 45 support.
Adds handler for C45 read/write phy transactions. Signed-off-by: Peter van der Perk <peter.vanderperk@nxp.com>
1 parent 9f0dc12 commit 2b2be8d

File tree

1 file changed

+81
-23
lines changed

1 file changed

+81
-23
lines changed

drivers/mdio/mdio_nxp_enet_qos.c

Lines changed: 81 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ struct mdio_transaction {
3232
};
3333
uint8_t portaddr;
3434
uint8_t regaddr;
35+
uint16_t regaddr_c45;
3536
enet_qos_t *base;
3637
struct k_mutex *mdio_bus_mutex;
3738
};
@@ -44,32 +45,52 @@ static bool check_busy(enet_qos_t *base)
4445
return ENET_QOS_REG_GET(MAC_MDIO_ADDRESS, GB, val);
4546
}
4647

47-
static int do_transaction(struct mdio_transaction *mdio)
48+
static int do_transaction(struct mdio_transaction *mdio, bool clause45)
4849
{
4950
enet_qos_t *base = mdio->base;
5051
uint8_t goc_1_code;
5152
int ret;
5253

5354
k_mutex_lock(mdio->mdio_bus_mutex, K_FOREVER);
5455

55-
if (mdio->op == MDIO_OP_C22_WRITE) {
56-
base->MAC_MDIO_DATA =
57-
/* Prepare the data to be written */
58-
ENET_QOS_REG_PREP(MAC_MDIO_DATA, GD, mdio->write_data);
59-
goc_1_code = 0b0;
60-
} else if (mdio->op == MDIO_OP_C22_READ) {
61-
goc_1_code = 0b1;
56+
if (clause45) {
57+
if (mdio->op == MDIO_OP_C45_WRITE) {
58+
goc_1_code = 0b0;
59+
base->MAC_MDIO_DATA =
60+
/* Prepare the data and regaddr to be written */
61+
ENET_QOS_REG_PREP(MAC_MDIO_DATA, GD, mdio->write_data) |
62+
ENET_QOS_REG_PREP(MAC_MDIO_DATA, RA, mdio->regaddr_c45);
63+
} else if (mdio->op == MDIO_OP_C45_READ) {
64+
goc_1_code = 0b1;
65+
base->MAC_MDIO_DATA =
66+
/* Prepare the regaddr to be written */
67+
ENET_QOS_REG_PREP(MAC_MDIO_DATA, RA, mdio->regaddr_c45);
68+
} else {
69+
ret = -EINVAL;
70+
goto done;
71+
}
6272
} else {
63-
ret = -EINVAL;
64-
goto done;
73+
if (mdio->op == MDIO_OP_C22_WRITE) {
74+
base->MAC_MDIO_DATA =
75+
/* Prepare the data to be written */
76+
ENET_QOS_REG_PREP(MAC_MDIO_DATA, GD, mdio->write_data);
77+
goc_1_code = 0b0;
78+
} else if (mdio->op == MDIO_OP_C22_READ) {
79+
goc_1_code = 0b1;
80+
} else {
81+
ret = -EINVAL;
82+
goto done;
83+
}
6584
}
66-
base->MAC_MDIO_ADDRESS &= ~(
67-
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GOC_1, 0b1) |
68-
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GOC_0, 0b1) |
69-
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, PA, 0b11111) |
70-
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, RDA, 0b11111));
85+
base->MAC_MDIO_ADDRESS &= ~(ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, C45E, 0b1) |
86+
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GOC_1, 0b1) |
87+
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GOC_0, 0b1) |
88+
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, PA, 0b11111) |
89+
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, RDA, 0b11111));
7190

7291
base->MAC_MDIO_ADDRESS |=
92+
/* C45E */
93+
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, C45E, clause45) |
7394
/* OP command */
7495
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GOC_1, goc_1_code) |
7596
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GOC_0, 0b1) |
@@ -82,7 +103,6 @@ static int do_transaction(struct mdio_transaction *mdio)
82103
/* Start the transaction */
83104
ENET_QOS_REG_PREP(MAC_MDIO_ADDRESS, GB, 0b1);
84105

85-
86106
ret = -ETIMEDOUT;
87107
for (int i = CONFIG_MDIO_NXP_ENET_QOS_RECHECK_COUNT; i > 0; i--) {
88108
if (!check_busy(base)) {
@@ -97,7 +117,7 @@ static int do_transaction(struct mdio_transaction *mdio)
97117
goto done;
98118
}
99119

100-
if (mdio->op == MDIO_OP_C22_READ) {
120+
if (mdio->op == MDIO_OP_C22_READ || mdio->op == MDIO_OP_C45_READ) {
101121
uint32_t val = mdio->base->MAC_MDIO_DATA;
102122

103123
*mdio->read_data =
@@ -111,8 +131,7 @@ static int do_transaction(struct mdio_transaction *mdio)
111131
return ret;
112132
}
113133

114-
static int nxp_enet_qos_mdio_read(const struct device *dev,
115-
uint8_t portaddr, uint8_t regaddr,
134+
static int nxp_enet_qos_mdio_read(const struct device *dev, uint8_t portaddr, uint8_t regaddr,
116135
uint16_t *read_data)
117136
{
118137
const struct nxp_enet_qos_mdio_config *config = dev->config;
@@ -127,11 +146,10 @@ static int nxp_enet_qos_mdio_read(const struct device *dev,
127146
.mdio_bus_mutex = &data->mdio_mutex,
128147
};
129148

130-
return do_transaction(&mdio_read);
149+
return do_transaction(&mdio_read, false);
131150
}
132151

133-
static int nxp_enet_qos_mdio_write(const struct device *dev,
134-
uint8_t portaddr, uint8_t regaddr,
152+
static int nxp_enet_qos_mdio_write(const struct device *dev, uint8_t portaddr, uint8_t regaddr,
135153
uint16_t write_data)
136154
{
137155
const struct nxp_enet_qos_mdio_config *config = dev->config;
@@ -146,12 +164,52 @@ static int nxp_enet_qos_mdio_write(const struct device *dev,
146164
.mdio_bus_mutex = &data->mdio_mutex,
147165
};
148166

149-
return do_transaction(&mdio_write);
167+
return do_transaction(&mdio_write, false);
168+
}
169+
170+
static int nxp_enet_qos_mdio_read_c45(const struct device *dev, uint8_t portaddr, uint8_t devaddr,
171+
uint16_t regaddr, uint16_t *read_data)
172+
{
173+
const struct nxp_enet_qos_mdio_config *config = dev->config;
174+
struct nxp_enet_qos_mdio_data *data = dev->data;
175+
enet_qos_t *base = ENET_QOS_MODULE_CFG(config->enet_dev)->base;
176+
struct mdio_transaction mdio_read = {
177+
.op = MDIO_OP_C45_READ,
178+
.read_data = read_data,
179+
.portaddr = portaddr,
180+
.regaddr = devaddr,
181+
.regaddr_c45 = regaddr,
182+
.base = base,
183+
.mdio_bus_mutex = &data->mdio_mutex,
184+
};
185+
186+
return do_transaction(&mdio_read, true);
187+
}
188+
189+
int nxp_enet_qos_mdio_write_c45(const struct device *dev, uint8_t portaddr, uint8_t devaddr,
190+
uint16_t regaddr, uint16_t write_data)
191+
{
192+
const struct nxp_enet_qos_mdio_config *config = dev->config;
193+
struct nxp_enet_qos_mdio_data *data = dev->data;
194+
enet_qos_t *base = ENET_QOS_MODULE_CFG(config->enet_dev)->base;
195+
struct mdio_transaction mdio_write = {
196+
.op = MDIO_OP_C45_WRITE,
197+
.write_data = write_data,
198+
.portaddr = portaddr,
199+
.regaddr = devaddr,
200+
.regaddr_c45 = regaddr,
201+
.base = base,
202+
.mdio_bus_mutex = &data->mdio_mutex,
203+
};
204+
205+
return do_transaction(&mdio_write, true);
150206
}
151207

152208
static DEVICE_API(mdio, nxp_enet_qos_mdio_api) = {
153209
.read = nxp_enet_qos_mdio_read,
154210
.write = nxp_enet_qos_mdio_write,
211+
.read_c45 = nxp_enet_qos_mdio_read_c45,
212+
.write_c45 = nxp_enet_qos_mdio_write_c45,
155213
};
156214

157215
static int nxp_enet_qos_mdio_init(const struct device *dev)

0 commit comments

Comments
 (0)