On 9/17/24 8:21 AM, Lothar Rubusch wrote:

[...]
+int enclustra_get_mac_from_eeprom(unsigned char *enetaddr, const char *alias)
+{
+       struct udevice *dev;
+       u32 hwaddr_h;
+       u8 data[4];
+       int i, j, eeprom_addr, mac_len, ret;
+
+       ret = uclass_get_device_by_name(UCLASS_MISC, alias, &dev);
+       if (ret) {
+               printf("%s: Failed, cannot find EEPROM! ret = %d\n", __func__, 
ret);
+               return ret;
+       }
+
+       /* Make sure atsha204a is in a defined state (part of protocol) */
+       if (atsha204a_sleep(dev)) {
Please propagate return values.

+               printf("%s(): Failed to bring EEPROM in defined state\n", 
__func__);
+               return -ENODEV;
+       }
+
+       if (atsha204a_wakeup(dev)) {
+               printf("%s(): Failed to wakeup EEPROM\n", __func__);
+               return -ENODEV;
+       }
+
+       /* Read twice portions of 4 bytes (atsha204 protocol). One from address 
4
Use Linux comment style, not netdev:

/*
 * Read some
 * stuff
 * and so on
 */

+        * the other from address 5 of the OTP zone. Then convert the data to
+        * the 6 elements of the MAC address.
+        */
+       eeprom_addr = 4;
+       mac_len = 6;
These can be const variables assigned at the beginning of this function.

+       for (i = 0; i < 2; i++) {
+               eeprom_addr += i;
+               if (atsha204a_read(dev, ATSHA204A_ZONE_OTP, false, eeprom_addr, 
data)) {
+                       printf("%s(): Failed to parse ATSHA204A_ZONE_OTP of 
EEPROM\n",
+                              __func__);
+                       return -EFAULT;
+               }
+
+               for (j = 0; j < 4 && j + i * 4 < mac_len; j++)
+                       enetaddr[j + i * 4] = data[j];
+       }
+
+       /* Check if the value is a valid mac registered for
+        * Enclustra  GmbH
+        */
+       hwaddr_h = enetaddr[0] | enetaddr[1] << 8 | enetaddr[2] << 16;
+       if ((hwaddr_h & 0xFFFFFF) != ENCLUSTRA_MAC) {
+               printf("%s(): Failed, parsed MAC is no Enclustra MAC\n", 
__func__);
+               return -ENOENT;
+       }
+
+       if (!is_valid_ethaddr(enetaddr)) {
+               printf("%s(): Failed, address read from EEPROM is invalid!\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       printf("ethaddr set to %02X:%02X:%02X:%02X:%02X:%02X\n",
+              enetaddr[0], enetaddr[1], enetaddr[2],
+              enetaddr[3], enetaddr[4], enetaddr[5]);
This should be:

debug("ethaddr set to %pM\n", ethaddr);

see lib/vsprintf.c for the formatting strings.

+       return 0;
+}
+
+__weak int enclustra_setup_mac_address(void)
+{
+       unsigned char enetaddr[6];
+
+       if (enclustra_mac_is_in_env("ethaddr"))
+               return 0;
+
+       if (enclustra_get_mac_is_enabled("ethernet0"))
+               return 0;
+
+       if (enclustra_get_mac_from_eeprom(enetaddr, "atsha204a@64"))
Please propagate return values, fix globally.

+               return -ENXIO;
+
+       if (eth_env_set_enetaddr("ethaddr", enetaddr))
+               return -ENXIO;
+
+       if (!enclustra_get_mac1_from_mac(enetaddr))
+               return eth_env_set_enetaddr("eth1addr", enetaddr);
+
+       printf("%s(): Failed, unable to set mac address!\n", __func__);
+       return -ENXIO;
+}
[...]

+int enclustra_get_mac1_from_mac(unsigned char *enetaddr)
+{
+       u32 hwaddr_h;
+
+       /* Increment MAC addr */
+       hwaddr_h = (enetaddr[3] << 16) | (enetaddr[4] << 8) | enetaddr[5];
+       hwaddr_h = (hwaddr_h + 1) & 0xFFFFFF;
+       enetaddr[3] = (hwaddr_h >> 16) & 0xFF;
+       enetaddr[4] = (hwaddr_h >> 8) & 0xFF;
+       enetaddr[5] = hwaddr_h & 0xFF;
+
+       if (!is_valid_ethaddr(enetaddr)) {
+               printf("%s(): Failed, address computed from enetaddr is 
invalid!\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       printf("eth1addr set to %02X:%02X:%02X:%02X:%02X:%02X\n",
+              enetaddr[0], enetaddr[1], enetaddr[2],
+              enetaddr[3], enetaddr[4], enetaddr[5]);
debug("... %pM\n", enetaddr);

+       return 0;
+}
diff --git a/board/enclustra/common/mac_ds28.c 
b/board/enclustra/common/mac_ds28.c
new file mode 100644
index 0000000000..9aed4f1de1
--- /dev/null
+++ b/board/enclustra/common/mac_ds28.c
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2024 Enclustra GmbH
+ */
+
+#include <linux/compat.h>
+#include <dm.h>
+#include <i2c.h>
+#include <net.h>
+
+#include "enclustra_mac.h"
+
+#define DS28_I2C_ADDR 0x5C
+#define DS28_SYS_I2C_EEPROM_BUS 0
+
+int enclustra_get_mac_from_eeprom(unsigned char *enetaddr, const char *alias)
+{
+       struct udevice *dev;
+       u32 hwaddr_h;
+       struct dm_i2c_chip *chip;
+       uint chip_addr = DS28_I2C_ADDR;
+       int alen = 1;
+       int ret;
+
+       if (i2c_get_chip_for_busnum(DS28_SYS_I2C_EEPROM_BUS, chip_addr,
+                                   alen, &dev))
+               return -ENODEV;
+
+       chip = dev_get_parent_plat(dev);
+       if (chip->offset_len != alen) {
+               debug("I2C chip %x: alen %d does not match offset_len %d\n",
+                     chip_addr, alen, chip->offset_len);
+               return -EADDRNOTAVAIL;
+       }
+
+       ret = dm_i2c_read(dev, 0x10, enetaddr, 6);
+       if (ret) {
+               printf("%s(): Failed reading EEPROM! ret = %d\n", __func__, 
ret);
+               return ret;
+       }
+
+       /* Check if the value is a valid mac registered for
+        * Enclustra  GmbH
+        */
+       hwaddr_h = enetaddr[0] | enetaddr[1] << 8 | enetaddr[2] << 16;
Better use () around the shifts, i.e. ... | (enetaddr[i] << 8) | ...

+       if ((hwaddr_h & 0xFFFFFF) != ENCLUSTRA_MAC) {
+               printf("%s(): Failed, parsed MAC is no Enclustra MAC\n", 
__func__);
+               return -ENOENT;
+       }
+
+       if (!is_valid_ethaddr(enetaddr)) {
+               printf("%s(): Failed, address read from EEPROM is invalid!\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       printf("ethaddr set to %02X:%02X:%02X:%02X:%02X:%02X\n",
+              enetaddr[0], enetaddr[1], enetaddr[2],
+              enetaddr[3], enetaddr[4], enetaddr[5]);
+
+       return 0;
+}
+
+__weak int enclustra_setup_mac_address(void)
Is the __weak really necessary ?

+{
+       unsigned char enetaddr[6];
+
+       if (enclustra_mac_is_in_env("ethaddr"))
+               return 0;
+
+       if (enclustra_get_mac_is_enabled("ethernet0"))
+               return 0;
+
+       // NB: DS28 is still not available in official DT, so referencing
+       // here by i2c busnumber and address directly
+       // preparation for DT access here, though
Use C comment style /* */

+       if (enclustra_get_mac_from_eeprom(enetaddr, ""))
+               return -ENXIO;
+
+       if (eth_env_set_enetaddr("ethaddr", enetaddr))
+               return -ENXIO;
+
+       if (!enclustra_get_mac1_from_mac(enetaddr))
+               return eth_env_set_enetaddr("eth1addr", enetaddr);
+
+       printf("%s(): Failed, unable to set mac address!\n", __func__);
MAC address, MAC in capitals.

[...]

--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -73,7 +73,7 @@ config ATSHA204A
        help
           Enable support for I2C connected Atmel's ATSHA204A
           CryptoAuthentication module found for example on the Turris Omnia
-          board.
+          board and Enclustra SoC FPGA boards.
This change should be elsewhere in this series ?

Reply via email to