Skip to content

Commit cf0d1b8

Browse files
pdgendtfabiobaltieri
authored andcommitted
drivers: ethernet: sam_gmac: Use ethernet MAC configuration
Rework the Atmel SAM GMAC driver to read a MAC address from the provided NVMEM cell instead of using I2C commands directly. Signed-off-by: Pieter De Gendt <[email protected]>
1 parent 9445d5d commit cf0d1b8

File tree

12 files changed

+71
-106
lines changed

12 files changed

+71
-106
lines changed

boards/atmel/sam/sam4e_xpro/sam4e_xpro.dts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@
201201
pinctrl-0 = <&gmac_mii>;
202202
pinctrl-names = "default";
203203

204+
/* Atmel OUI */
205+
zephyr,mac-address-prefix = [00 04 25];
204206
zephyr,random-mac-address;
205207

206208
phy-handle = <&phy>;

boards/atmel/sam/sam_e70_xplained/Kconfig.defconfig

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,8 @@ if ETH_SAM_GMAC
77

88
# Read MAC address from AT24MAC402 EEPROM
99

10-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS
11-
default 0x9A
12-
13-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE
14-
default 1
15-
16-
config ETH_SAM_GMAC_MAC_I2C_EEPROM
17-
default y
18-
select I2C
10+
config EEPROM
11+
default y if NVMEM
1912

2013
endif # ETH_SAM_GMAC
2114

boards/atmel/sam/sam_e70_xplained/sam_e70_xplained-common.dtsi

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,23 @@
8181
pinctrl-names = "default";
8282

8383
eeprom: eeprom@5f {
84-
compatible = "atmel,24mac402";
84+
compatible = "atmel,at24", "atmel,24mac402";
8585
reg = <0x5f>;
86+
size = <256>;
87+
pagesize = <16>;
88+
address-width = <8>;
89+
timeout = <5>;
90+
91+
nvmem-layout {
92+
compatible = "fixed-layout";
93+
#address-cells = <1>;
94+
#size-cells = <1>;
95+
96+
mac_address: mac-address@9a {
97+
reg = <0x9a 6>;
98+
#nvmem-cell-cells = <0>;
99+
};
100+
};
86101
};
87102
};
88103

@@ -128,7 +143,8 @@ zephyr_udc0: &usbhs {
128143
pinctrl-0 = <&gmac_rmii>;
129144
pinctrl-names = "default";
130145

131-
mac-eeprom = <&eeprom>;
146+
nvmem-cells = <&mac_address>;
147+
nvmem-cell-names = "mac-address";
132148
phy-handle = <&phy>;
133149
};
134150

boards/atmel/sam/sam_v71_xult/Kconfig.defconfig

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,8 @@ if ETH_SAM_GMAC
88

99
# Read MAC address from AT24MAC402 EEPROM
1010

11-
config ETH_SAM_GMAC_MAC_I2C_EEPROM
12-
default y
13-
select I2C
14-
15-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS
16-
default 0x9A
17-
18-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE
19-
default 1
11+
config EEPROM
12+
default y if NVMEM
2013

2114
endif # ETH_SAM_GMAC
2215

boards/atmel/sam/sam_v71_xult/sam_v71_xult-common.dtsi

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,23 @@
198198
pinctrl-names = "default";
199199

200200
eeprom: eeprom@5f {
201-
compatible = "atmel,24mac402";
201+
compatible = "atmel,at24", "atmel,24mac402";
202202
reg = <0x5f>;
203+
size = <256>;
204+
pagesize = <16>;
205+
address-width = <8>;
206+
timeout = <5>;
207+
208+
nvmem-layout {
209+
compatible = "fixed-layout";
210+
#address-cells = <1>;
211+
#size-cells = <1>;
212+
213+
mac_address: mac-address@9a {
214+
reg = <0x9a 6>;
215+
#nvmem-cell-cells = <0>;
216+
};
217+
};
203218
};
204219
};
205220

@@ -253,7 +268,8 @@ zephyr_udc0: &usbhs {
253268
pinctrl-0 = <&gmac_rmii>;
254269
pinctrl-names = "default";
255270

256-
mac-eeprom = <&eeprom>;
271+
nvmem-cells = <&mac_address>;
272+
nvmem-cell-names = "mac-address";
257273
phy-handle = <&phy>;
258274
};
259275

boards/atmel/sam0/same54_xpro/Kconfig.defconfig

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,8 @@ if ETH_SAM_GMAC
88

99
# Read MAC address from AT24MAC402 EEPROM
1010

11-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS
12-
default 0x9A
13-
14-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE
15-
default 1
16-
17-
config ETH_SAM_GMAC_MAC_I2C_EEPROM
18-
default y
19-
select I2C
11+
config EEPROM
12+
default y if NVMEM
2013

2114
endif # ETH_SAM_GMAC
2215

boards/atmel/sam0/same54_xpro/same54_xpro.dts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,23 @@
116116
pinctrl-names = "default";
117117

118118
eeprom: eeprom@5e {
119-
compatible = "atmel,24mac402";
119+
compatible = "atmel,at24", "atmel,24mac402";
120120
reg = <0x5e>;
121+
size = <256>;
122+
pagesize = <16>;
123+
address-width = <8>;
124+
timeout = <5>;
125+
126+
nvmem-layout {
127+
compatible = "fixed-layout";
128+
#address-cells = <1>;
129+
#size-cells = <1>;
130+
131+
mac_address: mac-address@9a {
132+
reg = <0x9a 6>;
133+
#nvmem-cell-cells = <0>;
134+
};
135+
};
121136
};
122137
};
123138

@@ -158,7 +173,8 @@ zephyr_udc0: &usb0 {
158173
pinctrl-0 = <&gmac_rmii>;
159174
pinctrl-names = "default";
160175

161-
mac-eeprom = <&eeprom>;
176+
nvmem-cells = <&mac_address>;
177+
nvmem-cell-names = "mac-address";
162178
phy-handle = <&phy>;
163179
};
164180

drivers/ethernet/Kconfig.sam_gmac

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ menuconfig ETH_SAM_GMAC
1212
select NOCACHE_MEMORY if ARCH_HAS_NOCACHE_MEMORY_SUPPORT
1313
select ETH_DSA_SUPPORT_DEPRECATED
1414
select PINCTRL
15+
imply NVMEM if ($(dt_compat_any_has_prop,$(DT_COMPAT_ATMEL_SAM_GMAC),nvmem-cells) || \
16+
$(dt_compat_any_has_prop,$(DT_COMPAT_ATMEL_SAM0_GMAC),nvmem-cells))
1517
help
1618
Enable Atmel SAM MCU Family Ethernet driver.
1719

@@ -72,31 +74,6 @@ config ETH_SAM_GMAC_BUF_RX_COUNT
7274
fit at least two Ethernet frames: one being received by the GMAC module
7375
and the other being processed by the higher layer networking stack.
7476

75-
config ETH_SAM_GMAC_MAC_I2C_EEPROM
76-
bool "Read from an I2C EEPROM [DEPRECATED]"
77-
select DEPRECATED
78-
help
79-
Read MAC address from an I2C EEPROM. This option is deprecated.
80-
81-
if ETH_SAM_GMAC_MAC_I2C_EEPROM
82-
83-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS
84-
hex "I2C EEPROM internal address"
85-
range 0 0xffffffff
86-
help
87-
Internal address of the EEPROM chip where the MAC address is stored.
88-
Chips with 1 to 4 byte internal address size are supported. Address
89-
size has to be configured in a separate Kconfig option.
90-
91-
config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE
92-
int "I2C EEPROM internal address size"
93-
default 1
94-
range 1 4
95-
help
96-
Size (in bytes) of the internal EEPROM address.
97-
98-
endif # ETH_SAM_GMAC_MAC_I2C_EEPROM
99-
10077
config PTP_CLOCK_SAM_GMAC
10178
bool "SAM GMAC PTP clock driver support"
10279
default y

drivers/ethernet/eth_sam_gmac.c

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,6 @@ static inline void dcache_clean(uint32_t addr, uint32_t size)
141141
#endif
142142
#endif /* !CONFIG_NET_TEST */
143143

144-
BUILD_ASSERT(!(DT_ANY_INST_HAS_PROP_STATUS_OKAY(mac_eeprom) &&
145-
(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) > 1)),
146-
"Only support one activated instance get MAC address from EEPROM");
147-
148144
/* if GMAC_UR_MIM_RGMII (new for sama7g5) is defined, the media interface mode
149145
* supported are: mii, rmii and gmii. Otherwise mii and rmii are supported.
150146
*/
@@ -1693,41 +1689,6 @@ static int eth_initialize(const struct device *dev)
16931689
return retval;
16941690
}
16951691

1696-
#if DT_INST_NODE_HAS_PROP(0, mac_eeprom)
1697-
static void get_mac_addr_from_i2c_eeprom(uint8_t mac_addr[6])
1698-
{
1699-
uint32_t iaddr = CONFIG_ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS;
1700-
int ret;
1701-
const struct i2c_dt_spec i2c = I2C_DT_SPEC_GET(DT_INST_PHANDLE(0, mac_eeprom));
1702-
1703-
if (!device_is_ready(i2c.bus)) {
1704-
LOG_ERR("Bus device is not ready");
1705-
return;
1706-
}
1707-
1708-
ret = i2c_write_read_dt(&i2c,
1709-
&iaddr, CONFIG_ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE,
1710-
mac_addr, 6);
1711-
1712-
if (ret != 0) {
1713-
LOG_ERR("I2C: failed to read MAC addr");
1714-
return;
1715-
}
1716-
}
1717-
#endif
1718-
1719-
static void generate_mac(uint8_t mac_addr[6], const struct eth_sam_dev_cfg *const cfg)
1720-
{
1721-
#if DT_INST_NODE_HAS_PROP(0, mac_eeprom)
1722-
ARG_UNUSED(cfg);
1723-
get_mac_addr_from_i2c_eeprom(mac_addr);
1724-
#else
1725-
if (cfg->random_mac_addr) {
1726-
gen_random_mac(mac_addr, ATMEL_OUI_B0, ATMEL_OUI_B1, ATMEL_OUI_B2);
1727-
}
1728-
#endif
1729-
}
1730-
17311692
static void phy_link_state_changed(const struct device *pdev,
17321693
struct phy_link_state *state,
17331694
void *user_data)
@@ -1802,7 +1763,11 @@ static void eth_iface_init(struct net_if *iface)
18021763
return;
18031764
}
18041765

1805-
generate_mac(dev_data->mac_addr, cfg);
1766+
result = net_eth_mac_load(&cfg->mcfg, dev_data->mac_addr);
1767+
if (result < 0) {
1768+
LOG_ERR("Failed to load MAC (%d)", result);
1769+
return;
1770+
}
18061771

18071772
LOG_INF("%s MAC: %02x:%02x:%02x:%02x:%02x:%02x", dev->name,
18081773
dev_data->mac_addr[0], dev_data->mac_addr[1],
@@ -2136,7 +2101,7 @@ static const struct ethernet_api eth_api = {
21362101
.num_queues = DT_INST_PROP(n, num_queues), \
21372102
.phy_conn_type = DT_INST_ENUM_IDX(n, phy_connection_type), \
21382103
.ref_clk_source = DT_INST_ENUM_IDX(n, ref_clk_source), \
2139-
.random_mac_addr = DT_INST_PROP(n, zephyr_random_mac_address), \
2104+
.mcfg = NET_ETH_MAC_DT_INST_CONFIG_INIT(n), \
21402105
};
21412106

21422107
#define DEFN_RX_FLAG_LIST_0(n) \

drivers/ethernet/eth_sam_gmac_priv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ struct eth_sam_dev_cfg {
265265
const uint8_t num_queues;
266266
const uint8_t phy_conn_type;
267267
const uint8_t ref_clk_source;
268-
const bool random_mac_addr;
268+
const struct net_eth_mac_config mcfg;
269269
};
270270

271271
/* Device run time data */

0 commit comments

Comments
 (0)