p2p_dev_fsm.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. #include "precomp.h"
  2. #include "p2p_dev_state.h"
  3. #if CFG_ENABLE_WIFI_DIRECT
  4. #if 1
  5. /*lint -save -e64 Type mismatch */
  6. static PUINT_8 apucDebugP2pDevState[P2P_DEV_STATE_NUM] = {
  7. (PUINT_8) DISP_STRING("P2P_DEV_STATE_IDLE"),
  8. (PUINT_8) DISP_STRING("P2P_DEV_STATE_SCAN"),
  9. (PUINT_8) DISP_STRING("P2P_DEV_STATE_REQING_CHANNEL"),
  10. (PUINT_8) DISP_STRING("P2P_DEV_STATE_CHNL_ON_HAND"),
  11. (PUINT_8) DISP_STRING("P2P_DEV_STATE_NUM")
  12. };
  13. /*lint -restore */
  14. #endif /* DBG */
  15. UINT_8 p2pDevFsmInit(IN P_ADAPTER_T prAdapter)
  16. {
  17. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  18. P_P2P_CHNL_REQ_INFO_T prP2pChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  19. P_P2P_MGMT_TX_REQ_INFO_T prP2pMgmtTxReqInfo = (P_P2P_MGMT_TX_REQ_INFO_T) NULL;
  20. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  21. do {
  22. ASSERT_BREAK(prAdapter != NULL);
  23. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  24. ASSERT_BREAK(prP2pDevFsmInfo != NULL);
  25. kalMemZero(prP2pDevFsmInfo, sizeof(P2P_DEV_FSM_INFO_T));
  26. prP2pDevFsmInfo->eCurrentState = P2P_DEV_STATE_IDLE;
  27. cnmTimerInitTimer(prAdapter,
  28. &(prP2pDevFsmInfo->rP2pFsmTimeoutTimer),
  29. (PFN_MGMT_TIMEOUT_FUNC) p2pDevFsmRunEventTimeout, (ULONG) prP2pDevFsmInfo);
  30. prP2pBssInfo = cnmGetBssInfoAndInit(prAdapter, NETWORK_TYPE_P2P, TRUE);
  31. if (prP2pBssInfo == NULL)
  32. break;
  33. COPY_MAC_ADDR(prP2pBssInfo->aucOwnMacAddr, prAdapter->rMyMacAddr);
  34. prP2pBssInfo->aucOwnMacAddr[0] ^= 0x2; /* change to local administrated address */
  35. prP2pDevFsmInfo->ucBssIndex = prP2pBssInfo->ucBssIndex;
  36. prP2pBssInfo->eCurrentOPMode = OP_MODE_P2P_DEVICE;
  37. prP2pBssInfo->ucConfigAdHocAPMode = AP_MODE_11G_P2P;
  38. prP2pBssInfo->u2HwDefaultFixedRateCode = RATE_OFDM_6M;
  39. prP2pBssInfo->ucPhyTypeSet = prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11GN;
  40. prP2pBssInfo->ucNonHTBasicPhyType = (UINT_8)
  41. rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
  42. prP2pBssInfo->u2BSSBasicRateSet =
  43. rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
  44. prP2pBssInfo->u2OperationalRateSet =
  45. rNonHTPhyAttributes[prP2pBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
  46. rateGetDataRatesFromRateSet(prP2pBssInfo->u2OperationalRateSet,
  47. prP2pBssInfo->u2BSSBasicRateSet,
  48. prP2pBssInfo->aucAllSupportedRates, &prP2pBssInfo->ucAllSupportedRatesLen);
  49. prP2pChnlReqInfo = &prP2pDevFsmInfo->rChnlReqInfo;
  50. LINK_INITIALIZE(&prP2pChnlReqInfo->rP2pChnlReqLink);
  51. prP2pMgmtTxReqInfo = &prP2pDevFsmInfo->rMgmtTxInfo;
  52. LINK_INITIALIZE(&prP2pMgmtTxReqInfo->rP2pTxReqLink);
  53. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_IDLE);
  54. } while (FALSE);
  55. if (prP2pBssInfo)
  56. return prP2pBssInfo->ucBssIndex;
  57. else
  58. return P2P_DEV_BSS_INDEX + 1;
  59. #if 0
  60. do {
  61. ASSERT_BREAK(prAdapter != NULL);
  62. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  63. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  64. ASSERT_BREAK(prP2pFsmInfo != NULL);
  65. LINK_INITIALIZE(&(prP2pFsmInfo->rMsgEventQueue));
  66. prP2pFsmInfo->eCurrentState = prP2pFsmInfo->ePreviousState = P2P_STATE_IDLE;
  67. prP2pFsmInfo->prTargetBss = NULL;
  68. cnmTimerInitTimer(prAdapter,
  69. &(prP2pFsmInfo->rP2pFsmTimeoutTimer),
  70. (PFN_MGMT_TIMEOUT_FUNC) p2pFsmRunEventFsmTimeout, (ULONG) prP2pFsmInfo);
  71. /* 4 <2> Initiate BSS_INFO_T - common part */
  72. BSS_INFO_INIT(prAdapter, NETWORK_TYPE_P2P_INDEX);
  73. /* 4 <2.1> Initiate BSS_INFO_T - Setup HW ID */
  74. prP2pBssInfo->ucConfigAdHocAPMode = AP_MODE_11G_P2P;
  75. prP2pBssInfo->ucHwDefaultFixedRateCode = RATE_OFDM_6M;
  76. prP2pBssInfo->ucNonHTBasicPhyType = (UINT_8)
  77. rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
  78. prP2pBssInfo->u2BSSBasicRateSet =
  79. rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
  80. prP2pBssInfo->u2OperationalRateSet =
  81. rNonHTPhyAttributes[prP2pBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
  82. rateGetDataRatesFromRateSet(prP2pBssInfo->u2OperationalRateSet,
  83. prP2pBssInfo->u2BSSBasicRateSet,
  84. prP2pBssInfo->aucAllSupportedRates, &prP2pBssInfo->ucAllSupportedRatesLen);
  85. prP2pBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
  86. OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
  87. if (prP2pBssInfo->prBeacon) {
  88. prP2pBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
  89. prP2pBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
  90. prP2pBssInfo->prBeacon->ucNetworkType = NETWORK_TYPE_P2P_INDEX;
  91. } else {
  92. /* Out of memory. */
  93. ASSERT(FALSE);
  94. }
  95. prP2pBssInfo->eCurrentOPMode = OP_MODE_NUM;
  96. prP2pBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
  97. prP2pBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
  98. prP2pBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
  99. prP2pBssInfo->ucPrimaryChannel = P2P_DEFAULT_LISTEN_CHANNEL;
  100. prP2pBssInfo->eBand = BAND_2G4;
  101. prP2pBssInfo->eBssSCO = CHNL_EXT_SCN;
  102. if (IS_FEATURE_ENABLED(prAdapter->rWifiVar.ucQoS))
  103. prP2pBssInfo->fgIsQBSS = TRUE;
  104. else
  105. prP2pBssInfo->fgIsQBSS = FALSE;
  106. SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
  107. p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
  108. } while (FALSE);
  109. return;
  110. #endif
  111. } /* p2pDevFsmInit */
  112. VOID p2pDevFsmUninit(IN P_ADAPTER_T prAdapter)
  113. {
  114. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  115. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  116. do {
  117. ASSERT_BREAK(prAdapter != NULL);
  118. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  119. ASSERT_BREAK(prP2pDevFsmInfo != NULL);
  120. prP2pBssInfo = prAdapter->aprBssInfo[prP2pDevFsmInfo->ucBssIndex];
  121. cnmTimerStopTimer(prAdapter, &(prP2pDevFsmInfo->rP2pFsmTimeoutTimer));
  122. /* Abort device FSM */
  123. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_IDLE);
  124. p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo);
  125. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  126. /* Clear CmdQue */
  127. kalClearMgmtFramesByBssIdx(prAdapter->prGlueInfo, prP2pBssInfo->ucBssIndex);
  128. kalClearSecurityFramesByBssIdx(prAdapter->prGlueInfo, prP2pBssInfo->ucBssIndex);
  129. /* Clear PendingCmdQue */
  130. wlanReleasePendingCMDbyBssIdx(prAdapter, prP2pBssInfo->ucBssIndex);
  131. /* Clear PendingTxMsdu */
  132. nicFreePendingTxMsduInfoByBssIdx(prAdapter, prP2pBssInfo->ucBssIndex);
  133. /* Deactivate BSS. */
  134. UNSET_NET_ACTIVE(prAdapter, prP2pBssInfo->ucBssIndex);
  135. nicDeactivateNetwork(prAdapter, prP2pBssInfo->ucBssIndex);
  136. cnmFreeBssInfo(prAdapter, prP2pBssInfo);
  137. } while (FALSE);
  138. #if 0
  139. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  140. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  141. do {
  142. ASSERT_BREAK(prAdapter != NULL);
  143. DEBUGFUNC("p2pFsmUninit()");
  144. DBGLOG(P2P, INFO, "->p2pFsmUninit()\n");
  145. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  146. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  147. p2pFuncSwitchOPMode(prAdapter, prP2pBssInfo, OP_MODE_P2P_DEVICE, TRUE);
  148. p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
  149. p2pStateAbort_IDLE(prAdapter, prP2pFsmInfo, P2P_STATE_NUM);
  150. UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
  151. wlanAcquirePowerControl(prAdapter);
  152. /* Release all pending CMD queue. */
  153. DBGLOG(P2P, TRACE,
  154. "p2pFsmUninit: wlanProcessCommandQueue, num of element:%d\n",
  155. prAdapter->prGlueInfo->rCmdQueue.u4NumElem);
  156. wlanProcessCommandQueue(prAdapter, &prAdapter->prGlueInfo->rCmdQueue);
  157. wlanReleasePowerControl(prAdapter);
  158. /* Release pending mgmt frame,
  159. * mgmt frame may be pending by CMD without resource.
  160. */
  161. kalClearMgmtFramesByBssIdx(prAdapter->prGlueInfo, NETWORK_TYPE_P2P_INDEX);
  162. /* Clear PendingCmdQue */
  163. wlanReleasePendingCMDbyBssIdx(prAdapter, NETWORK_TYPE_P2P_INDEX);
  164. if (prP2pBssInfo->prBeacon) {
  165. cnmMgtPktFree(prAdapter, prP2pBssInfo->prBeacon);
  166. prP2pBssInfo->prBeacon = NULL;
  167. }
  168. } while (FALSE);
  169. return;
  170. #endif
  171. } /* p2pDevFsmUninit */
  172. VOID
  173. p2pDevFsmStateTransition(IN P_ADAPTER_T prAdapter,
  174. IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo, IN ENUM_P2P_DEV_STATE_T eNextState)
  175. {
  176. BOOLEAN fgIsLeaveState = (BOOLEAN) FALSE;
  177. ASSERT(prP2pDevFsmInfo->ucBssIndex == P2P_DEV_BSS_INDEX);
  178. do {
  179. if (!IS_BSS_ACTIVE(prAdapter->aprBssInfo[prP2pDevFsmInfo->ucBssIndex])) {
  180. if (!cnmP2PIsPermitted(prAdapter))
  181. return;
  182. SET_NET_ACTIVE(prAdapter, prP2pDevFsmInfo->ucBssIndex);
  183. nicActivateNetwork(prAdapter, prP2pDevFsmInfo->ucBssIndex);
  184. }
  185. fgIsLeaveState = fgIsLeaveState ? FALSE : TRUE;
  186. if (!fgIsLeaveState) {
  187. DBGLOG(P2P, STATE, "[P2P_DEV]TRANSITION: [%s] -> [%s]\n",
  188. apucDebugP2pDevState[prP2pDevFsmInfo->eCurrentState],
  189. apucDebugP2pDevState[eNextState]);
  190. /* Transition into current state. */
  191. prP2pDevFsmInfo->eCurrentState = eNextState;
  192. }
  193. switch (prP2pDevFsmInfo->eCurrentState) {
  194. case P2P_DEV_STATE_IDLE:
  195. if (!fgIsLeaveState) {
  196. fgIsLeaveState = p2pDevStateInit_IDLE(prAdapter,
  197. &prP2pDevFsmInfo->rChnlReqInfo, &eNextState);
  198. } else {
  199. p2pDevStateAbort_IDLE(prAdapter);
  200. }
  201. break;
  202. case P2P_DEV_STATE_SCAN:
  203. if (!fgIsLeaveState) {
  204. p2pDevStateInit_SCAN(prAdapter,
  205. prP2pDevFsmInfo->ucBssIndex, &prP2pDevFsmInfo->rScanReqInfo);
  206. } else {
  207. p2pDevStateAbort_SCAN(prAdapter, prP2pDevFsmInfo);
  208. }
  209. break;
  210. case P2P_DEV_STATE_REQING_CHANNEL:
  211. if (!fgIsLeaveState) {
  212. fgIsLeaveState = p2pDevStateInit_REQING_CHANNEL(prAdapter,
  213. prP2pDevFsmInfo->ucBssIndex,
  214. &(prP2pDevFsmInfo->rChnlReqInfo),
  215. &eNextState);
  216. } else {
  217. p2pDevStateAbort_REQING_CHANNEL(prAdapter,
  218. &(prP2pDevFsmInfo->rChnlReqInfo), eNextState);
  219. }
  220. break;
  221. case P2P_DEV_STATE_CHNL_ON_HAND:
  222. if (!fgIsLeaveState) {
  223. p2pDevStateInit_CHNL_ON_HAND(prAdapter,
  224. prAdapter->aprBssInfo[prP2pDevFsmInfo->ucBssIndex],
  225. prP2pDevFsmInfo, &(prP2pDevFsmInfo->rChnlReqInfo));
  226. } else {
  227. p2pDevStateAbort_CHNL_ON_HAND(prAdapter,
  228. prAdapter->aprBssInfo[prP2pDevFsmInfo->ucBssIndex],
  229. prP2pDevFsmInfo, &(prP2pDevFsmInfo->rChnlReqInfo),
  230. eNextState);
  231. }
  232. break;
  233. case P2P_DEV_STATE_OFF_CHNL_TX:
  234. if (!fgIsLeaveState) {
  235. fgIsLeaveState = p2pDevStateInit_OFF_CHNL_TX(prAdapter,
  236. prP2pDevFsmInfo,
  237. &(prP2pDevFsmInfo->rChnlReqInfo),
  238. &(prP2pDevFsmInfo->rMgmtTxInfo),
  239. &eNextState);
  240. } else {
  241. p2pDevStateAbort_OFF_CHNL_TX(prAdapter,
  242. &(prP2pDevFsmInfo->rMgmtTxInfo),
  243. &(prP2pDevFsmInfo->rChnlReqInfo), eNextState);
  244. }
  245. break;
  246. default:
  247. /* Unexpected state. */
  248. ASSERT(FALSE);
  249. break;
  250. }
  251. } while (fgIsLeaveState);
  252. } /* p2pDevFsmStateTransition */
  253. VOID p2pDevFsmRunEventAbort(IN P_ADAPTER_T prAdapter, IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo)
  254. {
  255. do {
  256. ASSERT_BREAK((prAdapter != NULL) && (prP2pDevFsmInfo != NULL));
  257. if (prP2pDevFsmInfo->eCurrentState != P2P_DEV_STATE_IDLE) {
  258. /* Get into IDLE state. */
  259. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_IDLE);
  260. }
  261. /* Abort IDLE. */
  262. p2pDevStateAbort_IDLE(prAdapter);
  263. } while (FALSE);
  264. } /* p2pDevFsmRunEventAbort */
  265. VOID p2pDevFsmRunEventTimeout(IN P_ADAPTER_T prAdapter, IN ULONG ulParamPtr)
  266. {
  267. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) ulParamPtr;
  268. do {
  269. ASSERT_BREAK((prAdapter != NULL) && (prP2pDevFsmInfo != NULL));
  270. switch (prP2pDevFsmInfo->eCurrentState) {
  271. case P2P_DEV_STATE_IDLE:
  272. /* TODO: IDLE timeout for low power mode. */
  273. break;
  274. case P2P_DEV_STATE_CHNL_ON_HAND:
  275. switch (prP2pDevFsmInfo->eListenExted) {
  276. case P2P_DEV_NOT_EXT_LISTEN:
  277. case P2P_DEV_EXT_LISTEN_WAITFOR_TIMEOUT:
  278. DBGLOG(P2P, INFO, "p2p timeout, state==P2P_DEV_STATE_CHNL_ON_HAND, eListenExted: %d\n",
  279. prP2pDevFsmInfo->eListenExted);
  280. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_IDLE);
  281. prP2pDevFsmInfo->eListenExted = P2P_DEV_NOT_EXT_LISTEN;
  282. break;
  283. case P2P_DEV_EXT_LISTEN_ING:
  284. DBGLOG(P2P, INFO, "p2p timeout, state==P2P_DEV_STATE_CHNL_ON_HAND, eListenExted: %d\n",
  285. prP2pDevFsmInfo->eListenExted);
  286. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_CHNL_ON_HAND);
  287. prP2pDevFsmInfo->eListenExted = P2P_DEV_EXT_LISTEN_WAITFOR_TIMEOUT;
  288. break;
  289. default:
  290. ASSERT(FALSE);
  291. DBGLOG(P2P, ERROR,
  292. "Current P2P Dev State %d is unexpected for FSM timeout event.\n",
  293. prP2pDevFsmInfo->eCurrentState);
  294. }
  295. break;
  296. default:
  297. ASSERT(FALSE);
  298. DBGLOG(P2P, ERROR,
  299. "Current P2P Dev State %d is unexpected for FSM timeout event.\n",
  300. prP2pDevFsmInfo->eCurrentState);
  301. break;
  302. }
  303. } while (FALSE);
  304. } /* p2pDevFsmRunEventTimeout */
  305. /*================ Message Event =================*/
  306. VOID p2pDevFsmRunEventScanRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  307. {
  308. P_MSG_P2P_SCAN_REQUEST_T prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) NULL;
  309. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  310. P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  311. UINT_32 u4ChnlListSize = 0;
  312. P_P2P_SSID_STRUCT_T prP2pSsidStruct = (P_P2P_SSID_STRUCT_T) NULL;
  313. do {
  314. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  315. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  316. if (prP2pDevFsmInfo == NULL)
  317. break;
  318. if (prP2pDevFsmInfo->eCurrentState != P2P_DEV_STATE_IDLE)
  319. p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo);
  320. prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
  321. prScanReqInfo = &(prP2pDevFsmInfo->rScanReqInfo);
  322. DBGLOG(P2P, TRACE, "p2pDevFsmRunEventScanRequest\n");
  323. /* Do we need to be in IDLE state? */
  324. /* p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo); */
  325. ASSERT(prScanReqInfo->fgIsScanRequest == FALSE);
  326. prScanReqInfo->fgIsAbort = TRUE;
  327. prScanReqInfo->eScanType = prP2pScanReqMsg->eScanType;
  328. prScanReqInfo->u2PassiveDewellTime = 0;
  329. if (prP2pScanReqMsg->u4NumChannel) {
  330. prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
  331. /* Channel List */
  332. prScanReqInfo->ucNumChannelList = prP2pScanReqMsg->u4NumChannel;
  333. DBGLOG(P2P, TRACE, "Scan Request Channel List Number: %d\n", prScanReqInfo->ucNumChannelList);
  334. if (prScanReqInfo->ucNumChannelList > MAXIMUM_OPERATION_CHANNEL_LIST) {
  335. DBGLOG(P2P, TRACE,
  336. "Channel List Number Overloaded: %d, change to: %d\n",
  337. prScanReqInfo->ucNumChannelList, MAXIMUM_OPERATION_CHANNEL_LIST);
  338. prScanReqInfo->ucNumChannelList = MAXIMUM_OPERATION_CHANNEL_LIST;
  339. }
  340. u4ChnlListSize = sizeof(RF_CHANNEL_INFO_T) * prScanReqInfo->ucNumChannelList;
  341. kalMemCopy(prScanReqInfo->arScanChannelList,
  342. prP2pScanReqMsg->arChannelListInfo, u4ChnlListSize);
  343. } else {
  344. /* If channel number is ZERO.
  345. * It means do a FULL channel scan.
  346. */
  347. prScanReqInfo->eChannelSet = SCAN_CHANNEL_FULL;
  348. }
  349. /* SSID */
  350. prP2pSsidStruct = prP2pScanReqMsg->prSSID;
  351. for (prScanReqInfo->ucSsidNum = 0;
  352. prScanReqInfo->ucSsidNum < prP2pScanReqMsg->i4SsidNum; prScanReqInfo->ucSsidNum++) {
  353. kalMemCopy(prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].aucSsid,
  354. prP2pSsidStruct->aucSsid, prP2pSsidStruct->ucSsidLen);
  355. prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].ucSsidLen = prP2pSsidStruct->ucSsidLen;
  356. prP2pSsidStruct++;
  357. }
  358. /* IE Buffer */
  359. kalMemCopy(prScanReqInfo->aucIEBuf, prP2pScanReqMsg->pucIEBuf, prP2pScanReqMsg->u4IELen);
  360. prScanReqInfo->u4BufLength = prP2pScanReqMsg->u4IELen;
  361. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_SCAN);
  362. } while (FALSE);
  363. if (prMsgHdr)
  364. cnmMemFree(prAdapter, prMsgHdr);
  365. } /* p2pDevFsmRunEventScanRequest */
  366. VOID
  367. p2pDevFsmRunEventScanDone(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr, IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo)
  368. {
  369. P_MSG_SCN_SCAN_DONE prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
  370. P_P2P_SCAN_REQ_INFO_T prP2pScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  371. do {
  372. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL) && (prP2pDevFsmInfo != NULL));
  373. if (!prP2pDevFsmInfo) {
  374. DBGLOG(P2P, ERROR, "prP2pDevFsmInfo is null, maybe remove p2p already\n");
  375. break;
  376. }
  377. prP2pScanReqInfo = &(prP2pDevFsmInfo->rScanReqInfo);
  378. if (prScanDoneMsg->ucSeqNum != prP2pScanReqInfo->ucSeqNumOfScnMsg) {
  379. DBGLOG(P2P, TRACE,
  380. "P2P Scan Done SeqNum:%d <-> P2P Dev FSM Scan SeqNum:%d",
  381. prScanDoneMsg->ucSeqNum, prP2pScanReqInfo->ucSeqNumOfScnMsg);
  382. break;
  383. }
  384. ASSERT_BREAK(prScanDoneMsg->ucBssIndex == prP2pDevFsmInfo->ucBssIndex);
  385. prP2pScanReqInfo->fgIsAbort = FALSE;
  386. prP2pScanReqInfo->fgIsScanRequest = FALSE;
  387. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_IDLE);
  388. } while (FALSE);
  389. if (prMsgHdr)
  390. cnmMemFree(prAdapter, prMsgHdr);
  391. } /* p2pDevFsmRunEventScanDone */
  392. VOID p2pDevFsmRunEventChannelRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  393. {
  394. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  395. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  396. BOOLEAN fgIsChnlFound = FALSE;
  397. do {
  398. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  399. DBGLOG(P2P, STATE, "p2pDevFsmRunEventChannelRequest\n");
  400. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  401. if (prP2pDevFsmInfo == NULL)
  402. break;
  403. prChnlReqInfo = &(prP2pDevFsmInfo->rChnlReqInfo);
  404. DBGLOG(P2P, TRACE, "p2pDevFsmRunEventChannelRequest\n");
  405. if (!LINK_IS_EMPTY(&prChnlReqInfo->rP2pChnlReqLink)) {
  406. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  407. P_MSG_P2P_CHNL_REQUEST_T prP2pMsgChnlReq = (P_MSG_P2P_CHNL_REQUEST_T) NULL;
  408. LINK_FOR_EACH(prLinkEntry, &prChnlReqInfo->rP2pChnlReqLink) {
  409. prP2pMsgChnlReq =
  410. (P_MSG_P2P_CHNL_REQUEST_T) LINK_ENTRY(prLinkEntry, MSG_HDR_T, rLinkEntry);
  411. if (prP2pMsgChnlReq->eChnlReqType == CH_REQ_TYPE_P2P_LISTEN) {
  412. LINK_REMOVE_KNOWN_ENTRY(&prChnlReqInfo->rP2pChnlReqLink, prLinkEntry);
  413. cnmMemFree(prAdapter, prP2pMsgChnlReq);
  414. /* DBGLOG(P2P, TRACE, */
  415. /* ("p2pDevFsmRunEventChannelAbort: Channel Abort, cookie found:%d\n", */
  416. /* prChnlAbortMsg->u8Cookie)); */
  417. fgIsChnlFound = TRUE;
  418. break;
  419. }
  420. }
  421. }
  422. /* Queue the channel request. */
  423. LINK_INSERT_TAIL(&(prChnlReqInfo->rP2pChnlReqLink), &(prMsgHdr->rLinkEntry));
  424. prMsgHdr = NULL;
  425. /* If channel is not requested, it may due to channel is released. */
  426. if ((!fgIsChnlFound) &&
  427. (prChnlReqInfo->eChnlReqType == CH_REQ_TYPE_P2P_LISTEN) && (prChnlReqInfo->fgIsChannelRequested)) {
  428. ASSERT((prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_REQING_CHANNEL) ||
  429. (prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_CHNL_ON_HAND));
  430. p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo);
  431. break;
  432. }
  433. if (prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_IDLE) {
  434. /* Re-enter IDLE state would trigger channel request. */
  435. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_IDLE);
  436. }
  437. } while (FALSE);
  438. if (prMsgHdr)
  439. cnmMemFree(prAdapter, prMsgHdr);
  440. } /* p2pDevFsmRunEventChannelRequest */
  441. VOID p2pDevFsmRunEventChannelAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  442. {
  443. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  444. P_MSG_P2P_CHNL_ABORT_T prChnlAbortMsg = (P_MSG_P2P_CHNL_ABORT_T) NULL;
  445. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  446. do {
  447. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  448. prChnlAbortMsg = (P_MSG_P2P_CHNL_ABORT_T) prMsgHdr;
  449. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  450. if (prP2pDevFsmInfo == NULL)
  451. break;
  452. prChnlReqInfo = &(prP2pDevFsmInfo->rChnlReqInfo);
  453. DBGLOG(P2P, TRACE, "p2pDevFsmRunEventChannelAbort\n");
  454. /* If channel is not requested, it may due to channel is released. */
  455. if ((prChnlAbortMsg->u8Cookie == prChnlReqInfo->u8Cookie) && (prChnlReqInfo->fgIsChannelRequested)) {
  456. ASSERT((prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_REQING_CHANNEL) ||
  457. (prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_CHNL_ON_HAND));
  458. p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo);
  459. break;
  460. } else if (!LINK_IS_EMPTY(&prChnlReqInfo->rP2pChnlReqLink)) {
  461. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  462. P_MSG_P2P_CHNL_REQUEST_T prP2pMsgChnlReq = (P_MSG_P2P_CHNL_REQUEST_T) NULL;
  463. LINK_FOR_EACH(prLinkEntry, &prChnlReqInfo->rP2pChnlReqLink) {
  464. prP2pMsgChnlReq =
  465. (P_MSG_P2P_CHNL_REQUEST_T) LINK_ENTRY(prLinkEntry, MSG_HDR_T, rLinkEntry);
  466. if (prP2pMsgChnlReq->u8Cookie == prChnlAbortMsg->u8Cookie) {
  467. LINK_REMOVE_KNOWN_ENTRY(&prChnlReqInfo->rP2pChnlReqLink, prLinkEntry);
  468. cnmMemFree(prAdapter, prP2pMsgChnlReq);
  469. DBGLOG(P2P, TRACE,
  470. "p2pDevFsmRunEventChannelAbort: Channel Abort, cookie found:%d\n",
  471. prChnlAbortMsg->u8Cookie);
  472. break;
  473. }
  474. }
  475. } else {
  476. DBGLOG(P2P, WARN,
  477. "p2pDevFsmRunEventChannelAbort: Channel Abort Fail, cookie not found:%d\n",
  478. prChnlAbortMsg->u8Cookie);
  479. }
  480. } while (FALSE);
  481. if (prMsgHdr)
  482. cnmMemFree(prAdapter, prMsgHdr);
  483. } /* p2pDevFsmRunEventChannelAbort */
  484. VOID
  485. p2pDevFsmRunEventChnlGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr, IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo)
  486. {
  487. P_MSG_CH_GRANT_T prMsgChGrant = (P_MSG_CH_GRANT_T) NULL;
  488. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  489. if ((prAdapter == NULL) || (prMsgHdr == NULL) || (prP2pDevFsmInfo == NULL))
  490. return;
  491. do {
  492. prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
  493. prChnlReqInfo = &(prP2pDevFsmInfo->rChnlReqInfo);
  494. if ((prMsgChGrant->ucTokenID != prChnlReqInfo->ucSeqNumOfChReq) ||
  495. (!prChnlReqInfo->fgIsChannelRequested)) {
  496. break;
  497. }
  498. ASSERT(prMsgChGrant->ucPrimaryChannel == prChnlReqInfo->ucReqChnlNum);
  499. ASSERT(prMsgChGrant->eReqType == prChnlReqInfo->eChnlReqType);
  500. ASSERT(prMsgChGrant->u4GrantInterval == prChnlReqInfo->u4MaxInterval);
  501. prChnlReqInfo->u4MaxInterval = prMsgChGrant->u4GrantInterval;
  502. if (prMsgChGrant->eReqType == CH_REQ_TYPE_P2P_LISTEN) {
  503. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_CHNL_ON_HAND);
  504. } else {
  505. ASSERT(prMsgChGrant->eReqType == CH_REQ_TYPE_OFFCHNL_TX);
  506. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_OFF_CHNL_TX);
  507. }
  508. } while (FALSE);
  509. if (prMsgHdr)
  510. cnmMemFree(prAdapter, prMsgHdr);
  511. } /* p2pDevFsmRunEventChnlGrant */
  512. VOID p2pDevFsmRunEventMgmtTx(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  513. {
  514. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  515. P_MSG_P2P_MGMT_TX_REQUEST_T prMgmtTxMsg = (P_MSG_P2P_MGMT_TX_REQUEST_T) NULL;
  516. P_P2P_MGMT_TX_REQ_INFO_T prP2pMgmtTxReqInfo = (P_P2P_MGMT_TX_REQ_INFO_T) NULL;
  517. do {
  518. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  519. prMgmtTxMsg = (P_MSG_P2P_MGMT_TX_REQUEST_T) prMsgHdr;
  520. if ((prMgmtTxMsg->ucBssIdx != P2P_DEV_BSS_INDEX) && (IS_NET_ACTIVE(prAdapter, prMgmtTxMsg->ucBssIdx))) {
  521. DBGLOG(P2P, TRACE, " Role Interface\n");
  522. p2pFuncTxMgmtFrame(prAdapter,
  523. prMgmtTxMsg->ucBssIdx,
  524. prMgmtTxMsg->prMgmtMsduInfo, prMgmtTxMsg->fgNoneCckRate);
  525. break;
  526. }
  527. DBGLOG(P2P, TRACE, " Device Interface\n");
  528. DBGLOG(P2P, STATE, "p2pDevFsmRunEventMgmtTx\n");
  529. prMgmtTxMsg->ucBssIdx = P2P_DEV_BSS_INDEX;
  530. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  531. if (prP2pDevFsmInfo == NULL)
  532. break;
  533. prP2pMgmtTxReqInfo = &(prP2pDevFsmInfo->rMgmtTxInfo);
  534. if ((!prMgmtTxMsg->fgIsOffChannel) ||
  535. ((prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_OFF_CHNL_TX) &&
  536. (LINK_IS_EMPTY(&prP2pMgmtTxReqInfo->rP2pTxReqLink)))) {
  537. p2pFuncTxMgmtFrame(prAdapter,
  538. prP2pDevFsmInfo->ucBssIndex,
  539. prMgmtTxMsg->prMgmtMsduInfo, prMgmtTxMsg->fgNoneCckRate);
  540. } else {
  541. P_P2P_OFF_CHNL_TX_REQ_INFO_T prOffChnlTxReq = (P_P2P_OFF_CHNL_TX_REQ_INFO_T) NULL;
  542. prOffChnlTxReq = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(P2P_OFF_CHNL_TX_REQ_INFO_T));
  543. if (prOffChnlTxReq == NULL) {
  544. DBGLOG(P2P, ERROR, "Can not serve TX request due to MSG buffer not enough\n");
  545. ASSERT(FALSE);
  546. break;
  547. }
  548. prOffChnlTxReq->prMgmtTxMsdu = prMgmtTxMsg->prMgmtMsduInfo;
  549. prOffChnlTxReq->fgNoneCckRate = prMgmtTxMsg->fgNoneCckRate;
  550. kalMemCopy(&prOffChnlTxReq->rChannelInfo, &prMgmtTxMsg->rChannelInfo,
  551. sizeof(RF_CHANNEL_INFO_T));
  552. prOffChnlTxReq->eChnlExt = prMgmtTxMsg->eChnlExt;
  553. prOffChnlTxReq->fgIsWaitRsp = prMgmtTxMsg->fgIsWaitRsp;
  554. LINK_INSERT_TAIL(&prP2pMgmtTxReqInfo->rP2pTxReqLink, &prOffChnlTxReq->rLinkEntry);
  555. /* Channel Request if needed. */
  556. if (prP2pDevFsmInfo->eCurrentState != P2P_DEV_STATE_OFF_CHNL_TX) {
  557. P_MSG_P2P_CHNL_REQUEST_T prP2pMsgChnlReq = (P_MSG_P2P_CHNL_REQUEST_T) NULL;
  558. prP2pMsgChnlReq = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_CHNL_REQUEST_T));
  559. if (prP2pMsgChnlReq == NULL) {
  560. cnmMemFree(prAdapter, prOffChnlTxReq);
  561. ASSERT(FALSE);
  562. DBGLOG(P2P, ERROR, "Not enough MSG buffer for channel request\n");
  563. break;
  564. }
  565. prP2pMsgChnlReq->eChnlReqType = CH_REQ_TYPE_OFFCHNL_TX;
  566. /* Not used in TX OFFCHNL REQ fields. */
  567. prP2pMsgChnlReq->rMsgHdr.eMsgId = MID_MNY_P2P_CHNL_REQ;
  568. prP2pMsgChnlReq->u8Cookie = 0;
  569. prP2pMsgChnlReq->u4Duration = P2P_OFF_CHNL_TX_DEFAULT_TIME_MS;
  570. kalMemCopy(&prP2pMsgChnlReq->rChannelInfo,
  571. &prMgmtTxMsg->rChannelInfo, sizeof(RF_CHANNEL_INFO_T));
  572. prP2pMsgChnlReq->eChnlSco = prMgmtTxMsg->eChnlExt;
  573. p2pDevFsmRunEventChannelRequest(prAdapter, (P_MSG_HDR_T) prP2pMsgChnlReq);
  574. }
  575. }
  576. } while (FALSE);
  577. if (prMsgHdr)
  578. cnmMemFree(prAdapter, prMsgHdr);
  579. } /* p2pDevFsmRunEventMgmtTx */
  580. WLAN_STATUS
  581. p2pDevFsmRunEventMgmtFrameTxDone(IN P_ADAPTER_T prAdapter,
  582. IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  583. {
  584. BOOLEAN fgIsSuccess = FALSE;
  585. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = (P_P2P_DEV_FSM_INFO_T) NULL;
  586. do {
  587. ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
  588. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  589. if (prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_OFF_CHNL_TX)
  590. p2pDevFsmStateTransition(prAdapter, prP2pDevFsmInfo, P2P_DEV_STATE_OFF_CHNL_TX);
  591. if (rTxDoneStatus != TX_RESULT_SUCCESS) {
  592. DBGLOG(P2P, TRACE, "Mgmt Frame TX Fail, Status:%d.\n", rTxDoneStatus);
  593. } else {
  594. fgIsSuccess = TRUE;
  595. DBGLOG(P2P, TRACE, "Mgmt Frame TX Done.\n");
  596. }
  597. kalP2PIndicateMgmtTxStatus(prAdapter->prGlueInfo, prMsduInfo, fgIsSuccess);
  598. } while (FALSE);
  599. return WLAN_STATUS_SUCCESS;
  600. } /* p2pDevFsmRunEventMgmtFrameTxDone */
  601. VOID p2pDevFsmRunEventMgmtFrameRegister(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  602. {
  603. /* TODO: RX Filter Management. */
  604. if (prMsgHdr)
  605. cnmMemFree(prAdapter, prMsgHdr);
  606. } /* p2pDevFsmRunEventMgmtFrameRegister */
  607. /* /////////////////////////////////////////// */
  608. /*----------------------------------------------------------------------------*/
  609. /*!
  610. * \brief This function is call when channel is granted by CNM module from FW.
  611. *
  612. * \param[in] prAdapter Pointer of ADAPTER_T
  613. *
  614. * \return none
  615. */
  616. /*----------------------------------------------------------------------------*/
  617. VOID p2pFsmRunEventChGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  618. {
  619. P_MSG_CH_GRANT_T prMsgChGrant = (P_MSG_CH_GRANT_T) NULL;
  620. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  621. do {
  622. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  623. prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
  624. prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prMsgChGrant->ucBssIndex);
  625. DBGLOG(P2P, TRACE, "P2P Run Event Channel Grant\n");
  626. switch (prP2pBssInfo->eCurrentOPMode) {
  627. case OP_MODE_P2P_DEVICE:
  628. ASSERT(prP2pBssInfo->ucBssIndex == P2P_DEV_BSS_INDEX);
  629. p2pDevFsmRunEventChnlGrant(prAdapter, prMsgHdr, prAdapter->rWifiVar.prP2pDevFsmInfo);
  630. break;
  631. case OP_MODE_INFRASTRUCTURE:
  632. case OP_MODE_ACCESS_POINT:
  633. ASSERT(prP2pBssInfo->ucBssIndex < P2P_DEV_BSS_INDEX);
  634. p2pRoleFsmRunEventChnlGrant(prAdapter, prMsgHdr,
  635. P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter,
  636. prP2pBssInfo->u4PrivateData));
  637. break;
  638. default:
  639. ASSERT(FALSE);
  640. break;
  641. }
  642. } while (FALSE);
  643. } /* p2pFsmRunEventChGrant */
  644. VOID p2pFsmRunEventScanRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  645. {
  646. P_MSG_P2P_SCAN_REQUEST_T prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) NULL;
  647. do {
  648. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  649. prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
  650. if (prP2pScanReqMsg->ucBssIdx == P2P_DEV_BSS_INDEX)
  651. p2pDevFsmRunEventScanRequest(prAdapter, prMsgHdr);
  652. else
  653. p2pRoleFsmRunEventScanRequest(prAdapter, prMsgHdr);
  654. } while (FALSE);
  655. if (prP2pScanReqMsg == NULL)
  656. cnmMemFree(prAdapter, prMsgHdr);
  657. } /* p2pDevFsmRunEventScanRequest */
  658. /*----------------------------------------------------------------------------*/
  659. /*!
  660. * \brief This function is used to handle scan done event during Device Discovery.
  661. *
  662. * \param[in] prAdapter Pointer of ADAPTER_T
  663. *
  664. * \return none
  665. */
  666. /*----------------------------------------------------------------------------*/
  667. VOID p2pFsmRunEventScanDone(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  668. {
  669. P_MSG_SCN_SCAN_DONE prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) NULL;
  670. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  671. do {
  672. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  673. prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
  674. prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prScanDoneMsg->ucBssIndex);
  675. if (prAdapter->fgIsP2PRegistered == FALSE) {
  676. DBGLOG(P2P, TRACE, "P2P BSS Info is removed, break p2pFsmRunEventScanDone\n");
  677. if (prMsgHdr)
  678. cnmMemFree(prAdapter, prMsgHdr);
  679. break;
  680. }
  681. DBGLOG(P2P, TRACE, "P2P Scan Done Event\n");
  682. switch (prP2pBssInfo->eCurrentOPMode) {
  683. case OP_MODE_P2P_DEVICE:
  684. ASSERT(prP2pBssInfo->ucBssIndex == P2P_DEV_BSS_INDEX);
  685. p2pDevFsmRunEventScanDone(prAdapter, prMsgHdr, prAdapter->rWifiVar.prP2pDevFsmInfo);
  686. break;
  687. case OP_MODE_INFRASTRUCTURE:
  688. case OP_MODE_ACCESS_POINT:
  689. ASSERT(prP2pBssInfo->ucBssIndex < P2P_DEV_BSS_INDEX);
  690. p2pRoleFsmRunEventScanDone(prAdapter, prMsgHdr,
  691. P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter,
  692. prP2pBssInfo->u4PrivateData));
  693. break;
  694. default:
  695. ASSERT(FALSE);
  696. break;
  697. }
  698. } while (FALSE);
  699. } /* p2pFsmRunEventScanDone */
  700. VOID p2pFsmRunEventNetDeviceRegister(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  701. {
  702. P_MSG_P2P_NETDEV_REGISTER_T prNetDevRegisterMsg = (P_MSG_P2P_NETDEV_REGISTER_T) NULL;
  703. do {
  704. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  705. DBGLOG(P2P, TRACE, "p2pFsmRunEventNetDeviceRegister\n");
  706. prNetDevRegisterMsg = (P_MSG_P2P_NETDEV_REGISTER_T) prMsgHdr;
  707. if (prNetDevRegisterMsg->fgIsEnable) {
  708. p2pSetMode((prNetDevRegisterMsg->ucMode == 1) ? TRUE : FALSE);
  709. if (p2pLaunch(prAdapter->prGlueInfo))
  710. ASSERT(prAdapter->fgIsP2PRegistered);
  711. } else {
  712. if (prAdapter->fgIsP2PRegistered)
  713. p2pRemove(prAdapter->prGlueInfo);
  714. }
  715. } while (FALSE);
  716. if (prMsgHdr)
  717. cnmMemFree(prAdapter, prMsgHdr);
  718. } /* p2pFsmRunEventNetDeviceRegister */
  719. VOID p2pFsmRunEventUpdateMgmtFrame(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  720. {
  721. P_MSG_P2P_MGMT_FRAME_UPDATE_T prP2pMgmtFrameUpdateMsg = (P_MSG_P2P_MGMT_FRAME_UPDATE_T) NULL;
  722. do {
  723. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  724. DBGLOG(P2P, TRACE, "p2pFsmRunEventUpdateMgmtFrame\n");
  725. prP2pMgmtFrameUpdateMsg = (P_MSG_P2P_MGMT_FRAME_UPDATE_T) prMsgHdr;
  726. switch (prP2pMgmtFrameUpdateMsg->eBufferType) {
  727. case ENUM_FRAME_TYPE_EXTRA_IE_BEACON:
  728. break;
  729. case ENUM_FRAME_TYPE_EXTRA_IE_ASSOC_RSP:
  730. break;
  731. case ENUM_FRAME_TYPE_EXTRA_IE_PROBE_RSP:
  732. break;
  733. case ENUM_FRAME_TYPE_PROBE_RSP_TEMPLATE:
  734. break;
  735. case ENUM_FRAME_TYPE_BEACON_TEMPLATE:
  736. break;
  737. default:
  738. break;
  739. }
  740. } while (FALSE);
  741. if (prMsgHdr)
  742. cnmMemFree(prAdapter, prMsgHdr);
  743. } /* p2pFsmRunEventUpdateMgmtFrame */
  744. VOID p2pFsmRunEventExtendListen(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  745. {
  746. P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo = NULL;
  747. struct _MSG_P2P_EXTEND_LISTEN_INTERVAL_T *prExtListenMsg = NULL;
  748. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  749. prExtListenMsg = (struct _MSG_P2P_EXTEND_LISTEN_INTERVAL_T *) prMsgHdr;
  750. prP2pDevFsmInfo = prAdapter->rWifiVar.prP2pDevFsmInfo;
  751. ASSERT_BREAK(prP2pDevFsmInfo);
  752. if (!prExtListenMsg->wait) {
  753. DBGLOG(P2P, INFO, "reset listen interval\n");
  754. prP2pDevFsmInfo->eListenExted = P2P_DEV_NOT_EXT_LISTEN;
  755. if (prMsgHdr)
  756. cnmMemFree(prAdapter, prMsgHdr);
  757. return;
  758. }
  759. if (prP2pDevFsmInfo && (prP2pDevFsmInfo->eListenExted == P2P_DEV_NOT_EXT_LISTEN)) {
  760. DBGLOG(P2P, INFO, "try to ext listen, p2p state: %d\n", prP2pDevFsmInfo->eCurrentState);
  761. if (prP2pDevFsmInfo->eCurrentState == P2P_DEV_STATE_CHNL_ON_HAND) {
  762. DBGLOG(P2P, INFO, "here to ext listen interval\n");
  763. prP2pDevFsmInfo->eListenExted = P2P_DEV_EXT_LISTEN_ING;
  764. }
  765. }
  766. if (prMsgHdr)
  767. cnmMemFree(prAdapter, prMsgHdr);
  768. } /* p2pFsmRunEventUpdateMgmtFrame */
  769. #if CFG_SUPPORT_WFD
  770. VOID p2pFsmRunEventWfdSettingUpdate(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  771. {
  772. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  773. P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T prMsgWfdCfgSettings = (P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T) NULL;
  774. /* WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; */
  775. DBGLOG(P2P, INFO, "p2pFsmRunEventWfdSettingUpdate\n");
  776. do {
  777. ASSERT_BREAK((prAdapter != NULL));
  778. if (prMsgHdr != NULL) {
  779. prMsgWfdCfgSettings = (P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T) prMsgHdr;
  780. prWfdCfgSettings = prMsgWfdCfgSettings->prWfdCfgSettings;
  781. } else {
  782. prWfdCfgSettings = &prAdapter->rWifiVar.rWfdConfigureSettings;
  783. }
  784. DBGLOG(P2P, INFO, "WFD Enalbe %x info %x state %x flag %x adv %x\n",
  785. prWfdCfgSettings->ucWfdEnable,
  786. prWfdCfgSettings->u2WfdDevInfo,
  787. (UINT_32) prWfdCfgSettings->u4WfdState,
  788. (UINT_32) prWfdCfgSettings->u4WfdFlag,
  789. (UINT_32) prWfdCfgSettings->u4WfdAdvancedFlag);
  790. if (prWfdCfgSettings->ucWfdEnable == 0)
  791. prAdapter->prGlueInfo->prP2PInfo->u2WFDIELen = 0;
  792. #if 0
  793. TODO:use chip config more easy rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  794. CMD_ID_SET_WFD_CTRL, /* ucCID */
  795. TRUE, /* fgSetQuery */
  796. FALSE, /* fgNeedResp */
  797. FALSE, /* fgIsOid */
  798. NULL, NULL, /*
  799. *pfCmdTimeoutHandler
  800. **/
  801. sizeof(WFD_CFG_SETTINGS_T), /*
  802. *u4SetQueryInfoLen
  803. **/
  804. (PUINT_8) prWfdCfgSettings, /* pucInfoBuffer
  805. **/
  806. NULL, /*
  807. *pvSetQueryBuffer
  808. **/
  809. 0 /*
  810. *u4SetQueryBufferLen
  811. **/
  812. );
  813. #endif
  814. } while (FALSE);
  815. if (prMsgHdr)
  816. cnmMemFree(prAdapter, prMsgHdr);
  817. }
  818. /* p2pFsmRunEventWfdSettingUpdate */
  819. #endif /* CFG_SUPPORT_WFD */
  820. #endif /* RunEventWfdSettingUpdate */