p2p_dev_state.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "precomp.h"
  2. BOOLEAN
  3. p2pDevStateInit_IDLE(IN P_ADAPTER_T prAdapter,
  4. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo, OUT P_ENUM_P2P_DEV_STATE_T peNextState)
  5. {
  6. BOOLEAN fgIsTransition = FALSE;
  7. do {
  8. ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo) && (peNextState != NULL));
  9. if (!LINK_IS_EMPTY(&(prChnlReqInfo->rP2pChnlReqLink))) {
  10. fgIsTransition = TRUE;
  11. *peNextState = P2P_DEV_STATE_REQING_CHANNEL;
  12. DBGLOG(P2P, INFO, "try to get the next chann\n");
  13. break;
  14. }
  15. /* Stay in IDLE state. */
  16. DBGLOG(P2P, INFO, "prepare to enter sleep in idle\n");
  17. UNSET_NET_ACTIVE(prAdapter, P2P_DEV_BSS_INDEX);
  18. nicDeactivateNetwork(prAdapter, P2P_DEV_BSS_INDEX);
  19. } while (FALSE);
  20. return fgIsTransition;
  21. } /* p2pDevStateInit_IDLE */
  22. VOID p2pDevStateAbort_IDLE(IN P_ADAPTER_T prAdapter)
  23. {
  24. /* Currently Aobrt IDLE do nothing. */
  25. } /* p2pDevStateAbort_IDLE */
  26. BOOLEAN
  27. p2pDevStateInit_REQING_CHANNEL(IN P_ADAPTER_T prAdapter,
  28. IN UINT_8 ucBssIdx,
  29. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo, OUT P_ENUM_P2P_DEV_STATE_T peNextState)
  30. {
  31. BOOLEAN fgIsTransition = FALSE;
  32. P_MSG_P2P_CHNL_REQUEST_T prP2pMsgChnlReq = (P_MSG_P2P_CHNL_REQUEST_T) NULL;
  33. P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
  34. do {
  35. ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo != NULL) && (peNextState != NULL));
  36. prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx);
  37. if (LINK_IS_EMPTY(&(prChnlReqInfo->rP2pChnlReqLink))) {
  38. /* NO Channel Request Pending. */
  39. DBGLOG(P2P, ERROR, "NO Pending Channel Request, but enter Req Channel State\n");
  40. fgIsTransition = TRUE;
  41. *peNextState = P2P_DEV_STATE_IDLE;
  42. break;
  43. }
  44. LINK_REMOVE_HEAD(&(prChnlReqInfo->rP2pChnlReqLink), prP2pMsgChnlReq, P_MSG_P2P_CHNL_REQUEST_T);
  45. ASSERT(prP2pMsgChnlReq);
  46. prChnlReqInfo->u4MaxInterval = prP2pMsgChnlReq->u4Duration;
  47. prChnlReqInfo->ucReqChnlNum = prP2pMsgChnlReq->rChannelInfo.ucChannelNum;
  48. prChnlReqInfo->eChnlSco = prP2pMsgChnlReq->eChnlSco;
  49. prChnlReqInfo->eBand = prP2pMsgChnlReq->rChannelInfo.eBand;
  50. prChnlReqInfo->u8Cookie = prP2pMsgChnlReq->u8Cookie;
  51. prChnlReqInfo->eChnlReqType = prP2pMsgChnlReq->eChnlReqType;
  52. prChnlReqInfo->eChannelWidth = prBssInfo->ucVhtChannelWidth;
  53. prChnlReqInfo->ucCenterFreqS1 = prBssInfo->ucVhtChannelFrequencyS1;
  54. prChnlReqInfo->ucCenterFreqS2 = prBssInfo->ucVhtChannelFrequencyS2;
  55. p2pFuncAcquireCh(prAdapter, ucBssIdx, prChnlReqInfo);
  56. } while (FALSE);
  57. if (prP2pMsgChnlReq)
  58. cnmMemFree(prAdapter, prP2pMsgChnlReq);
  59. return fgIsTransition;
  60. } /* p2pDevStateInit_REQING_CHANNEL */
  61. VOID
  62. p2pDevStateAbort_REQING_CHANNEL(IN P_ADAPTER_T prAdapter,
  63. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo, IN ENUM_P2P_DEV_STATE_T eNextState)
  64. {
  65. do {
  66. ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo != NULL) && (eNextState < P2P_DEV_STATE_NUM));
  67. switch (eNextState) {
  68. case P2P_DEV_STATE_IDLE:
  69. /* Channel abort case. */
  70. p2pFuncReleaseCh(prAdapter, P2P_DEV_BSS_INDEX, prChnlReqInfo);
  71. break;
  72. case P2P_DEV_STATE_CHNL_ON_HAND:
  73. /* Channel on hand case. */
  74. break;
  75. default:
  76. /* Un-expected state transition. */
  77. DBGLOG(P2P, ERROR, "Unexpected State Transition(eNextState=%d)\n", eNextState);
  78. ASSERT(FALSE);
  79. break;
  80. }
  81. } while (FALSE);
  82. } /* p2pDevStateAbort_REQING_CHANNEL */
  83. VOID
  84. p2pDevStateInit_CHNL_ON_HAND(IN P_ADAPTER_T prAdapter,
  85. IN P_BSS_INFO_T prP2pBssInfo,
  86. IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo, IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo)
  87. {
  88. do {
  89. ASSERT_BREAK((prAdapter != NULL) && (prP2pDevFsmInfo != NULL) && (prChnlReqInfo != NULL));
  90. ASSERT(prChnlReqInfo->eChnlReqType == CH_REQ_TYPE_P2P_LISTEN);
  91. prChnlReqInfo->ucOriChnlNum = prP2pBssInfo->ucPrimaryChannel;
  92. prChnlReqInfo->eOriBand = prP2pBssInfo->eBand;
  93. prChnlReqInfo->eOriChnlSco = prP2pBssInfo->eBssSCO;
  94. prP2pBssInfo->ucPrimaryChannel = prChnlReqInfo->ucReqChnlNum;
  95. prP2pBssInfo->eBand = prChnlReqInfo->eBand;
  96. prP2pBssInfo->eBssSCO = prChnlReqInfo->eChnlSco;
  97. DBGLOG(P2P, INFO, "Start channel on hand timer, Cookie: 0x%llx, Interval: %d, elistenExtend: %d\n",
  98. prChnlReqInfo->u8Cookie, prChnlReqInfo->u4MaxInterval, prP2pDevFsmInfo->eListenExted);
  99. if (prP2pDevFsmInfo->eListenExted != P2P_DEV_EXT_LISTEN_ING) {
  100. cnmTimerStartTimer(prAdapter, &(prP2pDevFsmInfo->rP2pFsmTimeoutTimer),
  101. prChnlReqInfo->u4MaxInterval);
  102. kalP2PIndicateChannelReady(prAdapter->prGlueInfo,
  103. prChnlReqInfo->u8Cookie,
  104. prChnlReqInfo->ucReqChnlNum,
  105. prChnlReqInfo->eBand, prChnlReqInfo->eChnlSco, prChnlReqInfo->u4MaxInterval);
  106. } else
  107. cnmTimerStartTimer(prAdapter, &(prP2pDevFsmInfo->rP2pFsmTimeoutTimer),
  108. (P2P_EXT_LISTEN_TIME_MS - prChnlReqInfo->u4MaxInterval));
  109. } while (FALSE);
  110. } /* p2pDevStateInit_CHNL_ON_HAND */
  111. VOID
  112. p2pDevStateAbort_CHNL_ON_HAND(IN P_ADAPTER_T prAdapter,
  113. IN P_BSS_INFO_T prP2pBssInfo,
  114. IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo,
  115. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo,
  116. IN ENUM_P2P_DEV_STATE_T eNextState)
  117. {
  118. do {
  119. ASSERT_BREAK((prAdapter != NULL) || (prChnlReqInfo != NULL));
  120. cnmTimerStopTimer(prAdapter, &(prP2pDevFsmInfo->rP2pFsmTimeoutTimer));
  121. prP2pBssInfo->ucPrimaryChannel = prChnlReqInfo->ucOriChnlNum;
  122. prP2pBssInfo->eBand = prChnlReqInfo->eOriBand;
  123. prP2pBssInfo->eBssSCO = prChnlReqInfo->eOriChnlSco;
  124. DBGLOG(P2P, INFO, "p2p state trans abort chann on hand, eListenExted: %d, eNextState: %d\n",
  125. prP2pDevFsmInfo->eListenExted, eNextState);
  126. if (prP2pDevFsmInfo->eListenExted != P2P_DEV_EXT_LISTEN_ING ||
  127. eNextState != P2P_DEV_STATE_CHNL_ON_HAND) {
  128. /* Here maybe have a bug, when it's extlistening, a new remain_on_channel
  129. was sent to driver? need to verify */
  130. prP2pDevFsmInfo->eListenExted = P2P_DEV_NOT_EXT_LISTEN;
  131. kalP2PIndicateChannelExpired(prAdapter->prGlueInfo,
  132. prChnlReqInfo->u8Cookie,
  133. prChnlReqInfo->ucReqChnlNum,
  134. prChnlReqInfo->eBand, prChnlReqInfo->eChnlSco);
  135. p2pFuncReleaseCh(prAdapter, prP2pDevFsmInfo->ucBssIndex, prChnlReqInfo);
  136. }
  137. } while (FALSE);
  138. } /* p2pDevStateAbort_CHNL_ON_HAND */
  139. VOID p2pDevStateInit_SCAN(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIndex, IN P_P2P_SCAN_REQ_INFO_T prScanReqInfo)
  140. {
  141. do {
  142. ASSERT_BREAK((prAdapter != NULL) && (prScanReqInfo != NULL));
  143. prScanReqInfo->fgIsScanRequest = TRUE;
  144. p2pFuncRequestScan(prAdapter, ucBssIndex, prScanReqInfo);
  145. } while (FALSE);
  146. } /* p2pDevStateInit_CHNL_ON_HAND */
  147. VOID p2pDevStateAbort_SCAN(IN P_ADAPTER_T prAdapter, IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo)
  148. {
  149. P_P2P_SCAN_REQ_INFO_T prScanInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  150. do {
  151. ASSERT_BREAK((prAdapter != NULL) && (prP2pDevFsmInfo != NULL));
  152. prScanInfo = &(prP2pDevFsmInfo->rScanReqInfo);
  153. p2pFuncCancelScan(prAdapter, prP2pDevFsmInfo->ucBssIndex, prScanInfo);
  154. kalP2PIndicateScanDone(prAdapter->prGlueInfo, 0xFF, prScanInfo->fgIsAbort);
  155. } while (FALSE);
  156. } /* p2pDevStateAbort_CHNL_ON_HAND */
  157. BOOLEAN
  158. p2pDevStateInit_OFF_CHNL_TX(IN P_ADAPTER_T prAdapter,
  159. IN P_P2P_DEV_FSM_INFO_T prP2pDevFsmInfo,
  160. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo,
  161. IN P_P2P_MGMT_TX_REQ_INFO_T prP2pMgmtTxInfo, OUT P_ENUM_P2P_DEV_STATE_T peNextState)
  162. {
  163. P_P2P_OFF_CHNL_TX_REQ_INFO_T prP2pOffChnlTxPkt = (P_P2P_OFF_CHNL_TX_REQ_INFO_T) NULL;
  164. BOOLEAN fgIsTransition = FALSE;
  165. do {
  166. ASSERT_BREAK((prAdapter != NULL) && (prP2pMgmtTxInfo != NULL)
  167. && (peNextState != NULL));
  168. if (!LINK_IS_EMPTY(&(prP2pMgmtTxInfo->rP2pTxReqLink))) {
  169. prP2pOffChnlTxPkt =
  170. LINK_PEEK_HEAD(&(prP2pMgmtTxInfo->rP2pTxReqLink), P2P_OFF_CHNL_TX_REQ_INFO_T, rLinkEntry);
  171. if (prP2pOffChnlTxPkt == NULL) {
  172. DBGLOG(P2P, ERROR, "Fetal Error, Link not empty but get NULL pointer.\n");
  173. ASSERT(FALSE);
  174. break;
  175. }
  176. if (prChnlReqInfo->ucReqChnlNum != prP2pOffChnlTxPkt->rChannelInfo.ucChannelNum) {
  177. prChnlReqInfo->ucReqChnlNum = prP2pOffChnlTxPkt->rChannelInfo.ucChannelNum;
  178. prChnlReqInfo->eChnlSco = prP2pOffChnlTxPkt->eChnlExt;
  179. prChnlReqInfo->eBand = prP2pOffChnlTxPkt->rChannelInfo.eBand;
  180. prChnlReqInfo->u8Cookie = 0;
  181. prChnlReqInfo->eChannelWidth = CW_20_40MHZ;
  182. prChnlReqInfo->ucCenterFreqS1 = 0;
  183. prChnlReqInfo->ucCenterFreqS2 = 0;
  184. ASSERT(prChnlReqInfo->eChnlReqType == CH_REQ_TYPE_OFFCHNL_TX);
  185. p2pFuncAcquireCh(prAdapter, prP2pDevFsmInfo->ucBssIndex, prChnlReqInfo);
  186. } else {
  187. LINK_REMOVE_HEAD(&(prP2pMgmtTxInfo->rP2pTxReqLink),
  188. prP2pOffChnlTxPkt, P_P2P_OFF_CHNL_TX_REQ_INFO_T);
  189. p2pFuncTxMgmtFrame(prAdapter,
  190. prP2pDevFsmInfo->ucBssIndex,
  191. prP2pOffChnlTxPkt->prMgmtTxMsdu, prP2pOffChnlTxPkt->fgNoneCckRate);
  192. prP2pMgmtTxInfo->prMgmtTxMsdu = prP2pOffChnlTxPkt->prMgmtTxMsdu;
  193. prP2pMgmtTxInfo->fgIsWaitRsp = prP2pOffChnlTxPkt->fgIsWaitRsp;
  194. }
  195. } else {
  196. /* Link is empty, return back to IDLE. */
  197. *peNextState = P2P_DEV_STATE_IDLE;
  198. fgIsTransition = TRUE;
  199. }
  200. } while (FALSE);
  201. return fgIsTransition;
  202. } /* p2pDevSateInit_OFF_CHNL_TX */
  203. VOID
  204. p2pDevStateAbort_OFF_CHNL_TX(IN P_ADAPTER_T prAdapter,
  205. IN P_P2P_MGMT_TX_REQ_INFO_T prP2pMgmtTxInfo,
  206. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo, IN ENUM_P2P_DEV_STATE_T eNextState)
  207. {
  208. P_P2P_OFF_CHNL_TX_REQ_INFO_T prP2pOffChnlTxPkt = (P_P2P_OFF_CHNL_TX_REQ_INFO_T) NULL;
  209. do {
  210. ASSERT_BREAK((prAdapter != NULL) && (prP2pMgmtTxInfo != NULL) && (prChnlReqInfo != NULL));
  211. if (eNextState != P2P_DEV_STATE_OFF_CHNL_TX) {
  212. while (!LINK_IS_EMPTY(&(prP2pMgmtTxInfo->rP2pTxReqLink))) {
  213. LINK_REMOVE_HEAD(&(prP2pMgmtTxInfo->rP2pTxReqLink),
  214. prP2pOffChnlTxPkt, P_P2P_OFF_CHNL_TX_REQ_INFO_T);
  215. kalP2PIndicateMgmtTxStatus(prAdapter->prGlueInfo,
  216. prP2pOffChnlTxPkt->prMgmtTxMsdu, FALSE);
  217. }
  218. p2pFuncReleaseCh(prAdapter, P2P_DEV_BSS_INDEX, prChnlReqInfo);
  219. }
  220. } while (FALSE);
  221. } /* p2pDevSateAbort_OFF_CHNL_TX */