Skip to content

Commit

Permalink
fec: fix uninitialized rx buffer usage
Browse files Browse the repository at this point in the history
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: Rob Herring <r.herring@freescale.com>
Signed-off-by: Amit Kucheria <amit.kucheria@canonical.com>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Rob Herring authored and David S. Miller committed Feb 10, 2010
1 parent 67de792 commit 633e753
Showing 1 changed file with 29 additions and 28 deletions.
57 changes: 29 additions & 28 deletions drivers/net/fec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1658,6 +1658,7 @@ static int fec_enet_init(struct net_device *dev, int index)
{
struct fec_enet_private *fep = netdev_priv(dev);
struct bufdesc *cbd_base;
struct bufdesc *bdp;
int i;

/* Allocate memory for buffer descriptors. */
Expand Down Expand Up @@ -1710,6 +1711,34 @@ static int fec_enet_init(struct net_device *dev, int index)
/* Set MII speed to 2.5 MHz */
fep->phy_speed = ((((clk_get_rate(fep->clk) / 2 + 4999999)
/ 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);

/* Queue up command to detect the PHY and initialize the
Expand All @@ -1730,7 +1759,6 @@ static void
fec_restart(struct net_device *dev, int duplex)
{
struct fec_enet_private *fep = netdev_priv(dev);
struct bufdesc *bdp;
int i;

/* Whack a reset. We should wait for this. */
Expand Down Expand Up @@ -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 */
if (duplex) {
/* MII enable / FD enable */
Expand Down

0 comments on commit 633e753

Please sign in to comment.