2 ******************************************************************************
6 * Copyright (C) ESWIN 2015-2020
8 ******************************************************************************
11 #ifndef _ECRNX_CMDS_H_
12 #define _ECRNX_CMDS_H_
14 #include <linux/spinlock.h>
15 #include <linux/completion.h>
18 #ifdef CONFIG_ECRNX_SDM
19 #define ECRNX_80211_CMD_TIMEOUT_MS (20 * 300)
20 #elif defined(CONFIG_ECRNX_FHOST)
21 #define ECRNX_80211_CMD_TIMEOUT_MS (10000)
23 #define ECRNX_80211_CMD_TIMEOUT_MS (20 * 300) //300
26 #define ECRNX_CMD_FLAG_NONBLOCK BIT(0)
27 #define ECRNX_CMD_FLAG_REQ_CFM BIT(1)
28 #define ECRNX_CMD_FLAG_WAIT_PUSH BIT(2)
29 #define ECRNX_CMD_FLAG_WAIT_ACK BIT(3)
30 #define ECRNX_CMD_FLAG_WAIT_CFM BIT(4)
31 #define ECRNX_CMD_FLAG_DONE BIT(5)
32 /* ATM IPC design makes it possible to get the CFM before the ACK,
33 * otherwise this could have simply been a state enum */
34 #define ECRNX_CMD_WAIT_COMPLETE(flags) \
35 (!(flags & (ECRNX_CMD_FLAG_WAIT_ACK | ECRNX_CMD_FLAG_WAIT_CFM)))
37 #define ECRNX_CMD_MAX_QUEUED 8
39 #ifdef CONFIG_ECRNX_FHOST
40 #include "ipc_fhost.h"
41 #define ecrnx_cmd_e2amsg ipc_fhost_msg
42 #define ecrnx_cmd_a2emsg ipc_fhost_msg
43 #define ECRNX_CMD_A2EMSG_LEN(m) (m->param_len)
44 #define ECRNX_CMD_E2AMSG_LEN_MAX IPC_FHOST_MSG_BUF_SIZE
45 struct ecrnx_term_stream;
47 #else /* !CONFIG_ECRNX_FHOST*/
48 #include "ipc_shared.h"
49 #define ecrnx_cmd_e2amsg ipc_e2a_msg
50 #define ecrnx_cmd_a2emsg lmac_msg
51 #define ECRNX_CMD_A2EMSG_LEN(m) (sizeof(struct lmac_msg) + m->param_len)
52 #define ECRNX_CMD_E2AMSG_LEN_MAX (IPC_E2A_MSG_PARAM_SIZE * 4)
54 #endif /* CONFIG_ECRNX_FHOST*/
58 typedef int (*msg_cb_fct)(struct ecrnx_hw *ecrnx_hw, struct ecrnx_cmd *cmd,
59 struct ecrnx_cmd_e2amsg *msg);
61 enum ecrnx_cmd_mgr_state {
62 ECRNX_CMD_MGR_STATE_DEINIT,
63 ECRNX_CMD_MGR_STATE_INITED,
64 ECRNX_CMD_MGR_STATE_CRASHED,
68 struct list_head list;
71 struct ecrnx_cmd_a2emsg *a2e_msg;
76 struct completion complete;
78 #ifdef CONFIG_ECRNX_FHOST
79 struct ecrnx_term_stream *stream;
83 struct ecrnx_cmd_mgr {
84 enum ecrnx_cmd_mgr_state state;
90 struct list_head cmds;
92 int (*queue)(struct ecrnx_cmd_mgr *, struct ecrnx_cmd *);
93 int (*llind)(struct ecrnx_cmd_mgr *, struct ecrnx_cmd *);
94 int (*msgind)(struct ecrnx_cmd_mgr *, struct ecrnx_cmd_e2amsg *, msg_cb_fct);
95 void (*print)(struct ecrnx_cmd_mgr *);
96 void (*drain)(struct ecrnx_cmd_mgr *);
99 void ecrnx_cmd_mgr_init(struct ecrnx_cmd_mgr *cmd_mgr);
100 void ecrnx_cmd_mgr_deinit(struct ecrnx_cmd_mgr *cmd_mgr);
102 #endif /* _ECRNX_CMDS_H_ */