@@ -32,6 +32,7 @@ struct mdio_transaction {
32
32
};
33
33
uint8_t portaddr ;
34
34
uint8_t regaddr ;
35
+ uint16_t regaddr_c45 ;
35
36
enet_qos_t * base ;
36
37
struct k_mutex * mdio_bus_mutex ;
37
38
};
@@ -44,32 +45,52 @@ static bool check_busy(enet_qos_t *base)
44
45
return ENET_QOS_REG_GET (MAC_MDIO_ADDRESS , GB , val );
45
46
}
46
47
47
- static int do_transaction (struct mdio_transaction * mdio )
48
+ static int do_transaction (struct mdio_transaction * mdio , bool clause45 )
48
49
{
49
50
enet_qos_t * base = mdio -> base ;
50
51
uint8_t goc_1_code ;
51
52
int ret ;
52
53
53
54
k_mutex_lock (mdio -> mdio_bus_mutex , K_FOREVER );
54
55
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
+ }
62
72
} 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
+ }
65
84
}
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 ));
71
90
72
91
base -> MAC_MDIO_ADDRESS |=
92
+ /* C45E */
93
+ ENET_QOS_REG_PREP (MAC_MDIO_ADDRESS , C45E , clause45 ) |
73
94
/* OP command */
74
95
ENET_QOS_REG_PREP (MAC_MDIO_ADDRESS , GOC_1 , goc_1_code ) |
75
96
ENET_QOS_REG_PREP (MAC_MDIO_ADDRESS , GOC_0 , 0b1 ) |
@@ -82,7 +103,6 @@ static int do_transaction(struct mdio_transaction *mdio)
82
103
/* Start the transaction */
83
104
ENET_QOS_REG_PREP (MAC_MDIO_ADDRESS , GB , 0b1 );
84
105
85
-
86
106
ret = - ETIMEDOUT ;
87
107
for (int i = CONFIG_MDIO_NXP_ENET_QOS_RECHECK_COUNT ; i > 0 ; i -- ) {
88
108
if (!check_busy (base )) {
@@ -97,7 +117,7 @@ static int do_transaction(struct mdio_transaction *mdio)
97
117
goto done ;
98
118
}
99
119
100
- if (mdio -> op == MDIO_OP_C22_READ ) {
120
+ if (mdio -> op == MDIO_OP_C22_READ || mdio -> op == MDIO_OP_C45_READ ) {
101
121
uint32_t val = mdio -> base -> MAC_MDIO_DATA ;
102
122
103
123
* mdio -> read_data =
@@ -111,8 +131,7 @@ static int do_transaction(struct mdio_transaction *mdio)
111
131
return ret ;
112
132
}
113
133
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 ,
116
135
uint16_t * read_data )
117
136
{
118
137
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,
127
146
.mdio_bus_mutex = & data -> mdio_mutex ,
128
147
};
129
148
130
- return do_transaction (& mdio_read );
149
+ return do_transaction (& mdio_read , false );
131
150
}
132
151
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 ,
135
153
uint16_t write_data )
136
154
{
137
155
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,
146
164
.mdio_bus_mutex = & data -> mdio_mutex ,
147
165
};
148
166
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);
150
206
}
151
207
152
208
static DEVICE_API (mdio , nxp_enet_qos_mdio_api ) = {
153
209
.read = nxp_enet_qos_mdio_read ,
154
210
.write = nxp_enet_qos_mdio_write ,
211
+ .read_c45 = nxp_enet_qos_mdio_read_c45 ,
212
+ .write_c45 = nxp_enet_qos_mdio_write_c45 ,
155
213
};
156
214
157
215
static int nxp_enet_qos_mdio_init (const struct device * dev )
0 commit comments