
On Fri, Apr 7, 2017 at 8:57 AM, o.schinagl@ultimaker.com wrote:
On Fri, 2017-04-07 at 15:45 +0200, Olliver Schinagl wrote:
Hey Joe,
On 30-11-16 22:36, Joe Hershberger wrote:
On Fri, Nov 25, 2016 at 9:38 AM, Olliver Schinagl <oliver@schinagl. nl> wrote:
Add board hooks allowing to get ethernet addresses in a board specific manner. Currently this is done by generating a MAC address from the SID and injecting the ethernet device number in the first octet.
This usually happens as a fallback, if either the eeprom fails to set a MAC address or the FDT forces an override.
Signed-off-by: Olliver Schinagl oliver@schinagl.nl
arch/arm/include/asm/arch-sunxi/sys_proto.h | 11 ++ board/sunxi/board.c | 161 +++++++++++++++------------- net/eth_legacy.c | 1 + 3 files changed, 98 insertions(+), 75 deletions(-)
diff --git a/arch/arm/include/asm/arch-sunxi/sys_proto.h b/arch/arm/include/asm/arch-sunxi/sys_proto.h index a373319..fad7c48 100644 --- a/arch/arm/include/asm/arch-sunxi/sys_proto.h +++ b/arch/arm/include/asm/arch-sunxi/sys_proto.h @@ -30,4 +30,15 @@ void eth_init_board(void); static inline void eth_init_board(void) {} #endif
+int board_get_enetaddr(const int i, unsigned char *mac_addr);
+#if CONFIG_SUNXI_EMAC +int sunxi_emac_board_read_rom_hwaddr(unsigned char *enetaddr, int id); +#endif
+#if defined(CONFIG_SUNXI_GMAC) || defined(CONFIG_ETH_DESIGNWARE) +int dw_board_read_rom_hwaddr(unsigned char *enetaddr, int id); +#endif
#endif diff --git a/board/sunxi/board.c b/board/sunxi/board.c index 5365638..4aeab51 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -21,6 +21,7 @@ #include <asm/arch/gpio.h> #include <asm/arch/mmc.h> #include <asm/arch/spl.h> +#include <asm/arch/sys_proto.h> #include <asm/arch/usb_phy.h> #ifndef CONFIG_ARM64 #include <asm/armv7.h> @@ -564,6 +565,34 @@ int g_dnl_board_usb_cable_connected(void) } #endif
+int sunxi_get_board_serial(unsigned int *serial) +{
int ret;
ret = sunxi_get_sid(serial);
if (!ret || serial[0])
return -ENOSYS;
/*
* The single words 1 - 3 of the SID have quite a few
bits
* which are the same on many models, so we take a crc32
* of all 3 words, to get a more unique value.
*
* Note we only do this on newer SoCs as we cannot change
* the algorithm on older SoCs since those have been
using
* fixed mac-addresses/serial based on only using word 3
for a
* long time and changing a fixed mac-address/serial with
an
* u-boot update is not good.
*/
+#if !defined(CONFIG_MACH_SUN4I) && !defined(CONFIG_MACH_SUN5I) && \
- !defined(CONFIG_MACH_SUN6I) && !defined(CONFIG_MACH_SUN7I)
&& \
- !defined(CONFIG_MACH_SUN8I_A23) &&
!defined(CONFIG_MACH_SUN8I_A33)
serial[3] = crc32(0, (unsigned char *)&serial[1], 12);
+#endif
return 0;
+}
#ifdef CONFIG_SERIAL_TAG void get_board_serial(struct tag_serialnr *serialnr) { @@ -585,6 +614,54 @@ void get_board_serial(struct tag_serialnr *serialnr) #endif
/*
- Generate a MAC address based on device index and the serial
number.
- The first half of the of the first octet holds the eth index.
- In the second octet we forcefully mark the MAC address to a
locally
- administered MAC address.
- */
+int board_get_enetaddr(const int index, unsigned char *enetaddr)
This would be part of a board-specific eth driver.
this is being called now from sunxi_gmac.c and sunxi_emac.c and supplies these board specific drivers with a mac address based on the serial number of the board. I could move this logic over, but then i'd have to add it to both eth drivers. By having it in the board.c file, we have 2 simple functions in the board-specific eth driver:
static int sunxi_gmac_eth_read_rom_hwaddr(struct udevice *dev) { struct eth_pdata *pdata = dev_get_platdata(dev);
return board_get_enetaddr(dev->seq, pdata->enetaddr);
}
So do you propose to dupilicate the code into both board specific drivers, have it named differently or that the shared code live elsewhere?
Replying to myself here,
I just realized, while this bit was not accepted, the overal implementation has changed in the set. So before, I did things wrong :) As Simon explained last time.
To clarify, I now have added the logic to the sunxi gmac and emac board specific drivers. But afaik they share no common code. (like sunxi_common.c in drivers/net)
With that in mind, how we did things up until now, was to have a fallback scenario where we use the SoC serial number to generate a MAC address.
If this is go be done with the board specific driver, we'd need to still however call board specific functions (sunxi_get_board_serial).
The solution I think is still one of the previously mentioned, a sunxi_common.c which does the serial -> MAC conversion according to the previous logic, using sunxi_get_board_serial() (which really is a SoC specific function, rather board) or have (sunxi)_board_get_enetaddr() in the same spot where it is now.
Writing this, I realize the sunxi_common.c approach may not be half bad, even if it only contains a single function for now.
Sounds like the common layout has promise. Care to send an RFC for how it would look?
Thanks, -Joe