1
1
/* NXP ENET MAC Driver
2
2
*
3
- * Copyright 2023 NXP
3
+ * Copyright 2023-2024 NXP
4
4
*
5
5
* Inspiration from eth_mcux.c, which was:
6
6
* Copyright (c) 2016-2017 ARM Ltd
@@ -23,6 +23,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
23
23
#include <zephyr/sys/util.h>
24
24
#include <zephyr/kernel.h>
25
25
#include <zephyr/sys/__assert.h>
26
+ #include <zephyr/kernel/thread_stack.h>
26
27
27
28
#include <zephyr/net/net_pkt.h>
28
29
#include <zephyr/net/net_if.h>
@@ -73,10 +74,8 @@ struct nxp_enet_mac_data {
73
74
uint8_t mac_addr [6 ];
74
75
enet_handle_t enet_handle ;
75
76
struct k_sem tx_buf_sem ;
76
-
77
- K_KERNEL_STACK_MEMBER (rx_thread_stack , CONFIG_ETH_NXP_ENET_RX_THREAD_STACK_SIZE );
78
-
79
- struct k_thread rx_thread ;
77
+ struct k_work rx_work ;
78
+ const struct device * dev ;
80
79
struct k_sem rx_thread_sem ;
81
80
struct k_mutex tx_frame_buf_mutex ;
82
81
struct k_mutex rx_frame_buf_mutex ;
@@ -88,6 +87,24 @@ struct nxp_enet_mac_data {
88
87
uint8_t * rx_frame_buf ;
89
88
};
90
89
90
+ static K_THREAD_STACK_DEFINE (enet_rx_stack , CONFIG_ETH_NXP_ENET_RX_THREAD_STACK_SIZE ) ;
91
+ static struct k_work_q rx_work_queue ;
92
+
93
+ static int rx_queue_init (void )
94
+ {
95
+ struct k_work_queue_config cfg = {.name = "ENET_RX" };
96
+
97
+ k_work_queue_init (& rx_work_queue );
98
+ k_work_queue_start (& rx_work_queue , enet_rx_stack ,
99
+ K_THREAD_STACK_SIZEOF (enet_rx_stack ),
100
+ K_PRIO_COOP (CONFIG_ETH_NXP_ENET_RX_THREAD_PRIORITY ),
101
+ & cfg );
102
+
103
+ return 0 ;
104
+ }
105
+
106
+ SYS_INIT (rx_queue_init , POST_KERNEL , 0 );
107
+
91
108
static inline struct net_if * get_iface (struct nxp_enet_mac_data * data )
92
109
{
93
110
return data -> iface ;
@@ -387,22 +404,23 @@ static int eth_nxp_enet_rx(const struct device *dev)
387
404
return - EIO ;
388
405
}
389
406
390
- static void eth_nxp_enet_rx_thread (void * arg1 , void * unused1 , void * unused2 )
407
+ static void eth_nxp_enet_rx_thread (struct k_work * work )
391
408
{
392
- const struct device * dev = arg1 ;
409
+ struct nxp_enet_mac_data * data =
410
+ CONTAINER_OF (work , struct nxp_enet_mac_data , rx_work );
411
+ const struct device * dev = data -> dev ;
393
412
const struct nxp_enet_mac_config * config = dev -> config ;
394
- struct nxp_enet_mac_data * data = dev -> data ;
413
+ int ret ;
395
414
396
- while (1 ) {
397
- if (k_sem_take (& data -> rx_thread_sem , K_FOREVER ) == 0 ) {
398
- while (eth_nxp_enet_rx (dev ) == 1 ) {
399
- ;
400
- }
401
- /* enable the IRQ for RX */
402
- ENET_EnableInterrupts (config -> base ,
403
- kENET_RxFrameInterrupt | kENET_RxBufferInterrupt );
404
- }
415
+ if (k_sem_take (& data -> rx_thread_sem , K_FOREVER )) {
416
+ return ;
405
417
}
418
+
419
+ do {
420
+ ret = eth_nxp_enet_rx (dev );
421
+ } while (ret == 1 );
422
+
423
+ ENET_EnableInterrupts (config -> base , kENET_RxFrameInterrupt );
406
424
}
407
425
408
426
static int nxp_enet_phy_reset_and_configure (const struct device * phy )
@@ -514,10 +532,10 @@ static void eth_nxp_enet_isr(const struct device *dev)
514
532
515
533
uint32_t eir = ENET_GetInterruptStatus (config -> base );
516
534
517
- if (eir & (kENET_RxBufferInterrupt | kENET_RxFrameInterrupt )) {
535
+ if (eir & (kENET_RxFrameInterrupt )) {
518
536
ENET_ReceiveIRQHandler (ENET_IRQ_HANDLER_ARGS (config -> base , & data -> enet_handle ));
519
- ENET_DisableInterrupts (config -> base ,
520
- kENET_RxFrameInterrupt | kENET_RxBufferInterrupt );
537
+ ENET_DisableInterrupts (config -> base , kENET_RxFrameInterrupt );
538
+ k_work_submit_to_queue ( & rx_work_queue , & data -> rx_work );
521
539
}
522
540
523
541
if (eir & kENET_TxFrameInterrupt ) {
@@ -552,19 +570,12 @@ static int eth_nxp_enet_init(const struct device *dev)
552
570
#if defined(CONFIG_PTP_CLOCK_NXP_ENET )
553
571
k_sem_init (& data -> ptp_ts_sem , 0 , 1 );
554
572
#endif
573
+ k_work_init (& data -> rx_work , eth_nxp_enet_rx_thread );
555
574
556
575
if (config -> generate_mac ) {
557
576
config -> generate_mac (data -> mac_addr );
558
577
}
559
578
560
- /* Start interruption-poll thread */
561
- k_thread_create (& data -> rx_thread , data -> rx_thread_stack ,
562
- K_KERNEL_STACK_SIZEOF (data -> rx_thread_stack ),
563
- eth_nxp_enet_rx_thread , (void * ) dev , NULL , NULL ,
564
- K_PRIO_COOP (2 ),
565
- 0 , K_NO_WAIT );
566
- k_thread_name_set (& data -> rx_thread , "eth_nxp_enet_rx" );
567
-
568
579
err = clock_control_get_rate (config -> clock_dev , config -> clock_subsys ,
569
580
& enet_module_clock_rate );
570
581
if (err ) {
@@ -888,6 +899,7 @@ static const struct ethernet_api api_funcs = {
888
899
NXP_ENET_DECIDE_MAC_ADDR(n) \
889
900
.tx_frame_buf = nxp_enet_##n##_tx_frame_buf, \
890
901
.rx_frame_buf = nxp_enet_##n##_rx_frame_buf, \
902
+ .dev = DEVICE_DT_INST_GET(n), \
891
903
}; \
892
904
\
893
905
ETH_NXP_ENET_PM_DEVICE_INIT(n) \
0 commit comments