xref: /OK3568_Linux_fs/kernel/drivers/hv/hv_utils_transport.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Kernel/userspace transport abstraction for Hyper-V util driver.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2015, Vitaly Kuznetsov <vkuznets@redhat.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _HV_UTILS_TRANSPORT_H
9*4882a593Smuzhiyun #define _HV_UTILS_TRANSPORT_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/connector.h>
12*4882a593Smuzhiyun #include <linux/miscdevice.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun enum hvutil_transport_mode {
15*4882a593Smuzhiyun 	HVUTIL_TRANSPORT_INIT = 0,
16*4882a593Smuzhiyun 	HVUTIL_TRANSPORT_NETLINK,
17*4882a593Smuzhiyun 	HVUTIL_TRANSPORT_CHARDEV,
18*4882a593Smuzhiyun 	HVUTIL_TRANSPORT_DESTROY,
19*4882a593Smuzhiyun };
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun struct hvutil_transport {
22*4882a593Smuzhiyun 	int mode;                           /* hvutil_transport_mode */
23*4882a593Smuzhiyun 	struct file_operations fops;        /* file operations */
24*4882a593Smuzhiyun 	struct miscdevice mdev;             /* misc device */
25*4882a593Smuzhiyun 	struct cb_id cn_id;                 /* CN_*_IDX/CN_*_VAL */
26*4882a593Smuzhiyun 	struct list_head list;              /* hvt_list */
27*4882a593Smuzhiyun 	int (*on_msg)(void *, int);         /* callback on new user message */
28*4882a593Smuzhiyun 	void (*on_reset)(void);             /* callback when userspace drops */
29*4882a593Smuzhiyun 	void (*on_read)(void);              /* callback on message read */
30*4882a593Smuzhiyun 	u8 *outmsg;                         /* message to the userspace */
31*4882a593Smuzhiyun 	int outmsg_len;                     /* its length */
32*4882a593Smuzhiyun 	wait_queue_head_t outmsg_q;         /* poll/read wait queue */
33*4882a593Smuzhiyun 	struct mutex lock;                  /* protects struct members */
34*4882a593Smuzhiyun 	struct completion release;          /* synchronize with fd release */
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct hvutil_transport *hvutil_transport_init(const char *name,
38*4882a593Smuzhiyun 					       u32 cn_idx, u32 cn_val,
39*4882a593Smuzhiyun 					       int (*on_msg)(void *, int),
40*4882a593Smuzhiyun 					       void (*on_reset)(void));
41*4882a593Smuzhiyun int hvutil_transport_send(struct hvutil_transport *hvt, void *msg, int len,
42*4882a593Smuzhiyun 			  void (*on_read_cb)(void));
43*4882a593Smuzhiyun void hvutil_transport_destroy(struct hvutil_transport *hvt);
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #endif /* _HV_UTILS_TRANSPORT_H */
46