All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Fleming <afleming@freescale.com>
To: jeff@garzik.org
Cc: galak@kernel.crashing.org, netdev@vger.kernel.org,
	Haruki Dai <Dai.Haruki@freescale.com>,
	Dai Haruki <dai.haruki@freescale.com>,
	Andy Fleming <afleming@freescale.com>
Subject: [PATCH v2.6.29 07/14] gianfar: Enable padding and Optimize the frame prepended bytes handling
Date: Tue, 16 Dec 2008 17:21:00 -0600	[thread overview]
Message-ID: <1229469667-25002-8-git-send-email-afleming@freescale.com> (raw)
In-Reply-To: <1229469667-25002-7-git-send-email-afleming@freescale.com>

From: Haruki Dai <Dai.Haruki@freescale.com>

The eTSEC can prepend up to 32 bytes to a received frame, usually for the
purpose of aligning the IP address to a word boundary, so this turns it on.

While we're in there, make the handling of the pre-frame bytes (padding and
Frame Control Block) cleaner.

Signed-off-by: Dai Haruki <dai.haruki@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
---
 drivers/net/gianfar.c |   87 +++++++++++++++++++++++--------------------------
 1 files changed, 41 insertions(+), 46 deletions(-)

diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
index c40ba18..21d7acf 100644
--- a/drivers/net/gianfar.c
+++ b/drivers/net/gianfar.c
@@ -131,7 +131,8 @@ static void gfar_netpoll(struct net_device *dev);
 #endif
 int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit);
 static int gfar_clean_tx_ring(struct net_device *dev);
-static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int length);
+static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
+			      int amount_pull);
 static void gfar_vlan_rx_register(struct net_device *netdev,
 		                struct vlan_group *grp);
 void gfar_halt(struct net_device *dev);
@@ -210,6 +211,7 @@ static int gfar_of_init(struct net_device *dev)
 			FSL_GIANFAR_DEV_HAS_COALESCE |
 			FSL_GIANFAR_DEV_HAS_RMON |
 			FSL_GIANFAR_DEV_HAS_MULTI_INTR |
+			FSL_GIANFAR_DEV_HAS_PADDING |
 			FSL_GIANFAR_DEV_HAS_CSUM |
 			FSL_GIANFAR_DEV_HAS_VLAN |
 			FSL_GIANFAR_DEV_HAS_MAGIC_PACKET |
@@ -1664,59 +1666,38 @@ static inline void gfar_rx_checksum(struct sk_buff *skb, struct rxfcb *fcb)
 }
 
 
-static inline struct rxfcb *gfar_get_fcb(struct sk_buff *skb)
-{
-	struct rxfcb *fcb = (struct rxfcb *)skb->data;
-
-	/* Remove the FCB from the skb */
-	skb_pull(skb, GMAC_FCB_LEN);
-
-	return fcb;
-}
-
 /* gfar_process_frame() -- handle one incoming packet if skb
  * isn't NULL.  */
 static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
-		int length)
+			      int amount_pull)
 {
 	struct gfar_private *priv = netdev_priv(dev);
 	struct rxfcb *fcb = NULL;
 
-	if (NULL == skb) {
-		if (netif_msg_rx_err(priv))
-			printk(KERN_WARNING "%s: Missing skb!!.\n", dev->name);
-		dev->stats.rx_dropped++;
-		priv->extra_stats.rx_skbmissing++;
-	} else {
-		int ret;
+	int ret;
 
-		/* Prep the skb for the packet */
-		skb_put(skb, length);
+	/* fcb is at the beginning if exists */
+	fcb = (struct rxfcb *)skb->data;
 
-		/* Grab the FCB if there is one */
-		if (gfar_uses_fcb(priv))
-			fcb = gfar_get_fcb(skb);
-
-		/* Remove the padded bytes, if there are any */
-		if (priv->padding)
-			skb_pull(skb, priv->padding);
+	/* Remove the FCB from the skb */
+	/* Remove the padded bytes, if there are any */
+	if (amount_pull)
+		skb_pull(skb, amount_pull);
 
-		if (priv->rx_csum_enable)
-			gfar_rx_checksum(skb, fcb);
+	if (priv->rx_csum_enable)
+		gfar_rx_checksum(skb, fcb);
 
-		/* Tell the skb what kind of packet this is */
-		skb->protocol = eth_type_trans(skb, dev);
+	/* Tell the skb what kind of packet this is */
+	skb->protocol = eth_type_trans(skb, dev);
 
-		/* Send the packet up the stack */
-		if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN))) {
-			ret = vlan_hwaccel_receive_skb(skb, priv->vlgrp,
-						       fcb->vlctl);
-		} else
-			ret = netif_receive_skb(skb);
+	/* Send the packet up the stack */
+	if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN)))
+		ret = vlan_hwaccel_receive_skb(skb, priv->vlgrp, fcb->vlctl);
+	else
+		ret = netif_receive_skb(skb);
 
-		if (NET_RX_DROP == ret)
-			priv->extra_stats.kernel_dropped++;
-	}
+	if (NET_RX_DROP == ret)
+		priv->extra_stats.kernel_dropped++;
 
 	return 0;
 }
@@ -1729,13 +1710,17 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
 {
 	struct rxbd8 *bdp;
 	struct sk_buff *skb;
-	u16 pkt_len;
+	int pkt_len;
+	int amount_pull;
 	int howmany = 0;
 	struct gfar_private *priv = netdev_priv(dev);
 
 	/* Get the first full descriptor */
 	bdp = priv->cur_rx;
 
+	amount_pull = (gfar_uses_fcb(priv) ? GMAC_FCB_LEN : 0) +
+		priv->padding;
+
 	while (!((bdp->status & RXBD_EMPTY) || (--rx_work_limit < 0))) {
 		struct sk_buff *newskb;
 		rmb();
@@ -1765,12 +1750,22 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
 			dev->stats.rx_packets++;
 			howmany++;
 
-			/* Remove the FCS from the packet length */
-			pkt_len = bdp->length - 4;
+			if (likely(skb)) {
+				pkt_len = bdp->length - ETH_FCS_LEN;
+				/* Remove the FCS from the packet length */
+				skb_put(skb, pkt_len);
+				dev->stats.rx_bytes += pkt_len;
+
+				gfar_process_frame(dev, skb, amount_pull);
 
-			gfar_process_frame(dev, skb, pkt_len);
+			} else {
+				if (netif_msg_rx_err(priv))
+					printk(KERN_WARNING
+					       "%s: Missing skb!\n", dev->name);
+				dev->stats.rx_dropped++;
+				priv->extra_stats.rx_skbmissing++;
+			}
 
-			dev->stats.rx_bytes += pkt_len;
 		}
 
 		priv->rx_skbuff[priv->skb_currx] = newskb;
-- 
1.5.4.GIT


  reply	other threads:[~2008-12-16 23:21 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-16 23:20 [PATCH 0/14] gianfar improvements Andy Fleming
2008-12-16 23:20 ` [PATCH v2.6.29 01/14] gianfar: Use gfar_halt to stop DMA in gfar_probe Andy Fleming
2008-12-16 23:20   ` [PATCH v2.6.29 02/14] gianfar: Fix skb allocation error Andy Fleming
2008-12-16 23:20     ` [PATCH v2.6.29 03/14] gianfar: Convert gianfar to an of_platform_driver Andy Fleming
2008-12-16 23:20       ` [PATCH v2.6.29 04/14] gianfar: Optimize interrupt coalescing configuration Andy Fleming
2008-12-16 23:20         ` [PATCH v2.6.29 05/14] gianfar: Fix eTSEC configuration procedure Andy Fleming
2008-12-16 23:20           ` [PATCH v2.6.29 06/14] gianfar: Fix VLAN HW feature related frame/buffer size calculation Andy Fleming
2008-12-16 23:21             ` Andy Fleming [this message]
2008-12-16 23:21               ` [PATCH v2.6.29 08/14] gianfar: Remove unused gfar_add_fcb() function parameter Andy Fleming
2008-12-16 23:21                 ` [PATCH v2.6.29 09/14] gianfar: Add macros for stepping through BDs Andy Fleming
2008-12-16 23:21                   ` [PATCH v2.6.29 10/14] gianfar: Make all BD status writes 32-bit Andy Fleming
2008-12-16 23:21                     ` [PATCH v2.6.29 11/14] gianfar: Add Scatter Gather support Andy Fleming
2008-12-16 23:21                       ` [PATCH v2.6.29 12/14] gianfar: Use interface name in interrupt name to distinguish the source Andy Fleming
2008-12-16 23:21                         ` [PATCH v2.6.29 13/14] gianfar: Merge Tx and Rx interrupt for scheduling clean up ring Andy Fleming
2008-12-16 23:21                           ` [PATCH v2.6.29 14/14] gianfar: Continue polling until both tx and rx are empty Andy Fleming
2008-12-16 23:36                       ` [PATCH v2.6.29 11/14] gianfar: Add Scatter Gather support David Miller
2008-12-16 23:35                     ` [PATCH v2.6.29 10/14] gianfar: Make all BD status writes 32-bit David Miller
2008-12-16 23:33                   ` [PATCH v2.6.29 09/14] gianfar: Add macros for stepping through BDs David Miller
2008-12-16 23:33                 ` [PATCH v2.6.29 08/14] gianfar: Remove unused gfar_add_fcb() function parameter David Miller
2008-12-16 23:31               ` [PATCH v2.6.29 07/14] gianfar: Enable padding and Optimize the frame prepended bytes handling David Miller
2008-12-16 23:30             ` [PATCH v2.6.29 06/14] gianfar: Fix VLAN HW feature related frame/buffer size calculation David Miller
2008-12-16 23:30           ` [PATCH v2.6.29 05/14] gianfar: Fix eTSEC configuration procedure David Miller
2008-12-16 23:30         ` [PATCH v2.6.29 04/14] gianfar: Optimize interrupt coalescing configuration David Miller
2008-12-16 23:29       ` [PATCH v2.6.29 03/14] gianfar: Convert gianfar to an of_platform_driver David Miller
2008-12-16 23:28     ` [PATCH v2.6.29 02/14] gianfar: Fix skb allocation error David Miller
2008-12-16 23:25   ` [PATCH v2.6.29 01/14] gianfar: Use gfar_halt to stop DMA in gfar_probe David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1229469667-25002-8-git-send-email-afleming@freescale.com \
    --to=afleming@freescale.com \
    --cc=Dai.Haruki@freescale.com \
    --cc=galak@kernel.crashing.org \
    --cc=jeff@garzik.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.