]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/mv643xx_eth.c
net: ehea NAPI interface cleanup fix
[linux-2.6-omap-h63xx.git] / drivers / net / mv643xx_eth.c
index 9f3ee7d6a5bcaeb737a8380dee14a41f895115ac..7253a499d9c86f3ec9832c3b0190fff6d0c0e24d 100644 (file)
@@ -543,35 +543,38 @@ static int rxq_process(struct rx_queue *rxq, int budget)
                 * on, or the error summary bit is set, the packet needs
                 * to be dropped.
                 */
-               if (((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
-                                       (RX_FIRST_DESC | RX_LAST_DESC))
-                               || (cmd_sts & ERROR_SUMMARY)) {
-                       stats->rx_dropped++;
-
-                       if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
-                               (RX_FIRST_DESC | RX_LAST_DESC)) {
-                               if (net_ratelimit())
-                                       dev_printk(KERN_ERR, &mp->dev->dev,
-                                                  "received packet spanning "
-                                                  "multiple descriptors\n");
-                       }
+               if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC | ERROR_SUMMARY))
+                       != (RX_FIRST_DESC | RX_LAST_DESC))
+                       goto err;
 
-                       if (cmd_sts & ERROR_SUMMARY)
-                               stats->rx_errors++;
+               /*
+                * The -4 is for the CRC in the trailer of the
+                * received packet
+                */
+               skb_put(skb, byte_cnt - 2 - 4);
 
-                       dev_kfree_skb(skb);
-               } else {
-                       /*
-                        * The -4 is for the CRC in the trailer of the
-                        * received packet
-                        */
-                       skb_put(skb, byte_cnt - 2 - 4);
-
-                       if (cmd_sts & LAYER_4_CHECKSUM_OK)
-                               skb->ip_summed = CHECKSUM_UNNECESSARY;
-                       skb->protocol = eth_type_trans(skb, mp->dev);
-                       netif_receive_skb(skb);
+               if (cmd_sts & LAYER_4_CHECKSUM_OK)
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
+               skb->protocol = eth_type_trans(skb, mp->dev);
+               netif_receive_skb(skb);
+
+               continue;
+
+err:
+               stats->rx_dropped++;
+
+               if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
+                       (RX_FIRST_DESC | RX_LAST_DESC)) {
+                       if (net_ratelimit())
+                               dev_printk(KERN_ERR, &mp->dev->dev,
+                                          "received packet spanning "
+                                          "multiple descriptors\n");
                }
+
+               if (cmd_sts & ERROR_SUMMARY)
+                       stats->rx_errors++;
+
+               dev_kfree_skb(skb);
        }
 
        if (rx < budget)
@@ -590,6 +593,7 @@ static int rxq_refill(struct rx_queue *rxq, int budget)
                struct sk_buff *skb;
                int unaligned;
                int rx;
+               struct rx_desc *rx_desc;
 
                skb = __skb_dequeue(&mp->rx_recycle);
                if (skb == NULL)
@@ -612,13 +616,14 @@ static int rxq_refill(struct rx_queue *rxq, int budget)
                if (rxq->rx_used_desc == rxq->rx_ring_size)
                        rxq->rx_used_desc = 0;
 
-               rxq->rx_desc_area[rx].buf_ptr = dma_map_single(NULL, skb->data,
-                                               mp->skb_size, DMA_FROM_DEVICE);
-               rxq->rx_desc_area[rx].buf_size = mp->skb_size;
+               rx_desc = rxq->rx_desc_area + rx;
+
+               rx_desc->buf_ptr = dma_map_single(NULL, skb->data,
+                                       mp->skb_size, DMA_FROM_DEVICE);
+               rx_desc->buf_size = mp->skb_size;
                rxq->rx_skb[rx] = skb;
                wmb();
-               rxq->rx_desc_area[rx].cmd_sts = BUFFER_OWNED_BY_DMA |
-                                               RX_ENABLE_INTERRUPT;
+               rx_desc->cmd_sts = BUFFER_OWNED_BY_DMA | RX_ENABLE_INTERRUPT;
                wmb();
 
                /*
@@ -901,7 +906,8 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
                if (skb != NULL) {
                        if (skb_queue_len(&mp->rx_recycle) <
                                        mp->default_rx_ring_size &&
-                           skb_recycle_check(skb, mp->skb_size))
+                           skb_recycle_check(skb, mp->skb_size +
+                                       dma_get_cache_alignment() - 1))
                                __skb_queue_head(&mp->rx_recycle, skb);
                        else
                                dev_kfree_skb(skb);
@@ -2473,8 +2479,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev)
        struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
 
        if (pd == NULL || pd->shared_smi == NULL) {
-               mdiobus_free(msp->smi_bus);
                mdiobus_unregister(msp->smi_bus);
+               mdiobus_free(msp->smi_bus);
        }
        if (msp->err_interrupt != NO_IRQ)
                free_irq(msp->err_interrupt, msp);