Skip to content
Snippets Groups Projects
Commit 05868759 authored by Michal Simek's avatar Michal Simek
Browse files

net: gem: Do not initialize BDs again


BDs can be correctly setup just once and init function
performs only phy autodetection and enabling RX/TX.
RX/TX are disabled in halt function.

This patch solves the problem with repeatable tftp transfers.

Signed-off-by: default avatarMichal Simek <michal.simek@xilinx.com>
Reviewed-by: default avatarTom Rini <trini@ti.com>
parent 3b90d0af
No related branches found
No related tags found
No related merge requests found
...@@ -134,6 +134,7 @@ struct zynq_gem_priv { ...@@ -134,6 +134,7 @@ struct zynq_gem_priv {
u32 rxbd_current; u32 rxbd_current;
u32 rx_first_buf; u32 rx_first_buf;
int phyaddr; int phyaddr;
int init;
struct phy_device *phydev; struct phy_device *phydev;
struct mii_dev *bus; struct mii_dev *bus;
}; };
...@@ -239,50 +240,57 @@ static int zynq_gem_init(struct eth_device *dev, bd_t * bis) ...@@ -239,50 +240,57 @@ static int zynq_gem_init(struct eth_device *dev, bd_t * bis)
SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full; SUPPORTED_1000baseT_Full;
/* Disable all interrupts */ if (!priv->init) {
writel(0xFFFFFFFF, &regs->idr); /* Disable all interrupts */
writel(0xFFFFFFFF, &regs->idr);
/* Disable the receiver & transmitter */
writel(0, &regs->nwctrl); /* Disable the receiver & transmitter */
writel(0, &regs->txsr); writel(0, &regs->nwctrl);
writel(0, &regs->rxsr); writel(0, &regs->txsr);
writel(0, &regs->phymntnc); writel(0, &regs->rxsr);
writel(0, &regs->phymntnc);
/* Clear the Hash registers for the mac address pointed by AddressPtr */
writel(0x0, &regs->hashl); /* Clear the Hash registers for the mac address
/* Write bits [63:32] in TOP */ * pointed by AddressPtr
writel(0x0, &regs->hashh); */
writel(0x0, &regs->hashl);
/* Clear all counters */ /* Write bits [63:32] in TOP */
for (i = 0; i <= stat_size; i++) writel(0x0, &regs->hashh);
readl(&regs->stat[i]);
/* Clear all counters */
/* Setup RxBD space */ for (i = 0; i <= stat_size; i++)
memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd)); readl(&regs->stat[i]);
/* Create the RxBD ring */
memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers)); /* Setup RxBD space */
memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd));
for (i = 0; i < RX_BUF; i++) { /* Create the RxBD ring */
priv->rx_bd[i].status = 0xF0000000; memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers));
priv->rx_bd[i].addr = (u32)((char *) &(priv->rxbuffers) +
for (i = 0; i < RX_BUF; i++) {
priv->rx_bd[i].status = 0xF0000000;
priv->rx_bd[i].addr =
(u32)((char *)&(priv->rxbuffers) +
(i * PKTSIZE_ALIGN)); (i * PKTSIZE_ALIGN));
} }
/* WRAP bit to last BD */ /* WRAP bit to last BD */
priv->rx_bd[--i].addr |= ZYNQ_GEM_RXBUF_WRAP_MASK; priv->rx_bd[--i].addr |= ZYNQ_GEM_RXBUF_WRAP_MASK;
/* Write RxBDs to IP */ /* Write RxBDs to IP */
writel((u32) &(priv->rx_bd), &regs->rxqbase); writel((u32)&(priv->rx_bd), &regs->rxqbase);
/* MAC Setup */ /* MAC Setup */
/* Setup Network Configuration register */ /* Setup Network Configuration register */
writel(ZYNQ_GEM_NWCFG_INIT, &regs->nwcfg); writel(ZYNQ_GEM_NWCFG_INIT, &regs->nwcfg);
/* Setup for DMA Configuration register */ /* Setup for DMA Configuration register */
writel(ZYNQ_GEM_DMACR_INIT, &regs->dmacr); writel(ZYNQ_GEM_DMACR_INIT, &regs->dmacr);
/* Setup for Network Control register, MDIO, Rx and Tx enable */ /* Setup for Network Control register, MDIO, Rx and Tx enable */
setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK | setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK |
ZYNQ_GEM_NWCTRL_RXEN_MASK | ZYNQ_GEM_NWCTRL_TXEN_MASK); ZYNQ_GEM_NWCTRL_RXEN_MASK | ZYNQ_GEM_NWCTRL_TXEN_MASK);
priv->init++;
}
/* interface - look at tsec */ /* interface - look at tsec */
phydev = phy_connect(priv->bus, priv->phyaddr, dev, 0); phydev = phy_connect(priv->bus, priv->phyaddr, dev, 0);
...@@ -307,7 +315,7 @@ static int zynq_gem_send(struct eth_device *dev, void *ptr, int len) ...@@ -307,7 +315,7 @@ static int zynq_gem_send(struct eth_device *dev, void *ptr, int len)
writel((u32)&(priv->tx_bd), &regs->txqbase); writel((u32)&(priv->tx_bd), &regs->txqbase);
/* Setup Tx BD */ /* Setup Tx BD */
memset((void *) &(priv->tx_bd), 0, sizeof(struct emac_bd)); memset((void *)&(priv->tx_bd), 0, sizeof(struct emac_bd));
priv->tx_bd.addr = (u32)ptr; priv->tx_bd.addr = (u32)ptr;
priv->tx_bd.status = len | ZYNQ_GEM_TXBUF_LAST_MASK; priv->tx_bd.status = len | ZYNQ_GEM_TXBUF_LAST_MASK;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment