Merge tag 'JH7110_515_SDK_v4.0.0-rc1' into vf2-515-devel
[platform/kernel/linux-starfive.git] / drivers / net / wireless / eswin / ecrnx_cmds.h
1 /**
2  ******************************************************************************
3  *
4  * ecrnx_cmds.h
5  *
6  * Copyright (C) ESWIN 2015-2020
7  *
8  ******************************************************************************
9  */
10
11 #ifndef _ECRNX_CMDS_H_
12 #define _ECRNX_CMDS_H_
13
14 #include <linux/spinlock.h>
15 #include <linux/completion.h>
16 #include "lmac_msg.h"
17
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)
22 #else
23 #define ECRNX_80211_CMD_TIMEOUT_MS    (20 * 300) //300
24 #endif
25
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)))
36
37 #define ECRNX_CMD_MAX_QUEUED         8
38
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;
46
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)
53
54 #endif /* CONFIG_ECRNX_FHOST*/
55
56 struct ecrnx_hw;
57 struct ecrnx_cmd;
58 typedef int (*msg_cb_fct)(struct ecrnx_hw *ecrnx_hw, struct ecrnx_cmd *cmd,
59                           struct ecrnx_cmd_e2amsg *msg);
60
61 enum ecrnx_cmd_mgr_state {
62     ECRNX_CMD_MGR_STATE_DEINIT,
63     ECRNX_CMD_MGR_STATE_INITED,
64     ECRNX_CMD_MGR_STATE_CRASHED,
65 };
66
67 struct ecrnx_cmd {
68     struct list_head list;
69     lmac_msg_id_t id;
70     lmac_msg_id_t reqid;
71     struct ecrnx_cmd_a2emsg *a2e_msg;
72     char *e2a_msg;
73     u32 tkn;
74     u16 flags;
75
76     struct completion complete;
77     u32 result;
78     #ifdef CONFIG_ECRNX_FHOST
79     struct ecrnx_term_stream *stream;
80     #endif
81 };
82
83 struct ecrnx_cmd_mgr {
84     enum ecrnx_cmd_mgr_state state;
85     spinlock_t lock;
86     u32 next_tkn;
87     u32 queue_sz;
88     u32 max_queue_sz;
89
90     struct list_head cmds;
91
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 *);
97 };
98
99 void ecrnx_cmd_mgr_init(struct ecrnx_cmd_mgr *cmd_mgr);
100 void ecrnx_cmd_mgr_deinit(struct ecrnx_cmd_mgr *cmd_mgr);
101
102 #endif /* _ECRNX_CMDS_H_ */