2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/common/wlan_bow.c#1 $
6 \brief This file contains the 802.11 PAL commands processing routines for
7 MediaTek Inc. 802.11 Wireless LAN Adapters.
17 * Sync CFG80211 modification from branch 2,2.
19 * 01 16 2012 chinghwa.yu
20 * [WCXRP00000065] Update BoW design and settings
21 * Support BOW for 5GHz band.
23 * 01 09 2012 chinghwa.yu
24 * [WCXRP00000065] Update BoW design and settings
25 * [ALPS00110632] [Rose][LCA42][Cross Feature][Bluetooth]The "KE" pops up after the device reboots automatically.(once)
27 * Fix bow link disconnected event dereference.
31 * Change the function prototype of rlmDomainGetChnlList()
34 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
35 * Improve BoW connection establishment speed.
38 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
39 * change parameter name from PeerAddr to BSSID
47 * Add BoW Rate Limitation.
50 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
51 * 1. specify target's BSSID when requesting channel privilege.
52 * 2. pass BSSID information to firmware domain
56 * Add BoW 11N support.
59 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
60 * aware more compile options.
63 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
64 * Add BoW Cancel Scan Request and Turn On deactive network function.
67 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
68 * Add some BoW error handling.
71 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
75 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
76 * Only reply probe response to its peer or mached SSID for BoW AP.
79 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
80 * Add BoW SAA retry and disable disconnect event when AAA fail .
83 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
84 * Protect BoW connection establishment.
87 * [WCXRP00000730] [MT6620 Wi-Fi][BoW] Send deauth while disconnecting
88 * Send deauth while disconnecting BoW link.
91 * [WCXRP00000707] [MT6620 Wi-Fi][Driver] Fix BoW Multiple Physical Link connect/disconnect issue
92 * Fix wrong StaRec state of BoW .
95 * [WCXRP00000707] [MT6620 Wi-Fi][Driver] Fix BoW Multiple Physical Link connect/disconnect issue
96 * Fix BoW Multiple Physical Link connect/disconnect issue.
98 * 05 03 2011 chinghwa.yu
99 * [WCXRP00000065] Update BoW design and settings
100 * Use kalMemAlloc to allocate event buffer for kalIndicateBOWEvent.
102 * 04 15 2011 chinghwa.yu
103 * [WCXRP00000065] Update BoW design and settings
104 * Fix prAssocRspSwRfb casting.
106 * 04 15 2011 chinghwa.yu
107 * [WCXRP00000065] Update BoW design and settings
108 * Add BOW short range mode.
110 * 04 12 2011 chinghwa.yu
111 * [WCXRP00000065] Update BoW design and settings
112 * Add WMM IE for BOW initiator data.
114 * 04 10 2011 chinghwa.yu
115 * [WCXRP00000065] Update BoW design and settings
116 * Change Link disconnection event procedure for hotspot and change skb length check to 1514 bytes.
118 * 04 09 2011 chinghwa.yu
119 * [WCXRP00000065] Update BoW design and settings
120 * Change Link connection event procedure and change skb length check to 1512 bytes.
122 * 03 28 2011 chinghwa.yu
123 * [WCXRP00000065] Update BoW design and settings
124 * Simplify link disconnected routine, remove link disconnected other routine.
126 * 03 27 2011 chinghwa.yu
127 * [WCXRP00000065] Update BoW design and settings
128 * Support multiple physical link.
130 * 03 27 2011 chinghwa.yu
131 * [WCXRP00000065] Update BoW design and settings
132 * Add new feature - multiple physical link support.
135 * [WCXRP00000486] [MT6620 Wi-Fi][BOW] Fixed the bow send frame but not encrypted issue
136 * fixed the BOW packet sending without encrypted issue.
138 * 02 21 2011 chinghwa.yu
139 * [WCXRP00000065] Update BoW design and settings
140 * Fix BOW link disconnection bug.
142 * 02 16 2011 chinghwa.yu
143 * [WCXRP00000065] Update BoW design and settings
144 * Add bowNotifyAllLinkDisconnected interface and change channel grant procedure for bow starting.
146 * 02 11 2011 chinghwa.yu
147 * [WCXRP00000065] Update BoW design and settings
148 * Update BOW channel granted function.
150 * 02 10 2011 chinghwa.yu
151 * [WCXRP00000065] Update BoW design and settings
152 * Fix kernel API change issue.
153 * Before ALPS 2.2 (2.2 included), kfifo_alloc() is
154 * struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, spinlock_t *lock);
155 * After ALPS 2.3, kfifo_alloc() is changed to
156 * int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask);
159 * [WCXRP00000430] [MT6620 Wi-Fi][Firmware][Driver] Create V1.2 branch for MT6620E1 and MT6620E3
160 * create V1.2 driver branch based on label MT6620_WIFI_DRIVER_V1_2_110209_1031
161 * with BOW and P2P enabled as default
163 * 02 08 2011 chinghwa.yu
164 * [WCXRP00000065] Update BoW design and settings
165 * Replace kfifo_get and kfifo_put with kfifo_out and kfifo_in.
166 * Update BOW get MAC status, remove returning event for AIS network type.
168 * 01 26 2011 cm.chang
169 * [WCXRP00000395] [MT6620 Wi-Fi][Driver][FW] Search STA_REC with additional net type index argument
172 * 01 11 2011 chinghwa.yu
173 * [WCXRP00000065] Update BoW design and settings
174 * Update BOW Activity Report structure and bug fix.
176 * 01 10 2011 chinghwa.yu
177 * [WCXRP00000065] Update BoW design and settings
178 * Update BOW to support multiple physical link.
180 * 12 08 2010 chinghwa.yu
181 * [WCXRP00000065] Update BoW design and settings
182 * Support concurrent networks.
184 * 12 07 2010 cm.chang
185 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
186 * 1. BSSINFO include RLM parameter
187 * 2. free all sta records when network is disconnected
189 * 11 11 2010 chinghwa.yu
190 * [WCXRP00000065] Update BoW design and settings
191 * Fix BoW timer assert issue.
193 * 10 18 2010 chinghwa.yu
194 * [WCXRP00000110] [MT6620 Wi-Fi] [Driver] Fix BoW Connected event size
195 * Fix for event returnning Band.
197 * 10 18 2010 chinghwa.yu
198 * [WCXRP00000110] [MT6620 Wi-Fi] [Driver] Fix BoW Connected event size
199 * Fix wrong BoW event size.
202 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
203 * remove ENUM_NETWORK_TYPE_T definitions
205 * 09 27 2010 chinghwa.yu
206 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
207 * Update BCM/BoW design and settings.
209 * 09 16 2010 chinghwa.yu
211 * Fix bowResponderScanDone error when prBssDesc is NULL.
213 * 09 14 2010 chinghwa.yu
215 * Add bowRunEventAAAComplete.
219 * indicate correct AIS network information for PAL.
221 * 09 03 2010 kevin.huang
223 * Refine #include sequence and solve recursive/nested #include issue
225 * 08 24 2010 cm.chang
227 * Support RLM initail channel of Ad-hoc, P2P and BOW
229 * 08 24 2010 chinghwa.yu
231 * Initialize nicActivateNetwork(prAdapter as soon as bow is starting..
233 * 08 24 2010 chinghwa.yu
235 * Update BOW for the 1st time.
239 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
243 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
244 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
245 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
249 * sync. bluetooth-over-Wi-Fi interface to driver interface document v0.2.6.
253 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
256 * [WPD00003833][MT6620 and MT5931] Driver migration
257 * add API in que_mgt to retrieve sta-rec index for security frames.
260 * [WPD00003833][MT6620 and MT5931] Driver migration
261 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
264 * [WPD00003833][MT6620 and MT5931] Driver migration
265 * 1) migrate assoc.c.
266 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
267 * 3) add configuration options for CNM_MEM and RSN modules
268 * 4) add data path for management frames
269 * 5) eliminate rPacketInfo of MSDU_INFO_T
271 * 06 06 2010 kevin.huang
272 * [WPD00003832][MT6620 5931] Create driver base
273 * [MT6620 5931] Create driver base
276 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
277 * 1) add timeout handler mechanism for pending command packets
278 * 2) add p2p add/removal key
281 * [WPD00001943]Create WiFi test driver framework on WinXP
282 * add NULL OID implementation for WOL-related OIDs.
285 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
286 * 1) all BT physical handles shares the same RSSI/Link Quality.
287 * 2) simplify BT command composing
290 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
291 * change prefix for data structure used to communicate with 802.11 PAL
292 * to avoid ambiguous naming with firmware interface
295 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
296 * add multiple physical link support
299 * [WPD00001943]Create WiFi test driver framework on WinXP
300 * information buffer for query oid/ioctl is now buffered in prCmdInfo
301 * instead of glue-layer variable to improve multiple oid/ioctl capability
304 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
305 * add framework for BT-over-Wi-Fi support.
306 * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
307 * * 2) command sequence number is now increased atomically
308 * * 3) private data could be hold and taken use for other purpose
312 /******************************************************************************
313 * C O M P I L E R F L A G S
314 *******************************************************************************
317 /******************************************************************************
318 * E X T E R N A L R E F E R E N C E S
319 *******************************************************************************
323 #if CFG_ENABLE_BT_OVER_WIFI
326 extern UINT_32 g_arBowRevPalPacketTime[32];
330 /******************************************************************************
332 *******************************************************************************
335 /******************************************************************************
337 *******************************************************************************
340 /******************************************************************************
341 * P U B L I C D A T A
342 *******************************************************************************
345 static UINT_32 g_u4LinkCount = 0;
346 static UINT_32 g_u4Beaconing = 0;
347 static BOW_TABLE_T arBowTable[CFG_BOW_PHYSICAL_LINK_NUM];
349 /******************************************************************************
350 * P R I V A T E D A T A
351 *******************************************************************************
354 const BOW_CMD_T arBowCmdTable[] = {
355 {BOW_CMD_ID_GET_MAC_STATUS, bowCmdGetMacStatus},
356 {BOW_CMD_ID_SETUP_CONNECTION, bowCmdSetupConnection},
357 {BOW_CMD_ID_DESTROY_CONNECTION, bowCmdDestroyConnection},
358 {BOW_CMD_ID_SET_PTK, bowCmdSetPTK},
359 {BOW_CMD_ID_READ_RSSI, bowCmdReadRSSI},
360 {BOW_CMD_ID_READ_LINK_QUALITY, bowCmdReadLinkQuality},
361 {BOW_CMD_ID_SHORT_RANGE_MODE, bowCmdShortRangeMode},
362 {BOW_CMD_ID_GET_CHANNEL_LIST, bowCmdGetChannelList},
365 /******************************************************************************
367 *******************************************************************************
370 /******************************************************************************
371 * F U N C T I O N D E C L A R A T I O N S
372 *******************************************************************************
375 /******************************************************************************
377 *******************************************************************************
380 /*----------------------------------------------------------------------------*/
382 * \brief command packet generation utility
384 * \param[in] prAdapter Pointer to the Adapter structure.
385 * \param[in] ucCID Command ID
386 * \param[in] fgSetQuery Set or Query
387 * \param[in] fgNeedResp Need for response
388 * \param[in] pfCmdDoneHandler Function pointer when command is done
389 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
390 * \param[in] pucInfoBuffer Pointer to set/query buffer
393 * \retval WLAN_STATUS_PENDING
394 * \retval WLAN_STATUS_FAILURE
396 /*----------------------------------------------------------------------------*/
398 wlanoidSendSetQueryBowCmd (
399 IN P_ADAPTER_T prAdapter,
401 IN BOOLEAN fgSetQuery,
402 IN BOOLEAN fgNeedResp,
403 IN PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
404 IN PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
405 IN UINT_32 u4SetQueryInfoLen,
406 IN PUINT_8 pucInfoBuffer,
407 IN UINT_8 ucSeqNumber
410 P_GLUE_INFO_T prGlueInfo;
411 P_CMD_INFO_T prCmdInfo;
412 P_WIFI_CMD_T prWifiCmd;
417 prGlueInfo = prAdapter->prGlueInfo;
420 DBGLOG(REQ, TRACE, ("Command ID = 0x%08X\n", ucCID));
422 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
425 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
426 return WLAN_STATUS_FAILURE;
429 // increase command sequence number
430 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
431 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
433 // Setup common CMD Info Packet
434 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
435 prCmdInfo->eNetworkType = NETWORK_TYPE_BOW_INDEX;
436 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + u4SetQueryInfoLen);
437 prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
438 prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
439 prCmdInfo->fgIsOid = FALSE;
440 prCmdInfo->ucCID = ucCID;
441 prCmdInfo->fgSetQuery = fgSetQuery;
442 prCmdInfo->fgNeedResp = fgNeedResp;
443 prCmdInfo->fgDriverDomainMCR = FALSE;
444 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
445 prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
446 prCmdInfo->pvInformationBuffer = NULL;
447 prCmdInfo->u4InformationBufferLength = 0;
448 prCmdInfo->u4PrivateData = (UINT_32) ucSeqNumber;
450 // Setup WIFI_CMD_T (no payload)
451 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
452 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
453 prWifiCmd->ucCID = prCmdInfo->ucCID;
454 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
455 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
457 if(u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL) {
458 kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
461 // insert into prCmdQueue
462 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
464 // wakeup txServiceThread later
465 GLUE_SET_EVENT(prGlueInfo);
466 return WLAN_STATUS_PENDING;
469 /*----------------------------------------------------------------------------*/
471 * \brief This routine is called to dispatch command coming from 802.11 PAL
473 * \param[in] prAdapter Pointer to the Adapter structure.
474 * \param[in] prCmd Pointer to the buffer that holds the command
476 * \retval WLAN_STATUS_SUCCESS
477 * \retval WLAN_STATUS_INVALID_LENGTH
479 /*----------------------------------------------------------------------------*/
481 wlanbowHandleCommand(
482 IN P_ADAPTER_T prAdapter,
483 IN P_AMPC_COMMAND prCmd
486 WLAN_STATUS retval = WLAN_STATUS_FAILURE;
491 for (i = 0; i < sizeof(arBowCmdTable) / sizeof(BOW_CMD_T); i++) {
492 if ((arBowCmdTable[i].uCmdID == prCmd->rHeader.ucCommandId) &&
493 arBowCmdTable[i].pfCmdHandle) {
494 retval = arBowCmdTable[i].pfCmdHandle(prAdapter, prCmd);
503 /*----------------------------------------------------------------------------*/
505 * \brief This is command handler for BOW_CMD_ID_GET_MAC_STATUS
506 * coming from 802.11 PAL
508 * \param[in] prAdapter Pointer to the Adapter structure.
509 * \param[in] prCmd Pointer to the buffer that holds the command
511 * \retval WLAN_STATUS_SUCCESS
512 * \retval WLAN_STATUS_INVALID_LENGTH
514 /*----------------------------------------------------------------------------*/
517 IN P_ADAPTER_T prAdapter,
518 IN P_AMPC_COMMAND prCmd
521 P_AMPC_EVENT prEvent;
522 P_BOW_MAC_STATUS prMacStatus;
524 UINT_8 ucPrimaryChannel;
526 ENUM_CHNL_EXT_T eBssSCO;
527 UINT_8 ucNumOfChannel = 0;//MAX_BOW_NUMBER_OF_CHANNEL;
529 RF_CHANNEL_INFO_T aucChannelList[MAX_BOW_NUMBER_OF_CHANNEL];
533 //3 <1> If LinkCount != 0 -> OK (optional)
536 eBssSCO = CHNL_EXT_SCN;
539 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_MAC_STATUS)), VIR_MEM_TYPE);
541 prEvent->rHeader.ucEventId = BOW_EVENT_ID_MAC_STATUS;
542 prEvent->rHeader.ucSeqNumber = prCmd->rHeader.ucSeqNumber;
543 prEvent->rHeader.u2PayloadLength = sizeof(BOW_MAC_STATUS);
546 prMacStatus = (P_BOW_MAC_STATUS)(prEvent->aucPayload);
547 kalMemZero(prMacStatus, sizeof(BOW_MAC_STATUS));
549 //3 <2> Call CNM to decide if BOW available.
550 if (cnmBowIsPermitted(prAdapter))
552 prMacStatus->ucAvailability = TRUE;
556 prMacStatus->ucAvailability = FALSE;
559 memcpy(prMacStatus->aucMacAddr, prAdapter->rWifiVar.aucDeviceAddress, PARAM_MAC_ADDR_LEN);
561 if (cnmPreferredChannel(prAdapter, &eBand, &ucPrimaryChannel, &eBssSCO))
564 DBGLOG(BOW, EVENT, ("bowCmdGetMacStatus, Get preferred channel.\n"));
567 prMacStatus->ucNumOfChannel = 1;
568 prMacStatus->arChannelList[0].ucChannelBand = eBand;
569 prMacStatus->arChannelList[0].ucChannelNum = ucPrimaryChannel;
574 DBGLOG(BOW, EVENT, ("bowCmdGetMacStatus, Get channel list. Current number of channel, %d.\n", ucNumOfChannel));
577 rlmDomainGetChnlList(prAdapter, BAND_2G4, MAX_BOW_NUMBER_OF_CHANNEL_2G4, &ucNumOfChannel, aucChannelList);
579 if (ucNumOfChannel > 0) {
580 for (idx = 0; idx < ucNumOfChannel/*MAX_BOW_NUMBER_OF_CHANNEL_2G4*/; idx++)
582 prMacStatus->arChannelList[idx].ucChannelBand = aucChannelList[idx].eBand;
583 prMacStatus->arChannelList[idx].ucChannelNum = aucChannelList[idx].ucChannelNum;
586 prMacStatus->ucNumOfChannel = ucNumOfChannel;
589 rlmDomainGetChnlList(prAdapter, BAND_5G, MAX_BOW_NUMBER_OF_CHANNEL_5G, &ucNumOfChannel, aucChannelList);
591 if (ucNumOfChannel > 0) {
592 for (idx = 0; idx < ucNumOfChannel/*MAX_BOW_NUMBER_OF_CHANNEL_5G*/; idx++)
594 prMacStatus->arChannelList[prMacStatus->ucNumOfChannel + idx].ucChannelBand = aucChannelList[idx].eBand;
595 prMacStatus->arChannelList[prMacStatus->ucNumOfChannel + idx].ucChannelNum = aucChannelList[idx].ucChannelNum;
598 prMacStatus->ucNumOfChannel = prMacStatus->ucNumOfChannel + ucNumOfChannel;
604 DBGLOG(BOW, EVENT, ("ucNumOfChannel, eBand, aucChannelList, %x, %x, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
606 aucChannelList[0].eBand,
607 aucChannelList[0].ucChannelNum,
608 aucChannelList[1].ucChannelNum,
609 aucChannelList[2].ucChannelNum,
610 aucChannelList[3].ucChannelNum,
611 aucChannelList[4].ucChannelNum,
612 aucChannelList[5].ucChannelNum,
613 aucChannelList[6].ucChannelNum,
614 aucChannelList[7].ucChannelNum,
615 aucChannelList[8].ucChannelNum,
616 aucChannelList[9].ucChannelNum,
617 aucChannelList[10].ucChannelNum,
618 aucChannelList[11].ucChannelNum,
619 aucChannelList[12].ucChannelNum,
620 aucChannelList[13].ucChannelNum,
621 aucChannelList[14].ucChannelNum,
622 aucChannelList[15].ucChannelNum,
623 aucChannelList[16].ucChannelNum,
624 aucChannelList[17].ucChannelNum));
626 DBGLOG(BOW, EVENT, ("prMacStatus->ucNumOfChannel, eBand, prMacStatus->arChannelList, %x, %x, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
627 prMacStatus->ucNumOfChannel,
628 prMacStatus->arChannelList[0].ucChannelBand,
629 prMacStatus->arChannelList[0].ucChannelNum,
630 prMacStatus->arChannelList[1].ucChannelNum,
631 prMacStatus->arChannelList[2].ucChannelNum,
632 prMacStatus->arChannelList[3].ucChannelNum,
633 prMacStatus->arChannelList[4].ucChannelNum,
634 prMacStatus->arChannelList[5].ucChannelNum,
635 prMacStatus->arChannelList[6].ucChannelNum,
636 prMacStatus->arChannelList[7].ucChannelNum,
637 prMacStatus->arChannelList[8].ucChannelNum,
638 prMacStatus->arChannelList[9].ucChannelNum,
639 prMacStatus->arChannelList[10].ucChannelNum,
640 prMacStatus->arChannelList[11].ucChannelNum,
641 prMacStatus->arChannelList[12].ucChannelNum,
642 prMacStatus->arChannelList[13].ucChannelNum,
643 prMacStatus->arChannelList[14].ucChannelNum,
644 prMacStatus->arChannelList[15].ucChannelNum,
645 prMacStatus->arChannelList[16].ucChannelNum,
646 prMacStatus->arChannelList[17].ucChannelNum));
648 DBGLOG(BOW, EVENT, ("prMacStatus->ucNumOfChannel, %x.\n", prMacStatus->ucNumOfChannel));
649 DBGLOG(BOW, EVENT, ("prMacStatus->arChannelList[0].ucChannelBand, %x.\n", prMacStatus->arChannelList[0].ucChannelBand));
650 DBGLOG(BOW, EVENT, ("prMacStatus->arChannelList[0].ucChannelNum, %x.\n", prMacStatus->arChannelList[0].ucChannelNum));
651 DBGLOG(BOW, EVENT, ("prMacStatus->ucAvailability, %x.\n", prMacStatus->ucAvailability));
652 DBGLOG(BOW, EVENT, ("prMacStatus->aucMacAddr, %x:%x:%x:%x:%x:%x.\n",
653 prMacStatus->aucMacAddr[0],
654 prMacStatus->aucMacAddr[1],
655 prMacStatus->aucMacAddr[2],
656 prMacStatus->aucMacAddr[3],
657 prMacStatus->aucMacAddr[4],
658 prMacStatus->aucMacAddr[5]));
661 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
663 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_MAC_STATUS)));
665 return WLAN_STATUS_SUCCESS;
669 /*----------------------------------------------------------------------------*/
671 * \brief This is command handler for BOW_CMD_ID_SETUP_CONNECTION
672 * coming from 802.11 PAL
674 * \param[in] prAdapter Pointer to the Adapter structure.
675 * \param[in] prCmd Pointer to the buffer that holds the command
677 * \retval WLAN_STATUS_SUCCESS
678 * \retval WLAN_STATUS_INVALID_LENGTH
680 /*----------------------------------------------------------------------------*/
682 bowCmdSetupConnection(
683 IN P_ADAPTER_T prAdapter,
684 IN P_AMPC_COMMAND prCmd
687 P_BOW_SETUP_CONNECTION prBowSetupConnection;
688 CMD_BT_OVER_WIFI rCmdBtOverWifi;
689 P_BOW_FSM_INFO_T prBowFsmInfo;
690 BOW_TABLE_T rBowTable;
692 UINT_8 ucBowTableIdx = 0;
696 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
697 prBowSetupConnection = (P_BOW_SETUP_CONNECTION) &(prCmd->aucPayload[0]);
699 // parameter size check
700 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_SETUP_CONNECTION))
702 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_INVALID);
703 return WLAN_STATUS_INVALID_LENGTH;
706 //3 <1> If ucLinkCount >= 4 -> Fail.
707 if (g_u4LinkCount >= CFG_BOW_PHYSICAL_LINK_NUM)
709 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
710 return WLAN_STATUS_NOT_ACCEPTED;
713 //3 <2> Call CNM, check if BOW is available.
714 if (!cnmBowIsPermitted(prAdapter))
716 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
717 return WLAN_STATUS_NOT_ACCEPTED;
720 //3 <3> Lookup BOW Table, if Peer MAC address exist and valid -> Fail.
721 if (bowCheckBowTableIfVaild(prAdapter, prBowSetupConnection->aucPeerAddress))
723 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
724 return WLAN_STATUS_NOT_ACCEPTED;
727 if(EQUAL_MAC_ADDR(prBowSetupConnection->aucPeerAddress, prAdapter->rWifiVar.aucDeviceAddress))
729 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_INVALID);
730 return WLAN_STATUS_NOT_ACCEPTED;
734 // fill CMD_BT_OVER_WIFI
735 rCmdBtOverWifi.ucAction = BOW_SETUP_CMD;
736 rCmdBtOverWifi.ucChannelNum = prBowSetupConnection->ucChannelNum;
737 COPY_MAC_ADDR(rCmdBtOverWifi.rPeerAddr, prBowSetupConnection->aucPeerAddress);
738 rCmdBtOverWifi.u2BeaconInterval = prBowSetupConnection->u2BeaconInterval;
739 rCmdBtOverWifi.ucTimeoutDiscovery = prBowSetupConnection->ucTimeoutDiscovery;
740 rCmdBtOverWifi.ucTimeoutInactivity = prBowSetupConnection->ucTimeoutInactivity;
741 rCmdBtOverWifi.ucRole = prBowSetupConnection->ucRole;
742 rCmdBtOverWifi.PAL_Capabilities = prBowSetupConnection->ucPAL_Capabilities;
743 rCmdBtOverWifi.cMaxTxPower = prBowSetupConnection->cMaxTxPower;
745 if (prBowSetupConnection->ucChannelNum > 14) {
746 rCmdBtOverWifi.ucChannelBand = BAND_5G;
749 rCmdBtOverWifi.ucChannelBand = BAND_2G4;
752 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prBowSetupConnection->aucPeerAddress);
754 #if CFG_BOW_PHYSICAL_LINK_NUM > 1
755 /*Channel check for supporting multiple physical link*/
756 if(g_u4LinkCount > 0) {
757 if (prBowSetupConnection->ucChannelNum != prBowFsmInfo->ucPrimaryChannel) {
758 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
759 return WLAN_STATUS_NOT_ACCEPTED;
764 prBowFsmInfo->ucPrimaryChannel = prBowSetupConnection->ucChannelNum;
765 prBowFsmInfo->eBand = rCmdBtOverWifi.ucChannelBand;
766 prBowFsmInfo->u2BeaconInterval = prBowSetupConnection->u2BeaconInterval;
767 prBowFsmInfo->ucRole = prBowSetupConnection->ucRole;
769 if (prBowSetupConnection->ucPAL_Capabilities > 0)
771 prBowFsmInfo->fgSupportQoS = TRUE;
775 DBGLOG(BOW, EVENT, ("bowCmdSetupConnection.\n"));
776 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Channel Number - 0x%x.\n", rCmdBtOverWifi.ucChannelNum));
777 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Peer address - %x:%x:%x:%x:%x:%x.\n", rCmdBtOverWifi.rPeerAddr[0],
778 rCmdBtOverWifi.rPeerAddr[1],
779 rCmdBtOverWifi.rPeerAddr[2],
780 rCmdBtOverWifi.rPeerAddr[3],
781 rCmdBtOverWifi.rPeerAddr[4],
782 rCmdBtOverWifi.rPeerAddr[5]));
783 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Beacon interval - 0x%x.\n", rCmdBtOverWifi.u2BeaconInterval));
784 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Timeout activity - 0x%x.\n", rCmdBtOverWifi.ucTimeoutDiscovery));
785 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Timeout inactivity - 0x%x.\n", rCmdBtOverWifi.ucTimeoutInactivity));
786 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Role - 0x%x.\n", rCmdBtOverWifi.ucRole));
787 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi PAL capability - 0x%x.\n", rCmdBtOverWifi.PAL_Capabilities));
788 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Max Tx power - 0x%x.\n", rCmdBtOverWifi.cMaxTxPower));
791 //3 <4> Get a free BOW entry, mark as Valid, fill in Peer MAC address, LinkCount += 1, state == Starting.
792 if (!bowGetBowTableFreeEntry(prAdapter, &ucBowTableIdx))
794 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
795 return WLAN_STATUS_NOT_ACCEPTED;
798 prBowFsmInfo->prTargetBssDesc = NULL;
800 COPY_MAC_ADDR(rBowTable.aucPeerAddress, prBowSetupConnection->aucPeerAddress);
801 //owTable.eState = BOW_DEVICE_STATE_ACQUIRING_CHANNEL;
802 rBowTable.fgIsValid = TRUE;
803 rBowTable.ucAcquireID = prBowFsmInfo->ucSeqNumOfChReq;
804 //rBowTable.ucRole = prBowSetupConnection->ucRole;
805 //rBowTable.ucChannelNum = prBowSetupConnection->ucChannelNum;
806 bowSetBowTableContent(prAdapter, ucBowTableIdx, &rBowTable);
808 kalSetBowRole(prAdapter->prGlueInfo, rCmdBtOverWifi.ucRole, prBowSetupConnection->aucPeerAddress);
810 GLUE_INC_REF_CNT(g_u4LinkCount);
813 DBGLOG(BOW, EVENT, ("bowStarting, g_u4LinkCount, %x.\n", g_u4LinkCount));
816 if (g_u4LinkCount == 1)
819 DBGLOG(BOW, EVENT, ("bowStarting, cnmTimerInitTimer.\n"));
820 DBGLOG(BOW, EVENT, ("prBowFsmInfo->u2BeaconInterval, %d.\n", prBowFsmInfo->u2BeaconInterval));
822 cnmTimerInitTimer(prAdapter,
823 &prBowFsmInfo->rStartingBeaconTimer,
824 (PFN_MGMT_TIMEOUT_FUNC)bowSendBeacon,
827 cnmTimerInitTimer(prAdapter,
828 &prBowFsmInfo->rChGrantedTimer,
829 (PFN_MGMT_TIMEOUT_FUNC)bowChGrantedTimeout,
832 //Reset Global Variable
836 DBGLOG(BOW, EVENT, ("bowCmdSetupConnection, g_u4LinkCount, %x.\n", g_u4LinkCount));
837 DBGLOG(BOW, EVENT, ("kalInitBowDevice, bow0\n"));
839 #if CFG_BOW_SEPARATE_DATA_PATH
840 kalInitBowDevice(prAdapter->prGlueInfo, BOWDEVNAME);
843 /*Active BoW Network*/
844 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
845 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
846 nicActivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
850 if(rCmdBtOverWifi.ucRole == BOW_INITIATOR) {
851 bowSetBowTableState(prAdapter, prBowSetupConnection->aucPeerAddress, BOW_DEVICE_STATE_ACQUIRING_CHANNEL);
852 bowRequestCh(prAdapter);
854 bowSetBowTableState(prAdapter, prBowSetupConnection->aucPeerAddress, BOW_DEVICE_STATE_SCANNING);
855 bowResponderScan(prAdapter);
858 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
860 return WLAN_STATUS_SUCCESS;
864 /*----------------------------------------------------------------------------*/
866 * \brief This is command handler for BOW_CMD_ID_DESTROY_CONNECTION
867 * coming from 802.11 PAL
869 * \param[in] prAdapter Pointer to the Adapter structure.
870 * \param[in] prCmd Pointer to the buffer that holds the command
872 * \retval WLAN_STATUS_SUCCESS
873 * \retval WLAN_STATUS_INVALID_LENGTH
875 /*----------------------------------------------------------------------------*/
877 bowCmdDestroyConnection(
878 IN P_ADAPTER_T prAdapter,
879 IN P_AMPC_COMMAND prCmd
882 P_BOW_DESTROY_CONNECTION prBowDestroyConnection;
883 CMD_BT_OVER_WIFI rCmdBtOverWifi;
884 P_BOW_FSM_INFO_T prBowFsmInfo;
891 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
893 //3 <1> If LinkCount == 0 ->Fail (Optional)
894 if (g_u4LinkCount == 0)
896 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
897 return WLAN_STATUS_NOT_ACCEPTED;
900 // parameter size check
901 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_DESTROY_CONNECTION))
903 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
904 return WLAN_STATUS_INVALID_LENGTH;
907 //3 <2> Lookup BOW table, check if is not exist (Valid and Peer MAC address) -> Fail
908 prBowDestroyConnection = (P_BOW_DESTROY_CONNECTION) &(prCmd->aucPayload[0]);
910 if (!bowCheckBowTableIfVaild(prAdapter, prBowDestroyConnection->aucPeerAddress))
913 DBGLOG(BOW, EVENT, ("bowCmdDestroyConnection, bowCheckIfVaild, not accepted.\n"));
915 return WLAN_STATUS_NOT_ACCEPTED;
919 DBGLOG(BOW, EVENT, ("bowCmdDestroyConnection, destroy Peer address - %x:%x:%x:%x:%x:%x.\n", prBowDestroyConnection->aucPeerAddress[0],
920 prBowDestroyConnection->aucPeerAddress[1],
921 prBowDestroyConnection->aucPeerAddress[2],
922 prBowDestroyConnection->aucPeerAddress[3],
923 prBowDestroyConnection->aucPeerAddress[4],
924 prBowDestroyConnection->aucPeerAddress[5]));
927 // fill CMD_BT_OVER_WIFI
928 rCmdBtOverWifi.ucAction = 2;
929 COPY_MAC_ADDR(rCmdBtOverWifi.rPeerAddr, prBowDestroyConnection->aucPeerAddress);
930 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prBowDestroyConnection->aucPeerAddress);
932 DBGLOG(BOW, EVENT, ("bowCmdDestroyConnection, rCmdBtOverWifi.rPeerAddr - %x:%x:%x:%x:%x:%x.\n", rCmdBtOverWifi.rPeerAddr[0],
933 rCmdBtOverWifi.rPeerAddr[1],
934 rCmdBtOverWifi.rPeerAddr[2],
935 rCmdBtOverWifi.rPeerAddr[3],
936 rCmdBtOverWifi.rPeerAddr[4],
937 rCmdBtOverWifi.rPeerAddr[5]));
941 for (ucIdx = 0; ucIdx < 11; ucIdx++)
943 DBGLOG(BOW, EVENT, ("BoW receiving PAL packet delta time vs packet number -- %d ms vs %x.\n", ucIdx, g_arBowRevPalPacketTime[ucIdx]));
947 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
949 return wlanoidSendSetQueryBowCmd(prAdapter,
950 CMD_ID_CMD_BT_OVER_WIFI,
953 wlanbowCmdEventLinkDisconnected,
954 wlanbowCmdTimeoutHandler,
955 sizeof(CMD_BT_OVER_WIFI),
956 (PUINT_8) &rCmdBtOverWifi,
957 prCmd->rHeader.ucSeqNumber
962 /*----------------------------------------------------------------------------*/
964 * \brief This is command handler for BOW_CMD_ID_SET_PTK
965 * coming from 802.11 PAL
967 * \param[in] prAdapter Pointer to the Adapter structure.
968 * \param[in] prCmd Pointer to the buffer that holds the command
970 * \retval WLAN_STATUS_SUCCESS
971 * \retval WLAN_STATUS_INVALID_LENGTH
973 /*----------------------------------------------------------------------------*/
976 IN P_ADAPTER_T prAdapter,
977 IN P_AMPC_COMMAND prCmd
980 P_BOW_SET_PTK prBowSetPTK;
981 CMD_802_11_KEY rCmdKey;
985 // parameter size check
986 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_SET_PTK)) {
987 return WLAN_STATUS_INVALID_LENGTH;
990 prBowSetPTK = (P_BOW_SET_PTK) &(prCmd->aucPayload[0]);
993 DBGLOG(BOW, EVENT, ("prBowSetPTK->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
994 prBowSetPTK->aucPeerAddress[0],
995 prBowSetPTK->aucPeerAddress[1],
996 prBowSetPTK->aucPeerAddress[2],
997 prBowSetPTK->aucPeerAddress[3],
998 prBowSetPTK->aucPeerAddress[4],
999 prBowSetPTK->aucPeerAddress[5]));
1001 DBGLOG(BOW, EVENT, ("rCmdKey.ucIsAuthenticator, %x.\n", kalGetBowRole(prAdapter->prGlueInfo, prBowSetPTK->aucPeerAddress)));
1004 if (!bowCheckBowTableIfVaild(prAdapter, prBowSetPTK->aucPeerAddress))
1006 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
1008 return WLAN_STATUS_NOT_ACCEPTED;
1011 if (bowGetBowTableState(prAdapter, prBowSetPTK->aucPeerAddress) != BOW_DEVICE_STATE_CONNECTED)
1013 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
1015 return WLAN_STATUS_NOT_ACCEPTED;
1018 // fill CMD_802_11_KEY
1019 rCmdKey.ucAddRemove = 1; // add
1020 rCmdKey.ucTxKey = 1;
1021 rCmdKey.ucKeyType = 1;
1022 rCmdKey.ucIsAuthenticator = kalGetBowRole(prAdapter->prGlueInfo, prBowSetPTK->aucPeerAddress);
1023 COPY_MAC_ADDR(rCmdKey.aucPeerAddr, prBowSetPTK->aucPeerAddress);
1024 rCmdKey.ucNetType = NETWORK_TYPE_BOW_INDEX; // BT Over Wi-Fi
1025 rCmdKey.ucAlgorithmId = CIPHER_SUITE_CCMP; // AES
1026 rCmdKey.ucKeyId = 0;
1027 rCmdKey.ucKeyLen = 16; // AES = 128bit
1028 kalMemCopy(rCmdKey.aucKeyMaterial, prBowSetPTK->aucTemporalKey, 16);
1031 DBGLOG(BOW, EVENT, ("prBowSetPTK->aucTemporalKey, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
1032 prBowSetPTK->aucTemporalKey[0],
1033 prBowSetPTK->aucTemporalKey[1],
1034 prBowSetPTK->aucTemporalKey[2],
1035 prBowSetPTK->aucTemporalKey[3],
1036 prBowSetPTK->aucTemporalKey[4],
1037 prBowSetPTK->aucTemporalKey[5],
1038 prBowSetPTK->aucTemporalKey[6],
1039 prBowSetPTK->aucTemporalKey[7],
1040 prBowSetPTK->aucTemporalKey[8],
1041 prBowSetPTK->aucTemporalKey[9],
1042 prBowSetPTK->aucTemporalKey[10],
1043 prBowSetPTK->aucTemporalKey[11],
1044 prBowSetPTK->aucTemporalKey[12],
1045 prBowSetPTK->aucTemporalKey[13],
1046 prBowSetPTK->aucTemporalKey[14],
1047 prBowSetPTK->aucTemporalKey[15]));
1049 DBGLOG(BOW, EVENT, ("rCmdKey.aucKeyMaterial, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
1050 rCmdKey.aucKeyMaterial[0],
1051 rCmdKey.aucKeyMaterial[1],
1052 rCmdKey.aucKeyMaterial[2],
1053 rCmdKey.aucKeyMaterial[3],
1054 rCmdKey.aucKeyMaterial[4],
1055 rCmdKey.aucKeyMaterial[5],
1056 rCmdKey.aucKeyMaterial[6],
1057 rCmdKey.aucKeyMaterial[7],
1058 rCmdKey.aucKeyMaterial[8],
1059 rCmdKey.aucKeyMaterial[9],
1060 rCmdKey.aucKeyMaterial[10],
1061 rCmdKey.aucKeyMaterial[11],
1062 rCmdKey.aucKeyMaterial[12],
1063 rCmdKey.aucKeyMaterial[13],
1064 rCmdKey.aucKeyMaterial[14],
1065 rCmdKey.aucKeyMaterial[15]));
1068 return wlanoidSendSetQueryBowCmd(prAdapter,
1069 CMD_ID_ADD_REMOVE_KEY,
1072 wlanbowCmdEventSetCommon,
1073 wlanbowCmdTimeoutHandler,
1074 sizeof(CMD_802_11_KEY),
1076 prCmd->rHeader.ucSeqNumber
1081 /*----------------------------------------------------------------------------*/
1083 * \brief This is command handler for BOW_CMD_ID_READ_RSSI
1084 * coming from 802.11 PAL
1086 * \param[in] prAdapter Pointer to the Adapter structure.
1087 * \param[in] prCmd Pointer to the buffer that holds the command
1089 * \retval WLAN_STATUS_SUCCESS
1090 * \retval WLAN_STATUS_INVALID_LENGTH
1092 /*----------------------------------------------------------------------------*/
1095 IN P_ADAPTER_T prAdapter,
1096 IN P_AMPC_COMMAND prCmd
1099 P_BOW_READ_RSSI prBowReadRSSI;
1103 // parameter size check
1104 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_READ_RSSI)) {
1105 return WLAN_STATUS_INVALID_LENGTH;
1108 prBowReadRSSI = (P_BOW_READ_RSSI) &(prCmd->aucPayload[0]);
1110 return wlanoidSendSetQueryBowCmd(prAdapter,
1111 CMD_ID_GET_LINK_QUALITY,
1114 wlanbowCmdEventReadRssi,
1115 wlanbowCmdTimeoutHandler,
1118 prCmd->rHeader.ucSeqNumber
1122 /*----------------------------------------------------------------------------*/
1124 * \brief This is command handler for BOW_CMD_ID_READ_LINK_QUALITY
1125 * coming from 802.11 PAL
1127 * \param[in] prAdapter Pointer to the Adapter structure.
1128 * \param[in] prCmd Pointer to the buffer that holds the command
1130 * \retval WLAN_STATUS_SUCCESS
1131 * \retval WLAN_STATUS_INVALID_LENGTH
1133 /*----------------------------------------------------------------------------*/
1135 bowCmdReadLinkQuality(
1136 IN P_ADAPTER_T prAdapter,
1137 IN P_AMPC_COMMAND prCmd
1140 P_BOW_READ_LINK_QUALITY prBowReadLinkQuality;
1144 // parameter size check
1145 if(prCmd->rHeader.u2PayloadLength != sizeof(P_BOW_READ_LINK_QUALITY)) {
1146 return WLAN_STATUS_INVALID_LENGTH;
1149 prBowReadLinkQuality = (P_BOW_READ_LINK_QUALITY) &(prCmd->aucPayload[0]);
1151 return wlanoidSendSetQueryBowCmd(prAdapter,
1152 CMD_ID_GET_LINK_QUALITY,
1155 wlanbowCmdEventReadLinkQuality,
1156 wlanbowCmdTimeoutHandler,
1159 prCmd->rHeader.ucSeqNumber
1164 /*----------------------------------------------------------------------------*/
1166 * \brief This is command handler for BOW_CMD_ID_SHORT_RANGE_MODE
1167 * coming from 802.11 PAL
1169 * \param[in] prAdapter Pointer to the Adapter structure.
1170 * \param[in] prCmd Pointer to the buffer that holds the command
1172 * \retval WLAN_STATUS_SUCCESS
1173 * \retval WLAN_STATUS_INVALID_LENGTH
1175 /*----------------------------------------------------------------------------*/
1177 bowCmdShortRangeMode(
1178 IN P_ADAPTER_T prAdapter,
1179 IN P_AMPC_COMMAND prCmd
1182 P_BOW_SHORT_RANGE_MODE prBowShortRangeMode;
1183 CMD_TX_PWR_T rTxPwrParam;
1188 DBGLOG(BOW, EVENT, ("bowCmdShortRangeMode.\n"));
1191 prBowShortRangeMode = (P_BOW_SHORT_RANGE_MODE) &(prCmd->aucPayload[0]);
1193 // parameter size check
1194 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_SHORT_RANGE_MODE)) {
1195 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
1196 return WLAN_STATUS_INVALID_LENGTH;
1199 if (!bowCheckBowTableIfVaild(prAdapter, prBowShortRangeMode->aucPeerAddress))
1201 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
1202 return WLAN_STATUS_NOT_ACCEPTED;
1205 if (bowGetBowTableState(prAdapter, prBowShortRangeMode->aucPeerAddress) != BOW_DEVICE_STATE_CONNECTED)
1207 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
1208 return WLAN_STATUS_NOT_ACCEPTED;
1213 DBGLOG(BOW, EVENT, ("prBowShortRangeMode->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1214 prBowShortRangeMode->aucPeerAddress[0],
1215 prBowShortRangeMode->aucPeerAddress[1],
1216 prBowShortRangeMode->aucPeerAddress[2],
1217 prBowShortRangeMode->aucPeerAddress[3],
1218 prBowShortRangeMode->aucPeerAddress[4],
1219 prBowShortRangeMode->aucPeerAddress[5]));
1222 rTxPwrParam.cTxPwr2G4Cck = (prBowShortRangeMode->cTxPower << 1);
1224 rTxPwrParam.cTxPwr2G4OFDM_BPSK = (prBowShortRangeMode->cTxPower << 1);
1225 rTxPwrParam.cTxPwr2G4OFDM_QPSK = (prBowShortRangeMode->cTxPower << 1);
1226 rTxPwrParam.cTxPwr2G4OFDM_16QAM = (prBowShortRangeMode->cTxPower << 1);
1228 rTxPwrParam.cTxPwr2G4OFDM_48Mbps = (prBowShortRangeMode->cTxPower << 1);
1229 rTxPwrParam.cTxPwr2G4OFDM_54Mbps = (prBowShortRangeMode->cTxPower << 1);
1231 rTxPwrParam.cTxPwr2G4HT20_BPSK = (prBowShortRangeMode->cTxPower << 1);
1232 rTxPwrParam.cTxPwr2G4HT20_QPSK = (prBowShortRangeMode->cTxPower << 1);
1233 rTxPwrParam.cTxPwr2G4HT20_16QAM = (prBowShortRangeMode->cTxPower << 1);
1234 rTxPwrParam.cTxPwr2G4HT20_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1235 rTxPwrParam.cTxPwr2G4HT20_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1236 rTxPwrParam.cTxPwr2G4HT20_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1238 rTxPwrParam.cTxPwr2G4HT40_BPSK = (prBowShortRangeMode->cTxPower << 1);
1239 rTxPwrParam.cTxPwr2G4HT40_QPSK = (prBowShortRangeMode->cTxPower << 1);
1240 rTxPwrParam.cTxPwr2G4HT40_16QAM = (prBowShortRangeMode->cTxPower << 1);
1241 rTxPwrParam.cTxPwr2G4HT40_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1242 rTxPwrParam.cTxPwr2G4HT40_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1243 rTxPwrParam.cTxPwr2G4HT40_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1245 rTxPwrParam.cTxPwr5GOFDM_BPSK = (prBowShortRangeMode->cTxPower << 1);
1246 rTxPwrParam.cTxPwr5GOFDM_QPSK = (prBowShortRangeMode->cTxPower << 1);
1247 rTxPwrParam.cTxPwr5GOFDM_16QAM = (prBowShortRangeMode->cTxPower << 1);
1248 rTxPwrParam.cTxPwr5GOFDM_48Mbps = (prBowShortRangeMode->cTxPower << 1);
1249 rTxPwrParam.cTxPwr5GOFDM_54Mbps = (prBowShortRangeMode->cTxPower << 1);
1251 rTxPwrParam.cTxPwr5GHT20_BPSK = (prBowShortRangeMode->cTxPower << 1);
1252 rTxPwrParam.cTxPwr5GHT20_QPSK = (prBowShortRangeMode->cTxPower << 1);
1253 rTxPwrParam.cTxPwr5GHT20_16QAM = (prBowShortRangeMode->cTxPower << 1);
1254 rTxPwrParam.cTxPwr5GHT20_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1255 rTxPwrParam.cTxPwr5GHT20_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1256 rTxPwrParam.cTxPwr5GHT20_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1257 rTxPwrParam.cTxPwr5GHT40_BPSK = (prBowShortRangeMode->cTxPower << 1);
1258 rTxPwrParam.cTxPwr5GHT40_QPSK = (prBowShortRangeMode->cTxPower << 1);
1259 rTxPwrParam.cTxPwr5GHT40_16QAM = (prBowShortRangeMode->cTxPower << 1);
1260 rTxPwrParam.cTxPwr5GHT40_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1261 rTxPwrParam.cTxPwr5GHT40_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1262 rTxPwrParam.cTxPwr5GHT40_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1264 if (nicUpdateTxPower(prAdapter, &rTxPwrParam) == WLAN_STATUS_SUCCESS)
1267 DBGLOG(BOW, EVENT, ("bowCmdShortRangeMode, %x.\n", WLAN_STATUS_SUCCESS));
1269 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
1270 return WLAN_STATUS_SUCCESS;
1274 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
1275 return WLAN_STATUS_FAILURE;
1281 /*----------------------------------------------------------------------------*/
1283 * \brief This is command handler for BOW_CMD_ID_GET_CHANNEL_LIST
1284 * coming from 802.11 PAL
1286 * \param[in] prAdapter Pointer to the Adapter structure.
1287 * \param[in] prCmd Pointer to the buffer that holds the command
1289 * \retval WLAN_STATUS_SUCCESS
1290 * \retval WLAN_STATUS_INVALID_LENGTH
1292 /*----------------------------------------------------------------------------*/
1294 bowCmdGetChannelList(
1295 IN P_ADAPTER_T prAdapter,
1296 IN P_AMPC_COMMAND prCmd
1301 // not supported yet
1302 return WLAN_STATUS_FAILURE;
1307 /*----------------------------------------------------------------------------*/
1309 * \brief This is generic command done handler
1311 * \param[in] prAdapter Pointer to the Adapter structure.
1312 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1313 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1317 /*----------------------------------------------------------------------------*/
1319 wlanbowCmdEventSetStatus(
1320 IN P_ADAPTER_T prAdapter,
1321 IN P_AMPC_COMMAND prCmd,
1322 IN UINT_8 ucEventBuf
1325 P_AMPC_EVENT prEvent;
1326 P_BOW_COMMAND_STATUS prBowCmdStatus;
1330 // fill event header
1331 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1332 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1333 prEvent->rHeader.ucSeqNumber = prCmd->rHeader.ucSeqNumber;
1334 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1337 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1338 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1340 prBowCmdStatus->ucStatus = ucEventBuf;
1342 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1344 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1348 /*----------------------------------------------------------------------------*/
1350 * \brief This is generic command done handler
1352 * \param[in] prAdapter Pointer to the Adapter structure.
1353 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1354 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1358 /*----------------------------------------------------------------------------*/
1360 wlanbowCmdEventSetCommon(
1361 IN P_ADAPTER_T prAdapter,
1362 IN P_CMD_INFO_T prCmdInfo,
1363 IN PUINT_8 pucEventBuf
1366 P_AMPC_EVENT prEvent;
1367 P_BOW_COMMAND_STATUS prBowCmdStatus;
1371 // fill event header
1372 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1373 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1374 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1375 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1378 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1379 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1381 prBowCmdStatus->ucStatus = BOWCMD_STATUS_SUCCESS;
1383 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1385 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1389 /*----------------------------------------------------------------------------*/
1391 * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
1393 * \param[in] prAdapter Pointer to the Adapter structure.
1394 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1395 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1399 /*----------------------------------------------------------------------------*/
1401 wlanbowCmdEventLinkConnected(
1402 IN P_ADAPTER_T prAdapter,
1403 IN P_CMD_INFO_T prCmdInfo,
1404 IN PUINT_8 pucEventBuf
1407 P_AMPC_EVENT prEvent;
1408 P_BOW_LINK_CONNECTED prBowLinkConnected;
1409 P_BOW_FSM_INFO_T prBowFsmInfo;
1410 P_BSS_INFO_T prBssInfo;
1414 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1415 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
1417 // fill event header
1418 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_CONNECTED)), VIR_MEM_TYPE);
1419 prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_CONNECTED;
1420 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1421 prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_CONNECTED);
1424 prBowLinkConnected = (P_BOW_LINK_CONNECTED)(prEvent->aucPayload);
1425 kalMemZero(prBowLinkConnected, sizeof(BOW_LINK_CONNECTED));
1426 prBowLinkConnected->rChannel.ucChannelNum = prBssInfo->ucPrimaryChannel;
1427 prBowLinkConnected->rChannel.ucChannelBand = prBssInfo->eBand;
1428 COPY_MAC_ADDR(prBowLinkConnected->aucPeerAddress, prBowFsmInfo->aucPeerAddress);
1431 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucEventId, 0x%x\n", prEvent->rHeader.ucEventId));
1432 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucSeqNumber, 0x%x\n", prEvent->rHeader.ucSeqNumber));
1433 DBGLOG(BOW, EVENT, ("prEvent->rHeader.u2PayloadLength, 0x%x\n", prEvent->rHeader.u2PayloadLength));
1434 DBGLOG(BOW, EVENT, ("prBowLinkConnected->rChannel.ucChannelNum, 0x%x\n", prBowLinkConnected->rChannel.ucChannelNum));
1435 DBGLOG(BOW, EVENT, ("prBowLinkConnected->rChannel.ucChannelBand, 0x%x\n", prBowLinkConnected->rChannel.ucChannelBand));
1436 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkConnected, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1437 prBowFsmInfo->aucPeerAddress[0],
1438 prBowFsmInfo->aucPeerAddress[1],
1439 prBowFsmInfo->aucPeerAddress[2],
1440 prBowFsmInfo->aucPeerAddress[3],
1441 prBowFsmInfo->aucPeerAddress[4],
1442 prBowFsmInfo->aucPeerAddress[5]));
1443 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkConnected, prBowLinkConnected->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1444 prBowLinkConnected->aucPeerAddress[0],
1445 prBowLinkConnected->aucPeerAddress[1],
1446 prBowLinkConnected->aucPeerAddress[2],
1447 prBowLinkConnected->aucPeerAddress[3],
1448 prBowLinkConnected->aucPeerAddress[4],
1449 prBowLinkConnected->aucPeerAddress[5]));
1450 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkConnected, g_u4LinkCount, %x.\n", g_u4LinkCount));
1453 /*Indicate Event to PAL*/
1454 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1455 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_CONNECTED)));
1457 /*Release channel if granted*/
1458 if(prBowFsmInfo->fgIsChannelGranted) {
1459 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
1460 //bowReleaseCh(prAdapter);
1461 /*Requested, not granted yet*/
1462 } else if(prBowFsmInfo->fgIsChannelRequested) {
1463 prBowFsmInfo->fgIsChannelRequested = FALSE;
1466 /* set to connected status*/
1467 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_CONNECTED);
1472 /*----------------------------------------------------------------------------*/
1474 * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
1476 * \param[in] prAdapter Pointer to the Adapter structure.
1477 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1478 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1482 /*----------------------------------------------------------------------------*/
1484 wlanbowCmdEventLinkDisconnected(
1485 IN P_ADAPTER_T prAdapter,
1486 IN P_CMD_INFO_T prCmdInfo,
1487 IN PUINT_8 pucEventBuf
1490 P_AMPC_EVENT prEvent;
1491 P_BOW_LINK_DISCONNECTED prBowLinkDisconnected;
1492 P_BOW_FSM_INFO_T prBowFsmInfo;
1493 BOW_TABLE_T rBowTable;
1494 UINT_8 ucBowTableIdx;
1495 ENUM_BOW_DEVICE_STATE eFsmState;
1496 BOOL fgSendDeauth = FALSE;
1500 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1501 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
1503 if(eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
1508 else if(eFsmState == BOW_DEVICE_STATE_SCANNING &&
1509 !(prBowFsmInfo->fgIsChannelRequested)) {
1510 bowResponderCancelScan(prAdapter, FALSE);
1511 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_DISCONNECTING);
1515 // fill event header
1516 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)), VIR_MEM_TYPE);
1517 prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_DISCONNECTED;
1518 if ((prCmdInfo->u4PrivateData))
1520 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1524 prEvent->rHeader.ucSeqNumber = 0;
1527 prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_DISCONNECTED);
1530 prBowLinkDisconnected = (P_BOW_LINK_DISCONNECTED)(prEvent->aucPayload);
1531 kalMemZero(prBowLinkDisconnected, sizeof(BOW_LINK_DISCONNECTED));
1532 prBowLinkDisconnected->ucReason = 0x0;
1533 COPY_MAC_ADDR(prBowLinkDisconnected->aucPeerAddress, prBowFsmInfo->aucPeerAddress);
1536 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucEventId, 0x%x\n", prEvent->rHeader.ucEventId));
1537 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucSeqNumber, 0x%x\n", prEvent->rHeader.ucSeqNumber));
1538 DBGLOG(BOW, EVENT, ("prEvent->rHeader.u2PayloadLength, 0x%x\n", prEvent->rHeader.u2PayloadLength));
1540 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1541 prBowFsmInfo->aucPeerAddress[0],
1542 prBowFsmInfo->aucPeerAddress[1],
1543 prBowFsmInfo->aucPeerAddress[2],
1544 prBowFsmInfo->aucPeerAddress[3],
1545 prBowFsmInfo->aucPeerAddress[4],
1546 prBowFsmInfo->aucPeerAddress[5]));
1548 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, prBowLinkDisconnected->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1549 prBowLinkDisconnected->aucPeerAddress[0],
1550 prBowLinkDisconnected->aucPeerAddress[1],
1551 prBowLinkDisconnected->aucPeerAddress[2],
1552 prBowLinkDisconnected->aucPeerAddress[3],
1553 prBowLinkDisconnected->aucPeerAddress[4],
1554 prBowLinkDisconnected->aucPeerAddress[5]));
1556 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, g_u4LinkCount, %x.\n", g_u4LinkCount));
1559 /*Indicate BoW event to PAL*/
1561 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1562 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
1565 // set to disconnected status
1566 prBowFsmInfo->prTargetStaRec = cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_BOW_INDEX, prBowLinkDisconnected->aucPeerAddress);
1568 /*Release channel if granted*/
1569 if(prBowFsmInfo->fgIsChannelGranted) {
1570 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
1571 bowReleaseCh(prAdapter);
1572 /*Requested, not granted yet*/
1573 } else if(prBowFsmInfo->fgIsChannelRequested) {
1574 prBowFsmInfo->fgIsChannelRequested = FALSE;
1575 //bowReleaseCh(prAdapter);
1579 /*Send Deauth to connected peer*/
1580 if (eFsmState == BOW_DEVICE_STATE_CONNECTED &&
1581 (prBowFsmInfo->prTargetStaRec->ucStaState == STA_STATE_3))
1583 fgSendDeauth = TRUE;
1585 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, bowGetBowTableState, %x.\n", bowGetBowTableState(prAdapter, prBowLinkDisconnected->aucPeerAddress)));
1587 authSendDeauthFrame(prAdapter,
1588 prBowFsmInfo->prTargetStaRec,
1590 REASON_CODE_DEAUTH_LEAVING_BSS,
1591 (PFN_TX_DONE_HANDLER)bowDisconnectLink);
1596 //3 <3>Stop this link; flush Tx; send deAuthentication -> abort. SAA, AAA. need to check BOW table state == Connected.
1597 if (prAdapter->prGlueInfo->i4TxPendingFrameNum > 0) {
1598 kalFlushPendingTxPackets(prAdapter->prGlueInfo);
1601 /* flush pending security frames */
1602 if (prAdapter->prGlueInfo->i4TxPendingSecurityFrameNum > 0) {
1603 kalClearSecurityFrames(prAdapter->prGlueInfo);
1607 /*Update BoW table*/
1608 bowGetBowTableEntryByPeerAddress(prAdapter, prBowLinkDisconnected->aucPeerAddress, &ucBowTableIdx);
1609 rBowTable.fgIsValid = FALSE;
1610 rBowTable.eState = BOW_DEVICE_STATE_DISCONNECTED;
1611 bowSetBowTableContent(prAdapter, ucBowTableIdx, &rBowTable);
1613 /*Indicate BoW event to PAL*/
1614 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1615 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
1617 /*Decrease link count*/
1618 GLUE_DEC_REF_CNT(g_u4LinkCount);
1620 /*If no need to send deauth, DO disconnect now*/
1621 /*If need to send deauth, DO disconnect at deauth Tx done*/
1623 bowDisconnectLink(prAdapter, NULL, TX_RESULT_SUCCESS);
1628 /*----------------------------------------------------------------------------*/
1630 * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
1632 * \param[in] prAdapter Pointer to the Adapter structure.
1633 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1634 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1638 /*----------------------------------------------------------------------------*/
1640 wlanbowCmdEventSetSetupConnection (
1641 IN P_ADAPTER_T prAdapter,
1642 IN P_CMD_INFO_T prCmdInfo,
1643 IN PUINT_8 pucEventBuf
1646 P_AMPC_EVENT prEvent;
1647 P_BOW_COMMAND_STATUS prBowCmdStatus;
1648 P_WIFI_CMD_T prWifiCmd;
1649 P_CMD_BT_OVER_WIFI prCmdBtOverWifi;
1650 P_BOW_FSM_INFO_T prBowFsmInfo;
1654 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1656 // restore original command for rPeerAddr
1657 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
1658 prCmdBtOverWifi = (P_CMD_BT_OVER_WIFI)(prWifiCmd->aucBuffer);
1660 // fill event header
1661 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1662 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1663 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1664 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1667 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1668 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1669 prBowCmdStatus->ucStatus = BOWCMD_STATUS_SUCCESS;
1671 /*Indicate BoW event to PAL*/
1672 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1673 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1675 // set to starting status
1676 kalSetBowState(prAdapter->prGlueInfo,
1677 BOW_DEVICE_STATE_STARTING,
1678 prCmdBtOverWifi->rPeerAddr);
1681 /*----------------------------------------------------------------------------*/
1683 * \brief This is the command done handler for BOW_CMD_ID_READ_LINK_QUALITY
1685 * \param[in] prAdapter Pointer to the Adapter structure.
1686 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1687 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1691 /*----------------------------------------------------------------------------*/
1693 wlanbowCmdEventReadLinkQuality (
1694 IN P_ADAPTER_T prAdapter,
1695 IN P_CMD_INFO_T prCmdInfo,
1696 IN PUINT_8 pucEventBuf
1699 P_EVENT_LINK_QUALITY prLinkQuality;
1700 P_AMPC_EVENT prEvent;
1701 P_BOW_LINK_QUALITY prBowLinkQuality;
1705 prLinkQuality = (P_EVENT_LINK_QUALITY)pucEventBuf;
1707 // fill event header
1708 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)), VIR_MEM_TYPE);
1709 prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_QUALITY;
1710 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1711 prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_QUALITY);
1714 prBowLinkQuality = (P_BOW_LINK_QUALITY)(prEvent->aucPayload);
1715 kalMemZero(prBowLinkQuality, sizeof(BOW_LINK_QUALITY));
1716 prBowLinkQuality->ucLinkQuality = (UINT_8)prLinkQuality->cLinkQuality;
1718 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1720 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)));
1724 /*----------------------------------------------------------------------------*/
1726 * \brief This is the command done handler for BOW_CMD_ID_READ_RSSI
1728 * \param[in] prAdapter Pointer to the Adapter structure.
1729 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1730 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1734 /*----------------------------------------------------------------------------*/
1736 wlanbowCmdEventReadRssi (
1737 IN P_ADAPTER_T prAdapter,
1738 IN P_CMD_INFO_T prCmdInfo,
1739 IN PUINT_8 pucEventBuf
1742 P_EVENT_LINK_QUALITY prLinkQuality;
1743 P_AMPC_EVENT prEvent;
1744 P_BOW_RSSI prBowRssi;
1748 prLinkQuality = (P_EVENT_LINK_QUALITY)pucEventBuf;
1750 // fill event header
1751 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)), VIR_MEM_TYPE);
1752 prEvent->rHeader.ucEventId = BOW_EVENT_ID_RSSI;
1753 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1754 prEvent->rHeader.u2PayloadLength = sizeof(BOW_RSSI);
1757 prBowRssi = (P_BOW_RSSI)(prEvent->aucPayload);
1758 kalMemZero(prBowRssi, sizeof(BOW_RSSI));
1759 prBowRssi->cRssi = (INT_8) prLinkQuality->cRssi;
1761 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1763 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)));
1768 /*----------------------------------------------------------------------------*/
1770 * \brief This is the default command timeout handler
1772 * \param[in] prAdapter Pointer to the Adapter structure.
1773 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1777 /*----------------------------------------------------------------------------*/
1779 wlanbowCmdTimeoutHandler (
1780 IN P_ADAPTER_T prAdapter,
1781 IN P_CMD_INFO_T prCmdInfo
1784 P_AMPC_EVENT prEvent;
1785 P_BOW_COMMAND_STATUS prBowCmdStatus;
1789 // fill event header
1790 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1791 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1792 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1793 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1796 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1797 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1799 prBowCmdStatus->ucStatus = BOWCMD_STATUS_TIMEOUT; // timeout
1801 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1803 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1811 IN P_ADAPTER_T prAdapter
1814 P_BOW_FSM_INFO_T prBowFsmInfo;
1815 P_BSS_INFO_T prBowBssInfo;
1819 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1820 prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
1823 DBGLOG(BOW, EVENT, ("bowStoping.\n"));
1824 DBGLOG(BOW, EVENT, ("bowStoping, SSID %s.\n", prBowBssInfo->aucSSID));
1825 DBGLOG(BOW, EVENT, ("bowStoping, prBowBssInfo->aucBSSID, %x:%x:%x:%x:%x:%x.\n",
1826 prBowBssInfo->aucBSSID[0],
1827 prBowBssInfo->aucBSSID[1],
1828 prBowBssInfo->aucBSSID[2],
1829 prBowBssInfo->aucBSSID[3],
1830 prBowBssInfo->aucBSSID[4],
1831 prBowBssInfo->aucBSSID[5]));
1832 DBGLOG(BOW, EVENT, ("bowStoping, prBssInfo->aucOwnMacAddr, %x:%x:%x:%x:%x:%x.\n",
1833 prBowBssInfo->aucOwnMacAddr[0],
1834 prBowBssInfo->aucOwnMacAddr[1],
1835 prBowBssInfo->aucOwnMacAddr[2],
1836 prBowBssInfo->aucOwnMacAddr[3],
1837 prBowBssInfo->aucOwnMacAddr[4],
1838 prBowBssInfo->aucOwnMacAddr[5]));
1839 DBGLOG(BOW, EVENT, ("bowStoping, prAdapter->rWifiVar.aucDeviceAddress, %x:%x:%x:%x:%x:%x.\n",
1840 prAdapter->rWifiVar.aucDeviceAddress[0],
1841 prAdapter->rWifiVar.aucDeviceAddress[1],
1842 prAdapter->rWifiVar.aucDeviceAddress[2],
1843 prAdapter->rWifiVar.aucDeviceAddress[3],
1844 prAdapter->rWifiVar.aucDeviceAddress[4],
1845 prAdapter->rWifiVar.aucDeviceAddress[5]));
1846 DBGLOG(BOW, EVENT, ("bowStopping, g_u4LinkCount, %x.\n", g_u4LinkCount));
1847 DBGLOG(BOW, EVENT, ("prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", prBowFsmInfo->aucPeerAddress[0],
1848 prBowFsmInfo->aucPeerAddress[1],
1849 prBowFsmInfo->aucPeerAddress[2],
1850 prBowFsmInfo->aucPeerAddress[3],
1851 prBowFsmInfo->aucPeerAddress[4],
1852 prBowFsmInfo->aucPeerAddress[5]));
1853 kalPrint("BoW Stoping,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
1856 if (g_u4LinkCount == 0)
1859 GLUE_DEC_REF_CNT(g_u4Beaconing);
1861 /*Deactive BoW network*/
1862 //prBowBssInfo->fgIsNetActive = FALSE;
1863 //prBowBssInfo->fgIsBeaconActivated = FALSE;
1864 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_BOW_INDEX);
1865 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
1866 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
1867 /*temp solution for FW hal_pwr_mgt.c#3037 ASSERT*/
1868 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
1869 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1870 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1880 IN P_ADAPTER_T prAdapter
1883 P_BOW_FSM_INFO_T prBowFsmInfo;
1884 P_BSS_INFO_T prBssInfo;
1888 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1890 if (g_u4LinkCount == 1)
1893 DBGLOG(BOW, EVENT, ("BoW Starting.\n"));
1894 DBGLOG(BOW, EVENT, ("BoW channel granted.\n"));
1898 /*Active BoW Network*/
1899 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1900 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1901 nicActivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
1904 //3 <1> Update BSS_INFO_T per Network Basis
1905 //4 <1.1> Setup Operation Mode
1906 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
1907 prBssInfo->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
1908 prBssInfo->eCurrentOPMode = OP_MODE_BOW;
1910 //4 <1.2> Setup SSID
1911 COPY_MAC_ADDR(prBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucDeviceAddress);
1912 COPY_MAC_ADDR(prBssInfo->aucBSSID, prAdapter->rWifiVar.aucDeviceAddress);
1913 prBssInfo->ucSSIDLen = BOW_SSID_LEN;
1914 bowAssignSsid(prBssInfo->aucSSID, prBssInfo->aucOwnMacAddr);
1917 DBGLOG(BOW, EVENT, ("SSID %s.\n", prBssInfo->aucSSID));
1918 DBGLOG(BOW, EVENT, ("prBssInfo->aucBSSID, %x:%x:%x:%x:%x:%x.\n",
1919 prBssInfo->aucBSSID[0],
1920 prBssInfo->aucBSSID[1],
1921 prBssInfo->aucBSSID[2],
1922 prBssInfo->aucBSSID[3],
1923 prBssInfo->aucBSSID[4],
1924 prBssInfo->aucBSSID[5]));
1925 DBGLOG(BOW, EVENT, ("prBssInfo->aucOwnMacAddr, %x:%x:%x:%x:%x:%x.\n",
1926 prBssInfo->aucOwnMacAddr[0],
1927 prBssInfo->aucOwnMacAddr[1],
1928 prBssInfo->aucOwnMacAddr[2],
1929 prBssInfo->aucOwnMacAddr[3],
1930 prBssInfo->aucOwnMacAddr[4],
1931 prBssInfo->aucOwnMacAddr[5]));
1932 DBGLOG(BOW, EVENT, ("prAdapter->rWifiVar.aucDeviceAddress, %x:%x:%x:%x:%x:%x.\n",
1933 prAdapter->rWifiVar.aucDeviceAddress[0],
1934 prAdapter->rWifiVar.aucDeviceAddress[1],
1935 prAdapter->rWifiVar.aucDeviceAddress[2],
1936 prAdapter->rWifiVar.aucDeviceAddress[3],
1937 prAdapter->rWifiVar.aucDeviceAddress[4],
1938 prAdapter->rWifiVar.aucDeviceAddress[5]));
1941 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
1942 prBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1943 prBssInfo->u2AssocId = 0;
1945 //4 <1.4> Setup Channel, Band and Phy Attributes
1946 prBssInfo->ucPrimaryChannel = prBowFsmInfo->ucPrimaryChannel;
1947 if (prBowFsmInfo->eBand == BAND_2G4)
1949 prBssInfo->eBand = BAND_2G4;
1953 prBssInfo->eBand = BAND_5G;
1956 #if CFG_BOW_SUPPORT_11N
1957 prBssInfo->ucPhyTypeSet = prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
1958 prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
1960 prBssInfo->ucNonHTBasicPhyType = (UINT_8)
1961 rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
1962 prBssInfo->u2BSSBasicRateSet =
1963 rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
1965 prBssInfo->u2OperationalRateSet =
1966 rNonHTPhyAttributes[prBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
1968 rateGetDataRatesFromRateSet(prBssInfo->u2OperationalRateSet,
1969 prBssInfo->u2BSSBasicRateSet,
1970 prBssInfo->aucAllSupportedRates,
1971 &prBssInfo->ucAllSupportedRatesLen);
1974 if (prBssInfo->eBand == BAND_2G4)
1976 prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11BG; /* Depend on eBand */
1977 prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
1979 prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_ERP; //RATE_SET_ERP;
1980 prBssInfo->u2OperationalRateSet = RATE_SET_ERP;
1981 prBssInfo->ucNonHTBasicPhyType = PHY_TYPE_ERP_INDEX;
1985 //prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11BG; /* Depend on eBand */
1986 //prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
1987 prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11A; /* Depend on eBand */
1988 prBssInfo->ucConfigAdHocAPMode = AP_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
1990 //prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_ERP; //RATE_SET_ERP;
1991 //prBssInfo->u2OperationalRateSet = RATE_SET_ERP;
1993 prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_OFDM; //RATE_SET_ERP;
1994 prBssInfo->u2OperationalRateSet = RATE_SET_OFDM;
1995 prBssInfo->ucNonHTBasicPhyType = PHY_TYPE_OFDM_INDEX;
2000 prBssInfo->fgErpProtectMode = FALSE;
2002 //4 <1.5> Setup MIB for current BSS
2003 prBssInfo->u2BeaconInterval = prBowFsmInfo->u2BeaconInterval;
2004 prBssInfo->ucDTIMPeriod = DOT11_DTIM_PERIOD_DEFAULT;
2005 prBssInfo->u2ATIMWindow = 0;
2006 prBssInfo->ucBeaconTimeoutCount = 0;
2007 if (prBowFsmInfo->fgSupportQoS)
2009 prAdapter->rWifiVar.fgSupportQoS = TRUE;
2010 prBssInfo->fgIsQBSS = TRUE;
2014 //3 <2> Update BSS_INFO_T common part
2016 bssInitForAP(prAdapter, prBssInfo, TRUE);
2017 nicQmUpdateWmmParms(prAdapter, NETWORK_TYPE_BOW_INDEX);
2018 #endif /* CFG_SUPPORT_AAA */
2019 prBssInfo->fgIsNetActive = TRUE;
2020 prBssInfo->fgIsBeaconActivated = TRUE;
2024 //4 <2> Initiate BSS_INFO_T - common part
2025 BOW_BSS_INFO_INIT(prAdapter, NETWORK_TYPE_BOW_INDEX);
2027 DBGLOG(BOW, EVENT, ("prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", prBowFsmInfo->aucPeerAddress[0],
2028 prBowFsmInfo->aucPeerAddress[1],
2029 prBowFsmInfo->aucPeerAddress[2],
2030 prBowFsmInfo->aucPeerAddress[3],
2031 prBowFsmInfo->aucPeerAddress[4],
2032 prBowFsmInfo->aucPeerAddress[5]));
2035 //4 <3.1> use command packets to inform firmware
2036 rlmBssInitForAPandIbss(prAdapter, prBssInfo);
2037 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
2039 //4 <3.2> Update AdHoc PM parameter
2040 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_BOW_INDEX);
2042 //4 <3.1> Reset HW TSF Update Mode and Beacon Mode
2044 //4 <3.2> Setup BSSID
2045 // TODO: rxmSetRxFilterBSSID0
2046 // rxmSetRxFilterBSSID0(prBssInfo->ucHwBssidId, prBssInfo->aucBSSID);
2048 //4 <3.3> Setup RX Filter to accept Probe Request
2049 // TODO: f get/set RX filter.
2054 if (halMacRxGetRxFilters(&u4RxFilter)== HAL_STATUS_SUCCESS) {
2056 u4RxFilter &= ~BIT(RXFILTER_DROP_PROBE_REQ);
2058 halMacRxSetRxFilters(u4RxFilter);
2064 /*Update BoW Table*/
2065 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_STARTING);
2068 kalPrint("BoW Starting,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
2069 DBGLOG(BOW, EVENT, ("bowStarting, g_u4LinkCount, %x.\n", g_u4LinkCount));
2073 if (g_u4Beaconing < 1)
2075 GLUE_INC_REF_CNT(g_u4Beaconing);
2076 bssSendBeaconProbeResponse(prAdapter, NETWORK_TYPE_BOW_INDEX, NULL, 0);
2077 cnmTimerStartTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer, prBowFsmInfo->u2BeaconInterval);
2081 /*Responder: Start to scan Initiator*/
2082 if (prBowFsmInfo->ucRole == BOW_RESPONDER)
2085 DBGLOG(BOW, EVENT, ("bowStarting responder, start scan result searching.\n"));
2087 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
2088 bowReleaseCh(prAdapter);
2089 bowResponderScan(prAdapter);
2091 /*Initiator: Request channel, wait for responder*/
2093 //bowRequestCh(prAdapter);
2102 IN PUINT_8 puOwnMacAddr
2106 UINT_8 aucSSID[]=BOW_WILDCARD_SSID;
2108 kalMemCopy(pucSsid, aucSSID, BOW_WILDCARD_SSID_LEN);
2110 for (i = 0; i < 6; i++)
2112 pucSsid[(3 * i) + 3] = 0x2D;
2113 if ((*(puOwnMacAddr + i) >> 4) < 0xA)
2115 *(pucSsid + (3 * i) + 4) = (*(puOwnMacAddr + i) >> 4) + 0x30;
2119 *(pucSsid + (3 * i) + 4) = (*(puOwnMacAddr + i) >> 4) + 0x57;
2122 if ((*(puOwnMacAddr + i) & 0x0F) < 0xA)
2124 pucSsid[(3 * i) + 5] = (*(puOwnMacAddr + i) & 0x0F) + 0x30;
2128 pucSsid[(3 * i) + 5] = (*(puOwnMacAddr + i) & 0x0F) + 0x57;
2136 /*----------------------------------------------------------------------------*/
2138 * @brief This function will validate the Rx Probe Request Frame and then return
2139 * result to BSS to indicate if need to send the corresponding Probe Response
2140 * Frame if the specified conditions were matched.
2142 * @param[in] prAdapter Pointer to the Adapter structure.
2143 * @param[in] prSwRfb Pointer to SW RFB data structure.
2144 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
2146 * @retval TRUE Reply the Probe Response
2147 * @retval FALSE Don't reply the Probe Response
2149 /*----------------------------------------------------------------------------*/
2151 bowValidateProbeReq(
2152 IN P_ADAPTER_T prAdapter,
2153 IN P_SW_RFB_T prSwRfb,
2154 OUT PUINT_32 pu4ControlFlags
2157 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
2158 P_BOW_FSM_INFO_T prBowFsmInfo;
2159 P_BSS_INFO_T prBssInfo;
2160 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
2163 UINT_16 u2Offset = 0;
2164 BOOLEAN fgReplyProbeResp = FALSE;
2167 ASSERT(pu4ControlFlags);
2169 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2170 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2174 DBGLOG(BOW, EVENT, ("bowValidateProbeReq.\n"));
2177 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
2178 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
2180 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
2181 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
2183 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
2184 if (ELEM_ID_SSID == IE_ID(pucIE)) {
2186 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
2187 prIeSsid = (P_IE_SSID_T)pucIE;
2191 } /* end of IE_FOR_EACH */
2193 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
2194 if (ELEM_ID_SSID == IE_ID(pucIE)) {
2196 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
2197 prIeSsid = (P_IE_SSID_T)pucIE;
2201 } /* end of IE_FOR_EACH */
2203 //4 <2> Check network conditions
2204 /*If BoW AP is beaconing*/
2205 if (prBssInfo->eCurrentOPMode == OP_MODE_BOW &&
2206 g_u4Beaconing > 0) {
2208 /*Check the probe requset sender is our peer*/
2209 if(bowCheckBowTableIfVaild(prAdapter, prMgtHdr->aucSrcAddr)) {
2210 fgReplyProbeResp = TRUE;
2212 /*Check the probe request target SSID is our SSID*/
2213 else if ((prIeSsid) &&
2214 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
2215 prIeSsid->aucSSID, prIeSsid->ucLength)) {
2216 fgReplyProbeResp = TRUE;
2219 fgReplyProbeResp = FALSE;
2223 return fgReplyProbeResp;
2228 /*----------------------------------------------------------------------------*/
2230 * @brief This function will indicate an Event of "Media Disconnect" to HOST
2232 * @param[in] u4Param Unused timer parameter
2236 /*----------------------------------------------------------------------------*/
2239 IN P_ADAPTER_T prAdapter,
2243 P_BOW_FSM_INFO_T prBowFsmInfo;
2245 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2247 if ((g_u4Beaconing != 0) && (g_u4LinkCount > 0) && (g_u4LinkCount < CFG_BOW_PHYSICAL_LINK_NUM))
2250 bssSendBeaconProbeResponse(prAdapter, NETWORK_TYPE_BOW_INDEX, NULL, 0);
2251 cnmTimerStartTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer, prBowFsmInfo->u2BeaconInterval);
2255 kalPrint("BoW Send Beacon,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
2261 /*----------------------------------------------------------------------------*/
2263 * @brief This function will indicate an Event of "Media Disconnect" to HOST
2265 * @param[in] u4Param Unused timer parameter
2269 /*----------------------------------------------------------------------------*/
2272 IN P_ADAPTER_T prAdapter
2275 P_BOW_FSM_INFO_T prBowFsmInfo;
2276 P_MSG_SCN_SCAN_REQ prScanReqMsg;
2277 P_BSS_INFO_T prBssInfo;
2281 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2282 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2285 DBGLOG(BOW, EVENT, ("bowResponderScan.\n"));
2286 kalPrint("BOW SCAN [REQ:%d]\n", prBowFsmInfo->ucSeqNumOfScanReq+1);
2289 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_REQ));
2293 ASSERT(0); // Can't trigger SCAN FSM
2297 /*Fill scan message*/
2298 prScanReqMsg->rMsgHdr.eMsgId = MID_BOW_SCN_SCAN_REQ;
2299 prScanReqMsg->ucSeqNum = ++prBowFsmInfo->ucSeqNumOfScanReq;
2300 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_BOW_INDEX;
2301 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2302 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2303 prScanReqMsg->ucSSIDLength = BOW_SSID_LEN;
2304 bowAssignSsid(prScanReqMsg->aucSSID, prBowFsmInfo->aucPeerAddress);
2305 prScanReqMsg->ucChannelListNum = 1;
2307 if (prBowFsmInfo->eBand == BAND_2G4)
2309 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2310 prScanReqMsg->arChnlInfoList[0].eBand = BAND_2G4;
2314 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2315 prScanReqMsg->arChnlInfoList[0].eBand = BAND_5G;
2318 prScanReqMsg->arChnlInfoList[0].ucChannelNum = prBowFsmInfo->ucPrimaryChannel;
2319 prScanReqMsg->u2IELen = 0;
2321 /*Send scan message*/
2322 mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanReqMsg, MSG_SEND_METHOD_BUF);
2324 /*Change state to SCANNING*/
2325 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_SCANNING);
2327 //prBowFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2333 /*----------------------------------------------------------------------------*/
2341 /*----------------------------------------------------------------------------*/
2343 bowResponderScanDone(
2344 IN P_ADAPTER_T prAdapter,
2345 IN P_MSG_HDR_T prMsgHdr
2348 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2349 P_BOW_FSM_INFO_T prBowFsmInfo;
2350 P_BSS_DESC_T prBssDesc;
2351 UINT_8 ucSeqNumOfCompMsg;
2352 P_CONNECTION_SETTINGS_T prConnSettings;
2353 ENUM_BOW_DEVICE_STATE eFsmState;
2354 ENUM_SCAN_STATUS eScanStatus;
2359 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2360 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2361 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
2362 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
2364 ASSERT(prScanDoneMsg->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX);
2366 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2367 eScanStatus = prScanDoneMsg->eScanStatus;
2369 cnmMemFree(prAdapter, prMsgHdr);
2372 DBGLOG(BOW, EVENT, ("bowResponderScanDone.\n"));
2373 kalPrint("BOW SCAN [DONE:%d]\n", ucSeqNumOfCompMsg);
2376 if( eScanStatus == SCAN_STATUS_CANCELLED) {
2378 kalPrint("BOW SCAN [CANCELLED:%d]\n", ucSeqNumOfCompMsg);
2380 if(eFsmState == BOW_DEVICE_STATE_DISCONNECTING) {
2381 wlanoidSendSetQueryBowCmd(prAdapter,
2382 CMD_ID_CMD_BT_OVER_WIFI,
2385 wlanbowCmdEventLinkDisconnected,
2386 wlanbowCmdTimeoutHandler,
2394 else if(eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
2395 //bowDisconnectLink(prAdapter, NULL, TX_RESULT_SUCCESS);
2398 else if (ucSeqNumOfCompMsg != prBowFsmInfo->ucSeqNumOfScanReq)
2400 DBGLOG(BOW, EVENT, ("Sequence no. of BOW Responder scan done is not matched.\n"));
2405 prConnSettings->fgIsScanReqIssued = FALSE;
2406 prBssDesc = scanSearchBssDescByBssid(prAdapter, prBowFsmInfo->aucPeerAddress);
2408 DBGLOG(BOW, EVENT, ("End scan result searching.\n"));
2411 /*Initiator is FOUND*/
2412 if (prBssDesc != NULL)// (prBssDesc->aucBSSID != NULL))
2415 DBGLOG(BOW, EVENT, ("Search Bow Peer address - %x:%x:%x:%x:%x:%x.\n", prBssDesc->aucBSSID[0],
2416 prBssDesc->aucBSSID[1],
2417 prBssDesc->aucBSSID[2],
2418 prBssDesc->aucBSSID[3],
2419 prBssDesc->aucBSSID[4],
2420 prBssDesc->aucBSSID[5]));
2421 DBGLOG(BOW, EVENT, ("Starting to join initiator.\n"));
2423 /*Set target BssDesc*/
2424 prBowFsmInfo->prTargetBssDesc = prBssDesc;
2425 /*Request channel to do JOIN*/
2426 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_ACQUIRING_CHANNEL);
2427 bowRequestCh(prAdapter);
2429 /*Initiator is NOT FOUND*/
2432 /*Scan again, until PAL timeout*/
2433 bowResponderScan(prAdapter);
2435 wlanoidSendSetQueryBowCmd(prAdapter,
2436 CMD_ID_CMD_BT_OVER_WIFI,
2439 wlanbowCmdEventLinkDisconnected,
2440 wlanbowCmdTimeoutHandler,
2453 /*----------------------------------------------------------------------------*/
2455 * @brief Function for cancelling scan request. There is another option to extend channel privilige
2456 * for another purpose.
2458 * @param fgIsChannelExtention - Keep the channel previlege, but can cancel scan timer.
2462 /*----------------------------------------------------------------------------*/
2464 bowResponderCancelScan (
2465 IN P_ADAPTER_T prAdapter,
2466 IN BOOLEAN fgIsChannelExtention
2470 P_MSG_SCN_SCAN_CANCEL prScanCancel = (P_MSG_SCN_SCAN_CANCEL)NULL;
2471 P_BOW_FSM_INFO_T prBowFsmInfo = (P_BOW_FSM_INFO_T)NULL;
2473 DEBUGFUNC("bowResponderCancelScan()");
2478 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2482 kalPrint("BOW SCAN [CANCEL:%d]\n", prBowFsmInfo->ucSeqNumOfScanReq);
2484 /* There is a channel privilege on hand. */
2486 DBGLOG(P2P, TRACE, ("BOW Cancel Scan\n"));
2488 prScanCancel = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
2489 if (!prScanCancel) {
2490 /* Buffer not enough, can not cancel scan request. */
2491 DBGLOG(P2P, TRACE, ("Buffer not enough, can not cancel scan.\n"));
2496 prScanCancel->rMsgHdr.eMsgId = MID_BOW_SCN_SCAN_CANCEL;
2497 prScanCancel->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
2498 prScanCancel->ucSeqNum = prBowFsmInfo->ucSeqNumOfScanReq;
2499 #if CFG_ENABLE_WIFI_DIRECT
2500 prScanCancel->fgIsChannelExt = fgIsChannelExtention;
2502 mboxSendMsg(prAdapter,
2504 (P_MSG_HDR_T)prScanCancel,
2505 MSG_SEND_METHOD_BUF);
2511 } /* bowResponderCancelScan */
2514 /*----------------------------------------------------------------------------*/
2516 * @brief Initialization of JOIN STATE
2518 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
2522 /*----------------------------------------------------------------------------*/
2525 IN P_ADAPTER_T prAdapter,
2526 IN P_BSS_DESC_T prBssDesc
2529 P_BOW_FSM_INFO_T prBowFsmInfo;
2530 P_BSS_INFO_T prBssInfo;
2531 P_CONNECTION_SETTINGS_T prConnSettings;
2532 P_STA_RECORD_T prStaRec;
2533 P_MSG_JOIN_REQ_T prJoinReqMsg;
2538 DBGLOG(BOW, EVENT, ("Starting bowResponderJoin.\n"));
2540 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2541 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2542 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2544 //4 <1> We are going to connect to this BSS.
2545 prBssDesc->fgIsConnecting = TRUE;
2546 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_CONNECTING);
2548 //4 <2> Setup corresponding STA_RECORD_T
2549 /*Support First JOIN and retry*/
2550 prStaRec = bssCreateStaRecFromBssDesc(
2553 NETWORK_TYPE_BOW_INDEX,
2556 prBowFsmInfo->prTargetStaRec = prStaRec;
2558 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
2559 prStaRec->fgIsReAssoc = FALSE;
2560 prBowFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
2561 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
2564 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
2565 if (prBowFsmInfo->ucAvailableAuthTypes &
2566 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
2568 DBGLOG(BOW, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
2569 prBowFsmInfo->ucAvailableAuthTypes &=
2570 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
2572 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
2578 //4 <4.1> sync. to firmware domain
2579 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
2581 //4 <5> Overwrite Connection Setting for eConnectionPolicy
2582 if (prBssDesc->ucSSIDLen) {
2583 COPY_SSID(prConnSettings->aucSSID,
2584 prConnSettings->ucSSIDLen,
2586 prBssDesc->ucSSIDLen);
2588 DBGLOG(BOW, EVENT, ("bowResponderJoin, SSID %s.\n", prBssDesc->aucSSID));
2589 DBGLOG(BOW, EVENT, ("bowResponderJoin, SSID %s.\n", prConnSettings->aucSSID));
2593 //4 <6> Send a Msg to trigger SAA to start JOIN process.
2594 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
2595 if (!prJoinReqMsg) {
2597 ASSERT(0); // Can't trigger SAA FSM
2601 prJoinReqMsg->rMsgHdr.eMsgId = MID_BOW_SAA_FSM_START;
2602 prJoinReqMsg->ucSeqNum = ++prBowFsmInfo->ucSeqNumOfReqMsg;
2603 prJoinReqMsg->prStaRec = prStaRec;
2605 prBssInfo->prStaRecOfAP = prStaRec;
2608 DBGLOG(BOW, EVENT, ("prStaRec->eStaType, %x.\n", prStaRec->eStaType));
2609 printk("BoW trigger SAA ["MACSTR"]\n", MAC2STR(prStaRec->aucMacAddr));
2612 mboxSendMsg(prAdapter,
2614 (P_MSG_HDR_T) prJoinReqMsg,
2615 MSG_SEND_METHOD_BUF);
2621 /*----------------------------------------------------------------------------*/
2623 * @brief This function will handle the Join Complete Event from SAA FSM for BOW FSM
2625 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2629 /*----------------------------------------------------------------------------*/
2631 bowFsmRunEventJoinComplete(
2632 IN P_ADAPTER_T prAdapter,
2633 IN P_MSG_HDR_T prMsgHdr
2636 P_MSG_JOIN_COMP_T prJoinCompMsg;
2637 P_BOW_FSM_INFO_T prBowFsmInfo;
2638 P_STA_RECORD_T prStaRec;
2639 P_SW_RFB_T prAssocRspSwRfb;
2640 P_BSS_INFO_T prBssInfo;
2641 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) NULL;
2644 P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2649 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2650 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2651 prStaRec = prJoinCompMsg->prStaRec;
2654 DBGLOG(BOW, EVENT, ("Start bowfsmRunEventJoinComplete.\n"));
2655 DBGLOG(BOW, EVENT, ("bowfsmRunEventJoinComplete ptr check\n"));
2656 DBGLOG(BOW, EVENT, ("prMsgHdr %x\n", prMsgHdr));
2657 DBGLOG(BOW, EVENT, ("prAdapter %x\n", prAdapter));
2658 DBGLOG(BOW, EVENT, ("prBowFsmInfo %x\n", prBowFsmInfo));
2659 DBGLOG(BOW, EVENT, ("prStaRec %x\n", prStaRec));
2663 ASSERT(prBowFsmInfo);
2666 if (prJoinCompMsg->ucSeqNum == prBowFsmInfo->ucSeqNumOfReqMsg) {
2667 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prStaRec->aucMacAddr);
2669 //4 <1> JOIN was successful
2670 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2671 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2672 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
2673 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2675 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
2676 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
2677 pucIE = prAssocRspFrame->aucInfoElem;
2679 prStaRec->eStaType = STA_TYPE_BOW_AP;
2680 prStaRec->u2DesiredNonHTRateSet &= prBowBssInfo->u2OperationalRateSet;
2681 prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prBowBssInfo->ucPhyTypeSet;
2682 #if CFG_BOW_RATE_LIMITATION
2683 //4 <1.2>Update Rate Set
2684 /*Limit Rate Set to 24M, 48M, 54M */
2685 prStaRec->u2DesiredNonHTRateSet &= (RATE_SET_BIT_24M |
2688 /*If peer cannot support the above rate set, fix on the avaliable highest rate*/
2689 if(prStaRec->u2DesiredNonHTRateSet == 0) {
2690 UINT_8 ucHighestRateIndex;
2691 if (rateGetHighestRateIndexFromRateSet(prBowBssInfo->u2OperationalRateSet, &ucHighestRateIndex)) {
2692 prStaRec->u2DesiredNonHTRateSet = BIT(ucHighestRateIndex);
2697 //4 <1.1> Change FW's Media State immediately.
2698 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2700 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
2702 //4 <1.2> Update HT information and set channel
2703 /* Record HT related parameters in rStaRec and rBssInfo
2704 * Note: it shall be called before nicUpdateBss()
2706 #if CFG_BOW_SUPPORT_11N
2707 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
2710 //4 <1.3> Update BSS_INFO_T
2711 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
2713 DBGLOG(BOW, EVENT, ("Finish bowUpdateBssInfoForJOIN.\n"));
2715 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2716 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2719 DBGLOG(BOW, EVENT, ("bowFsmRunEventJoinComplete, qmActivateStaRec.\n"));
2722 //4 <1.7> Set the Next State of BOW FSM
2723 wlanoidSendSetQueryBowCmd(prAdapter,
2724 CMD_ID_CMD_BT_OVER_WIFI,
2727 wlanbowCmdEventLinkConnected,
2728 wlanbowCmdTimeoutHandler,
2734 //4 <2> JOIN was not successful
2738 bowResponderJoin(prAdapter, prBowFsmInfo->prTargetBssDesc);
2740 wlanoidSendSetQueryBowCmd(prAdapter,
2741 CMD_ID_CMD_BT_OVER_WIFI,
2744 wlanbowCmdEventLinkDisconnected,
2745 wlanbowCmdTimeoutHandler,
2752 DBGLOG(BOW, EVENT, ("Start bowfsmRunEventJoinComplete -- Join failed.\n"));
2753 printk("BoW trigger SAA REJOIN\n");
2758 cnmMemFree(prAdapter, prMsgHdr);
2763 /*----------------------------------------------------------------------------*/
2765 * @brief This function will indicate the Media State to HOST
2767 * @param[in] eConnectionState Current Media State
2768 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
2772 /*----------------------------------------------------------------------------*/
2774 bowIndicationOfMediaStateToHost (
2775 IN P_ADAPTER_T prAdapter,
2776 IN ENUM_PARAM_MEDIA_STATE_T eConnectionState,
2777 IN BOOLEAN fgDelayIndication
2780 EVENT_CONNECTION_STATUS rEventConnStatus;
2781 P_CONNECTION_SETTINGS_T prConnSettings;
2782 P_BSS_INFO_T prBssInfo;
2783 P_BOW_FSM_INFO_T prBowFsmInfo;
2786 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2787 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2788 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2790 // NOTE(Kevin): Move following line to bowChangeMediaState() macro per CM's request.
2791 //prBowBssInfo->eConnectionState = eConnectionState;
2793 /* For indicating the Disconnect Event only if current media state is
2794 * disconnected and we didn't do indication yet.
2796 if (prBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
2797 if (prBssInfo->eConnectionStateIndicated == eConnectionState) {
2802 if (!fgDelayIndication) {
2803 //4 <0> Cancel Delay Timer
2804 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rIndicationOfDisconnectTimer);
2806 //4 <1> Fill EVENT_CONNECTION_STATUS
2807 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
2809 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2810 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
2812 if (prBssInfo->eCurrentOPMode == OP_MODE_BOW) {
2813 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
2814 rEventConnStatus.u2AID = prBssInfo->u2AssocId;
2815 rEventConnStatus.u2ATIMWindow = 0;
2817 else if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
2818 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
2819 rEventConnStatus.u2AID = 0;
2820 rEventConnStatus.u2ATIMWindow = prBssInfo->u2ATIMWindow;
2826 COPY_SSID(rEventConnStatus.aucSsid,
2827 rEventConnStatus.ucSsidLen,
2828 prConnSettings->aucSSID,
2829 prConnSettings->ucSSIDLen);
2831 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prBssInfo->aucBSSID);
2833 rEventConnStatus.u2BeaconPeriod = prBssInfo->u2BeaconInterval;
2834 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prBssInfo->ucPrimaryChannel);
2836 switch (prBssInfo->ucNonHTBasicPhyType) {
2837 case PHY_TYPE_HR_DSSS_INDEX:
2838 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
2841 case PHY_TYPE_ERP_INDEX:
2842 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
2845 case PHY_TYPE_OFDM_INDEX:
2846 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
2851 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
2856 #if CFG_PRIVACY_MIGRATION
2857 /* Clear the pmkid cache while media disconnect */
2858 secClearPmkid(prAdapter);
2861 rEventConnStatus.ucReasonOfDisconnect = prBssInfo->ucReasonOfDisconnect;
2866 nicMediaStateChange(prAdapter, NETWORK_TYPE_BOW_INDEX, &rEventConnStatus);
2867 prBssInfo->eConnectionStateIndicated = eConnectionState;
2870 /* NOTE: Only delay the Indication of Disconnect Event */
2871 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
2873 DBGLOG(BOW, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
2874 prConnSettings->ucDelayTimeOfDisconnectEvent));
2876 cnmTimerStartTimer(prAdapter,
2877 &prBowFsmInfo->rIndicationOfDisconnectTimer,
2878 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
2885 /*----------------------------------------------------------------------------*/
2887 * @brief This function will indiate the Event of Tx Fail of AAA Module.
2889 * @param[in] prAdapter Pointer to the Adapter structure.
2890 * @param[in] prStaRec Pointer to the STA_RECORD_T
2894 /*----------------------------------------------------------------------------*/
2896 bowRunEventAAATxFail (
2897 IN P_ADAPTER_T prAdapter,
2898 IN P_STA_RECORD_T prStaRec
2901 P_BSS_INFO_T prBssInfo;
2907 DBGLOG(BOW, EVENT, ("bowRunEventAAATxFail , bssRemoveStaRecFromClientList.\n"));
2908 printk("BoW AAA TxFail, target state %d\n", prStaRec->ucStaState+1);
2911 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
2912 bssRemoveStaRecFromClientList(prAdapter, prBssInfo, prStaRec);
2918 /*----------------------------------------------------------------------------*/
2920 * @brief This function will indiate the Event of Successful Completion of AAA Module.
2922 * @param[in] prAdapter Pointer to the Adapter structure.
2923 * @param[in] prStaRec Pointer to the STA_RECORD_T
2927 /*----------------------------------------------------------------------------*/
2929 bowRunEventAAAComplete (
2930 IN P_ADAPTER_T prAdapter,
2931 IN P_STA_RECORD_T prStaRec
2934 P_BOW_FSM_INFO_T prBowFsmInfo;
2938 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2941 DBGLOG(BOW, EVENT, ("bowRunEventAAAComplete, cnmStaRecChangeState, STA_STATE_3.\n"));
2942 printk("BoW AAA complete ["MACSTR"]\n", MAC2STR(prStaRec->aucMacAddr));
2945 /*Update BssInfo to connected*/
2946 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2947 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
2949 /*Update StaRec to State3*/
2950 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2953 wlanoidSendSetQueryBowCmd(prAdapter,
2954 CMD_ID_CMD_BT_OVER_WIFI,
2957 wlanbowCmdEventLinkConnected,
2958 wlanbowCmdTimeoutHandler,
2964 return WLAN_STATUS_SUCCESS;
2967 /*----------------------------------------------------------------------------*/
2969 * @brief This function will handle RxDeauth
2971 * @param[in] prAdapter Pointer to the Adapter structure.
2972 * @param[in] prStaRec Pointer to the STA_RECORD_T
2976 /*----------------------------------------------------------------------------*/
2979 bowRunEventRxDeAuth (
2980 IN P_ADAPTER_T prAdapter,
2981 IN P_STA_RECORD_T prStaRec,
2982 IN P_SW_RFB_T prSwRfb
2985 P_BSS_INFO_T prBowBssInfo;
2986 P_BOW_FSM_INFO_T prBowFsmInfo;
2987 ENUM_BOW_DEVICE_STATE eFsmState;
2991 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2992 prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2994 if(!IS_STA_IN_BOW(prStaRec)) {
2995 return WLAN_STATUS_NOT_ACCEPTED;
2998 eFsmState = bowGetBowTableState(prAdapter, prStaRec->aucMacAddr);
3000 if(eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
3002 return WLAN_STATUS_NOT_ACCEPTED;
3005 if (prStaRec->ucStaState > STA_STATE_1) {
3007 if (STA_STATE_3 == prStaRec->ucStaState) {
3008 //P_MSG_AIS_ABORT_T prAisAbortMsg;
3010 /* NOTE(Kevin): Change state immediately to avoid starvation of
3011 * MSG buffer because of too many deauth frames before changing
3014 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
3017 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prStaRec->aucMacAddr);
3019 wlanoidSendSetQueryBowCmd(prAdapter,
3020 CMD_ID_CMD_BT_OVER_WIFI,
3023 wlanbowCmdEventLinkDisconnected,
3024 wlanbowCmdTimeoutHandler,
3030 return WLAN_STATUS_SUCCESS;
3033 return WLAN_STATUS_NOT_ACCEPTED;
3037 /*----------------------------------------------------------------------------*/
3039 * \brief This function handle BoW Link disconnect.
3041 * \param[in] pMsduInfo Pointer to the Msdu Info
3042 * \param[in] rStatus The Tx done status
3046 * \note after receive deauth frame, callback function call this
3048 /*----------------------------------------------------------------------------*/
3051 IN P_ADAPTER_T prAdapter,
3052 IN P_MSDU_INFO_T prMsduInfo,
3053 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
3056 P_BOW_FSM_INFO_T prBowFsmInfo;
3057 P_STA_RECORD_T prStaRec;
3061 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3063 /*Free target StaRec*/
3065 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
3068 prStaRec = prBowFsmInfo->prTargetStaRec;
3072 //cnmStaRecFree(prAdapter, prStaRec, TRUE);
3073 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
3075 kalPrint("bowDisconnectLink\n");
3076 /*No one connected*/
3077 if (g_u4LinkCount == 0 && g_u4Beaconing != 0)
3079 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer);
3080 bowStopping(prAdapter);
3081 kalPrint("bowStopping\n");
3082 /*Restore TxPower from Short range mode*/
3083 #if CFG_SUPPORT_NVRAM && 0
3084 wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
3086 /*Uninit BoW Interface*/
3087 #if CFG_BOW_SEPARATE_DATA_PATH
3088 kalUninitBowDevice(prAdapter->prGlueInfo);
3094 /*----------------------------------------------------------------------------*/
3096 * @brief This function will validate the Rx Assoc Req Frame and then return
3097 * the status code to AAA to indicate if need to perform following actions
3098 * when the specified conditions were matched.
3100 * @param[in] prAdapter Pointer to the Adapter structure.
3101 * @param[in] prSwRfb Pointer to SW RFB data structure.
3102 * @param[out] pu2StatusCode The Status Code of Validation Result
3104 * @retval TRUE Reply the Assoc Resp
3105 * @retval FALSE Don't reply the Assoc Resp
3107 /*----------------------------------------------------------------------------*/
3109 bowValidateAssocReq (
3110 IN P_ADAPTER_T prAdapter,
3111 IN P_SW_RFB_T prSwRfb,
3112 OUT PUINT_16 pu2StatusCode
3115 BOOLEAN fgReplyAssocResp = FALSE;
3116 P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3117 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
3118 P_BOW_FSM_INFO_T prBowFsmInfo;
3119 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)NULL;
3120 OS_SYSTIME rCurrentTime;
3121 static OS_SYSTIME rLastRejectAssocTime = 0;
3125 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3126 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
3127 *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
3130 DBGLOG(BOW, EVENT, ("bowValidateAssocReq, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
3131 prBowFsmInfo->aucPeerAddress[0],
3132 prBowFsmInfo->aucPeerAddress[1],
3133 prBowFsmInfo->aucPeerAddress[2],
3134 prBowFsmInfo->aucPeerAddress[3],
3135 prBowFsmInfo->aucPeerAddress[4],
3136 prBowFsmInfo->aucPeerAddress[5]));
3137 DBGLOG(BOW, EVENT, ("bowValidateAssocReq, prAssocReqFrame->aucSrcAddr, %x:%x:%x:%x:%x:%x.\n",
3138 prAssocReqFrame->aucSrcAddr[0],
3139 prAssocReqFrame->aucSrcAddr[1],
3140 prAssocReqFrame->aucSrcAddr[2],
3141 prAssocReqFrame->aucSrcAddr[3],
3142 prAssocReqFrame->aucSrcAddr[4],
3143 prAssocReqFrame->aucSrcAddr[5]));
3147 while(EQUAL_MAC_ADDR(prAssocReqFrame->aucSrcAddr, prBowFsmInfo->aucPeerAddress)) {
3149 DBGLOG(BOW, EVENT, ("bowValidateAssocReq, return wlanbowCmdEventLinkConnected.\n"));
3152 prStaRec = cnmGetStaRecByAddress(prAdapter,
3153 (UINT_8) NETWORK_TYPE_BOW_INDEX,
3154 prAssocReqFrame->aucSrcAddr);
3155 prStaRec->eStaType = STA_TYPE_BOW_CLIENT;
3156 prStaRec->u2DesiredNonHTRateSet &= prBowBssInfo->u2OperationalRateSet;
3157 prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prBowBssInfo->ucPhyTypeSet;
3159 #if CFG_BOW_RATE_LIMITATION
3160 /*Limit Rate Set to 24M, 48M, 54M */
3161 prStaRec->u2DesiredNonHTRateSet &= (RATE_SET_BIT_24M |
3164 /*If peer cannot support the above rate set, fix on the avaliable highest rate*/
3165 if(prStaRec->u2DesiredNonHTRateSet == 0) {
3166 UINT_8 ucHighestRateIndex;
3167 if (rateGetHighestRateIndexFromRateSet(prBowBssInfo->u2OperationalRateSet, &ucHighestRateIndex)) {
3168 prStaRec->u2DesiredNonHTRateSet = BIT(ucHighestRateIndex);
3170 /*If no avaliable rate is found, DECLINE the association*/
3171 *pu2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
3176 prStaRec->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3178 /*Undpate BssInfo to FW*/
3179 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
3180 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
3182 /*reply successful*/
3183 *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
3184 fgReplyAssocResp = TRUE;
3189 if(*pu2StatusCode != STATUS_CODE_SUCCESSFUL) {
3190 /*Reply Assoc with reject every 5s*/
3191 rCurrentTime = kalGetTimeTick();
3192 if(CHECK_FOR_TIMEOUT(rCurrentTime, rLastRejectAssocTime, MSEC_TO_SYSTIME(5000)) ||
3193 rLastRejectAssocTime == 0
3195 fgReplyAssocResp = TRUE;
3196 rLastRejectAssocTime = rCurrentTime;
3200 return fgReplyAssocResp;
3204 /*----------------------------------------------------------------------------*/
3206 * @brief This function will validate the Rx Auth Frame and then return
3207 * the status code to AAA to indicate if need to perform following actions
3208 * when the specified conditions were matched.
3210 * @param[in] prAdapter Pointer to the Adapter structure.
3211 * @param[in] prSwRfb Pointer to SW RFB data structure.
3212 * @param[in] pprStaRec Pointer to pointer of STA_RECORD_T structure.
3213 * @param[out] pu2StatusCode The Status Code of Validation Result
3215 * @retval TRUE Reply the Auth
3216 * @retval FALSE Don't reply the Auth
3218 /*----------------------------------------------------------------------------*/
3221 IN P_ADAPTER_T prAdapter,
3222 IN P_SW_RFB_T prSwRfb,
3223 IN PP_STA_RECORD_T pprStaRec,
3224 OUT PUINT_16 pu2StatusCode
3227 BOOLEAN fgReplyAuth = FALSE;
3228 P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3229 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
3230 P_BOW_FSM_INFO_T prBowFsmInfo;
3231 P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T)NULL;
3232 OS_SYSTIME rCurrentTime;
3233 static OS_SYSTIME rLastRejectAuthTime = 0;
3235 /* TODO(Kevin): Call BoW functions to check ..
3236 1. Check we are BoW now.
3237 2. Check we can accept connection from thsi peer
3238 3. Check Black List here.
3241 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3242 prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader;
3245 DBGLOG(BOW, EVENT, ("bowValidateAuth, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
3246 prBowFsmInfo->aucPeerAddress[0],
3247 prBowFsmInfo->aucPeerAddress[1],
3248 prBowFsmInfo->aucPeerAddress[2],
3249 prBowFsmInfo->aucPeerAddress[3],
3250 prBowFsmInfo->aucPeerAddress[4],
3251 prBowFsmInfo->aucPeerAddress[5]));
3252 DBGLOG(BOW, EVENT, ("bowValidateAuth, prAuthFrame->aucSrcAddr, %x:%x:%x:%x:%x:%x.\n",
3253 prAuthFrame->aucSrcAddr[0],
3254 prAuthFrame->aucSrcAddr[1],
3255 prAuthFrame->aucSrcAddr[2],
3256 prAuthFrame->aucSrcAddr[3],
3257 prAuthFrame->aucSrcAddr[4],
3258 prAuthFrame->aucSrcAddr[5]));
3261 prStaRec = cnmGetStaRecByAddress(prAdapter,
3262 (UINT_8) NETWORK_TYPE_BOW_INDEX,
3263 prAuthFrame->aucSrcAddr);
3266 DBGLOG(BOW, EVENT, ("bowValidateAuth, cnmStaRecAlloc.\n"));
3268 prStaRec = cnmStaRecAlloc(prAdapter,
3269 (UINT_8) NETWORK_TYPE_BOW_INDEX);
3271 /* TODO(Kevin): Error handling of allocation of STA_RECORD_T for
3272 * exhausted case and do removal of unused STA_RECORD_T.
3275 COPY_MAC_ADDR(prStaRec->aucMacAddr, prAuthFrame->aucSrcAddr);
3276 prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
3277 prBowBssInfo->prStaRecOfAP = prStaRec;
3279 /* NOTE(Kevin): Better to change state here, not at TX Done */
3280 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
3282 DBGLOG(BOW, EVENT, ("bowValidateAuth, cnmStaRecChangeState.\n"));
3287 prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
3289 DBGLOG(BOW, EVENT, ("bowValidateAuth, prStaRec->ucIndex, %x.\n", prStaRec->ucIndex));
3291 bssRemoveStaRecFromClientList(prAdapter, prBowBssInfo, prStaRec);
3294 if (EQUAL_MAC_ADDR(prAuthFrame->aucSrcAddr, prBowFsmInfo->aucPeerAddress)) {
3296 prStaRec->eStaType = STA_TYPE_BOW_CLIENT;
3297 prStaRec->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3299 DBGLOG(BOW, EVENT, ("bowValidateAuth, prStaRec->eStaType, %x.\n", prStaRec->eStaType));
3300 DBGLOG(BOW, EVENT, ("bowValidateAuth, prStaRec->ucNetTypeIndex, %x.\n", prStaRec->ucNetTypeIndex));
3302 /* Update Station Record - Status/Reason Code */
3303 prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
3304 prStaRec->ucJoinFailureCount = 0;
3305 *pprStaRec = prStaRec;
3306 *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
3310 cnmStaRecFree(prAdapter, prStaRec, FALSE);
3311 *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
3313 /*Reply auth with reject every 5s*/
3314 rCurrentTime = kalGetTimeTick();
3315 if(CHECK_FOR_TIMEOUT(rCurrentTime, rLastRejectAuthTime, MSEC_TO_SYSTIME(5000)) ||
3316 rLastRejectAuthTime == 0
3319 rLastRejectAuthTime = rCurrentTime;
3324 DBGLOG(BOW, EVENT, ("bowValidateAuth, fgReplyAuth, %x.\n", fgReplyAuth));
3330 /*----------------------------------------------------------------------------*/
3332 * \brief This function is invoked when CNM granted channel privilege
3334 * \param[in] prAdapter Pointer of ADAPTER_T
3338 /*----------------------------------------------------------------------------*/
3340 bowRunEventChGrant (
3341 IN P_ADAPTER_T prAdapter,
3342 IN P_MSG_HDR_T prMsgHdr
3345 P_BSS_INFO_T prBowBssInfo;
3346 P_BOW_FSM_INFO_T prBowFsmInfo;
3347 P_MSG_CH_GRANT_T prMsgChGrant;
3349 UINT_32 u4GrantInterval;
3350 ENUM_BOW_DEVICE_STATE eFsmState;
3355 prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3356 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3357 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
3358 ucTokenID = prMsgChGrant->ucTokenID;
3359 u4GrantInterval = prMsgChGrant->u4GrantInterval;
3361 /* 1. free message */
3362 cnmMemFree(prAdapter, prMsgHdr);
3363 prBowFsmInfo->fgIsChannelGranted = TRUE;
3366 DBGLOG(BOW, EVENT, ("Entering bowRunEventChGrant.\n"));
3369 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
3372 if((!prBowFsmInfo->fgIsChannelRequested) ||
3373 (prBowFsmInfo->ucSeqNumOfChReq != ucTokenID) ||
3374 (eFsmState == BOW_DEVICE_STATE_DISCONNECTED) ||
3375 (eFsmState == BOW_DEVICE_STATE_DISCONNECTING)){
3377 printk("BoW Channel [GIVE UP:%d]\n", ucTokenID);
3378 printk("[Requested:%d][ucSeqNumOfChReq:%d][eFsmState:%d]\n",
3379 prBowFsmInfo->fgIsChannelRequested, prBowFsmInfo->ucSeqNumOfChReq, eFsmState);
3381 bowReleaseCh(prAdapter);
3385 /* 2. channel privilege has been approved */
3386 prBowFsmInfo->u4ChGrantedInterval = u4GrantInterval;
3389 cnmTimerStartTimer(prAdapter,
3390 &prBowFsmInfo->rChGrantedTimer,
3391 prBowFsmInfo->u4ChGrantedInterval - BOW_JOIN_CH_GRANT_THRESHOLD);
3393 cnmTimerStartTimer(prAdapter,
3394 &prBowFsmInfo->rChGrantedTimer,
3395 BOW_JOIN_CH_REQUEST_INTERVAL - BOW_JOIN_CH_GRANT_THRESHOLD);
3398 /* 3.2 set local variable to indicate join timer is ticking */
3399 prBowFsmInfo->fgIsInfraChannelFinished = FALSE;
3402 printk("BoW Channel [GRANTED:%d].\n", ucTokenID);
3405 if(eFsmState == BOW_DEVICE_STATE_ACQUIRING_CHANNEL) {
3406 bowStarting(prAdapter);
3407 bowReleaseCh(prAdapter);
3408 if(prBowFsmInfo->ucRole == BOW_RESPONDER) {
3409 bowResponderJoin(prAdapter, prBowFsmInfo->prTargetBssDesc);
3414 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
3415 bowReleaseCh(prAdapter);
3419 } /* end of aisFsmRunEventChGrant() */
3422 /*----------------------------------------------------------------------------*/
3424 * \brief This function is to inform CNM for channel privilege requesting
3427 * \param[in] prAdapter Pointer of ADAPTER_T
3431 /*----------------------------------------------------------------------------*/
3434 IN P_ADAPTER_T prAdapter
3437 P_BOW_FSM_INFO_T prBowFsmInfo;
3438 P_MSG_CH_REQ_T prMsgChReq;
3442 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3444 if (prBowFsmInfo->fgIsChannelGranted == FALSE)
3448 printk("BoW channel [REQUEST:%d], %d, %d.\n", prBowFsmInfo->ucSeqNumOfChReq+1, prBowFsmInfo->ucPrimaryChannel, prBowFsmInfo->eBand);
3450 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
3453 ASSERT(0); // Can't indicate CNM for channel acquiring
3457 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
3458 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3459 prMsgChReq->ucTokenID = ++prBowFsmInfo->ucSeqNumOfChReq;
3460 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
3462 prMsgChReq->u4MaxInterval = BOW_JOIN_CH_REQUEST_INTERVAL;
3464 prMsgChReq->u4MaxInterval = 1;
3466 prMsgChReq->ucPrimaryChannel = prBowFsmInfo->ucPrimaryChannel; //prBowFsmInfo->prTargetBssDesc->ucChannelNum;
3467 prMsgChReq->eRfSco = CHNL_EXT_SCN; //prBowFsmInfo->prTargetBssDesc->eSco;
3468 prMsgChReq->eRfBand = prBowFsmInfo->eBand; //prBowFsmInfo->prTargetBssDesc->eBand;
3469 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prBowFsmInfo->aucPeerAddress);
3472 prBowFsmInfo->fgIsChannelRequested = TRUE;
3474 mboxSendMsg(prAdapter,
3476 (P_MSG_HDR_T) prMsgChReq,
3477 MSG_SEND_METHOD_BUF);
3482 /*----------------------------------------------------------------------------*/
3484 * \brief This function is to inform BOW that channel privilege is granted
3487 * \param[in] prAdapter Pointer of ADAPTER_T
3491 /*----------------------------------------------------------------------------*/
3494 IN P_ADAPTER_T prAdapter
3497 P_BOW_FSM_INFO_T prBowFsmInfo;
3498 P_MSG_CH_ABORT_T prMsgChAbort;
3502 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3504 if(prBowFsmInfo->fgIsChannelGranted != FALSE || prBowFsmInfo->fgIsChannelRequested != FALSE)
3507 printk("BoW channel [RELEASE:%d] %d, %d.\n", prBowFsmInfo->ucSeqNumOfChReq, prBowFsmInfo->ucPrimaryChannel, prBowFsmInfo->eBand);
3510 prBowFsmInfo->fgIsChannelRequested = FALSE;
3511 prBowFsmInfo->fgIsChannelGranted = FALSE;
3513 /* 1. return channel privilege to CNM immediately */
3514 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
3515 if (!prMsgChAbort) {
3516 ASSERT(0); // Can't release Channel to CNM
3520 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
3521 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3522 prMsgChAbort->ucTokenID = prBowFsmInfo->ucSeqNumOfChReq;
3524 mboxSendMsg(prAdapter,
3526 (P_MSG_HDR_T) prMsgChAbort,
3527 MSG_SEND_METHOD_BUF);
3531 } /* end of aisFsmReleaseCh() */
3534 /*----------------------------------------------------------------------------*/
3536 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3538 * @param[in] u4Param Unused timer parameter
3542 /*----------------------------------------------------------------------------*/
3544 bowChGrantedTimeout(
3545 IN P_ADAPTER_T prAdapter,
3549 P_BOW_FSM_INFO_T prBowFsmInfo;
3550 ENUM_BOW_DEVICE_STATE eFsmState;
3554 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3557 printk("BoW Channel [TIMEOUT]\n");
3560 //bowReleaseCh(prAdapter);
3561 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
3563 /*If connecting is not completed, request CH again*/
3564 if((eFsmState == BOW_DEVICE_STATE_CONNECTING) ||
3565 (eFsmState == BOW_DEVICE_STATE_STARTING))
3567 bowRequestCh(prAdapter);
3574 bowNotifyAllLinkDisconnected (
3575 IN P_ADAPTER_T prAdapter
3578 UINT_8 ucBowTableIdx = 0;
3579 CMD_INFO_T rCmdInfo;
3583 kalMemZero(&rCmdInfo, sizeof(CMD_INFO_T));
3585 while (ucBowTableIdx < CFG_BOW_PHYSICAL_LINK_NUM)
3587 if (arBowTable[ucBowTableIdx].fgIsValid)
3589 COPY_MAC_ADDR(prAdapter->rWifiVar.rBowFsmInfo.aucPeerAddress, arBowTable[ucBowTableIdx].aucPeerAddress);
3592 DBGLOG(BOW, EVENT, ("bowNotifyAllLinkDisconnected, arBowTable[%x].aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", ucBowTableIdx,
3593 arBowTable[ucBowTableIdx].aucPeerAddress[0],
3594 arBowTable[ucBowTableIdx].aucPeerAddress[1],
3595 arBowTable[ucBowTableIdx].aucPeerAddress[2],
3596 arBowTable[ucBowTableIdx].aucPeerAddress[3],
3597 arBowTable[ucBowTableIdx].aucPeerAddress[4],
3598 arBowTable[ucBowTableIdx].aucPeerAddress[5]));
3599 DBGLOG(BOW, EVENT, ("bowNotifyAllLinkDisconnected, arBowTable[%x].fgIsValid, %x.\n", ucBowTableIdx, arBowTable[ucBowTableIdx].fgIsValid));
3602 wlanoidSendSetQueryBowCmd(prAdapter,
3603 CMD_ID_CMD_BT_OVER_WIFI,
3606 wlanbowCmdEventLinkDisconnected,
3607 wlanbowCmdTimeoutHandler,
3613 wlanbowCmdEventLinkDisconnected(prAdapter, &rCmdInfo, NULL);
3624 /*----------------------------------------------------------------------------*/
3626 * \brief to retrieve Bluetooth-over-Wi-Fi state from glue layer
3632 * ENUM_BOW_DEVICE_STATE
3634 /*----------------------------------------------------------------------------*/
3637 bowCheckBowTableIfVaild(
3638 IN P_ADAPTER_T prAdapter,
3639 IN UINT_8 aucPeerAddress[6]
3644 KAL_SPIN_LOCK_DECLARATION();
3645 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3647 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3649 if( arBowTable[idx].fgIsValid &&
3650 EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress))
3654 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3660 aucPeerAddress[5]));
3662 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3663 arBowTable[idx].aucPeerAddress[0],
3664 arBowTable[idx].aucPeerAddress[1],
3665 arBowTable[idx].aucPeerAddress[2],
3666 arBowTable[idx].aucPeerAddress[3],
3667 arBowTable[idx].aucPeerAddress[4],
3668 arBowTable[idx].aucPeerAddress[5]));
3670 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3673 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3678 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3683 bowGetBowTableContent(
3684 IN P_ADAPTER_T prAdapter,
3685 IN UINT_8 ucBowTableIdx,
3686 OUT P_BOW_TABLE_T prBowTable
3689 KAL_SPIN_LOCK_DECLARATION();
3690 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3692 if (arBowTable[ucBowTableIdx].fgIsValid)
3696 DBGLOG(BOW, EVENT, ("bowGetBowTableContent, arBowTable[idx].fgIsValid, %x, %x.\n", ucBowTableIdx, arBowTable[ucBowTableIdx].fgIsValid));
3697 printk("GET State [%d]\n", arBowTable[ucBowTableIdx].eState);
3699 prBowTable = &(arBowTable[ucBowTableIdx]);
3700 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3705 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3712 bowSetBowTableContent(
3713 IN P_ADAPTER_T prAdapter,
3714 IN UINT_8 ucBowTableIdx,
3715 IN P_BOW_TABLE_T prBowTable
3718 KAL_SPIN_LOCK_DECLARATION();
3719 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3721 COPY_MAC_ADDR(arBowTable[ucBowTableIdx].aucPeerAddress, prBowTable->aucPeerAddress);
3722 arBowTable[ucBowTableIdx].eState = prBowTable->eState;
3723 arBowTable[ucBowTableIdx].fgIsValid = prBowTable->fgIsValid;
3724 arBowTable[ucBowTableIdx].ucAcquireID = prBowTable->ucAcquireID;
3726 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3728 kalSetBowState(prAdapter->prGlueInfo, prBowTable->eState, prBowTable->aucPeerAddress);
3729 //kalSetBowRole(prAdapter->prGlueInfo, prBowTable->ucRole, prBowTable->aucPeerAddress);
3732 printk("SET State [%d]\n", arBowTable[ucBowTableIdx].eState);
3733 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[ucBowTableIdx].fgIsValid, %x, %x.\n", ucBowTableIdx, arBowTable[ucBowTableIdx].fgIsValid));
3742 bowGetBowTableEntryByPeerAddress(
3743 IN P_ADAPTER_T prAdapter,
3744 IN UINT_8 aucPeerAddress[6],
3745 OUT PUINT_8 pucBowTableIdx
3750 KAL_SPIN_LOCK_DECLARATION();
3751 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3753 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3755 if( arBowTable[idx].fgIsValid &&
3756 EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress))
3760 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3766 aucPeerAddress[5]));
3767 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3768 arBowTable[idx].aucPeerAddress[0],
3769 arBowTable[idx].aucPeerAddress[1],
3770 arBowTable[idx].aucPeerAddress[2],
3771 arBowTable[idx].aucPeerAddress[3],
3772 arBowTable[idx].aucPeerAddress[4],
3773 arBowTable[idx].aucPeerAddress[5]));
3774 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3776 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3778 *pucBowTableIdx = idx;
3784 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3791 bowGetBowTableFreeEntry(
3792 IN P_ADAPTER_T prAdapter,
3793 OUT PUINT_8 pucBowTableIdx
3798 KAL_SPIN_LOCK_DECLARATION();
3799 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3801 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3803 if(!arBowTable[idx].fgIsValid)
3806 DBGLOG(BOW, EVENT, ("bowGetBowTableFreeEntry, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3808 *pucBowTableIdx = idx;
3809 arBowTable[idx].fgIsValid = TRUE;
3811 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3817 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3823 ENUM_BOW_DEVICE_STATE
3824 bowGetBowTableState(
3825 IN P_ADAPTER_T prAdapter,
3826 IN UINT_8 aucPeerAddress[6]
3831 KAL_SPIN_LOCK_DECLARATION();
3832 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3834 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3836 if( arBowTable[idx].fgIsValid &&
3837 EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress))
3840 DBGLOG(BOW, EVENT, ("bowGetState, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3846 aucPeerAddress[5]));
3847 DBGLOG(BOW, EVENT, ("bowGetState, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3848 arBowTable[idx].aucPeerAddress[0],
3849 arBowTable[idx].aucPeerAddress[1],
3850 arBowTable[idx].aucPeerAddress[2],
3851 arBowTable[idx].aucPeerAddress[3],
3852 arBowTable[idx].aucPeerAddress[4],
3853 arBowTable[idx].aucPeerAddress[5]));
3854 DBGLOG(BOW, EVENT, ("bowGetState, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3855 DBGLOG(BOW, EVENT, ("bowGetState, arBowTable[idx].eState;, %x, %x.\n", idx, arBowTable[idx].eState));
3856 printk("GET State [%d]\n", arBowTable[idx].eState);
3859 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3861 return arBowTable[idx].eState;
3865 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3867 return BOW_DEVICE_STATE_DISCONNECTED;
3872 bowSetBowTableState(
3873 IN P_ADAPTER_T prAdapter,
3874 IN UINT_8 aucPeerAddress[6],
3875 IN ENUM_BOW_DEVICE_STATE eState
3878 UINT_8 ucBowTableIdx;
3880 if(bowGetBowTableEntryByPeerAddress(prAdapter, aucPeerAddress, &ucBowTableIdx)) {
3881 KAL_SPIN_LOCK_DECLARATION();
3882 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3884 arBowTable[ucBowTableIdx].eState = eState;
3886 printk("SET State [%d]\n", eState);
3888 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3890 kalSetBowState(prAdapter->prGlueInfo, eState, aucPeerAddress);