[U-Boot] [PATCH v1 1/2] NET: Move MDIO regs out of TSEC Space

Kumar Gala galak at kernel.crashing.org
Sun Oct 18 20:38:11 CEST 2009


On Oct 18, 2009, at 3:43 AM, Sandeep Gopalpet wrote:

> Moved the mdio regs out of the tsec structure,and
> provided different offsets for tsec base and mdio
> base so that provision for etsec2.0 can be provided.
>
> This patch helps in providing the support for etsec2.0
> In etsec2.0, the MDIO register space and the etsec reg
> space are different.
>
> Signed-off-by: Sandeep Gopalpet <sandeep.kumar at freescale.com>
> ---
> drivers/net/tsec.c           |   20 ++++++++--------
> include/asm-ppc/immap_85xx.h |   10 ++++++++
> include/tsec.h               |   48 ++++++++++++++++++++++++++++++ 
> +----------
> 3 files changed, 56 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c
> index 5c3d261..2ad033e 100644
> --- a/drivers/net/tsec.c
> +++ b/drivers/net/tsec.c
> @@ -83,7 +83,7 @@ static struct tsec_info_struct tsec_info[] = {
> #ifdef CONFIG_MPC85XX_FEC
> 	{
> 		.regs = (tsec_t *)(TSEC_BASE_ADDR + 0x2000),
> -		.miiregs = (tsec_t *)(TSEC_BASE_ADDR),
> +		.miiregs = (tsec_mdio_t *)(MDIO_BASE_ADDR),
> 		.devname = CONFIG_MPC85XX_FEC_NAME,
> 		.phyaddr = FEC_PHY_ADDR,
> 		.flags = FEC_FLAGS
> @@ -136,6 +136,7 @@ int tsec_initialize(bd_t * bis, struct  
> tsec_info_struct *tsec_info)
> 	privlist[num_tsecs++] = priv;
> 	priv->regs = tsec_info->regs;
> 	priv->phyregs = tsec_info->miiregs;
> +	priv->phyregs_sgmii = tsec_info->miiregs_sgmii;
>
> 	priv->phyaddr = tsec_info->phyaddr;
> 	priv->flags = tsec_info->flags;
> @@ -222,7 +223,7 @@ int tsec_init(struct eth_device *dev, bd_t * bd)
> }
>
> /* Writes the given phy's reg with value, using the specified MDIO  
> regs */
> -static void tsec_local_mdio_write(volatile tsec_t *phyregs, uint  
> addr,
> +static void tsec_local_mdio_write(volatile tsec_mdio_t *phyregs,  
> uint addr,
> 		uint reg, uint value)
> {
> 	int timeout = 1000000;
> @@ -245,7 +246,7 @@ static void tsec_local_mdio_write(volatile  
> tsec_t *phyregs, uint addr,
>  * notvalid bit cleared), and the bus to cease activity (miimind
>  * busy bit cleared), and then returns the value
>  */
> -uint tsec_local_mdio_read(volatile tsec_t *phyregs, uint phyid,  
> uint regnum)
> +uint tsec_local_mdio_read(volatile tsec_mdio_t *phyregs, uint  
> phyid, uint regnum)
> {
> 	uint value;
>
> @@ -290,11 +291,11 @@ static void tsec_configure_serdes(struct  
> tsec_private *priv)
> {
> 	/* Access TBI PHY registers at given TSEC register offset as  
> opposed to the
> 	 * register offset used for external PHY accesses */
> -	tsec_local_mdio_write(priv->regs, priv->regs->tbipa, TBI_ANA,
> +	tsec_local_mdio_write(priv->phyregs_sgmii, priv->regs->tbipa,  
> TBI_ANA,
> 			TBIANA_SETTINGS);
> -	tsec_local_mdio_write(priv->regs, priv->regs->tbipa, TBI_TBICON,
> +	tsec_local_mdio_write(priv->phyregs_sgmii, priv->regs->tbipa,  
> TBI_TBICON,
> 			TBICON_CLK_SELECT);
> -	tsec_local_mdio_write(priv->regs, priv->regs->tbipa, TBI_CR,
> +	tsec_local_mdio_write(priv->phyregs_sgmii, priv->regs->tbipa,  
> TBI_CR,
> 			TBICR_SETTINGS);
> }
>
> @@ -306,12 +307,11 @@ static int init_phy(struct eth_device *dev)
> {
> 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
> 	struct phy_info *curphy;
> -	volatile tsec_t *phyregs = priv->phyregs;
> +	volatile tsec_mdio_t *phyregs = priv->phyregs;
> 	volatile tsec_t *regs = priv->regs;
>
> 	/* Assign a Physical address to the TBI */
> 	regs->tbipa = CONFIG_SYS_TBIPA_VALUE;
> -	phyregs->tbipa = CONFIG_SYS_TBIPA_VALUE;
> 	asm("sync");
>
> 	/* Reset MII (due to new addresses) */
> @@ -739,7 +739,7 @@ uint mii_parse_dm9161_scsr(uint mii_reg, struct  
> tsec_private * priv)
> uint mii_cis8204_fixled(uint mii_reg, struct tsec_private * priv)
> {
> 	uint phyid;
> -	volatile tsec_t *regbase = priv->phyregs;
> +	volatile tsec_mdio_t *regbase = priv->phyregs;
> 	int timeout = 1000000;
>
> 	for (phyid = 0; phyid < 4; phyid++) {
> @@ -1772,7 +1772,7 @@ void phy_run_commands(struct tsec_private  
> *priv, struct phy_cmd *cmd)
> {
> 	int i;
> 	uint result;
> -	volatile tsec_t *phyregs = priv->phyregs;
> +	volatile tsec_mdio_t *phyregs = priv->phyregs;
>
> 	phyregs->miimcfg = MIIMCFG_RESET;
>
> diff --git a/include/asm-ppc/immap_85xx.h b/include/asm-ppc/ 
> immap_85xx.h
> index 4194295..6c9baac 100644
> --- a/include/asm-ppc/immap_85xx.h
> +++ b/include/asm-ppc/immap_85xx.h
> @@ -1932,4 +1932,14 @@ typedef struct ccsr_gur {
> #define CONFIG_SYS_MPC85xx_USB_ADDR \
> 	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_USB_OFFSET)
>
> +/* TSEC and MDIO OFFSETS */
> +#define CONFIG_SYS_TSEC1_OFFSET		(0x24000)
> +#define TSEC_SIZE			(0x01000)
> +
> +#define CONFIG_SYS_MDIO1_OFFSET		(0x24520)
> +#define MDIO_OFFSET     		(0x01000)
> +
> +#define TSEC_BASE_ADDR		(CONFIG_SYS_IMMR + CONFIG_SYS_TSEC1_OFFSET)
> +#define MDIO_BASE_ADDR		(CONFIG_SYS_IMMR + CONFIG_SYS_MDIO1_OFFSET)
> +

Do we even need these here?  We haven't historically.

> #endif /*__IMMAP_85xx__*/
> diff --git a/include/tsec.h b/include/tsec.h
> index 0ac3034..342c07e 100644
> --- a/include/tsec.h
> +++ b/include/tsec.h
> @@ -7,7 +7,7 @@
>  *  terms of the GNU Public License, Version 2, incorporated
>  *  herein by reference.
>  *
> - * Copyright 2004, 2007 Freescale Semiconductor, Inc.
> + * Copyright 2004, 2007, 2009  Freescale Semiconductor, Inc.
>  * (C) Copyright 2003, Motorola, Inc.
>  * maintained by Xianghua Xiao (x.xiao at motorola.com)
>  * author Andy Fleming
> @@ -24,18 +24,34 @@
>     #define CONFIG_SYS_TSEC1_OFFSET	(0x24000)
> #endif
>
> -#define TSEC_SIZE	0x01000
> +#ifndef TSEC_SIZE
> +	#define TSEC_SIZE	0x01000
> +#endif

Do we really need a #ifndef here?

> +
> +#ifndef CONFIG_SYS_MDIO1_OFFSET
> +    #define CONFIG_SYS_MDIO1_OFFSET	(0x24520)
> +#endif

the parens aren't needed.

> +
> +#ifndef MDIO_OFFSET
> +	#define MDIO_OFFSET	0x01000
> +#endif

How about calling this TSEC_MDIO_OFFSET

>
> /* FIXME:  Should these be pushed back to 83xx and 85xx config  
> files? */
> #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) \
> 	|| defined(CONFIG_MPC83xx)
> +#ifndef TSEC_BASE_ADDR
>     #define TSEC_BASE_ADDR	(CONFIG_SYS_IMMR + CONFIG_SYS_TSEC1_OFFSET)
> #endif
> +#ifndef MDIO_BASE_ADDR
> +    #define MDIO_BASE_ADDR	(CONFIG_SYS_IMMR +  
> CONFIG_SYS_MDIO1_OFFSET)
> +#endif
> +#endif

Do we really need the #ifndef's here?

>
> #define STD_TSEC_INFO(num) \
> {			\
> 	.regs = (tsec_t *)(TSEC_BASE_ADDR + ((num - 1) * TSEC_SIZE)), \
> -	.miiregs = (tsec_t *)TSEC_BASE_ADDR, \
> +	.miiregs = (tsec_mdio_t *)(MDIO_BASE_ADDR), \
> +	.miiregs_sgmii = (tsec_mdio_t *)(MDIO_BASE_ADDR + (num -1) 
> *MDIO_OFFSET ), \
> 	.devname = CONFIG_TSEC##num##_NAME, \
> 	.phyaddr = TSEC##num##_PHY_ADDR, \
> 	.flags = TSEC##num##_FLAGS \
> @@ -44,7 +60,8 @@
> #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.miiregs = (tsec_mdio_t *)(MDIO_BASE_ADDR); \
> +	x.miiregs_sgmii = (tsec_mdio_t *)(MDIO_BASE_ADDR + (num -1) 
> *MDIO_OFFSET); \
> 	x.devname = CONFIG_TSEC##num##_NAME; \
> 	x.phyaddr = TSEC##num##_PHY_ADDR; \
> 	x.flags = TSEC##num##_FLAGS;\
> @@ -461,6 +478,16 @@ typedef struct tsec_hash_regs
> 	uint	res2[24];
> } tsec_hash_t;
>
> +typedef struct tsec_mdio
> +{
> +	uint	miimcfg;	/* MII Management: Configuration */
> +	uint	miimcom;	/* MII Management: Command */
> +	uint	miimadd;	/* MII Management: Address */
> +	uint	miimcon;	/* MII Management: Control */
> +	uint	miimstat;	/* MII Management: Status */
> +	uint	miimind;	/* MII Management: Indicators */
> +} tsec_mdio_t;
> +
> typedef struct tsec
> {
> 	/* General Control and Status Registers (0x2_n000) */
> @@ -526,12 +553,7 @@ typedef struct tsec
>
> 	uint	res51c;
>
> -	uint	miimcfg;	/* MII Management: Configuration */
> -	uint	miimcom;	/* MII Management: Command */
> -	uint	miimadd;	/* MII Management: Address */
> -	uint	miimcon;	/* MII Management: Control */
> -	uint	miimstat;	/* MII Management: Status */
> -	uint	miimind;	/* MII Management: Indicators */
> +	uint	resmdio[6];
>
> 	uint	res538;
>
> @@ -571,7 +593,8 @@ typedef struct tsec
>
> struct tsec_private {
> 	volatile tsec_t *regs;
> -	volatile tsec_t *phyregs;
> +	volatile tsec_mdio_t *phyregs;
> +	volatile tsec_mdio_t *phyregs_sgmii;
> 	struct phy_info *phyinfo;
> 	uint phyaddr;
> 	u32 flags;
> @@ -630,7 +653,8 @@ struct phy_info {
>
> struct tsec_info_struct {
> 	tsec_t *regs;
> -	tsec_t *miiregs;
> +	tsec_mdio_t *miiregs;
> +	tsec_mdio_t *miiregs_sgmii;
> 	char *devname;
> 	unsigned int phyaddr;
> 	u32 flags;
> -- 
> 1.5.2.2
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot



More information about the U-Boot mailing list