mfd: ab8500-debugfs: Remove ab8500_dump_all_banks_to_mem()
[cascardo/linux.git] / drivers / hv / hv_kvp.c
1 /*
2  * An implementation of key value pair (KVP) functionality for Linux.
3  *
4  *
5  * Copyright (C) 2010, Novell, Inc.
6  * Author : K. Y. Srinivasan <ksrinivasan@novell.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License version 2 as published
10  * by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
15  * NON INFRINGEMENT.  See the GNU General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21  *
22  */
23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
24
25 #include <linux/net.h>
26 #include <linux/nls.h>
27 #include <linux/connector.h>
28 #include <linux/workqueue.h>
29 #include <linux/hyperv.h>
30
31 #include "hyperv_vmbus.h"
32 #include "hv_utils_transport.h"
33
34 /*
35  * Pre win8 version numbers used in ws2008 and ws 2008 r2 (win7)
36  */
37 #define WS2008_SRV_MAJOR        1
38 #define WS2008_SRV_MINOR        0
39 #define WS2008_SRV_VERSION     (WS2008_SRV_MAJOR << 16 | WS2008_SRV_MINOR)
40
41 #define WIN7_SRV_MAJOR   3
42 #define WIN7_SRV_MINOR   0
43 #define WIN7_SRV_VERSION     (WIN7_SRV_MAJOR << 16 | WIN7_SRV_MINOR)
44
45 #define WIN8_SRV_MAJOR   4
46 #define WIN8_SRV_MINOR   0
47 #define WIN8_SRV_VERSION     (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR)
48
49 /*
50  * Global state maintained for transaction that is being processed. For a class
51  * of integration services, including the "KVP service", the specified protocol
52  * is a "request/response" protocol which means that there can only be single
53  * outstanding transaction from the host at any given point in time. We use
54  * this to simplify memory management in this driver - we cache and process
55  * only one message at a time.
56  *
57  * While the request/response protocol is guaranteed by the host, we further
58  * ensure this by serializing packet processing in this driver - we do not
59  * read additional packets from the VMBUs until the current packet is fully
60  * handled.
61  */
62
63 static struct {
64         int state;   /* hvutil_device_state */
65         int recv_len; /* number of bytes received. */
66         struct hv_kvp_msg  *kvp_msg; /* current message */
67         struct vmbus_channel *recv_channel; /* chn we got the request */
68         u64 recv_req_id; /* request ID. */
69 } kvp_transaction;
70
71 /*
72  * This state maintains the version number registered by the daemon.
73  */
74 static int dm_reg_value;
75
76 static void kvp_send_key(struct work_struct *dummy);
77
78
79 static void kvp_respond_to_host(struct hv_kvp_msg *msg, int error);
80 static void kvp_timeout_func(struct work_struct *dummy);
81 static void kvp_host_handshake_func(struct work_struct *dummy);
82 static void kvp_register(int);
83
84 static DECLARE_DELAYED_WORK(kvp_timeout_work, kvp_timeout_func);
85 static DECLARE_DELAYED_WORK(kvp_host_handshake_work, kvp_host_handshake_func);
86 static DECLARE_WORK(kvp_sendkey_work, kvp_send_key);
87
88 static const char kvp_devname[] = "vmbus/hv_kvp";
89 static u8 *recv_buffer;
90 static struct hvutil_transport *hvt;
91 /*
92  * Register the kernel component with the user-level daemon.
93  * As part of this registration, pass the LIC version number.
94  * This number has no meaning, it satisfies the registration protocol.
95  */
96 #define HV_DRV_VERSION           "3.1"
97
98 static void kvp_poll_wrapper(void *channel)
99 {
100         /* Transaction is finished, reset the state here to avoid races. */
101         kvp_transaction.state = HVUTIL_READY;
102         hv_kvp_onchannelcallback(channel);
103 }
104
105 static void
106 kvp_register(int reg_value)
107 {
108
109         struct hv_kvp_msg *kvp_msg;
110         char *version;
111
112         kvp_msg = kzalloc(sizeof(*kvp_msg), GFP_KERNEL);
113
114         if (kvp_msg) {
115                 version = kvp_msg->body.kvp_register.version;
116                 kvp_msg->kvp_hdr.operation = reg_value;
117                 strcpy(version, HV_DRV_VERSION);
118
119                 hvutil_transport_send(hvt, kvp_msg, sizeof(*kvp_msg));
120                 kfree(kvp_msg);
121         }
122 }
123
124 static void kvp_timeout_func(struct work_struct *dummy)
125 {
126         /*
127          * If the timer fires, the user-mode component has not responded;
128          * process the pending transaction.
129          */
130         kvp_respond_to_host(NULL, HV_E_FAIL);
131
132         hv_poll_channel(kvp_transaction.recv_channel, kvp_poll_wrapper);
133 }
134
135 static void kvp_host_handshake_func(struct work_struct *dummy)
136 {
137         hv_poll_channel(kvp_transaction.recv_channel, hv_kvp_onchannelcallback);
138 }
139
140 static int kvp_handle_handshake(struct hv_kvp_msg *msg)
141 {
142         switch (msg->kvp_hdr.operation) {
143         case KVP_OP_REGISTER:
144                 dm_reg_value = KVP_OP_REGISTER;
145                 pr_info("KVP: IP injection functionality not available\n");
146                 pr_info("KVP: Upgrade the KVP daemon\n");
147                 break;
148         case KVP_OP_REGISTER1:
149                 dm_reg_value = KVP_OP_REGISTER1;
150                 break;
151         default:
152                 pr_info("KVP: incompatible daemon\n");
153                 pr_info("KVP: KVP version: %d, Daemon version: %d\n",
154                         KVP_OP_REGISTER1, msg->kvp_hdr.operation);
155                 return -EINVAL;
156         }
157
158         /*
159          * We have a compatible daemon; complete the handshake.
160          */
161         pr_debug("KVP: userspace daemon ver. %d registered\n",
162                  KVP_OP_REGISTER);
163         kvp_register(dm_reg_value);
164
165         /*
166          * If we're still negotiating with the host cancel the timeout
167          * work to not poll the channel twice.
168          */
169         cancel_delayed_work_sync(&kvp_host_handshake_work);
170         hv_poll_channel(kvp_transaction.recv_channel, kvp_poll_wrapper);
171
172         return 0;
173 }
174
175
176 /*
177  * Callback when data is received from user mode.
178  */
179
180 static int kvp_on_msg(void *msg, int len)
181 {
182         struct hv_kvp_msg *message = (struct hv_kvp_msg *)msg;
183         struct hv_kvp_msg_enumerate *data;
184         int     error = 0;
185
186         if (len < sizeof(*message))
187                 return -EINVAL;
188
189         /*
190          * If we are negotiating the version information
191          * with the daemon; handle that first.
192          */
193
194         if (kvp_transaction.state < HVUTIL_READY) {
195                 return kvp_handle_handshake(message);
196         }
197
198         /* We didn't send anything to userspace so the reply is spurious */
199         if (kvp_transaction.state < HVUTIL_USERSPACE_REQ)
200                 return -EINVAL;
201
202         kvp_transaction.state = HVUTIL_USERSPACE_RECV;
203
204         /*
205          * Based on the version of the daemon, we propagate errors from the
206          * daemon differently.
207          */
208
209         data = &message->body.kvp_enum_data;
210
211         switch (dm_reg_value) {
212         case KVP_OP_REGISTER:
213                 /*
214                  * Null string is used to pass back error condition.
215                  */
216                 if (data->data.key[0] == 0)
217                         error = HV_S_CONT;
218                 break;
219
220         case KVP_OP_REGISTER1:
221                 /*
222                  * We use the message header information from
223                  * the user level daemon to transmit errors.
224                  */
225                 error = message->error;
226                 break;
227         }
228
229         /*
230          * Complete the transaction by forwarding the key value
231          * to the host. But first, cancel the timeout.
232          */
233         if (cancel_delayed_work_sync(&kvp_timeout_work)) {
234                 kvp_respond_to_host(message, error);
235                 hv_poll_channel(kvp_transaction.recv_channel, kvp_poll_wrapper);
236         }
237
238         return 0;
239 }
240
241
242 static int process_ob_ipinfo(void *in_msg, void *out_msg, int op)
243 {
244         struct hv_kvp_msg *in = in_msg;
245         struct hv_kvp_ip_msg *out = out_msg;
246         int len;
247
248         switch (op) {
249         case KVP_OP_GET_IP_INFO:
250                 /*
251                  * Transform all parameters into utf16 encoding.
252                  */
253                 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.ip_addr,
254                                 strlen((char *)in->body.kvp_ip_val.ip_addr),
255                                 UTF16_HOST_ENDIAN,
256                                 (wchar_t *)out->kvp_ip_val.ip_addr,
257                                 MAX_IP_ADDR_SIZE);
258                 if (len < 0)
259                         return len;
260
261                 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.sub_net,
262                                 strlen((char *)in->body.kvp_ip_val.sub_net),
263                                 UTF16_HOST_ENDIAN,
264                                 (wchar_t *)out->kvp_ip_val.sub_net,
265                                 MAX_IP_ADDR_SIZE);
266                 if (len < 0)
267                         return len;
268
269                 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.gate_way,
270                                 strlen((char *)in->body.kvp_ip_val.gate_way),
271                                 UTF16_HOST_ENDIAN,
272                                 (wchar_t *)out->kvp_ip_val.gate_way,
273                                 MAX_GATEWAY_SIZE);
274                 if (len < 0)
275                         return len;
276
277                 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.dns_addr,
278                                 strlen((char *)in->body.kvp_ip_val.dns_addr),
279                                 UTF16_HOST_ENDIAN,
280                                 (wchar_t *)out->kvp_ip_val.dns_addr,
281                                 MAX_IP_ADDR_SIZE);
282                 if (len < 0)
283                         return len;
284
285                 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.adapter_id,
286                                 strlen((char *)in->body.kvp_ip_val.adapter_id),
287                                 UTF16_HOST_ENDIAN,
288                                 (wchar_t *)out->kvp_ip_val.adapter_id,
289                                 MAX_IP_ADDR_SIZE);
290                 if (len < 0)
291                         return len;
292
293                 out->kvp_ip_val.dhcp_enabled =
294                         in->body.kvp_ip_val.dhcp_enabled;
295                 out->kvp_ip_val.addr_family =
296                         in->body.kvp_ip_val.addr_family;
297         }
298
299         return 0;
300 }
301
302 static void process_ib_ipinfo(void *in_msg, void *out_msg, int op)
303 {
304         struct hv_kvp_ip_msg *in = in_msg;
305         struct hv_kvp_msg *out = out_msg;
306
307         switch (op) {
308         case KVP_OP_SET_IP_INFO:
309                 /*
310                  * Transform all parameters into utf8 encoding.
311                  */
312                 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.ip_addr,
313                                 MAX_IP_ADDR_SIZE,
314                                 UTF16_LITTLE_ENDIAN,
315                                 (__u8 *)out->body.kvp_ip_val.ip_addr,
316                                 MAX_IP_ADDR_SIZE);
317
318                 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.sub_net,
319                                 MAX_IP_ADDR_SIZE,
320                                 UTF16_LITTLE_ENDIAN,
321                                 (__u8 *)out->body.kvp_ip_val.sub_net,
322                                 MAX_IP_ADDR_SIZE);
323
324                 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.gate_way,
325                                 MAX_GATEWAY_SIZE,
326                                 UTF16_LITTLE_ENDIAN,
327                                 (__u8 *)out->body.kvp_ip_val.gate_way,
328                                 MAX_GATEWAY_SIZE);
329
330                 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.dns_addr,
331                                 MAX_IP_ADDR_SIZE,
332                                 UTF16_LITTLE_ENDIAN,
333                                 (__u8 *)out->body.kvp_ip_val.dns_addr,
334                                 MAX_IP_ADDR_SIZE);
335
336                 out->body.kvp_ip_val.dhcp_enabled = in->kvp_ip_val.dhcp_enabled;
337
338         default:
339                 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.adapter_id,
340                                 MAX_ADAPTER_ID_SIZE,
341                                 UTF16_LITTLE_ENDIAN,
342                                 (__u8 *)out->body.kvp_ip_val.adapter_id,
343                                 MAX_ADAPTER_ID_SIZE);
344
345                 out->body.kvp_ip_val.addr_family = in->kvp_ip_val.addr_family;
346         }
347 }
348
349
350
351
352 static void
353 kvp_send_key(struct work_struct *dummy)
354 {
355         struct hv_kvp_msg *message;
356         struct hv_kvp_msg *in_msg;
357         __u8 operation = kvp_transaction.kvp_msg->kvp_hdr.operation;
358         __u8 pool = kvp_transaction.kvp_msg->kvp_hdr.pool;
359         __u32 val32;
360         __u64 val64;
361         int rc;
362
363         /* The transaction state is wrong. */
364         if (kvp_transaction.state != HVUTIL_HOSTMSG_RECEIVED)
365                 return;
366
367         message = kzalloc(sizeof(*message), GFP_KERNEL);
368         if (!message)
369                 return;
370
371         message->kvp_hdr.operation = operation;
372         message->kvp_hdr.pool = pool;
373         in_msg = kvp_transaction.kvp_msg;
374
375         /*
376          * The key/value strings sent from the host are encoded in
377          * in utf16; convert it to utf8 strings.
378          * The host assures us that the utf16 strings will not exceed
379          * the max lengths specified. We will however, reserve room
380          * for the string terminating character - in the utf16s_utf8s()
381          * function we limit the size of the buffer where the converted
382          * string is placed to HV_KVP_EXCHANGE_MAX_*_SIZE -1 to gaurantee
383          * that the strings can be properly terminated!
384          */
385
386         switch (message->kvp_hdr.operation) {
387         case KVP_OP_SET_IP_INFO:
388                 process_ib_ipinfo(in_msg, message, KVP_OP_SET_IP_INFO);
389                 break;
390         case KVP_OP_GET_IP_INFO:
391                 process_ib_ipinfo(in_msg, message, KVP_OP_GET_IP_INFO);
392                 break;
393         case KVP_OP_SET:
394                 switch (in_msg->body.kvp_set.data.value_type) {
395                 case REG_SZ:
396                         /*
397                          * The value is a string - utf16 encoding.
398                          */
399                         message->body.kvp_set.data.value_size =
400                                 utf16s_to_utf8s(
401                                 (wchar_t *)in_msg->body.kvp_set.data.value,
402                                 in_msg->body.kvp_set.data.value_size,
403                                 UTF16_LITTLE_ENDIAN,
404                                 message->body.kvp_set.data.value,
405                                 HV_KVP_EXCHANGE_MAX_VALUE_SIZE - 1) + 1;
406                                 break;
407
408                 case REG_U32:
409                         /*
410                          * The value is a 32 bit scalar.
411                          * We save this as a utf8 string.
412                          */
413                         val32 = in_msg->body.kvp_set.data.value_u32;
414                         message->body.kvp_set.data.value_size =
415                                 sprintf(message->body.kvp_set.data.value,
416                                         "%d", val32) + 1;
417                         break;
418
419                 case REG_U64:
420                         /*
421                          * The value is a 64 bit scalar.
422                          * We save this as a utf8 string.
423                          */
424                         val64 = in_msg->body.kvp_set.data.value_u64;
425                         message->body.kvp_set.data.value_size =
426                                 sprintf(message->body.kvp_set.data.value,
427                                         "%llu", val64) + 1;
428                         break;
429
430                 }
431         case KVP_OP_GET:
432                 message->body.kvp_set.data.key_size =
433                         utf16s_to_utf8s(
434                         (wchar_t *)in_msg->body.kvp_set.data.key,
435                         in_msg->body.kvp_set.data.key_size,
436                         UTF16_LITTLE_ENDIAN,
437                         message->body.kvp_set.data.key,
438                         HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1;
439                         break;
440
441         case KVP_OP_DELETE:
442                 message->body.kvp_delete.key_size =
443                         utf16s_to_utf8s(
444                         (wchar_t *)in_msg->body.kvp_delete.key,
445                         in_msg->body.kvp_delete.key_size,
446                         UTF16_LITTLE_ENDIAN,
447                         message->body.kvp_delete.key,
448                         HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1;
449                         break;
450
451         case KVP_OP_ENUMERATE:
452                 message->body.kvp_enum_data.index =
453                         in_msg->body.kvp_enum_data.index;
454                         break;
455         }
456
457         kvp_transaction.state = HVUTIL_USERSPACE_REQ;
458         rc = hvutil_transport_send(hvt, message, sizeof(*message));
459         if (rc) {
460                 pr_debug("KVP: failed to communicate to the daemon: %d\n", rc);
461                 if (cancel_delayed_work_sync(&kvp_timeout_work)) {
462                         kvp_respond_to_host(message, HV_E_FAIL);
463                         kvp_transaction.state = HVUTIL_READY;
464                 }
465         }
466
467         kfree(message);
468
469         return;
470 }
471
472 /*
473  * Send a response back to the host.
474  */
475
476 static void
477 kvp_respond_to_host(struct hv_kvp_msg *msg_to_host, int error)
478 {
479         struct hv_kvp_msg  *kvp_msg;
480         struct hv_kvp_exchg_msg_value  *kvp_data;
481         char    *key_name;
482         char    *value;
483         struct icmsg_hdr *icmsghdrp;
484         int     keylen = 0;
485         int     valuelen = 0;
486         u32     buf_len;
487         struct vmbus_channel *channel;
488         u64     req_id;
489         int ret;
490
491         /*
492          * Copy the global state for completing the transaction. Note that
493          * only one transaction can be active at a time.
494          */
495
496         buf_len = kvp_transaction.recv_len;
497         channel = kvp_transaction.recv_channel;
498         req_id = kvp_transaction.recv_req_id;
499
500         icmsghdrp = (struct icmsg_hdr *)
501                         &recv_buffer[sizeof(struct vmbuspipe_hdr)];
502
503         if (channel->onchannel_callback == NULL)
504                 /*
505                  * We have raced with util driver being unloaded;
506                  * silently return.
507                  */
508                 return;
509
510         icmsghdrp->status = error;
511
512         /*
513          * If the error parameter is set, terminate the host's enumeration
514          * on this pool.
515          */
516         if (error) {
517                 /*
518                  * Something failed or we have timedout;
519                  * terminate the current host-side iteration.
520                  */
521                 goto response_done;
522         }
523
524         kvp_msg = (struct hv_kvp_msg *)
525                         &recv_buffer[sizeof(struct vmbuspipe_hdr) +
526                         sizeof(struct icmsg_hdr)];
527
528         switch (kvp_transaction.kvp_msg->kvp_hdr.operation) {
529         case KVP_OP_GET_IP_INFO:
530                 ret = process_ob_ipinfo(msg_to_host,
531                                  (struct hv_kvp_ip_msg *)kvp_msg,
532                                  KVP_OP_GET_IP_INFO);
533                 if (ret < 0)
534                         icmsghdrp->status = HV_E_FAIL;
535
536                 goto response_done;
537         case KVP_OP_SET_IP_INFO:
538                 goto response_done;
539         case KVP_OP_GET:
540                 kvp_data = &kvp_msg->body.kvp_get.data;
541                 goto copy_value;
542
543         case KVP_OP_SET:
544         case KVP_OP_DELETE:
545                 goto response_done;
546
547         default:
548                 break;
549         }
550
551         kvp_data = &kvp_msg->body.kvp_enum_data.data;
552         key_name = msg_to_host->body.kvp_enum_data.data.key;
553
554         /*
555          * The windows host expects the key/value pair to be encoded
556          * in utf16. Ensure that the key/value size reported to the host
557          * will be less than or equal to the MAX size (including the
558          * terminating character).
559          */
560         keylen = utf8s_to_utf16s(key_name, strlen(key_name), UTF16_HOST_ENDIAN,
561                                 (wchar_t *) kvp_data->key,
562                                 (HV_KVP_EXCHANGE_MAX_KEY_SIZE / 2) - 2);
563         kvp_data->key_size = 2*(keylen + 1); /* utf16 encoding */
564
565 copy_value:
566         value = msg_to_host->body.kvp_enum_data.data.value;
567         valuelen = utf8s_to_utf16s(value, strlen(value), UTF16_HOST_ENDIAN,
568                                 (wchar_t *) kvp_data->value,
569                                 (HV_KVP_EXCHANGE_MAX_VALUE_SIZE / 2) - 2);
570         kvp_data->value_size = 2*(valuelen + 1); /* utf16 encoding */
571
572         /*
573          * If the utf8s to utf16s conversion failed; notify host
574          * of the error.
575          */
576         if ((keylen < 0) || (valuelen < 0))
577                 icmsghdrp->status = HV_E_FAIL;
578
579         kvp_data->value_type = REG_SZ; /* all our values are strings */
580
581 response_done:
582         icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION | ICMSGHDRFLAG_RESPONSE;
583
584         vmbus_sendpacket(channel, recv_buffer, buf_len, req_id,
585                                 VM_PKT_DATA_INBAND, 0);
586 }
587
588 /*
589  * This callback is invoked when we get a KVP message from the host.
590  * The host ensures that only one KVP transaction can be active at a time.
591  * KVP implementation in Linux needs to forward the key to a user-mde
592  * component to retrive the corresponding value. Consequently, we cannot
593  * respond to the host in the conext of this callback. Since the host
594  * guarantees that at most only one transaction can be active at a time,
595  * we stash away the transaction state in a set of global variables.
596  */
597
598 void hv_kvp_onchannelcallback(void *context)
599 {
600         struct vmbus_channel *channel = context;
601         u32 recvlen;
602         u64 requestid;
603
604         struct hv_kvp_msg *kvp_msg;
605
606         struct icmsg_hdr *icmsghdrp;
607         struct icmsg_negotiate *negop = NULL;
608         int util_fw_version;
609         int kvp_srv_version;
610         static enum {NEGO_NOT_STARTED,
611                      NEGO_IN_PROGRESS,
612                      NEGO_FINISHED} host_negotiatied = NEGO_NOT_STARTED;
613
614         if (host_negotiatied == NEGO_NOT_STARTED &&
615             kvp_transaction.state < HVUTIL_READY) {
616                 /*
617                  * If userspace daemon is not connected and host is asking
618                  * us to negotiate we need to delay to not lose messages.
619                  * This is important for Failover IP setting.
620                  */
621                 host_negotiatied = NEGO_IN_PROGRESS;
622                 schedule_delayed_work(&kvp_host_handshake_work,
623                                       HV_UTIL_NEGO_TIMEOUT * HZ);
624                 return;
625         }
626         if (kvp_transaction.state > HVUTIL_READY)
627                 return;
628
629         vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 4, &recvlen,
630                          &requestid);
631
632         if (recvlen > 0) {
633                 icmsghdrp = (struct icmsg_hdr *)&recv_buffer[
634                         sizeof(struct vmbuspipe_hdr)];
635
636                 if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) {
637                         /*
638                          * Based on the host, select appropriate
639                          * framework and service versions we will
640                          * negotiate.
641                          */
642                         switch (vmbus_proto_version) {
643                         case (VERSION_WS2008):
644                                 util_fw_version = UTIL_WS2K8_FW_VERSION;
645                                 kvp_srv_version = WS2008_SRV_VERSION;
646                                 break;
647                         case (VERSION_WIN7):
648                                 util_fw_version = UTIL_FW_VERSION;
649                                 kvp_srv_version = WIN7_SRV_VERSION;
650                                 break;
651                         default:
652                                 util_fw_version = UTIL_FW_VERSION;
653                                 kvp_srv_version = WIN8_SRV_VERSION;
654                         }
655                         vmbus_prep_negotiate_resp(icmsghdrp, negop,
656                                  recv_buffer, util_fw_version,
657                                  kvp_srv_version);
658
659                 } else {
660                         kvp_msg = (struct hv_kvp_msg *)&recv_buffer[
661                                 sizeof(struct vmbuspipe_hdr) +
662                                 sizeof(struct icmsg_hdr)];
663
664                         /*
665                          * Stash away this global state for completing the
666                          * transaction; note transactions are serialized.
667                          */
668
669                         kvp_transaction.recv_len = recvlen;
670                         kvp_transaction.recv_req_id = requestid;
671                         kvp_transaction.kvp_msg = kvp_msg;
672
673                         if (kvp_transaction.state < HVUTIL_READY) {
674                                 /* Userspace is not registered yet */
675                                 kvp_respond_to_host(NULL, HV_E_FAIL);
676                                 return;
677                         }
678                         kvp_transaction.state = HVUTIL_HOSTMSG_RECEIVED;
679
680                         /*
681                          * Get the information from the
682                          * user-mode component.
683                          * component. This transaction will be
684                          * completed when we get the value from
685                          * the user-mode component.
686                          * Set a timeout to deal with
687                          * user-mode not responding.
688                          */
689                         schedule_work(&kvp_sendkey_work);
690                         schedule_delayed_work(&kvp_timeout_work,
691                                               HV_UTIL_TIMEOUT * HZ);
692
693                         return;
694
695                 }
696
697                 icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION
698                         | ICMSGHDRFLAG_RESPONSE;
699
700                 vmbus_sendpacket(channel, recv_buffer,
701                                        recvlen, requestid,
702                                        VM_PKT_DATA_INBAND, 0);
703
704                 host_negotiatied = NEGO_FINISHED;
705         }
706
707 }
708
709 static void kvp_on_reset(void)
710 {
711         if (cancel_delayed_work_sync(&kvp_timeout_work))
712                 kvp_respond_to_host(NULL, HV_E_FAIL);
713         kvp_transaction.state = HVUTIL_DEVICE_INIT;
714 }
715
716 int
717 hv_kvp_init(struct hv_util_service *srv)
718 {
719         recv_buffer = srv->recv_buffer;
720         kvp_transaction.recv_channel = srv->channel;
721
722         /*
723          * When this driver loads, the user level daemon that
724          * processes the host requests may not yet be running.
725          * Defer processing channel callbacks until the daemon
726          * has registered.
727          */
728         kvp_transaction.state = HVUTIL_DEVICE_INIT;
729
730         hvt = hvutil_transport_init(kvp_devname, CN_KVP_IDX, CN_KVP_VAL,
731                                     kvp_on_msg, kvp_on_reset);
732         if (!hvt)
733                 return -EFAULT;
734
735         return 0;
736 }
737
738 void hv_kvp_deinit(void)
739 {
740         kvp_transaction.state = HVUTIL_DEVICE_DYING;
741         cancel_delayed_work_sync(&kvp_host_handshake_work);
742         cancel_delayed_work_sync(&kvp_timeout_work);
743         cancel_work_sync(&kvp_sendkey_work);
744         hvutil_transport_destroy(hvt);
745 }