Pass in tsec_info struct through tsec_initialize

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>
This commit is contained in:
Andy Fleming 2008-08-31 16:33:26 -05:00 committed by Ben Warren
parent dd3d1f56a0
commit 75b9d4ae0d
5 changed files with 102 additions and 122 deletions

View 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

View File

@ -25,9 +25,11 @@
* 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)
/*
* 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_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

View 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 */

View 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

View File

@ -27,12 +27,30 @@
#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 */