import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / connectivity / conn_soc / drv_wlan / mt_wifi / wlan / mgmt / wnm.c
CommitLineData
6fa3eb70
S
1/*
2** $Id: //Department/DaVinci/TRUNK/MT6620_5931_WiFi_Driver/mgmt/wnm.c#1 $
3*/
4
5/*! \file "wnm.c"
6 \brief This file includes the 802.11v default vale and functions.
7*/
8
9
10
11/*
12** $Log: wnm.c $
13 *
14 * 01 05 2012 tsaiyuan.hsu
15 * [WCXRP00001157] [MT6620 Wi-Fi][FW][DRV] add timing measurement support for 802.11v
16 * add timing measurement support for 802.11v.
17 *
18 *
19*/
20
21/*******************************************************************************
22* C O M P I L E R F L A G S
23********************************************************************************
24*/
25
26/*******************************************************************************
27* E X T E R N A L R E F E R E N C E S
28********************************************************************************
29*/
30#include "precomp.h"
31
32#if CFG_SUPPORT_802_11V
33
34/*******************************************************************************
35* C O N S T A N T S
36********************************************************************************
37*/
38
39#define WNM_MAX_TOD_ERROR 0
40#define WNM_MAX_TOA_ERROR 0
41#define MICRO_TO_10NANO(x) ((x)*100)
42/*******************************************************************************
43* D A T A T Y P E S
44********************************************************************************
45*/
46
47/*******************************************************************************
48* P U B L I C D A T A
49********************************************************************************
50*/
51
52/*******************************************************************************
53* P R I V A T E D A T A
54********************************************************************************
55*/
56
57static UINT_8 ucTimingMeasToken = 0;
58
59/*******************************************************************************
60* M A C R O S
61********************************************************************************
62*/
63
64/*******************************************************************************
65* F U N C T I O N D E C L A R A T I O N S
66********************************************************************************
67*/
68
69WLAN_STATUS
70wnmRunEventTimgingMeasTxDone (
71 IN P_ADAPTER_T prAdapter,
72 IN P_MSDU_INFO_T prMsduInfo,
73 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
74 );
75
76VOID
77wnmComposeTimingMeasFrame (
78 IN P_ADAPTER_T prAdapter,
79 IN P_STA_RECORD_T prStaRec,
80 IN PFN_TX_DONE_HANDLER pfTxDoneHandler
81 );
82
83VOID
84wnmTimingMeasRequest (
85 IN P_ADAPTER_T prAdapter,
86 IN P_SW_RFB_T prSwRfb
87 );
88/*******************************************************************************
89* F U N C T I O N S
90********************************************************************************
91*/
92
93/*----------------------------------------------------------------------------*/
94/*!
95*
96* \brief This routine is called to process the 802.11v wnm category action frame.
97*
98*
99* \note
100* Called by: Handle Rx mgmt request
101*/
102/*----------------------------------------------------------------------------*/
103VOID
104wnmWNMAction (
105 IN P_ADAPTER_T prAdapter,
106 IN P_SW_RFB_T prSwRfb
107 )
108{
109 P_WLAN_ACTION_FRAME prRxFrame;
110
111 ASSERT(prAdapter);
112 ASSERT(prSwRfb);
113
114 prRxFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader;
115
116#if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
117 if (prRxFrame->ucAction == ACTION_WNM_TIMING_MEASUREMENT_REQUEST) {
118 wnmTimingMeasRequest(prAdapter, prSwRfb);
119 return;
120 }
121#endif
122
123 DBGLOG(WNM, TRACE, ("Unsupport WNM action frame: %d\n", prRxFrame->ucAction));
124}
125
126#if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
127/*----------------------------------------------------------------------------*/
128/*!
129*
130* \brief This routine is called to report timing measurement data.
131*
132*/
133/*----------------------------------------------------------------------------*/
134VOID
135wnmReportTimingMeas (
136 IN P_ADAPTER_T prAdapter,
137 IN UINT_8 ucStaRecIndex,
138 IN UINT_32 u4ToD,
139 IN UINT_32 u4ToA
140 )
141{
142 P_STA_RECORD_T prStaRec;
143
144 prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
145
146 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
147 return;
148 }
149
150 DBGLOG(WNM, TRACE, ("wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA));
151
152 if (!prStaRec->rWNMTimingMsmt.ucTrigger)
153 return;
154
155 prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD);
156 prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA);
157}
158
159/*----------------------------------------------------------------------------*/
160/*!
161* @brief This function will handle TxDone(TimingMeasurement) Event.
162*
163* @param[in] prAdapter Pointer to the Adapter structure.
164* @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
165* @param[in] rTxDoneStatus Return TX status of the Timing Measurement frame.
166*
167* @retval WLAN_STATUS_SUCCESS
168*/
169/*----------------------------------------------------------------------------*/
170WLAN_STATUS
171wnmRunEventTimgingMeasTxDone (
172 IN P_ADAPTER_T prAdapter,
173 IN P_MSDU_INFO_T prMsduInfo,
174 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
175 )
176{
177 P_STA_RECORD_T prStaRec;
178
179 ASSERT(prAdapter);
180 ASSERT(prMsduInfo);
181
182 DBGLOG(WNM, LOUD, ("EVENT-TX DONE: Current Time = %u\n",
183 kalGetTimeTick()));
184
185 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
186
187 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
188 return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
189 }
190
191 DBGLOG(WNM, TRACE, ("wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x",
192 prStaRec->rWNMTimingMsmt.ucDialogToken,
193 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken,
194 prStaRec->rWNMTimingMsmt.u4ToD,
195 prStaRec->rWNMTimingMsmt.u4ToA));
196
197 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
198 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
199
200 wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL);
201
202 return WLAN_STATUS_SUCCESS;
203
204} /* end of wnmRunEventTimgingMeasTxDone() */
205
206/*----------------------------------------------------------------------------*/
207/*!
208* @brief This function will compose the Timing Measurement frame.
209*
210* @param[in] prAdapter Pointer to the Adapter structure.
211* @param[in] prStaRec Pointer to the STA_RECORD_T.
212*
213* @return (none)
214*/
215/*----------------------------------------------------------------------------*/
216VOID
217wnmComposeTimingMeasFrame (
218 IN P_ADAPTER_T prAdapter,
219 IN P_STA_RECORD_T prStaRec,
220 IN PFN_TX_DONE_HANDLER pfTxDoneHandler
221 )
222{
223 P_MSDU_INFO_T prMsduInfo;
224 P_BSS_INFO_T prBssInfo;
225 P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame;
226 UINT_16 u2PayloadLen;
227
228 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
229 ASSERT(prBssInfo);
230
231 prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter,
232 MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN);
233
234 if (!prMsduInfo)
235 return;
236
237 prTxFrame = (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME)
238 ((ULONG)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
239
240 prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
241
242 COPY_MAC_ADDR(prTxFrame->aucDestAddr, prStaRec->aucMacAddr);
243 COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
244 COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
245
246 prTxFrame->ucCategory = CATEGORY_UNPROTECTED_WNM_ACTION;
247 prTxFrame->ucAction = ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT;
248
249 //3 Compose the frame body's frame.
250 prTxFrame->ucDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
251 prTxFrame->ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken;
252 prTxFrame->u4ToD = prStaRec->rWNMTimingMsmt.u4ToD;
253 prTxFrame->u4ToA = prStaRec->rWNMTimingMsmt.u4ToA;
254 prTxFrame->ucMaxToDErr = WNM_MAX_TOD_ERROR;
255 prTxFrame->ucMaxToAErr = WNM_MAX_TOA_ERROR;
256
257 u2PayloadLen = 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN;
258
259 //4 Update information of MSDU_INFO_T
260 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT; /* Management frame */
261 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
262 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
263 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
264 prMsduInfo->fgIs802_1x = FALSE;
265 prMsduInfo->fgIs802_11 = TRUE;
266 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
267 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
268 prMsduInfo->pfTxDoneHandler = pfTxDoneHandler;
269 prMsduInfo->fgIsBasicRate = FALSE;
270
271 DBGLOG(WNM, TRACE, ("wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n",
272 prTxFrame->ucDialogToken, prTxFrame->ucFollowUpDialogToken,
273 prTxFrame->u4ToD, prTxFrame->u4ToA));
274
275 //4 Enqueue the frame to send this action frame.
276 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
277
278 return;
279
280} /* end of wnmComposeTimingMeasFrame() */
281
282/*----------------------------------------------------------------------------*/
283/*!
284*
285* \brief This routine is called to process the 802.11v timing measurement request.
286*
287*
288* \note
289* Handle Rx mgmt request
290*/
291/*----------------------------------------------------------------------------*/
292VOID
293wnmTimingMeasRequest (
294 IN P_ADAPTER_T prAdapter,
295 IN P_SW_RFB_T prSwRfb
296 )
297{
298 P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL;
299 P_STA_RECORD_T prStaRec;
300
301 prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME)prSwRfb->pvHeader;
302 if (!prRxFrame)
303 return;
304
305 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
306 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
307 return;
308 }
309
310 DBGLOG(WNM, TRACE, ("IEEE 802.11: Received Timing Measuremen Request from "
311 MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
312
313 // reset timing msmt
314 prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
315 prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger;
316 if (!prRxFrame->ucTrigger)
317 return;
318
319 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
320 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
321
322 wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
323}
324
325#if WNM_UNIT_TEST
326VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex)
327{
328 P_STA_RECORD_T prStaRec;
329
330 prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
331 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
332 return;
333 }
334
335 DBGLOG(WNM, INFO, ("IEEE 802.11v: Test Timing Measuremen Request from "
336 MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
337
338 prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
339 prStaRec->rWNMTimingMsmt.ucTrigger = 1;
340
341 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
342 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
343
344 wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
345}
346#endif
347
348#endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */
349
350#endif /* CFG_SUPPORT_802_11V */