• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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