Merge tag 'kvm-x86-vmx-6.5' of https://github.com/kvm-x86/linux into HEAD
[linux-2.6-microblaze.git] / drivers / net / wwan / iosm / iosm_ipc_mux_codec.h
1 /* SPDX-License-Identifier: GPL-2.0-only
2  *
3  * Copyright (C) 2020-21 Intel Corporation.
4  */
5
6 #ifndef IOSM_IPC_MUX_CODEC_H
7 #define IOSM_IPC_MUX_CODEC_H
8
9 #include "iosm_ipc_mux.h"
10
11 /* Queue level size and reporting
12  * >1 is enable, 0 is disable
13  */
14 #define MUX_QUEUE_LEVEL 1
15
16 /* ADB finish timer value */
17 #define IOSM_AGGR_MUX_ADB_FINISH_TIMEOUT_NSEC (500 * 1000)
18
19 /* Enables the flow control (Flow is not allowed) */
20 #define IOSM_AGGR_MUX_CMD_FLOW_CTL_ENABLE 5
21
22 /* Disables the flow control (Flow is allowed) */
23 #define IOSM_AGGR_MUX_CMD_FLOW_CTL_DISABLE 6
24
25 /* ACK the flow control command. Shall have the same Transaction ID as the
26  * matching FLOW_CTL command
27  */
28 #define IOSM_AGGR_MUX_CMD_FLOW_CTL_ACK 7
29
30 /* Aggregation Protocol Command for report packet indicating link quality
31  */
32 #define IOSM_AGGR_MUX_CMD_LINK_STATUS_REPORT 8
33
34 /* Response to a report packet */
35 #define IOSM_AGGR_MUX_CMD_LINK_STATUS_REPORT_RESP 9
36
37 /* ACBH: Signature of the Aggregated Command Block Header. */
38 #define IOSM_AGGR_MUX_SIG_ACBH 0x48424341
39
40 /* ADTH: Signature of the Aggregated Datagram Table Header. */
41 #define IOSM_AGGR_MUX_SIG_ADTH 0x48544441
42
43 /* ADBH: Signature of the Aggregated Data Block Header. */
44 #define IOSM_AGGR_MUX_SIG_ADBH 0x48424441
45
46 /* ADGH: Signature of the Datagram Header. */
47 #define IOSM_AGGR_MUX_SIG_ADGH 0x48474441
48
49 /* Size of the buffer for the IP MUX commands. */
50 #define MUX_MAX_UL_ACB_BUF_SIZE 256
51
52 /* Maximum number of packets in a go per session */
53 #define MUX_MAX_UL_DG_ENTRIES 100
54
55 /* ADGH: Signature of the Datagram Header. */
56 #define MUX_SIG_ADGH 0x48474441
57
58 /* CMDH: Signature of the Command Header. */
59 #define MUX_SIG_CMDH 0x48444D43
60
61 /* QLTH: Signature of the Queue Level Table */
62 #define MUX_SIG_QLTH 0x48544C51
63
64 /* FCTH: Signature of the Flow Credit Table */
65 #define MUX_SIG_FCTH 0x48544346
66
67 /* MUX UL session threshold factor */
68 #define IPC_MEM_MUX_UL_SESS_FCOFF_THRESHOLD_FACTOR (4)
69
70 /* Size of the buffer for the IP MUX Lite data buffer. */
71 #define IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE (2 * 1024)
72
73 /* MUX UL session threshold in number of packets */
74 #define IPC_MEM_MUX_UL_SESS_FCON_THRESHOLD (64)
75
76 /* Default time out for sending IPC session commands like
77  * open session, close session etc
78  * unit : milliseconds
79  */
80 #define IPC_MUX_CMD_RUN_DEFAULT_TIMEOUT 1000 /* 1 second */
81
82 /* MUX UL flow control lower threshold in bytes */
83 #define IPC_MEM_MUX_UL_FLOWCTRL_LOW_B 10240 /* 10KB */
84
85 /* MUX UL flow control higher threshold in bytes (5ms worth of data)*/
86 #define IPC_MEM_MUX_UL_FLOWCTRL_HIGH_B (110 * 1024)
87
88 /**
89  * struct mux_cmdh - Structure of Command Header.
90  * @signature:          Signature of the Command Header.
91  * @cmd_len:            Length (in bytes) of the Aggregated Command Block.
92  * @if_id:              ID of the interface the commands in the table belong to.
93  * @reserved:           Reserved. Set to zero.
94  * @next_cmd_index:     Index (in bytes) to the next command in the buffer.
95  * @command_type:       Command Enum. See table Session Management chapter for
96  *                      details.
97  * @transaction_id:     The Transaction ID shall be unique to the command
98  * @param:              Optional parameters used with the command.
99  */
100 struct mux_cmdh {
101         __le32 signature;
102         __le16 cmd_len;
103         u8 if_id;
104         u8 reserved;
105         __le32 next_cmd_index;
106         __le32 command_type;
107         __le32 transaction_id;
108         union mux_cmd_param param;
109 };
110
111 /**
112  * struct mux_acbh -    Structure of the Aggregated Command Block Header.
113  * @signature:          Signature of the Aggregated Command Block Header.
114  * @reserved:           Reserved bytes. Set to zero.
115  * @sequence_nr:        Block sequence number.
116  * @block_length:       Length (in bytes) of the Aggregated Command Block.
117  * @first_cmd_index:    Index (in bytes) to the first command in the buffer.
118  */
119 struct mux_acbh {
120         __le32 signature;
121         __le16 reserved;
122         __le16 sequence_nr;
123         __le32 block_length;
124         __le32 first_cmd_index;
125 };
126
127 /**
128  * struct mux_adbh - Structure of the Aggregated Data Block Header.
129  * @signature:          Signature of the Aggregated Data Block Header.
130  * @reserved:           Reserved bytes. Set to zero.
131  * @sequence_nr:        Block sequence number.
132  * @block_length:       Length (in bytes) of the Aggregated Data Block.
133  * @first_table_index:  Index (in bytes) to the first Datagram Table in
134  *                      the buffer.
135  */
136 struct mux_adbh {
137         __le32 signature;
138         __le16 reserved;
139         __le16 sequence_nr;
140         __le32 block_length;
141         __le32 first_table_index;
142 };
143
144 /**
145  * struct mux_adth - Structure of the Aggregated Datagram Table Header.
146  * @signature:          Signature of the Aggregated Datagram Table Header.
147  * @table_length:       Length (in bytes) of the datagram table.
148  * @if_id:              ID of the interface the datagrams in the table
149  *                      belong to.
150  * @opt_ipv4v6:         Indicates IPv4(=0)/IPv6(=1) hint.
151  * @reserved:           Reserved bits. Set to zero.
152  * @next_table_index:   Index (in bytes) to the next Datagram Table in
153  *                      the buffer.
154  * @reserved2:          Reserved bytes. Set to zero
155  * @dg:                 datagramm table with variable length
156  */
157 struct mux_adth {
158         __le32 signature;
159         __le16 table_length;
160         u8 if_id;
161         u8 opt_ipv4v6;
162         __le32 next_table_index;
163         __le32 reserved2;
164         struct mux_adth_dg dg[];
165 };
166
167 /**
168  * struct mux_adgh - Aggregated Datagram Header.
169  * @signature:          Signature of the Aggregated Datagram Header(0x48474441)
170  * @length:             Length (in bytes) of the datagram header. This length
171  *                      shall include the header size. Min value: 0x10
172  * @if_id:              ID of the interface the datagrams belong to
173  * @opt_ipv4v6:         Indicates IPv4(=0)/IPv6(=1), It is optional if not
174  *                      used set it to zero.
175  * @reserved:           Reserved bits. Set to zero.
176  * @service_class:      Service class identifier for the datagram.
177  * @next_count:         Count of the datagrams that shall be following this
178  *                      datagrams for this interface. A count of zero means
179  *                      the next datagram may not belong to this interface.
180  * @reserved1:          Reserved bytes, Set to zero
181  */
182 struct mux_adgh {
183         __le32 signature;
184         __le16 length;
185         u8 if_id;
186         u8 opt_ipv4v6;
187         u8 service_class;
188         u8 next_count;
189         u8 reserved1[6];
190 };
191
192 /**
193  * struct mux_lite_cmdh - MUX Lite Command Header
194  * @signature:          Signature of the Command Header(0x48444D43)
195  * @cmd_len:            Length (in bytes) of the command. This length shall
196  *                      include the header size. Minimum value: 0x10
197  * @if_id:              ID of the interface the commands in the table belong to.
198  * @reserved:           Reserved Set to zero.
199  * @command_type:       Command Enum.
200  * @transaction_id:     4 byte value shall be generated and sent along with a
201  *                      command Responses and ACKs shall have the same
202  *                      Transaction ID as their commands. It shall be unique to
203  *                      the command transaction on the given interface.
204  * @param:              Optional parameters used with the command.
205  */
206 struct mux_lite_cmdh {
207         __le32 signature;
208         __le16 cmd_len;
209         u8 if_id;
210         u8 reserved;
211         __le32 command_type;
212         __le32 transaction_id;
213         union mux_cmd_param param;
214 };
215
216 /**
217  * struct mux_lite_vfl - value field in generic table
218  * @nr_of_bytes:        Number of bytes available to transmit in the queue.
219  */
220 struct mux_lite_vfl {
221         __le32 nr_of_bytes;
222 };
223
224 /**
225  * struct ipc_mem_lite_gen_tbl - Generic table format for Queue Level
226  *                               and Flow Credit
227  * @signature:  Signature of the table
228  * @length:     Length of the table
229  * @if_id:      ID of the interface the table belongs to
230  * @vfl_length: Value field length
231  * @reserved:   Reserved
232  * @vfl:        Value field of variable length
233  */
234 struct ipc_mem_lite_gen_tbl {
235         __le32 signature;
236         __le16 length;
237         u8 if_id;
238         u8 vfl_length;
239         u32 reserved[2];
240         struct mux_lite_vfl vfl;
241 };
242
243 /**
244  * struct mux_type_cmdh - Structure of command header for mux lite and aggr
245  * @ack_lite:   MUX Lite Command Header pointer
246  * @ack_aggr:   Command Header pointer
247  */
248 union mux_type_cmdh {
249         struct mux_lite_cmdh *ack_lite;
250         struct mux_cmdh *ack_aggr;
251 };
252
253 /**
254  * struct mux_type_header - Structure of mux header type
255  * @adgh:       Aggregated Datagram Header pointer
256  * @adbh:       Aggregated Data Block Header pointer
257  */
258 union mux_type_header {
259         struct mux_adgh *adgh;
260         struct mux_adbh *adbh;
261 };
262
263 void ipc_mux_dl_decode(struct iosm_mux *ipc_mux, struct sk_buff *skb);
264
265 /**
266  * ipc_mux_dl_acb_send_cmds - Respond to the Command blocks.
267  * @ipc_mux:            Pointer to MUX data-struct
268  * @cmd_type:           Command
269  * @if_id:              Session interface id.
270  * @transaction_id:     Command transaction id.
271  * @param:              Pointer to command params.
272  * @res_size:           Response size
273  * @blocking:           True for blocking send
274  * @respond:            If true return transaction ID
275  *
276  * Returns:             0 in success and failure value on error
277  */
278 int ipc_mux_dl_acb_send_cmds(struct iosm_mux *ipc_mux, u32 cmd_type, u8 if_id,
279                              u32 transaction_id, union mux_cmd_param *param,
280                              size_t res_size, bool blocking, bool respond);
281
282 /**
283  * ipc_mux_netif_tx_flowctrl - Enable/Disable TX flow control on MUX sessions.
284  * @session:    Pointer to mux_session struct
285  * @idx:        Session ID
286  * @on:         true for Enable and false for disable flow control
287  */
288 void ipc_mux_netif_tx_flowctrl(struct mux_session *session, int idx, bool on);
289
290 /**
291  * ipc_mux_ul_trigger_encode - Route the UL packet through the IP MUX layer
292  *                             for encoding.
293  * @ipc_mux:    Pointer to MUX data-struct
294  * @if_id:      Session ID.
295  * @skb:        Pointer to ipc_skb.
296  *
297  * Returns: 0 if successfully encoded
298  *          failure value on error
299  *          -EBUSY if packet has to be retransmitted.
300  */
301 int ipc_mux_ul_trigger_encode(struct iosm_mux *ipc_mux, int if_id,
302                               struct sk_buff *skb);
303 /**
304  * ipc_mux_ul_data_encode - UL encode function for calling from Tasklet context.
305  * @ipc_mux:    Pointer to MUX data-struct
306  *
307  * Returns: TRUE if any packet of any session is encoded FALSE otherwise.
308  */
309 bool ipc_mux_ul_data_encode(struct iosm_mux *ipc_mux);
310
311 /**
312  * ipc_mux_ul_encoded_process - Handles the Modem processed UL data by adding
313  *                              the SKB to the UL free list.
314  * @ipc_mux:    Pointer to MUX data-struct
315  * @skb:        Pointer to ipc_skb.
316  */
317 void ipc_mux_ul_encoded_process(struct iosm_mux *ipc_mux, struct sk_buff *skb);
318
319 void ipc_mux_ul_adb_finish(struct iosm_mux *ipc_mux);
320
321 void ipc_mux_ul_adb_update_ql(struct iosm_mux *ipc_mux, struct mux_adb *p_adb,
322                               int session_id, int qlth_n_ql_size,
323                               struct sk_buff_head *ul_list);
324
325 #endif