|
@@ -28,17 +28,32 @@
|
|
|
#include <linux/reboot.h>
|
|
|
#include <linux/hyperv.h>
|
|
|
|
|
|
-#define SHUTDOWN_MAJOR 3
|
|
|
-#define SHUTDOWN_MINOR 0
|
|
|
-#define SHUTDOWN_MAJOR_MINOR (SHUTDOWN_MAJOR << 16 | SHUTDOWN_MINOR)
|
|
|
|
|
|
-#define TIMESYNCH_MAJOR 3
|
|
|
-#define TIMESYNCH_MINOR 0
|
|
|
-#define TIMESYNCH_MAJOR_MINOR (TIMESYNCH_MAJOR << 16 | TIMESYNCH_MINOR)
|
|
|
+#define SD_MAJOR 3
|
|
|
+#define SD_MINOR 0
|
|
|
+#define SD_VERSION (SD_MAJOR << 16 | SD_MINOR)
|
|
|
|
|
|
-#define HEARTBEAT_MAJOR 3
|
|
|
-#define HEARTBEAT_MINOR 0
|
|
|
-#define HEARTBEAT_MAJOR_MINOR (HEARTBEAT_MAJOR << 16 | HEARTBEAT_MINOR)
|
|
|
+#define SD_WS2008_MAJOR 1
|
|
|
+#define SD_WS2008_VERSION (SD_WS2008_MAJOR << 16 | SD_MINOR)
|
|
|
+
|
|
|
+#define TS_MAJOR 3
|
|
|
+#define TS_MINOR 0
|
|
|
+#define TS_VERSION (TS_MAJOR << 16 | TS_MINOR)
|
|
|
+
|
|
|
+#define TS_WS2008_MAJOR 1
|
|
|
+#define TS_WS2008_VERSION (TS_WS2008_MAJOR << 16 | TS_MINOR)
|
|
|
+
|
|
|
+#define HB_MAJOR 3
|
|
|
+#define HB_MINOR 0
|
|
|
+#define HB_VERSION (HB_MAJOR << 16 | HB_MINOR)
|
|
|
+
|
|
|
+#define HB_WS2008_MAJOR 1
|
|
|
+#define HB_WS2008_VERSION (HB_WS2008_MAJOR << 16 | HB_MINOR)
|
|
|
+
|
|
|
+static int sd_srv_version;
|
|
|
+static int ts_srv_version;
|
|
|
+static int hb_srv_version;
|
|
|
+static int util_fw_version;
|
|
|
|
|
|
static void shutdown_onchannelcallback(void *context);
|
|
|
static struct hv_util_service util_shutdown = {
|
|
@@ -99,8 +114,8 @@ static void shutdown_onchannelcallback(void *context)
|
|
|
|
|
|
if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) {
|
|
|
vmbus_prep_negotiate_resp(icmsghdrp, negop,
|
|
|
- shut_txf_buf, UTIL_FW_MAJOR_MINOR,
|
|
|
- SHUTDOWN_MAJOR_MINOR);
|
|
|
+ shut_txf_buf, util_fw_version,
|
|
|
+ sd_srv_version);
|
|
|
} else {
|
|
|
shutdown_msg =
|
|
|
(struct shutdown_msg_data *)&shut_txf_buf[
|
|
@@ -216,6 +231,7 @@ static void timesync_onchannelcallback(void *context)
|
|
|
struct icmsg_hdr *icmsghdrp;
|
|
|
struct ictimesync_data *timedatap;
|
|
|
u8 *time_txf_buf = util_timesynch.recv_buffer;
|
|
|
+ struct icmsg_negotiate *negop = NULL;
|
|
|
|
|
|
vmbus_recvpacket(channel, time_txf_buf,
|
|
|
PAGE_SIZE, &recvlen, &requestid);
|
|
@@ -225,9 +241,10 @@ static void timesync_onchannelcallback(void *context)
|
|
|
sizeof(struct vmbuspipe_hdr)];
|
|
|
|
|
|
if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) {
|
|
|
- vmbus_prep_negotiate_resp(icmsghdrp, NULL, time_txf_buf,
|
|
|
- UTIL_FW_MAJOR_MINOR,
|
|
|
- TIMESYNCH_MAJOR_MINOR);
|
|
|
+ vmbus_prep_negotiate_resp(icmsghdrp, negop,
|
|
|
+ time_txf_buf,
|
|
|
+ util_fw_version,
|
|
|
+ ts_srv_version);
|
|
|
} else {
|
|
|
timedatap = (struct ictimesync_data *)&time_txf_buf[
|
|
|
sizeof(struct vmbuspipe_hdr) +
|
|
@@ -257,6 +274,7 @@ static void heartbeat_onchannelcallback(void *context)
|
|
|
struct icmsg_hdr *icmsghdrp;
|
|
|
struct heartbeat_msg_data *heartbeat_msg;
|
|
|
u8 *hbeat_txf_buf = util_heartbeat.recv_buffer;
|
|
|
+ struct icmsg_negotiate *negop = NULL;
|
|
|
|
|
|
vmbus_recvpacket(channel, hbeat_txf_buf,
|
|
|
PAGE_SIZE, &recvlen, &requestid);
|
|
@@ -266,9 +284,9 @@ static void heartbeat_onchannelcallback(void *context)
|
|
|
sizeof(struct vmbuspipe_hdr)];
|
|
|
|
|
|
if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) {
|
|
|
- vmbus_prep_negotiate_resp(icmsghdrp, NULL,
|
|
|
- hbeat_txf_buf, UTIL_FW_MAJOR_MINOR,
|
|
|
- HEARTBEAT_MAJOR_MINOR);
|
|
|
+ vmbus_prep_negotiate_resp(icmsghdrp, negop,
|
|
|
+ hbeat_txf_buf, util_fw_version,
|
|
|
+ hb_srv_version);
|
|
|
} else {
|
|
|
heartbeat_msg =
|
|
|
(struct heartbeat_msg_data *)&hbeat_txf_buf[
|
|
@@ -321,6 +339,25 @@ static int util_probe(struct hv_device *dev,
|
|
|
goto error;
|
|
|
|
|
|
hv_set_drvdata(dev, srv);
|
|
|
+ /*
|
|
|
+ * Based on the host; initialize the framework and
|
|
|
+ * service version numbers we will negotiate.
|
|
|
+ */
|
|
|
+ switch (vmbus_proto_version) {
|
|
|
+ case (VERSION_WS2008):
|
|
|
+ util_fw_version = UTIL_WS2K8_FW_VERSION;
|
|
|
+ sd_srv_version = SD_WS2008_VERSION;
|
|
|
+ ts_srv_version = TS_WS2008_VERSION;
|
|
|
+ hb_srv_version = HB_WS2008_VERSION;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ util_fw_version = UTIL_FW_VERSION;
|
|
|
+ sd_srv_version = SD_VERSION;
|
|
|
+ ts_srv_version = TS_VERSION;
|
|
|
+ hb_srv_version = HB_VERSION;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
error:
|