diff options
Diffstat (limited to 'drivers/hv/hv_kvp.c')
-rw-r--r-- | drivers/hv/hv_kvp.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c index 28b03325b872..09988b289622 100644 --- a/drivers/hv/hv_kvp.c +++ b/drivers/hv/hv_kvp.c | |||
@@ -32,13 +32,17 @@ | |||
32 | /* | 32 | /* |
33 | * Pre win8 version numbers used in ws2008 and ws 2008 r2 (win7) | 33 | * Pre win8 version numbers used in ws2008 and ws 2008 r2 (win7) |
34 | */ | 34 | */ |
35 | #define WS2008_SRV_MAJOR 1 | ||
36 | #define WS2008_SRV_MINOR 0 | ||
37 | #define WS2008_SRV_VERSION (WS2008_SRV_MAJOR << 16 | WS2008_SRV_MINOR) | ||
38 | |||
35 | #define WIN7_SRV_MAJOR 3 | 39 | #define WIN7_SRV_MAJOR 3 |
36 | #define WIN7_SRV_MINOR 0 | 40 | #define WIN7_SRV_MINOR 0 |
37 | #define WIN7_SRV_MAJOR_MINOR (WIN7_SRV_MAJOR << 16 | WIN7_SRV_MINOR) | 41 | #define WIN7_SRV_VERSION (WIN7_SRV_MAJOR << 16 | WIN7_SRV_MINOR) |
38 | 42 | ||
39 | #define WIN8_SRV_MAJOR 4 | 43 | #define WIN8_SRV_MAJOR 4 |
40 | #define WIN8_SRV_MINOR 0 | 44 | #define WIN8_SRV_MINOR 0 |
41 | #define WIN8_SRV_MAJOR_MINOR (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR) | 45 | #define WIN8_SRV_VERSION (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR) |
42 | 46 | ||
43 | /* | 47 | /* |
44 | * Global state maintained for transaction that is being processed. | 48 | * Global state maintained for transaction that is being processed. |
@@ -587,6 +591,8 @@ void hv_kvp_onchannelcallback(void *context) | |||
587 | 591 | ||
588 | struct icmsg_hdr *icmsghdrp; | 592 | struct icmsg_hdr *icmsghdrp; |
589 | struct icmsg_negotiate *negop = NULL; | 593 | struct icmsg_negotiate *negop = NULL; |
594 | int util_fw_version; | ||
595 | int kvp_srv_version; | ||
590 | 596 | ||
591 | if (kvp_transaction.active) { | 597 | if (kvp_transaction.active) { |
592 | /* | 598 | /* |
@@ -606,17 +612,26 @@ void hv_kvp_onchannelcallback(void *context) | |||
606 | 612 | ||
607 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { | 613 | if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { |
608 | /* | 614 | /* |
609 | * We start with win8 version and if the host cannot | 615 | * Based on the host, select appropriate |
610 | * support that we use the previous version. | 616 | * framework and service versions we will |
617 | * negotiate. | ||
611 | */ | 618 | */ |
612 | if (vmbus_prep_negotiate_resp(icmsghdrp, negop, | 619 | switch (vmbus_proto_version) { |
613 | recv_buffer, UTIL_FW_MAJOR_MINOR, | 620 | case (VERSION_WS2008): |
614 | WIN8_SRV_MAJOR_MINOR)) | 621 | util_fw_version = UTIL_WS2K8_FW_VERSION; |
615 | goto done; | 622 | kvp_srv_version = WS2008_SRV_VERSION; |
616 | 623 | break; | |
624 | case (VERSION_WIN7): | ||
625 | util_fw_version = UTIL_FW_VERSION; | ||
626 | kvp_srv_version = WIN7_SRV_VERSION; | ||
627 | break; | ||
628 | default: | ||
629 | util_fw_version = UTIL_FW_VERSION; | ||
630 | kvp_srv_version = WIN8_SRV_VERSION; | ||
631 | } | ||
617 | vmbus_prep_negotiate_resp(icmsghdrp, negop, | 632 | vmbus_prep_negotiate_resp(icmsghdrp, negop, |
618 | recv_buffer, UTIL_FW_MAJOR_MINOR, | 633 | recv_buffer, util_fw_version, |
619 | WIN7_SRV_MAJOR_MINOR); | 634 | kvp_srv_version); |
620 | 635 | ||
621 | } else { | 636 | } else { |
622 | kvp_msg = (struct hv_kvp_msg *)&recv_buffer[ | 637 | kvp_msg = (struct hv_kvp_msg *)&recv_buffer[ |
@@ -649,7 +664,6 @@ void hv_kvp_onchannelcallback(void *context) | |||
649 | return; | 664 | return; |
650 | 665 | ||
651 | } | 666 | } |
652 | done: | ||
653 | 667 | ||
654 | icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION | 668 | icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION |
655 | | ICMSGHDRFLAG_RESPONSE; | 669 | | ICMSGHDRFLAG_RESPONSE; |