xref: /linux/drivers/misc/issei/host_client.h (revision 93e4b3076b5f2d853462b9777d083c77fc0b7b23)
1*2207e8d4SAlexander Usyskin /* SPDX-License-Identifier: GPL-2.0 */
2*2207e8d4SAlexander Usyskin /* Copyright (C) 2023-2026 Intel Corporation */
3*2207e8d4SAlexander Usyskin #ifndef _ISSEI_HOST_CLIENT_H_
4*2207e8d4SAlexander Usyskin #define _ISSEI_HOST_CLIENT_H_
5*2207e8d4SAlexander Usyskin 
6*2207e8d4SAlexander Usyskin #include <linux/types.h>
7*2207e8d4SAlexander Usyskin #include <linux/uuid.h>
8*2207e8d4SAlexander Usyskin #include <linux/wait.h>
9*2207e8d4SAlexander Usyskin 
10*2207e8d4SAlexander Usyskin struct file;
11*2207e8d4SAlexander Usyskin 
12*2207e8d4SAlexander Usyskin struct issei_device;
13*2207e8d4SAlexander Usyskin struct issei_fw_client;
14*2207e8d4SAlexander Usyskin 
15*2207e8d4SAlexander Usyskin /**
16*2207e8d4SAlexander Usyskin  * enum issei_host_client_state - host client states
17*2207e8d4SAlexander Usyskin  * @ISSEI_HOST_CL_STATE_DISCONNECTED: host client is disconnected
18*2207e8d4SAlexander Usyskin  * @ISSEI_HOST_CL_STATE_CONNECTED: host client is connected
19*2207e8d4SAlexander Usyskin  */
20*2207e8d4SAlexander Usyskin enum issei_host_client_state {
21*2207e8d4SAlexander Usyskin 	ISSEI_HOST_CL_STATE_DISCONNECTED,
22*2207e8d4SAlexander Usyskin 	ISSEI_HOST_CL_STATE_CONNECTED,
23*2207e8d4SAlexander Usyskin };
24*2207e8d4SAlexander Usyskin 
25*2207e8d4SAlexander Usyskin /**
26*2207e8d4SAlexander Usyskin  * struct issei_host_client - represents host client
27*2207e8d4SAlexander Usyskin  * @list: link in host clients list
28*2207e8d4SAlexander Usyskin  * @idev: issei parent device
29*2207e8d4SAlexander Usyskin  * @id: host client id
30*2207e8d4SAlexander Usyskin  * @fp: file associated with client
31*2207e8d4SAlexander Usyskin  *
32*2207e8d4SAlexander Usyskin  * @write_wait: waitqueue for pending write data
33*2207e8d4SAlexander Usyskin  * @write_in_progress: indicator for write in process
34*2207e8d4SAlexander Usyskin  *
35*2207e8d4SAlexander Usyskin  * @state: host client state
36*2207e8d4SAlexander Usyskin  * @fw_cl: pointer to firmware client, if connected
37*2207e8d4SAlexander Usyskin  *
38*2207e8d4SAlexander Usyskin  * @read_wait: waitqueue for read object
39*2207e8d4SAlexander Usyskin  * @read_data: received data pointer
40*2207e8d4SAlexander Usyskin  * @read_data_size: received data size
41*2207e8d4SAlexander Usyskin  */
42*2207e8d4SAlexander Usyskin struct issei_host_client {
43*2207e8d4SAlexander Usyskin 	struct list_head list;
44*2207e8d4SAlexander Usyskin 	struct issei_device *idev;
45*2207e8d4SAlexander Usyskin 	u16 id;
46*2207e8d4SAlexander Usyskin 	const struct file *fp;
47*2207e8d4SAlexander Usyskin 
48*2207e8d4SAlexander Usyskin 	wait_queue_head_t write_wait;
49*2207e8d4SAlexander Usyskin 	bool write_in_progress;
50*2207e8d4SAlexander Usyskin 
51*2207e8d4SAlexander Usyskin 	enum issei_host_client_state state;
52*2207e8d4SAlexander Usyskin 	struct issei_fw_client *fw_cl;
53*2207e8d4SAlexander Usyskin 
54*2207e8d4SAlexander Usyskin 	wait_queue_head_t read_wait;
55*2207e8d4SAlexander Usyskin 	u8 *read_data;
56*2207e8d4SAlexander Usyskin 	size_t read_data_size;
57*2207e8d4SAlexander Usyskin };
58*2207e8d4SAlexander Usyskin 
59*2207e8d4SAlexander Usyskin struct issei_host_client *issei_cl_create(struct issei_device *idev, struct file *fp);
60*2207e8d4SAlexander Usyskin void issei_cl_remove(struct issei_host_client *cl);
61*2207e8d4SAlexander Usyskin 
62*2207e8d4SAlexander Usyskin int issei_cl_connect(struct issei_host_client *cl, const uuid_t *uuid, u32 *mtu, u8 *ver,
63*2207e8d4SAlexander Usyskin 		     u32 *flags);
64*2207e8d4SAlexander Usyskin int issei_cl_disconnect(struct issei_host_client *cl);
65*2207e8d4SAlexander Usyskin void issei_cl_all_disconnect(struct issei_device *idev);
66*2207e8d4SAlexander Usyskin 
67*2207e8d4SAlexander Usyskin ssize_t issei_cl_write(struct issei_host_client *cl, const u8 *buf, size_t buf_size);
68*2207e8d4SAlexander Usyskin int issei_cl_write_from_queue(struct issei_device *idev);
69*2207e8d4SAlexander Usyskin int issei_cl_read_buf(struct issei_device *idev, u16 fw_id, u16 host_id, u8 *buf, size_t buf_size);
70*2207e8d4SAlexander Usyskin ssize_t issei_cl_read(struct issei_host_client *cl, u8 **buf, size_t buf_size);
71*2207e8d4SAlexander Usyskin int issei_cl_check_read(struct issei_host_client *cl);
72*2207e8d4SAlexander Usyskin int issei_cl_check_write(struct issei_host_client *cl);
73*2207e8d4SAlexander Usyskin void issei_cl_clean_all_wbuf(struct issei_host_client *cl);
74*2207e8d4SAlexander Usyskin 
75*2207e8d4SAlexander Usyskin #endif /* ISSEI_HOST_CLIENT_H_ */
76