1*43aa3132SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 214b50f80SVitaly Kuznetsov /* 314b50f80SVitaly Kuznetsov * Kernel/userspace transport abstraction for Hyper-V util driver. 414b50f80SVitaly Kuznetsov * 514b50f80SVitaly Kuznetsov * Copyright (C) 2015, Vitaly Kuznetsov <vkuznets@redhat.com> 614b50f80SVitaly Kuznetsov */ 714b50f80SVitaly Kuznetsov 814b50f80SVitaly Kuznetsov #ifndef _HV_UTILS_TRANSPORT_H 914b50f80SVitaly Kuznetsov #define _HV_UTILS_TRANSPORT_H 1014b50f80SVitaly Kuznetsov 1114b50f80SVitaly Kuznetsov #include <linux/connector.h> 1214b50f80SVitaly Kuznetsov #include <linux/miscdevice.h> 1314b50f80SVitaly Kuznetsov 1414b50f80SVitaly Kuznetsov enum hvutil_transport_mode { 1514b50f80SVitaly Kuznetsov HVUTIL_TRANSPORT_INIT = 0, 1614b50f80SVitaly Kuznetsov HVUTIL_TRANSPORT_NETLINK, 1714b50f80SVitaly Kuznetsov HVUTIL_TRANSPORT_CHARDEV, 18a1502566SVitaly Kuznetsov HVUTIL_TRANSPORT_DESTROY, 1914b50f80SVitaly Kuznetsov }; 2014b50f80SVitaly Kuznetsov 2114b50f80SVitaly Kuznetsov struct hvutil_transport { 2214b50f80SVitaly Kuznetsov int mode; /* hvutil_transport_mode */ 2314b50f80SVitaly Kuznetsov struct file_operations fops; /* file operations */ 2414b50f80SVitaly Kuznetsov struct miscdevice mdev; /* misc device */ 2514b50f80SVitaly Kuznetsov struct cb_id cn_id; /* CN_*_IDX/CN_*_VAL */ 2614b50f80SVitaly Kuznetsov struct list_head list; /* hvt_list */ 2714b50f80SVitaly Kuznetsov int (*on_msg)(void *, int); /* callback on new user message */ 2814b50f80SVitaly Kuznetsov void (*on_reset)(void); /* callback when userspace drops */ 29e0fa3e5eSVitaly Kuznetsov void (*on_read)(void); /* callback on message read */ 3014b50f80SVitaly Kuznetsov u8 *outmsg; /* message to the userspace */ 3114b50f80SVitaly Kuznetsov int outmsg_len; /* its length */ 3214b50f80SVitaly Kuznetsov wait_queue_head_t outmsg_q; /* poll/read wait queue */ 33a72f3a4cSVitaly Kuznetsov struct mutex lock; /* protects struct members */ 34e9c18ae6SVitaly Kuznetsov struct completion release; /* synchronize with fd release */ 3514b50f80SVitaly Kuznetsov }; 3614b50f80SVitaly Kuznetsov 3714b50f80SVitaly Kuznetsov struct hvutil_transport *hvutil_transport_init(const char *name, 3814b50f80SVitaly Kuznetsov u32 cn_idx, u32 cn_val, 3914b50f80SVitaly Kuznetsov int (*on_msg)(void *, int), 4014b50f80SVitaly Kuznetsov void (*on_reset)(void)); 41e0fa3e5eSVitaly Kuznetsov int hvutil_transport_send(struct hvutil_transport *hvt, void *msg, int len, 42e0fa3e5eSVitaly Kuznetsov void (*on_read_cb)(void)); 4314b50f80SVitaly Kuznetsov void hvutil_transport_destroy(struct hvutil_transport *hvt); 4414b50f80SVitaly Kuznetsov 4514b50f80SVitaly Kuznetsov #endif /* _HV_UTILS_TRANSPORT_H */ 46