@ -14,6 +14,8 @@
# include <config.h>
# include <common.h>
# include <net.h>
# include <libfdt.h>
# include <tsec.h>
void fsl_sgmii_riser_init ( struct tsec_info_struct * tsec_info , int num )
@ -24,3 +26,66 @@ void fsl_sgmii_riser_init(struct tsec_info_struct *tsec_info, int num)
if ( tsec_info [ i ] . flags & TSEC_SGMII )
tsec_info [ i ] . phyaddr + = SGMII_RISER_PHY_OFFSET ;
}
void fsl_sgmii_riser_fdt_fixup ( void * fdt )
{
struct eth_device * dev ;
int node ;
int i = - 1 ;
int etsec_num = 0 ;
node = fdt_path_offset ( fdt , " /aliases " ) ;
if ( node < 0 )
return ;
while ( ( dev = eth_get_dev_by_index ( + + i ) ) ! = NULL ) {
struct tsec_private * priv ;
int enet_node ;
char enet [ 16 ] ;
const u32 * phyh ;
int phynode ;
const char * model ;
const char * path ;
printf ( " Updating PHY address for %s \n " , dev - > name ) ;
if ( ! strstr ( dev - > name , " eTSEC " ) )
continue ;
sprintf ( enet , " ethernet%d " , etsec_num + + ) ;
path = fdt_getprop ( fdt , node , enet , NULL ) ;
if ( ! path ) {
debug ( " No alias for %s \n " , enet ) ;
continue ;
}
enet_node = fdt_path_offset ( fdt , path ) ;
if ( enet_node < 0 )
continue ;
model = fdt_getprop ( fdt , enet_node , " model " , NULL ) ;
printf ( " %s's model is %s \n " , enet , model ) ;
/*
* We only want to do this to eTSECs . On some platforms
* there are more than one type of gianfar - style ethernet
* controller , and as we are creating an implicit connection
* between ethernet nodes and eTSEC devices , it is best to
* make the connection use as much explicit information
* as exists .
*/
if ( ! strstr ( model , " TSEC " ) )
continue ;
phyh = fdt_getprop ( fdt , enet_node , " phy-handle " , NULL ) ;
if ( ! phyh )
continue ;
phynode = fdt_node_offset_by_phandle ( fdt , fdt32_to_cpu ( * phyh ) ) ;
priv = dev - > priv ;
printf ( " Device flags are %x \n " , priv - > flags ) ;
if ( priv - > flags & TSEC_SGMII )
fdt_setprop_cell ( fdt , phynode , " reg " , priv - > phyaddr ) ;
}
}