162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (C) 2020-21 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef IOSM_IPC_MUX_H 762306a36Sopenharmony_ci#define IOSM_IPC_MUX_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "iosm_ipc_protocol.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define IPC_MEM_MAX_UL_DG_ENTRIES 100 1262306a36Sopenharmony_ci#define IPC_MEM_MAX_TDS_MUX_AGGR_UL 60 1362306a36Sopenharmony_ci#define IPC_MEM_MAX_TDS_MUX_AGGR_DL 60 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define IPC_MEM_MAX_ADB_BUF_SIZE (16 * 1024) 1662306a36Sopenharmony_ci#define IPC_MEM_MAX_UL_ADB_BUF_SIZE IPC_MEM_MAX_ADB_BUF_SIZE 1762306a36Sopenharmony_ci#define IPC_MEM_MAX_DL_ADB_BUF_SIZE IPC_MEM_MAX_ADB_BUF_SIZE 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* Size of the buffer for the IP MUX Lite data buffer. */ 2062306a36Sopenharmony_ci#define IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE (2 * 1024) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* TD counts for IP MUX Lite */ 2362306a36Sopenharmony_ci#define IPC_MEM_MAX_TDS_MUX_LITE_UL 800 2462306a36Sopenharmony_ci#define IPC_MEM_MAX_TDS_MUX_LITE_DL 1200 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* open session request (AP->CP) */ 2762306a36Sopenharmony_ci#define MUX_CMD_OPEN_SESSION 1 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* response to open session request (CP->AP) */ 3062306a36Sopenharmony_ci#define MUX_CMD_OPEN_SESSION_RESP 2 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* close session request (AP->CP) */ 3362306a36Sopenharmony_ci#define MUX_CMD_CLOSE_SESSION 3 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* response to close session request (CP->AP) */ 3662306a36Sopenharmony_ci#define MUX_CMD_CLOSE_SESSION_RESP 4 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* Flow control command with mask of the flow per queue/flow. */ 3962306a36Sopenharmony_ci#define MUX_LITE_CMD_FLOW_CTL 5 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* ACK the flow control command. Shall have the same Transaction ID as the 4262306a36Sopenharmony_ci * matching FLOW_CTL command. 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci#define MUX_LITE_CMD_FLOW_CTL_ACK 6 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* Command for report packet indicating link quality metrics. */ 4762306a36Sopenharmony_ci#define MUX_LITE_CMD_LINK_STATUS_REPORT 7 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Response to a report packet */ 5062306a36Sopenharmony_ci#define MUX_LITE_CMD_LINK_STATUS_REPORT_RESP 8 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* Used to reset a command/response state. */ 5362306a36Sopenharmony_ci#define MUX_CMD_INVALID 255 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* command response : command processed successfully */ 5662306a36Sopenharmony_ci#define MUX_CMD_RESP_SUCCESS 0 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* MUX for route link devices */ 5962306a36Sopenharmony_ci#define IPC_MEM_WWAN_MUX BIT(0) 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* Initiated actions to change the state of the MUX object. */ 6262306a36Sopenharmony_cienum mux_event { 6362306a36Sopenharmony_ci MUX_E_INACTIVE, /* No initiated actions. */ 6462306a36Sopenharmony_ci MUX_E_MUX_SESSION_OPEN, /* Create the MUX channel and a session. */ 6562306a36Sopenharmony_ci MUX_E_MUX_SESSION_CLOSE, /* Release a session. */ 6662306a36Sopenharmony_ci MUX_E_MUX_CHANNEL_CLOSE, /* Release the MUX channel. */ 6762306a36Sopenharmony_ci MUX_E_NO_ORDERS, /* No MUX order. */ 6862306a36Sopenharmony_ci MUX_E_NOT_APPLICABLE, /* Defect IP MUX. */ 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* MUX session open command. */ 7262306a36Sopenharmony_cistruct mux_session_open { 7362306a36Sopenharmony_ci enum mux_event event; 7462306a36Sopenharmony_ci __le32 if_id; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* MUX session close command. */ 7862306a36Sopenharmony_cistruct mux_session_close { 7962306a36Sopenharmony_ci enum mux_event event; 8062306a36Sopenharmony_ci __le32 if_id; 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* MUX channel close command. */ 8462306a36Sopenharmony_cistruct mux_channel_close { 8562306a36Sopenharmony_ci enum mux_event event; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* Default message type to find out the right message type. */ 8962306a36Sopenharmony_cistruct mux_common { 9062306a36Sopenharmony_ci enum mux_event event; 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* List of ops in MUX mode. */ 9462306a36Sopenharmony_ciunion mux_msg { 9562306a36Sopenharmony_ci struct mux_session_open session_open; 9662306a36Sopenharmony_ci struct mux_session_close session_close; 9762306a36Sopenharmony_ci struct mux_channel_close channel_close; 9862306a36Sopenharmony_ci struct mux_common common; 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* Parameter definition of the open session command. */ 10262306a36Sopenharmony_cistruct mux_cmd_open_session { 10362306a36Sopenharmony_ci u8 flow_ctrl; /* 0: Flow control disabled (flow allowed). */ 10462306a36Sopenharmony_ci /* 1: Flow control enabled (flow not allowed)*/ 10562306a36Sopenharmony_ci u8 ipv4v6_hints; /* 0: IPv4/IPv6 hints not supported.*/ 10662306a36Sopenharmony_ci /* 1: IPv4/IPv6 hints supported*/ 10762306a36Sopenharmony_ci __le16 reserved2; /* Reserved. Set to zero. */ 10862306a36Sopenharmony_ci __le32 dl_head_pad_len; /* Maximum length supported */ 10962306a36Sopenharmony_ci /* for DL head padding on a datagram. */ 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* Parameter definition of the open session response. */ 11362306a36Sopenharmony_cistruct mux_cmd_open_session_resp { 11462306a36Sopenharmony_ci __le32 response; /* Response code */ 11562306a36Sopenharmony_ci u8 flow_ctrl; /* 0: Flow control disabled (flow allowed). */ 11662306a36Sopenharmony_ci /* 1: Flow control enabled (flow not allowed) */ 11762306a36Sopenharmony_ci u8 ipv4v6_hints; /* 0: IPv4/IPv6 hints not supported */ 11862306a36Sopenharmony_ci /* 1: IPv4/IPv6 hints supported */ 11962306a36Sopenharmony_ci __le16 reserved2; /* Reserved. Set to zero. */ 12062306a36Sopenharmony_ci __le32 ul_head_pad_len; /* Actual length supported for */ 12162306a36Sopenharmony_ci /* UL head padding on adatagram.*/ 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* Parameter definition of the close session response code */ 12562306a36Sopenharmony_cistruct mux_cmd_close_session_resp { 12662306a36Sopenharmony_ci __le32 response; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/* Parameter definition of the flow control command. */ 13062306a36Sopenharmony_cistruct mux_cmd_flow_ctl { 13162306a36Sopenharmony_ci __le32 mask; /* indicating the desired flow control */ 13262306a36Sopenharmony_ci /* state for various flows/queues */ 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* Parameter definition of the link status report code*/ 13662306a36Sopenharmony_cistruct mux_cmd_link_status_report { 13762306a36Sopenharmony_ci u8 payload; 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* Parameter definition of the link status report response code. */ 14162306a36Sopenharmony_cistruct mux_cmd_link_status_report_resp { 14262306a36Sopenharmony_ci __le32 response; 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci/** 14662306a36Sopenharmony_ci * union mux_cmd_param - Union-definition of the command parameters. 14762306a36Sopenharmony_ci * @open_session: Inband command for open session 14862306a36Sopenharmony_ci * @open_session_resp: Inband command for open session response 14962306a36Sopenharmony_ci * @close_session_resp: Inband command for close session response 15062306a36Sopenharmony_ci * @flow_ctl: In-band flow control on the opened interfaces 15162306a36Sopenharmony_ci * @link_status: In-band Link Status Report 15262306a36Sopenharmony_ci * @link_status_resp: In-band command for link status report response 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_ciunion mux_cmd_param { 15562306a36Sopenharmony_ci struct mux_cmd_open_session open_session; 15662306a36Sopenharmony_ci struct mux_cmd_open_session_resp open_session_resp; 15762306a36Sopenharmony_ci struct mux_cmd_close_session_resp close_session_resp; 15862306a36Sopenharmony_ci struct mux_cmd_flow_ctl flow_ctl; 15962306a36Sopenharmony_ci struct mux_cmd_link_status_report link_status; 16062306a36Sopenharmony_ci struct mux_cmd_link_status_report_resp link_status_resp; 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci/* States of the MUX object.. */ 16462306a36Sopenharmony_cienum mux_state { 16562306a36Sopenharmony_ci MUX_S_INACTIVE, /* IP MUX is unused. */ 16662306a36Sopenharmony_ci MUX_S_ACTIVE, /* IP MUX channel is available. */ 16762306a36Sopenharmony_ci MUX_S_ERROR, /* Defect IP MUX. */ 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/* Supported MUX protocols. */ 17162306a36Sopenharmony_cienum ipc_mux_protocol { 17262306a36Sopenharmony_ci MUX_UNKNOWN, 17362306a36Sopenharmony_ci MUX_LITE, 17462306a36Sopenharmony_ci MUX_AGGREGATION, 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* Supported UL data transfer methods. */ 17862306a36Sopenharmony_cienum ipc_mux_ul_flow { 17962306a36Sopenharmony_ci MUX_UL_UNKNOWN, 18062306a36Sopenharmony_ci MUX_UL, /* Normal UL data transfer */ 18162306a36Sopenharmony_ci MUX_UL_ON_CREDITS, /* UL data transfer will be based on credits */ 18262306a36Sopenharmony_ci}; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/* List of the MUX session. */ 18562306a36Sopenharmony_cistruct mux_session { 18662306a36Sopenharmony_ci struct iosm_wwan *wwan; /*Network i/f used for communication*/ 18762306a36Sopenharmony_ci int if_id; /* i/f id for session open message.*/ 18862306a36Sopenharmony_ci u32 flags; 18962306a36Sopenharmony_ci u32 ul_head_pad_len; /* Nr of bytes for UL head padding. */ 19062306a36Sopenharmony_ci u32 dl_head_pad_len; /* Nr of bytes for DL head padding. */ 19162306a36Sopenharmony_ci struct sk_buff_head ul_list; /* skb entries for an ADT. */ 19262306a36Sopenharmony_ci u32 flow_ctl_mask; /* UL flow control */ 19362306a36Sopenharmony_ci u32 flow_ctl_en_cnt; /* Flow control Enable cmd count */ 19462306a36Sopenharmony_ci u32 flow_ctl_dis_cnt; /* Flow Control Disable cmd count */ 19562306a36Sopenharmony_ci int ul_flow_credits; /* UL flow credits */ 19662306a36Sopenharmony_ci u8 net_tx_stop:1, 19762306a36Sopenharmony_ci flush:1; /* flush net interface ? */ 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci/** 20162306a36Sopenharmony_ci * struct mux_adth_dg - Structure of the datagram in the Aggregated Datagram 20262306a36Sopenharmony_ci * Table Header. 20362306a36Sopenharmony_ci * @datagram_index : Index (in bytes) to the k-th datagram in the table. 20462306a36Sopenharmony_ci * Index shall count from the start of the block including 20562306a36Sopenharmony_ci * the 16-byte header. This value shall be non-zero. 20662306a36Sopenharmony_ci * @datagram_length: Length of the k-th datagram including the head padding. 20762306a36Sopenharmony_ci * This value shall be non-zero. 20862306a36Sopenharmony_ci * @service_class: Service class identifier for the datagram. 20962306a36Sopenharmony_ci * @reserved: Reserved bytes. Set to zero 21062306a36Sopenharmony_ci */ 21162306a36Sopenharmony_cistruct mux_adth_dg { 21262306a36Sopenharmony_ci __le32 datagram_index; 21362306a36Sopenharmony_ci __le16 datagram_length; 21462306a36Sopenharmony_ci u8 service_class; 21562306a36Sopenharmony_ci u8 reserved; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/** 21962306a36Sopenharmony_ci * struct mux_qlth_ql - Structure of the queue level in the Aggregated 22062306a36Sopenharmony_ci * Datagram Queue Level Table Header. 22162306a36Sopenharmony_ci * @nr_of_bytes: Number of bytes available to transmit in the queue. 22262306a36Sopenharmony_ci */ 22362306a36Sopenharmony_cistruct mux_qlth_ql { 22462306a36Sopenharmony_ci __le32 nr_of_bytes; 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci/** 22862306a36Sopenharmony_ci * struct mux_qlth - Structure of Aggregated Datagram Queue Level Table 22962306a36Sopenharmony_ci * Header. 23062306a36Sopenharmony_ci * @signature: Signature of the Queue Level Table Header 23162306a36Sopenharmony_ci * Value: 0x48544C51 (ASCII characters: 'Q' 'L' 'T' 'H') 23262306a36Sopenharmony_ci * @table_length: Length (in bytes) of the datagram table. This length 23362306a36Sopenharmony_ci * shall include the queue level table header size. 23462306a36Sopenharmony_ci * Minimum value:0x10 23562306a36Sopenharmony_ci * @if_id: ID of the interface the queue levels in the table 23662306a36Sopenharmony_ci * belong to. 23762306a36Sopenharmony_ci * @reserved: Reserved byte. Set to zero. 23862306a36Sopenharmony_ci * @next_table_index: Index (in bytes) to the next table in the buffer. Index 23962306a36Sopenharmony_ci * shall count from the start of the block including the 24062306a36Sopenharmony_ci * 16-byte header. Value of zero indicates end of the list. 24162306a36Sopenharmony_ci * @reserved2: Reserved bytes. Set to zero 24262306a36Sopenharmony_ci * @ql: Queue level table with variable length 24362306a36Sopenharmony_ci */ 24462306a36Sopenharmony_cistruct mux_qlth { 24562306a36Sopenharmony_ci __le32 signature; 24662306a36Sopenharmony_ci __le16 table_length; 24762306a36Sopenharmony_ci u8 if_id; 24862306a36Sopenharmony_ci u8 reserved; 24962306a36Sopenharmony_ci __le32 next_table_index; 25062306a36Sopenharmony_ci __le32 reserved2; 25162306a36Sopenharmony_ci struct mux_qlth_ql ql; 25262306a36Sopenharmony_ci}; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci/** 25562306a36Sopenharmony_ci * struct mux_adb - Structure of State of a single UL data block. 25662306a36Sopenharmony_ci * @dest_skb: Current UL skb for the data block. 25762306a36Sopenharmony_ci * @buf: ADB memory 25862306a36Sopenharmony_ci * @adgh: ADGH pointer 25962306a36Sopenharmony_ci * @qlth_skb: QLTH pointer 26062306a36Sopenharmony_ci * @next_table_index: Pointer to next table index. 26162306a36Sopenharmony_ci * @free_list: List of alloc. ADB for the UL sess. 26262306a36Sopenharmony_ci * @size: Size of the ADB memory. 26362306a36Sopenharmony_ci * @if_cnt: Statistic counter 26462306a36Sopenharmony_ci * @dg_cnt_total: Datagram count total 26562306a36Sopenharmony_ci * @payload_size: Payload Size 26662306a36Sopenharmony_ci * @dg: Datagram table. 26762306a36Sopenharmony_ci * @pp_qlt: Pointers to hold Queue Level Tables of session 26862306a36Sopenharmony_ci * @adbh: ADBH pointer 26962306a36Sopenharmony_ci * @qlt_updated: Queue level table updated 27062306a36Sopenharmony_ci * @dg_count: Datagram count 27162306a36Sopenharmony_ci */ 27262306a36Sopenharmony_cistruct mux_adb { 27362306a36Sopenharmony_ci struct sk_buff *dest_skb; 27462306a36Sopenharmony_ci u8 *buf; 27562306a36Sopenharmony_ci struct mux_adgh *adgh; 27662306a36Sopenharmony_ci struct sk_buff *qlth_skb; 27762306a36Sopenharmony_ci u32 *next_table_index; 27862306a36Sopenharmony_ci struct sk_buff_head free_list; 27962306a36Sopenharmony_ci int size; 28062306a36Sopenharmony_ci u32 if_cnt; 28162306a36Sopenharmony_ci u32 dg_cnt_total; 28262306a36Sopenharmony_ci u32 payload_size; 28362306a36Sopenharmony_ci struct mux_adth_dg 28462306a36Sopenharmony_ci dg[IPC_MEM_MUX_IP_SESSION_ENTRIES][IPC_MEM_MAX_UL_DG_ENTRIES]; 28562306a36Sopenharmony_ci struct mux_qlth *pp_qlt[IPC_MEM_MUX_IP_SESSION_ENTRIES]; 28662306a36Sopenharmony_ci struct mux_adbh *adbh; 28762306a36Sopenharmony_ci u32 qlt_updated[IPC_MEM_MUX_IP_SESSION_ENTRIES]; 28862306a36Sopenharmony_ci u32 dg_count[IPC_MEM_MUX_IP_SESSION_ENTRIES]; 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/** 29262306a36Sopenharmony_ci * struct mux_acb - Structure of Temporary ACB state. 29362306a36Sopenharmony_ci * @skb: Used UL skb. 29462306a36Sopenharmony_ci * @if_id: Session id. 29562306a36Sopenharmony_ci * @buf_p: Command buffer. 29662306a36Sopenharmony_ci * @wanted_response: Wanted Response 29762306a36Sopenharmony_ci * @got_response: Got response 29862306a36Sopenharmony_ci * @cmd: command 29962306a36Sopenharmony_ci * @got_param: Received command/response parameter 30062306a36Sopenharmony_ci */ 30162306a36Sopenharmony_cistruct mux_acb { 30262306a36Sopenharmony_ci struct sk_buff *skb; /* Used UL skb. */ 30362306a36Sopenharmony_ci int if_id; /* Session id. */ 30462306a36Sopenharmony_ci u8 *buf_p; 30562306a36Sopenharmony_ci u32 wanted_response; 30662306a36Sopenharmony_ci u32 got_response; 30762306a36Sopenharmony_ci u32 cmd; 30862306a36Sopenharmony_ci union mux_cmd_param got_param; /* Received command/response parameter */ 30962306a36Sopenharmony_ci}; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci/** 31262306a36Sopenharmony_ci * struct iosm_mux - Structure of the data multiplexing over an IP channel. 31362306a36Sopenharmony_ci * @dev: Pointer to device structure 31462306a36Sopenharmony_ci * @session: Array of the MUX sessions. 31562306a36Sopenharmony_ci * @channel: Reference to the IP MUX channel 31662306a36Sopenharmony_ci * @pcie: Pointer to iosm_pcie struct 31762306a36Sopenharmony_ci * @imem: Pointer to iosm_imem 31862306a36Sopenharmony_ci * @wwan: Poinetr to iosm_wwan 31962306a36Sopenharmony_ci * @ipc_protocol: Pointer to iosm_protocol 32062306a36Sopenharmony_ci * @channel_id: Channel ID for MUX 32162306a36Sopenharmony_ci * @protocol: Type of the MUX protocol 32262306a36Sopenharmony_ci * @ul_flow: UL Flow type 32362306a36Sopenharmony_ci * @nr_sessions: Number of sessions 32462306a36Sopenharmony_ci * @instance_id: Instance ID 32562306a36Sopenharmony_ci * @state: States of the MUX object 32662306a36Sopenharmony_ci * @event: Initiated actions to change the state of the MUX object 32762306a36Sopenharmony_ci * @tx_transaction_id: Transaction id for the ACB command. 32862306a36Sopenharmony_ci * @rr_next_session: Next session number for round robin. 32962306a36Sopenharmony_ci * @ul_adb: State of the UL ADB/ADGH. 33062306a36Sopenharmony_ci * @size_needed: Variable to store the size needed during ADB preparation 33162306a36Sopenharmony_ci * @ul_data_pend_bytes: Pending UL data to be processed in bytes 33262306a36Sopenharmony_ci * @acb: Temporary ACB state 33362306a36Sopenharmony_ci * @wwan_q_offset: This will hold the offset of the given instance 33462306a36Sopenharmony_ci * Useful while passing or receiving packets from 33562306a36Sopenharmony_ci * wwan/imem layer. 33662306a36Sopenharmony_ci * @acb_tx_sequence_nr: Sequence number for the ACB header. 33762306a36Sopenharmony_ci * @adb_tx_sequence_nr: Sequence number for ADB header 33862306a36Sopenharmony_ci * @acc_adb_size: Statistic data for logging 33962306a36Sopenharmony_ci * @acc_payload_size: Statistic data for logging 34062306a36Sopenharmony_ci * @initialized: MUX object is initialized 34162306a36Sopenharmony_ci * @ev_mux_net_transmit_pending: 34262306a36Sopenharmony_ci * 0 means inform the IPC tasklet to pass the 34362306a36Sopenharmony_ci * accumulated uplink ADB to CP. 34462306a36Sopenharmony_ci * @adb_prep_ongoing: Flag for ADB preparation status 34562306a36Sopenharmony_ci */ 34662306a36Sopenharmony_cistruct iosm_mux { 34762306a36Sopenharmony_ci struct device *dev; 34862306a36Sopenharmony_ci struct mux_session session[IPC_MEM_MUX_IP_SESSION_ENTRIES]; 34962306a36Sopenharmony_ci struct ipc_mem_channel *channel; 35062306a36Sopenharmony_ci struct iosm_pcie *pcie; 35162306a36Sopenharmony_ci struct iosm_imem *imem; 35262306a36Sopenharmony_ci struct iosm_wwan *wwan; 35362306a36Sopenharmony_ci struct iosm_protocol *ipc_protocol; 35462306a36Sopenharmony_ci int channel_id; 35562306a36Sopenharmony_ci enum ipc_mux_protocol protocol; 35662306a36Sopenharmony_ci enum ipc_mux_ul_flow ul_flow; 35762306a36Sopenharmony_ci int nr_sessions; 35862306a36Sopenharmony_ci int instance_id; 35962306a36Sopenharmony_ci enum mux_state state; 36062306a36Sopenharmony_ci enum mux_event event; 36162306a36Sopenharmony_ci u32 tx_transaction_id; 36262306a36Sopenharmony_ci int rr_next_session; 36362306a36Sopenharmony_ci struct mux_adb ul_adb; 36462306a36Sopenharmony_ci int size_needed; 36562306a36Sopenharmony_ci long long ul_data_pend_bytes; 36662306a36Sopenharmony_ci struct mux_acb acb; 36762306a36Sopenharmony_ci int wwan_q_offset; 36862306a36Sopenharmony_ci u16 acb_tx_sequence_nr; 36962306a36Sopenharmony_ci u16 adb_tx_sequence_nr; 37062306a36Sopenharmony_ci unsigned long long acc_adb_size; 37162306a36Sopenharmony_ci unsigned long long acc_payload_size; 37262306a36Sopenharmony_ci u8 initialized:1, 37362306a36Sopenharmony_ci ev_mux_net_transmit_pending:1, 37462306a36Sopenharmony_ci adb_prep_ongoing; 37562306a36Sopenharmony_ci} __packed; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci/* MUX configuration structure */ 37862306a36Sopenharmony_cistruct ipc_mux_config { 37962306a36Sopenharmony_ci enum ipc_mux_protocol protocol; 38062306a36Sopenharmony_ci enum ipc_mux_ul_flow ul_flow; 38162306a36Sopenharmony_ci int instance_id; 38262306a36Sopenharmony_ci}; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci/** 38562306a36Sopenharmony_ci * ipc_mux_init - Allocates and Init MUX instance 38662306a36Sopenharmony_ci * @mux_cfg: Pointer to MUX configuration structure 38762306a36Sopenharmony_ci * @ipc_imem: Pointer to imem data-struct 38862306a36Sopenharmony_ci * 38962306a36Sopenharmony_ci * Returns: Initialized mux pointer on success else NULL 39062306a36Sopenharmony_ci */ 39162306a36Sopenharmony_cistruct iosm_mux *ipc_mux_init(struct ipc_mux_config *mux_cfg, 39262306a36Sopenharmony_ci struct iosm_imem *ipc_imem); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/** 39562306a36Sopenharmony_ci * ipc_mux_deinit - Deallocates MUX instance 39662306a36Sopenharmony_ci * @ipc_mux: Pointer to the MUX instance. 39762306a36Sopenharmony_ci */ 39862306a36Sopenharmony_civoid ipc_mux_deinit(struct iosm_mux *ipc_mux); 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci/** 40162306a36Sopenharmony_ci * ipc_mux_check_n_restart_tx - Checks for pending UL date bytes and then 40262306a36Sopenharmony_ci * it restarts the net interface tx queue if 40362306a36Sopenharmony_ci * device has set flow control as off. 40462306a36Sopenharmony_ci * @ipc_mux: Pointer to MUX data-struct 40562306a36Sopenharmony_ci */ 40662306a36Sopenharmony_civoid ipc_mux_check_n_restart_tx(struct iosm_mux *ipc_mux); 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/** 40962306a36Sopenharmony_ci * ipc_mux_get_active_protocol - Returns the active MUX protocol type. 41062306a36Sopenharmony_ci * @ipc_mux: Pointer to MUX data-struct 41162306a36Sopenharmony_ci * 41262306a36Sopenharmony_ci * Returns: enum of type ipc_mux_protocol 41362306a36Sopenharmony_ci */ 41462306a36Sopenharmony_cienum ipc_mux_protocol ipc_mux_get_active_protocol(struct iosm_mux *ipc_mux); 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci/** 41762306a36Sopenharmony_ci * ipc_mux_open_session - Opens a MUX session for IP traffic. 41862306a36Sopenharmony_ci * @ipc_mux: Pointer to MUX data-struct 41962306a36Sopenharmony_ci * @session_nr: Interface ID or session number 42062306a36Sopenharmony_ci * 42162306a36Sopenharmony_ci * Returns: channel id on success, failure value on error 42262306a36Sopenharmony_ci */ 42362306a36Sopenharmony_ciint ipc_mux_open_session(struct iosm_mux *ipc_mux, int session_nr); 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci/** 42662306a36Sopenharmony_ci * ipc_mux_close_session - Closes a MUX session. 42762306a36Sopenharmony_ci * @ipc_mux: Pointer to MUX data-struct 42862306a36Sopenharmony_ci * @session_nr: Interface ID or session number 42962306a36Sopenharmony_ci * 43062306a36Sopenharmony_ci * Returns: channel id on success, failure value on error 43162306a36Sopenharmony_ci */ 43262306a36Sopenharmony_ciint ipc_mux_close_session(struct iosm_mux *ipc_mux, int session_nr); 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci/** 43562306a36Sopenharmony_ci * ipc_mux_get_max_sessions - Retuns the maximum sessions supported on the 43662306a36Sopenharmony_ci * provided MUX instance.. 43762306a36Sopenharmony_ci * @ipc_mux: Pointer to MUX data-struct 43862306a36Sopenharmony_ci * 43962306a36Sopenharmony_ci * Returns: Number of sessions supported on Success and failure value on error 44062306a36Sopenharmony_ci */ 44162306a36Sopenharmony_ciint ipc_mux_get_max_sessions(struct iosm_mux *ipc_mux); 44262306a36Sopenharmony_ci#endif 443