support different wifi bt chip auto compatible
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / mt5931_kk / drv_wlan / mgmt / wnm.c
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 * Copyright (c) 2007 MediaTek Inc.
11 *
12 * All rights reserved. Copying, compilation, modification, distribution
13 * or any other use whatsoever of this material is strictly prohibited
14 * except in accordance with a Software License Agreement with
15 * MediaTek Inc.
16 ********************************************************************************
17 */
18
19 /*******************************************************************************
20 * LEGAL DISCLAIMER
21 *
22 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
23 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
24 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
25 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
26 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
27 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
28 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
29 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
30 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
31 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
32 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
33 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
34 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
35 *
36 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
37 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
38 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
39 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
40 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
41 *
42 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
43 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
44 * OF LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
45 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
46 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
47 * (ICC).
48 ********************************************************************************
49 */
50
51 /*
52 ** $Log: wnm.c $
53  *
54  * 01 05 2012 tsaiyuan.hsu
55  * [WCXRP00001157] [MT6620 Wi-Fi][FW][DRV] add timing measurement support for 802.11v
56  * add timing measurement support for 802.11v.
57  *
58  * 
59 */
60
61 /*******************************************************************************
62 *                         C O M P I L E R   F L A G S
63 ********************************************************************************
64 */
65
66 /*******************************************************************************
67 *                    E X T E R N A L   R E F E R E N C E S
68 ********************************************************************************
69 */
70 #include "precomp.h"
71
72 #if CFG_SUPPORT_802_11V
73
74 /*******************************************************************************
75 *                              C O N S T A N T S
76 ********************************************************************************
77 */
78
79 #define WNM_MAX_TOD_ERROR  0
80 #define WNM_MAX_TOA_ERROR  0
81 #define MICRO_TO_10NANO(x) ((x)*100)
82 /*******************************************************************************
83 *                             D A T A   T Y P E S
84 ********************************************************************************
85 */
86
87 /*******************************************************************************
88 *                            P U B L I C   D A T A
89 ********************************************************************************
90 */
91
92 /*******************************************************************************
93 *                           P R I V A T E   D A T A
94 ********************************************************************************
95 */
96
97 static UINT_8 ucTimingMeasToken = 0;
98
99 /*******************************************************************************
100 *                                 M A C R O S
101 ********************************************************************************
102 */
103
104 /*******************************************************************************
105 *                   F U N C T I O N   D E C L A R A T I O N S
106 ********************************************************************************
107 */
108
109 WLAN_STATUS
110 wnmRunEventTimgingMeasTxDone (
111     IN P_ADAPTER_T              prAdapter,
112     IN P_MSDU_INFO_T            prMsduInfo,
113     IN ENUM_TX_RESULT_CODE_T    rTxDoneStatus
114     );
115
116 VOID
117 wnmComposeTimingMeasFrame (
118     IN P_ADAPTER_T         prAdapter,    
119     IN P_STA_RECORD_T      prStaRec,
120     IN PFN_TX_DONE_HANDLER pfTxDoneHandler
121     );
122
123 VOID
124 wnmTimingMeasRequest (
125     IN P_ADAPTER_T                  prAdapter,
126     IN P_SW_RFB_T                   prSwRfb
127     );
128 /*******************************************************************************
129 *                              F U N C T I O N S
130 ********************************************************************************
131 */
132
133 /*----------------------------------------------------------------------------*/
134 /*!
135 *
136 * \brief This routine is called to process the 802.11v wnm category action frame.
137 *
138 *
139 * \note
140 *      Called by: Handle Rx mgmt request
141 */
142 /*----------------------------------------------------------------------------*/
143 VOID
144 wnmWNMAction (
145     IN P_ADAPTER_T                  prAdapter,
146     IN P_SW_RFB_T                   prSwRfb
147     )
148 {
149     P_WLAN_ACTION_FRAME prRxFrame;
150
151     ASSERT(prAdapter);
152     ASSERT(prSwRfb);
153
154     prRxFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader;
155
156 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
157     if (prRxFrame->ucAction == ACTION_WNM_TIMING_MEASUREMENT_REQUEST) {
158         wnmTimingMeasRequest(prAdapter, prSwRfb);
159         return;
160     }
161 #endif
162
163     DBGLOG(WNM, TRACE, ("Unsupport WNM action frame: %d\n", prRxFrame->ucAction));
164 }
165
166 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
167 /*----------------------------------------------------------------------------*/
168 /*!
169 *
170 * \brief This routine is called to report timing measurement data.
171 *
172 */
173 /*----------------------------------------------------------------------------*/
174 VOID
175 wnmReportTimingMeas (
176     IN P_ADAPTER_T         prAdapter,
177     IN UINT_8              ucStaRecIndex,
178     IN UINT_32             u4ToD,
179     IN UINT_32             u4ToA
180     )
181 {             
182     P_STA_RECORD_T prStaRec;    
183
184     prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
185
186     if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
187         return;
188     }    
189     
190     DBGLOG(WNM, TRACE, ("wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA));
191                  
192     if (!prStaRec->rWNMTimingMsmt.ucTrigger)
193           return;
194     
195     prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD);
196     prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA);
197 }
198
199 /*----------------------------------------------------------------------------*/
200 /*!
201 * @brief This function will handle TxDone(TimingMeasurement) Event.
202 *
203 * @param[in] prAdapter      Pointer to the Adapter structure.
204 * @param[in] prMsduInfo     Pointer to the MSDU_INFO_T.
205 * @param[in] rTxDoneStatus  Return TX status of the Timing Measurement frame.
206 *
207 * @retval WLAN_STATUS_SUCCESS
208 */
209 /*----------------------------------------------------------------------------*/
210 WLAN_STATUS
211 wnmRunEventTimgingMeasTxDone (
212     IN P_ADAPTER_T              prAdapter,
213     IN P_MSDU_INFO_T            prMsduInfo,
214     IN ENUM_TX_RESULT_CODE_T    rTxDoneStatus
215     )
216 {
217     P_STA_RECORD_T prStaRec;    
218
219     ASSERT(prAdapter);
220     ASSERT(prMsduInfo);
221
222     DBGLOG(WNM, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
223
224     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
225
226     if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
227         return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
228     }
229
230     DBGLOG(WNM, TRACE, ("wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x",
231                       prStaRec->rWNMTimingMsmt.ucDialogToken,
232                       prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken,
233                       prStaRec->rWNMTimingMsmt.u4ToD,
234                       prStaRec->rWNMTimingMsmt.u4ToA));
235
236     prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
237     prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;            
238            
239     wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL);
240
241     return WLAN_STATUS_SUCCESS;
242
243 } /* end of wnmRunEventTimgingMeasTxDone() */
244
245 /*----------------------------------------------------------------------------*/
246 /*!
247 * @brief This function will compose the Timing Measurement frame.
248 *
249 * @param[in] prAdapter              Pointer to the Adapter structure.
250 * @param[in] prStaRec               Pointer to the STA_RECORD_T.
251 *
252 * @return (none)
253 */
254 /*----------------------------------------------------------------------------*/
255 VOID
256 wnmComposeTimingMeasFrame (
257     IN P_ADAPTER_T         prAdapter,    
258     IN P_STA_RECORD_T      prStaRec,
259     IN PFN_TX_DONE_HANDLER pfTxDoneHandler
260     )
261 {
262     P_MSDU_INFO_T prMsduInfo;
263           P_BSS_INFO_T prBssInfo;
264     P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame;
265     UINT_16 u2PayloadLen;
266
267     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
268     ASSERT(prBssInfo);
269
270     prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter,
271                       MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN);
272
273     if (!prMsduInfo)
274         return;
275
276     prTxFrame = (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME)
277         ((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
278
279     prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
280     
281     COPY_MAC_ADDR(prTxFrame->aucDestAddr, prStaRec->aucMacAddr);
282     COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
283     COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
284
285     prTxFrame->ucCategory = CATEGORY_UNPROTECTED_WNM_ACTION;
286     prTxFrame->ucAction = ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT;
287
288     //3 Compose the frame body's frame.
289     prTxFrame->ucDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
290     prTxFrame->ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken;
291     prTxFrame->u4ToD = prStaRec->rWNMTimingMsmt.u4ToD;
292     prTxFrame->u4ToA = prStaRec->rWNMTimingMsmt.u4ToA;
293     prTxFrame->ucMaxToDErr = WNM_MAX_TOD_ERROR;
294     prTxFrame->ucMaxToAErr = WNM_MAX_TOA_ERROR;
295     
296     u2PayloadLen = 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN;
297
298     //4 Update information of MSDU_INFO_T
299     prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;   /* Management frame */
300     prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
301     prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
302     prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
303     prMsduInfo->fgIs802_1x = FALSE;
304     prMsduInfo->fgIs802_11 = TRUE;
305     prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
306     prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
307     prMsduInfo->pfTxDoneHandler = pfTxDoneHandler;
308     prMsduInfo->fgIsBasicRate = FALSE;   
309
310     DBGLOG(WNM, TRACE, ("wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n",
311            prTxFrame->ucDialogToken, prTxFrame->ucFollowUpDialogToken,
312            prTxFrame->u4ToD, prTxFrame->u4ToA));
313
314     //4 Enqueue the frame to send this action frame.
315     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
316
317     return;
318
319 } /* end of wnmComposeTimingMeasFrame() */
320
321 /*----------------------------------------------------------------------------*/
322 /*!
323 *
324 * \brief This routine is called to process the 802.11v timing measurement request.
325 *
326 *
327 * \note
328 *      Handle Rx mgmt request
329 */
330 /*----------------------------------------------------------------------------*/
331 VOID
332 wnmTimingMeasRequest (
333     IN P_ADAPTER_T                  prAdapter,
334     IN P_SW_RFB_T                   prSwRfb
335     )
336 {             
337     P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL;
338     P_STA_RECORD_T prStaRec;
339
340     prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME)prSwRfb->pvHeader;
341     if (!prRxFrame)
342         return;
343
344     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
345     if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
346         return;
347     }
348
349     DBGLOG(WNM, TRACE, ("IEEE 802.11: Received Timing Measuremen Request from "
350            MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
351
352     // reset timing msmt    
353     prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
354     prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger;
355     if (!prRxFrame->ucTrigger)
356           return;
357     
358     prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
359     prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
360     
361     wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
362 }
363
364 #if WNM_UNIT_TEST
365 VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex)
366 {
367     P_STA_RECORD_T prStaRec;
368     
369     prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
370     if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
371         return;
372     }
373
374     DBGLOG(WNM, INFO, ("IEEE 802.11v: Test Timing Measuremen Request from "
375            MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
376
377     prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
378     prStaRec->rWNMTimingMsmt.ucTrigger = 1;
379     
380     prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
381     prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
382
383     wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
384 }
385 #endif
386
387 #endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */
388
389 #endif /* CFG_SUPPORT_802_11V */