|
|
@@ -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);
|