Skip to content

Commit ac58f3a

Browse files
decsnyaescolar
authored andcommitted
drivers: nxp_enet: Generate MAC using eth.h
The MAC address macros are ridiculous in this driver. Rewrite to be simpler and use eth.h common function. Also, clarify the mac address generation on the DT overlays. Signed-off-by: Declan Snyder <[email protected]>
1 parent 4be0439 commit ac58f3a

File tree

9 files changed

+61
-70
lines changed

9 files changed

+61
-70
lines changed

boards/nxp/frdm_k64f/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
pinctrl-0 = <&pinmux_enet>;
4343
pinctrl-names = "default";
4444
phy-handle = <&phy>;
45+
zephyr,random-mac-address;
4546
};
4647

4748

boards/nxp/mimxrt1024_evk/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pinctrl-0 = <&pinmux_enet>;
4444
pinctrl-names = "default";
4545
phy-handle = <&phy>;
46+
zephyr,random-mac-address;
4647
};
4748

4849
&enet_mdio {

boards/nxp/mimxrt1050_evk/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pinctrl-0 = <&pinmux_enet>;
4444
pinctrl-names = "default";
4545
phy-handle = <&phy>;
46+
zephyr,random-mac-address;
4647
};
4748

4849
&enet_mdio {

boards/nxp/mimxrt1060_evk/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pinctrl-0 = <&pinmux_enet>;
4444
pinctrl-names = "default";
4545
phy-handle = <&phy>;
46+
zephyr,random-mac-address;
4647
};
4748

4849
&enet_mdio {

boards/nxp/mimxrt1064_evk/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pinctrl-0 = <&pinmux_enet>;
4444
pinctrl-names = "default";
4545
phy-handle = <&phy>;
46+
zephyr,random-mac-address;
4647
};
4748

4849
&enet_mdio {

boards/nxp/mimxrt1160_evk/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pinctrl-names = "default";
4444
phy-handle = <&phy>;
4545
phy-connection-type = "rmii";
46+
zephyr,random-mac-address;
4647
};
4748

4849
&enet_mdio {

boards/nxp/mimxrt1170_evk/dts/nxp,enet-experimental.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pinctrl-names = "default";
4444
phy-handle = <&phy>;
4545
phy-connection-type = "rmii";
46+
zephyr,random-mac-address;
4647
};
4748

4849
&enet_mdio {

drivers/ethernet/eth_nxp_enet.c

Lines changed: 47 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,34 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
4747
#include <zephyr/pm/device.h>
4848
#endif
4949

50+
#include "eth.h"
5051
#include <zephyr/drivers/ethernet/eth_nxp_enet.h>
5152
#include <zephyr/dt-bindings/ethernet/nxp_enet.h>
5253
#include <fsl_enet.h>
5354

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+
5470
#define RING_ID 0
5571

5672
struct nxp_enet_mac_config {
5773
ENET_Type *base;
5874
const struct device *clock_dev;
5975
clock_control_subsys_t clock_subsys;
60-
void (*generate_mac)(uint8_t *mac_addr);
76+
bool generate_mac;
77+
bool unique_mac;
6178
const struct pinctrl_dev_config *pincfg;
6279
enet_buffer_config_t buffer_config;
6380
uint8_t phy_mode;
@@ -549,6 +566,18 @@ static void eth_nxp_enet_isr(const struct device *dev)
549566
irq_unlock(irq_lock_key);
550567
}
551568

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+
552581
static int eth_nxp_enet_init(const struct device *dev)
553582
{
554583
struct nxp_enet_mac_data *data = dev->data;
@@ -572,8 +601,13 @@ static int eth_nxp_enet_init(const struct device *dev)
572601
#endif
573602
k_work_init(&data->rx_work, eth_nxp_enet_rx_thread);
574603

604+
if (config->unique_mac) {
605+
nxp_enet_unique_mac(data->mac_addr);
606+
}
607+
575608
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);
577611
}
578612

579613
err = clock_control_get_rate(config->clock_dev, config->clock_subsys,
@@ -714,71 +748,6 @@ static const struct ethernet_api api_funcs = {
714748
irq_enable(DT_IRQ_BY_IDX(node_id, idx, irq)); \
715749
} while (false);
716750

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-
782751
#define NXP_ENET_DT_PHY_DEV(node_id, phy_phandle, idx) \
783752
DEVICE_DT_GET(DT_PHANDLE_BY_IDX(node_id, phy_phandle, idx))
784753

@@ -830,8 +799,14 @@ static const struct ethernet_api api_funcs = {
830799
.txFrameInfo = NULL
831800
#endif
832801

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+
833808
#define NXP_ENET_MAC_INIT(n) \
834-
NXP_ENET_GENERATE_MAC(n) \
809+
NXP_ENET_NODE_HAS_MAC_ADDR_CHECK(n) \
835810
\
836811
PINCTRL_DT_INST_DEFINE(n); \
837812
\
@@ -887,7 +862,9 @@ static const struct ethernet_api api_funcs = {
887862
.phy_dev = DEVICE_DT_GET(DT_INST_PHANDLE(n, phy_handle)), \
888863
.mdio = DEVICE_DT_GET(DT_INST_PHANDLE(n, nxp_mdio)), \
889864
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), \
891868
}; \
892869
\
893870
static _nxp_enet_driver_buffer_section uint8_t \
@@ -896,10 +873,10 @@ static const struct ethernet_api api_funcs = {
896873
nxp_enet_##n##_rx_frame_buf[NET_ETH_MAX_FRAME_SIZE]; \
897874
\
898875
struct nxp_enet_mac_data nxp_enet_##n##_data = { \
899-
NXP_ENET_DECIDE_MAC_ADDR(n) \
900876
.tx_frame_buf = nxp_enet_##n##_tx_frame_buf, \
901877
.rx_frame_buf = nxp_enet_##n##_rx_frame_buf, \
902878
.dev = DEVICE_DT_INST_GET(n), \
879+
.mac_addr = DT_INST_PROP_OR(n, local_mac_address, {0}), \
903880
}; \
904881
\
905882
ETH_NXP_ENET_PM_DEVICE_INIT(n) \

dts/bindings/ethernet/nxp,enet-mac.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,10 @@ properties:
2222
required: true
2323
description: |
2424
Corresponding ptp clock device
25+
26+
nxp,unique-mac:
27+
type: boolean
28+
description: |
29+
Use unique silicon ID to use UAA MAC.
30+
This property will be overridden if the node has
31+
zephyr,random-mac-address or local-mac-address also.

0 commit comments

Comments
 (0)