2 ** $Id: @(#) gl_p2p_cfg80211.c@@
5 /*! \file gl_p2p_cfg80211.c
6 \brief Main routines of Linux driver interface for Wi-Fi Direct
7 using cfg80211 interface
9 This file contains the main routines of Linux driver for MediaTek Inc. 802.11
10 Wireless LAN Adapters.
13 /*******************************************************************************
14 * Copyright (c) 2007 MediaTek Inc.
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
20 ********************************************************************************
23 /*******************************************************************************
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.
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.
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
52 ********************************************************************************
56 /*******************************************************************************
57 * C O M P I L E R F L A G S
58 ********************************************************************************
61 /*******************************************************************************
62 * E X T E R N A L R E F E R E N C E S
63 ********************************************************************************
66 /*******************************************************************************
68 ********************************************************************************
71 /*******************************************************************************
73 ********************************************************************************
76 /*******************************************************************************
78 ********************************************************************************
81 /*******************************************************************************
82 * P R I V A T E D A T A
83 ********************************************************************************
86 /*******************************************************************************
88 ********************************************************************************
91 /*******************************************************************************
92 * F U N C T I O N D E C L A R A T I O N S
93 ********************************************************************************
96 /*******************************************************************************
98 ********************************************************************************
102 #include "p2p_precomp.h"
106 rlmObssChnlLevelIn2G4 (
107 P_BSS_INFO_T prBssInfo,
109 ENUM_CHNL_EXT_T eExtend
113 rlmObssChnlLevelIn5G (
114 P_BSS_INFO_T prBssInfo,
116 ENUM_CHNL_EXT_T eExtend
120 /*----------------------------------------------------------------------------*/
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.
127 * Note: If we have scenario of different channel in the future,
128 * the internal FW communication channel shall be established.
134 /*----------------------------------------------------------------------------*/
137 P_BSS_INFO_T prBssInfo,
140 ENUM_CHNL_EXT_T eExtend
143 UINT_8 ucChannelLevel;
147 if (eBand == BAND_2G4) {
148 ucChannelLevel = rlmObssChnlLevelIn2G4(prBssInfo, ucPriChannel,eExtend);
150 /* (TBD) If concurrent networks permit different channel, extra
151 * channel judgement should be added. Please refer to
152 * previous version of this file.
155 else if (eBand == BAND_5G) {
156 ucChannelLevel = rlmObssChnlLevelIn5G(prBssInfo, ucPriChannel,eExtend);
158 /* (TBD) If concurrent networks permit different channel, extra
159 * channel judgement should be added. Please refer to
160 * previous version of this file.
164 ucChannelLevel = CHNL_LEVEL0;
167 return ucChannelLevel;
170 /*----------------------------------------------------------------------------*/
178 /*----------------------------------------------------------------------------*/
180 rlmObssChnlLevelIn2G4 (
181 P_BSS_INFO_T prBssInfo,
183 ENUM_CHNL_EXT_T eExtend
186 UINT_8 i, ucChannelLevel;
187 UINT_8 ucSecChannel, ucCenterChannel;
188 UINT_8 ucAffectedChnl_L, ucAffectedChnl_H;
192 ucChannelLevel = CHNL_LEVEL2;
194 /* Calculate center channel for 2.4G band */
195 if (eExtend == CHNL_EXT_SCA) {
196 ucCenterChannel = ucPriChannel + 2;
197 ucSecChannel = ucPriChannel + 4;
199 else if (eExtend == CHNL_EXT_SCB) {
200 ucCenterChannel = ucPriChannel - 2;
201 ucSecChannel = ucPriChannel - 4;
206 ASSERT(ucCenterChannel >= 1 && ucCenterChannel <= 14);
208 /* Calculated low/upper channels in affected freq range */
209 ucAffectedChnl_L = (ucCenterChannel <= AFFECTED_CHNL_OFFSET) ?
210 1 : (ucCenterChannel - AFFECTED_CHNL_OFFSET);
212 ucAffectedChnl_H = (ucCenterChannel >= (14 - AFFECTED_CHNL_OFFSET)) ?
213 14 : (ucCenterChannel + AFFECTED_CHNL_OFFSET);
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) {
224 ucChannelLevel = CHNL_LEVEL0;
225 goto L_2G4_level_end;
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)) {
236 ucChannelLevel = CHNL_LEVEL0;
237 goto L_2G4_level_end;
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) {
249 ucChannelLevel = CHNL_LEVEL0;
250 goto L_2G4_level_end;
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) {
262 ucChannelLevel = CHNL_LEVEL0;
263 goto L_2G4_level_end;
269 return ucChannelLevel;
272 /*----------------------------------------------------------------------------*/
280 /*----------------------------------------------------------------------------*/
282 rlmObssChnlLevelIn5G (
283 P_BSS_INFO_T prBssInfo,
285 ENUM_CHNL_EXT_T eExtend
288 UINT_8 i, ucChannelLevel;
293 ucChannelLevel = CHNL_LEVEL2;
295 /* Calculate center channel for 2.4G band */
296 if (eExtend == CHNL_EXT_SCA) {
297 ucSecChannel = ucPriChannel + 4;
299 else if (eExtend == CHNL_EXT_SCB) {
300 ucSecChannel = ucPriChannel - 4;
305 ASSERT(ucSecChannel >= 36);
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) {
313 ucChannelLevel = CHNL_LEVEL0;
316 else if (prBssInfo->auc5G_PriChnlList[i] == ucPriChannel) {
317 ucChannelLevel = CHNL_LEVEL1;
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) {
327 ucChannelLevel = CHNL_LEVEL0;
330 else if (prBssInfo->auc5G_NonHtChnlList[i] == ucPriChannel) {
331 ucChannelLevel = CHNL_LEVEL1;
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) {
341 ucChannelLevel = CHNL_LEVEL0;
348 return ucChannelLevel;
351 /*----------------------------------------------------------------------------*/
359 /*----------------------------------------------------------------------------*/
361 rlmObssScanExemptionRsp (
362 P_ADAPTER_T prAdapter,
363 P_BSS_INFO_T prBssInfo,
367 P_MSDU_INFO_T prMsduInfo;
368 P_ACTION_20_40_COEXIST_FRAME prTxFrame;
370 /* To do: need an algorithm to do judgement. Now always reject request */
372 prMsduInfo = (P_MSDU_INFO_T)
373 cnmMgtPktAlloc(prAdapter, PUBLIC_ACTION_MAX_LEN);
374 if (prMsduInfo == NULL) {
378 DBGLOG(RLM, INFO, ("Send 20/40 coexistence rsp frame!\n"));
380 prTxFrame = (P_ACTION_20_40_COEXIST_FRAME) prMsduInfo->prPacket;
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);
388 prTxFrame->ucCategory = CATEGORY_PUBLIC_ACTION;
389 prTxFrame->ucAction = ACTION_PUBLIC_20_40_COEXIST;
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;
396 ASSERT((WLAN_MAC_HEADER_LEN + 5) <= PUBLIC_ACTION_MAX_LEN);
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;
409 /* Send them to HW queue */
410 nicTxEnqueueMsdu(prAdapter, prMsduInfo);