#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/completion.h>
#include <linux/hyperv.h>
#include <linux/serio.h>
#include <linux/slab.h>
#define SYNTH_KBD_VERSION_MAJOR …
#define SYNTH_KBD_VERSION_MINOR …
#define SYNTH_KBD_VERSION …
enum synth_kbd_msg_type { … };
struct synth_kbd_msg_hdr { … };
struct synth_kbd_msg { … };
synth_kbd_version;
struct synth_kbd_protocol_request { … };
#define PROTOCOL_ACCEPTED …
struct synth_kbd_protocol_response { … };
#define IS_UNICODE …
#define IS_BREAK …
#define IS_E0 …
#define IS_E1 …
struct synth_kbd_keystroke { … };
#define HK_MAXIMUM_MESSAGE_SIZE …
#define KBD_VSC_SEND_RING_BUFFER_SIZE …
#define KBD_VSC_RECV_RING_BUFFER_SIZE …
#define XTKBD_EMUL0 …
#define XTKBD_EMUL1 …
#define XTKBD_RELEASE …
struct hv_kbd_dev { … };
static void hv_kbd_on_receive(struct hv_device *hv_dev,
struct synth_kbd_msg *msg, u32 msg_length)
{ … }
static void hv_kbd_handle_received_packet(struct hv_device *hv_dev,
struct vmpacket_descriptor *desc,
u32 bytes_recvd,
u64 req_id)
{ … }
static void hv_kbd_on_channel_callback(void *context)
{ … }
static int hv_kbd_connect_to_vsp(struct hv_device *hv_dev)
{ … }
static int hv_kbd_start(struct serio *serio)
{ … }
static void hv_kbd_stop(struct serio *serio)
{ … }
static int hv_kbd_probe(struct hv_device *hv_dev,
const struct hv_vmbus_device_id *dev_id)
{ … }
static void hv_kbd_remove(struct hv_device *hv_dev)
{ … }
static int hv_kbd_suspend(struct hv_device *hv_dev)
{ … }
static int hv_kbd_resume(struct hv_device *hv_dev)
{ … }
static const struct hv_vmbus_device_id id_table[] = …;
MODULE_DEVICE_TABLE(vmbus, id_table);
static struct hv_driver hv_kbd_drv = …;
static int __init hv_kbd_init(void)
{ … }
static void __exit hv_kbd_exit(void)
{ … }
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;
module_init(…) …;
module_exit(hv_kbd_exit);