mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 22:20:45 +00:00
macb: Fix mii_phy_read and mii_phy_write functions
Enabling CONFIG_CMD_MII in AVR32 boards was not possible due to compile errors. This patch fixes miiphy_read and miiphy_write functions and registers them properly. Signed-off-by: Semih Hazar <semih.hazar@indefia.com> Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
This commit is contained in:
parent
5f6b144221
commit
0f751d6ef3
1 changed files with 33 additions and 77 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue