s390: remove SCHED_CORE from defconfigs
[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 /* Size of the buffer for the IP MUX commands. */
17 #define MUX_MAX_UL_ACB_BUF_SIZE 256
18
19 /* Maximum number of packets in a go per session */
20 #define MUX_MAX_UL_DG_ENTRIES 100
21
22 /* ADGH: Signature of the Datagram Header. */
23 #define MUX_SIG_ADGH 0x48474441
24
25 /* CMDH: Signature of the Command Header. */
26 #define MUX_SIG_CMDH 0x48444D43
27
28 /* QLTH: Signature of the Queue Level Table */
29 #define MUX_SIG_QLTH 0x48544C51
30
31 /* FCTH: Signature of the Flow Credit Table */
32 #define MUX_SIG_FCTH 0x48544346
33
34 /* MUX UL session threshold factor */
35 #define IPC_MEM_MUX_UL_SESS_FCOFF_THRESHOLD_FACTOR (4)
36
37 /* Size of the buffer for the IP MUX Lite data buffer. */
38 #define IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE (2 * 1024)
39
40 /* MUX UL session threshold in number of packets */
41 #define IPC_MEM_MUX_UL_SESS_FCON_THRESHOLD (64)
42
43 /* Default time out for sending IPC session commands like
44  * open session, close session etc
45  * unit : milliseconds
46  */
47 #define IPC_MUX_CMD_RUN_DEFAULT_TIMEOUT 1000 /* 1 second */
48
49 /* MUX UL flow control lower threshold in bytes */
50 #define IPC_MEM_MUX_UL_FLOWCTRL_LOW_B 10240 /* 10KB */
51
52 /* MUX UL flow control higher threshold in bytes (5ms worth of data)*/
53 #define IPC_MEM_MUX_UL_FLOWCTRL_HIGH_B (110 * 1024)
54
55 /**
56  * struct mux_adgh - Aggregated Datagram Header.
57  * @signature:          Signature of the Aggregated Datagram Header(0x48474441)
58  * @length:             Length (in bytes) of the datagram header. This length
59  *                      shall include the header size. Min value: 0x10
60  * @if_id:              ID of the interface the datagrams belong to
61  * @opt_ipv4v6:         Indicates IPv4(=0)/IPv6(=1), It is optional if not
62  *                      used set it to zero.
63  * @reserved:           Reserved bits. Set to zero.
64  * @service_class:      Service class identifier for the datagram.
65  * @next_count:         Count of the datagrams that shall be following this
66  *                      datagrams for this interface. A count of zero means
67  *                      the next datagram may not belong to this interface.
68  * @reserved1:          Reserved bytes, Set to zero
69  */
70 struct mux_adgh {
71         __le32 signature;
72         __le16 length;
73         u8 if_id;
74         u8 opt_ipv4v6;
75         u8 service_class;
76         u8 next_count;
77         u8 reserved1[6];
78 };
79
80 /**
81  * struct mux_lite_cmdh - MUX Lite Command Header
82  * @signature:          Signature of the Command Header(0x48444D43)
83  * @cmd_len:            Length (in bytes) of the command. This length shall
84  *                      include the header size. Minimum value: 0x10
85  * @if_id:              ID of the interface the commands in the table belong to.
86  * @reserved:           Reserved Set to zero.
87  * @command_type:       Command Enum.
88  * @transaction_id:     4 byte value shall be generated and sent along with a
89  *                      command Responses and ACKs shall have the same
90  *                      Transaction ID as their commands. It shall be unique to
91  *                      the command transaction on the given interface.
92  * @param:              Optional parameters used with the command.
93  */
94 struct mux_lite_cmdh {
95         __le32 signature;
96         __le16 cmd_len;
97         u8 if_id;
98         u8 reserved;
99         __le32 command_type;
100         __le32 transaction_id;
101         union mux_cmd_param param;
102 };
103
104 /**
105  * struct mux_lite_vfl - value field in generic table
106  * @nr_of_bytes:        Number of bytes available to transmit in the queue.
107  */
108 struct mux_lite_vfl {
109         u32 nr_of_bytes;
110 };
111
112 /**
113  * struct ipc_mem_lite_gen_tbl - Generic table format for Queue Level
114  *                               and Flow Credit
115  * @signature:  Signature of the table
116  * @length:     Length of the table
117  * @if_id:      ID of the interface the table belongs to
118  * @vfl_length: Value field length
119  * @reserved:   Reserved
120  * @vfl:        Value field of variable length
121  */
122 struct ipc_mem_lite_gen_tbl {
123         __le32 signature;
124         __le16 length;
125         u8 if_id;
126         u8 vfl_length;
127         u32 reserved[2];
128         struct mux_lite_vfl vfl;
129 };
130
131 /**
132  * ipc_mux_dl_decode -Route the DL packet through the IP MUX layer
133  *                    depending on Header.
134  * @ipc_mux:    Pointer to MUX data-struct
135  * @skb:        Pointer to ipc_skb.
136  */
137 void ipc_mux_dl_decode(struct iosm_mux *ipc_mux, struct sk_buff *skb);
138
139 /**
140  * ipc_mux_dl_acb_send_cmds - Respond to the Command blocks.
141  * @ipc_mux:            Pointer to MUX data-struct
142  * @cmd_type:           Command
143  * @if_id:              Session interface id.
144  * @transaction_id:     Command transaction id.
145  * @param:              Pointer to command params.
146  * @res_size:           Response size
147  * @blocking:           True for blocking send
148  * @respond:            If true return transaction ID
149  *
150  * Returns: 0 in success and failure value on error
151  */
152 int ipc_mux_dl_acb_send_cmds(struct iosm_mux *ipc_mux, u32 cmd_type, u8 if_id,
153                              u32 transaction_id, union mux_cmd_param *param,
154                              size_t res_size, bool blocking, bool respond);
155
156 /**
157  * ipc_mux_netif_tx_flowctrl - Enable/Disable TX flow control on MUX sessions.
158  * @session:    Pointer to mux_session struct
159  * @idx:        Session ID
160  * @on:         true for Enable and false for disable flow control
161  */
162 void ipc_mux_netif_tx_flowctrl(struct mux_session *session, int idx, bool on);
163
164 /**
165  * ipc_mux_ul_trigger_encode - Route the UL packet through the IP MUX layer
166  *                             for encoding.
167  * @ipc_mux:    Pointer to MUX data-struct
168  * @if_id:      Session ID.
169  * @skb:        Pointer to ipc_skb.
170  *
171  * Returns: 0 if successfully encoded
172  *          failure value on error
173  *          -EBUSY if packet has to be retransmitted.
174  */
175 int ipc_mux_ul_trigger_encode(struct iosm_mux *ipc_mux, int if_id,
176                               struct sk_buff *skb);
177 /**
178  * ipc_mux_ul_data_encode - UL encode function for calling from Tasklet context.
179  * @ipc_mux:    Pointer to MUX data-struct
180  *
181  * Returns: TRUE if any packet of any session is encoded FALSE otherwise.
182  */
183 bool ipc_mux_ul_data_encode(struct iosm_mux *ipc_mux);
184
185 /**
186  * ipc_mux_ul_encoded_process - Handles the Modem processed UL data by adding
187  *                              the SKB to the UL free list.
188  * @ipc_mux:    Pointer to MUX data-struct
189  * @skb:        Pointer to ipc_skb.
190  */
191 void ipc_mux_ul_encoded_process(struct iosm_mux *ipc_mux, struct sk_buff *skb);
192
193 #endif