[U-Boot-Users] [PATCH] Add mechanisms for CPU and board-specific Ethernet initialization

This patch is the first step in cleaning up net/eth.c, by moving Ethernet initialization to CPU or board-specific code. Initial implementation is only on the Freescale TSEC controller, but others will be added soon.
Signed-off-by: Ben Warren biggerbadderben@gmail.com ---
When we discussed this a few months ago, I was planning on defining the cpu_eth_init() and board_eth_init() functions as weak with no aliases, but in my testing this did not result in them being NULL, hence the default function.
board/atum8548/atum8548.c | 18 +++++++++++++++ board/freescale/mpc8313erdb/mpc8313erdb.c | 12 ++++++++++ board/freescale/mpc8315erdb/mpc8315erdb.c | 12 ++++++++++ board/freescale/mpc8349emds/mpc8349emds.c | 12 ++++++++++ board/freescale/mpc8349itx/mpc8349itx.c | 12 ++++++++++ board/freescale/mpc837xemds/mpc837xemds.c | 12 ++++++++++ board/freescale/mpc837xerdb/mpc837xerdb.c | 13 +++++++++++ board/freescale/mpc8540ads/mpc8540ads.c | 22 ++++++++++++++++++ board/freescale/mpc8541cds/mpc8541cds.c | 12 ++++++++++ board/freescale/mpc8544ds/mpc8544ds.c | 18 +++++++++++++++ board/freescale/mpc8548cds/mpc8548cds.c | 18 +++++++++++++++ board/freescale/mpc8555cds/mpc8555cds.c | 12 ++++++++++ board/freescale/mpc8560ads/mpc8560ads.c | 12 ++++++++++ board/freescale/mpc8568mds/mpc8568mds.c | 12 ++++++++++ board/freescale/mpc8641hpcn/mpc8641hpcn.c | 18 +++++++++++++++ board/mpc8540eval/mpc8540eval.c | 22 ++++++++++++++++++ board/pm854/pm854.c | 22 ++++++++++++++++++ board/pm856/pm856.c | 12 ++++++++++ board/sbc8349/sbc8349.c | 12 ++++++++++ board/sbc8548/sbc8548.c | 18 +++++++++++++++ board/sbc8560/sbc8560.c | 9 +++++++ board/sbc8641d/sbc8641d.c | 18 +++++++++++++++ board/stxgp3/stxgp3.c | 12 ++++++++++ board/stxssa/stxssa.c | 12 ++++++++++ board/tqm834x/tqm834x.c | 12 ++++++++++ board/tqm85xx/tqm85xx.c | 22 ++++++++++++++++++ include/netdev.h | 34 +++++++++++++++++++++++++++++ net/eth.c | 26 ++++++++------------- 28 files changed, 430 insertions(+), 16 deletions(-) create mode 100644 include/netdev.h
diff --git a/board/atum8548/atum8548.c b/board/atum8548/atum8548.c index 2f6ae29..d6bd8ae 100644 --- a/board/atum8548/atum8548.c +++ b/board/atum8548/atum8548.c @@ -34,6 +34,7 @@ #include <miiphy.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) extern void ddr_enable_ecc(unsigned int dram_size); @@ -417,3 +418,20 @@ ft_board_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8313erdb/mpc8313erdb.c b/board/freescale/mpc8313erdb/mpc8313erdb.c index 7cbdb7b..00abb6b 100644 --- a/board/freescale/mpc8313erdb/mpc8313erdb.c +++ b/board/freescale/mpc8313erdb/mpc8313erdb.c @@ -29,6 +29,7 @@ #include <pci.h> #include <mpc83xx.h> #include <vsc7385.h> +#include <netdev.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -128,3 +129,14 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8315erdb/mpc8315erdb.c b/board/freescale/mpc8315erdb/mpc8315erdb.c index 7af36dd..136b0aa 100644 --- a/board/freescale/mpc8315erdb/mpc8315erdb.c +++ b/board/freescale/mpc8315erdb/mpc8315erdb.c @@ -30,6 +30,7 @@ #endif #include <pci.h> #include <mpc83xx.h> +#include <netdev.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -130,3 +131,14 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8349emds/mpc8349emds.c b/board/freescale/mpc8349emds/mpc8349emds.c index 6c82596..59ace6c 100644 --- a/board/freescale/mpc8349emds/mpc8349emds.c +++ b/board/freescale/mpc8349emds/mpc8349emds.c @@ -30,6 +30,7 @@ #include <spi.h> #include <miiphy.h> #include <spd_sdram.h> +#include <netdev.h>
#if defined(CONFIG_OF_LIBFDT) #include <libfdt.h> @@ -287,3 +288,14 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8349itx/mpc8349itx.c b/board/freescale/mpc8349itx/mpc8349itx.c index 0317bfe..2be934a 100644 --- a/board/freescale/mpc8349itx/mpc8349itx.c +++ b/board/freescale/mpc8349itx/mpc8349itx.c @@ -25,6 +25,7 @@ #include <mpc83xx.h> #include <i2c.h> #include <miiphy.h> +#include <netdev.h> #include <vsc7385.h> #ifdef CONFIG_PCI #include <asm/mpc8349_pci.h> @@ -400,3 +401,14 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc837xemds/mpc837xemds.c b/board/freescale/mpc837xemds/mpc837xemds.c index 40a505b..a092d08 100644 --- a/board/freescale/mpc837xemds/mpc837xemds.c +++ b/board/freescale/mpc837xemds/mpc837xemds.c @@ -15,6 +15,7 @@ #include <asm/io.h> #include <asm/fsl_serdes.h> #include <spd_sdram.h> +#include <netdev.h> #if defined(CONFIG_OF_LIBFDT) #include <libfdt.h> #endif @@ -157,3 +158,14 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif /* CONFIG_OF_BOARD_SETUP */ + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc837xerdb/mpc837xerdb.c b/board/freescale/mpc837xerdb/mpc837xerdb.c index f73fd5a..e28de79 100644 --- a/board/freescale/mpc837xerdb/mpc837xerdb.c +++ b/board/freescale/mpc837xerdb/mpc837xerdb.c @@ -18,6 +18,7 @@ #include <asm/fsl_serdes.h> #include <fdt_support.h> #include <spd_sdram.h> +#include <netdev.h> #include <vsc7385.h>
#if defined(CFG_DRAM_TEST) @@ -197,3 +198,15 @@ void ft_board_setup(void *blob, bd_t *bd) fdt_fixup_dr_usb(blob, bd); } #endif /* CONFIG_OF_BOARD_SETUP */ + + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8540ads/mpc8540ads.c b/board/freescale/mpc8540ads/mpc8540ads.c index a951b9e..d227a2f 100644 --- a/board/freescale/mpc8540ads/mpc8540ads.c +++ b/board/freescale/mpc8540ads/mpc8540ads.c @@ -32,6 +32,7 @@ #include <spd_sdram.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) extern void ddr_enable_ecc(unsigned int dram_size); @@ -343,3 +344,24 @@ ft_board_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_MPC85XX_FEC) + tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME); +#else +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif +#endif + return 0; +} diff --git a/board/freescale/mpc8541cds/mpc8541cds.c b/board/freescale/mpc8541cds/mpc8541cds.c index 62c8d63..4317a16 100644 --- a/board/freescale/mpc8541cds/mpc8541cds.c +++ b/board/freescale/mpc8541cds/mpc8541cds.c @@ -30,6 +30,7 @@ #include <spd_sdram.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#include "../common/cadmus.h" #include "../common/eeprom.h" @@ -530,3 +531,14 @@ ft_pci_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8544ds/mpc8544ds.c b/board/freescale/mpc8544ds/mpc8544ds.c index dd10af8..a733a2c 100644 --- a/board/freescale/mpc8544ds/mpc8544ds.c +++ b/board/freescale/mpc8544ds/mpc8544ds.c @@ -31,6 +31,7 @@ #include <miiphy.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#include "../common/pixis.h"
@@ -545,3 +546,20 @@ ft_board_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8548cds/mpc8548cds.c b/board/freescale/mpc8548cds/mpc8548cds.c index efe2a3a..462e29b 100644 --- a/board/freescale/mpc8548cds/mpc8548cds.c +++ b/board/freescale/mpc8548cds/mpc8548cds.c @@ -31,6 +31,7 @@ #include <miiphy.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#include "../common/cadmus.h" #include "../common/eeprom.h" @@ -548,3 +549,20 @@ ft_pci_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8555cds/mpc8555cds.c b/board/freescale/mpc8555cds/mpc8555cds.c index 8acbba4..96a9b00 100644 --- a/board/freescale/mpc8555cds/mpc8555cds.c +++ b/board/freescale/mpc8555cds/mpc8555cds.c @@ -28,6 +28,7 @@ #include <spd_sdram.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#include "../common/cadmus.h" #include "../common/eeprom.h" @@ -530,3 +531,14 @@ ft_pci_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8560ads/mpc8560ads.c b/board/freescale/mpc8560ads/mpc8560ads.c index 8d4b8a8..2d00a0a 100644 --- a/board/freescale/mpc8560ads/mpc8560ads.c +++ b/board/freescale/mpc8560ads/mpc8560ads.c @@ -34,6 +34,7 @@ #include <miiphy.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) extern void ddr_enable_ecc(unsigned int dram_size); @@ -562,3 +563,14 @@ ft_board_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8568mds/mpc8568mds.c b/board/freescale/mpc8568mds/mpc8568mds.c index 4568aa1..b295d01 100644 --- a/board/freescale/mpc8568mds/mpc8568mds.c +++ b/board/freescale/mpc8568mds/mpc8568mds.c @@ -32,6 +32,7 @@ #include <ioports.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#include "bcsr.h"
@@ -561,3 +562,14 @@ ft_board_setup(void *blob, bd_t *bd) } } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/freescale/mpc8641hpcn/mpc8641hpcn.c b/board/freescale/mpc8641hpcn/mpc8641hpcn.c index bb1f927..a52b056 100644 --- a/board/freescale/mpc8641hpcn/mpc8641hpcn.c +++ b/board/freescale/mpc8641hpcn/mpc8641hpcn.c @@ -29,6 +29,7 @@ #include <asm/io.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#include "../common/pixis.h"
@@ -415,3 +416,20 @@ get_board_sys_clk(ulong dummy)
return val; } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif + return 0; +} diff --git a/board/mpc8540eval/mpc8540eval.c b/board/mpc8540eval/mpc8540eval.c index 8328b3a..c255e0a 100644 --- a/board/mpc8540eval/mpc8540eval.c +++ b/board/mpc8540eval/mpc8540eval.c @@ -27,6 +27,7 @@ #include <asm/processor.h> #include <asm/immap_85xx.h> #include <spd_sdram.h> +#include <netdev.h>
long int fixed_sdram (void);
@@ -243,3 +244,24 @@ long int fixed_sdram (void) return (CFG_SDRAM_SIZE * 1024 * 1024); } #endif /* !defined(CONFIG_SPD_EEPROM) */ + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_MPC85XX_FEC) + tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME); +#else +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif +#endif + return 0; +} diff --git a/board/pm854/pm854.c b/board/pm854/pm854.c index 5d32525..e545092 100644 --- a/board/pm854/pm854.c +++ b/board/pm854/pm854.c @@ -30,6 +30,7 @@ #include <asm/processor.h> #include <asm/immap_85xx.h> #include <spd_sdram.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) extern void ddr_enable_ecc(unsigned int dram_size); @@ -285,3 +286,24 @@ pci_init_board(void) pci_mpc85xx_init(&hose); #endif /* CONFIG_PCI */ } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_MPC85XX_FEC) + tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME); +#else +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif +#endif + return 0; +} diff --git a/board/pm856/pm856.c b/board/pm856/pm856.c index 6386abc..4da1007 100644 --- a/board/pm856/pm856.c +++ b/board/pm856/pm856.c @@ -32,6 +32,7 @@ #include <ioports.h> #include <spd_sdram.h> #include <miiphy.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) extern void ddr_enable_ecc(unsigned int dram_size); @@ -440,3 +441,14 @@ pci_init_board(void) pci_mpc85xx_init(&hose); #endif /* CONFIG_PCI */ } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/sbc8349/sbc8349.c b/board/sbc8349/sbc8349.c index e89b6e8..5668203 100644 --- a/board/sbc8349/sbc8349.c +++ b/board/sbc8349/sbc8349.c @@ -32,6 +32,7 @@ #include <i2c.h> #include <spd_sdram.h> #include <miiphy.h> +#include <netdev.h> #if defined(CONFIG_OF_LIBFDT) #include <libfdt.h> #endif @@ -240,3 +241,14 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/sbc8548/sbc8548.c b/board/sbc8548/sbc8548.c index 9c8c673..0bdf0c3 100644 --- a/board/sbc8548/sbc8548.c +++ b/board/sbc8548/sbc8548.c @@ -34,6 +34,7 @@ #include <miiphy.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) extern void ddr_enable_ecc(unsigned int dram_size); @@ -566,3 +567,20 @@ ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif + return 0; +} diff --git a/board/sbc8560/sbc8560.c b/board/sbc8560/sbc8560.c index 8df4f3a..4e33982 100644 --- a/board/sbc8560/sbc8560.c +++ b/board/sbc8560/sbc8560.c @@ -33,6 +33,7 @@ #include <ioports.h> #include <spd_sdram.h> #include <miiphy.h> +#include <netdev.h>
long int fixed_sdram (void);
@@ -452,3 +453,11 @@ long int fixed_sdram (void) return CFG_SDRAM_SIZE * 1024 * 1024; } #endif /* !defined(CONFIG_SPD_EEPROM) */ + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif + return 0; +} diff --git a/board/sbc8641d/sbc8641d.c b/board/sbc8641d/sbc8641d.c index 519f332..4da4fce 100644 --- a/board/sbc8641d/sbc8641d.c +++ b/board/sbc8641d/sbc8641d.c @@ -37,6 +37,7 @@ #include <spd_sdram.h> #include <libfdt.h> #include <fdt_support.h> +#include <netdev.h>
#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) extern void ddr_enable_ecc (unsigned int dram_size); @@ -415,3 +416,20 @@ unsigned long get_board_sys_clk (ulong dummy)
return val; } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif + return 0; +} diff --git a/board/stxgp3/stxgp3.c b/board/stxgp3/stxgp3.c index f04ffa8..7f3f882 100644 --- a/board/stxgp3/stxgp3.c +++ b/board/stxgp3/stxgp3.c @@ -37,6 +37,7 @@ #include <asm/io.h> #include <spd_sdram.h> #include <miiphy.h> +#include <netdev.h>
long int fixed_sdram (void);
@@ -373,3 +374,14 @@ pci_init_board(void) pci_mpc85xx_init(&hose); #endif /* CONFIG_PCI */ } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/stxssa/stxssa.c b/board/stxssa/stxssa.c index 08177e1..92febca 100644 --- a/board/stxssa/stxssa.c +++ b/board/stxssa/stxssa.c @@ -37,6 +37,7 @@ #include <asm/io.h> #include <spd_sdram.h> #include <miiphy.h> +#include <netdev.h>
long int fixed_sdram (void);
@@ -396,3 +397,14 @@ pci_init_board(void) pci_mpc85xx_init(hose); #endif /* CONFIG_PCI */ } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/tqm834x/tqm834x.c b/board/tqm834x/tqm834x.c index aea985c..cffc7b3 100644 --- a/board/tqm834x/tqm834x.c +++ b/board/tqm834x/tqm834x.c @@ -30,6 +30,7 @@ #include <miiphy.h> #include <asm-ppc/mmu.h> #include <pci.h> +#include <netdev.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -431,3 +432,14 @@ static void set_ddr_config(void) { #endif } } + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif + return 0; +} diff --git a/board/tqm85xx/tqm85xx.c b/board/tqm85xx/tqm85xx.c index 8fa0162..f8237a0 100644 --- a/board/tqm85xx/tqm85xx.c +++ b/board/tqm85xx/tqm85xx.c @@ -33,6 +33,7 @@ #include <asm/immap_85xx.h> #include <ioports.h> #include <flash.h> +#include <netdev.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -417,3 +418,24 @@ int board_early_init_r (void) return (0); } #endif /* CONFIG_BOARD_EARLY_INIT_R */ + +int board_eth_init(bd_t *bis) +{ +#if defined(CONFIG_TSEC1) + tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); +#endif +#if defined(CONFIG_TSEC2) + tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); +#endif +#if defined(CONFIG_MPC85XX_FEC) + tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME); +#else +#if defined(CONFIG_TSEC3) + tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); +#endif +#if defined(CONFIG_TSEC4) + tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); +#endif +#endif + return 0; +} diff --git a/include/netdev.h b/include/netdev.h new file mode 100644 index 0000000..ceff552 --- /dev/null +++ b/include/netdev.h @@ -0,0 +1,34 @@ +/* + * (C) Copyright 2008 + * Benjamin Warren, biggerbadderben@gmail.com + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * netdev.h - definitions an prototypes for network devices + */ + +#ifndef _NETDEV_H_ +#define _NETDEV_H_ + +int tsec_initialize(bd_t * bis, int index, char *devname); + +#endif /* _NETDEV_H_ */ + diff --git a/net/eth.c b/net/eth.c index c4f24c6..e75dc43 100644 --- a/net/eth.c +++ b/net/eth.c @@ -28,6 +28,12 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
+/* CPU and board-specific Ethernet initializations. Aliased function + * signals caller to move on */ +static int __def_eth_init(bd_t *bis) {return -1;} +int cpu_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); +int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); + #ifdef CFG_GT_6426x extern int gt6426x_eth_initialize(bd_t *bis); #endif @@ -165,6 +171,10 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) miiphy_init(); #endif + /* Try CPU-specific initialization first. If it fails or isn't + * present, call the board-specific initialization */ + if (cpu_eth_init(bis) < 0 ) + board_eth_init(bis);
#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750) mv6436x_eth_initialize(bis); @@ -196,22 +206,6 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_SK98) skge_initialize(bis); #endif -#if defined(CONFIG_TSEC1) - tsec_initialize(bis, 0, CONFIG_TSEC1_NAME); -#endif -#if defined(CONFIG_TSEC2) - tsec_initialize(bis, 1, CONFIG_TSEC2_NAME); -#endif -#if defined(CONFIG_MPC85XX_FEC) - tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME); -#else -# if defined(CONFIG_TSEC3) - tsec_initialize(bis, 2, CONFIG_TSEC3_NAME); -# endif -# if defined(CONFIG_TSEC4) - tsec_initialize(bis, 3, CONFIG_TSEC4_NAME); -# endif -#endif #if defined(CONFIG_UEC_ETH1) uec_initialize(0); #endif

Hi Ben,
On Tuesday 10 June 2008, Ben Warren wrote:
This patch is the first step in cleaning up net/eth.c, by moving Ethernet initialization to CPU or board-specific code. Initial implementation is only on the Freescale TSEC controller, but others will be added soon.
Great, thanks.
<snip>
diff --git a/net/eth.c b/net/eth.c index c4f24c6..e75dc43 100644 --- a/net/eth.c +++ b/net/eth.c @@ -28,6 +28,12 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
+/* CPU and board-specific Ethernet initializations. Aliased function
- signals caller to move on */
+static int __def_eth_init(bd_t *bis) {return -1;} +int cpu_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); +int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); + #ifdef CFG_GT_6426x extern int gt6426x_eth_initialize(bd_t *bis); #endif @@ -165,6 +171,10 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) miiphy_init(); #endif
- /* Try CPU-specific initialization first. If it fails or isn't
* present, call the board-specific initialization */
- if (cpu_eth_init(bis) < 0 )
Nitpicking: No space before ")" please.
board_eth_init(bis);
Shouldn't this be the other way around?
+ if (board_eth_init(bis) < 0) + eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================

On Tue, Jun 10, 2008 at 5:12 AM, Stefan Roese sr@denx.de wrote:
Hi Ben,
On Tuesday 10 June 2008, Ben Warren wrote:
This patch is the first step in cleaning up net/eth.c, by moving Ethernet initialization to CPU or board-specific code. Initial implementation is only on the Freescale TSEC controller, but others will be added soon.
Great, thanks.
<snip>
diff --git a/net/eth.c b/net/eth.c index c4f24c6..e75dc43 100644 --- a/net/eth.c +++ b/net/eth.c @@ -28,6 +28,12 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
+/* CPU and board-specific Ethernet initializations. Aliased function
- signals caller to move on */
+static int __def_eth_init(bd_t *bis) {return -1;} +int cpu_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); +int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); + #ifdef CFG_GT_6426x extern int gt6426x_eth_initialize(bd_t *bis); #endif @@ -165,6 +171,10 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) miiphy_init(); #endif
/* Try CPU-specific initialization first. If it fails or isn't
* present, call the board-specific initialization */
if (cpu_eth_init(bis) < 0 )
Nitpicking: No space before ")" please.
Huh, don't know how I missed that one.
board_eth_init(bis);
Shouldn't this be the other way around?
if (board_eth_init(bis) < 0)
eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Yeah, I think you're right. If board_eth_init() exists, it gets highest priority. New patch coming soon!
Best regards, Stefan
Thanks for the review, Ben

Ben Warren wrote:
@@ -165,6 +171,10 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) miiphy_init(); #endif
/* Try CPU-specific initialization first. If it fails or isn't
* present, call the board-specific initialization */
if (cpu_eth_init(bis) < 0 )
Nitpicking: No space before ")" please.
Huh, don't know how I missed that one.
board_eth_init(bis);
Shouldn't this be the other way around?
if (board_eth_init(bis) < 0)
eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Yeah, I think you're right. If board_eth_init() exists, it gets highest priority.
Just wondered, does that mean we could only have either cpu_eth_init or board_eth_init at a time?

On Tuesday 10 June 2008, Shinya Kuribayashi wrote:
Shouldn't this be the other way around?
if (board_eth_init(bis) < 0)
eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Yeah, I think you're right. If board_eth_init() exists, it gets highest priority.
Just wondered, does that mean we could only have either cpu_eth_init or board_eth_init at a time?
Not really. board_eth_init() could call cpu_eth_init() if necessary.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================

Stefan Roese wrote:
On Tuesday 10 June 2008, Shinya Kuribayashi wrote:
Shouldn't this be the other way around?
if (board_eth_init(bis) < 0)
eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Yeah, I think you're right. If board_eth_init() exists, it gets highest priority.
Just wondered, does that mean we could only have either cpu_eth_init or board_eth_init at a time?
Not really. board_eth_init() could call cpu_eth_init() if necessary.
Hm. What is cpu_eth_init for then? Just
board_eth_init(bis);
seems to be enough for me. I also wonder where is the best place to have cpu_eth_init?
I'm not going to argue with you, I'm just thinking about my targets. One of my targets has internal ethernet MAC, and its evaluation board has an on-board external PCI NIC. Another target has internal MAC, but doesn't have PCI NIC.
I thought it'll be something like
cpu_eth_init(bis); board_eth_init(bis);
But again, I don't have strong opinions around here. Please go ahead.
Thanks for your comments,
Shinya

Shinya Kuribayashi wrote:
Stefan Roese wrote:
On Tuesday 10 June 2008, Shinya Kuribayashi wrote:
Shouldn't this be the other way around?
if (board_eth_init(bis) < 0)
eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Yeah, I think you're right. If board_eth_init() exists, it gets highest priority.
Just wondered, does that mean we could only have either cpu_eth_init or board_eth_init at a time?
Not really. board_eth_init() could call cpu_eth_init() if necessary.
Hm. What is cpu_eth_init for then? Just
board_eth_init(bis);
seems to be enough for me. I also wonder where is the best place to have cpu_eth_init?
The cpu_init() was suggested by Stefan in our original discussion, when I only had the board function. His perspective is ppc_4xx, where tons of CPUs and boards share the EMAC driver, and he didn't want to modify each board. As you'll see in the discussion with JDL, it can probably apply to TSEC as well.
I'm not going to argue with you, I'm just thinking about my targets. One of my targets has internal ethernet MAC, and its evaluation board has an on-board external PCI NIC. Another target has internal MAC, but doesn't have PCI NIC.
I thought it'll be something like
cpu_eth_init(bis); board_eth_init(bis);
The idea is that cpu_eth_init is a default for a CPU family, and board_eth_init is a board override, which can of course call cpu_eth_init.
But again, I don't have strong opinions around here. Please go ahead.
Thanks for your comments,
Shinya
Thanks for the discussion!
cheers, Ben

On 09:16 Tue 10 Jun , Ben Warren wrote:
Shinya Kuribayashi wrote:
Stefan Roese wrote:
On Tuesday 10 June 2008, Shinya Kuribayashi wrote:
Shouldn't this be the other way around?
if (board_eth_init(bis) < 0)
eth_eth_init(bis);
So that the board init routine can "overwrite" the cpu init version.
Yeah, I think you're right. If board_eth_init() exists, it gets highest priority.
Just wondered, does that mean we could only have either cpu_eth_init or board_eth_init at a time?
Not really. board_eth_init() could call cpu_eth_init() if necessary.
Hm. What is cpu_eth_init for then? Just
board_eth_init(bis);
seems to be enough for me. I also wonder where is the best place to have cpu_eth_init?
The cpu_init() was suggested by Stefan in our original discussion, when I only had the board function. His perspective is ppc_4xx, where tons of CPUs and boards share the EMAC driver, and he didn't want to modify each board. As you'll see in the discussion with JDL, it can probably apply to TSEC as well.
I'm not going to argue with you, I'm just thinking about my targets. One of my targets has internal ethernet MAC, and its evaluation board has an on-board external PCI NIC. Another target has internal MAC, but doesn't have PCI NIC.
I thought it'll be something like
cpu_eth_init(bis); board_eth_init(bis);
The idea is that cpu_eth_init is a default for a CPU family, and board_eth_init is a board override, which can of course call cpu_eth_init.
What about a section to declare the netdev?
In this case we can have more than 2 eth and it more generic.
Best Regards, J.

Jean-Christophe PLAGNIOL-VILLARD wrote:
On 09:16 Tue 10 Jun , Ben Warren wrote:
Shinya Kuribayashi wrote:
Stefan Roese wrote:
On Tuesday 10 June 2008, Shinya Kuribayashi wrote:
> Shouldn't this be the other way around? > > + if (board_eth_init(bis) < 0) > + eth_eth_init(bis); > > So that the board init routine can "overwrite" the cpu init version. > Yeah, I think you're right. If board_eth_init() exists, it gets highest priority.
Just wondered, does that mean we could only have either cpu_eth_init or board_eth_init at a time?
Not really. board_eth_init() could call cpu_eth_init() if necessary.
Hm. What is cpu_eth_init for then? Just
board_eth_init(bis);
seems to be enough for me. I also wonder where is the best place to have cpu_eth_init?
The cpu_init() was suggested by Stefan in our original discussion, when I only had the board function. His perspective is ppc_4xx, where tons of CPUs and boards share the EMAC driver, and he didn't want to modify each board. As you'll see in the discussion with JDL, it can probably apply to TSEC as well.
I'm not going to argue with you, I'm just thinking about my targets. One of my targets has internal ethernet MAC, and its evaluation board has an on-board external PCI NIC. Another target has internal MAC, but doesn't have PCI NIC.
I thought it'll be something like
cpu_eth_init(bis); board_eth_init(bis);
The idea is that cpu_eth_init is a default for a CPU family, and board_eth_init is a board override, which can of course call cpu_eth_init.
What about a section to declare the netdev?
In this case we can have more than 2 eth and it more generic.
Best Regards, J.
Sorry, I don't follow.
regards, Ben

Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com wrote:
The idea is that cpu_eth_init is a default for a CPU family, and board_eth_init is a board override, which can of course call cpu_eth_init.
What about a section to declare the netdev?
Please, let's not overdo this. The patch as it stands is a huge improvement over the current situation.
In this case we can have more than 2 eth and it more generic.
You can have that now. board_eth_init() can initialize as many interfaces as it likes.
Haavard

On Wednesday 25 June 2008, Haavard Skinnemoen wrote:
Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com wrote:
The idea is that cpu_eth_init is a default for a CPU family, and board_eth_init is a board override, which can of course call cpu_eth_init.
What about a section to declare the netdev?
Please, let's not overdo this. The patch as it stands is a huge improvement over the current situation.
In this case we can have more than 2 eth and it more generic.
You can have that now. board_eth_init() can initialize as many interfaces as it likes.
Full ack on both statements.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================

On Tue, 10 Jun 2008 01:29:27 -0700 Ben Warren biggerbadderben@gmail.com wrote:
This patch is the first step in cleaning up net/eth.c, by moving Ethernet initialization to CPU or board-specific code. Initial implementation is only on the Freescale TSEC controller, but others will be added soon.
Signed-off-by: Ben Warren biggerbadderben@gmail.com
Sweet!
When we discussed this a few months ago, I was planning on defining the cpu_eth_init() and board_eth_init() functions as weak with no aliases, but in my testing this did not result in them being NULL, hence the default function.
Works just as well, doesn't it?
diff --git a/net/eth.c b/net/eth.c index c4f24c6..e75dc43 100644 --- a/net/eth.c +++ b/net/eth.c @@ -28,6 +28,12 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
+/* CPU and board-specific Ethernet initializations. Aliased function
- signals caller to move on */
+static int __def_eth_init(bd_t *bis) {return -1;}
Just a cosmetic thing: I really think this should look like a normal function, i.e. not cuddling everything up on one line. I've seen such things being mistaken for macros before.
Haavard

Haavard Skinnemoen wrote:
On Tue, 10 Jun 2008 01:29:27 -0700 Ben Warren biggerbadderben@gmail.com wrote:
This patch is the first step in cleaning up net/eth.c, by moving Ethernet initialization to CPU or board-specific code. Initial implementation is only on the Freescale TSEC controller, but others will be added soon.
Signed-off-by: Ben Warren biggerbadderben@gmail.com
Sweet!
When we discussed this a few months ago, I was planning on defining the cpu_eth_init() and board_eth_init() functions as weak with no aliases, but in my testing this did not result in them being NULL, hence the default function.
Works just as well, doesn't it?
diff --git a/net/eth.c b/net/eth.c index c4f24c6..e75dc43 100644 --- a/net/eth.c +++ b/net/eth.c @@ -28,6 +28,12 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
+/* CPU and board-specific Ethernet initializations. Aliased function
- signals caller to move on */
+static int __def_eth_init(bd_t *bis) {return -1;}
Just a cosmetic thing: I really think this should look like a normal function, i.e. not cuddling everything up on one line. I've seen such things being mistaken for macros before.
Haavard
/* * ...and the comment style should be like this. Coding standards, * y'know. */
Best regards, gvb
participants (6)
-
Ben Warren
-
Haavard Skinnemoen
-
Jean-Christophe PLAGNIOL-VILLARD
-
Jerry Van Baren
-
Shinya Kuribayashi
-
Stefan Roese