LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] pch_gbe: Fix the issue that the receiving data is not normal.
@ 2011-01-24  4:43 Toshiharu Okada
  2011-01-25 21:32 ` David Miller
  0 siblings, 1 reply; 6+ messages in thread
From: Toshiharu Okada @ 2011-01-24  4:43 UTC (permalink / raw)
  To: ML netdev; +Cc: LKML, Wang, Qi, Wang, Yong Y, Andrew, Intel OTC, Ewe, Kok Howg

This PCH_GBE driver had an issue that the receiving data is not normal.
This driver had not removed correctly the padding data 
which the DMA include in receiving data. 

This patch fixed this issue.

Signed-off-by: Toshiharu Okada <toshiharu-linux@dsn.okisemi.com>
---
 drivers/net/pch_gbe/pch_gbe_main.c |   21 ++++++++++++---------
 1 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/net/pch_gbe/pch_gbe_main.c b/drivers/net/pch_gbe/pch_gbe_main.c
index 03a1d28..1bf2626 100644
--- a/drivers/net/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/pch_gbe/pch_gbe_main.c
@@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION;
 #define PCH_GBE_SHORT_PKT		64
 #define DSC_INIT16			0xC000
 #define PCH_GBE_DMA_ALIGN		0
+#define PCH_GBE_DMA_PADDING		2
 #define PCH_GBE_WATCHDOG_PERIOD		(1 * HZ)	/* watchdog time */
 #define PCH_GBE_COPYBREAK_DEFAULT	256
 #define PCH_GBE_PCI_BAR			1
@@ -1422,8 +1423,8 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 			pr_err("Receive CRC Error\n");
 		} else {
 			/* get receive length */
-			/* length convert[-3], padding[-2] */
-			length = (rx_desc->rx_words_eob) - 3 - 2;
+			/* length convert[-3] */
+			length = (rx_desc->rx_words_eob) - 3;
 
 			/* Decide the data conversion method */
 			if (!adapter->rx_csum) {
@@ -1443,12 +1444,11 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 			if (skb_copy_flag) {	/* recycle  skb */
 				struct sk_buff *new_skb;
 				new_skb =
-				    netdev_alloc_skb(netdev,
-						     length + NET_IP_ALIGN);
+				    netdev_alloc_skb(netdev, length);
 				if (new_skb) {
 					if (!skb_padding_flag) {
 						skb_reserve(new_skb,
-								NET_IP_ALIGN);
+							PCH_GBE_DMA_PADDING);
 					}
 					memcpy(new_skb->data, skb->data,
 						length);
@@ -1465,12 +1465,15 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 			}
 			if (skb_padding_flag) {
 				memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN);
-				memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
-					ETH_HLEN);
-				skb_reserve(skb, NET_IP_ALIGN);
-
+				memcpy(&skb->data[PCH_GBE_DMA_PADDING],
+				       &tmp_packet[0], ETH_HLEN);
+				skb_reserve(skb, PCH_GBE_DMA_PADDING);
+				/* The length includes padding length */
+				length = length - PCH_GBE_DMA_PADDING;
 			}
 
+			/* The length includes FCS length */
+			length = length - ETH_FCS_LEN;
 			/* update status of driver */
 			adapter->stats.rx_bytes += length;
 			adapter->stats.rx_packets++;
-- 
1.6.2.5

^ permalink raw reply	[flat|nested] 6+ messages in thread
* [PATCH] pch_gbe: Fix the issue that the receiving data is not normal.
@ 2011-02-08  8:24 Toshiharu Okada
  2011-02-09  0:35 ` David Miller
  0 siblings, 1 reply; 6+ messages in thread
From: Toshiharu Okada @ 2011-02-08  8:24 UTC (permalink / raw)
  To: ML netdev, David S. Miller
  Cc: LKML, Wang, Qi, Wang, Yong Y, Andrew, Intel OTC, Ewe, Kok Howg,
	Tomoya Morinaga

Hi Devid

I resubmit this patch modified.
Please check them.

Best regards
Toshiharu Okada(OKI semiconductor)
---

This PCH_GBE driver had an issue that the receiving data is not normal.
This driver had not removed correctly the padding data 
which the DMA include in receiving data. 

This patch fixed this issue.

Signed-off-by: Toshiharu Okada <toshiharu-linux@dsn.okisemi.com>
---
 drivers/net/pch_gbe/pch_gbe_main.c |   77 +++++++++++++++++++++--------------
 1 files changed, 46 insertions(+), 31 deletions(-)

diff --git a/drivers/net/pch_gbe/pch_gbe_main.c b/drivers/net/pch_gbe/pch_gbe_main.c
index 03a1d28..3248313 100644
--- a/drivers/net/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/pch_gbe/pch_gbe_main.c
@@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION;
 #define PCH_GBE_SHORT_PKT		64
 #define DSC_INIT16			0xC000
 #define PCH_GBE_DMA_ALIGN		0
+#define PCH_GBE_DMA_PADDING		2
 #define PCH_GBE_WATCHDOG_PERIOD		(1 * HZ)	/* watchdog time */
 #define PCH_GBE_COPYBREAK_DEFAULT	256
 #define PCH_GBE_PCI_BAR			1
@@ -1373,7 +1374,7 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 	unsigned int i;
 	unsigned int cleaned_count = 0;
 	bool cleaned = false;
-	struct sk_buff *skb;
+	struct sk_buff *skb, *new_skb;
 	u8 dma_status;
 	u16 gbec_status;
 	u32 tcp_ip_status;
@@ -1422,55 +1423,69 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 			pr_err("Receive CRC Error\n");
 		} else {
 			/* get receive length */
-			/* length convert[-3], padding[-2] */
-			length = (rx_desc->rx_words_eob) - 3 - 2;
+			/* length convert[-3] */
+			length = (rx_desc->rx_words_eob) - 3;
 
 			/* Decide the data conversion method */
 			if (!adapter->rx_csum) {
 				/* [Header:14][payload] */
 				skb_padding_flag = 0;
-				skb_copy_flag = 1;
+				if (NET_IP_ALIGN)
+					/* [NET_IP_ALIGN][Header:14][payload] */
+					skb_copy_flag = 1;
+				else
+					skb_copy_flag = 0;
 			} else {
 				/* [Header:14][padding:2][payload] */
 				skb_padding_flag = 1;
+				/* The length includes padding length */
+				length = length - PCH_GBE_DMA_PADDING;
 				if (length < copybreak)
 					skb_copy_flag = 1;
-				else
-					skb_copy_flag = 0;
+				else {
+					/* [Header:14][padding:2][payload]
+					 *   Chenge to the following
+					 * [NET_IP_ALIGN][Header:14][payload] */
+					if (NET_IP_ALIGN == PCH_GBE_DMA_PADDING)
+						skb_copy_flag = 0;
+					else
+						skb_copy_flag = 1;
+				}
 			}
-
 			/* Data conversion */
-			if (skb_copy_flag) {	/* recycle  skb */
-				struct sk_buff *new_skb;
-				new_skb =
-				    netdev_alloc_skb(netdev,
-						     length + NET_IP_ALIGN);
-				if (new_skb) {
-					if (!skb_padding_flag) {
-						skb_reserve(new_skb,
-								NET_IP_ALIGN);
-					}
-					memcpy(new_skb->data, skb->data,
-						length);
-					/* save the skb
-					 * in buffer_info as good */
-					skb = new_skb;
-				} else if (!skb_padding_flag) {
+			if (skb_copy_flag) {
+				new_skb = netdev_alloc_skb(netdev,
+							 length + NET_IP_ALIGN);
+				if (!new_skb) {
 					/* dorrop error */
 					pr_err("New skb allocation Error\n");
 					goto dorrop;
 				}
+				skb_reserve(new_skb, NET_IP_ALIGN);
+				if (skb_padding_flag) {
+					memcpy(new_skb->data, skb->data,
+					       ETH_HLEN);
+					memcpy(&new_skb->data[ETH_HLEN],
+					       &skb->data[ETH_HLEN +
+					       PCH_GBE_DMA_PADDING],
+					       length - ETH_HLEN);
+				} else {
+					memcpy(new_skb->data, skb->data,
+					       length);
+				}
+				skb = new_skb;
 			} else {
+				if (skb_padding_flag) {
+					memcpy(&tmp_packet[0], &skb->data[0],
+					       ETH_HLEN);
+					memcpy(&skb->data[PCH_GBE_DMA_PADDING],
+					       &tmp_packet[0], ETH_HLEN);
+					skb_reserve(skb, PCH_GBE_DMA_PADDING);
+				}
 				buffer_info->skb = NULL;
 			}
-			if (skb_padding_flag) {
-				memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN);
-				memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
-					ETH_HLEN);
-				skb_reserve(skb, NET_IP_ALIGN);
-
-			}
-
+			/* The length includes FCS length */
+			length = length - ETH_FCS_LEN;
 			/* update status of driver */
 			adapter->stats.rx_bytes += length;
 			adapter->stats.rx_packets++;
-- 
1.6.2.5

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-02-09  5:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-24  4:43 [PATCH] pch_gbe: Fix the issue that the receiving data is not normal Toshiharu Okada
2011-01-25 21:32 ` David Miller
2011-01-27  8:45   ` Toshiharu Okada
2011-02-08  8:24 Toshiharu Okada
2011-02-09  0:35 ` David Miller
2011-02-09  4:58   ` Toshiharu Okada

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).