Commit 5f83aea9 authored by Fin Maaß's avatar Fin Maaß Committed by Benjamin Cabé
Browse files

drivers: ethernet: sensry: fix mac addr order



make sure, that zephyr,random-mac-address
has a higher prio, than local-mac-address, as
documented in ethernet-controller.yaml.

Signed-off-by: default avatarFin Maaß <f.maass@vogl-electronic.com>
parent 4b6ccbdd
Loading
Loading
Loading
Loading
+16 −23
Original line number Diff line number Diff line
@@ -59,9 +59,6 @@ struct sy1xx_mac_dev_config {
	uint32_t base_addr;
	/* optional - enable promiscuous mode */
	bool promiscuous_mode;
	/* optional - device tree mac */
	bool use_local_mac_address;
	uint8_t local_mac_address[6];
	/* optional - random mac */
	bool use_zephyr_random_mac;

@@ -160,26 +157,25 @@ static int sy1xx_mac_set_promiscuous_mode(const struct device *dev, bool promisc
	return 0;
}

static int sy1xx_mac_set_mac_addr(const struct device *dev, uint8_t *mac_addr)
static int sy1xx_mac_set_mac_addr(const struct device *dev)
{
	struct sy1xx_mac_dev_config *cfg = (struct sy1xx_mac_dev_config *)dev->config;
	struct sy1xx_mac_dev_data *data = (struct sy1xx_mac_dev_data *)dev->data;
	int ret;
	uint32_t v_low, v_high;

	LOG_INF("%s set link address %02x:%02x:%02x:%02x:%02x:%02x", dev->name, mac_addr[0],
		mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
	LOG_INF("%s set link address %02x:%02x:%02x:%02x:%02x:%02x", dev->name, data->mac_addr[0],
		data->mac_addr[1], data->mac_addr[2], data->mac_addr[3], data->mac_addr[4],
		data->mac_addr[5]);

	/* update mac in controller */
	v_low = sys_get_le32(&mac_addr[0]);
	v_low = sys_get_le32(&data->mac_addr[0]);
	sys_write32(v_low, cfg->ctrl_addr + SY1XX_MAC_ADDRESS_LOW_REG);

	v_high = sys_read32(cfg->ctrl_addr + SY1XX_MAC_ADDRESS_HIGH_REG);
	v_high |= (v_high & 0xffff0000) | sys_get_le16(&mac_addr[4]);
	v_high |= (v_high & 0xffff0000) | sys_get_le16(&data->mac_addr[4]);
	sys_write32(v_high, cfg->ctrl_addr + SY1XX_MAC_ADDRESS_HIGH_REG);

	memcpy(data->mac_addr, mac_addr, 6);

	/* Register Ethernet MAC Address with the upper layer */
	ret = net_if_set_link_addr(data->iface, data->mac_addr, sizeof(data->mac_addr),
				   NET_LINK_ETHERNET);
@@ -208,20 +204,16 @@ static int sy1xx_mac_start(const struct device *dev)
	sys_write32(0x0001, cfg->ctrl_addr + SY1XX_MAC_CTRL_REG);
	sys_write32(0x0000, cfg->ctrl_addr + SY1XX_MAC_CTRL_REG);

	/* preset mac addr */
	if (cfg->use_local_mac_address) {
		/* prio 0 -- from device tree */
		sy1xx_mac_set_mac_addr(dev, cfg->local_mac_address);
	} else if (cfg->use_zephyr_random_mac) {
	if (cfg->use_zephyr_random_mac) {
		/* prio 1 -- generate random, if set in device tree */
		sys_rand_get(&rand_mac_addr, 6);
		sys_rand_get(&data->mac_addr, 6);
		/* Set MAC address locally administered, unicast (LAA) */
		rand_mac_addr[0] |= 0x02;
		sy1xx_mac_set_mac_addr(dev, rand_mac_addr);
	} else {
		/* no preset mac address available */
		data->mac_addr[0] |= 0x02;

	}

	sy1xx_mac_set_mac_addr(dev);

	sy1xx_mac_set_promiscuous_mode(dev, cfg->promiscuous_mode);

	k_thread_resume(&data->rx_data_thread);
@@ -355,6 +347,7 @@ static enum ethernet_hw_caps sy1xx_mac_get_caps(const struct device *dev)
static int sy1xx_mac_set_config(const struct device *dev, enum ethernet_config_type type,
				const struct ethernet_config *config)
{
	struct sy1xx_mac_dev_data *data = (struct sy1xx_mac_dev_data *)dev->data;
	int ret = 0;

	switch (type) {
@@ -364,7 +357,8 @@ static int sy1xx_mac_set_config(const struct device *dev, enum ethernet_config_t
		break;

	case ETHERNET_CONFIG_TYPE_MAC_ADDRESS:
		ret = sy1xx_mac_set_mac_addr(dev, (uint8_t *)&(config->mac_address.addr));
		memcpy(data->mac_addr, config->mac_address.addr, sizeof(data->mac_addr));
		ret = sy1xx_mac_set_mac_addr(dev);
		break;
	default:
		return -ENOTSUP;
@@ -578,8 +572,6 @@ const struct ethernet_api sy1xx_mac_driver_api = {
		.base_addr = DT_INST_REG_ADDR_BY_NAME(n, data),                                    \
		.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n),                                         \
		.promiscuous_mode = DT_INST_PROP_OR(n, promiscuous_mode, false),                   \
		.local_mac_address = DT_INST_PROP_OR(n, local_mac_address, {0}),                   \
		.use_local_mac_address = DT_INST_NODE_HAS_PROP(n, local_mac_address),              \
		.use_zephyr_random_mac = DT_INST_NODE_HAS_PROP(n, zephyr_random_mac_address),      \
		.phy_dev = DEVICE_DT_GET(DT_INST_PHANDLE(0, phy_handle))};                         \
                                                                                                   \
@@ -587,6 +579,7 @@ const struct ethernet_api sy1xx_mac_driver_api = {
	__aligned(4) sy1xx_mac_dma_buffers_##n;                                                    \
                                                                                                   \
	static struct sy1xx_mac_dev_data sy1xx_mac_dev_data##n = {                                 \
		.mac_addr = DT_INST_PROP_OR(n, local_mac_address, {0}),                            \
		.dma_buffers = &sy1xx_mac_dma_buffers_##n,                                         \
	};                                                                                         \
                                                                                                   \