All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/10] netvsc bug fixes and cleanups
@ 2011-09-01 19:19 Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 01/10] staging: hv: remove unnecessary includes in netvsc Haiyang Zhang
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Fixed a set of bugs in netvsc module, and cleaned up some coding style issues.

Haiyang Zhang (10):
  staging: hv: remove unnecessary includes in netvsc
  staging: hv: add newline to log messages in netvsc
  staging: hv: convert dev_<loglevel> to netdev_<loglevel> in netvsc
  staging: hv: fix a kernel warning in netvsc_linkstatus_callback()
  staging: hv: re-order the code in netvsc_probe()
  staging: hv: fix counting of #outstanding-sends in failed sends
  staging: hv: fix counting of available buffer slots when send fails
  staging: hv: fix the return status of netvsc_start_xmit()
  staging: hv: fix the page buffer when rndis data go across page
    boundary
  staging: hv: fix some typos in netvsc.c

 drivers/staging/hv/netvsc.c       |  124 ++++++++++++++++++++-----------------
 drivers/staging/hv/netvsc_drv.c   |   44 +++++++------
 drivers/staging/hv/rndis_filter.c |   28 ++++++---
 3 files changed, 110 insertions(+), 86 deletions(-)


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

* [PATCH 01/10] staging: hv: remove unnecessary includes in netvsc
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 02/10] staging: hv: add newline to log messages " Haiyang Zhang
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

hyperv.h is included by hyperv_net.h already, so no need to include it
again in these C files.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc.c       |    1 -
 drivers/staging/hv/netvsc_drv.c   |    1 -
 drivers/staging/hv/rndis_filter.c |    1 -
 3 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index 30d3139..9a9228c 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -28,7 +28,6 @@
 #include <linux/io.h>
 #include <linux/slab.h>
 
-#include "hyperv.h"
 #include "hyperv_net.h"
 
 
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index 90a3198..30a0cb2 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -38,7 +38,6 @@
 #include <net/sock.h>
 #include <net/pkt_sched.h>
 
-#include "hyperv.h"
 #include "hyperv_net.h"
 
 struct net_device_context {
diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c
index 6db48b9..8416bf2 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -27,7 +27,6 @@
 #include <linux/if_ether.h>
 #include <linux/netdevice.h>
 
-#include "hyperv.h"
 #include "hyperv_net.h"
 
 
-- 
1.6.3.2


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

* [PATCH 02/10] staging: hv: add newline to log messages in netvsc
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 01/10] staging: hv: remove unnecessary includes in netvsc Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 03/10] staging: hv: convert dev_<loglevel> to netdev_<loglevel> " Haiyang Zhang
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc.c |   58 +++++++++++++++++++++---------------------
 1 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index 9a9228c..ef764e6 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -108,7 +108,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
 		 */
 		if (ret != 0) {
 			dev_err(&net_device->dev->device, "unable to send "
-				"revoke receive buffer to netvsp");
+				"revoke receive buffer to netvsp\n");
 			return ret;
 		}
 	}
@@ -123,7 +123,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
 		 */
 		if (ret != 0) {
 			dev_err(&net_device->dev->device,
-				   "unable to teardown receive buffer's gpadl");
+				   "unable to teardown receive buffer's gpadl\n");
 			return ret;
 		}
 		net_device->recv_buf_gpadl_handle = 0;
@@ -155,7 +155,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 	net_device = get_outbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "unable to get net device..."
-			   "device being destroyed?");
+			   "device being destroyed?\n");
 		return -ENODEV;
 	}
 
@@ -164,7 +164,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 				get_order(net_device->recv_buf_size));
 	if (!net_device->recv_buf) {
 		dev_err(&device->device, "unable to allocate receive "
-			"buffer of size %d", net_device->recv_buf_size);
+			"buffer of size %d\n", net_device->recv_buf_size);
 		ret = -ENOMEM;
 		goto cleanup;
 	}
@@ -179,7 +179,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 				    &net_device->recv_buf_gpadl_handle);
 	if (ret != 0) {
 		dev_err(&device->device,
-			"unable to establish receive buffer's gpadl");
+			"unable to establish receive buffer's gpadl\n");
 		goto cleanup;
 	}
 
@@ -203,7 +203,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
 	if (ret != 0) {
 		dev_err(&device->device,
-			"unable to send receive buffer's gpadl to netvsp");
+			"unable to send receive buffer's gpadl to netvsp\n");
 		goto cleanup;
 	}
 
@@ -215,7 +215,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 	if (init_packet->msg.v1_msg.
 	    send_recv_buf_complete.status != NVSP_STAT_SUCCESS) {
 		dev_err(&device->device, "Unable to complete receive buffer "
-			   "initialzation with NetVsp - status %d",
+			   "initialzation with NetVsp - status %d\n",
 			   init_packet->msg.v1_msg.
 			   send_recv_buf_complete.status);
 		ret = -EINVAL;
@@ -270,7 +270,7 @@ static int netvsc_connect_vsp(struct hv_device *device)
 	net_device = get_outbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "unable to get net device..."
-			   "device being destroyed?");
+			   "device being destroyed?\n");
 		return -ENODEV;
 	}
 
@@ -361,7 +361,7 @@ int netvsc_device_remove(struct hv_device *device)
 	/* Wait for all send completions */
 	while (atomic_read(&net_device->num_outstanding_sends)) {
 		dev_err(&device->device,
-			"waiting for %d requests to complete...",
+			"waiting for %d requests to complete...\n",
 			atomic_read(&net_device->num_outstanding_sends));
 		udelay(100);
 	}
@@ -381,7 +381,7 @@ int netvsc_device_remove(struct hv_device *device)
 	spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
 
 	/* At this point, no one should be accessing netDevice except in here */
-	dev_notice(&device->device, "net device safe to remove");
+	dev_notice(&device->device, "net device safe to remove\n");
 
 	/* Now, we can close the channel safely */
 	vmbus_close(device->channel);
@@ -407,7 +407,7 @@ static void netvsc_send_completion(struct hv_device *device,
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "unable to get net device..."
-			   "device being destroyed?");
+			   "device being destroyed?\n");
 		return;
 	}
 
@@ -436,7 +436,7 @@ static void netvsc_send_completion(struct hv_device *device,
 		atomic_dec(&net_device->num_outstanding_sends);
 	} else {
 		dev_err(&device->device, "Unknown send completion packet type- "
-			   "%d received!!", nvsp_packet->hdr.msg_type);
+			   "%d received!!\n", nvsp_packet->hdr.msg_type);
 	}
 
 }
@@ -452,7 +452,7 @@ int netvsc_send(struct hv_device *device,
 	net_device = get_outbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "net device (%p) shutting down..."
-			   "ignoring outbound packets", net_device);
+			   "ignoring outbound packets\n", net_device);
 		return -ENODEV;
 	}
 
@@ -487,7 +487,7 @@ int netvsc_send(struct hv_device *device,
 	}
 
 	if (ret != 0)
-		dev_err(&device->device, "Unable to send packet %p ret %d",
+		dev_err(&device->device, "Unable to send packet %p ret %d\n",
 			   packet, ret);
 
 	atomic_inc(&net_device->num_outstanding_sends);
@@ -520,19 +520,19 @@ retry_send_cmplt:
 		/* no more room...wait a bit and attempt to retry 3 times */
 		retries++;
 		dev_err(&device->device, "unable to send receive completion pkt"
-			" (tid %llx)...retrying %d", transaction_id, retries);
+			" (tid %llx)...retrying %d\n", transaction_id, retries);
 
 		if (retries < 4) {
 			udelay(100);
 			goto retry_send_cmplt;
 		} else {
 			dev_err(&device->device, "unable to send receive "
-				"completion pkt (tid %llx)...give up retrying",
+				"completion pkt (tid %llx)...give up retrying\n",
 				transaction_id);
 		}
 	} else {
 		dev_err(&device->device, "unable to send receive "
-			"completion pkt - %llx", transaction_id);
+			"completion pkt - %llx\n", transaction_id);
 	}
 }
 
@@ -554,7 +554,7 @@ static void netvsc_receive_completion(void *context)
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "unable to get net device..."
-			   "device being destroyed?");
+			   "device being destroyed?\n");
 		return;
 	}
 
@@ -605,7 +605,7 @@ static void netvsc_receive(struct hv_device *device,
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "unable to get net device..."
-			   "device being destroyed?");
+			   "device being destroyed?\n");
 		return;
 	}
 
@@ -614,7 +614,7 @@ static void netvsc_receive(struct hv_device *device,
 	 * packet
 	 */
 	if (packet->type != VM_PKT_DATA_USING_XFER_PAGES) {
-		dev_err(&device->device, "Unknown packet type received - %d",
+		dev_err(&device->device, "Unknown packet type received - %d\n",
 			   packet->type);
 		return;
 	}
@@ -626,7 +626,7 @@ static void netvsc_receive(struct hv_device *device,
 	if (nvsp_packet->hdr.msg_type !=
 	    NVSP_MSG1_TYPE_SEND_RNDIS_PKT) {
 		dev_err(&device->device, "Unknown nvsp packet type received-"
-			" %d", nvsp_packet->hdr.msg_type);
+			" %d\n", nvsp_packet->hdr.msg_type);
 		return;
 	}
 
@@ -634,7 +634,7 @@ static void netvsc_receive(struct hv_device *device,
 
 	if (vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID) {
 		dev_err(&device->device, "Invalid xfer page set id - "
-			   "expecting %x got %x", NETVSC_RECEIVE_BUFFER_ID,
+			   "expecting %x got %x\n", NETVSC_RECEIVE_BUFFER_ID,
 			   vmxferpage_packet->xfer_pageset_id);
 		return;
 	}
@@ -660,7 +660,7 @@ static void netvsc_receive(struct hv_device *device,
 	 */
 	if (count < 2) {
 		dev_err(&device->device, "Got only %d netvsc pkt...needed "
-			"%d pkts. Dropping this xfer page packet completely!",
+			"%d pkts. Dropping this xfer page packet completely!\n",
 			count, vmxferpage_packet->range_cnt + 1);
 
 		/* Return it to the freelist */
@@ -687,7 +687,7 @@ static void netvsc_receive(struct hv_device *device,
 
 	if (xferpage_packet->count != vmxferpage_packet->range_cnt) {
 		dev_err(&device->device, "Needed %d netvsc pkts to satisy "
-			"this xfer page...got %d",
+			"this xfer page...got %d\n",
 			vmxferpage_packet->range_cnt, xferpage_packet->count);
 	}
 
@@ -785,7 +785,7 @@ static void netvsc_channel_cb(void *context)
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
 		dev_err(&device->device, "net device (%p) shutting down..."
-			   "ignoring inbound packets", net_device);
+			   "ignoring inbound packets\n", net_device);
 		goto out;
 	}
 
@@ -836,7 +836,7 @@ static void netvsc_channel_cb(void *context)
 				/* Try again next time around */
 				dev_err(&device->device,
 					   "unable to allocate buffer of size "
-					   "(%d)!!", bytes_recvd);
+					   "(%d)!!\n", bytes_recvd);
 				break;
 			}
 
@@ -892,18 +892,18 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
 			 netvsc_channel_cb, device);
 
 	if (ret != 0) {
-		dev_err(&device->device, "unable to open channel: %d", ret);
+		dev_err(&device->device, "unable to open channel: %d\n", ret);
 		goto cleanup;
 	}
 
 	/* Channel is opened */
-	pr_info("hv_netvsc channel opened successfully");
+	pr_info("hv_netvsc channel opened successfully\n");
 
 	/* Connect with the NetVsp */
 	ret = netvsc_connect_vsp(device);
 	if (ret != 0) {
 		dev_err(&device->device,
-			"unable to connect to NetVSP - %d", ret);
+			"unable to connect to NetVSP - %d\n", ret);
 		goto close;
 	}
 
-- 
1.6.3.2


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

* [PATCH 03/10] staging: hv: convert dev_<loglevel> to netdev_<loglevel> in netvsc
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 01/10] staging: hv: remove unnecessary includes in netvsc Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 02/10] staging: hv: add newline to log messages " Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 04/10] staging: hv: fix a kernel warning in netvsc_linkstatus_callback() Haiyang Zhang
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc.c       |   68 +++++++++++++++++++++----------------
 drivers/staging/hv/rndis_filter.c |   17 +++++----
 2 files changed, 49 insertions(+), 36 deletions(-)

diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index ef764e6..82b129b 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -27,6 +27,7 @@
 #include <linux/delay.h>
 #include <linux/io.h>
 #include <linux/slab.h>
+#include <linux/netdevice.h>
 
 #include "hyperv_net.h"
 
@@ -80,6 +81,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
 {
 	struct nvsp_message *revoke_packet;
 	int ret = 0;
+	struct net_device *ndev = dev_get_drvdata(&net_device->dev->device);
 
 	/*
 	 * If we got a section count, it means we received a
@@ -107,7 +109,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
 		 * have a leak rather than continue and a bugchk
 		 */
 		if (ret != 0) {
-			dev_err(&net_device->dev->device, "unable to send "
+			netdev_err(ndev, "unable to send "
 				"revoke receive buffer to netvsp\n");
 			return ret;
 		}
@@ -122,7 +124,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
 		 * rather than continue and a bugchk
 		 */
 		if (ret != 0) {
-			dev_err(&net_device->dev->device,
+			netdev_err(ndev,
 				   "unable to teardown receive buffer's gpadl\n");
 			return ret;
 		}
@@ -151,10 +153,11 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 	int t;
 	struct netvsc_device *net_device;
 	struct nvsp_message *init_packet;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	net_device = get_outbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "unable to get net device..."
+		netdev_err(ndev, "unable to get net device..."
 			   "device being destroyed?\n");
 		return -ENODEV;
 	}
@@ -163,7 +166,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 		(void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
 				get_order(net_device->recv_buf_size));
 	if (!net_device->recv_buf) {
-		dev_err(&device->device, "unable to allocate receive "
+		netdev_err(ndev, "unable to allocate receive "
 			"buffer of size %d\n", net_device->recv_buf_size);
 		ret = -ENOMEM;
 		goto cleanup;
@@ -178,7 +181,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 				    net_device->recv_buf_size,
 				    &net_device->recv_buf_gpadl_handle);
 	if (ret != 0) {
-		dev_err(&device->device,
+		netdev_err(ndev,
 			"unable to establish receive buffer's gpadl\n");
 		goto cleanup;
 	}
@@ -202,7 +205,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 			       VM_PKT_DATA_INBAND,
 			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
 	if (ret != 0) {
-		dev_err(&device->device,
+		netdev_err(ndev,
 			"unable to send receive buffer's gpadl to netvsp\n");
 		goto cleanup;
 	}
@@ -214,7 +217,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 	/* Check the response */
 	if (init_packet->msg.v1_msg.
 	    send_recv_buf_complete.status != NVSP_STAT_SUCCESS) {
-		dev_err(&device->device, "Unable to complete receive buffer "
+		netdev_err(ndev, "Unable to complete receive buffer "
 			   "initialzation with NetVsp - status %d\n",
 			   init_packet->msg.v1_msg.
 			   send_recv_buf_complete.status);
@@ -266,10 +269,11 @@ static int netvsc_connect_vsp(struct hv_device *device)
 	struct netvsc_device *net_device;
 	struct nvsp_message *init_packet;
 	int ndis_version;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	net_device = get_outbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "unable to get net device..."
+		netdev_err(ndev, "unable to get net device..."
 			   "device being destroyed?\n");
 		return -ENODEV;
 	}
@@ -360,7 +364,7 @@ int netvsc_device_remove(struct hv_device *device)
 
 	/* Wait for all send completions */
 	while (atomic_read(&net_device->num_outstanding_sends)) {
-		dev_err(&device->device,
+		dev_info(&device->device,
 			"waiting for %d requests to complete...\n",
 			atomic_read(&net_device->num_outstanding_sends));
 		udelay(100);
@@ -403,10 +407,11 @@ static void netvsc_send_completion(struct hv_device *device,
 	struct netvsc_device *net_device;
 	struct nvsp_message *nvsp_packet;
 	struct hv_netvsc_packet *nvsc_packet;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "unable to get net device..."
+		netdev_err(ndev, "unable to get net device..."
 			   "device being destroyed?\n");
 		return;
 	}
@@ -435,7 +440,7 @@ static void netvsc_send_completion(struct hv_device *device,
 
 		atomic_dec(&net_device->num_outstanding_sends);
 	} else {
-		dev_err(&device->device, "Unknown send completion packet type- "
+		netdev_err(ndev, "Unknown send completion packet type- "
 			   "%d received!!\n", nvsp_packet->hdr.msg_type);
 	}
 
@@ -446,12 +451,12 @@ int netvsc_send(struct hv_device *device,
 {
 	struct netvsc_device *net_device;
 	int ret = 0;
-
 	struct nvsp_message sendMessage;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	net_device = get_outbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "net device (%p) shutting down..."
+		netdev_err(ndev, "net device (%p) shutting down..."
 			   "ignoring outbound packets\n", net_device);
 		return -ENODEV;
 	}
@@ -487,7 +492,7 @@ int netvsc_send(struct hv_device *device,
 	}
 
 	if (ret != 0)
-		dev_err(&device->device, "Unable to send packet %p ret %d\n",
+		netdev_err(ndev, "Unable to send packet %p ret %d\n",
 			   packet, ret);
 
 	atomic_inc(&net_device->num_outstanding_sends);
@@ -500,6 +505,7 @@ static void netvsc_send_recv_completion(struct hv_device *device,
 	struct nvsp_message recvcompMessage;
 	int retries = 0;
 	int ret;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	recvcompMessage.hdr.msg_type =
 				NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE;
@@ -519,19 +525,19 @@ retry_send_cmplt:
 	} else if (ret == -EAGAIN) {
 		/* no more room...wait a bit and attempt to retry 3 times */
 		retries++;
-		dev_err(&device->device, "unable to send receive completion pkt"
+		netdev_err(ndev, "unable to send receive completion pkt"
 			" (tid %llx)...retrying %d\n", transaction_id, retries);
 
 		if (retries < 4) {
 			udelay(100);
 			goto retry_send_cmplt;
 		} else {
-			dev_err(&device->device, "unable to send receive "
+			netdev_err(ndev, "unable to send receive "
 				"completion pkt (tid %llx)...give up retrying\n",
 				transaction_id);
 		}
 	} else {
-		dev_err(&device->device, "unable to send receive "
+		netdev_err(ndev, "unable to send receive "
 			"completion pkt - %llx\n", transaction_id);
 	}
 }
@@ -545,6 +551,7 @@ static void netvsc_receive_completion(void *context)
 	u64 transaction_id = 0;
 	bool fsend_receive_comp = false;
 	unsigned long flags;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	/*
 	 * Even though it seems logical to do a GetOutboundNetDevice() here to
@@ -553,7 +560,7 @@ static void netvsc_receive_completion(void *context)
 	 */
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "unable to get net device..."
+		netdev_err(ndev, "unable to get net device..."
 			   "device being destroyed?\n");
 		return;
 	}
@@ -599,12 +606,13 @@ static void netvsc_receive(struct hv_device *device,
 	int i, j;
 	int count = 0, bytes_remain = 0;
 	unsigned long flags;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	LIST_HEAD(listHead);
 
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "unable to get net device..."
+		netdev_err(ndev, "unable to get net device..."
 			   "device being destroyed?\n");
 		return;
 	}
@@ -614,7 +622,7 @@ static void netvsc_receive(struct hv_device *device,
 	 * packet
 	 */
 	if (packet->type != VM_PKT_DATA_USING_XFER_PAGES) {
-		dev_err(&device->device, "Unknown packet type received - %d\n",
+		netdev_err(ndev, "Unknown packet type received - %d\n",
 			   packet->type);
 		return;
 	}
@@ -625,7 +633,7 @@ static void netvsc_receive(struct hv_device *device,
 	/* Make sure this is a valid nvsp packet */
 	if (nvsp_packet->hdr.msg_type !=
 	    NVSP_MSG1_TYPE_SEND_RNDIS_PKT) {
-		dev_err(&device->device, "Unknown nvsp packet type received-"
+		netdev_err(ndev, "Unknown nvsp packet type received-"
 			" %d\n", nvsp_packet->hdr.msg_type);
 		return;
 	}
@@ -633,7 +641,7 @@ static void netvsc_receive(struct hv_device *device,
 	vmxferpage_packet = (struct vmtransfer_page_packet_header *)packet;
 
 	if (vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID) {
-		dev_err(&device->device, "Invalid xfer page set id - "
+		netdev_err(ndev, "Invalid xfer page set id - "
 			   "expecting %x got %x\n", NETVSC_RECEIVE_BUFFER_ID,
 			   vmxferpage_packet->xfer_pageset_id);
 		return;
@@ -659,7 +667,7 @@ static void netvsc_receive(struct hv_device *device,
 	 * some of the xfer page packet ranges...
 	 */
 	if (count < 2) {
-		dev_err(&device->device, "Got only %d netvsc pkt...needed "
+		netdev_err(ndev, "Got only %d netvsc pkt...needed "
 			"%d pkts. Dropping this xfer page packet completely!\n",
 			count, vmxferpage_packet->range_cnt + 1);
 
@@ -686,7 +694,7 @@ static void netvsc_receive(struct hv_device *device,
 	xferpage_packet->count = count - 1;
 
 	if (xferpage_packet->count != vmxferpage_packet->range_cnt) {
-		dev_err(&device->device, "Needed %d netvsc pkts to satisy "
+		netdev_err(ndev, "Needed %d netvsc pkts to satisy "
 			"this xfer page...got %d\n",
 			vmxferpage_packet->range_cnt, xferpage_packet->count);
 	}
@@ -775,6 +783,7 @@ static void netvsc_channel_cb(void *context)
 	struct vmpacket_descriptor *desc;
 	unsigned char *buffer;
 	int bufferlen = NETVSC_PACKET_SIZE;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
 			 GFP_ATOMIC);
@@ -784,7 +793,7 @@ static void netvsc_channel_cb(void *context)
 
 	net_device = get_inbound_net_device(device);
 	if (!net_device) {
-		dev_err(&device->device, "net device (%p) shutting down..."
+		netdev_err(ndev, "net device (%p) shutting down..."
 			   "ignoring inbound packets\n", net_device);
 		goto out;
 	}
@@ -805,7 +814,7 @@ static void netvsc_channel_cb(void *context)
 					break;
 
 				default:
-					dev_err(&device->device,
+					netdev_err(ndev,
 						   "unhandled packet type %d, "
 						   "tid %llx len %d\n",
 						   desc->type, request_id,
@@ -834,7 +843,7 @@ static void netvsc_channel_cb(void *context)
 			buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
 			if (buffer == NULL) {
 				/* Try again next time around */
-				dev_err(&device->device,
+				netdev_err(ndev,
 					   "unable to allocate buffer of size "
 					   "(%d)!!\n", bytes_recvd);
 				break;
@@ -861,6 +870,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
 	((struct netvsc_device_info *)additional_info)->ring_size;
 	struct netvsc_device *net_device;
 	struct hv_netvsc_packet *packet, *pos;
+	struct net_device *ndev = dev_get_drvdata(&device->device);
 
 	net_device = alloc_net_device(device);
 	if (!net_device) {
@@ -892,7 +902,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
 			 netvsc_channel_cb, device);
 
 	if (ret != 0) {
-		dev_err(&device->device, "unable to open channel: %d\n", ret);
+		netdev_err(ndev, "unable to open channel: %d\n", ret);
 		goto cleanup;
 	}
 
@@ -902,7 +912,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
 	/* Connect with the NetVsp */
 	ret = netvsc_connect_vsp(device);
 	if (ret != 0) {
-		dev_err(&device->device,
+		netdev_err(ndev,
 			"unable to connect to NetVSP - %d\n", ret);
 		goto close;
 	}
diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c
index 8416bf2..20e673d 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -249,6 +249,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
 	struct rndis_request *request = NULL;
 	bool found = false;
 	unsigned long flags;
+	struct net_device *ndev = dev_get_drvdata(&dev->net_dev->dev->device);
 
 	spin_lock_irqsave(&dev->request_lock, flags);
 	list_for_each_entry(request, &dev->req_list, list_ent) {
@@ -269,7 +270,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
 			memcpy(&request->response_msg, resp,
 			       resp->msg_len);
 		} else {
-			dev_err(&dev->net_dev->dev->device,
+			netdev_err(ndev,
 				"rndis response buffer overflow "
 				"detected (size %u max %zu)\n",
 				resp->msg_len,
@@ -289,7 +290,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
 
 		complete(&request->wait_event);
 	} else {
-		dev_err(&dev->net_dev->dev->device,
+		netdev_err(ndev,
 			"no rndis request found for this response "
 			"(id 0x%x res type 0x%x)\n",
 			resp->msg.init_complete.req_id,
@@ -349,20 +350,21 @@ int rndis_filter_receive(struct hv_device *dev,
 	struct rndis_device *rndis_dev;
 	struct rndis_message rndis_msg;
 	struct rndis_message *rndis_hdr;
+	struct net_device *ndev = dev_get_drvdata(&dev->device);
 
 	if (!net_dev)
 		return -EINVAL;
 
 	/* Make sure the rndis device state is initialized */
 	if (!net_dev->extension) {
-		dev_err(&dev->device, "got rndis message but no rndis device - "
+		netdev_err(ndev, "got rndis message but no rndis device - "
 			  "dropping this message!\n");
 		return -ENODEV;
 	}
 
 	rndis_dev = (struct rndis_device *)net_dev->extension;
 	if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) {
-		dev_err(&dev->device, "got rndis message but rndis device "
+		netdev_err(ndev, "got rndis message but rndis device "
 			   "uninitialized...dropping this message!\n");
 		return -ENODEV;
 	}
@@ -376,7 +378,7 @@ int rndis_filter_receive(struct hv_device *dev,
 	/* Make sure we got a valid rndis message */
 	if ((rndis_hdr->ndis_msg_type != REMOTE_NDIS_PACKET_MSG) &&
 	    (rndis_hdr->msg_len > sizeof(struct rndis_message))) {
-		dev_err(&dev->device, "incoming rndis message buffer overflow "
+		netdev_err(ndev, "incoming rndis message buffer overflow "
 			   "detected (got %u, max %zu)..marking it an error!\n",
 			   rndis_hdr->msg_len,
 			   sizeof(struct rndis_message));
@@ -409,7 +411,7 @@ int rndis_filter_receive(struct hv_device *dev,
 		rndis_filter_receive_indicate_status(rndis_dev, &rndis_msg);
 		break;
 	default:
-		dev_err(&dev->device,
+		netdev_err(ndev,
 			"unhandled rndis message (type %u len %u)\n",
 			   rndis_msg.ndis_msg_type,
 			   rndis_msg.msg_len);
@@ -505,6 +507,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
 	struct rndis_set_complete *set_complete;
 	u32 status;
 	int ret, t;
+	struct net_device *ndev = dev_get_drvdata(&dev->net_dev->dev->device);
 
 	request = get_rndis_request(dev, REMOTE_NDIS_SET_MSG,
 			RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
@@ -530,7 +533,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
 	t = wait_for_completion_timeout(&request->wait_event, 5*HZ);
 
 	if (t == 0) {
-		dev_err(&dev->net_dev->dev->device,
+		netdev_err(ndev,
 			"timeout before we got a set response...\n");
 		/*
 		 * We can't deallocate the request since we may still receive a
-- 
1.6.3.2


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

* [PATCH 04/10] staging: hv: fix a kernel warning in netvsc_linkstatus_callback()
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (2 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 03/10] staging: hv: convert dev_<loglevel> to netdev_<loglevel> " Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 05/10] staging: hv: re-order the code in netvsc_probe() Haiyang Zhang
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization
  Cc: stable

netif_notify_peers() caused a kernel warning in netvsc_linkstatus_callback(),
because netvsc_linkstatus_callback() is within IRQ context. So we move
the first call to netif_notify_peers() into queued work as well, but with
zero delay.

In addition to "staging-next", this should also be back-ported to stable
kernels 2.6.32 and later.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Cc: stable <stable@kernel.org>
---
 drivers/staging/hv/netvsc_drv.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index 30a0cb2..e6513be 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -214,8 +214,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
 	if (status == 1) {
 		netif_carrier_on(net);
 		netif_wake_queue(net);
-		netif_notify_peers(net);
 		ndev_ctx = netdev_priv(net);
+		schedule_delayed_work(&ndev_ctx->dwork, 0);
 		schedule_delayed_work(&ndev_ctx->dwork, msecs_to_jiffies(20));
 	} else {
 		netif_carrier_off(net);
-- 
1.6.3.2


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

* [PATCH 05/10] staging: hv: re-order the code in netvsc_probe()
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (3 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 04/10] staging: hv: fix a kernel warning in netvsc_linkstatus_callback() Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 06/10] staging: hv: fix counting of #outstanding-sends in failed sends Haiyang Zhang
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Re-order the code in netvsc_probe() to prevent a guest crash caused by
packets possibly received from NetVSP before call to register_netdev().

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc_drv.c |   32 +++++++++++++++++---------------
 1 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index e6513be..b49a08f 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -348,19 +348,6 @@ static int netvsc_probe(struct hv_device *dev)
 	dev_set_drvdata(&dev->device, net);
 	INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_send_garp);
 
-	/* Notify the netvsc driver of the new device */
-	device_info.ring_size = ring_size;
-	ret = rndis_filter_device_add(dev, &device_info);
-	if (ret != 0) {
-		free_netdev(net);
-		dev_set_drvdata(&dev->device, NULL);
-		return ret;
-	}
-
-	netif_carrier_on(net);
-
-	memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN);
-
 	net->netdev_ops = &device_ops;
 
 	/* TODO: Add GSO and Checksum offload */
@@ -372,11 +359,26 @@ static int netvsc_probe(struct hv_device *dev)
 
 	ret = register_netdev(net);
 	if (ret != 0) {
-		/* Remove the device and release the resource */
-		rndis_filter_device_remove(dev);
+		pr_err("Unable to register netdev.\n");
 		free_netdev(net);
+		goto out;
 	}
 
+	/* Notify the netvsc driver of the new device */
+	device_info.ring_size = ring_size;
+	ret = rndis_filter_device_add(dev, &device_info);
+	if (ret != 0) {
+		netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
+		unregister_netdev(net);
+		free_netdev(net);
+		dev_set_drvdata(&dev->device, NULL);
+		return ret;
+	}
+	memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN);
+
+	netif_carrier_on(net);
+
+out:
 	return ret;
 }
 
-- 
1.6.3.2


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

* [PATCH 06/10] staging: hv: fix counting of #outstanding-sends in failed sends
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (4 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 05/10] staging: hv: re-order the code in netvsc_probe() Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 07/10] staging: hv: fix counting of available buffer slots when send fails Haiyang Zhang
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

If the packet failed to be sent, we shouldn't count it as the
number of outstanding sends.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index 82b129b..efbc8a0 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -494,8 +494,9 @@ int netvsc_send(struct hv_device *device,
 	if (ret != 0)
 		netdev_err(ndev, "Unable to send packet %p ret %d\n",
 			   packet, ret);
+	else
+		atomic_inc(&net_device->num_outstanding_sends);
 
-	atomic_inc(&net_device->num_outstanding_sends);
 	return ret;
 }
 
-- 
1.6.3.2


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

* [PATCH 07/10] staging: hv: fix counting of available buffer slots when send fails
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (5 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 06/10] staging: hv: fix counting of #outstanding-sends in failed sends Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 08/10] staging: hv: fix the return status of netvsc_start_xmit() Haiyang Zhang
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Because the number of available buffer slots doesn't decrease for failed
sends, we should not call netvsc_xmit_completion(), which increase the
count of available slots. In this failed case, just free the memory is
enough.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc_drv.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index b49a08f..81e3c49 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -190,7 +190,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
 	} else {
 		/* we are shutting down or bus overloaded, just drop packet */
 		net->stats.tx_dropped++;
-		netvsc_xmit_completion(packet);
+		kfree(packet);
+		dev_kfree_skb_any(skb);
 	}
 
 	return NETDEV_TX_OK;
-- 
1.6.3.2


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

* [PATCH 08/10] staging: hv: fix the return status of netvsc_start_xmit()
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (6 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 07/10] staging: hv: fix counting of available buffer slots when send fails Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 09/10] staging: hv: fix the page buffer when rndis data go across page boundary Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 10/10] staging: hv: fix some typos in netvsc.c Haiyang Zhang
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Fix the return status, so the upper layer will retry if transmission
fails.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc_drv.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index 81e3c49..30b9c80 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -140,12 +140,12 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
 			 (num_pages * sizeof(struct hv_page_buffer)) +
 			 sizeof(struct rndis_filter_packet), GFP_ATOMIC);
 	if (!packet) {
-		/* out of memory, silently drop packet */
+		/* out of memory, drop packet */
 		netdev_err(net, "unable to allocate hv_netvsc_packet\n");
 
 		dev_kfree_skb(skb);
 		net->stats.tx_dropped++;
-		return NETDEV_TX_OK;
+		return NETDEV_TX_BUSY;
 	}
 
 	packet->extension = (void *)(unsigned long)packet +
@@ -194,7 +194,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
 		dev_kfree_skb_any(skb);
 	}
 
-	return NETDEV_TX_OK;
+	return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK;
 }
 
 /*
-- 
1.6.3.2


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

* [PATCH 09/10] staging: hv: fix the page buffer when rndis data go across page boundary
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (7 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 08/10] staging: hv: fix the return status of netvsc_start_xmit() Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  2011-09-01 19:19 ` [PATCH 10/10] staging: hv: fix some typos in netvsc.c Haiyang Zhang
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

In rndis_filter_receive_data(), we need to drop the 0th page and move the
rest of pages forward if the rndis data go across page boundary, otherwise
the page offset will overflow.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/rndis_filter.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c
index 20e673d..b325345 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -323,6 +323,7 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
 {
 	struct rndis_packet *rndis_pkt;
 	u32 data_offset;
+	int i;
 
 	rndis_pkt = &msg->msg.pkt;
 
@@ -338,6 +339,15 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
 	pkt->page_buf[0].offset += data_offset;
 	pkt->page_buf[0].len -= data_offset;
 
+	/* Drop the 0th page, if rndis data go beyond page boundary */
+	if (pkt->page_buf[0].offset >= PAGE_SIZE) {
+		pkt->page_buf[1].offset = pkt->page_buf[0].offset - PAGE_SIZE;
+		pkt->page_buf[1].len -= pkt->page_buf[1].offset;
+		pkt->page_buf_cnt--;
+		for (i = 0; i < pkt->page_buf_cnt; i++)
+			pkt->page_buf[i] = pkt->page_buf[i+1];
+	}
+
 	pkt->is_data_pkt = true;
 
 	netvsc_recv_callback(dev->net_dev->dev, pkt);
-- 
1.6.3.2


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

* [PATCH 10/10] staging: hv: fix some typos in netvsc.c
  2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
                   ` (8 preceding siblings ...)
  2011-09-01 19:19 ` [PATCH 09/10] staging: hv: fix the page buffer when rndis data go across page boundary Haiyang Zhang
@ 2011-09-01 19:19 ` Haiyang Zhang
  9 siblings, 0 replies; 11+ messages in thread
From: Haiyang Zhang @ 2011-09-01 19:19 UTC (permalink / raw)
  To: haiyangz, hjanssen, kys, gregkh, linux-kernel, devel, virtualization

Reported-by: Joe Perches <joe@perches.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/staging/hv/netvsc.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index efbc8a0..115629f 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -218,7 +218,7 @@ static int netvsc_init_recv_buf(struct hv_device *device)
 	if (init_packet->msg.v1_msg.
 	    send_recv_buf_complete.status != NVSP_STAT_SUCCESS) {
 		netdev_err(ndev, "Unable to complete receive buffer "
-			   "initialzation with NetVsp - status %d\n",
+			   "initialization with NetVsp - status %d\n",
 			   init_packet->msg.v1_msg.
 			   send_recv_buf_complete.status);
 		ret = -EINVAL;
@@ -695,7 +695,7 @@ static void netvsc_receive(struct hv_device *device,
 	xferpage_packet->count = count - 1;
 
 	if (xferpage_packet->count != vmxferpage_packet->range_cnt) {
-		netdev_err(ndev, "Needed %d netvsc pkts to satisy "
+		netdev_err(ndev, "Needed %d netvsc pkts to satisfy "
 			"this xfer page...got %d\n",
 			vmxferpage_packet->range_cnt, xferpage_packet->count);
 	}
-- 
1.6.3.2


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

end of thread, other threads:[~2011-09-01 19:37 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-01 19:19 [PATCH 00/10] netvsc bug fixes and cleanups Haiyang Zhang
2011-09-01 19:19 ` [PATCH 01/10] staging: hv: remove unnecessary includes in netvsc Haiyang Zhang
2011-09-01 19:19 ` [PATCH 02/10] staging: hv: add newline to log messages " Haiyang Zhang
2011-09-01 19:19 ` [PATCH 03/10] staging: hv: convert dev_<loglevel> to netdev_<loglevel> " Haiyang Zhang
2011-09-01 19:19 ` [PATCH 04/10] staging: hv: fix a kernel warning in netvsc_linkstatus_callback() Haiyang Zhang
2011-09-01 19:19 ` [PATCH 05/10] staging: hv: re-order the code in netvsc_probe() Haiyang Zhang
2011-09-01 19:19 ` [PATCH 06/10] staging: hv: fix counting of #outstanding-sends in failed sends Haiyang Zhang
2011-09-01 19:19 ` [PATCH 07/10] staging: hv: fix counting of available buffer slots when send fails Haiyang Zhang
2011-09-01 19:19 ` [PATCH 08/10] staging: hv: fix the return status of netvsc_start_xmit() Haiyang Zhang
2011-09-01 19:19 ` [PATCH 09/10] staging: hv: fix the page buffer when rndis data go across page boundary Haiyang Zhang
2011-09-01 19:19 ` [PATCH 10/10] staging: hv: fix some typos in netvsc.c Haiyang Zhang

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.