diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2010-11-24 10:01:12 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2010-11-24 10:01:12 +0000 |
commit | f833e399f212a432d03750caa2f666db97b96624 (patch) | |
tree | 358b27e715e58320f005b7546690ce9863f50ef4 /target/linux | |
parent | c6e41248559f16cf8ab1115305b8ef5f41a8af81 (diff) | |
download | upstream-f833e399f212a432d03750caa2f666db97b96624.tar.gz upstream-f833e399f212a432d03750caa2f666db97b96624.tar.bz2 upstream-f833e399f212a432d03750caa2f666db97b96624.zip |
ramips: Don't trigger BUG_ON due to skb allocation failure
Instead just drop the rx'ed frame silently and reuse the already
available buffer.
Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
SVN-Revision: 24122
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/ramips/files/drivers/net/ramips.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/target/linux/ramips/files/drivers/net/ramips.c b/target/linux/ramips/files/drivers/net/ramips.c index e297cbec75..e3c4f13d46 100644 --- a/target/linux/ramips/files/drivers/net/ramips.c +++ b/target/linux/ramips/files/drivers/net/ramips.c @@ -272,23 +272,26 @@ ramips_eth_rx_hw(unsigned long ptr) break; max_rx--; - rx_skb = priv->rx_skb[rx]; - skb_put(rx_skb, RX_DMA_PLEN0(priv->rx[rx].rxd2)); - rx_skb->dev = dev; - rx_skb->protocol = eth_type_trans(rx_skb, dev); - rx_skb->ip_summed = CHECKSUM_NONE; - dev->stats.rx_packets++; - dev->stats.rx_bytes += rx_skb->len; - netif_rx(rx_skb); - new_skb = netdev_alloc_skb(dev, MAX_RX_LENGTH + 2); - priv->rx_skb[rx] = new_skb; - BUG_ON(!new_skb); - skb_reserve(new_skb, 2); - priv->rx[rx].rxd1 = dma_map_single(NULL, - new_skb->data, - MAX_RX_LENGTH + 2, - DMA_FROM_DEVICE); + /* Reuse the buffer on allocation failures */ + if (new_skb) { + rx_skb = priv->rx_skb[rx]; + skb_put(rx_skb, RX_DMA_PLEN0(priv->rx[rx].rxd2)); + rx_skb->dev = dev; + rx_skb->protocol = eth_type_trans(rx_skb, dev); + rx_skb->ip_summed = CHECKSUM_NONE; + dev->stats.rx_packets++; + dev->stats.rx_bytes += rx_skb->len; + netif_rx(rx_skb); + + priv->rx_skb[rx] = new_skb; + skb_reserve(new_skb, 2); + priv->rx[rx].rxd1 = dma_map_single(NULL, + new_skb->data, + MAX_RX_LENGTH + 2, + DMA_FROM_DEVICE); + } + priv->rx[rx].rxd2 &= ~RX_DMA_DONE; wmb(); ramips_fe_wr(rx, RAMIPS_RX_CALC_IDX0); |