From patchwork Sat Jul 9 17:17:53 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?TWljaGHFgiBNaXJvc8WCYXc=?= X-Patchwork-Id: 103995 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id BB0511007D1 for ; Sun, 10 Jul 2011 03:18:11 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754489Ab1GIRSJ (ORCPT ); Sat, 9 Jul 2011 13:18:09 -0400 Received: from rere.qmqm.pl ([89.167.52.164]:51946 "EHLO rere.qmqm.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754262Ab1GIRR4 (ORCPT ); Sat, 9 Jul 2011 13:17:56 -0400 Received: by rere.qmqm.pl (Postfix, from userid 1000) id CA41C13A83; Sat, 9 Jul 2011 19:17:53 +0200 (CEST) Message-Id: <14a1560aa41b0a21d9c20fdcdde79fff93114f30.1310229312.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= Subject: [PATCH 16/21] net: tulip/interrupt.c: use common rx_copybreak handling MIME-Version: 1.0 To: netdev@vger.kernel.org Cc: Grant Grundler Date: Sat, 9 Jul 2011 19:17:53 +0200 (CEST) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Note: The driver has NAPI and non-NAPI versions that look the same. Signed-off-by: Michał Mirosław --- drivers/net/tulip/interrupt.c | 77 ++++++++-------------------------------- 1 files changed, 16 insertions(+), 61 deletions(-) diff --git a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c index 5350d75..990f2a7 100644 --- a/drivers/net/tulip/interrupt.c +++ b/drivers/net/tulip/interrupt.c @@ -200,32 +200,14 @@ int tulip_poll(struct napi_struct *napi, int budget) dev->stats.rx_fifo_errors++; } } else { - struct sk_buff *skb; - - /* Check if the packet is long enough to accept without copying - to a minimally-sized skbuff. */ - if (pkt_len < tulip_rx_copybreak && - (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { - skb_reserve(skb, 2); /* 16 byte align the IP header */ - pci_dma_sync_single_for_cpu(tp->pdev, - tp->rx_buffers[entry].mapping, - pkt_len, PCI_DMA_FROMDEVICE); -#if ! defined(__alpha__) - skb_copy_to_linear_data(skb, tp->rx_buffers[entry].skb->data, - pkt_len); - skb_put(skb, pkt_len); -#else - memcpy(skb_put(skb, pkt_len), - tp->rx_buffers[entry].skb->data, - pkt_len); -#endif - pci_dma_sync_single_for_device(tp->pdev, - tp->rx_buffers[entry].mapping, - pkt_len, PCI_DMA_FROMDEVICE); - } else { /* Pass up the skb already on the Rx ring. */ - char *temp = skb_put(skb = tp->rx_buffers[entry].skb, - pkt_len); + struct sk_buff *skb = dev_skb_finish_rx_dma( + &tp->rx_buffers[entry].skb, + pkt_len, tulip_rx_copybreak, + &tp->pdev->dev, + tp->rx_buffers[entry].mapping, + PKT_BUF_SZ); + if (!tp->rx_buffers[entry].skb) { #ifndef final_version if (tp->rx_buffers[entry].mapping != le32_to_cpu(tp->rx_ring[entry].buffer1)) { @@ -233,14 +215,9 @@ int tulip_poll(struct napi_struct *napi, int budget) "Internal fault: The skbuff addresses do not match in tulip_rx: %08x vs. %08llx %p / %p\n", le32_to_cpu(tp->rx_ring[entry].buffer1), (unsigned long long)tp->rx_buffers[entry].mapping, - skb->head, temp); + skb->head, skb->data); } #endif - - pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); - - tp->rx_buffers[entry].skb = NULL; tp->rx_buffers[entry].mapping = 0; } skb->protocol = eth_type_trans(skb, dev); @@ -426,32 +403,14 @@ static int tulip_rx(struct net_device *dev) dev->stats.rx_fifo_errors++; } } else { - struct sk_buff *skb; - - /* Check if the packet is long enough to accept without copying - to a minimally-sized skbuff. */ - if (pkt_len < tulip_rx_copybreak && - (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { - skb_reserve(skb, 2); /* 16 byte align the IP header */ - pci_dma_sync_single_for_cpu(tp->pdev, - tp->rx_buffers[entry].mapping, - pkt_len, PCI_DMA_FROMDEVICE); -#if ! defined(__alpha__) - skb_copy_to_linear_data(skb, tp->rx_buffers[entry].skb->data, - pkt_len); - skb_put(skb, pkt_len); -#else - memcpy(skb_put(skb, pkt_len), - tp->rx_buffers[entry].skb->data, - pkt_len); -#endif - pci_dma_sync_single_for_device(tp->pdev, - tp->rx_buffers[entry].mapping, - pkt_len, PCI_DMA_FROMDEVICE); - } else { /* Pass up the skb already on the Rx ring. */ - char *temp = skb_put(skb = tp->rx_buffers[entry].skb, - pkt_len); + struct sk_buff *skb = dev_skb_finish_rx_dma( + &tp->rx_buffers[entry].skb, + pkt_len, tulip_rx_copybreak, + &tp->pdev->dev, + tp->rx_buffers[entry].mapping, + PKT_BUF_SZ); + if (!tp->rx_buffers[entry].skb) { #ifndef final_version if (tp->rx_buffers[entry].mapping != le32_to_cpu(tp->rx_ring[entry].buffer1)) { @@ -459,14 +418,10 @@ static int tulip_rx(struct net_device *dev) "Internal fault: The skbuff addresses do not match in tulip_rx: %08x vs. %Lx %p / %p\n", le32_to_cpu(tp->rx_ring[entry].buffer1), (long long)tp->rx_buffers[entry].mapping, - skb->head, temp); + skb->head, skb->data); } #endif - pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); - - tp->rx_buffers[entry].skb = NULL; tp->rx_buffers[entry].mapping = 0; } skb->protocol = eth_type_trans(skb, dev);