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: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
3b90d0afe5
commit
058687597d
|
@ -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)
|
||||||
SUPPORTED_1000baseT_Half |
|
SUPPORTED_1000baseT_Half |
|
||||||
SUPPORTED_1000baseT_Full;
|
SUPPORTED_1000baseT_Full;
|
||||||
|
|
||||||
/* Disable all interrupts */
|
if (!priv->init) {
|
||||||
writel(0xFFFFFFFF, ®s->idr);
|
/* Disable all interrupts */
|
||||||
|
writel(0xFFFFFFFF, ®s->idr);
|
||||||
|
|
||||||
/* Disable the receiver & transmitter */
|
/* Disable the receiver & transmitter */
|
||||||
writel(0, ®s->nwctrl);
|
writel(0, ®s->nwctrl);
|
||||||
writel(0, ®s->txsr);
|
writel(0, ®s->txsr);
|
||||||
writel(0, ®s->rxsr);
|
writel(0, ®s->rxsr);
|
||||||
writel(0, ®s->phymntnc);
|
writel(0, ®s->phymntnc);
|
||||||
|
|
||||||
/* Clear the Hash registers for the mac address pointed by AddressPtr */
|
/* Clear the Hash registers for the mac address
|
||||||
writel(0x0, ®s->hashl);
|
* pointed by AddressPtr
|
||||||
/* Write bits [63:32] in TOP */
|
*/
|
||||||
writel(0x0, ®s->hashh);
|
writel(0x0, ®s->hashl);
|
||||||
|
/* Write bits [63:32] in TOP */
|
||||||
|
writel(0x0, ®s->hashh);
|
||||||
|
|
||||||
/* Clear all counters */
|
/* Clear all counters */
|
||||||
for (i = 0; i <= stat_size; i++)
|
for (i = 0; i <= stat_size; i++)
|
||||||
readl(®s->stat[i]);
|
readl(®s->stat[i]);
|
||||||
|
|
||||||
/* Setup RxBD space */
|
/* Setup RxBD space */
|
||||||
memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd));
|
memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd));
|
||||||
/* Create the RxBD ring */
|
/* Create the RxBD ring */
|
||||||
memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers));
|
memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers));
|
||||||
|
|
||||||
for (i = 0; i < RX_BUF; i++) {
|
for (i = 0; i < RX_BUF; i++) {
|
||||||
priv->rx_bd[i].status = 0xF0000000;
|
priv->rx_bd[i].status = 0xF0000000;
|
||||||
priv->rx_bd[i].addr = (u32)((char *) &(priv->rxbuffers) +
|
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), ®s->rxqbase);
|
writel((u32)&(priv->rx_bd), ®s->rxqbase);
|
||||||
|
|
||||||
/* MAC Setup */
|
/* MAC Setup */
|
||||||
/* Setup Network Configuration register */
|
/* Setup Network Configuration register */
|
||||||
writel(ZYNQ_GEM_NWCFG_INIT, ®s->nwcfg);
|
writel(ZYNQ_GEM_NWCFG_INIT, ®s->nwcfg);
|
||||||
|
|
||||||
/* Setup for DMA Configuration register */
|
/* Setup for DMA Configuration register */
|
||||||
writel(ZYNQ_GEM_DMACR_INIT, ®s->dmacr);
|
writel(ZYNQ_GEM_DMACR_INIT, ®s->dmacr);
|
||||||
|
|
||||||
/* Setup for Network Control register, MDIO, Rx and Tx enable */
|
/* Setup for Network Control register, MDIO, Rx and Tx enable */
|
||||||
setbits_le32(®s->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK |
|
setbits_le32(®s->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)
|
||||||
writel((u32)&(priv->tx_bd), ®s->txqbase);
|
writel((u32)&(priv->tx_bd), ®s->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;
|
||||||
|
|
Loading…
Reference in New Issue