326 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0-only
 | |
|  *
 | |
|  * Copyright (C) 2020-21 Intel Corporation.
 | |
|  */
 | |
| 
 | |
| #ifndef IOSM_IPC_MUX_CODEC_H
 | |
| #define IOSM_IPC_MUX_CODEC_H
 | |
| 
 | |
| #include "iosm_ipc_mux.h"
 | |
| 
 | |
| /* Queue level size and reporting
 | |
|  * >1 is enable, 0 is disable
 | |
|  */
 | |
| #define MUX_QUEUE_LEVEL 1
 | |
| 
 | |
| /* ADB finish timer value */
 | |
| #define IOSM_AGGR_MUX_ADB_FINISH_TIMEOUT_NSEC (500 * 1000)
 | |
| 
 | |
| /* Enables the flow control (Flow is not allowed) */
 | |
| #define IOSM_AGGR_MUX_CMD_FLOW_CTL_ENABLE 5
 | |
| 
 | |
| /* Disables the flow control (Flow is allowed) */
 | |
| #define IOSM_AGGR_MUX_CMD_FLOW_CTL_DISABLE 6
 | |
| 
 | |
| /* ACK the flow control command. Shall have the same Transaction ID as the
 | |
|  * matching FLOW_CTL command
 | |
|  */
 | |
| #define IOSM_AGGR_MUX_CMD_FLOW_CTL_ACK 7
 | |
| 
 | |
| /* Aggregation Protocol Command for report packet indicating link quality
 | |
|  */
 | |
| #define IOSM_AGGR_MUX_CMD_LINK_STATUS_REPORT 8
 | |
| 
 | |
| /* Response to a report packet */
 | |
| #define IOSM_AGGR_MUX_CMD_LINK_STATUS_REPORT_RESP 9
 | |
| 
 | |
| /* ACBH: Signature of the Aggregated Command Block Header. */
 | |
| #define IOSM_AGGR_MUX_SIG_ACBH 0x48424341
 | |
| 
 | |
| /* ADTH: Signature of the Aggregated Datagram Table Header. */
 | |
| #define IOSM_AGGR_MUX_SIG_ADTH 0x48544441
 | |
| 
 | |
| /* ADBH: Signature of the Aggregated Data Block Header. */
 | |
| #define IOSM_AGGR_MUX_SIG_ADBH 0x48424441
 | |
| 
 | |
| /* ADGH: Signature of the Datagram Header. */
 | |
| #define IOSM_AGGR_MUX_SIG_ADGH 0x48474441
 | |
| 
 | |
| /* Size of the buffer for the IP MUX commands. */
 | |
| #define MUX_MAX_UL_ACB_BUF_SIZE 256
 | |
| 
 | |
| /* Maximum number of packets in a go per session */
 | |
| #define MUX_MAX_UL_DG_ENTRIES 100
 | |
| 
 | |
| /* ADGH: Signature of the Datagram Header. */
 | |
| #define MUX_SIG_ADGH 0x48474441
 | |
| 
 | |
| /* CMDH: Signature of the Command Header. */
 | |
| #define MUX_SIG_CMDH 0x48444D43
 | |
| 
 | |
| /* QLTH: Signature of the Queue Level Table */
 | |
| #define MUX_SIG_QLTH 0x48544C51
 | |
| 
 | |
| /* FCTH: Signature of the Flow Credit Table */
 | |
| #define MUX_SIG_FCTH 0x48544346
 | |
| 
 | |
| /* MUX UL session threshold factor */
 | |
| #define IPC_MEM_MUX_UL_SESS_FCOFF_THRESHOLD_FACTOR (4)
 | |
| 
 | |
| /* Size of the buffer for the IP MUX Lite data buffer. */
 | |
| #define IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE (2 * 1024)
 | |
| 
 | |
| /* MUX UL session threshold in number of packets */
 | |
| #define IPC_MEM_MUX_UL_SESS_FCON_THRESHOLD (64)
 | |
| 
 | |
| /* Default time out for sending IPC session commands like
 | |
|  * open session, close session etc
 | |
|  * unit : milliseconds
 | |
|  */
 | |
| #define IPC_MUX_CMD_RUN_DEFAULT_TIMEOUT 1000 /* 1 second */
 | |
| 
 | |
| /* MUX UL flow control lower threshold in bytes */
 | |
| #define IPC_MEM_MUX_UL_FLOWCTRL_LOW_B 10240 /* 10KB */
 | |
| 
 | |
| /* MUX UL flow control higher threshold in bytes (5ms worth of data)*/
 | |
| #define IPC_MEM_MUX_UL_FLOWCTRL_HIGH_B (110 * 1024)
 | |
| 
 | |
| /**
 | |
|  * struct mux_cmdh - Structure of Command Header.
 | |
|  * @signature:		Signature of the Command Header.
 | |
|  * @cmd_len:		Length (in bytes) of the Aggregated Command Block.
 | |
|  * @if_id:		ID of the interface the commands in the table belong to.
 | |
|  * @reserved:		Reserved. Set to zero.
 | |
|  * @next_cmd_index:	Index (in bytes) to the next command in the buffer.
 | |
|  * @command_type:	Command Enum. See table Session Management chapter for
 | |
|  *			details.
 | |
|  * @transaction_id:	The Transaction ID shall be unique to the command
 | |
|  * @param:		Optional parameters used with the command.
 | |
|  */
 | |
| struct mux_cmdh {
 | |
| 	__le32 signature;
 | |
| 	__le16 cmd_len;
 | |
| 	u8 if_id;
 | |
| 	u8 reserved;
 | |
| 	__le32 next_cmd_index;
 | |
| 	__le32 command_type;
 | |
| 	__le32 transaction_id;
 | |
| 	union mux_cmd_param param;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_acbh -    Structure of the Aggregated Command Block Header.
 | |
|  * @signature:          Signature of the Aggregated Command Block Header.
 | |
|  * @reserved:           Reserved bytes. Set to zero.
 | |
|  * @sequence_nr:        Block sequence number.
 | |
|  * @block_length:       Length (in bytes) of the Aggregated Command Block.
 | |
|  * @first_cmd_index:    Index (in bytes) to the first command in the buffer.
 | |
|  */
 | |
| struct mux_acbh {
 | |
| 	__le32 signature;
 | |
| 	__le16 reserved;
 | |
| 	__le16 sequence_nr;
 | |
| 	__le32 block_length;
 | |
| 	__le32 first_cmd_index;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_adbh - Structure of the Aggregated Data Block Header.
 | |
|  * @signature:		Signature of the Aggregated Data Block Header.
 | |
|  * @reserved:		Reserved bytes. Set to zero.
 | |
|  * @sequence_nr:	Block sequence number.
 | |
|  * @block_length:	Length (in bytes) of the Aggregated Data Block.
 | |
|  * @first_table_index:	Index (in bytes) to the first Datagram Table in
 | |
|  *			the buffer.
 | |
|  */
 | |
| struct mux_adbh {
 | |
| 	__le32 signature;
 | |
| 	__le16 reserved;
 | |
| 	__le16 sequence_nr;
 | |
| 	__le32 block_length;
 | |
| 	__le32 first_table_index;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_adth - Structure of the Aggregated Datagram Table Header.
 | |
|  * @signature:          Signature of the Aggregated Datagram Table Header.
 | |
|  * @table_length:       Length (in bytes) of the datagram table.
 | |
|  * @if_id:              ID of the interface the datagrams in the table
 | |
|  *                      belong to.
 | |
|  * @opt_ipv4v6:         Indicates IPv4(=0)/IPv6(=1) hint.
 | |
|  * @reserved:           Reserved bits. Set to zero.
 | |
|  * @next_table_index:   Index (in bytes) to the next Datagram Table in
 | |
|  *                      the buffer.
 | |
|  * @reserved2:          Reserved bytes. Set to zero
 | |
|  * @dg:                 datagramm table with variable length
 | |
|  */
 | |
| struct mux_adth {
 | |
| 	__le32 signature;
 | |
| 	__le16 table_length;
 | |
| 	u8 if_id;
 | |
| 	u8 opt_ipv4v6;
 | |
| 	__le32 next_table_index;
 | |
| 	__le32 reserved2;
 | |
| 	struct mux_adth_dg dg;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_adgh - Aggregated Datagram Header.
 | |
|  * @signature:		Signature of the Aggregated Datagram Header(0x48474441)
 | |
|  * @length:		Length (in bytes) of the datagram header. This length
 | |
|  *			shall include the header size. Min value: 0x10
 | |
|  * @if_id:		ID of the interface the datagrams belong to
 | |
|  * @opt_ipv4v6:		Indicates IPv4(=0)/IPv6(=1), It is optional if not
 | |
|  *			used set it to zero.
 | |
|  * @reserved:		Reserved bits. Set to zero.
 | |
|  * @service_class:	Service class identifier for the datagram.
 | |
|  * @next_count:		Count of the datagrams that shall be following this
 | |
|  *			datagrams for this interface. A count of zero means
 | |
|  *			the next datagram may not belong to this interface.
 | |
|  * @reserved1:		Reserved bytes, Set to zero
 | |
|  */
 | |
| struct mux_adgh {
 | |
| 	__le32 signature;
 | |
| 	__le16 length;
 | |
| 	u8 if_id;
 | |
| 	u8 opt_ipv4v6;
 | |
| 	u8 service_class;
 | |
| 	u8 next_count;
 | |
| 	u8 reserved1[6];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_lite_cmdh - MUX Lite Command Header
 | |
|  * @signature:		Signature of the Command Header(0x48444D43)
 | |
|  * @cmd_len:		Length (in bytes) of the command. This length shall
 | |
|  *			include the header size. Minimum value: 0x10
 | |
|  * @if_id:		ID of the interface the commands in the table belong to.
 | |
|  * @reserved:		Reserved Set to zero.
 | |
|  * @command_type:	Command Enum.
 | |
|  * @transaction_id:	4 byte value shall be generated and sent along with a
 | |
|  *			command Responses and ACKs shall have the same
 | |
|  *			Transaction ID as their commands. It shall be unique to
 | |
|  *			the command transaction on the given interface.
 | |
|  * @param:		Optional parameters used with the command.
 | |
|  */
 | |
| struct mux_lite_cmdh {
 | |
| 	__le32 signature;
 | |
| 	__le16 cmd_len;
 | |
| 	u8 if_id;
 | |
| 	u8 reserved;
 | |
| 	__le32 command_type;
 | |
| 	__le32 transaction_id;
 | |
| 	union mux_cmd_param param;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_lite_vfl - value field in generic table
 | |
|  * @nr_of_bytes:	Number of bytes available to transmit in the queue.
 | |
|  */
 | |
| struct mux_lite_vfl {
 | |
| 	__le32 nr_of_bytes;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_lite_gen_tbl - Generic table format for Queue Level
 | |
|  *				 and Flow Credit
 | |
|  * @signature:	Signature of the table
 | |
|  * @length:	Length of the table
 | |
|  * @if_id:	ID of the interface the table belongs to
 | |
|  * @vfl_length:	Value field length
 | |
|  * @reserved:	Reserved
 | |
|  * @vfl:	Value field of variable length
 | |
|  */
 | |
| struct ipc_mem_lite_gen_tbl {
 | |
| 	__le32 signature;
 | |
| 	__le16 length;
 | |
| 	u8 if_id;
 | |
| 	u8 vfl_length;
 | |
| 	u32 reserved[2];
 | |
| 	struct mux_lite_vfl vfl;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_type_cmdh - Structure of command header for mux lite and aggr
 | |
|  * @ack_lite:	MUX Lite Command Header pointer
 | |
|  * @ack_aggr:	Command Header pointer
 | |
|  */
 | |
| union mux_type_cmdh {
 | |
| 	struct mux_lite_cmdh *ack_lite;
 | |
| 	struct mux_cmdh *ack_aggr;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct mux_type_header - Structure of mux header type
 | |
|  * @adgh:	Aggregated Datagram Header pointer
 | |
|  * @adbh:	Aggregated Data Block Header pointer
 | |
|  */
 | |
| union mux_type_header {
 | |
| 	struct mux_adgh *adgh;
 | |
| 	struct mux_adbh *adbh;
 | |
| };
 | |
| 
 | |
| void ipc_mux_dl_decode(struct iosm_mux *ipc_mux, struct sk_buff *skb);
 | |
| 
 | |
| /**
 | |
|  * ipc_mux_dl_acb_send_cmds - Respond to the Command blocks.
 | |
|  * @ipc_mux:		Pointer to MUX data-struct
 | |
|  * @cmd_type:		Command
 | |
|  * @if_id:		Session interface id.
 | |
|  * @transaction_id:	Command transaction id.
 | |
|  * @param:		Pointer to command params.
 | |
|  * @res_size:		Response size
 | |
|  * @blocking:		True for blocking send
 | |
|  * @respond:		If true return transaction ID
 | |
|  *
 | |
|  * Returns:		0 in success and failure value on error
 | |
|  */
 | |
| int ipc_mux_dl_acb_send_cmds(struct iosm_mux *ipc_mux, u32 cmd_type, u8 if_id,
 | |
| 			     u32 transaction_id, union mux_cmd_param *param,
 | |
| 			     size_t res_size, bool blocking, bool respond);
 | |
| 
 | |
| /**
 | |
|  * ipc_mux_netif_tx_flowctrl - Enable/Disable TX flow control on MUX sessions.
 | |
|  * @session:	Pointer to mux_session struct
 | |
|  * @idx:	Session ID
 | |
|  * @on:		true for Enable and false for disable flow control
 | |
|  */
 | |
| void ipc_mux_netif_tx_flowctrl(struct mux_session *session, int idx, bool on);
 | |
| 
 | |
| /**
 | |
|  * ipc_mux_ul_trigger_encode - Route the UL packet through the IP MUX layer
 | |
|  *			       for encoding.
 | |
|  * @ipc_mux:	Pointer to MUX data-struct
 | |
|  * @if_id:	Session ID.
 | |
|  * @skb:	Pointer to ipc_skb.
 | |
|  *
 | |
|  * Returns: 0 if successfully encoded
 | |
|  *	    failure value on error
 | |
|  *	    -EBUSY if packet has to be retransmitted.
 | |
|  */
 | |
| int ipc_mux_ul_trigger_encode(struct iosm_mux *ipc_mux, int if_id,
 | |
| 			      struct sk_buff *skb);
 | |
| /**
 | |
|  * ipc_mux_ul_data_encode - UL encode function for calling from Tasklet context.
 | |
|  * @ipc_mux:	Pointer to MUX data-struct
 | |
|  *
 | |
|  * Returns: TRUE if any packet of any session is encoded FALSE otherwise.
 | |
|  */
 | |
| bool ipc_mux_ul_data_encode(struct iosm_mux *ipc_mux);
 | |
| 
 | |
| /**
 | |
|  * ipc_mux_ul_encoded_process - Handles the Modem processed UL data by adding
 | |
|  *				the SKB to the UL free list.
 | |
|  * @ipc_mux:	Pointer to MUX data-struct
 | |
|  * @skb:	Pointer to ipc_skb.
 | |
|  */
 | |
| void ipc_mux_ul_encoded_process(struct iosm_mux *ipc_mux, struct sk_buff *skb);
 | |
| 
 | |
| void ipc_mux_ul_adb_finish(struct iosm_mux *ipc_mux);
 | |
| 
 | |
| void ipc_mux_ul_adb_update_ql(struct iosm_mux *ipc_mux, struct mux_adb *p_adb,
 | |
| 			      int session_id, int qlth_n_ql_size,
 | |
| 			      struct sk_buff_head *ul_list);
 | |
| 
 | |
| #endif
 |