07 Aug 2036 17:17:26 GMT ETag: "7ff665020015d4c495a5e2f5f13dc41a90d4b6db" /* SPDX-License-Identifier: ISC */ /* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2016 Qualcomm Atheros, Inc. */ #ifndef _HTC_H_ #define _HTC_H_ #include #include #include #include #include #include struct ath10k; /****************/ /* HTC protocol */ /****************/ /* * HTC - host-target control protocol * * tx packets are generally * rx packets are more complex: * * The payload + trailer length is stored in len. * To get payload-only length one needs to payload - trailer_len. * * Trailer contains (possibly) multiple . * Each record is a id-len-value. * * HTC header flags, control_byte0, control_byte1 * have different meaning depending whether its tx * or rx. * * Alignment: htc_hdr, payload and trailer are * 4-byte aligned. */ #define HTC_HOST_MAX_MSG_PER_RX_BUNDLE 32 enum ath10k_htc_tx_flags { ATH10K_HTC_FLAG_NEED_CREDIT_UPDATE = 0x01, ATH10K_HTC_FLAG_SEND_BUNDLE = 0x02 }; enum ath10k_htc_rx_flags { ATH10K_HTC_FLAGS_RECV_1MORE_BLOCK = 0x01, ATH10K_HTC_FLAG_TRAILER_PRESENT = 0x02, }; #define ATH10K_HTC_FLAG_BUNDLE_MASK GENMASK(7, 4) /* bits 2-3 are for extra bundle count bits 4-5 */ #define ATH10K_HTC_BUNDLE_EXTRA_MASK GENMASK(3, 2) #define ATH10K_HTC_BUNDLE_EXTRA_SHIFT 4 static inline unsigned int ath10k_htc_get_bundle_count(u8 max_msgs, u8 flags) { unsigned int count, extra_count = 0; count = FIELD_GET(ATH10K_HTC_FLAG_BUNDLE_MASK, flags); if (max_msgs > 16) extra_count = FIELD_GET(ATH10K_HTC_BUNDLE_EXTRA_MASK, flags) << ATH10K_HTC_BUNDLE_EXTRA_SHIFT; return count + extra_count; } struct ath10k_htc_hdr { u8 eid; /* @enum ath10k_htc_ep_id */ u8 flags; /* @enum ath10k_htc_tx_flags, ath10k_htc_rx_flags */ __le16 len; union { u8 trailer_len; /* for rx */ u8 control_byte0; } __packed; union { u8 seq_no; /* for tx */ u8 control_byte1; } __packed; union { __le16 pad_len; struct { u8 pad0; u8 pad1; } __packed; } __packed; } __packed __aligned(4); enum ath10k_ath10k_htc_msg_id { ATH10K_HTC_MSG_READY_ID = 1, ATH10K_HTC_MSG_CONNECT_SERVICE_ID = 2, ATH10K_HTC_MSG_CONNECT_SERVICE_RESP_ID = 3, ATH10K_HTC_MSG_SETUP_COMPLETE_ID = 4, ATH10K_HTC_MSG_SETUP_COMPLETE_EX_ID = 5, ATH10K_HTC_MSG_SEND_SUSPEND_COMPLETE = 6 }; enum ath10k_htc_version { ATH10K_HTC_VERSION_2P0 = 0x00, /* 2.0 */ ATH10K_HTC_VERSION_2P1 = 0x01, /* 2.1 */ }; enum ath10k_htc_conn_flags { ATH10K_HTC_CONN_FLAGS_THRESHOLD_LEVEL_ONE_FOURTH = 0x0, ATH10K_HTC_CONN_FLAGS_THRESHOLD_LEVEL_ONE_HALF = 0x1, ATH10K_HTC_CONN_FLAGS_THRESHOLD_LEVEL_THREE_FOURTHS = 0x2, ATH10K_HTC_CONN_FLAGS_THRESHOLD_LEVEL_UNITY = 0x3, #define ATH10K_HTC_CONN_FLAGS_THRESHOLD_LEVEL_MASK 0x3 ATH10K_HTC_CONN_FLAGS_REDUCE_CREDIT_DRIBBLE = 1 << 2, ATH10K_HTC_CONN_FLAGS_DISABLE_CREDIT_FLOW_CTRL = 1 << 3 #define ATH10K_HTC_CONN_FLAGS_RECV_ALLOC_MASK 0xFF00 #define ATH10K_HTC_CONN_FLAGS_RECV_ALLOC_LSB 8 }; #define ATH10K_HTC_MSG_READY_EXT_ALT_DATA_MASK 0xFFF enum ath10k_htc_conn_svc_status { ATH10K_HTC_CONN_SVC_STATUS_SUCCESS = 0, ATH10K_HTC_CONN_SVC_STATUS_NOT_FOUND = 1, ATH10K_HTC_CONN_SVC_STATUS_FAILED = 2, ATH10K_HTC_CONN_SVC_STATUS_NO_RESOURCES = 3, ATH10K_HTC_CONN_SVC_STATUS_NO_MORE_EP = 4 }; #define ATH10K_MAX_MSG_PER_HTC_TX_BUNDLE 32 #define ATH10K_MIN_MSG_PER_HTC_TX_BUNDLE 2 #define ATH10K_MIN_CREDIT_PER_HTC_TX_BUNDLE 2 enum ath10k_htc_setup_complete_flags { ATH10K_HTC_SETUP_COMPLETE_FLAGS_RX_BNDL_EN =