162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Kernel/userspace transport abstraction for Hyper-V util driver. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015, Vitaly Kuznetsov <vkuznets@redhat.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _HV_UTILS_TRANSPORT_H 962306a36Sopenharmony_ci#define _HV_UTILS_TRANSPORT_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/connector.h> 1262306a36Sopenharmony_ci#include <linux/miscdevice.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cienum hvutil_transport_mode { 1562306a36Sopenharmony_ci HVUTIL_TRANSPORT_INIT = 0, 1662306a36Sopenharmony_ci HVUTIL_TRANSPORT_NETLINK, 1762306a36Sopenharmony_ci HVUTIL_TRANSPORT_CHARDEV, 1862306a36Sopenharmony_ci HVUTIL_TRANSPORT_DESTROY, 1962306a36Sopenharmony_ci}; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct hvutil_transport { 2262306a36Sopenharmony_ci int mode; /* hvutil_transport_mode */ 2362306a36Sopenharmony_ci struct file_operations fops; /* file operations */ 2462306a36Sopenharmony_ci struct miscdevice mdev; /* misc device */ 2562306a36Sopenharmony_ci struct cb_id cn_id; /* CN_*_IDX/CN_*_VAL */ 2662306a36Sopenharmony_ci struct list_head list; /* hvt_list */ 2762306a36Sopenharmony_ci int (*on_msg)(void *, int); /* callback on new user message */ 2862306a36Sopenharmony_ci void (*on_reset)(void); /* callback when userspace drops */ 2962306a36Sopenharmony_ci void (*on_read)(void); /* callback on message read */ 3062306a36Sopenharmony_ci u8 *outmsg; /* message to the userspace */ 3162306a36Sopenharmony_ci int outmsg_len; /* its length */ 3262306a36Sopenharmony_ci wait_queue_head_t outmsg_q; /* poll/read wait queue */ 3362306a36Sopenharmony_ci struct mutex lock; /* protects struct members */ 3462306a36Sopenharmony_ci struct completion release; /* synchronize with fd release */ 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistruct hvutil_transport *hvutil_transport_init(const char *name, 3862306a36Sopenharmony_ci u32 cn_idx, u32 cn_val, 3962306a36Sopenharmony_ci int (*on_msg)(void *, int), 4062306a36Sopenharmony_ci void (*on_reset)(void)); 4162306a36Sopenharmony_ciint hvutil_transport_send(struct hvutil_transport *hvt, void *msg, int len, 4262306a36Sopenharmony_ci void (*on_read_cb)(void)); 4362306a36Sopenharmony_civoid hvutil_transport_destroy(struct hvutil_transport *hvt); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#endif /* _HV_UTILS_TRANSPORT_H */ 46