1 /* 2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 * Description: Header file of the DMAC external public interface. 15 */ 16 17 #ifndef __DMAC_EXT_IF_DEVICE_ROM_H__ 18 #define __DMAC_EXT_IF_DEVICE_ROM_H__ 19 20 /***************************************************************************** 21 1 其他头文件包含 22 *****************************************************************************/ 23 #include "osal_types.h" 24 #include "oal_types_device_rom.h" 25 #include "dmac_ext_if_type_rom.h" 26 #include "wlan_types.h" 27 #include "hal_common_ops_device_rom.h" 28 #include "mac_frame_common_rom.h" 29 30 #ifdef __cplusplus 31 #if __cplusplus 32 extern "C" { 33 #endif 34 #endif 35 36 /***************************************************************************** 37 2 宏定义 38 *****************************************************************************/ 39 #define DMAC_BA_SEQNO_MASK 0x0FFF /* max sequece number */ 40 #define DMAC_BA_MAX_SEQNO_BY_TWO 2048 41 #define DMAC_BA_BMP_SIZE 64 42 43 /***************************************************************************** 44 3 枚举定义 45 *****************************************************************************/ 46 /* Type of Tx Descriptor status */ 47 typedef enum { 48 DMAC_TX_INVALID = 0, /* 无效 */ 49 DMAC_TX_SUCC, /* 成功 */ 50 DMAC_TX_FAIL, /* 发送失败(超过重传限制:接收响应帧超时) */ 51 DMAC_TX_TIMEOUT, /* lifetime超时(没法送出去) */ 52 DMAC_TX_RTS_FAIL, /* RTS 发送失败(超出重传限制:接收cts超时) */ 53 DMAC_TX_NOT_COMPRASS_BA, /* 收到的BA是非压缩块确认 */ 54 DMAC_TX_TID_MISMATCH, /* 收到的BA中TID与发送时填写在描述符中的TID不一致 */ 55 DMAC_TX_KEY_SEARCH_FAIL, /* Key search failed */ 56 DMAC_TX_AMPDU_MISMATCH, /* 描述符异常 */ 57 DMAC_TX_PENDING, /* 02:没有中断均为pending;03:发送过程中为pending */ 58 DMAC_TX_FAIL_RESV, /* resv */ 59 DMAC_TX_FAIL_BW_TOO_BIG, /* 带宽超过PHY的最大工作带宽或流数超过最大天线数, 软件回收该帧 */ 60 DMAC_TX_FAIL_ABORT, /* 发送失败(因为abort) */ 61 DMAC_TX_FAIL_STATEMACHINE_PHY_ERROR, /* MAC发送该帧异常结束(状态机超时、phy提前结束等原因) */ 62 DMAC_TX_SOFT_PSM_BACK, /* 软件节能回退 */ 63 DMAC_TX_AMPDU_BITMAP_MISMATCH /* 硬件解析bitmap,当前mpdu未被确认 */ 64 } dmac_tx_dscr_status_enum; 65 typedef osal_u8 dmac_tx_dscr_status_enum_uint8; 66 67 /* cb字段action帧子类型枚举定义 */ 68 typedef enum { 69 WLAN_ACTION_BA_ADDBA_REQ = 0, /* 聚合action */ 70 WLAN_ACTION_BA_ADDBA_RSP, 71 WLAN_ACTION_BA_DELBA, 72 WLAN_ACTION_SMPS_FRAME_SUBTYPE, /* SMPS节能action */ 73 WLAN_ACTION_OPMODE_FRAME_SUBTYPE, /* 工作模式通知action */ 74 WLAN_ACTION_P2PGO_FRAME_SUBTYPE, /* host发送的P2P go帧,主要是discoverability request */ 75 WLAN_ACTION_TWT_SETUP_REQ, 76 WLAN_ACTION_TWT_TEARDOWN_REQ, 77 WLAN_ACTION_TWT_INFORMATION_REQ, 78 79 #ifdef _PRE_WLAN_FEATURE_WUR_TX 80 WLAN_ACTION_WUR_MODE_SETUP, /* WUR Mode Setup帧 */ 81 WLAN_ACTION_WUR_MODE_TEARDOWN, /* WUR Mode Teardown帧 */ 82 #endif 83 84 WLAN_FRAME_TYPE_ACTION_BUTT 85 } wlan_cb_action_subtype_enum; 86 typedef osal_u8 wlan_cb_frame_subtype_enum_uint8; 87 88 typedef hal_rx_ctl_stru mac_rx_ctl_stru; 89 90 /* DMAC模块接收流程控制信息结构,存放于对应的netbuf的CB字段中,最大值为48字节, 91 如果修改,一定要通知sdt同步修改,否则解析会有错误!!!!!!!!!!!!!!!!!!!!!!!!! */ 92 typedef struct { 93 hal_rx_ctl_stru rx_info; /* dmac需要传给hmac的数据信息 20 bytes */ 94 hal_rx_status_stru rx_status; /* 保存加密类型及帧长信息 4 bytes */ 95 hal_rx_statistic_stru rx_statistic; /* 保存接收描述符的统计信息 8 bytes */ 96 } dmac_rx_ctl_stru; 97 98 /* 1字节对齐 */ 99 #pragma pack(push, 1) 100 typedef struct { 101 mac_ieee80211_frame_stru *frame_header; /* 802.11帧头 */ 102 osal_u16 seqnum; /* SN */ 103 wlan_frame_type_enum_uint8 frame_type; /* 管理帧/控制帧/数据帧 */ 104 osal_u8 mac_head_type_80211 : 1; /* */ 105 osal_u8 res : 7; 106 } mac_tx_expand_cb_stru; 107 108 /* 裸系统cb字段 只有20字节可用, 当前使用19字节; HCC[8]+PAD[1]+CB[19]+MAC HEAD[36] */ 109 struct mac_tx_ctl { 110 /* byte1-2 */ 111 wlan_cb_frame_type_enum_uint8 frame_type; /* 自定义帧类型 */ 112 wlan_cb_frame_subtype_enum_uint8 frame_subtype; /* 自定义帧子类型 */ 113 /* byte3 */ 114 osal_u8 mpdu_num : 7; /* ampdu中包含的MPDU个数,实际描述符填写的值为此值-1 */ 115 osal_u8 netbuf_num : 1; /* 每个MPDU占用的netbuff数目,在每个MPDU的第一个NETBUF中有效 */ 116 /* byte4-5 */ 117 osal_u16 mpdu_payload_len; /* 每个MPDU的长度不包括mac header length */ 118 /* byte6 */ 119 osal_u8 frame_header_length : 6; /* 51四地址32,该MPDU的802.11头长度 */ 120 osal_u8 is_amsdu : 1; /* 是否AMSDU: HI_FALSE不是,HI_TRUE是 */ 121 osal_u8 is_first_msdu : 1; /* 是否是第一个子帧,HI_FALSE不是 HI_TRUE是 */ 122 /* byte7 */ 123 osal_u8 tid : 4; /* dmac tx 到 tx complete 传递的user结构体,目标用户地址 */ 124 wlan_wme_ac_type_enum_uint8 ac : 3; /* ac */ 125 osal_u8 ismcast : 1; /* 该MPDU是单播还是多播:HI_FALSE单播,HI_TRUE多播 */ 126 /* byte8 */ 127 osal_u8 retried_num : 4; /* 重传次数 */ 128 osal_u8 mgmt_frame_id : 4; /* wpas 发送管理帧的frame id */ 129 /* byte9 */ 130 osal_u8 tx_user_idx : 6; /* 比描述符中userindex多一个bit用于标识无效index */ 131 osal_u8 roam_data : 1; /* 漫游期间帧发送标记 */ 132 osal_u8 is_get_from_ps_queue : 1; /* 节能特性用,标识一个MPDU是否从节能队列中取出来的 */ 133 /* byte10 */ 134 osal_u8 tx_vap_index : 3; /* dmac_vap id */ 135 wlan_tx_ack_policy_enum_uint8 ack_policy : 3; 136 osal_u8 is_needretry : 1; 137 osal_u8 need_rsp : 1; /* WPAS send mgmt,need dmac response tx status */ 138 /* byte11 */ 139 osal_u8 is_eapol_key_ptk : 1; /* 4 次握手过程中设置单播密钥EAPOL KEY 帧标识 */ 140 osal_u8 is_m2u_data : 1; /* 是否是组播转单播的数据 */ 141 osal_u8 is_large_skb_amsdu : 1; /* 是否是多子帧大包聚合 */ 142 osal_u8 ether_head_including : 1; /* offload下netbuf头部LLC之前是否有etherhead */ 143 osal_u8 use_4_addr : 1; /* 是否使用4地址,由WDS特性决定 */ 144 osal_u8 resrv_6 : 3; 145 /* byte12-13 */ 146 osal_u8 alg_pktno; /* 算法用到的字段,唯一标示该报文 */ 147 osal_u8 alg_frame_tag; /* 用于算法对帧进行标记 */ 148 /* byte14 */ 149 osal_u8 align_padding_offset : 2; 150 osal_u8 is_tcp_ack : 1; /* 用于标记tcp ack */ 151 osal_u8 is_bcast : 1; 152 osal_u8 is_wur : 3; /* 标记是否是WUR帧和具体类型 */ 153 osal_u8 is_fake_buffer : 1; /* 标记报文是否从fake队列中来 */ 154 /* byte15 */ 155 osal_u8 msdu_num; /* lowdelay 当前layer的总包数 */ 156 /* byte16 ~ byte19 */ 157 osal_u32 latency_timestamp_us : 24; /* 时延耗时统计时间戳,单位1us精度 */ 158 osal_u32 latency_index : 8; /* 时延耗时统计报文标识 */ 159 /* byte20 ~ byte23 */ 160 osal_u16 partial_aid : 9, 161 ax_bss_color : 6, 162 txop_ps_not_allowed : 1; 163 osal_u8 tx_hal_vap_index : 2, 164 ra_lut_index : 3, 165 lsig_txop : 1, 166 slp_frame_id : 2; 167 osal_u8 retry_flag_hw_bypass : 1, 168 duration_hw_bypass : 1, 169 timestamp_hw_bypass : 1, 170 tx_pn_hw_bypass : 1, 171 is_custom_rts : 1, /* 是否为自定义RTS报文 */ 172 is_custom : 1, /* 是否为自定义任意报文 */ 173 resrv_2 : 2; 174 /* byte24 ~ byte27 */ 175 osal_u8 cipher_key_type; /* 密钥ID/类型 */ 176 osal_u8 cipher_protocol_type; 177 osal_u8 cipher_key_id; 178 osal_u8 resrv_3; 179 /* byte28 ~ byte31 */ 180 osal_u8 ftm_protocol_mode : 4, /* ftm */ 181 ftm_bandwidth : 4; 182 osal_u8 ftm_cali_en : 1, 183 is_ftm : 2, 184 ftm_chain : 2, 185 resrv_4 : 3; 186 osal_u8 rssi_level : 2, /* tpc */ 187 tpc_code_is_valid : 1, /* 判断tpc_code是否有效 */ 188 probe_data_type : 4, /* 是否探测帧 */ 189 tx_tuple_opt_meet : 1; 190 osal_u8 tpc_code; /* 目前用于设置wifi aware action帧功率 */ 191 192 /* byte32 */ 193 osal_u8 al_rx_tid_type; /* 常收模式tid类型 */ 194 195 /* byte33 ~ byte40, expand_cb只在HMAC侧用,不传输到DMAC侧 */ 196 mac_tx_expand_cb_stru expand_cb; 197 }; 198 typedef struct mac_tx_ctl mac_tx_ctl_stru; 199 #pragma pack(pop) 200 201 #ifdef __cplusplus 202 #if __cplusplus 203 } 204 #endif 205 #endif 206 207 #endif /* end of dmac_ext_if_device.h */ 208