diff options
| -rw-r--r-- | drivers/net/macb.c | 110 | 
1 files changed, 33 insertions, 77 deletions
| diff --git a/drivers/net/macb.c b/drivers/net/macb.c index c1843539f..dcb885023 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -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;  } |