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