提交 633e7533 编写于 作者: R Rob Herring 提交者: David S. Miller

fec: fix uninitialized rx buffer usage

The fec driver was enabling receive buffer descriptor without allocating
the buffers. Make sure the buffer descriptors are initialized to not
start receiving packets.

Open also calls fec_restart after the rx buffers are allocated. With the code
in fec_restart, it zeroes out the buffer descriptors that have just been
setup.
Signed-off-by: NRob Herring <r.herring@freescale.com>
Signed-off-by: NAmit Kucheria <amit.kucheria@canonical.com>
Acked-by: NGrant Likely <grant.likely@secretlab.ca>
Acked-by: NGreg Ungerer <gerg@uclinux.org>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 67de7924
...@@ -1658,6 +1658,7 @@ static int fec_enet_init(struct net_device *dev, int index) ...@@ -1658,6 +1658,7 @@ static int fec_enet_init(struct net_device *dev, int index)
{ {
struct fec_enet_private *fep = netdev_priv(dev); struct fec_enet_private *fep = netdev_priv(dev);
struct bufdesc *cbd_base; struct bufdesc *cbd_base;
struct bufdesc *bdp;
int i; int i;
/* Allocate memory for buffer descriptors. */ /* Allocate memory for buffer descriptors. */
...@@ -1710,6 +1711,34 @@ static int fec_enet_init(struct net_device *dev, int index) ...@@ -1710,6 +1711,34 @@ static int fec_enet_init(struct net_device *dev, int index)
/* Set MII speed to 2.5 MHz */ /* Set MII speed to 2.5 MHz */
fep->phy_speed = ((((clk_get_rate(fep->clk) / 2 + 4999999) fep->phy_speed = ((((clk_get_rate(fep->clk) / 2 + 4999999)
/ 2500000) / 2) & 0x3F) << 1; / 2500000) / 2) & 0x3F) << 1;
/* Initialize the receive buffer descriptors. */
bdp = fep->rx_bd_base;
for (i = 0; i < RX_RING_SIZE; i++) {
/* Initialize the BD for every fragment in the page. */
bdp->cbd_sc = 0;
bdp++;
}
/* Set the last buffer to wrap */
bdp--;
bdp->cbd_sc |= BD_SC_WRAP;
/* ...and the same for transmit */
bdp = fep->tx_bd_base;
for (i = 0; i < TX_RING_SIZE; i++) {
/* Initialize the BD for every fragment in the page. */
bdp->cbd_sc = 0;
bdp->cbd_bufaddr = 0;
bdp++;
}
/* Set the last buffer to wrap */
bdp--;
bdp->cbd_sc |= BD_SC_WRAP;
fec_restart(dev, 0); fec_restart(dev, 0);
/* Queue up command to detect the PHY and initialize the /* Queue up command to detect the PHY and initialize the
...@@ -1730,7 +1759,6 @@ static void ...@@ -1730,7 +1759,6 @@ static void
fec_restart(struct net_device *dev, int duplex) fec_restart(struct net_device *dev, int duplex)
{ {
struct fec_enet_private *fep = netdev_priv(dev); struct fec_enet_private *fep = netdev_priv(dev);
struct bufdesc *bdp;
int i; int i;
/* Whack a reset. We should wait for this. */ /* Whack a reset. We should wait for this. */
...@@ -1768,33 +1796,6 @@ fec_restart(struct net_device *dev, int duplex) ...@@ -1768,33 +1796,6 @@ fec_restart(struct net_device *dev, int duplex)
} }
} }
/* Initialize the receive buffer descriptors. */
bdp = fep->rx_bd_base;
for (i = 0; i < RX_RING_SIZE; i++) {
/* Initialize the BD for every fragment in the page. */
bdp->cbd_sc = BD_ENET_RX_EMPTY;
bdp++;
}
/* Set the last buffer to wrap */
bdp--;
bdp->cbd_sc |= BD_SC_WRAP;
/* ...and the same for transmit */
bdp = fep->tx_bd_base;
for (i = 0; i < TX_RING_SIZE; i++) {
/* Initialize the BD for every fragment in the page. */
bdp->cbd_sc = 0;
bdp->cbd_bufaddr = 0;
bdp++;
}
/* Set the last buffer to wrap */
bdp--;
bdp->cbd_sc |= BD_SC_WRAP;
/* Enable MII mode */ /* Enable MII mode */
if (duplex) { if (duplex) {
/* MII enable / FD enable */ /* MII enable / FD enable */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册