--- /dev/null
+From 03367ef5ea811475187a0732aada068919e14d61 Mon Sep 17 00:00:00 2001
+From: "K. Y. Srinivasan" <kys@microsoft.com>
+Date: Thu, 3 Apr 2014 18:02:45 -0700
+Subject: Drivers: hv: vmbus: Negotiate version 3.0 when running on
+ ws2012r2 hosts
+
+From: "K. Y. Srinivasan" <kys@microsoft.com>
+
+commit 03367ef5ea811475187a0732aada068919e14d61 upstream.
+
+Only ws2012r2 hosts support the ability to reconnect to the host on VMBUS. This functionality
+is needed by kexec in Linux. To use this functionality we need to negotiate version 3.0 of the
+VMBUS protocol.
+
+Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ drivers/hv/connection.c | 6 ++++++
+ include/linux/hyperv.h | 7 +++++--
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+--- a/drivers/hv/connection.c
++++ b/drivers/hv/connection.c
+@@ -55,6 +55,9 @@ static __u32 vmbus_get_next_version(__u3
+ case (VERSION_WIN8):
+ return VERSION_WIN7;
+
++ case (VERSION_WIN8_1):
++ return VERSION_WIN8;
++
+ case (VERSION_WS2008):
+ default:
+ return VERSION_INVAL;
+@@ -80,6 +83,9 @@ static int vmbus_negotiate_version(struc
+ (void *)((unsigned long)vmbus_connection.monitor_pages +
+ PAGE_SIZE));
+
++ if (version == VERSION_WIN8_1)
++ msg->target_vcpu = hv_context.vp_index[smp_processor_id()];
++
+ /*
+ * Add to list before we send the request since we may
+ * receive the response before returning from this routine
+--- a/include/linux/hyperv.h
++++ b/include/linux/hyperv.h
+@@ -483,15 +483,18 @@ hv_get_ringbuffer_availbytes(struct hv_r
+ * 0 . 13 (Windows Server 2008)
+ * 1 . 1 (Windows 7)
+ * 2 . 4 (Windows 8)
++ * 3 . 0 (Windows 8 R2)
+ */
+
+ #define VERSION_WS2008 ((0 << 16) | (13))
+ #define VERSION_WIN7 ((1 << 16) | (1))
+ #define VERSION_WIN8 ((2 << 16) | (4))
++#define VERSION_WIN8_1 ((3 << 16) | (0))
++
+
+ #define VERSION_INVAL -1
+
+-#define VERSION_CURRENT VERSION_WIN8
++#define VERSION_CURRENT VERSION_WIN8_1
+
+ /* Make maximum size of pipe payload of 16K */
+ #define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384)
+@@ -894,7 +897,7 @@ struct vmbus_channel_relid_released {
+ struct vmbus_channel_initiate_contact {
+ struct vmbus_channel_message_header header;
+ u32 vmbus_version_requested;
+- u32 padding2;
++ u32 target_vcpu; /* The VCPU the host should respond to */
+ u64 interrupt_page;
+ u64 monitor_page1;
+ u64 monitor_page2;