ramips: Don't trigger BUG_ON due to skb allocation failure
authorGabor Juhos <juhosg@openwrt.org>
Wed, 24 Nov 2010 10:01:12 +0000 (10:01 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Wed, 24 Nov 2010 10:01:12 +0000 (10:01 +0000)
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

target/linux/ramips/files/drivers/net/ramips.c

index e297cbec758516b8f8f97d179cd7a297eb369bfe..e3c4f13d46a98a69d2c55cf62530b32781a50b83 100644 (file)
@@ -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);