Pass in tsec_info struct through tsec_initialize
authorAndy Fleming <afleming@freescale.com>
Sun, 31 Aug 2008 21:33:26 +0000 (16:33 -0500)
committerBen Warren <biggerbadderben@gmail.com>
Wed, 3 Sep 2008 04:18:15 +0000 (21:18 -0700)
The tsec driver contains a hard-coded array of configuration information
for the tsec ethernet controllers.  We create a default function that works
for most tsecs, and allow that to be overridden by board code.  It creates
an array of tsec_info structures, which are then parsed by the corresponding
driver instance to determine configuration.  Also, add regs, miiregs, and
devname fields to the tsec_info structure, so that we don't need the kludgy
"index" parameter.

Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
cpu/mpc83xx/cpu.c
cpu/mpc85xx/cpu.c
cpu/mpc86xx/cpu.c
drivers/net/tsec.c
include/tsec.h

index 52e4476d850d8c5bf99139e90e21c7ebf80e5688..5862acdc459fcc284ee21cfdca8c03b0e8665cb3 100644 (file)
@@ -32,6 +32,7 @@
 #include <mpc83xx.h>
 #include <asm/processor.h>
 #include <libfdt.h>
+#include <tsec.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -358,22 +359,15 @@ int dma_xfer(void *dest, u32 count, void *src)
 }
 #endif /*CONFIG_DDR_ECC*/
 
-#ifdef CONFIG_TSEC_ENET
-/* Default initializations for TSEC controllers.  To override,
- * create a board-specific function called:
- *     int board_eth_init(bd_t *bis)
+/*
+ * Initializes on-chip ethernet controllers.
+ * to override, implement board_eth_init()
  */
-
-extern int tsec_initialize(bd_t * bis, int index, char *devname);
-
 int cpu_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);
+#if defined(CONFIG_TSEC_ENET)
+       tsec_standard_init(bis);
 #endif
+
        return 0;
 }
-#endif
index 2fe3cea3f1707f3435e70ba500edaf1cc3f07486..7976caca67eb572188793289e5cc267c0854a260 100644 (file)
  * MA 02111-1307 USA
  */
 
+#include <config.h>
 #include <common.h>
 #include <watchdog.h>
 #include <command.h>
+#include <tsec.h>
 #include <asm/cache.h>
 #include <asm/io.h>
 
@@ -294,6 +296,7 @@ int dma_xfer(void *dest, uint count, void *src) {
        return dma_check();
 }
 #endif
+
 /*
  * Configures a UPM. Currently, the loop fields in MxMR (RLF, WLF and TLF)
  * are hardcoded as "1"."size" is the number or entries, not a sizeof.
@@ -360,32 +363,16 @@ void upmconfig (uint upm, uint * table, uint size)
        out_be32(mxmr, loopval); /* OP_NORMAL */
 }
 
-#if defined(CONFIG_TSEC_ENET) || defined(CONFIGMPC85XX_FEC)
-/* Default initializations for TSEC controllers.  To override,
- * create a board-specific function called:
- *     int board_eth_init(bd_t *bis)
- */
-
-extern int tsec_initialize(bd_t * bis, int index, char *devname);
 
+/*
+ * Initializes on-chip ethernet controllers.
+ * to override, implement board_eth_init()
+ */
 int cpu_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
+#if defined(CONFIG_TSEC_ENET) || defined(CONFIG_MPC85xx_FEC)
+       tsec_standard_init(bis);
 #endif
+
        return 0;
 }
-#endif
index ecea5b0643896211960c4821ab9e11acae94f5c5..3a75af77cf64ca1f4014001d835b3702b5095541 100644 (file)
@@ -28,6 +28,7 @@
 #include <asm/cache.h>
 #include <asm/mmu.h>
 #include <mpc86xx.h>
+#include <tsec.h>
 #include <asm/fsl_law.h>
 
 
@@ -305,28 +306,15 @@ void mpc86xx_reginfo(void)
 
 }
 
-#ifdef CONFIG_TSEC_ENET
-/* Default initializations for TSEC controllers.  To override,
- * create a board-specific function called:
- *     int board_eth_init(bd_t *bis)
+/*
+ * Initializes on-chip ethernet controllers.
+ * to override, implement board_eth_init()
  */
-
-extern int tsec_initialize(bd_t * bis, int index, char *devname);
-
 int cpu_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);
+#if defined(CONFIG_TSEC_ENET)
+       tsec_standard_init(bis);
 #endif
+
        return 0;
 }
-#endif /* CONFIG_TSEC_ENET */
index 59d41e9ce681f81ea4ec53b80ec89c46029cbbc5..fbbdd3da9bf10490e60498f2ddb5b509a7ffbedc 100644 (file)
@@ -32,63 +32,12 @@ typedef volatile struct rtxbd {
        rxbd8_t rxbd[PKTBUFSRX];
 } RTXBD;
 
-/* The tsec_info structure contains 3 values which the
- * driver uses to determine how to operate a given ethernet
- * device. The information needed is:
- *  phyaddr - The address of the PHY which is attached to
- *     the given device.
- *
- *  flags - This variable indicates whether the device
- *     supports gigabit speed ethernet, and whether it should be
- *     in reduced mode.
- *
- *  phyregidx - This variable specifies which ethernet device
- *     controls the MII Management registers which are connected
- *     to the PHY.  For now, only TSEC1 (index 0) has
- *     access to the PHYs, so all of the entries have "0".
- *
- * The values specified in the table are taken from the board's
- * config file in include/configs/.  When implementing a new
- * board with ethernet capability, it is necessary to define:
- *   TSECn_PHY_ADDR
- *   TSECn_PHYIDX
- *
- * for n = 1,2,3, etc.  And for FEC:
- *   FEC_PHY_ADDR
- *   FEC_PHYIDX
- */
-static struct tsec_info_struct tsec_info[] = {
-#ifdef CONFIG_TSEC1
-       {TSEC1_PHY_ADDR, TSEC1_FLAGS, TSEC1_PHYIDX},
-#else
-       {0, 0, 0},
-#endif
-#ifdef CONFIG_TSEC2
-       {TSEC2_PHY_ADDR, TSEC2_FLAGS, TSEC2_PHYIDX},
-#else
-       {0, 0, 0},
-#endif
-#ifdef CONFIG_MPC85XX_FEC
-       {FEC_PHY_ADDR, FEC_FLAGS, FEC_PHYIDX},
-#else
-#ifdef CONFIG_TSEC3
-       {TSEC3_PHY_ADDR, TSEC3_FLAGS, TSEC3_PHYIDX},
-#else
-       {0, 0, 0},
-#endif
-#ifdef CONFIG_TSEC4
-       {TSEC4_PHY_ADDR, TSEC4_FLAGS, TSEC4_PHYIDX},
-#else
-       {0, 0, 0},
-#endif /* CONFIG_TSEC4 */
-#endif /* CONFIG_MPC85XX_FEC */
-};
-
-#define MAXCONTROLLERS (4)
+#define MAXCONTROLLERS (8)
 
 static int relocated = 0;
 
 static struct tsec_private *privlist[MAXCONTROLLERS];
+static int num_tsecs = 0;
 
 #ifdef __GNUC__
 static RTXBD rtx __attribute__ ((aligned(8)));
@@ -121,10 +70,51 @@ static int tsec_miiphy_read(char *devname, unsigned char addr,
 static int tsec_mcast_addr (struct eth_device *dev, u8 mcast_mac, u8 set);
 #endif
 
+/* Default initializations for TSEC controllers. */
+
+static struct tsec_info_struct tsec_info[] = {
+#ifdef CONFIG_TSEC1
+       STD_TSEC_INFO(1),       /* TSEC1 */
+#endif
+#ifdef CONFIG_TSEC2
+       STD_TSEC_INFO(2),       /* TSEC2 */
+#endif
+#ifdef CONFIG_MPC85XX_FEC
+       {
+               .regs = (tsec_t *)(TSEC_BASE_ADDR + 0x2000),
+               .miiregs = (tsec_t *)(TSEC_BASE_ADDR),
+               .devname = CONFIG_MPC85XX_FEC_NAME,
+               .phyaddr = FEC_PHY_ADDR,
+               .flags = FEC_FLAGS
+       },                      /* FEC */
+#endif
+#ifdef CONFIG_TSEC3
+       STD_TSEC_INFO(3),       /* TSEC3 */
+#endif
+#ifdef CONFIG_TSEC4
+       STD_TSEC_INFO(4),       /* TSEC4 */
+#endif
+};
+
+int tsec_eth_init(bd_t *bis, struct tsec_info_struct *tsecs, int num)
+{
+       int i;
+
+       for (i = 0; i < num; i++)
+               tsec_initialize(bis, &tsecs[i]);
+
+       return 0;
+}
+
+int tsec_standard_init(bd_t *bis)
+{
+       return tsec_eth_init(bis, tsec_info, ARRAY_SIZE(tsec_info));
+}
+
 /* Initialize device structure. Returns success if PHY
  * initialization succeeded (i.e. if it recognizes the PHY)
  */
-int tsec_initialize(bd_t * bis, int index, char *devname)
+int tsec_initialize(bd_t * bis, struct tsec_info_struct *tsec_info)
 {
        struct eth_device *dev;
        int i;
@@ -142,16 +132,14 @@ int tsec_initialize(bd_t * bis, int index, char *devname)
        if (NULL == priv)
                return 0;
 
-       privlist[index] = priv;
-       priv->regs = (volatile tsec_t *)(TSEC_BASE_ADDR + index * TSEC_SIZE);
-       priv->phyregs = (volatile tsec_t *)(TSEC_BASE_ADDR +
-                                           tsec_info[index].phyregidx *
-                                           TSEC_SIZE);
+       privlist[num_tsecs++] = priv;
+       priv->regs = tsec_info->regs;
+       priv->phyregs = tsec_info->miiregs;
 
-       priv->phyaddr = tsec_info[index].phyaddr;
-       priv->flags = tsec_info[index].flags;
+       priv->phyaddr = tsec_info->phyaddr;
+       priv->flags = tsec_info->flags;
 
-       sprintf(dev->name, devname);
+       sprintf(dev->name, tsec_info->devname);
        dev->iobase = 0;
        dev->priv = priv;
        dev->init = tsec_init;
@@ -226,7 +214,6 @@ int tsec_init(struct eth_device *dev, bd_t * bd)
 
        /* If there's no link, fail */
        return (priv->link ? 0 : -1);
-
 }
 
 /* Write value to the device's PHY through the registers
index 83863aef16299d534820eaefb11f76403e229a44..c05b5f090ea35c260e5c06a9d4c9f38139e170c0 100644 (file)
 #define TSEC_SIZE      0x01000
 
 /* FIXME:  Should these be pushed back to 83xx and 85xx config files? */
-#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
-    #define TSEC_BASE_ADDR     (CFG_IMMR + CFG_TSEC1_OFFSET)
-#elif defined(CONFIG_MPC83XX)
+#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) \
+       || defined(CONFIG_MPC83XX)
     #define TSEC_BASE_ADDR     (CFG_IMMR + CFG_TSEC1_OFFSET)
 #endif
 
+#define STD_TSEC_INFO(num) \
+{                      \
+       .regs = (tsec_t *)(TSEC_BASE_ADDR + ((num - 1) * TSEC_SIZE)), \
+       .miiregs = (tsec_t *)TSEC_BASE_ADDR, \
+       .devname = CONFIG_TSEC##num##_NAME, \
+       .phyaddr = TSEC##num##_PHY_ADDR, \
+       .flags = TSEC##num##_FLAGS \
+}
+
+#define SET_STD_TSEC_INFO(x, num) \
+{                      \
+       x.regs = (tsec_t *)(TSEC_BASE_ADDR + ((num - 1) * TSEC_SIZE)); \
+       x.miiregs = (tsec_t *)TSEC_BASE_ADDR; \
+       x.devname = CONFIG_TSEC##num##_NAME; \
+       x.phyaddr = TSEC##num##_PHY_ADDR; \
+       x.flags = TSEC##num##_FLAGS;\
+}
+
+
 
 #define MAC_ADDR_LEN 6
 
@@ -584,9 +602,15 @@ struct phy_info {
 };
 
 struct tsec_info_struct {
+       tsec_t *regs;
+       tsec_t *miiregs;
+       char *devname;
        unsigned int phyaddr;
        u32 flags;
-       unsigned int phyregidx;
 };
 
+int tsec_initialize(bd_t * bis, struct tsec_info_struct *tsec_info);
+int tsec_standard_init(bd_t *bis);
+int tsec_eth_init(bd_t *bis, struct tsec_info_struct *tsec_info, int num);
+
 #endif /* __TSEC_H */