|
|
|
@ -807,7 +807,16 @@ static int fec_recv(struct eth_device *dev) |
|
|
|
|
uint16_t bd_status; |
|
|
|
|
ulong addr, size, end; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_DM_ETH |
|
|
|
|
*packetp = memalign(ARCH_DMA_MINALIGN, FEC_MAX_PKT_SIZE); |
|
|
|
|
if (*packetp == 0) { |
|
|
|
|
printf("%s: error allocating packetp\n", __func__); |
|
|
|
|
return -ENOMEM; |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
ALLOC_CACHE_ALIGN_BUFFER(uchar, buff, FEC_MAX_PKT_SIZE); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* Check if any critical events have happened */ |
|
|
|
|
ievent = readl(&fec->eth->ievent); |
|
|
|
@ -883,8 +892,13 @@ static int fec_recv(struct eth_device *dev) |
|
|
|
|
#ifdef CONFIG_FEC_MXC_SWAP_PACKET |
|
|
|
|
swap_packet((uint32_t *)addr, frame_length); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_DM_ETH |
|
|
|
|
memcpy(*packetp, (char *)addr, frame_length); |
|
|
|
|
#else |
|
|
|
|
memcpy(buff, (char *)addr, frame_length); |
|
|
|
|
net_process_received_packet(buff, frame_length); |
|
|
|
|
#endif |
|
|
|
|
len = frame_length; |
|
|
|
|
} else { |
|
|
|
|
if (bd_status & FEC_RBD_ERR) |
|
|
|
@ -998,18 +1012,9 @@ static void fec_free_descs(struct fec_priv *fec) |
|
|
|
|
free(fec->tbd_base); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_DM_ETH |
|
|
|
|
struct mii_dev *fec_get_miibus(struct udevice *dev, int dev_id) |
|
|
|
|
#else |
|
|
|
|
struct mii_dev *fec_get_miibus(uint32_t base_addr, int dev_id) |
|
|
|
|
#endif |
|
|
|
|
struct mii_dev *fec_get_miibus(ulong base_addr, int dev_id) |
|
|
|
|
{ |
|
|
|
|
#ifdef CONFIG_DM_ETH |
|
|
|
|
struct fec_priv *priv = dev_get_priv(dev); |
|
|
|
|
struct ethernet_regs *eth = priv->eth; |
|
|
|
|
#else |
|
|
|
|
struct ethernet_regs *eth = (struct ethernet_regs *)(ulong)base_addr; |
|
|
|
|
#endif |
|
|
|
|
struct ethernet_regs *eth = (struct ethernet_regs *)base_addr; |
|
|
|
|
struct mii_dev *bus; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
@ -1141,12 +1146,12 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr) |
|
|
|
|
#endif |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_MX28 |
|
|
|
|
#ifdef CONFIG_FEC_MXC_MDIO_BASE |
|
|
|
|
/*
|
|
|
|
|
* The i.MX28 has two ethernet interfaces, but they are not equal. |
|
|
|
|
* Only the first one can access the MDIO bus. |
|
|
|
|
*/ |
|
|
|
|
base_mii = MXS_ENET0_BASE; |
|
|
|
|
base_mii = CONFIG_FEC_MXC_MDIO_BASE; |
|
|
|
|
#else |
|
|
|
|
base_mii = addr; |
|
|
|
|
#endif |
|
|
|
@ -1202,10 +1207,19 @@ static int fecmxc_read_rom_hwaddr(struct udevice *dev) |
|
|
|
|
return fec_get_hwaddr(priv->dev_id, pdata->enetaddr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int fecmxc_free_pkt(struct udevice *dev, uchar *packet, int length) |
|
|
|
|
{ |
|
|
|
|
if (packet) |
|
|
|
|
free(packet); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct eth_ops fecmxc_ops = { |
|
|
|
|
.start = fecmxc_init, |
|
|
|
|
.send = fecmxc_send, |
|
|
|
|
.recv = fecmxc_recv, |
|
|
|
|
.free_pkt = fecmxc_free_pkt, |
|
|
|
|
.stop = fecmxc_halt, |
|
|
|
|
.write_hwaddr = fecmxc_set_hwaddr, |
|
|
|
|
.read_rom_hwaddr = fecmxc_read_rom_hwaddr, |
|
|
|
@ -1237,7 +1251,6 @@ static int fecmxc_probe(struct udevice *dev) |
|
|
|
|
struct eth_pdata *pdata = dev_get_platdata(dev); |
|
|
|
|
struct fec_priv *priv = dev_get_priv(dev); |
|
|
|
|
struct mii_dev *bus = NULL; |
|
|
|
|
int dev_id = -1; |
|
|
|
|
uint32_t start; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
@ -1258,9 +1271,13 @@ static int fecmxc_probe(struct udevice *dev) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fec_reg_setup(priv); |
|
|
|
|
priv->dev_id = (dev_id == -1) ? 0 : dev_id; |
|
|
|
|
|
|
|
|
|
bus = fec_get_miibus(dev, dev_id); |
|
|
|
|
priv->dev_id = dev->seq; |
|
|
|
|
#ifdef CONFIG_FEC_MXC_MDIO_BASE |
|
|
|
|
bus = fec_get_miibus((ulong)CONFIG_FEC_MXC_MDIO_BASE, dev->seq); |
|
|
|
|
#else |
|
|
|
|
bus = fec_get_miibus((ulong)priv->eth, dev->seq); |
|
|
|
|
#endif |
|
|
|
|
if (!bus) { |
|
|
|
|
ret = -ENOMEM; |
|
|
|
|
goto err_mii; |
|
|
|
@ -1275,12 +1292,11 @@ static int fecmxc_probe(struct udevice *dev) |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
err_timeout: |
|
|
|
|
free(priv->phydev); |
|
|
|
|
err_phy: |
|
|
|
|
mdio_unregister(bus); |
|
|
|
|
free(bus); |
|
|
|
|
err_mii: |
|
|
|
|
err_timeout: |
|
|
|
|
fec_free_descs(priv); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
@ -1326,6 +1342,9 @@ static int fecmxc_ofdata_to_platdata(struct udevice *dev) |
|
|
|
|
|
|
|
|
|
static const struct udevice_id fecmxc_ids[] = { |
|
|
|
|
{ .compatible = "fsl,imx6q-fec" }, |
|
|
|
|
{ .compatible = "fsl,imx6sl-fec" }, |
|
|
|
|
{ .compatible = "fsl,imx6sx-fec" }, |
|
|
|
|
{ .compatible = "fsl,imx6ul-fec" }, |
|
|
|
|
{ } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|