@@ -93,6 +93,7 @@ static void enable_mdio_bus(const struct mdio_xilinx_axienet_config *config,
93
93
if ((xilinx_axienet_read_mdio_register (config , XILINX_AXIENET_MDIO_SETUP_REG_OFFSET ) &
94
94
XILINX_AXIENET_MDIO_SETUP_REG_MDIO_ENABLE_MASK ) == 0 ) {
95
95
int err ;
96
+ int count = 0 ;
96
97
97
98
xilinx_axienet_mdio_write_register (config , XILINX_AXIENET_MDIO_SETUP_REG_OFFSET ,
98
99
XILINX_AXIENET_MDIO_SETUP_REG_MDIO_ENABLE_MASK |
@@ -103,7 +104,7 @@ static void enable_mdio_bus(const struct mdio_xilinx_axienet_config *config,
103
104
XILINX_AXIENET_MDIO_INTERRUPT_MASK );
104
105
105
106
if (config -> have_irq ) {
106
- LOG_DBG ("Waiting for bus enable! " );
107
+ LOG_DBG ("Waiting for bus enable IRQ " );
107
108
err = k_sem_take (& data -> irq_sema ,
108
109
K_MSEC (XILINX_AXIENET_MDIO_INTERRUPT_TIMEOUT_MS ));
109
110
@@ -115,7 +116,12 @@ static void enable_mdio_bus(const struct mdio_xilinx_axienet_config *config,
115
116
while ((xilinx_axienet_read_mdio_register (config ,
116
117
XILINX_AXIENET_MDIO_SETUP_REG_OFFSET ) &
117
118
XILINX_AXIENET_MDIO_SETUP_REG_MDIO_ENABLE_MASK ) == 0 ) {
118
- LOG_DBG ("Waiting for bus enable!" );
119
+ LOG_DBG ("Waiting for bus enable flag" );
120
+ k_busy_wait (1 );
121
+ if (count ++ > 1000 ) {
122
+ LOG_ERR ("MDIO bus enable timeout" );
123
+ return ;
124
+ }
119
125
}
120
126
121
127
} else {
@@ -164,6 +170,7 @@ static int mdio_xilinx_axienet_read(const struct device *dev, uint8_t prtad, uin
164
170
const struct mdio_xilinx_axienet_config * config = dev -> config ;
165
171
struct mdio_xilinx_axienet_data * dev_data = dev -> data ;
166
172
int err ;
173
+ int count = 0 ;
167
174
168
175
if (k_is_in_isr ()) {
169
176
LOG_ERR ("Called MDIO read in ISR!" );
@@ -201,6 +208,11 @@ static int mdio_xilinx_axienet_read(const struct device *dev, uint8_t prtad, uin
201
208
while ((xilinx_axienet_read_mdio_register (config , XILINX_AXIENET_MDIO_CONTROL_REG_OFFSET ) &
202
209
XILINX_AXIENET_MDIO_CONTROL_REG_MASK_READY ) == 0x0 ) {
203
210
LOG_DBG ("Transfer is not yet ready!" );
211
+ k_busy_wait (1 );
212
+ if (count ++ > 1000 ) {
213
+ LOG_ERR ("MDIO read timeout" );
214
+ return - ETIMEDOUT ;
215
+ }
204
216
}
205
217
206
218
LOG_DBG ("IRQ from MDIO received - read complete!" );
@@ -220,6 +232,7 @@ static int mdio_xilinx_axienet_write(const struct device *dev, uint8_t prtad, ui
220
232
const struct mdio_xilinx_axienet_config * config = dev -> config ;
221
233
struct mdio_xilinx_axienet_data * dev_data = dev -> data ;
222
234
int err ;
235
+ int count = 0 ;
223
236
224
237
if (k_is_in_isr ()) {
225
238
LOG_ERR ("Called MDIO write in ISR!" );
@@ -257,6 +270,11 @@ static int mdio_xilinx_axienet_write(const struct device *dev, uint8_t prtad, ui
257
270
while ((xilinx_axienet_read_mdio_register (config , XILINX_AXIENET_MDIO_CONTROL_REG_OFFSET ) &
258
271
XILINX_AXIENET_MDIO_CONTROL_REG_MASK_READY ) == 0x0 ) {
259
272
LOG_DBG ("IRQ from MDIO received but transfer is not yet ready!" );
273
+ k_busy_wait (1 );
274
+ if (count ++ > 1000 ) {
275
+ LOG_ERR ("MDIO write timeout" );
276
+ return - ETIMEDOUT ;
277
+ }
260
278
}
261
279
262
280
LOG_DBG ("IRQ from MDIO received - write complete!" );
0 commit comments