mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 21:24:21 +08:00
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:
parent
dd3d1f56a0
commit
75b9d4ae0d
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user