@@ -47,17 +47,34 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
47
47
#include <zephyr/pm/device.h>
48
48
#endif
49
49
50
+ #include "eth.h"
50
51
#include <zephyr/drivers/ethernet/eth_nxp_enet.h>
51
52
#include <zephyr/dt-bindings/ethernet/nxp_enet.h>
52
53
#include <fsl_enet.h>
53
54
55
+ #define FREESCALE_OUI_B0 0x00
56
+ #define FREESCALE_OUI_B1 0x04
57
+ #define FREESCALE_OUI_B2 0x9f
58
+
59
+ #if defined(CONFIG_SOC_SERIES_IMXRT10XX )
60
+ #define ETH_NXP_ENET_UNIQUE_ID (OCOTP->CFG1 ^ OCOTP->CFG2)
61
+ #elif defined(CONFIG_SOC_SERIES_IMXRT11XX )
62
+ #define ETH_NXP_ENET_UNIQUE_ID (OCOTP->FUSEN[40].FUSE)
63
+ #elif defined(CONFIG_SOC_SERIES_KINETIS_K6X )
64
+ #define ETH_NXP_ENET_UNIQUE_ID (SIM->UIDH ^ SIM->UIDMH ^ SIM->UIDML ^ SIM->UIDL)
65
+ #else
66
+ #define ETH_NXP_ENET_UNIQUE_ID 0xFFFFFF
67
+ #error "Unsupported SOC"
68
+ #endif
69
+
54
70
#define RING_ID 0
55
71
56
72
struct nxp_enet_mac_config {
57
73
ENET_Type * base ;
58
74
const struct device * clock_dev ;
59
75
clock_control_subsys_t clock_subsys ;
60
- void (* generate_mac )(uint8_t * mac_addr );
76
+ bool generate_mac ;
77
+ bool unique_mac ;
61
78
const struct pinctrl_dev_config * pincfg ;
62
79
enet_buffer_config_t buffer_config ;
63
80
uint8_t phy_mode ;
@@ -549,6 +566,18 @@ static void eth_nxp_enet_isr(const struct device *dev)
549
566
irq_unlock (irq_lock_key );
550
567
}
551
568
569
+ static inline void nxp_enet_unique_mac (uint8_t * mac_addr )
570
+ {
571
+ uint32_t id = ETH_NXP_ENET_UNIQUE_ID ;
572
+
573
+ mac_addr [0 ] = FREESCALE_OUI_B0 ;
574
+ mac_addr [1 ] = FREESCALE_OUI_B1 ;
575
+ mac_addr [2 ] = FREESCALE_OUI_B2 ;
576
+ mac_addr [3 ] = FIELD_GET (0xFF0000 , id );
577
+ mac_addr [4 ] = FIELD_GET (0x00FF00 , id );
578
+ mac_addr [5 ] = FIELD_GET (0x0000FF , id );
579
+ }
580
+
552
581
static int eth_nxp_enet_init (const struct device * dev )
553
582
{
554
583
struct nxp_enet_mac_data * data = dev -> data ;
@@ -572,8 +601,13 @@ static int eth_nxp_enet_init(const struct device *dev)
572
601
#endif
573
602
k_work_init (& data -> rx_work , eth_nxp_enet_rx_thread );
574
603
604
+ if (config -> unique_mac ) {
605
+ nxp_enet_unique_mac (data -> mac_addr );
606
+ }
607
+
575
608
if (config -> generate_mac ) {
576
- config -> generate_mac (data -> mac_addr );
609
+ gen_random_mac (data -> mac_addr ,
610
+ FREESCALE_OUI_B0 , FREESCALE_OUI_B1 , FREESCALE_OUI_B2 );
577
611
}
578
612
579
613
err = clock_control_get_rate (config -> clock_dev , config -> clock_subsys ,
@@ -714,71 +748,6 @@ static const struct ethernet_api api_funcs = {
714
748
irq_enable(DT_IRQ_BY_IDX(node_id, idx, irq)); \
715
749
} while (false);
716
750
717
- #define FREESCALE_OUI_B0 0x00
718
- #define FREESCALE_OUI_B1 0x04
719
- #define FREESCALE_OUI_B2 0x9f
720
-
721
- #if defined(CONFIG_SOC_SERIES_IMXRT10XX )
722
- #define ETH_NXP_ENET_UNIQUE_ID (OCOTP->CFG1 ^ OCOTP->CFG2)
723
- #elif defined(CONFIG_SOC_SERIES_IMXRT11XX )
724
- #define ETH_NXP_ENET_UNIQUE_ID (OCOTP->FUSEN[40].FUSE)
725
- #elif defined(CONFIG_SOC_SERIES_KINETIS_K6X )
726
- #define ETH_NXP_ENET_UNIQUE_ID (SIM->UIDH ^ SIM->UIDMH ^ SIM->UIDML ^ SIM->UIDL)
727
- #else
728
- #error "Unsupported SOC"
729
- #endif
730
-
731
- #define NXP_ENET_GENERATE_MAC_RANDOM (n ) \
732
- static void generate_eth_##n##_mac(uint8_t *mac_addr) \
733
- { \
734
- gen_random_mac(mac_addr, \
735
- FREESCALE_OUI_B0, \
736
- FREESCALE_OUI_B1, \
737
- FREESCALE_OUI_B2); \
738
- }
739
-
740
- #define NXP_ENET_GENERATE_MAC_UNIQUE (n ) \
741
- static void generate_eth_##n##_mac(uint8_t *mac_addr) \
742
- { \
743
- uint32_t id = ETH_NXP_ENET_UNIQUE_ID; \
744
- \
745
- mac_addr[0] = FREESCALE_OUI_B0; \
746
- mac_addr[0] |= 0x02; /* force LAA bit */ \
747
- mac_addr [1 ] = FREESCALE_OUI_B1 ; \
748
- mac_addr [2 ] = FREESCALE_OUI_B2 ; \
749
- mac_addr [3 ] = id >> 8 ; \
750
- mac_addr [4 ] = id >> 16 ; \
751
- mac_addr [5 ] = id >> 0 ; \
752
- mac_addr [5 ] += n ; \
753
- }
754
-
755
- #define NXP_ENET_GENERATE_MAC (n ) \
756
- COND_CODE_1(DT_INST_PROP(n, zephyr_random_mac_address), \
757
- (NXP_ENET_GENERATE_MAC_RANDOM(n)), \
758
- (NXP_ENET_GENERATE_MAC_UNIQUE(n)))
759
-
760
- #define NXP_ENET_DECIDE_MAC_ADDR (n ) \
761
- COND_CODE_1(NODE_HAS_VALID_MAC_ADDR(DT_DRV_INST(n)), \
762
- (NXP_ENET_MAC_ADDR_LOCAL(n)), \
763
- (NXP_ENET_MAC_ADDR_GENERATED(n)))
764
-
765
- #define NXP_ENET_DECIDE_MAC_GEN_FUNC (n ) \
766
- COND_CODE_1(NODE_HAS_VALID_MAC_ADDR(DT_DRV_INST(n)), \
767
- (NXP_ENET_GEN_MAC_FUNCTION_NO(n)), \
768
- (NXP_ENET_GEN_MAC_FUNCTION_YES(n)))
769
-
770
- #define NXP_ENET_MAC_ADDR_LOCAL (n ) \
771
- .mac_addr = DT_INST_PROP(n, local_mac_address),
772
-
773
- #define NXP_ENET_MAC_ADDR_GENERATED (n ) \
774
- .mac_addr = {0},
775
-
776
- #define NXP_ENET_GEN_MAC_FUNCTION_NO (n ) \
777
- .generate_mac = NULL,
778
-
779
- #define NXP_ENET_GEN_MAC_FUNCTION_YES (n ) \
780
- .generate_mac = generate_eth_##n##_mac,
781
-
782
751
#define NXP_ENET_DT_PHY_DEV (node_id , phy_phandle , idx ) \
783
752
DEVICE_DT_GET(DT_PHANDLE_BY_IDX(node_id, phy_phandle, idx))
784
753
@@ -830,8 +799,14 @@ static const struct ethernet_api api_funcs = {
830
799
.txFrameInfo = NULL
831
800
#endif
832
801
802
+ #define NXP_ENET_NODE_HAS_MAC_ADDR_CHECK (n ) \
803
+ BUILD_ASSERT(NODE_HAS_VALID_MAC_ADDR(DT_DRV_INST(n)) || \
804
+ DT_INST_PROP(n, zephyr_random_mac_address) || \
805
+ DT_INST_PROP(n, nxp_unique_mac), \
806
+ "MAC address not specified on ENET DT node");
807
+
833
808
#define NXP_ENET_MAC_INIT (n ) \
834
- NXP_ENET_GENERATE_MAC (n) \
809
+ NXP_ENET_NODE_HAS_MAC_ADDR_CHECK (n) \
835
810
\
836
811
PINCTRL_DT_INST_DEFINE(n); \
837
812
\
@@ -887,7 +862,9 @@ static const struct ethernet_api api_funcs = {
887
862
.phy_dev = DEVICE_DT_GET(DT_INST_PHANDLE(n, phy_handle)), \
888
863
.mdio = DEVICE_DT_GET(DT_INST_PHANDLE(n, nxp_mdio)), \
889
864
NXP_ENET_PTP_DEV(n) \
890
- NXP_ENET_DECIDE_MAC_GEN_FUNC(n) \
865
+ .generate_mac = DT_INST_PROP(n, \
866
+ zephyr_random_mac_address), \
867
+ .unique_mac = DT_INST_PROP(n, nxp_unique_mac), \
891
868
}; \
892
869
\
893
870
static _nxp_enet_driver_buffer_section uint8_t \
@@ -896,10 +873,10 @@ static const struct ethernet_api api_funcs = {
896
873
nxp_enet_##n##_rx_frame_buf[NET_ETH_MAX_FRAME_SIZE]; \
897
874
\
898
875
struct nxp_enet_mac_data nxp_enet_##n##_data = { \
899
- NXP_ENET_DECIDE_MAC_ADDR(n) \
900
876
.tx_frame_buf = nxp_enet_##n##_tx_frame_buf, \
901
877
.rx_frame_buf = nxp_enet_##n##_rx_frame_buf, \
902
878
.dev = DEVICE_DT_INST_GET(n), \
879
+ .mac_addr = DT_INST_PROP_OR(n, local_mac_address, {0}), \
903
880
}; \
904
881
\
905
882
ETH_NXP_ENET_PM_DEVICE_INIT(n) \
0 commit comments