1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
|
#ifndef __INC_VHTGEN_H
#define __INC_VHTGEN_H
#define GET_VHT_INFO(_pMgntInfo) ((PRT_VERY_HIGH_THROUGHPUT)((_pMgntInfo)->pVHTInfo))
//VHT capability info
#define SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val)
#define SET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 2, 2, _val)
#define SET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 4, 1, _val)
#define SET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 5, 1, _val)
#define SET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 6, 1, _val)
#define SET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val)
#define SET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 0, 3, _val)
#define SET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 3, 1, _val) // B11
#define SET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 4, 1, _val) // B12
#define SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 5, 3, _val) // B13~B15
#define SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 0, 3, _val) // B16~B18
#define SET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 3, 1, _val) // B19
#define SET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 4, 1, _val) // B20
#define SET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 5, 1, _val)
#define SET_VHT_CAPABILITY_ELE_HTC_VHT(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 1, _val)
#define SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+2, 7, 3, _val) //B23~B25
#define SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+3, 2, 2, _val) // B26~B27
#define SET_VHT_CAPABILITY_ELE_MCS_RX_MAP(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+4, 0, 16, _val) //B0~B15 indicate Rx MCS MAP, we write 0 to indicate MCS0~7. by page
#define SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+6, 0, 13, _val)
#define SET_VHT_CAPABILITY_ELE_MCS_TX_MAP(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+8, 0, 16, _val) //B0~B15 indicate Tx MCS MAP, we write 0 to indicate MCS0~7. by page
#define SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+10, 0, 13, _val)
#define GET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 2)
#define GET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 2, 2)
#define GET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 4, 1)
#define GET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 5, 1)
#define GET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 6, 1)
#define GET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 7, 1)
#define GET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 3)
#define GET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 3, 1)
#define GET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 4, 1)
#define GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+1, 5, 3)
#define GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+2, 0, 3)
#define GET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 3, 1)
#define GET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 4, 1)
#define GET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 5, 1)
#define GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+2, 7, 3)
#define GET_VHT_CAPABILITY_ELE_RX_MCS(_pEleStart) ((_pEleStart)+4)
#define GET_VHT_CAPABILITY_ELE_TX_MCS(_pEleStart) ((_pEleStart)+8)
//VHT Operation Information Element
#define SET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 8, _val)
#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(_pEleStart, _val) SET_BITS_TO_LE_2BYTE(_pEleStart+1, 0, 8, _val)
#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(_pEleStart, _val) SET_BITS_TO_LE_2BYTE(_pEleStart+2, 0, 8, _val)
#define SET_VHT_OPERATION_ELE_BASIC_MCS_SET(_pEleStart, _val) SET_BITS_TO_LE_2BYTE(_pEleStart+3, 0, 16, _val)
#define GET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart,0,8)
#define GET_VHT_OPERATION_ELE_CENTER_FREQ1(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1,0,8)
#define GET_VHT_OPERATION_ELE_CENTER_FREQ2(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2,0,8)
//VHT Operating Mode
#define SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val)
#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 4, 3, _val)
#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val)
#define GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 2)
#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 4, 3)
#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 7, 1)
#define SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+7, 6, 1, _val)
#define GET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+7, 6, 1)
// VHT GID Management Frame Info.
#define GET_VHT_GID_MGNT_INFO_MEMBERSHIP_STATUS(_pStart) LE_BITS_TO_1BYTE((_pStart), 0, 8)
#define GET_VHT_GID_MGNT_INFO_USER_POSITION(_pStart) LE_BITS_TO_1BYTE((_pStart), 0, 8)
// VHT Beamforming Report Poll
#define SET_VHT_BF_REPORT_POLL_RA(_hdr, _val) cpMacAddr(((pu1Byte)(_hdr))+4, (pu1Byte)(_val))
#define SET_VHT_BF_REPORT_POLL_TA(_hdr, _val) cpMacAddr(((pu1Byte)(_hdr))+10, (pu1Byte)(_val))
#define SET_VHT_BF_REPORT_POLL_FEEDBACK_SEG_RETRAN_BITMAP(_hdr, _val) SET_BITS_TO_LE_1BYTE((_hdr)+16, 0, 8, (_val))
typedef enum _VHT_DATA_SC{
VHT_DATA_SC_DONOT_CARE = 0,
VHT_DATA_SC_20_UPPER_OF_80MHZ = 1,
VHT_DATA_SC_20_LOWER_OF_80MHZ = 2,
VHT_DATA_SC_20_TOP_OF_80MHZ = 3,
VHT_DATA_SC_20_BOTTOM_OF_80MHZ = 4,
VHT_DATA_SC_20_RECV1 = 5,
VHT_DATA_SC_20_RECV2 = 6,
VHT_DATA_SC_20_RECV3 = 7,
VHT_DATA_SC_20_RECV4 = 8,
VHT_DATA_SC_40_UPPER_OF_80MHZ = 9,
VHT_DATA_SC_40_LOWER_OF_80MHZ = 10,
}VHT_DATA_SC, *PVHT_DATA_SC_E;
typedef enum _PROTECTION_MODE{
PROTECTION_MODE_AUTO = 0,
PROTECTION_MODE_FORCE_ENABLE = 1,
PROTECTION_MODE_FORCE_DISABLE = 2,
}PROTECTION_MODE, *PPROTECTION_MODE;
typedef enum _RT_BEAMFORMING_PKT_TYPE{
RT_BF_PKT_TYPE_NONE = 0,
RT_BF_PKT_TYPE_UNICAST_NDPA = 1,
RT_BF_PKT_TYPE_BROADCAST_NDPA = 2,
RT_BF_PKT_TYPE_BF_REPORT_POLL = 3,
RT_BF_PKT_TYPE_FINAL_BF_REPORT_POLL = 4,
}RT_BEAMFORMING_PKT_TYPE;
#define LDPC_VHT_ENABLE_RX BIT0
#define LDPC_VHT_ENABLE_TX BIT1
#define LDPC_VHT_TEST_TX_ENABLE BIT2
#define LDPC_VHT_CAP_TX BIT3
#define STBC_VHT_ENABLE_RX BIT0
#define STBC_VHT_ENABLE_TX BIT1
#define STBC_VHT_TEST_TX_ENABLE BIT2
#define STBC_VHT_CAP_TX BIT3
#define BEAMFORMING_VHT_BEAMFORMER_ENABLE BIT0 // Declare our NIC supports beamformer
#define BEAMFORMING_VHT_BEAMFORMEE_ENABLE BIT1 // Declare our NIC supports beamformee
#define BEAMFORMING_VHT_MU_MIMO_AP_ENABLE BIT2 // Declare our NIC support MU-MIMO AP mode
#define BEAMFORMING_VHT_MU_MIMO_STA_ENABLE BIT3 // Declare our NIC support MU-MIMO STA mode
#define BEAMFORMING_VHT_BEAMFORMER_TEST BIT4 // Transmiting Beamforming no matter the target supports it or not
#define BEAMFORMING_VHT_BEAMFORMER_STS_CAP (BIT8|BIT9|BIT10) // Asoc rsp cap
#define BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM (BIT12|BIT13|BIT14) // Asoc rsp cap
//
// VHT Group ID (GID) Management Frame
//
#define FRAME_OFFSET_VHT_GID_MGNT_CATEGORY (sMacHdrLng + 0)
#define FRAME_OFFSET_VHT_GID_MGNT_ACTION (sMacHdrLng + 1)
#define FRAME_OFFSET_VHT_GID_MGNT_MEMBERSHIP_STATUS_ARRAY (sMacHdrLng + 2)
#define FRAME_OFFSET_VHT_GID_MGNT_USER_POSITION_ARRAY (sMacHdrLng + 10)
typedef struct _RT_VERY_HIGH_THROUGHPUT{
DECLARE_RT_OBJECT(_RT_VERY_HIGH_THROUGHPUT);
BOOLEAN bEnableVHT;
BOOLEAN bCurrentVHTSupport;
BOOLEAN bRegBW80MHz; // Tx 80MHz channel capablity
BOOLEAN bRegShortGI80MHz; // Capability setting for Tx Short GI for 80MHz
BOOLEAN bCurShortGI80MHz; // Tx Short GI for 80MHz
u1Byte VhtLdpcCap; // Capability combination of VHT LDPC LDPC_VHT_XXX
u1Byte VhtCurLdpc; // Current combination of VHT LDPC LDPC_VHT_XXX of target connection supports LDPC
u1Byte VhtStbcCap; // Capability combination of STBC_VHT_XXX.
u1Byte VhtCurStbc; // Current setting of STBC
u2Byte VhtBeamformCap; // Capability combination of VHT LDPC LDPC_VHT_XXX
u2Byte VhtCurBeamform; // Current combination of BEAMFORMING_VHT_XXX in BSS connection
u1Byte AMPDU_Len; // Maximum A-MPUD Length Exponent
// VHT related information for "Self"
u1Byte SelfVHTCap[26]; //HT_CAPABILITY_ELE SelfHTCap; // This is HT cap element sent to peer STA, which also indicate HT Rx capabilities.
u1Byte SelfVHTInfo[22]; // This is HT info element sent to peer STA, which also indicate HT Rx capabilities.
// VHT related information for "Peer"
u1Byte PeerVHTCapBuf[32];
u1Byte PeerVHTInfoBuf[32];
// 40MHz Channel Offset settings.
CHANNEL_WIDTH PeerChnlBW;
// Operating Mode Notification
BOOLEAN bOpModeNotif;
CHANNEL_WIDTH BWToSwitch;
u1Byte RxSSToSwitch;
BOOLEAN RxSSTypeBfmeeToSwitch;
// Sigma related
BOOLEAN bFixedRTSBW;
CHANNEL_WIDTH DynamicRTSBW;
u1Byte BWSignalingCtrl;
u1Byte nTxSPStream;
u1Byte nRxSPStream;
BOOLEAN bUpdateMcsCap;
u1Byte McsCapability;
BOOLEAN bAssignTxLGIRate;
u2Byte highestTxLGIRate;
CHANNEL_WIDTH DynamicCTSBW;
}RT_VERY_HIGH_THROUGHPUT, *PRT_VERY_HIGH_THROUGHPUT;
typedef struct _RT_VHTINFO_STA_ENTRY{
BOOLEAN bEnableVHT;
u1Byte LDPC;
u1Byte STBC;
BOOLEAN bShortGI80M;
u2Byte VhtCurBeamform; // Beamforming Settings.
u2Byte AMSDU_MaxSize;
u1Byte VHTRateSet[2];
}RT_VHTINFO_STA_ENTRY, *PRT_VHTINFO_STA_ENTRY;
//------------------------------------------------------------
// The Data structure is used to keep VHT related variable for "each AP"
// when card is configured as "STA mode"
//------------------------------------------------------------
typedef struct _BSS_VHT{
BOOLEAN bdSupportVHT;
// VHT related elements
u1Byte bdVHTCapBuf[13];
u2Byte bdVHTCapLen;
u1Byte bdVHTOperBuf[6];
u2Byte bdVHTOperLen;
u1Byte bdVHTOpModeNotifBuf[1];
u2Byte bdVHTOpModeNotifLen;
}BSS_VHT, *PBSS_VHT;
u2Byte
VHTMcsToDataRate(
PADAPTER Adapter,
u2Byte nMcsRate
);
u1Byte
RateToSpatialStream(
pu1Byte pVHTRate
);
u1Byte
VHTIOTActIsAMsduEnable(
PADAPTER Adapter
);
VOID
VHTConstructOpModeNotification(
PADAPTER Adapter,
pu1Byte Addr,
pu1Byte Buffer,
pu4Byte pLength
);
VOID
VHTConstructCapabilityElement(
PADAPTER Adapter,
POCTET_STRING posVHTInfo,
BOOLEAN bAssoc
);
VOID
VHTConstructOperationElement(
PADAPTER Adapter,
POCTET_STRING posVHTOperation
);
VOID
VHTSendOperatingModeNotification(
IN PADAPTER Adapter,
IN pu1Byte Addr
);
u1Byte
VHTGetHighestMCSRate(
IN PADAPTER Adapter,
IN pu1Byte pVHTMCSRateSet
);
RT_STATUS
VHT_OnOpModeNotify(
IN PADAPTER Adapter,
IN PRT_RFD pRfd,
IN POCTET_STRING posMpdu
);
VOID
VHTOnAssocRsp(
IN PADAPTER Adapter,
IN OCTET_STRING asocpdu);
VOID
VHTInitializeVHTInfo(
PADAPTER Adapter
);
VOID
VHTCheckVHTCap(
IN PADAPTER Adapter,
IN PRT_WLAN_STA pEntry,
IN pu1Byte pVHTCap
);
BOOLEAN
VHTModeSupport(
PADAPTER Adapter,
POCTET_STRING pSRCmmpdu
);
VOID
VHTGetValueFromBeaconOrProbeRsp(
PADAPTER Adapter,
POCTET_STRING pSRCmmpdu,
PRT_WLAN_BSS bssDesc
);
VOID
VHTResetSelfAndSavePeerSetting(
PADAPTER Adapter,
PRT_WLAN_BSS pBssDesc
);
VOID
VHTUseDefaultSetting(
PADAPTER Adapter
);
VOID
VHTUpdateSelfAndPeerSetting(
PADAPTER Adapter,
PRT_WLAN_BSS pBssDesc
);
VOID
VHTMaskSuppDataRate(
pu1Byte pVHTRate,
u1Byte maxSS,
u1Byte mcsCap
);
#endif
|