@ -42,6 +42,7 @@
# include <net.h>
# include <netdev.h>
# include <malloc.h>
# include <miiphy.h>
# include <linux/mii.h>
# include <asm/io.h>
@ -164,6 +165,36 @@ static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
return MACB_BFEXT ( DATA , frame ) ;
}
# if defined(CONFIG_CMD_MII)
int macb_miiphy_read ( char * devname , u8 phy_adr , u8 reg , u16 * value )
{
struct eth_device * dev = eth_get_dev_by_name ( devname ) ;
struct macb_device * macb = to_macb ( dev ) ;
if ( macb - > phy_addr ! = phy_adr )
return - 1 ;
* value = macb_mdio_read ( macb , reg ) ;
return 0 ;
}
int macb_miiphy_write ( char * devname , u8 phy_adr , u8 reg , u16 value )
{
struct eth_device * dev = eth_get_dev_by_name ( devname ) ;
struct macb_device * macb = to_macb ( dev ) ;
if ( macb - > phy_addr ! = phy_adr )
return - 1 ;
macb_mdio_write ( macb , reg , value ) ;
return 0 ;
}
# endif
# if defined(CONFIG_CMD_NET)
static int macb_send ( struct eth_device * netdev , volatile void * packet ,
@ -542,84 +573,9 @@ int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
eth_register ( netdev ) ;
return 0 ;
}
# endif
# if defined(CONFIG_CMD_MII)
int miiphy_read ( unsigned char addr , unsigned char reg , unsigned short * value )
{
unsigned long netctl ;
unsigned long netstat ;
unsigned long frame ;
int iflag ;
iflag = disable_interrupts ( ) ;
netctl = macb_readl ( & macb , EMACB_NCR ) ;
netctl | = MACB_BIT ( MPE ) ;
macb_writel ( & macb , EMACB_NCR , netctl ) ;
if ( iflag )
enable_interrupts ( ) ;
frame = ( MACB_BF ( SOF , 1 )
| MACB_BF ( RW , 2 )
| MACB_BF ( PHYA , addr )
| MACB_BF ( REGA , reg )
| MACB_BF ( CODE , 2 ) ) ;
macb_writel ( & macb , EMACB_MAN , frame ) ;
do {
netstat = macb_readl ( & macb , EMACB_NSR ) ;
} while ( ! ( netstat & MACB_BIT ( IDLE ) ) ) ;
frame = macb_readl ( & macb , EMACB_MAN ) ;
* value = MACB_BFEXT ( DATA , frame ) ;
iflag = disable_interrupts ( ) ;
netctl = macb_readl ( & macb , EMACB_NCR ) ;
netctl & = ~ MACB_BIT ( MPE ) ;
macb_writel ( & macb , EMACB_NCR , netctl ) ;
if ( iflag )
enable_interrupts ( ) ;
return 0 ;
}
int miiphy_write ( unsigned char addr , unsigned char reg , unsigned short value )
{
unsigned long netctl ;
unsigned long netstat ;
unsigned long frame ;
int iflag ;
iflag = disable_interrupts ( ) ;
netctl = macb_readl ( & macb , EMACB_NCR ) ;
netctl | = MACB_BIT ( MPE ) ;
macb_writel ( & macb , EMACB_NCR , netctl ) ;
if ( iflag )
enable_interrupts ( ) ;
frame = ( MACB_BF ( SOF , 1 )
| MACB_BF ( RW , 1 )
| MACB_BF ( PHYA , addr )
| MACB_BF ( REGA , reg )
| MACB_BF ( CODE , 2 )
| MACB_BF ( DATA , value ) ) ;
macb_writel ( & macb , EMACB_MAN , frame ) ;
do {
netstat = macb_readl ( & macb , EMACB_NSR ) ;
} while ( ! ( netstat & MACB_BIT ( IDLE ) ) ) ;
iflag = disable_interrupts ( ) ;
netctl = macb_readl ( & macb , EMACB_NCR ) ;
netctl & = ~ MACB_BIT ( MPE ) ;
macb_writel ( & macb , EMACB_NCR , netctl ) ;
if ( iflag )
enable_interrupts ( ) ;
miiphy_register ( netdev - > name , macb_miiphy_read , macb_miiphy_write ) ;
# endif
return 0 ;
}