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