@ -465,30 +465,88 @@ int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis)
# if defined(CONFIG_405EX)
int ppc_4xx_eth_setup_bridge ( int devnum , bd_t * bis )
{
u32 gmiifer = 0 ;
u32 r gmiifer = 0 ;
/*
* Right now only 2 * RGMII is supported . Please extend when needed .
* sr - 2007 - 09 - 19
* The 405 EX ( r ) ' s RGMII bridge can operate in one of several
* modes , only one of which ( 2 x RGMII ) allows the
* simultaneous use of both EMACs on the 405 EX .
*/
switch ( 1 ) {
case 1 :
switch ( CONFIG_EMAC_PHY_MODE ) {
case EMAC_PHY_MODE_NONE :
/* No ports */
rgmiifer | = RGMII_FER_DIS < < 0 ;
rgmiifer | = RGMII_FER_DIS < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_NONE ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_NONE ;
break ;
case EMAC_PHY_MODE_NONE_RGMII :
/* 1 x RGMII port on channel 0 */
rgmiifer | = RGMII_FER_RGMII < < 0 ;
rgmiifer | = RGMII_FER_DIS < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_RGMII ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_NONE ;
break ;
case EMAC_PHY_MODE_RGMII_NONE :
/* 1 x RGMII port on channel 1 */
rgmiifer | = RGMII_FER_DIS < < 0 ;
rgmiifer | = RGMII_FER_RGMII < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_NONE ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_RGMII ;
break ;
case EMAC_PHY_MODE_RGMII_RGMII :
/* 2 x RGMII ports */
out_be32 ( ( void * ) RGMII_FER , 0x00000055 ) ;
rgmiifer | = RGMII_FER_RGMII < < 0 ;
rgmiifer | = RGMII_FER_RGMII < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_RGMII ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_RGMII ;
break ;
case 2 :
/* 2 x SMII ports */
case EMAC_PHY_MODE_NONE_GMII :
/* 1 x GMII port on channel 0 */
rgmiifer | = RGMII_FER_GMII < < 0 ;
rgmiifer | = RGMII_FER_DIS < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_GMII ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_NONE ;
break ;
case EMAC_PHY_MODE_NONE_MII :
/* 1 x MII port on channel 0 */
rgmiifer | = RGMII_FER_MII < < 0 ;
rgmiifer | = RGMII_FER_DIS < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_MII ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_NONE ;
break ;
case EMAC_PHY_MODE_GMII_NONE :
/* 1 x GMII port on channel 1 */
rgmiifer | = RGMII_FER_DIS < < 0 ;
rgmiifer | = RGMII_FER_GMII < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_NONE ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_GMII ;
break ;
case EMAC_PHY_MODE_MII_NONE :
/* 1 x MII port on channel 1 */
rgmiifer | = RGMII_FER_DIS < < 0 ;
rgmiifer | = RGMII_FER_MII < < 4 ;
out_be32 ( ( void * ) RGMII_FER , rgmiifer ) ;
bis - > bi_phymode [ 0 ] = BI_PHYMODE_NONE ;
bis - > bi_phymode [ 1 ] = BI_PHYMODE_MII ;
break ;
default :
break ;
}
/* Ensure we setup mdio for this devnum and ONLY this devnum */
gmiifer = in_be32 ( ( void * ) RGMII_FER ) ;
gmiifer | = ( 1 < < ( 19 - devnum ) ) ;
out_be32 ( ( void * ) RGMII_FER , gmiifer ) ;
r gmiifer = in_be32 ( ( void * ) RGMII_FER ) ;
r gmiifer | = ( 1 < < ( 19 - devnum ) ) ;
out_be32 ( ( void * ) RGMII_FER , r gmiifer) ;
return ( ( int ) 0x0 ) ;
}