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.
16 /*******************************************************************************
17 * C O M P I L E R F L A G S
18 ********************************************************************************
21 /*******************************************************************************
22 * E X T E R N A L R E F E R E N C E S
23 ********************************************************************************
26 /*******************************************************************************
28 ********************************************************************************
31 /*******************************************************************************
33 ********************************************************************************
36 /*******************************************************************************
38 ********************************************************************************
41 /*******************************************************************************
42 * P R I V A T E D A T A
43 ********************************************************************************
46 /*******************************************************************************
48 ********************************************************************************
51 /*******************************************************************************
52 * F U N C T I O N D E C L A R A T I O N S
53 ********************************************************************************
56 /*******************************************************************************
58 ********************************************************************************
66 rlmObssChnlLevelIn2G4(P_BSS_INFO_T prBssInfo
, UINT_8 ucPriChannel
, ENUM_CHNL_EXT_T eExtend
);
69 rlmObssChnlLevelIn5G(P_BSS_INFO_T prBssInfo
, UINT_8 ucPriChannel
, ENUM_CHNL_EXT_T eExtend
);
72 /*----------------------------------------------------------------------------*/
74 * \brief Different concurrent network has itself channel lists, and
75 * concurrent networks should have been recorded in channel lists.
76 * If role of active P2P is GO, assume associated AP of AIS will
77 * record our Beacon for P2P GO because of same channel.
79 * Note: If we have scenario of different channel in the future,
80 * the internal FW communication channel shall be established.
86 /*----------------------------------------------------------------------------*/
88 rlmObssChnlLevel(P_BSS_INFO_T prBssInfo
,
89 ENUM_BAND_T eBand
, UINT_8 ucPriChannel
, ENUM_CHNL_EXT_T eExtend
)
91 UINT_8 ucChannelLevel
;
95 if (eBand
== BAND_2G4
) {
96 ucChannelLevel
= rlmObssChnlLevelIn2G4(prBssInfo
, ucPriChannel
, eExtend
);
98 /* (TBD) If concurrent networks permit different channel, extra
99 * channel judgement should be added. Please refer to
100 * previous version of this file.
102 } else if (eBand
== BAND_5G
) {
103 ucChannelLevel
= rlmObssChnlLevelIn5G(prBssInfo
, ucPriChannel
, eExtend
);
105 /* (TBD) If concurrent networks permit different channel, extra
106 * channel judgement should be added. Please refer to
107 * previous version of this file.
110 ucChannelLevel
= CHNL_LEVEL0
;
113 return ucChannelLevel
;
116 /*----------------------------------------------------------------------------*/
124 /*----------------------------------------------------------------------------*/
126 rlmObssChnlLevelIn2G4(P_BSS_INFO_T prBssInfo
, UINT_8 ucPriChannel
, ENUM_CHNL_EXT_T eExtend
)
128 UINT_8 i
, ucChannelLevel
;
129 UINT_8 ucSecChannel
, ucCenterChannel
;
130 UINT_8 ucAffectedChnl_L
, ucAffectedChnl_H
;
134 ucChannelLevel
= CHNL_LEVEL2
;
136 /* Calculate center channel for 2.4G band */
137 if (eExtend
== CHNL_EXT_SCA
) {
138 ucCenterChannel
= ucPriChannel
+ 2;
139 ucSecChannel
= ucPriChannel
+ 4;
140 } else if (eExtend
== CHNL_EXT_SCB
) {
141 ucCenterChannel
= ucPriChannel
- 2;
142 ucSecChannel
= ucPriChannel
- 4;
146 ASSERT(ucCenterChannel
>= 1 && ucCenterChannel
<= 14);
148 /* Calculated low/upper channels in affected freq range */
149 ucAffectedChnl_L
= (ucCenterChannel
<= AFFECTED_CHNL_OFFSET
) ?
150 1 : (ucCenterChannel
- AFFECTED_CHNL_OFFSET
);
152 ucAffectedChnl_H
= (ucCenterChannel
>= (14 - AFFECTED_CHNL_OFFSET
)) ?
153 14 : (ucCenterChannel
+ AFFECTED_CHNL_OFFSET
);
156 /* Check intolerant (Non-HT) channel list */
157 ASSERT(prBssInfo
->auc2G_NonHtChnlList
[0] <= CHNL_LIST_SZ_2G
);
158 for (i
= 1; i
<= prBssInfo
->auc2G_NonHtChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
159 if ((prBssInfo
->auc2G_NonHtChnlList
[i
] >= ucAffectedChnl_L
&&
160 prBssInfo
->auc2G_NonHtChnlList
[i
] <= ucAffectedChnl_H
) &&
161 prBssInfo
->auc2G_NonHtChnlList
[i
] != ucPriChannel
) {
163 ucChannelLevel
= CHNL_LEVEL0
;
164 goto L_2G4_level_end
;
168 /* Check 20M BW request channel list */
169 ASSERT(prBssInfo
->auc2G_20mReqChnlList
[0] <= CHNL_LIST_SZ_2G
);
170 for (i
= 1; i
<= prBssInfo
->auc2G_20mReqChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
171 if ((prBssInfo
->auc2G_20mReqChnlList
[i
] >= ucAffectedChnl_L
&&
172 prBssInfo
->auc2G_20mReqChnlList
[i
] <= ucAffectedChnl_H
)) {
174 ucChannelLevel
= CHNL_LEVEL0
;
175 goto L_2G4_level_end
;
179 /* Check 2.4G primary channel list */
180 ASSERT(prBssInfo
->auc2G_PriChnlList
[0] <= CHNL_LIST_SZ_2G
);
181 for (i
= 1; i
<= prBssInfo
->auc2G_PriChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
182 if ((prBssInfo
->auc2G_PriChnlList
[i
] >= ucAffectedChnl_L
&&
183 prBssInfo
->auc2G_PriChnlList
[i
] <= ucAffectedChnl_H
) &&
184 prBssInfo
->auc2G_PriChnlList
[i
] != ucPriChannel
) {
186 ucChannelLevel
= CHNL_LEVEL0
;
187 goto L_2G4_level_end
;
191 /* Check 2.4G secondary channel list */
192 ASSERT(prBssInfo
->auc2G_SecChnlList
[0] <= CHNL_LIST_SZ_2G
);
193 for (i
= 1; i
<= prBssInfo
->auc2G_SecChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
194 if ((prBssInfo
->auc2G_SecChnlList
[i
] >= ucAffectedChnl_L
&&
195 prBssInfo
->auc2G_SecChnlList
[i
] <= ucAffectedChnl_H
) &&
196 prBssInfo
->auc2G_SecChnlList
[i
] != ucSecChannel
) {
198 ucChannelLevel
= CHNL_LEVEL0
;
199 goto L_2G4_level_end
;
205 return ucChannelLevel
;
208 /*----------------------------------------------------------------------------*/
216 /*----------------------------------------------------------------------------*/
218 rlmObssChnlLevelIn5G(P_BSS_INFO_T prBssInfo
, UINT_8 ucPriChannel
, ENUM_CHNL_EXT_T eExtend
)
220 UINT_8 i
, ucChannelLevel
;
225 ucChannelLevel
= CHNL_LEVEL2
;
227 /* Calculate center channel for 2.4G band */
228 if (eExtend
== CHNL_EXT_SCA
) {
229 ucSecChannel
= ucPriChannel
+ 4;
230 } else if (eExtend
== CHNL_EXT_SCB
) {
231 ucSecChannel
= ucPriChannel
- 4;
235 ASSERT(ucSecChannel
>= 36);
237 /* Check 5G primary channel list */
238 ASSERT(prBssInfo
->auc5G_PriChnlList
[0] <= CHNL_LIST_SZ_5G
);
239 for (i
= 1; i
<= prBssInfo
->auc5G_PriChnlList
[0] && i
<= CHNL_LIST_SZ_5G
; i
++) {
240 if (prBssInfo
->auc5G_PriChnlList
[i
] == ucSecChannel
) {
242 ucChannelLevel
= CHNL_LEVEL0
;
244 } else if (prBssInfo
->auc5G_PriChnlList
[i
] == ucPriChannel
) {
245 ucChannelLevel
= CHNL_LEVEL1
;
249 /* Check non-HT channel list */
250 ASSERT(prBssInfo
->auc5G_NonHtChnlList
[0] <= CHNL_LIST_SZ_5G
);
251 for (i
= 1; i
<= prBssInfo
->auc5G_NonHtChnlList
[0] && i
<= CHNL_LIST_SZ_5G
; i
++) {
252 if (prBssInfo
->auc5G_NonHtChnlList
[i
] == ucSecChannel
) {
254 ucChannelLevel
= CHNL_LEVEL0
;
256 } else if (prBssInfo
->auc5G_NonHtChnlList
[i
] == ucPriChannel
) {
257 ucChannelLevel
= CHNL_LEVEL1
;
261 /* Check secondary channel list */
262 ASSERT(prBssInfo
->auc5G_SecChnlList
[0] <= CHNL_LIST_SZ_5G
);
263 for (i
= 1; i
<= prBssInfo
->auc5G_SecChnlList
[0] && i
<= CHNL_LIST_SZ_5G
; i
++) {
264 if (prBssInfo
->auc5G_SecChnlList
[i
] == ucPriChannel
) {
266 ucChannelLevel
= CHNL_LEVEL0
;
273 return ucChannelLevel
;
276 /*----------------------------------------------------------------------------*/
284 /*----------------------------------------------------------------------------*/
285 VOID
rlmObssScanExemptionRsp(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_SW_RFB_T prSwRfb
)
287 P_MSDU_INFO_T prMsduInfo
;
288 P_ACTION_20_40_COEXIST_FRAME prTxFrame
;
290 /* To do: need an algorithm to do judgement. Now always reject request */
292 prMsduInfo
= (P_MSDU_INFO_T
)
293 cnmMgtPktAlloc(prAdapter
, PUBLIC_ACTION_MAX_LEN
);
294 if (prMsduInfo
== NULL
) {
298 DBGLOG(RLM
, INFO
, ("Send 20/40 coexistence rsp frame!\n"));
300 prTxFrame
= (P_ACTION_20_40_COEXIST_FRAME
) prMsduInfo
->prPacket
;
302 prTxFrame
->u2FrameCtrl
= MAC_FRAME_ACTION
;
303 COPY_MAC_ADDR(prTxFrame
->aucDestAddr
,
304 ((P_ACTION_20_40_COEXIST_FRAME
) prSwRfb
->pvHeader
)->aucSrcAddr
);
305 COPY_MAC_ADDR(prTxFrame
->aucSrcAddr
, prBssInfo
->aucOwnMacAddr
);
306 COPY_MAC_ADDR(prTxFrame
->aucBSSID
, prBssInfo
->aucBSSID
);
308 prTxFrame
->ucCategory
= CATEGORY_PUBLIC_ACTION
;
309 prTxFrame
->ucAction
= ACTION_PUBLIC_20_40_COEXIST
;
311 /* To do: find correct algorithm */
312 prTxFrame
->rBssCoexist
.ucId
= ELEM_ID_20_40_BSS_COEXISTENCE
;
313 prTxFrame
->rBssCoexist
.ucLength
= 1;
314 prTxFrame
->rBssCoexist
.ucData
= 0;
316 ASSERT((WLAN_MAC_HEADER_LEN
+ 5) <= PUBLIC_ACTION_MAX_LEN
);
318 prMsduInfo
->ucPacketType
= HIF_TX_PACKET_TYPE_MGMT
;
319 prMsduInfo
->ucStaRecIndex
= prSwRfb
->ucStaRecIdx
;
320 prMsduInfo
->ucNetworkType
= prBssInfo
->ucNetTypeIndex
;
321 prMsduInfo
->ucMacHeaderLength
= WLAN_MAC_MGMT_HEADER_LEN
;
322 prMsduInfo
->fgIs802_1x
= FALSE
;
323 prMsduInfo
->fgIs802_11
= TRUE
;
324 prMsduInfo
->u2FrameLength
= WLAN_MAC_MGMT_HEADER_HTC_LEN
+ 5;
325 prMsduInfo
->ucTxSeqNum
= nicIncreaseTxSeqNum(prAdapter
);
326 prMsduInfo
->pfTxDoneHandler
= NULL
;
327 prMsduInfo
->fgIsBasicRate
= FALSE
;
329 /* Send them to HW queue */
330 nicTxEnqueueMsdu(prAdapter
, prMsduInfo
);