add rk3288 pinctrl dts code
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / mt5931_kk / drv_wlan / mgmt / p2p_rlm_obss.c
1 /*
2 ** $Id: @(#) gl_p2p_cfg80211.c@@
3 */
4
5 /*! \file   gl_p2p_cfg80211.c
6     \brief  Main routines of Linux driver interface for Wi-Fi Direct
7             using cfg80211 interface
8
9     This file contains the main routines of Linux driver for MediaTek Inc. 802.11
10     Wireless LAN Adapters.
11 */
12
13 /*******************************************************************************
14 * Copyright (c) 2007 MediaTek Inc.
15 *
16 * All rights reserved. Copying, compilation, modification, distribution
17 * or any other use whatsoever of this material is strictly prohibited
18 * except in accordance with a Software License Agreement with
19 * MediaTek Inc.
20 ********************************************************************************
21 */
22
23 /*******************************************************************************
24 * LEGAL DISCLAIMER
25 *
26 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
27 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
28 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
29 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
30 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
31 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
32 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
33 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
34 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
35 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
36 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
37 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
38 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
39 *
40 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
41 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
42 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
43 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
44 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
45 *
46 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
47 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
48 * OF LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
49 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
50 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
51 * (ICC).
52 ********************************************************************************
53 */
54
55
56 /*******************************************************************************
57 *                         C O M P I L E R   F L A G S
58 ********************************************************************************
59 */
60
61 /*******************************************************************************
62 *                    E X T E R N A L   R E F E R E N C E S
63 ********************************************************************************
64 */
65
66 /*******************************************************************************
67 *                              C O N S T A N T S
68 ********************************************************************************
69 */
70
71 /*******************************************************************************
72 *                             D A T A   T Y P E S
73 ********************************************************************************
74 */
75
76 /*******************************************************************************
77 *                            P U B L I C   D A T A
78 ********************************************************************************
79 */
80
81 /*******************************************************************************
82 *                           P R I V A T E   D A T A
83 ********************************************************************************
84 */
85
86 /*******************************************************************************
87 *                                 M A C R O S
88 ********************************************************************************
89 */
90
91 /*******************************************************************************
92 *                   F U N C T I O N   D E C L A R A T I O N S
93 ********************************************************************************
94 */
95
96 /*******************************************************************************
97 *                              F U N C T I O N S
98 ********************************************************************************
99 */
100
101
102 #include "precomp.h"
103
104
105 static UINT_8
106 rlmObssChnlLevelIn2G4 (
107     P_BSS_INFO_T        prBssInfo,
108     UINT_8              ucPriChannel,
109     ENUM_CHNL_EXT_T     eExtend
110     );
111
112 static UINT_8
113 rlmObssChnlLevelIn5G (
114     P_BSS_INFO_T        prBssInfo,
115     UINT_8              ucPriChannel,
116     ENUM_CHNL_EXT_T     eExtend
117     );
118
119
120 /*----------------------------------------------------------------------------*/
121 /*!
122 * \brief Different concurrent network has itself channel lists, and
123 *        concurrent networks should have been recorded in channel lists.
124 *        If role of active P2P is GO, assume associated AP of AIS will
125 *        record our Beacon for P2P GO because of same channel.
126 *
127 *        Note: If we have scenario of different channel in the future,
128 *              the internal FW communication channel shall be established.
129 *
130 * \param[in]
131 *
132 * \return none
133 */
134 /*----------------------------------------------------------------------------*/
135 UINT_8
136 rlmObssChnlLevel (
137     P_BSS_INFO_T        prBssInfo,
138     ENUM_BAND_T         eBand,
139     UINT_8              ucPriChannel,
140     ENUM_CHNL_EXT_T     eExtend
141     )
142 {
143     UINT_8              ucChannelLevel;
144
145     ASSERT(prBssInfo);
146
147     if (eBand == BAND_2G4) {
148         ucChannelLevel = rlmObssChnlLevelIn2G4(prBssInfo, ucPriChannel,eExtend);
149
150         /* (TBD) If concurrent networks permit different channel, extra
151          *       channel judgement should be added. Please refer to
152          *       previous version of this file.
153          */
154     }
155     else if (eBand == BAND_5G) {
156         ucChannelLevel = rlmObssChnlLevelIn5G(prBssInfo, ucPriChannel,eExtend);
157
158         /* (TBD) If concurrent networks permit different channel, extra
159          *       channel judgement should be added. Please refer to
160          *       previous version of this file.
161          */
162     }
163     else {
164         ucChannelLevel = CHNL_LEVEL0;
165     }
166
167     return ucChannelLevel;
168 }
169
170 /*----------------------------------------------------------------------------*/
171 /*!
172 * \brief
173 *
174 * \param[in]
175 *
176 * \return none
177 */
178 /*----------------------------------------------------------------------------*/
179 static UINT_8
180 rlmObssChnlLevelIn2G4 (
181     P_BSS_INFO_T        prBssInfo,
182     UINT_8              ucPriChannel,
183     ENUM_CHNL_EXT_T     eExtend
184     )
185 {
186     UINT_8      i, ucChannelLevel;
187     UINT_8      ucSecChannel, ucCenterChannel;
188     UINT_8      ucAffectedChnl_L, ucAffectedChnl_H;
189
190     ASSERT(prBssInfo);
191
192     ucChannelLevel = CHNL_LEVEL2;
193
194     /* Calculate center channel for 2.4G band */
195     if (eExtend == CHNL_EXT_SCA) {
196         ucCenterChannel = ucPriChannel + 2;
197         ucSecChannel = ucPriChannel + 4;
198     }
199     else if (eExtend == CHNL_EXT_SCB) {
200         ucCenterChannel = ucPriChannel - 2;
201         ucSecChannel = ucPriChannel - 4;
202     }
203     else {
204         return CHNL_LEVEL0;
205     }
206     ASSERT(ucCenterChannel >= 1 && ucCenterChannel <= 14);
207
208     /* Calculated low/upper channels in affected freq range */
209     ucAffectedChnl_L = (ucCenterChannel <= AFFECTED_CHNL_OFFSET) ?
210         1 : (ucCenterChannel - AFFECTED_CHNL_OFFSET);
211
212     ucAffectedChnl_H = (ucCenterChannel >= (14 - AFFECTED_CHNL_OFFSET)) ?
213         14 : (ucCenterChannel + AFFECTED_CHNL_OFFSET);
214
215
216     /* Check intolerant (Non-HT) channel list */
217     ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
218     for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] &&
219          i <= CHNL_LIST_SZ_2G; i++) {
220         if ((prBssInfo->auc2G_NonHtChnlList[i] >= ucAffectedChnl_L &&
221              prBssInfo->auc2G_NonHtChnlList[i] <= ucAffectedChnl_H) &&
222             prBssInfo->auc2G_NonHtChnlList[i] != ucPriChannel) {
223
224             ucChannelLevel = CHNL_LEVEL0;
225             goto L_2G4_level_end;
226         }
227     }
228
229     /* Check 20M BW request channel list */
230     ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G);
231     for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] &&
232          i <= CHNL_LIST_SZ_2G; i++) {
233         if ((prBssInfo->auc2G_20mReqChnlList[i] >= ucAffectedChnl_L &&
234              prBssInfo->auc2G_20mReqChnlList[i] <= ucAffectedChnl_H)) {
235
236             ucChannelLevel = CHNL_LEVEL0;
237             goto L_2G4_level_end;
238         }
239     }
240
241     /* Check 2.4G primary channel list */
242     ASSERT(prBssInfo->auc2G_PriChnlList[0] <= CHNL_LIST_SZ_2G);
243     for (i = 1; i <= prBssInfo->auc2G_PriChnlList[0] &&
244          i <= CHNL_LIST_SZ_2G; i++) {
245         if ((prBssInfo->auc2G_PriChnlList[i] >= ucAffectedChnl_L &&
246              prBssInfo->auc2G_PriChnlList[i] <= ucAffectedChnl_H) &&
247             prBssInfo->auc2G_PriChnlList[i] != ucPriChannel) {
248
249             ucChannelLevel = CHNL_LEVEL0;
250             goto L_2G4_level_end;
251         }
252     }
253
254     /* Check 2.4G secondary channel list */
255     ASSERT(prBssInfo->auc2G_SecChnlList[0] <= CHNL_LIST_SZ_2G);
256     for (i = 1; i <= prBssInfo->auc2G_SecChnlList[0] &&
257          i <= CHNL_LIST_SZ_2G; i++) {
258         if ((prBssInfo->auc2G_SecChnlList[i] >= ucAffectedChnl_L &&
259              prBssInfo->auc2G_SecChnlList[i] <= ucAffectedChnl_H) &&
260             prBssInfo->auc2G_SecChnlList[i] != ucSecChannel) {
261
262             ucChannelLevel = CHNL_LEVEL0;
263             goto L_2G4_level_end;
264         }
265     }
266
267 L_2G4_level_end:
268
269     return ucChannelLevel;
270 }
271
272 /*----------------------------------------------------------------------------*/
273 /*!
274 * \brief
275 *
276 * \param[in]
277 *
278 * \return none
279 */
280 /*----------------------------------------------------------------------------*/
281 static UINT_8
282 rlmObssChnlLevelIn5G (
283     P_BSS_INFO_T        prBssInfo,
284     UINT_8              ucPriChannel,
285     ENUM_CHNL_EXT_T     eExtend
286     )
287 {
288     UINT_8      i, ucChannelLevel;
289     UINT_8      ucSecChannel;
290
291     ASSERT(prBssInfo);
292
293     ucChannelLevel = CHNL_LEVEL2;
294
295     /* Calculate center channel for 2.4G band */
296     if (eExtend == CHNL_EXT_SCA) {
297         ucSecChannel = ucPriChannel + 4;
298     }
299     else if (eExtend == CHNL_EXT_SCB) {
300         ucSecChannel = ucPriChannel - 4;
301     }
302     else {
303         return CHNL_LEVEL0;
304     }
305     ASSERT(ucSecChannel >= 36);
306
307     /* Check 5G primary channel list */
308     ASSERT(prBssInfo->auc5G_PriChnlList[0] <= CHNL_LIST_SZ_5G);
309     for (i = 1; i <= prBssInfo->auc5G_PriChnlList[0] &&
310          i <= CHNL_LIST_SZ_5G; i++) {
311         if (prBssInfo->auc5G_PriChnlList[i] == ucSecChannel) {
312
313             ucChannelLevel = CHNL_LEVEL0;
314             goto L_5G_level_end;
315         }
316         else if (prBssInfo->auc5G_PriChnlList[i] == ucPriChannel) {
317             ucChannelLevel = CHNL_LEVEL1;
318         }
319     }
320
321     /* Check non-HT channel list */
322     ASSERT(prBssInfo->auc5G_NonHtChnlList[0] <= CHNL_LIST_SZ_5G);
323     for (i = 1; i <= prBssInfo->auc5G_NonHtChnlList[0] &&
324          i <= CHNL_LIST_SZ_5G; i++) {
325         if (prBssInfo->auc5G_NonHtChnlList[i] == ucSecChannel) {
326
327             ucChannelLevel = CHNL_LEVEL0;
328             goto L_5G_level_end;
329         }
330         else if (prBssInfo->auc5G_NonHtChnlList[i] == ucPriChannel) {
331             ucChannelLevel = CHNL_LEVEL1;
332         }
333     }
334
335     /* Check secondary channel list */
336     ASSERT(prBssInfo->auc5G_SecChnlList[0] <= CHNL_LIST_SZ_5G);
337     for (i = 1; i <= prBssInfo->auc5G_SecChnlList[0] &&
338          i <= CHNL_LIST_SZ_5G; i++) {
339         if (prBssInfo->auc5G_SecChnlList[i] == ucPriChannel) {
340
341             ucChannelLevel = CHNL_LEVEL0;
342             goto L_5G_level_end;
343         }
344     }
345
346 L_5G_level_end:
347
348     return ucChannelLevel;
349 }
350
351 /*----------------------------------------------------------------------------*/
352 /*!
353 * \brief
354 *
355 * \param[in]
356 *
357 * \return none
358 */
359 /*----------------------------------------------------------------------------*/
360 VOID
361 rlmObssScanExemptionRsp (
362     P_ADAPTER_T         prAdapter,
363     P_BSS_INFO_T        prBssInfo,
364     P_SW_RFB_T          prSwRfb
365     )
366 {
367     P_MSDU_INFO_T                   prMsduInfo;
368     P_ACTION_20_40_COEXIST_FRAME    prTxFrame;
369
370     /* To do: need an algorithm to do judgement. Now always reject request */
371
372     prMsduInfo = (P_MSDU_INFO_T)
373                  cnmMgtPktAlloc(prAdapter, PUBLIC_ACTION_MAX_LEN);
374     if (prMsduInfo == NULL) {
375         return;
376     }
377
378     DBGLOG(RLM, INFO, ("Send 20/40 coexistence rsp frame!\n"));
379
380     prTxFrame = (P_ACTION_20_40_COEXIST_FRAME) prMsduInfo->prPacket;
381
382     prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
383     COPY_MAC_ADDR(prTxFrame->aucDestAddr,
384         ((P_ACTION_20_40_COEXIST_FRAME) prSwRfb->pvHeader)->aucSrcAddr);
385     COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
386     COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
387
388     prTxFrame->ucCategory = CATEGORY_PUBLIC_ACTION;
389     prTxFrame->ucAction = ACTION_PUBLIC_20_40_COEXIST;
390
391     /* To do: find correct algorithm */
392     prTxFrame->rBssCoexist.ucId = ELEM_ID_20_40_BSS_COEXISTENCE;
393     prTxFrame->rBssCoexist.ucLength = 1;
394     prTxFrame->rBssCoexist.ucData = 0;
395
396     ASSERT((WLAN_MAC_HEADER_LEN + 5) <= PUBLIC_ACTION_MAX_LEN);
397
398     prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
399     prMsduInfo->ucStaRecIndex =prSwRfb->ucStaRecIdx;
400     prMsduInfo->ucNetworkType = prBssInfo->ucNetTypeIndex;
401     prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
402     prMsduInfo->fgIs802_1x = FALSE;
403     prMsduInfo->fgIs802_11 = TRUE;
404     prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_HTC_LEN + 5;
405     prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
406     prMsduInfo->pfTxDoneHandler = NULL;
407     prMsduInfo->fgIsBasicRate = FALSE;
408
409     /* Send them to HW queue */
410     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
411 }
412
413
414