@@ -55,6 +55,13 @@ LOG_MODULE_REGISTER(phy_tja1103, CONFIG_PHY_LOG_LEVEL);
55
55
#define TJA1103_ALWAYS_ACCESSIBLE (0x801F)
56
56
#define TJA1103_ALWAYS_ACCESSIBLE_FUSA_PASS_IRQ BIT(4)
57
57
58
+ #define MASTER_SLAVE_DEFAULT 0
59
+ #define MASTER_SLAVE_MASTER 1
60
+ #define MASTER_SLAVE_SLAVE 2
61
+ #define MASTER_SLAVE_AUTO 3
62
+
63
+ #define SWITCH_WAIT_RANGE (min , max ) ((min) + (sys_rand16_get() % ((max) - (min))))
64
+
58
65
struct phy_tja1103_config {
59
66
const struct device * mdio ;
60
67
struct gpio_dt_spec gpio_interrupt ;
@@ -70,8 +77,7 @@ struct phy_tja1103_data {
70
77
struct gpio_callback phy_tja1103_int_callback ;
71
78
void * cb_data ;
72
79
struct k_work_delayable phy_work ;
73
- uint64_t start_time ;
74
- uint32_t wait_time ;
80
+ k_timepoint_t timeout ;
75
81
};
76
82
77
83
static inline int phy_tja1103_c22_read (const struct device * dev , uint16_t reg , uint16_t * val )
@@ -152,23 +158,33 @@ static int phy_tja1103_id(const struct device *dev, uint32_t *phy_id)
152
158
}
153
159
154
160
static int phy_tja1103_get_link_state (const struct device * dev , struct phy_link_state * state )
161
+ {
162
+ struct phy_tja1103_data * const data = dev -> data ;
163
+
164
+ state -> speed = data -> state .speed ;
165
+ state -> is_up = data -> state .is_up ;
166
+
167
+ return 0 ;
168
+ }
169
+
170
+ static int phy_tja1103_update_link_state (const struct device * dev , struct phy_link_state * state )
155
171
{
156
172
struct phy_tja1103_data * const data = dev -> data ;
157
173
uint16_t val ;
158
174
int rc = 0 ;
159
175
160
- k_sem_take (& data -> sem , K_FOREVER );
161
-
162
176
if (phy_tja1103_c45_read (dev , MDIO_MMD_VENDOR_SPECIFIC1 , TJA1103_PHY_STATUS , & val ) < 0 ) {
163
177
return - EIO ;
164
178
}
165
179
166
- k_sem_give (& data -> sem );
180
+ k_sem_take (& data -> sem , K_FOREVER );
167
181
168
182
/* TJA1103 Only supports 100BASE Full-duplex */
169
183
state -> speed = LINK_FULL_100BASE ;
170
184
state -> is_up = (val & TJA1103_PHY_STATUS_LINK_STAT ) != 0 ;
171
185
186
+ k_sem_give (& data -> sem );
187
+
172
188
LOG_DBG ("TJA1103 Link state %i" , state -> is_up );
173
189
174
190
return rc ;
@@ -216,22 +232,21 @@ static void phy_work_handler(struct k_work *work)
216
232
int rc ;
217
233
const struct phy_tja1103_config * const cfg = dev -> config ;
218
234
219
- rc = phy_tja1103_get_link_state (dev , & state );
235
+ rc = phy_tja1103_update_link_state (dev , & state );
220
236
221
237
/* Update link state and trigger callback if changed */
222
- if (rc == 0 && ( state .speed != data -> state . speed || state . is_up != data -> state .is_up ) ) {
238
+ if (rc == 0 && state .is_up != data -> state .is_up ) {
223
239
memcpy (& data -> state , & state , sizeof (struct phy_link_state ));
224
240
if (data -> cb ) {
225
241
data -> cb (dev , & data -> state , data -> cb_data );
226
242
}
227
243
}
228
244
229
- if (cfg -> master_slave == 3 && !data -> state .is_up &&
230
- k_uptime_delta ( & data -> start_time ) > data -> wait_time ) {
245
+ if (cfg -> master_slave == MASTER_SLAVE_AUTO && !data -> state .is_up &&
246
+ sys_timepoint_expired ( data -> timeout ) ) {
231
247
uint16_t val ;
232
248
233
- data -> start_time = k_uptime_get ();
234
- data -> wait_time = 1000 + (sys_rand32_get () % 2001 );
249
+ data -> timeout = sys_timepoint_calc (K_MSEC (SWITCH_WAIT_RANGE (1000 , 3000 )));
235
250
236
251
phy_tja1103_c45_read (dev , MDIO_MMD_PMAPMD , MDIO_PMA_PMD_BT1_CTRL , & val );
237
252
@@ -244,8 +259,8 @@ static void phy_work_handler(struct k_work *work)
244
259
if (cfg -> gpio_interrupt .port ) {
245
260
phy_tja1103_ack_irq (dev );
246
261
247
- if (cfg -> master_slave == 3 && !data -> state .is_up ) {
248
- k_work_reschedule (& data -> phy_work , K_MSEC (data -> wait_time + 10 ));
262
+ if (cfg -> master_slave == MASTER_SLAVE_AUTO && !data -> state .is_up ) {
263
+ k_work_reschedule (& data -> phy_work , sys_timepoint_timeout (data -> timeout ));
249
264
}
250
265
251
266
return ;
@@ -301,8 +316,7 @@ static void phy_tja1103_cfg_irq_poll(const struct device *dev)
301
316
}
302
317
#endif
303
318
304
- data -> start_time = k_uptime_get ();
305
- data -> wait_time = 1000 + (sys_rand32_get () % 4001 );
319
+ data -> timeout = sys_timepoint_calc (K_MSEC (SWITCH_WAIT_RANGE (1000 , 3000 )));
306
320
307
321
k_work_init_delayable (& data -> phy_work , phy_work_handler );
308
322
@@ -350,9 +364,9 @@ static int phy_tja1103_init(const struct device *dev)
350
364
}
351
365
352
366
/* Change master/slave mode if need */
353
- if (cfg -> master_slave == 1 ) {
367
+ if (cfg -> master_slave == MASTER_SLAVE_MASTER ) {
354
368
val |= MDIO_PMA_PMD_BT1_CTRL_CFG_MST ;
355
- } else if (cfg -> master_slave == 2 ) {
369
+ } else if (cfg -> master_slave == MASTER_SLAVE_SLAVE ) {
356
370
val &= ~MDIO_PMA_PMD_BT1_CTRL_CFG_MST ;
357
371
}
358
372
@@ -388,11 +402,7 @@ static int phy_tja1103_link_cb_set(const struct device *dev, phy_callback_t cb,
388
402
data -> cb = cb ;
389
403
data -> cb_data = user_data ;
390
404
391
- rc = phy_tja1103_get_link_state (dev , & data -> state );
392
-
393
- if (rc == 0 ) {
394
- data -> cb (dev , & data -> state , data -> cb_data );
395
- }
405
+ data -> cb (dev , & data -> state , data -> cb_data );
396
406
397
407
return rc ;
398
408
}
0 commit comments