nic_rx.c 92 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License version 2 as
  4. * published by the Free Software Foundation.
  5. *
  6. * This program is distributed in the hope that it will be useful,
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
  10. */
  11. /*******************************************************************************
  12. * C O M P I L E R F L A G S
  13. ********************************************************************************
  14. */
  15. /*******************************************************************************
  16. * E X T E R N A L R E F E R E N C E S
  17. ********************************************************************************
  18. */
  19. #include "precomp.h"
  20. #ifndef LINUX
  21. #include <limits.h>
  22. #else
  23. #include <linux/limits.h>
  24. #endif
  25. #include "gl_os.h"
  26. #include "debug.h"
  27. #include "wlan_lib.h"
  28. #include "gl_wext.h"
  29. #include <linux/can/netlink.h>
  30. #include <net/netlink.h>
  31. #include <net/cfg80211.h>
  32. #include "gl_cfg80211.h"
  33. #include "gl_vendor.h"
  34. /*******************************************************************************
  35. * C O N S T A N T S
  36. ********************************************************************************
  37. */
  38. #define RX_RESPONSE_TIMEOUT (1000)
  39. /*******************************************************************************
  40. * D A T A T Y P E S
  41. ********************************************************************************
  42. */
  43. /*******************************************************************************
  44. * P U B L I C D A T A
  45. ********************************************************************************
  46. */
  47. /*******************************************************************************
  48. * P R I V A T E D A T A
  49. ********************************************************************************
  50. */
  51. #if CFG_MGMT_FRAME_HANDLING
  52. static PROCESS_RX_MGT_FUNCTION apfnProcessRxMgtFrame[MAX_NUM_OF_FC_SUBTYPES] = {
  53. #if CFG_SUPPORT_AAA
  54. aaaFsmRunEventRxAssoc, /* subtype 0000: Association request */
  55. #else
  56. NULL, /* subtype 0000: Association request */
  57. #endif /* CFG_SUPPORT_AAA */
  58. saaFsmRunEventRxAssoc, /* subtype 0001: Association response */
  59. #if CFG_SUPPORT_AAA
  60. aaaFsmRunEventRxAssoc, /* subtype 0010: Reassociation request */
  61. #else
  62. NULL, /* subtype 0010: Reassociation request */
  63. #endif /* CFG_SUPPORT_AAA */
  64. saaFsmRunEventRxAssoc, /* subtype 0011: Reassociation response */
  65. #if (CFG_SUPPORT_ADHOC) || (CFG_SUPPORT_AAA)
  66. bssProcessProbeRequest, /* subtype 0100: Probe request */
  67. #else
  68. NULL, /* subtype 0100: Probe request */
  69. #endif /* CFG_SUPPORT_ADHOC */
  70. scanProcessBeaconAndProbeResp, /* subtype 0101: Probe response */
  71. NULL, /* subtype 0110: reserved */
  72. NULL, /* subtype 0111: reserved */
  73. scanProcessBeaconAndProbeResp, /* subtype 1000: Beacon */
  74. NULL, /* subtype 1001: ATIM */
  75. saaFsmRunEventRxDisassoc, /* subtype 1010: Disassociation */
  76. authCheckRxAuthFrameTransSeq, /* subtype 1011: Authentication */
  77. saaFsmRunEventRxDeauth, /* subtype 1100: Deauthentication */
  78. nicRxProcessActionFrame, /* subtype 1101: Action */
  79. NULL, /* subtype 1110: reserved */
  80. NULL /* subtype 1111: reserved */
  81. };
  82. #endif
  83. /*******************************************************************************
  84. * M A C R O S
  85. ********************************************************************************
  86. */
  87. /*******************************************************************************
  88. * F U N C T I O N D E C L A R A T I O N S
  89. ********************************************************************************
  90. */
  91. /*******************************************************************************
  92. * F U N C T I O N S
  93. ********************************************************************************
  94. */
  95. /*----------------------------------------------------------------------------*/
  96. /*!
  97. * @brief Initialize the RFBs
  98. *
  99. * @param prAdapter Pointer to the Adapter structure.
  100. *
  101. * @return (none)
  102. */
  103. /*----------------------------------------------------------------------------*/
  104. VOID nicRxInitialize(IN P_ADAPTER_T prAdapter)
  105. {
  106. P_RX_CTRL_T prRxCtrl;
  107. PUINT_8 pucMemHandle;
  108. P_SW_RFB_T prSwRfb = (P_SW_RFB_T) NULL;
  109. UINT_32 i;
  110. DEBUGFUNC("nicRxInitialize");
  111. ASSERT(prAdapter);
  112. prRxCtrl = &prAdapter->rRxCtrl;
  113. /* 4 <0> Clear allocated memory. */
  114. kalMemZero((PVOID) prRxCtrl->pucRxCached, prRxCtrl->u4RxCachedSize);
  115. /* 4 <1> Initialize the RFB lists */
  116. QUEUE_INITIALIZE(&prRxCtrl->rFreeSwRfbList);
  117. QUEUE_INITIALIZE(&prRxCtrl->rReceivedRfbList);
  118. QUEUE_INITIALIZE(&prRxCtrl->rIndicatedRfbList);
  119. QUEUE_INITIALIZE(&prRxCtrl->rUnInitializedRfbList);
  120. pucMemHandle = prRxCtrl->pucRxCached;
  121. for (i = CFG_RX_MAX_PKT_NUM; i != 0; i--) {
  122. prSwRfb = (P_SW_RFB_T) pucMemHandle;
  123. nicRxSetupRFB(prAdapter, prSwRfb);
  124. nicRxReturnRFB(prAdapter, prSwRfb);
  125. pucMemHandle += ALIGN_4(sizeof(SW_RFB_T));
  126. }
  127. ASSERT(prRxCtrl->rFreeSwRfbList.u4NumElem == CFG_RX_MAX_PKT_NUM);
  128. /* Check if the memory allocation consist with this initialization function */
  129. ASSERT((ULONG) (pucMemHandle - prRxCtrl->pucRxCached) == prRxCtrl->u4RxCachedSize);
  130. /* 4 <2> Clear all RX counters */
  131. RX_RESET_ALL_CNTS(prRxCtrl);
  132. #if CFG_SDIO_RX_AGG
  133. prRxCtrl->pucRxCoalescingBufPtr = prAdapter->pucCoalescingBufCached;
  134. HAL_CFG_MAX_HIF_RX_LEN_NUM(prAdapter, CFG_SDIO_MAX_RX_AGG_NUM);
  135. #else
  136. HAL_CFG_MAX_HIF_RX_LEN_NUM(prAdapter, 1);
  137. #endif
  138. #if CFG_HIF_STATISTICS
  139. prRxCtrl->u4TotalRxAccessNum = 0;
  140. prRxCtrl->u4TotalRxPacketNum = 0;
  141. #endif
  142. #if CFG_HIF_RX_STARVATION_WARNING
  143. prRxCtrl->u4QueuedCnt = 0;
  144. prRxCtrl->u4DequeuedCnt = 0;
  145. #endif
  146. } /* end of nicRxInitialize() */
  147. /*----------------------------------------------------------------------------*/
  148. /*!
  149. * @brief Uninitialize the RFBs
  150. *
  151. * @param prAdapter Pointer to the Adapter structure.
  152. *
  153. * @return (none)
  154. */
  155. /*----------------------------------------------------------------------------*/
  156. VOID nicRxUninitialize(IN P_ADAPTER_T prAdapter)
  157. {
  158. P_RX_CTRL_T prRxCtrl;
  159. P_SW_RFB_T prSwRfb = (P_SW_RFB_T) NULL;
  160. KAL_SPIN_LOCK_DECLARATION();
  161. ASSERT(prAdapter);
  162. prRxCtrl = &prAdapter->rRxCtrl;
  163. ASSERT(prRxCtrl);
  164. nicRxFlush(prAdapter);
  165. do {
  166. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  167. QUEUE_REMOVE_HEAD(&prRxCtrl->rReceivedRfbList, prSwRfb, P_SW_RFB_T);
  168. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  169. if (prSwRfb) {
  170. if (prSwRfb->pvPacket)
  171. kalPacketFree(prAdapter->prGlueInfo, prSwRfb->pvPacket);
  172. prSwRfb->pvPacket = NULL;
  173. prSwRfb->pucRecvBuff = NULL;
  174. } else {
  175. break;
  176. }
  177. } while (TRUE);
  178. do {
  179. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  180. QUEUE_REMOVE_HEAD(&prRxCtrl->rFreeSwRfbList, prSwRfb, P_SW_RFB_T);
  181. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  182. if (prSwRfb) {
  183. if (prSwRfb->pvPacket)
  184. kalPacketFree(prAdapter->prGlueInfo, prSwRfb->pvPacket);
  185. prSwRfb->pvPacket = NULL;
  186. prSwRfb->pucRecvBuff = NULL;
  187. } else {
  188. break;
  189. }
  190. } while (TRUE);
  191. do {
  192. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  193. QUEUE_REMOVE_HEAD(&prRxCtrl->rUnInitializedRfbList, prSwRfb, P_SW_RFB_T);
  194. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  195. if (prSwRfb) {
  196. if (prSwRfb->pvPacket)
  197. kalPacketFree(prAdapter->prGlueInfo, prSwRfb->pvPacket);
  198. prSwRfb->pvPacket = NULL;
  199. prSwRfb->pucRecvBuff = NULL;
  200. } else {
  201. break;
  202. }
  203. } while (TRUE);
  204. } /* end of nicRxUninitialize() */
  205. /*----------------------------------------------------------------------------*/
  206. /*!
  207. * @brief Fill RFB
  208. *
  209. * @param prAdapter pointer to the Adapter handler
  210. * @param prSWRfb specify the RFB to receive rx data
  211. *
  212. * @return (none)
  213. *
  214. */
  215. /*----------------------------------------------------------------------------*/
  216. VOID nicRxFillRFB(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb)
  217. {
  218. P_HIF_RX_HEADER_T prHifRxHdr;
  219. UINT_32 u4PktLen = 0;
  220. UINT_32 u4MacHeaderLen;
  221. UINT_32 u4HeaderOffset;
  222. DEBUGFUNC("nicRxFillRFB");
  223. ASSERT(prAdapter);
  224. ASSERT(prSwRfb);
  225. prHifRxHdr = prSwRfb->prHifRxHdr;
  226. ASSERT(prHifRxHdr);
  227. u4PktLen = prHifRxHdr->u2PacketLen;
  228. u4HeaderOffset = (UINT_32) (prHifRxHdr->ucHerderLenOffset & HIF_RX_HDR_HEADER_OFFSET_MASK);
  229. u4MacHeaderLen = (UINT_32) (prHifRxHdr->ucHerderLenOffset & HIF_RX_HDR_HEADER_LEN)
  230. >> HIF_RX_HDR_HEADER_LEN_OFFSET;
  231. /* DBGLOG(RX, TRACE, ("u4HeaderOffset = %d, u4MacHeaderLen = %d\n", */
  232. /* u4HeaderOffset, u4MacHeaderLen)); */
  233. prSwRfb->u2HeaderLen = (UINT_16) u4MacHeaderLen;
  234. prSwRfb->pvHeader = (PUINT_8) prHifRxHdr + HIF_RX_HDR_SIZE + u4HeaderOffset;
  235. prSwRfb->u2PacketLen = (UINT_16) (u4PktLen - (HIF_RX_HDR_SIZE + u4HeaderOffset));
  236. /* DBGLOG(RX, TRACE, ("Dump Rx packet, u2PacketLen = %d\n", prSwRfb->u2PacketLen)); */
  237. /* DBGLOG_MEM8(RX, TRACE, prSwRfb->pvHeader, prSwRfb->u2PacketLen); */
  238. #if 0
  239. if (prHifRxHdr->ucReorder & HIF_RX_HDR_80211_HEADER_FORMAT) {
  240. prSwRfb->u4HifRxHdrFlag |= HIF_RX_HDR_FLAG_802_11_FORMAT;
  241. DBGLOG(RX, TRACE, "HIF_RX_HDR_FLAG_802_11_FORMAT\n");
  242. }
  243. if (prHifRxHdr->ucReorder & HIF_RX_HDR_DO_REORDER) {
  244. prSwRfb->u4HifRxHdrFlag |= HIF_RX_HDR_FLAG_DO_REORDERING;
  245. DBGLOG(RX, TRACE, "HIF_RX_HDR_FLAG_DO_REORDERING\n");
  246. /* Get Seq. No and TID, Wlan Index info */
  247. if (prHifRxHdr->u2SeqNoTid & HIF_RX_HDR_BAR_FRAME) {
  248. prSwRfb->u4HifRxHdrFlag |= HIF_RX_HDR_FLAG_BAR_FRAME;
  249. DBGLOG(RX, TRACE, "HIF_RX_HDR_FLAG_BAR_FRAME\n");
  250. }
  251. prSwRfb->u2SSN = prHifRxHdr->u2SeqNoTid & HIF_RX_HDR_SEQ_NO_MASK;
  252. prSwRfb->ucTid = (UINT_8) ((prHifRxHdr->u2SeqNoTid & HIF_RX_HDR_TID_MASK)
  253. >> HIF_RX_HDR_TID_OFFSET);
  254. DBGLOG(RX, TRACE, "u2SSN = %d, ucTid = %d\n", prSwRfb->u2SSN, prSwRfb->ucTid);
  255. }
  256. if (prHifRxHdr->ucReorder & HIF_RX_HDR_WDS) {
  257. prSwRfb->u4HifRxHdrFlag |= HIF_RX_HDR_FLAG_AMP_WDS;
  258. DBGLOG(RX, TRACE, "HIF_RX_HDR_FLAG_AMP_WDS\n");
  259. }
  260. #endif
  261. }
  262. #if CFG_TCP_IP_CHKSUM_OFFLOAD || CFG_TCP_IP_CHKSUM_OFFLOAD_NDIS_60
  263. /*----------------------------------------------------------------------------*/
  264. /*!
  265. * @brief Fill checksum status in RFB
  266. *
  267. * @param prAdapter pointer to the Adapter handler
  268. * @param prSWRfb the RFB to receive rx data
  269. * @param u4TcpUdpIpCksStatus specify the Checksum status
  270. *
  271. * @return (none)
  272. *
  273. */
  274. /*----------------------------------------------------------------------------*/
  275. VOID nicRxFillChksumStatus(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb, IN UINT_32 u4TcpUdpIpCksStatus)
  276. {
  277. ASSERT(prAdapter);
  278. ASSERT(prSwRfb);
  279. if (prAdapter->u4CSUMFlags != CSUM_NOT_SUPPORTED) {
  280. if (u4TcpUdpIpCksStatus & RX_CS_TYPE_IPv4) { /* IPv4 packet */
  281. prSwRfb->aeCSUM[CSUM_TYPE_IPV6] = CSUM_RES_NONE;
  282. if (u4TcpUdpIpCksStatus & RX_CS_STATUS_IP) { /* IP packet csum failed */
  283. prSwRfb->aeCSUM[CSUM_TYPE_IPV4] = CSUM_RES_FAILED;
  284. } else {
  285. prSwRfb->aeCSUM[CSUM_TYPE_IPV4] = CSUM_RES_SUCCESS;
  286. }
  287. if (u4TcpUdpIpCksStatus & RX_CS_TYPE_TCP) { /* TCP packet */
  288. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_NONE;
  289. if (u4TcpUdpIpCksStatus & RX_CS_STATUS_TCP) { /* TCP packet csum failed */
  290. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_FAILED;
  291. } else {
  292. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_SUCCESS;
  293. }
  294. } else if (u4TcpUdpIpCksStatus & RX_CS_TYPE_UDP) { /* UDP packet */
  295. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_NONE;
  296. if (u4TcpUdpIpCksStatus & RX_CS_STATUS_UDP) { /* UDP packet csum failed */
  297. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_FAILED;
  298. } else {
  299. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_SUCCESS;
  300. }
  301. } else {
  302. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_NONE;
  303. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_NONE;
  304. }
  305. } else if (u4TcpUdpIpCksStatus & RX_CS_TYPE_IPv6) { /* IPv6 packet */
  306. prSwRfb->aeCSUM[CSUM_TYPE_IPV4] = CSUM_RES_NONE;
  307. prSwRfb->aeCSUM[CSUM_TYPE_IPV6] = CSUM_RES_SUCCESS;
  308. if (u4TcpUdpIpCksStatus & RX_CS_TYPE_TCP) { /* TCP packet */
  309. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_NONE;
  310. if (u4TcpUdpIpCksStatus & RX_CS_STATUS_TCP) { /* TCP packet csum failed */
  311. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_FAILED;
  312. } else {
  313. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_SUCCESS;
  314. }
  315. } else if (u4TcpUdpIpCksStatus & RX_CS_TYPE_UDP) { /* UDP packet */
  316. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_NONE;
  317. if (u4TcpUdpIpCksStatus & RX_CS_STATUS_UDP) { /* UDP packet csum failed */
  318. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_FAILED;
  319. } else {
  320. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_SUCCESS;
  321. }
  322. } else {
  323. prSwRfb->aeCSUM[CSUM_TYPE_UDP] = CSUM_RES_NONE;
  324. prSwRfb->aeCSUM[CSUM_TYPE_TCP] = CSUM_RES_NONE;
  325. }
  326. } else {
  327. prSwRfb->aeCSUM[CSUM_TYPE_IPV4] = CSUM_RES_NONE;
  328. prSwRfb->aeCSUM[CSUM_TYPE_IPV6] = CSUM_RES_NONE;
  329. }
  330. }
  331. }
  332. #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
  333. /*----------------------------------------------------------------------------*/
  334. /*!
  335. * @brief Process packet doesn't need to do buffer reordering
  336. *
  337. * @param prAdapter pointer to the Adapter handler
  338. * @param prSWRfb the RFB to receive rx data
  339. *
  340. * @return (none)
  341. *
  342. */
  343. /*----------------------------------------------------------------------------*/
  344. VOID nicRxProcessPktWithoutReorder(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  345. {
  346. P_RX_CTRL_T prRxCtrl;
  347. P_TX_CTRL_T prTxCtrl;
  348. BOOLEAN fgIsRetained = FALSE;
  349. UINT_32 u4CurrentRxBufferCount;
  350. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  351. BOOLEAN fgIsUninitRfb = FALSE;
  352. DEBUGFUNC("nicRxProcessPktWithoutReorder");
  353. /* DBGLOG(RX, TRACE, ("\n")); */
  354. ASSERT(prAdapter);
  355. ASSERT(prSwRfb);
  356. prRxCtrl = &prAdapter->rRxCtrl;
  357. ASSERT(prRxCtrl);
  358. prTxCtrl = &prAdapter->rTxCtrl;
  359. ASSERT(prTxCtrl);
  360. u4CurrentRxBufferCount = prRxCtrl->rFreeSwRfbList.u4NumElem;
  361. /* QM USED = $A, AVAILABLE COUNT = $B, INDICATED TO OS = $C
  362. * TOTAL = $A + $B + $C
  363. *
  364. * Case #1 (Retain)
  365. * -------------------------------------------------------
  366. * $A + $B < THRESHOLD := $A + $B + $C < THRESHOLD + $C := $TOTAL - THRESHOLD < $C
  367. * => $C used too much, retain
  368. *
  369. * Case #2 (Non-Retain)
  370. * -------------------------------------------------------
  371. * $A + $B > THRESHOLD := $A + $B + $C > THRESHOLD + $C := $TOTAL - THRESHOLD > $C
  372. * => still available for $C to use
  373. *
  374. */
  375. fgIsRetained = (((u4CurrentRxBufferCount +
  376. qmGetRxReorderQueuedBufferCount(prAdapter) +
  377. prTxCtrl->i4PendingFwdFrameCount) < CFG_RX_RETAINED_PKT_THRESHOLD) ? TRUE : FALSE);
  378. /* DBGLOG(RX, INFO, ("fgIsRetained = %d\n", fgIsRetained)); */
  379. if (kalProcessRxPacket(prAdapter->prGlueInfo,
  380. prSwRfb->pvPacket,
  381. prSwRfb->pvHeader,
  382. (UINT_32) prSwRfb->u2PacketLen, fgIsRetained, prSwRfb->aeCSUM) != WLAN_STATUS_SUCCESS) {
  383. DBGLOG(RX, ERROR, "kalProcessRxPacket return value != WLAN_STATUS_SUCCESS\n");
  384. ASSERT(0);
  385. nicRxReturnRFB(prAdapter, prSwRfb);
  386. return;
  387. }
  388. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  389. if (prStaRec) {
  390. #if CFG_ENABLE_WIFI_DIRECT
  391. if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX && prAdapter->fgIsP2PRegistered == TRUE)
  392. GLUE_SET_PKT_FLAG_P2P(prSwRfb->pvPacket);
  393. #endif
  394. #if CFG_ENABLE_BT_OVER_WIFI
  395. if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX)
  396. GLUE_SET_PKT_FLAG_PAL(prSwRfb->pvPacket);
  397. #endif
  398. /* record the count to pass to os */
  399. STATS_RX_PASS2OS_INC(prStaRec, prSwRfb);
  400. }
  401. prRxCtrl->apvIndPacket[prRxCtrl->ucNumIndPacket] = prSwRfb->pvPacket;
  402. prRxCtrl->ucNumIndPacket++;
  403. if (fgIsRetained) {
  404. prRxCtrl->apvRetainedPacket[prRxCtrl->ucNumRetainedPacket] = prSwRfb->pvPacket;
  405. prRxCtrl->ucNumRetainedPacket++;
  406. /* TODO : error handling of nicRxSetupRFB */
  407. if (nicRxSetupRFB(prAdapter, prSwRfb))
  408. fgIsUninitRfb = TRUE;
  409. nicRxReturnRFBwithUninit(prAdapter, prSwRfb, fgIsUninitRfb);
  410. } else {
  411. prSwRfb->pvPacket = NULL;
  412. prSwRfb->pucRecvBuff = NULL;
  413. nicRxReturnRFBwithUninit(prAdapter, prSwRfb, fgIsUninitRfb);
  414. }
  415. }
  416. /*----------------------------------------------------------------------------*/
  417. /*!
  418. * @brief Process forwarding data packet
  419. *
  420. * @param prAdapter pointer to the Adapter handler
  421. * @param prSWRfb the RFB to receive rx data
  422. *
  423. * @return (none)
  424. *
  425. */
  426. /*----------------------------------------------------------------------------*/
  427. VOID nicRxProcessForwardPkt(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  428. {
  429. P_MSDU_INFO_T prMsduInfo, prRetMsduInfoList;
  430. P_TX_CTRL_T prTxCtrl;
  431. P_RX_CTRL_T prRxCtrl;
  432. KAL_SPIN_LOCK_DECLARATION();
  433. DEBUGFUNC("nicRxProcessForwardPkt");
  434. ASSERT(prAdapter);
  435. ASSERT(prSwRfb);
  436. prTxCtrl = &prAdapter->rTxCtrl;
  437. prRxCtrl = &prAdapter->rRxCtrl;
  438. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  439. QUEUE_REMOVE_HEAD(&prTxCtrl->rFreeMsduInfoList, prMsduInfo, P_MSDU_INFO_T);
  440. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  441. if (prMsduInfo && kalProcessRxPacket(prAdapter->prGlueInfo,
  442. prSwRfb->pvPacket,
  443. prSwRfb->pvHeader,
  444. (UINT_32) prSwRfb->u2PacketLen,
  445. prRxCtrl->rFreeSwRfbList.u4NumElem <
  446. CFG_RX_RETAINED_PKT_THRESHOLD ? TRUE : FALSE,
  447. prSwRfb->aeCSUM) == WLAN_STATUS_SUCCESS) {
  448. prMsduInfo->eSrc = TX_PACKET_FORWARDING;
  449. /* pack into MSDU_INFO_T */
  450. nicTxFillMsduInfo(prAdapter, prMsduInfo, (P_NATIVE_PACKET) (prSwRfb->pvPacket));
  451. /* Overwrite the ucNetworkType */
  452. prMsduInfo->ucNetworkType = HIF_RX_HDR_GET_NETWORK_IDX(prSwRfb->prHifRxHdr);
  453. /* release RX buffer (to rIndicatedRfbList) */
  454. prSwRfb->pvPacket = NULL;
  455. prSwRfb->pucRecvBuff = NULL;
  456. nicRxReturnRFB(prAdapter, prSwRfb);
  457. /* increase forward frame counter */
  458. GLUE_INC_REF_CNT(prTxCtrl->i4PendingFwdFrameCount);
  459. /* send into TX queue */
  460. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_QM_TX_QUEUE);
  461. prRetMsduInfoList = qmEnqueueTxPackets(prAdapter, prMsduInfo);
  462. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_QM_TX_QUEUE);
  463. if (prRetMsduInfoList != NULL) { /* TX queue refuses queuing the packet */
  464. nicTxFreeMsduInfoPacket(prAdapter, prRetMsduInfoList);
  465. nicTxReturnMsduInfo(prAdapter, prRetMsduInfoList);
  466. }
  467. /* indicate service thread for sending */
  468. if (prTxCtrl->i4PendingFwdFrameCount > 0)
  469. kalSetEvent(prAdapter->prGlueInfo);
  470. } else /* no TX resource */
  471. nicRxReturnRFB(prAdapter, prSwRfb);
  472. }
  473. /*----------------------------------------------------------------------------*/
  474. /*!
  475. * @brief Process broadcast data packet for both host and forwarding
  476. *
  477. * @param prAdapter pointer to the Adapter handler
  478. * @param prSWRfb the RFB to receive rx data
  479. *
  480. * @return (none)
  481. *
  482. */
  483. /*----------------------------------------------------------------------------*/
  484. VOID nicRxProcessGOBroadcastPkt(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  485. {
  486. P_SW_RFB_T prSwRfbDuplicated;
  487. P_TX_CTRL_T prTxCtrl;
  488. P_RX_CTRL_T prRxCtrl;
  489. P_HIF_RX_HEADER_T prHifRxHdr;
  490. KAL_SPIN_LOCK_DECLARATION();
  491. DEBUGFUNC("nicRxProcessGOBroadcastPkt");
  492. ASSERT(prAdapter);
  493. ASSERT(prSwRfb);
  494. prTxCtrl = &prAdapter->rTxCtrl;
  495. prRxCtrl = &prAdapter->rRxCtrl;
  496. prHifRxHdr = prSwRfb->prHifRxHdr;
  497. ASSERT(prHifRxHdr);
  498. ASSERT(CFG_NUM_OF_QM_RX_PKT_NUM >= 16);
  499. if (prRxCtrl->rFreeSwRfbList.u4NumElem
  500. >= (CFG_RX_MAX_PKT_NUM - (CFG_NUM_OF_QM_RX_PKT_NUM - 16 /* Reserved for others */))) {
  501. /* 1. Duplicate SW_RFB_T */
  502. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  503. QUEUE_REMOVE_HEAD(&prRxCtrl->rFreeSwRfbList, prSwRfbDuplicated, P_SW_RFB_T);
  504. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  505. if (prSwRfbDuplicated) {
  506. kalMemCopy(prSwRfbDuplicated->pucRecvBuff,
  507. prSwRfb->pucRecvBuff, ALIGN_4(prHifRxHdr->u2PacketLen + HIF_RX_HW_APPENDED_LEN));
  508. prSwRfbDuplicated->ucPacketType = HIF_RX_PKT_TYPE_DATA;
  509. prSwRfbDuplicated->ucStaRecIdx = (UINT_8) (prHifRxHdr->ucStaRecIdx);
  510. nicRxFillRFB(prAdapter, prSwRfbDuplicated);
  511. /* 2. Modify eDst */
  512. prSwRfbDuplicated->eDst = RX_PKT_DESTINATION_FORWARD;
  513. /* 4. Forward */
  514. nicRxProcessForwardPkt(prAdapter, prSwRfbDuplicated);
  515. }
  516. } else {
  517. DBGLOG(RX, WARN, "Stop to forward BMC packet due to less free Sw Rfb %u\n",
  518. prRxCtrl->rFreeSwRfbList.u4NumElem);
  519. }
  520. /* 3. Indicate to host */
  521. prSwRfb->eDst = RX_PKT_DESTINATION_HOST;
  522. nicRxProcessPktWithoutReorder(prAdapter, prSwRfb);
  523. }
  524. /*----------------------------------------------------------------------------*/
  525. /*!
  526. * @brief Process HIF data packet
  527. *
  528. * @param prAdapter pointer to the Adapter handler
  529. * @param prSWRfb the RFB to receive rx data
  530. *
  531. * @return (none)
  532. *
  533. */
  534. /*----------------------------------------------------------------------------*/
  535. VOID nicRxProcessDataPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb)
  536. {
  537. P_RX_CTRL_T prRxCtrl;
  538. P_SW_RFB_T prRetSwRfb, prNextSwRfb;
  539. P_HIF_RX_HEADER_T prHifRxHdr;
  540. P_STA_RECORD_T prStaRec;
  541. BOOLEAN fIsDummy = FALSE;
  542. DEBUGFUNC("nicRxProcessDataPacket");
  543. /* DBGLOG(RX, TRACE, ("\n")); */
  544. ASSERT(prAdapter);
  545. ASSERT(prSwRfb);
  546. prHifRxHdr = prSwRfb->prHifRxHdr;
  547. prRxCtrl = &prAdapter->rRxCtrl;
  548. fIsDummy = (prHifRxHdr->u2PacketLen >= 12) ? FALSE : TRUE;
  549. nicRxFillRFB(prAdapter, prSwRfb);
  550. #if CFG_TCP_IP_CHKSUM_OFFLOAD || CFG_TCP_IP_CHKSUM_OFFLOAD_NDIS_60
  551. {
  552. UINT_32 u4TcpUdpIpCksStatus;
  553. u4TcpUdpIpCksStatus = *((PUINT_32) ((ULONG) prHifRxHdr + (UINT_32) (ALIGN_4(prHifRxHdr->u2PacketLen))));
  554. nicRxFillChksumStatus(prAdapter, prSwRfb, u4TcpUdpIpCksStatus);
  555. }
  556. #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
  557. prStaRec = cnmGetStaRecByIndex(prAdapter, prHifRxHdr->ucStaRecIdx);
  558. if (secCheckClassError(prAdapter, prSwRfb, prStaRec) == TRUE && prAdapter->fgTestMode == FALSE) {
  559. #if CFG_HIF_RX_STARVATION_WARNING
  560. prRxCtrl->u4QueuedCnt++;
  561. #endif
  562. prRetSwRfb = qmHandleRxPackets(prAdapter, prSwRfb);
  563. if (prRetSwRfb != NULL) {
  564. do {
  565. /* save next first */
  566. prNextSwRfb = (P_SW_RFB_T) QUEUE_GET_NEXT_ENTRY((P_QUE_ENTRY_T) prRetSwRfb);
  567. if (fIsDummy == TRUE) {
  568. nicRxReturnRFB(prAdapter, prRetSwRfb);
  569. RX_INC_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT);
  570. DBGLOG(RX, WARN, "Drop Dummy Packets");
  571. } else {
  572. switch (prRetSwRfb->eDst) {
  573. case RX_PKT_DESTINATION_HOST:
  574. #if ARP_MONITER_ENABLE
  575. if (IS_STA_IN_AIS(prStaRec))
  576. qmHandleRxArpPackets(prAdapter, prRetSwRfb);
  577. #endif
  578. nicRxProcessPktWithoutReorder(prAdapter, prRetSwRfb);
  579. break;
  580. case RX_PKT_DESTINATION_FORWARD:
  581. nicRxProcessForwardPkt(prAdapter, prRetSwRfb);
  582. break;
  583. case RX_PKT_DESTINATION_HOST_WITH_FORWARD:
  584. nicRxProcessGOBroadcastPkt(prAdapter, prRetSwRfb);
  585. break;
  586. case RX_PKT_DESTINATION_NULL:
  587. nicRxReturnRFB(prAdapter, prRetSwRfb);
  588. RX_INC_CNT(prRxCtrl, RX_DST_NULL_DROP_COUNT);
  589. RX_INC_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT);
  590. break;
  591. default:
  592. break;
  593. }
  594. }
  595. #if CFG_HIF_RX_STARVATION_WARNING
  596. prRxCtrl->u4DequeuedCnt++;
  597. #endif
  598. prRetSwRfb = prNextSwRfb;
  599. } while (prRetSwRfb);
  600. }
  601. } else {
  602. nicRxReturnRFB(prAdapter, prSwRfb);
  603. RX_INC_CNT(prRxCtrl, RX_CLASS_ERR_DROP_COUNT);
  604. RX_INC_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT);
  605. }
  606. }
  607. /*----------------------------------------------------------------------------*/
  608. /*!
  609. * @brief Process HIF event packet
  610. *
  611. * @param prAdapter pointer to the Adapter handler
  612. * @param prSWRfb the RFB to receive rx data
  613. *
  614. * @return (none)
  615. *
  616. */
  617. /*----------------------------------------------------------------------------*/
  618. UINT_8 nicRxProcessGSCNEvent(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb)
  619. {
  620. P_WIFI_EVENT_T prEvent;
  621. P_GLUE_INFO_T prGlueInfo;
  622. struct sk_buff *skb;
  623. struct wiphy *wiphy;
  624. UINT_32 real_num = 0;
  625. P_EVENT_GSCAN_SCAN_AVAILABLE_T prEventGscnAvailable;
  626. P_EVENT_GSCAN_RESULT_T prEventBuffer;
  627. P_WIFI_GSCAN_RESULT_T prEventGscnResult;
  628. INT_32 i4Status = -EINVAL;
  629. struct nlattr *attr;
  630. UINT_32 scan_id;
  631. UINT_8 scan_flag;
  632. P_EVENT_GSCAN_CAPABILITY_T prEventGscnCapbiblity;
  633. P_EVENT_GSCAN_SCAN_COMPLETE_T prEventGscnScnDone;
  634. P_WIFI_GSCAN_RESULT_T prEventGscnFullResult;
  635. P_PARAM_WIFI_GSCAN_RESULT prParamGscnFullResult;
  636. P_EVENT_GSCAN_SIGNIFICANT_CHANGE_T prEventGscnSignificantChange;
  637. P_EVENT_GSCAN_SIGNIFICANT_CHANGE_T prEventGscnGeofenceFound;
  638. P_PARAM_WIFI_GSCAN_RESULT prResults;
  639. DEBUGFUNC("nicRxProcessGSCNEvent");
  640. /* DBGLOG(RX, TRACE, ("\n")); */
  641. DBGLOG(SCN, INFO, "nicRxProcessGSCNEvent\n");
  642. ASSERT(prAdapter);
  643. ASSERT(prSwRfb);
  644. prEvent = (P_WIFI_EVENT_T) prSwRfb->pucRecvBuff;
  645. prGlueInfo = prAdapter->prGlueInfo;
  646. /* Push the data to the skb */
  647. wiphy = priv_to_wiphy(prGlueInfo);
  648. /* prGlueInfo-> */
  649. /* Event Handling */
  650. switch (prEvent->ucEID) {
  651. case EVENT_ID_GSCAN_SCAN_AVAILABLE:
  652. {
  653. DBGLOG(SCN, INFO, "EVENT_ID_GSCAN_SCAN_AVAILABLE\n");
  654. prEventGscnAvailable = (P_EVENT_GSCAN_SCAN_AVAILABLE_T) (prEvent->aucBuffer);
  655. memcpy(prEventGscnAvailable, (P_EVENT_GSCAN_SCAN_AVAILABLE_T) (prEvent->aucBuffer),
  656. sizeof(EVENT_GSCAN_SCAN_AVAILABLE_T));
  657. mtk_cfg80211_vendor_event_scan_results_available(wiphy, prGlueInfo->prDevHandler->ieee80211_ptr,
  658. prEventGscnAvailable->u2Num);
  659. }
  660. break;
  661. case EVENT_ID_GSCAN_RESULT:
  662. {
  663. DBGLOG(SCN, INFO, "EVENT_ID_GSCAN_RESULT 2\n");
  664. prEventBuffer = (P_EVENT_GSCAN_RESULT_T) (prEvent->aucBuffer);
  665. prEventGscnResult = prEventBuffer->rResult;
  666. /*
  667. the following event struct should moved to kal and use the kal api to avoid future porting effort
  668. */
  669. scan_id = prEventBuffer->u2ScanId;
  670. scan_flag = prEventBuffer->u2ScanFlags;
  671. real_num = prEventBuffer->u2NumOfResults;
  672. DBGLOG(SCN, INFO, "scan_id=%d, scan_flag =%d, real_num=%d\r\n", scan_id, scan_flag, real_num);
  673. skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(PARAM_WIFI_GSCAN_RESULT) * real_num);
  674. if (!skb) {
  675. DBGLOG(RX, TRACE, "%s allocate skb failed:%x\n", __func__, i4Status);
  676. return -ENOMEM;
  677. }
  678. attr = nla_nest_start(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS);
  679. /*NLA_PUT_U32(skb, GSCAN_ATTRIBUTE_SCAN_ID, scan_id);*/
  680. {
  681. unsigned int __tmp = scan_id;
  682. if (unlikely(nla_put(skb, GSCAN_ATTRIBUTE_SCAN_ID, sizeof(unsigned int), &__tmp) < 0))
  683. goto nla_put_failure;
  684. }
  685. /*NLA_PUT_U8(skb, GSCAN_ATTRIBUTE_SCAN_FLAGS, 1);*/
  686. {
  687. unsigned char __tmp = 1;
  688. if (unlikely(nla_put(skb, GSCAN_ATTRIBUTE_SCAN_FLAGS, sizeof(u8), &__tmp) < 0))
  689. goto nla_put_failure;
  690. }
  691. /*NLA_PUT_U32(skb, GSCAN_ATTRIBUTE_NUM_OF_RESULTS, real_num);*/
  692. {
  693. unsigned int __tmp = real_num;
  694. if (unlikely(nla_put(skb, GSCAN_ATTRIBUTE_NUM_OF_RESULTS,
  695. sizeof(unsigned int), &__tmp) < 0))
  696. goto nla_put_failure;
  697. }
  698. prResults = (P_PARAM_WIFI_GSCAN_RESULT) prEventGscnResult;
  699. if (prResults)
  700. DBGLOG(SCN, INFO, "ssid=%s, rssi=%d, channel=%d \r\n",
  701. prResults->ssid, prResults->rssi, prResults->channel);
  702. /*NLA_PUT(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS, sizeof(PARAM_WIFI_GSCAN_RESULT) * real_num,
  703. prResults);*/
  704. if (unlikely(nla_put(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS,
  705. sizeof(PARAM_WIFI_GSCAN_RESULT)*real_num, prResults) < 0))
  706. goto nla_put_failure;
  707. DBGLOG(SCN, INFO, "NLA_PUT scan results over\t");
  708. if (attr)
  709. nla_nest_end(skb, attr);
  710. /* report_events=1 */
  711. /*NLA_PUT_U8(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE, 1);*/
  712. {
  713. unsigned char __tmp = 1;
  714. if (unlikely(nla_put(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE,
  715. sizeof(unsigned int), &__tmp) < 0))
  716. goto nla_put_failure;
  717. }
  718. i4Status = cfg80211_vendor_cmd_reply(skb);
  719. skb = NULL;
  720. DBGLOG(SCN, INFO, " i4Status %d\n", i4Status);
  721. }
  722. break;
  723. case EVENT_ID_GSCAN_CAPABILITY:
  724. {
  725. DBGLOG(SCN, INFO, "EVENT_ID_GSCAN_CAPABILITY\n");
  726. prEventGscnCapbiblity = (P_EVENT_GSCAN_CAPABILITY_T) (prEvent->aucBuffer);
  727. memcpy(prEventGscnCapbiblity, (P_EVENT_GSCAN_CAPABILITY_T) (prEvent->aucBuffer),
  728. sizeof(EVENT_GSCAN_CAPABILITY_T));
  729. mtk_cfg80211_vendor_get_gscan_capabilities(wiphy, prGlueInfo->prDevHandler->ieee80211_ptr,
  730. prEventGscnCapbiblity, sizeof(EVENT_GSCAN_CAPABILITY_T));
  731. }
  732. break;
  733. case EVENT_ID_GSCAN_SCAN_COMPLETE:
  734. {
  735. DBGLOG(SCN, INFO, "EVENT_ID_GSCAN_SCAN_COMPLETE\n");
  736. prEventGscnScnDone = (P_EVENT_GSCAN_SCAN_COMPLETE_T) (prEvent->aucBuffer);
  737. memcpy(prEventGscnScnDone, (P_EVENT_GSCAN_SCAN_COMPLETE_T) (prEvent->aucBuffer),
  738. sizeof(EVENT_GSCAN_SCAN_COMPLETE_T));
  739. mtk_cfg80211_vendor_event_complete_scan(wiphy, prGlueInfo->prDevHandler->ieee80211_ptr,
  740. prEventGscnScnDone->ucScanState);
  741. }
  742. break;
  743. case EVENT_ID_GSCAN_FULL_RESULT:
  744. {
  745. DBGLOG(SCN, INFO, "EVENT_ID_GSCAN_FULL_RESULT\n");
  746. prEventGscnFullResult = kalMemAlloc(sizeof(WIFI_GSCAN_RESULT_T), VIR_MEM_TYPE);
  747. if (prEventGscnFullResult)
  748. memcpy(prEventGscnFullResult, (P_WIFI_GSCAN_RESULT_T) (prEvent->aucBuffer),
  749. sizeof(WIFI_GSCAN_RESULT_T));
  750. prParamGscnFullResult = kalMemAlloc(sizeof(PARAM_WIFI_GSCAN_RESULT), VIR_MEM_TYPE);
  751. if (prEventGscnFullResult && prParamGscnFullResult) {
  752. kalMemZero(prParamGscnFullResult, sizeof(PARAM_WIFI_GSCAN_RESULT));
  753. memcpy(prParamGscnFullResult, prEventGscnFullResult, sizeof(WIFI_GSCAN_RESULT_T));
  754. mtk_cfg80211_vendor_event_full_scan_results(wiphy,
  755. prGlueInfo->prDevHandler->ieee80211_ptr,
  756. prParamGscnFullResult,
  757. sizeof(PARAM_WIFI_GSCAN_RESULT));
  758. }
  759. }
  760. break;
  761. case EVENT_ID_GSCAN_SIGNIFICANT_CHANGE:
  762. {
  763. prEventGscnSignificantChange = (P_EVENT_GSCAN_SIGNIFICANT_CHANGE_T) (prEvent->aucBuffer);
  764. memcpy(prEventGscnSignificantChange, (P_EVENT_GSCAN_SIGNIFICANT_CHANGE_T) (prEvent->aucBuffer),
  765. sizeof(EVENT_GSCAN_SIGNIFICANT_CHANGE_T));
  766. }
  767. break;
  768. case EVENT_ID_GSCAN_GEOFENCE_FOUND:
  769. {
  770. prEventGscnGeofenceFound = (P_EVENT_GSCAN_SIGNIFICANT_CHANGE_T) (prEvent->aucBuffer);
  771. memcpy(prEventGscnGeofenceFound, (P_EVENT_GSCAN_SIGNIFICANT_CHANGE_T) (prEvent->aucBuffer),
  772. sizeof(EVENT_GSCAN_SIGNIFICANT_CHANGE_T));
  773. }
  774. break;
  775. default:
  776. DBGLOG(SCN, INFO, "not GSCN event ????\n");
  777. break;
  778. }
  779. DBGLOG(SCN, INFO, "Done with GSCN event handling\n");
  780. return real_num; /* cfg80211_vendor_cmd_reply(skb); */
  781. nla_put_failure:
  782. if (skb != NULL)
  783. kfree_skb(skb);
  784. DBGLOG(SCN, INFO, "nla_put_failure\n");
  785. return 0; /* cfg80211_vendor_cmd_reply(skb); */
  786. }
  787. /*----------------------------------------------------------------------------*/
  788. /*!
  789. * @brief Process HIF event packet
  790. *
  791. * @param prAdapter pointer to the Adapter handler
  792. * @param prSWRfb the RFB to receive rx data
  793. *
  794. * @return (none)
  795. *
  796. */
  797. /*----------------------------------------------------------------------------*/
  798. VOID nicRxProcessEventPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb)
  799. {
  800. P_CMD_INFO_T prCmdInfo;
  801. P_MSDU_INFO_T prMsduInfo;
  802. P_WIFI_EVENT_T prEvent;
  803. P_GLUE_INFO_T prGlueInfo;
  804. /*BOOLEAN fgKeepprSwRfb = FALSE;*/
  805. DEBUGFUNC("nicRxProcessEventPacket");
  806. /* DBGLOG(RX, TRACE, ("\n")); */
  807. ASSERT(prAdapter);
  808. ASSERT(prSwRfb);
  809. prEvent = (P_WIFI_EVENT_T) prSwRfb->pucRecvBuff;
  810. prGlueInfo = prAdapter->prGlueInfo;
  811. DBGLOG(RX, EVENT, "prEvent->ucEID = 0x%02x\n", prEvent->ucEID);
  812. /* Event Handling */
  813. switch (prEvent->ucEID) {
  814. case EVENT_ID_CMD_RESULT:
  815. prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
  816. if (prCmdInfo != NULL) {
  817. P_EVENT_CMD_RESULT prCmdResult;
  818. prCmdResult = (P_EVENT_CMD_RESULT) ((PUINT_8) prEvent + EVENT_HDR_SIZE);
  819. /* CMD_RESULT should be only in response to Set commands */
  820. ASSERT(prCmdInfo->fgSetQuery == FALSE || prCmdInfo->fgNeedResp == TRUE);
  821. if (prCmdResult->ucStatus == 0) { /* success */
  822. if (prCmdInfo->pfCmdDoneHandler) {
  823. prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
  824. } else if (prCmdInfo->fgIsOid == TRUE) {
  825. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0,
  826. WLAN_STATUS_SUCCESS);
  827. }
  828. } else if (prCmdResult->ucStatus == 1) { /* reject */
  829. if (prCmdInfo->fgIsOid == TRUE)
  830. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0,
  831. WLAN_STATUS_FAILURE);
  832. } else if (prCmdResult->ucStatus == 2) { /* unknown CMD */
  833. if (prCmdInfo->fgIsOid == TRUE)
  834. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0,
  835. WLAN_STATUS_NOT_SUPPORTED);
  836. }
  837. /* return prCmdInfo */
  838. cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
  839. }
  840. break;
  841. #if 0
  842. case EVENT_ID_CONNECTION_STATUS:
  843. /* OBSELETE */
  844. {
  845. P_EVENT_CONNECTION_STATUS prConnectionStatus;
  846. prConnectionStatus = (P_EVENT_CONNECTION_STATUS) (prEvent->aucBuffer);
  847. DbgPrint("RX EVENT: EVENT_ID_CONNECTION_STATUS = %d\n", prConnectionStatus->ucMediaStatus);
  848. if (prConnectionStatus->ucMediaStatus == PARAM_MEDIA_STATE_DISCONNECTED) {
  849. /* disconnected */
  850. if (kalGetMediaStateIndicated(prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED) {
  851. kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  852. prAdapter->rWlanInfo.u4SysTime = kalGetTimeTick();
  853. }
  854. } else if (prConnectionStatus->ucMediaStatus == PARAM_MEDIA_STATE_CONNECTED) {
  855. /* connected */
  856. prAdapter->rWlanInfo.u4SysTime = kalGetTimeTick();
  857. /* fill information for association result */
  858. prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen = prConnectionStatus->ucSsidLen;
  859. kalMemCopy(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
  860. prConnectionStatus->aucSsid, prConnectionStatus->ucSsidLen);
  861. kalMemCopy(prAdapter->rWlanInfo.rCurrBssId.arMacAddress,
  862. prConnectionStatus->aucBssid, MAC_ADDR_LEN);
  863. /* @FIXME */
  864. prAdapter->rWlanInfo.rCurrBssId.u4Privacy = prConnectionStatus->ucEncryptStatus;
  865. prAdapter->rWlanInfo.rCurrBssId.rRssi = 0; /* @FIXME */
  866. /* @FIXME */
  867. prAdapter->rWlanInfo.rCurrBssId.eNetworkTypeInUse = PARAM_NETWORK_TYPE_AUTOMODE;
  868. prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4BeaconPeriod
  869. = prConnectionStatus->u2BeaconPeriod;
  870. prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4ATIMWindow
  871. = prConnectionStatus->u2ATIMWindow;
  872. prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4DSConfig
  873. = prConnectionStatus->u4FreqInKHz;
  874. prAdapter->rWlanInfo.ucNetworkType = prConnectionStatus->ucNetworkType;
  875. switch (prConnectionStatus->ucInfraMode) {
  876. case 0:
  877. prAdapter->rWlanInfo.rCurrBssId.eOpMode = NET_TYPE_IBSS;
  878. break;
  879. case 1:
  880. prAdapter->rWlanInfo.rCurrBssId.eOpMode = NET_TYPE_INFRA;
  881. break;
  882. case 2:
  883. default:
  884. prAdapter->rWlanInfo.rCurrBssId.eOpMode = NET_TYPE_AUTO_SWITCH;
  885. break;
  886. }
  887. /* always indicate to OS according to MSDN (re-association/roaming) */
  888. kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_CONNECT, NULL, 0);
  889. }
  890. }
  891. break;
  892. case EVENT_ID_SCAN_RESULT:
  893. /* OBSELETE */
  894. break;
  895. #endif
  896. case EVENT_ID_RX_ADDBA:
  897. /* The FW indicates that an RX BA agreement will be established */
  898. qmHandleEventRxAddBa(prAdapter, prEvent);
  899. break;
  900. case EVENT_ID_RX_DELBA:
  901. /* The FW indicates that an RX BA agreement has been deleted */
  902. qmHandleEventRxDelBa(prAdapter, prEvent);
  903. break;
  904. case EVENT_ID_LINK_QUALITY:
  905. #if CFG_ENABLE_WIFI_DIRECT && CFG_SUPPORT_P2P_RSSI_QUERY
  906. if (prEvent->u2PacketLen == EVENT_HDR_SIZE + sizeof(EVENT_LINK_QUALITY_EX)) {
  907. P_EVENT_LINK_QUALITY_EX prLqEx = (P_EVENT_LINK_QUALITY_EX) (prEvent->aucBuffer);
  908. if (prLqEx->ucIsLQ0Rdy)
  909. nicUpdateLinkQuality(prAdapter, NETWORK_TYPE_AIS_INDEX, (P_EVENT_LINK_QUALITY) prLqEx);
  910. if (prLqEx->ucIsLQ1Rdy)
  911. nicUpdateLinkQuality(prAdapter, NETWORK_TYPE_P2P_INDEX, (P_EVENT_LINK_QUALITY) prLqEx);
  912. } else {
  913. /* For old FW, P2P may invoke link quality query, and make driver flag becone TRUE. */
  914. DBGLOG(P2P, WARN, "Old FW version, not support P2P RSSI query.\n");
  915. /* Must not use NETWORK_TYPE_P2P_INDEX, cause the structure is mismatch. */
  916. nicUpdateLinkQuality(prAdapter, NETWORK_TYPE_AIS_INDEX,
  917. (P_EVENT_LINK_QUALITY) (prEvent->aucBuffer));
  918. }
  919. #else
  920. nicUpdateLinkQuality(prAdapter, NETWORK_TYPE_AIS_INDEX, (P_EVENT_LINK_QUALITY) (prEvent->aucBuffer));
  921. #endif
  922. /* command response handling */
  923. prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
  924. if (prCmdInfo != NULL) {
  925. if (prCmdInfo->pfCmdDoneHandler)
  926. prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
  927. else if (prCmdInfo->fgIsOid)
  928. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
  929. /* return prCmdInfo */
  930. cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
  931. }
  932. #ifndef LINUX
  933. if (prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_GREATER &&
  934. prAdapter->rWlanInfo.rRssiTriggerValue >= (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi)) {
  935. prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
  936. kalIndicateStatusAndComplete(prGlueInfo,
  937. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
  938. (PVOID)&(prAdapter->rWlanInfo.rRssiTriggerValue),
  939. sizeof(PARAM_RSSI));
  940. } else if (prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_LESS
  941. && prAdapter->rWlanInfo.rRssiTriggerValue <= (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi)) {
  942. prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
  943. kalIndicateStatusAndComplete(prGlueInfo,
  944. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
  945. (PVOID)&(prAdapter->rWlanInfo.rRssiTriggerValue),
  946. sizeof(PARAM_RSSI));
  947. }
  948. #endif
  949. break;
  950. case EVENT_ID_MIC_ERR_INFO:
  951. {
  952. P_EVENT_MIC_ERR_INFO prMicError;
  953. /* P_PARAM_AUTH_EVENT_T prAuthEvent; */
  954. P_STA_RECORD_T prStaRec;
  955. DBGLOG(RSN, EVENT, "EVENT_ID_MIC_ERR_INFO\n");
  956. prMicError = (P_EVENT_MIC_ERR_INFO) (prEvent->aucBuffer);
  957. prStaRec = cnmGetStaRecByAddress(prAdapter,
  958. (UINT_8) NETWORK_TYPE_AIS_INDEX,
  959. prAdapter->rWlanInfo.rCurrBssId.arMacAddress);
  960. ASSERT(prStaRec);
  961. if (prStaRec)
  962. rsnTkipHandleMICFailure(prAdapter, prStaRec, (BOOLEAN) prMicError->u4Flags);
  963. else
  964. DBGLOG(RSN, WARN, "No STA rec!!\n");
  965. #if 0
  966. prAuthEvent = (P_PARAM_AUTH_EVENT_T) prAdapter->aucIndicationEventBuffer;
  967. /* Status type: Authentication Event */
  968. prAuthEvent->rStatus.eStatusType = ENUM_STATUS_TYPE_AUTHENTICATION;
  969. /* Authentication request */
  970. prAuthEvent->arRequest[0].u4Length = sizeof(PARAM_AUTH_REQUEST_T);
  971. kalMemCopy((PVOID) prAuthEvent->arRequest[0].arBssid,
  972. (PVOID) prAdapter->rWlanInfo.rCurrBssId.arMacAddress,
  973. /* whsu:Todo? */PARAM_MAC_ADDR_LEN);
  974. if (prMicError->u4Flags != 0)
  975. prAuthEvent->arRequest[0].u4Flags = PARAM_AUTH_REQUEST_GROUP_ERROR;
  976. else
  977. prAuthEvent->arRequest[0].u4Flags = PARAM_AUTH_REQUEST_PAIRWISE_ERROR;
  978. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  979. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
  980. (PVOID) prAuthEvent,
  981. sizeof(PARAM_STATUS_INDICATION_T) + sizeof(PARAM_AUTH_REQUEST_T));
  982. #endif
  983. }
  984. break;
  985. case EVENT_ID_ASSOC_INFO:
  986. {
  987. P_EVENT_ASSOC_INFO prAssocInfo;
  988. prAssocInfo = (P_EVENT_ASSOC_INFO) (prEvent->aucBuffer);
  989. kalHandleAssocInfo(prAdapter->prGlueInfo, prAssocInfo);
  990. }
  991. break;
  992. case EVENT_ID_802_11_PMKID:
  993. {
  994. P_PARAM_AUTH_EVENT_T prAuthEvent;
  995. PUINT_8 cp;
  996. UINT_32 u4LenOfUsedBuffer;
  997. prAuthEvent = (P_PARAM_AUTH_EVENT_T) prAdapter->aucIndicationEventBuffer;
  998. prAuthEvent->rStatus.eStatusType = ENUM_STATUS_TYPE_CANDIDATE_LIST;
  999. u4LenOfUsedBuffer = (UINT_32) (prEvent->u2PacketLen - 8);
  1000. prAuthEvent->arRequest[0].u4Length = u4LenOfUsedBuffer;
  1001. cp = (PUINT_8) &prAuthEvent->arRequest[0];
  1002. /* Status type: PMKID Candidatelist Event */
  1003. kalMemCopy(cp, (P_EVENT_PMKID_CANDIDATE_LIST_T) (prEvent->aucBuffer), prEvent->u2PacketLen - 8);
  1004. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  1005. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
  1006. (PVOID) prAuthEvent,
  1007. sizeof(PARAM_STATUS_INDICATION_T) + u4LenOfUsedBuffer);
  1008. }
  1009. break;
  1010. #if 0
  1011. case EVENT_ID_ACTIVATE_STA_REC_T:
  1012. {
  1013. P_EVENT_ACTIVATE_STA_REC_T prActivateStaRec;
  1014. prActivateStaRec = (P_EVENT_ACTIVATE_STA_REC_T) (prEvent->aucBuffer);
  1015. DbgPrint("RX EVENT: EVENT_ID_ACTIVATE_STA_REC_T Index:%d, MAC:[%pM]\n",
  1016. prActivateStaRec->ucStaRecIdx, prActivateStaRec->aucMacAddr);
  1017. qmActivateStaRec(prAdapter,
  1018. (UINT_32) prActivateStaRec->ucStaRecIdx,
  1019. ((prActivateStaRec->fgIsQoS) ? TRUE : FALSE),
  1020. prActivateStaRec->ucNetworkTypeIndex,
  1021. ((prActivateStaRec->fgIsAP) ? TRUE : FALSE), prActivateStaRec->aucMacAddr);
  1022. }
  1023. break;
  1024. case EVENT_ID_DEACTIVATE_STA_REC_T:
  1025. {
  1026. P_EVENT_DEACTIVATE_STA_REC_T prDeactivateStaRec;
  1027. prDeactivateStaRec = (P_EVENT_DEACTIVATE_STA_REC_T) (prEvent->aucBuffer);
  1028. DbgPrint("RX EVENT: EVENT_ID_DEACTIVATE_STA_REC_T Index:%d, MAC:[%pM]\n",
  1029. prDeactivateStaRec->ucStaRecIdx, prActivateStaRec->aucMacAddr);
  1030. qmDeactivateStaRec(prAdapter, prDeactivateStaRec->ucStaRecIdx);
  1031. }
  1032. break;
  1033. #endif
  1034. case EVENT_ID_SCAN_DONE:
  1035. scnEventScanDone(prAdapter, (P_EVENT_SCAN_DONE) (prEvent->aucBuffer));
  1036. break;
  1037. case EVENT_ID_TX_DONE_STATUS:
  1038. STATS_TX_PKT_DONE_INFO_DISPLAY(prAdapter, prEvent->aucBuffer);
  1039. break;
  1040. case EVENT_ID_TX_DONE:
  1041. {
  1042. P_EVENT_TX_DONE_T prTxDone;
  1043. prTxDone = (P_EVENT_TX_DONE_T) (prEvent->aucBuffer);
  1044. if (prTxDone->ucStatus)
  1045. DBGLOG(RX, INFO, "EVENT_ID_TX_DONE PacketSeq:%u ucStatus: %u SN: %u\n",
  1046. prTxDone->ucPacketSeq, prTxDone->ucStatus, prTxDone->u2SequenceNumber);
  1047. /* call related TX Done Handler */
  1048. prMsduInfo = nicGetPendingTxMsduInfo(prAdapter, prTxDone->ucPacketSeq);
  1049. #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
  1050. DBGLOG(RX, TRACE, "EVENT_ID_TX_DONE u4TimeStamp = %x u2AirDelay = %x\n",
  1051. prTxDone->au4Reserved1, prTxDone->au4Reserved2);
  1052. wnmReportTimingMeas(prAdapter, prMsduInfo->ucStaRecIndex,
  1053. prTxDone->au4Reserved1, prTxDone->au4Reserved1 + prTxDone->au4Reserved2);
  1054. #endif
  1055. if (prMsduInfo) {
  1056. prMsduInfo->pfTxDoneHandler(prAdapter, prMsduInfo,
  1057. (ENUM_TX_RESULT_CODE_T) (prTxDone->ucStatus));
  1058. cnmMgtPktFree(prAdapter, prMsduInfo);
  1059. }
  1060. }
  1061. break;
  1062. case EVENT_ID_SLEEPY_NOTIFY:
  1063. {
  1064. P_EVENT_SLEEPY_NOTIFY prEventSleepyNotify;
  1065. prEventSleepyNotify = (P_EVENT_SLEEPY_NOTIFY) (prEvent->aucBuffer);
  1066. /* DBGLOG(RX, INFO, ("ucSleepyState = %d\n", prEventSleepyNotify->ucSleepyState)); */
  1067. prAdapter->fgWiFiInSleepyState = (BOOLEAN) (prEventSleepyNotify->ucSleepyState);
  1068. }
  1069. break;
  1070. case EVENT_ID_BT_OVER_WIFI:
  1071. #if CFG_ENABLE_BT_OVER_WIFI
  1072. {
  1073. UINT_8 aucTmp[sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)];
  1074. P_EVENT_BT_OVER_WIFI prEventBtOverWifi;
  1075. P_AMPC_EVENT prBowEvent;
  1076. P_BOW_LINK_CONNECTED prBowLinkConnected;
  1077. P_BOW_LINK_DISCONNECTED prBowLinkDisconnected;
  1078. prEventBtOverWifi = (P_EVENT_BT_OVER_WIFI) (prEvent->aucBuffer);
  1079. /* construct event header */
  1080. prBowEvent = (P_AMPC_EVENT) aucTmp;
  1081. if (prEventBtOverWifi->ucLinkStatus == 0) {
  1082. /* Connection */
  1083. prBowEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_CONNECTED;
  1084. prBowEvent->rHeader.ucSeqNumber = 0;
  1085. prBowEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_CONNECTED);
  1086. /* fill event body */
  1087. prBowLinkConnected = (P_BOW_LINK_CONNECTED) (prBowEvent->aucPayload);
  1088. prBowLinkConnected->rChannel.ucChannelNum = prEventBtOverWifi->ucSelectedChannel;
  1089. kalMemZero(prBowLinkConnected->aucPeerAddress, MAC_ADDR_LEN); /* @FIXME */
  1090. kalIndicateBOWEvent(prAdapter->prGlueInfo, prBowEvent);
  1091. } else {
  1092. /* Disconnection */
  1093. prBowEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_DISCONNECTED;
  1094. prBowEvent->rHeader.ucSeqNumber = 0;
  1095. prBowEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_DISCONNECTED);
  1096. /* fill event body */
  1097. prBowLinkDisconnected = (P_BOW_LINK_DISCONNECTED) (prBowEvent->aucPayload);
  1098. prBowLinkDisconnected->ucReason = 0; /* @FIXME */
  1099. kalMemZero(prBowLinkDisconnected->aucPeerAddress, MAC_ADDR_LEN); /* @FIXME */
  1100. kalIndicateBOWEvent(prAdapter->prGlueInfo, prBowEvent);
  1101. }
  1102. }
  1103. break;
  1104. #endif
  1105. case EVENT_ID_STATISTICS:
  1106. /* buffer statistics for further query */
  1107. prAdapter->fgIsStatValid = TRUE;
  1108. prAdapter->rStatUpdateTime = kalGetTimeTick();
  1109. kalMemCopy(&prAdapter->rStatStruct, prEvent->aucBuffer, sizeof(EVENT_STATISTICS));
  1110. /* command response handling */
  1111. prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
  1112. if (prCmdInfo != NULL) {
  1113. if (prCmdInfo->pfCmdDoneHandler)
  1114. prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
  1115. else if (prCmdInfo->fgIsOid)
  1116. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
  1117. /* return prCmdInfo */
  1118. cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
  1119. }
  1120. break;
  1121. case EVENT_ID_CH_PRIVILEGE:
  1122. cnmChMngrHandleChEvent(prAdapter, prEvent);
  1123. break;
  1124. case EVENT_ID_BSS_ABSENCE_PRESENCE:
  1125. qmHandleEventBssAbsencePresence(prAdapter, prEvent);
  1126. break;
  1127. case EVENT_ID_STA_CHANGE_PS_MODE:
  1128. qmHandleEventStaChangePsMode(prAdapter, prEvent);
  1129. break;
  1130. #if CFG_ENABLE_WIFI_DIRECT
  1131. case EVENT_ID_STA_UPDATE_FREE_QUOTA:
  1132. qmHandleEventStaUpdateFreeQuota(prAdapter, prEvent);
  1133. break;
  1134. #endif
  1135. case EVENT_ID_BSS_BEACON_TIMEOUT:
  1136. if (prAdapter->fgDisBcnLostDetection == FALSE) {
  1137. P_EVENT_BSS_BEACON_TIMEOUT_T prEventBssBeaconTimeout;
  1138. prEventBssBeaconTimeout = (P_EVENT_BSS_BEACON_TIMEOUT_T) (prEvent->aucBuffer);
  1139. DBGLOG(RX, INFO, "Beacon Timeout Reason = %u\n", prEventBssBeaconTimeout->ucReason);
  1140. if (prEventBssBeaconTimeout->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
  1141. /* Request stats report before beacon timeout */
  1142. P_BSS_INFO_T prBssInfo;
  1143. P_STA_RECORD_T prStaRec;
  1144. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
  1145. if (prBssInfo) {
  1146. prStaRec = cnmGetStaRecByAddress(prAdapter,
  1147. NETWORK_TYPE_AIS_INDEX,
  1148. prBssInfo->aucBSSID);
  1149. if (prStaRec)
  1150. STATS_ENV_REPORT_DETECT(prAdapter, prStaRec->ucIndex);
  1151. }
  1152. aisBssBeaconTimeout(prAdapter);
  1153. }
  1154. #if CFG_ENABLE_WIFI_DIRECT
  1155. else if ((prAdapter->fgIsP2PRegistered) &&
  1156. (prEventBssBeaconTimeout->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX))
  1157. p2pFsmRunEventBeaconTimeout(prAdapter);
  1158. #endif
  1159. else {
  1160. DBGLOG(RX, ERROR, "EVENT_ID_BSS_BEACON_TIMEOUT: (ucNetTypeIdx = %d)\n",
  1161. prEventBssBeaconTimeout->ucNetTypeIndex);
  1162. }
  1163. }
  1164. break;
  1165. case EVENT_ID_UPDATE_NOA_PARAMS:
  1166. #if CFG_ENABLE_WIFI_DIRECT
  1167. if (prAdapter->fgIsP2PRegistered) {
  1168. P_EVENT_UPDATE_NOA_PARAMS_T prEventUpdateNoaParam;
  1169. prEventUpdateNoaParam = (P_EVENT_UPDATE_NOA_PARAMS_T) (prEvent->aucBuffer);
  1170. if (prEventUpdateNoaParam->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
  1171. p2pProcessEvent_UpdateNOAParam(prAdapter,
  1172. prEventUpdateNoaParam->ucNetTypeIndex,
  1173. prEventUpdateNoaParam);
  1174. } else {
  1175. ASSERT(0);
  1176. }
  1177. }
  1178. #else
  1179. ASSERT(0);
  1180. #endif
  1181. break;
  1182. case EVENT_ID_STA_AGING_TIMEOUT:
  1183. #if CFG_ENABLE_WIFI_DIRECT
  1184. {
  1185. if (prAdapter->fgDisStaAgingTimeoutDetection == FALSE) {
  1186. P_EVENT_STA_AGING_TIMEOUT_T prEventStaAgingTimeout;
  1187. P_STA_RECORD_T prStaRec;
  1188. P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
  1189. prEventStaAgingTimeout = (P_EVENT_STA_AGING_TIMEOUT_T) (prEvent->aucBuffer);
  1190. prStaRec = cnmGetStaRecByIndex(prAdapter, prEventStaAgingTimeout->ucStaRecIdx);
  1191. if (prStaRec == NULL)
  1192. break;
  1193. DBGLOG(RX, INFO, "EVENT_ID_STA_AGING_TIMEOUT %u %pM\n",
  1194. prEventStaAgingTimeout->ucStaRecIdx,
  1195. prStaRec->aucMacAddr);
  1196. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
  1197. bssRemoveStaRecFromClientList(prAdapter, prBssInfo, prStaRec);
  1198. /* Call False Auth */
  1199. if (prAdapter->fgIsP2PRegistered)
  1200. p2pFuncDisconnect(prAdapter, prStaRec, TRUE, REASON_CODE_DISASSOC_INACTIVITY);
  1201. }
  1202. /* gDisStaAgingTimeoutDetection */
  1203. }
  1204. #endif
  1205. break;
  1206. case EVENT_ID_AP_OBSS_STATUS:
  1207. #if CFG_ENABLE_WIFI_DIRECT
  1208. if (prAdapter->fgIsP2PRegistered)
  1209. rlmHandleObssStatusEventPkt(prAdapter, (P_EVENT_AP_OBSS_STATUS_T) prEvent->aucBuffer);
  1210. #endif
  1211. break;
  1212. case EVENT_ID_ROAMING_STATUS:
  1213. #if CFG_SUPPORT_ROAMING
  1214. {
  1215. P_ROAMING_PARAM_T prParam;
  1216. prParam = (P_ROAMING_PARAM_T) (prEvent->aucBuffer);
  1217. roamingFsmProcessEvent(prAdapter, prParam);
  1218. }
  1219. #endif /* CFG_SUPPORT_ROAMING */
  1220. break;
  1221. case EVENT_ID_SEND_DEAUTH:
  1222. {
  1223. P_WLAN_MAC_HEADER_T prWlanMacHeader;
  1224. P_STA_RECORD_T prStaRec;
  1225. prWlanMacHeader = (P_WLAN_MAC_HEADER_T) &prEvent->aucBuffer[0];
  1226. DBGLOG(RSN, INFO, "nicRx: aucAddr1: %pM, nicRx: aucAddr2: %pM\n",
  1227. prWlanMacHeader->aucAddr1, prWlanMacHeader->aucAddr2);
  1228. prStaRec = cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_AIS_INDEX, prWlanMacHeader->aucAddr2);
  1229. if (prStaRec != NULL && prStaRec->ucStaState == STA_STATE_3) {
  1230. DBGLOG(RSN, WARN, "Ignore Deauth for Rx Class 3 error!\n");
  1231. } else {
  1232. /* receive packets without StaRec */
  1233. prSwRfb->pvHeader = (P_WLAN_MAC_HEADER_T) &prEvent->aucBuffer[0];
  1234. if (WLAN_STATUS_SUCCESS == authSendDeauthFrame(prAdapter,
  1235. NULL,
  1236. prSwRfb,
  1237. REASON_CODE_CLASS_3_ERR,
  1238. (PFN_TX_DONE_HANDLER) NULL))
  1239. DBGLOG(RSN, INFO, "Send Deauth for Rx Class3 Error\n");
  1240. else
  1241. DBGLOG(RSN, WARN, "failed to send deauth for Rx class3 error\n");
  1242. }
  1243. }
  1244. break;
  1245. #if CFG_SUPPORT_RDD_TEST_MODE
  1246. case EVENT_ID_UPDATE_RDD_STATUS:
  1247. {
  1248. P_EVENT_RDD_STATUS_T prEventRddStatus;
  1249. prEventRddStatus = (P_EVENT_RDD_STATUS_T) (prEvent->aucBuffer);
  1250. prAdapter->ucRddStatus = prEventRddStatus->ucRddStatus;
  1251. }
  1252. break;
  1253. #endif
  1254. #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
  1255. case EVENT_ID_UPDATE_BWCS_STATUS:
  1256. {
  1257. P_PTA_IPC_T prEventBwcsStatus;
  1258. prEventBwcsStatus = (P_PTA_IPC_T) (prEvent->aucBuffer);
  1259. #if CFG_SUPPORT_BCM_BWCS_DEBUG
  1260. DBGLOG(RSN, INFO,
  1261. "BCM BWCS Event: %02x%02x%02x%02x\n",
  1262. prEventBwcsStatus->u.aucBTPParams[0], prEventBwcsStatus->u.aucBTPParams[1],
  1263. prEventBwcsStatus->u.aucBTPParams[2], prEventBwcsStatus->u.aucBTPParams[3]);
  1264. DBGLOG(RSN, INFO,
  1265. "BCM BWCS Event: BTPParams[0]:%02x, BTPParams[1]:%02x, BTPParams[2]:%02x, BTPParams[3]:%02x\n",
  1266. prEventBwcsStatus->u.aucBTPParams[0], prEventBwcsStatus->u.aucBTPParams[1],
  1267. prEventBwcsStatus->u.aucBTPParams[2], prEventBwcsStatus->u.aucBTPParams[3]);
  1268. #endif
  1269. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  1270. WLAN_STATUS_BWCS_UPDATE,
  1271. (PVOID) prEventBwcsStatus, sizeof(PTA_IPC_T));
  1272. }
  1273. break;
  1274. case EVENT_ID_UPDATE_BCM_DEBUG:
  1275. {
  1276. P_PTA_IPC_T prEventBwcsStatus;
  1277. prEventBwcsStatus = (P_PTA_IPC_T) (prEvent->aucBuffer);
  1278. #if CFG_SUPPORT_BCM_BWCS_DEBUG
  1279. DBGLOG(RSN, INFO,
  1280. "BCM FW status: %02x%02x%02x%02x\n",
  1281. prEventBwcsStatus->u.aucBTPParams[0], prEventBwcsStatus->u.aucBTPParams[1],
  1282. prEventBwcsStatus->u.aucBTPParams[2], prEventBwcsStatus->u.aucBTPParams[3]);
  1283. DBGLOG(RSN, INFO,
  1284. "BCM FW status: BTPParams[0]:%02x, BTPParams[1]:%02x, BTPParams[2]:%02x, BTPParams[3]:%02x\n",
  1285. prEventBwcsStatus->u.aucBTPParams[0], prEventBwcsStatus->u.aucBTPParams[1],
  1286. prEventBwcsStatus->u.aucBTPParams[2], prEventBwcsStatus->u.aucBTPParams[3];
  1287. #endif
  1288. }
  1289. break;
  1290. #endif
  1291. case EVENT_ID_DEBUG_CODE: /* only for debug */
  1292. {
  1293. UINT_32 u4CodeId;
  1294. DBGLOG(RSN, INFO, "[wlan-fw] function sequence: ");
  1295. for (u4CodeId = 0; u4CodeId < 1000; u4CodeId++)
  1296. DBGLOG(RSN, INFO, "%d ", prEvent->aucBuffer[u4CodeId]);
  1297. DBGLOG(RSN, INFO, "\n\n");
  1298. }
  1299. break;
  1300. case EVENT_ID_RFTEST_READY:
  1301. /* command response handling */
  1302. prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
  1303. if (prCmdInfo != NULL) {
  1304. if (prCmdInfo->pfCmdDoneHandler)
  1305. prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
  1306. else if (prCmdInfo->fgIsOid)
  1307. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
  1308. /* return prCmdInfo */
  1309. cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
  1310. }
  1311. break;
  1312. case EVENT_ID_GSCAN_SCAN_AVAILABLE:
  1313. case EVENT_ID_GSCAN_CAPABILITY:
  1314. case EVENT_ID_GSCAN_SCAN_COMPLETE:
  1315. case EVENT_ID_GSCAN_FULL_RESULT:
  1316. case EVENT_ID_GSCAN_SIGNIFICANT_CHANGE:
  1317. case EVENT_ID_GSCAN_GEOFENCE_FOUND:
  1318. nicRxProcessGSCNEvent(prAdapter, prSwRfb);
  1319. break;
  1320. case EVENT_ID_GSCAN_RESULT:
  1321. {
  1322. UINT_8 realnum = 0;
  1323. DBGLOG(SCN, TRACE, "nicRxProcessGSCNEvent ----->\n");
  1324. realnum = nicRxProcessGSCNEvent(prAdapter, prSwRfb);
  1325. DBGLOG(SCN, TRACE, "nicRxProcessGSCNEvent <-----\n");
  1326. #if 0 /* workaround for FW events cnt mis-match with the actual reqirements from wifi_hal */
  1327. if (g_GetResultsCmdCnt == 0) {
  1328. DBGLOG(SCN, INFO,
  1329. "FW report events more than the wifi_hal asked number, buffer the results\n");
  1330. UINT_8 i = 0;
  1331. for (i = 0; i < MAX_BUFFERED_GSCN_RESULTS; i++) {
  1332. #if 1
  1333. if (!g_arGscanResultsIndicateNumber[i]) {
  1334. DBGLOG(SCN, INFO,
  1335. "found available index %d to insert results number %d into buffer\r\n",
  1336. i, realnum);
  1337. g_arGscnResultsTempBuffer[i] = prSwRfb;
  1338. g_arGscanResultsIndicateNumber[i] = realnum;
  1339. g_GetResultsBufferedCnt++;
  1340. fgKeepprSwRfb = TRUE;
  1341. DBGLOG(SCN, INFO, "results buffered in index[%d] \r\n", i);
  1342. break;
  1343. }
  1344. #endif
  1345. }
  1346. if (i == MAX_BUFFERED_GSCN_RESULTS)
  1347. DBGLOG(SCN, INFO,
  1348. "Gscn results buffer is full(all valid), no space to buffer result\r\n");
  1349. } else if (g_GetResultsCmdCnt > 0) {
  1350. DBGLOG(SCN, INFO, "FW report events match the wifi_hal asked number\n");
  1351. g_GetResultsCmdCnt--;
  1352. } else
  1353. DBGLOG(SCN, INFO, "g_GetResultsCmdCnt < 0 ??? unexpected case\n");
  1354. #endif
  1355. /* end of workaround */
  1356. }
  1357. break;
  1358. case EVENT_ID_NLO_DONE:
  1359. prAdapter->rWifiVar.rScanInfo.fgPscnOnnning = FALSE;
  1360. DBGLOG(INIT, INFO, "EVENT_ID_NLO_DONE\n");
  1361. scnEventNloDone(prAdapter, (P_EVENT_NLO_DONE_T) (prEvent->aucBuffer));
  1362. break;
  1363. #if CFG_SUPPORT_BATCH_SCAN
  1364. case EVENT_ID_BATCH_RESULT:
  1365. DBGLOG(SCN, TRACE, "Got EVENT_ID_BATCH_RESULT");
  1366. /* command response handling */
  1367. prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
  1368. if (prCmdInfo != NULL) {
  1369. if (prCmdInfo->pfCmdDoneHandler)
  1370. prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
  1371. else if (prCmdInfo->fgIsOid)
  1372. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
  1373. /* return prCmdInfo */
  1374. cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
  1375. }
  1376. break;
  1377. #endif /* CFG_SUPPORT_BATCH_SCAN */
  1378. #if (CFG_SUPPORT_TDLS == 1)
  1379. case EVENT_ID_TDLS:
  1380. TdlsexEventHandle(prAdapter->prGlueInfo,
  1381. (UINT8 *) prEvent->aucBuffer, (UINT32) (prEvent->u2PacketLen - 8));
  1382. break;
  1383. #endif /* CFG_SUPPORT_TDLS */
  1384. #if (CFG_SUPPORT_STATISTICS == 1)
  1385. case EVENT_ID_STATS_ENV:
  1386. statsEventHandle(prAdapter->prGlueInfo,
  1387. (UINT8 *) prEvent->aucBuffer, (UINT32) (prEvent->u2PacketLen - 8));
  1388. break;
  1389. #endif /* CFG_SUPPORT_STATISTICS */
  1390. case EVENT_ID_CHECK_REORDER_BUBBLE:
  1391. qmHandleEventCheckReorderBubble(prAdapter, prEvent);
  1392. break;
  1393. case EVENT_ID_FW_LOG_ENV:
  1394. {
  1395. P_EVENT_FW_LOG_T prEventLog;
  1396. prEventLog = (P_EVENT_FW_LOG_T) (prEvent->aucBuffer);
  1397. prEventLog->log[MAX_FW_LOG_LENGTH - 1] = '\0';
  1398. DBGLOG(RX, INFO, "[F-L]%s\n", prEventLog->log);
  1399. }
  1400. break;
  1401. default:
  1402. prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
  1403. if (prCmdInfo != NULL) {
  1404. if (prCmdInfo->pfCmdDoneHandler)
  1405. prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
  1406. else if (prCmdInfo->fgIsOid)
  1407. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
  1408. /* return prCmdInfo */
  1409. cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
  1410. }
  1411. break;
  1412. }
  1413. nicRxReturnRFB(prAdapter, prSwRfb);
  1414. }
  1415. /*----------------------------------------------------------------------------*/
  1416. /*!
  1417. * @brief nicRxProcessMgmtPacket is used to dispatch management frames
  1418. * to corresponding modules
  1419. *
  1420. * @param prAdapter Pointer to the Adapter structure.
  1421. * @param prSWRfb the RFB to receive rx data
  1422. *
  1423. * @return (none)
  1424. */
  1425. /*----------------------------------------------------------------------------*/
  1426. VOID nicRxProcessMgmtPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb)
  1427. {
  1428. UINT_8 ucSubtype;
  1429. #if CFG_SUPPORT_802_11W
  1430. BOOLEAN fgMfgDrop = FALSE;
  1431. #endif
  1432. ASSERT(prAdapter);
  1433. ASSERT(prSwRfb);
  1434. nicRxFillRFB(prAdapter, prSwRfb);
  1435. ucSubtype = (*(PUINT_8) (prSwRfb->pvHeader) & MASK_FC_SUBTYPE) >> OFFSET_OF_FC_SUBTYPE;
  1436. #if 0 /* CFG_RX_PKTS_DUMP */
  1437. {
  1438. P_HIF_RX_HEADER_T prHifRxHdr;
  1439. UINT_16 u2TxFrameCtrl;
  1440. prHifRxHdr = prSwRfb->prHifRxHdr;
  1441. u2TxFrameCtrl = (*(PUINT_8) (prSwRfb->pvHeader) & MASK_FRAME_TYPE);
  1442. /* if (prAdapter->rRxCtrl.u4RxPktsDumpTypeMask & BIT(HIF_RX_PKT_TYPE_MANAGEMENT)) { */
  1443. /* if (u2TxFrameCtrl == MAC_FRAME_BEACON || */
  1444. /* u2TxFrameCtrl == MAC_FRAME_PROBE_RSP) { */
  1445. DBGLOG(RX, INFO, "QM RX MGT: net %u sta idx %u wlan idx %u ssn %u ptype %u subtype %u 11 %u\n",
  1446. (UINT_32) HIF_RX_HDR_GET_NETWORK_IDX(prHifRxHdr), prHifRxHdr->ucStaRecIdx,
  1447. prSwRfb->ucWlanIdx, (UINT_32) HIF_RX_HDR_GET_SN(prHifRxHdr),/* The new SN of the frame */
  1448. prSwRfb->ucPacketType, ucSubtype, HIF_RX_HDR_GET_80211_FLAG(prHifRxHdr));
  1449. /* DBGLOG_MEM8(SW4, TRACE, (PUINT_8)prSwRfb->pvHeader, prSwRfb->u2PacketLen); */
  1450. /* } */
  1451. /* } */
  1452. }
  1453. #endif
  1454. if ((prAdapter->fgTestMode == FALSE) && (prAdapter->prGlueInfo->fgIsRegistered == TRUE)) {
  1455. #if CFG_MGMT_FRAME_HANDLING
  1456. #if CFG_SUPPORT_802_11W
  1457. fgMfgDrop = rsnCheckRxMgmt(prAdapter, prSwRfb, ucSubtype);
  1458. if (fgMfgDrop) {
  1459. #if DBG
  1460. LOG_FUNC("QM RX MGT: Drop Unprotected Mgmt frame!!!\n");
  1461. #endif
  1462. nicRxReturnRFB(prAdapter, prSwRfb);
  1463. RX_INC_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT);
  1464. return;
  1465. }
  1466. #endif
  1467. if (apfnProcessRxMgtFrame[ucSubtype]) {
  1468. switch (apfnProcessRxMgtFrame[ucSubtype] (prAdapter, prSwRfb)) {
  1469. case WLAN_STATUS_PENDING:
  1470. return;
  1471. case WLAN_STATUS_SUCCESS:
  1472. case WLAN_STATUS_FAILURE:
  1473. break;
  1474. default:
  1475. DBGLOG(RX, WARN,
  1476. "Unexpected MMPDU(0x%02X) returned with abnormal status\n", ucSubtype);
  1477. break;
  1478. }
  1479. }
  1480. #endif
  1481. }
  1482. nicRxReturnRFB(prAdapter, prSwRfb);
  1483. }
  1484. #if CFG_SUPPORT_WAKEUP_REASON_DEBUG
  1485. static VOID nicRxCheckWakeupReason(P_SW_RFB_T prSwRfb)
  1486. {
  1487. PUINT_8 pvHeader = NULL;
  1488. P_HIF_RX_HEADER_T prHifRxHdr;
  1489. UINT_16 u2PktLen = 0;
  1490. UINT_32 u4HeaderOffset;
  1491. if (!prSwRfb)
  1492. return;
  1493. prHifRxHdr = prSwRfb->prHifRxHdr;
  1494. if (!prHifRxHdr)
  1495. return;
  1496. switch (prSwRfb->ucPacketType) {
  1497. case HIF_RX_PKT_TYPE_DATA:
  1498. {
  1499. UINT_16 u2Temp = 0;
  1500. if (HIF_RX_HDR_GET_BAR_FLAG(prHifRxHdr)) {
  1501. DBGLOG(RX, INFO, "BAR frame[SSN:%d, TID:%d] wakeup host\n",
  1502. (UINT_16)HIF_RX_HDR_GET_SN(prHifRxHdr), (UINT_8)HIF_RX_HDR_GET_TID(prHifRxHdr));
  1503. break;
  1504. }
  1505. u4HeaderOffset = (UINT_32)(prHifRxHdr->ucHerderLenOffset & HIF_RX_HDR_HEADER_OFFSET_MASK);
  1506. pvHeader = (PUINT_8)prHifRxHdr + HIF_RX_HDR_SIZE + u4HeaderOffset;
  1507. u2PktLen = (UINT_16)(prHifRxHdr->u2PacketLen - (HIF_RX_HDR_SIZE + u4HeaderOffset));
  1508. if (!pvHeader) {
  1509. DBGLOG(RX, ERROR, "data packet but pvHeader is NULL!\n");
  1510. break;
  1511. }
  1512. u2Temp = (pvHeader[ETH_TYPE_LEN_OFFSET] << 8) | (pvHeader[ETH_TYPE_LEN_OFFSET + 1]);
  1513. switch (u2Temp) {
  1514. case ETH_P_IPV4:
  1515. u2Temp = *(UINT_16 *) &pvHeader[ETH_HLEN + 4];
  1516. DBGLOG(RX, INFO, "IP Packet from:%d.%d.%d.%d, IP ID 0x%04x wakeup host\n",
  1517. pvHeader[ETH_HLEN + 12], pvHeader[ETH_HLEN + 13],
  1518. pvHeader[ETH_HLEN + 14], pvHeader[ETH_HLEN + 15], u2Temp);
  1519. break;
  1520. case ETH_P_1X:
  1521. case ETH_P_PRE_1X:
  1522. #if CFG_SUPPORT_WAPI
  1523. case ETH_WPI_1X:
  1524. #endif
  1525. case ETH_P_AARP:
  1526. case ETH_P_IPV6:
  1527. case ETH_P_IPX:
  1528. case 0x8100: /* VLAN */
  1529. case 0x890d: /* TDLS */
  1530. DBGLOG(RX, INFO, "Data Packet, EthType 0x%04x wakeup host\n", u2Temp);
  1531. break;
  1532. default:
  1533. DBGLOG(RX, WARN, "maybe abnormal data packet, EthType 0x%04x wakeup host, dump it\n",
  1534. u2Temp);
  1535. DBGLOG_MEM8(RX, INFO, pvHeader, u2PktLen > 50 ? 50:u2PacketLen);
  1536. break;
  1537. }
  1538. break;
  1539. }
  1540. case HIF_RX_PKT_TYPE_EVENT:
  1541. {
  1542. P_WIFI_EVENT_T prEvent = (P_WIFI_EVENT_T) prSwRfb->pucRecvBuff;
  1543. DBGLOG(RX, INFO, "Event 0x%02x wakeup host\n", prEvent->ucEID);
  1544. break;
  1545. }
  1546. case HIF_RX_PKT_TYPE_MANAGEMENT:
  1547. {
  1548. UINT_8 ucSubtype;
  1549. P_WLAN_MAC_MGMT_HEADER_T prWlanMgmtHeader;
  1550. u4HeaderOffset = (UINT_32)(prHifRxHdr->ucHerderLenOffset & HIF_RX_HDR_HEADER_OFFSET_MASK);
  1551. pvHeader = (PUINT_8)prHifRxHdr + HIF_RX_HDR_SIZE + u4HeaderOffset;
  1552. if (!pvHeader) {
  1553. DBGLOG(RX, ERROR, "Mgmt Frame but pvHeader is NULL!\n");
  1554. break;
  1555. }
  1556. prWlanMgmtHeader = (P_WLAN_MAC_MGMT_HEADER_T)pvHeader;
  1557. ucSubtype = (prWlanMgmtHeader->u2FrameCtrl & MASK_FC_SUBTYPE) >>
  1558. OFFSET_OF_FC_SUBTYPE;
  1559. DBGLOG(RX, INFO, "MGMT frame subtype: %d SeqCtrl %d wakeup host\n",
  1560. ucSubtype, prWlanMgmtHeader->u2SeqCtrl);
  1561. break;
  1562. }
  1563. default:
  1564. DBGLOG(RX, WARN, "Unknown Packet %d wakeup host\n", prSwRfb->ucPacketType);
  1565. break;
  1566. }
  1567. }
  1568. #endif
  1569. /*----------------------------------------------------------------------------*/
  1570. /*!
  1571. * @brief nicProcessRFBs is used to process RFBs in the rReceivedRFBList queue.
  1572. *
  1573. * @param prAdapter Pointer to the Adapter structure.
  1574. *
  1575. * @return (none)
  1576. */
  1577. /*----------------------------------------------------------------------------*/
  1578. VOID nicRxProcessRFBs(IN P_ADAPTER_T prAdapter)
  1579. {
  1580. P_RX_CTRL_T prRxCtrl;
  1581. P_SW_RFB_T prSwRfb = (P_SW_RFB_T) NULL;
  1582. KAL_SPIN_LOCK_DECLARATION();
  1583. DEBUGFUNC("nicRxProcessRFBs");
  1584. ASSERT(prAdapter);
  1585. prRxCtrl = &prAdapter->rRxCtrl;
  1586. ASSERT(prRxCtrl);
  1587. prRxCtrl->ucNumIndPacket = 0;
  1588. prRxCtrl->ucNumRetainedPacket = 0;
  1589. do {
  1590. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1591. QUEUE_REMOVE_HEAD(&prRxCtrl->rReceivedRfbList, prSwRfb, P_SW_RFB_T);
  1592. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1593. if (prSwRfb) {
  1594. #if CFG_SUPPORT_WAKEUP_REASON_DEBUG
  1595. if (kalIsWakeupByWlan(prAdapter))
  1596. nicRxCheckWakeupReason(prSwRfb);
  1597. #endif
  1598. switch (prSwRfb->ucPacketType) {
  1599. case HIF_RX_PKT_TYPE_DATA:
  1600. nicRxProcessDataPacket(prAdapter, prSwRfb);
  1601. break;
  1602. case HIF_RX_PKT_TYPE_EVENT:
  1603. nicRxProcessEventPacket(prAdapter, prSwRfb);
  1604. break;
  1605. case HIF_RX_PKT_TYPE_TX_LOOPBACK:
  1606. #if (CONF_HIF_LOOPBACK_AUTO == 1)
  1607. {
  1608. kalDevLoopbkRxHandle(prAdapter, prSwRfb);
  1609. nicRxReturnRFB(prAdapter, prSwRfb);
  1610. }
  1611. #else
  1612. DBGLOG(RX, ERROR, "ucPacketType = %d\n", prSwRfb->ucPacketType);
  1613. #endif /* CONF_HIF_LOOPBACK_AUTO */
  1614. break;
  1615. case HIF_RX_PKT_TYPE_MANAGEMENT:
  1616. nicRxProcessMgmtPacket(prAdapter, prSwRfb);
  1617. break;
  1618. default:
  1619. RX_INC_CNT(prRxCtrl, RX_TYPE_ERR_DROP_COUNT);
  1620. RX_INC_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT);
  1621. DBGLOG(RX, ERROR, "ucPacketType = %d\n", prSwRfb->ucPacketType);
  1622. nicRxReturnRFB(prAdapter, prSwRfb); /* need to free it */
  1623. break;
  1624. }
  1625. } else {
  1626. break;
  1627. }
  1628. } while (TRUE);
  1629. if (prRxCtrl->ucNumIndPacket > 0) {
  1630. RX_ADD_CNT(prRxCtrl, RX_DATA_INDICATION_COUNT, prRxCtrl->ucNumIndPacket);
  1631. RX_ADD_CNT(prRxCtrl, RX_DATA_RETAINED_COUNT, prRxCtrl->ucNumRetainedPacket);
  1632. /* DBGLOG(RX, INFO, ("%d packets indicated, Retained cnt = %d\n", */
  1633. /* prRxCtrl->ucNumIndPacket, prRxCtrl->ucNumRetainedPacket)); */
  1634. #if CFG_NATIVE_802_11
  1635. kalRxIndicatePkts(prAdapter->prGlueInfo, (UINT_32) prRxCtrl->ucNumIndPacket,
  1636. (UINT_32) prRxCtrl->ucNumRetainedPacket);
  1637. #else
  1638. kalRxIndicatePkts(prAdapter->prGlueInfo, prRxCtrl->apvIndPacket, (UINT_32) prRxCtrl->ucNumIndPacket);
  1639. #endif
  1640. }
  1641. } /* end of nicRxProcessRFBs() */
  1642. #if !CFG_SDIO_INTR_ENHANCE
  1643. /*----------------------------------------------------------------------------*/
  1644. /*!
  1645. * @brief Read the rx data from data port and setup RFB
  1646. *
  1647. * @param prAdapter pointer to the Adapter handler
  1648. * @param prSWRfb the RFB to receive rx data
  1649. *
  1650. * @retval WLAN_STATUS_SUCCESS: SUCCESS
  1651. * @retval WLAN_STATUS_FAILURE: FAILURE
  1652. *
  1653. */
  1654. /*----------------------------------------------------------------------------*/
  1655. WLAN_STATUS nicRxReadBuffer(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb)
  1656. {
  1657. P_RX_CTRL_T prRxCtrl;
  1658. PUINT_8 pucBuf;
  1659. P_HIF_RX_HEADER_T prHifRxHdr;
  1660. UINT_32 u4PktLen = 0, u4ReadBytes;
  1661. WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
  1662. BOOLEAN fgResult = TRUE;
  1663. UINT_32 u4RegValue;
  1664. UINT_32 rxNum;
  1665. DEBUGFUNC("nicRxReadBuffer");
  1666. ASSERT(prAdapter);
  1667. ASSERT(prSwRfb);
  1668. prRxCtrl = &prAdapter->rRxCtrl;
  1669. ASSERT(prRxCtrl);
  1670. pucBuf = prSwRfb->pucRecvBuff;
  1671. prHifRxHdr = prSwRfb->prHifRxHdr;
  1672. ASSERT(pucBuf);
  1673. DBGLOG(RX, TRACE, "pucBuf= 0x%x, prHifRxHdr= 0x%x\n", pucBuf, prHifRxHdr);
  1674. do {
  1675. /* Read the RFB DW length and packet length */
  1676. HAL_MCR_RD(prAdapter, MCR_WRPLR, &u4RegValue);
  1677. if (!fgResult) {
  1678. DBGLOG(RX, ERROR, "Read RX Packet Lentgh Error\n");
  1679. return WLAN_STATUS_FAILURE;
  1680. }
  1681. /* 20091021 move the line to get the HIF RX header (for RX0/1) */
  1682. if (u4RegValue == 0) {
  1683. DBGLOG(RX, ERROR, "No RX packet\n");
  1684. return WLAN_STATUS_FAILURE;
  1685. }
  1686. u4PktLen = u4RegValue & BITS(0, 15);
  1687. if (u4PktLen != 0) {
  1688. rxNum = 0;
  1689. } else {
  1690. rxNum = 1;
  1691. u4PktLen = (u4RegValue & BITS(16, 31)) >> 16;
  1692. }
  1693. DBGLOG(RX, TRACE, "RX%d: u4PktLen = %d\n", rxNum, u4PktLen);
  1694. /* 4 <4> Read Entire RFB and packet, include HW appended DW (Checksum Status) */
  1695. u4ReadBytes = ALIGN_4(u4PktLen) + 4;
  1696. HAL_READ_RX_PORT(prAdapter, rxNum, u4ReadBytes, pucBuf, CFG_RX_MAX_PKT_SIZE);
  1697. /* 20091021 move the line to get the HIF RX header */
  1698. /* u4PktLen = (UINT_32)prHifRxHdr->u2PacketLen; */
  1699. if (u4PktLen != (UINT_32) prHifRxHdr->u2PacketLen) {
  1700. DBGLOG(RX, ERROR, "Read u4PktLen = %d, prHifRxHdr->u2PacketLen: %d\n",
  1701. u4PktLen, prHifRxHdr->u2PacketLen);
  1702. #if DBG
  1703. dumpMemory8((PUINT_8) prHifRxHdr,
  1704. (prHifRxHdr->u2PacketLen > 4096) ? 4096 : prHifRxHdr->u2PacketLen);
  1705. #endif
  1706. ASSERT(0);
  1707. }
  1708. /* u4PktLen is byte unit, not inlude HW appended DW */
  1709. prSwRfb->ucPacketType = (UINT_8) (prHifRxHdr->u2PacketType & HIF_RX_HDR_PACKET_TYPE_MASK);
  1710. DBGLOG(RX, TRACE, "ucPacketType = %d\n", prSwRfb->ucPacketType);
  1711. prSwRfb->ucStaRecIdx = (UINT_8) (prHifRxHdr->ucStaRecIdx);
  1712. /* fgResult will be updated in MACRO */
  1713. if (!fgResult)
  1714. return WLAN_STATUS_FAILURE;
  1715. DBGLOG(RX, TRACE, "Dump RX buffer, length = 0x%x\n", u4ReadBytes);
  1716. DBGLOG_MEM8(RX, TRACE, pucBuf, u4ReadBytes);
  1717. } while (FALSE);
  1718. return u4Status;
  1719. }
  1720. /*----------------------------------------------------------------------------*/
  1721. /*!
  1722. * @brief Read frames from the data port, fill RFB
  1723. * and put each frame into the rReceivedRFBList queue.
  1724. *
  1725. * @param prAdapter Pointer to the Adapter structure.
  1726. *
  1727. * @return (none)
  1728. */
  1729. /*----------------------------------------------------------------------------*/
  1730. VOID nicRxReceiveRFBs(IN P_ADAPTER_T prAdapter)
  1731. {
  1732. P_RX_CTRL_T prRxCtrl;
  1733. P_SW_RFB_T prSwRfb = (P_SW_RFB_T) NULL;
  1734. P_HIF_RX_HEADER_T prHifRxHdr;
  1735. UINT_32 u4HwAppendDW;
  1736. KAL_SPIN_LOCK_DECLARATION();
  1737. DEBUGFUNC("nicRxReceiveRFBs");
  1738. ASSERT(prAdapter);
  1739. prRxCtrl = &prAdapter->rRxCtrl;
  1740. ASSERT(prRxCtrl);
  1741. do {
  1742. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1743. QUEUE_REMOVE_HEAD(&prRxCtrl->rFreeSwRfbList, prSwRfb, P_SW_RFB_T);
  1744. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1745. if (!prSwRfb) {
  1746. DBGLOG(RX, TRACE, "No More RFB\n");
  1747. break;
  1748. }
  1749. /* need to consider */
  1750. if (nicRxReadBuffer(prAdapter, prSwRfb) == WLAN_STATUS_FAILURE) {
  1751. DBGLOG(RX, TRACE, "halRxFillRFB failed\n");
  1752. nicRxReturnRFB(prAdapter, prSwRfb);
  1753. break;
  1754. }
  1755. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1756. QUEUE_INSERT_TAIL(&prRxCtrl->rReceivedRfbList, &prSwRfb->rQueEntry);
  1757. RX_INC_CNT(prRxCtrl, RX_MPDU_TOTAL_COUNT);
  1758. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1759. prHifRxHdr = prSwRfb->prHifRxHdr;
  1760. u4HwAppendDW = *((PUINT_32) ((ULONG) prHifRxHdr + (UINT_32) (ALIGN_4(prHifRxHdr->u2PacketLen))));
  1761. DBGLOG(RX, TRACE, "u4HwAppendDW = 0x%x\n", u4HwAppendDW);
  1762. DBGLOG(RX, TRACE, "u2PacketLen = 0x%x\n", prHifRxHdr->u2PacketLen);
  1763. } while (FALSE); /* while (RX_STATUS_TEST_MORE_FLAG(u4HwAppendDW)); */
  1764. return;
  1765. } /* end of nicReceiveRFBs() */
  1766. #else
  1767. /*----------------------------------------------------------------------------*/
  1768. /*!
  1769. * @brief Read frames from the data port, fill RFB
  1770. * and put each frame into the rReceivedRFBList queue.
  1771. *
  1772. * @param prAdapter Pointer to the Adapter structure.
  1773. * @param u4DataPort Specify which port to read
  1774. * @param u2RxLength Specify to the the rx packet length in Byte.
  1775. * @param prSwRfb the RFB to receive rx data.
  1776. *
  1777. * @return (none)
  1778. */
  1779. /*----------------------------------------------------------------------------*/
  1780. WLAN_STATUS
  1781. nicRxEnhanceReadBuffer(IN P_ADAPTER_T prAdapter,
  1782. IN UINT_32 u4DataPort, IN UINT_16 u2RxLength, IN OUT P_SW_RFB_T prSwRfb)
  1783. {
  1784. P_RX_CTRL_T prRxCtrl;
  1785. PUINT_8 pucBuf;
  1786. P_HIF_RX_HEADER_T prHifRxHdr;
  1787. UINT_32 u4PktLen = 0;
  1788. WLAN_STATUS u4Status = WLAN_STATUS_FAILURE;
  1789. BOOLEAN fgResult = TRUE;
  1790. DEBUGFUNC("nicRxEnhanceReadBuffer");
  1791. ASSERT(prAdapter);
  1792. ASSERT(prSwRfb);
  1793. prRxCtrl = &prAdapter->rRxCtrl;
  1794. ASSERT(prRxCtrl);
  1795. pucBuf = prSwRfb->pucRecvBuff;
  1796. ASSERT(pucBuf);
  1797. prHifRxHdr = prSwRfb->prHifRxHdr;
  1798. ASSERT(prHifRxHdr);
  1799. /* DBGLOG(RX, TRACE, ("u2RxLength = %d\n", u2RxLength)); */
  1800. do {
  1801. /* 4 <1> Read RFB frame from MCR_WRDR0, include HW appended DW */
  1802. HAL_READ_RX_PORT(prAdapter,
  1803. u4DataPort, ALIGN_4(u2RxLength + HIF_RX_HW_APPENDED_LEN), pucBuf, CFG_RX_MAX_PKT_SIZE);
  1804. if (!fgResult) {
  1805. DBGLOG(RX, ERROR, "Read RX Packet Lentgh Error\n");
  1806. break;
  1807. }
  1808. u4PktLen = (UINT_32) (prHifRxHdr->u2PacketLen);
  1809. /* DBGLOG(RX, TRACE, ("u4PktLen = %d\n", u4PktLen)); */
  1810. prSwRfb->ucPacketType = (UINT_8) (prHifRxHdr->u2PacketType & HIF_RX_HDR_PACKET_TYPE_MASK);
  1811. /* DBGLOG(RX, TRACE, ("ucPacketType = %d\n", prSwRfb->ucPacketType)); */
  1812. prSwRfb->ucStaRecIdx = (UINT_8) (prHifRxHdr->ucStaRecIdx);
  1813. /* 4 <2> if the RFB dw size or packet size is zero */
  1814. if (u4PktLen == 0) {
  1815. DBGLOG(RX, ERROR, "Packet Length = %u\n", u4PktLen);
  1816. ASSERT(0);
  1817. break;
  1818. }
  1819. /* 4 <3> if the packet is too large or too small */
  1820. if (u4PktLen > CFG_RX_MAX_PKT_SIZE) {
  1821. DBGLOG(RX, TRACE, "Read RX Packet Lentgh Error (%u)\n", u4PktLen);
  1822. ASSERT(0);
  1823. break;
  1824. }
  1825. u4Status = WLAN_STATUS_SUCCESS;
  1826. } while (FALSE);
  1827. DBGLOG_MEM8(RX, TRACE, pucBuf, ALIGN_4(u2RxLength + HIF_RX_HW_APPENDED_LEN));
  1828. return u4Status;
  1829. }
  1830. /*----------------------------------------------------------------------------*/
  1831. /*!
  1832. * @brief Read frames from the data port for SDIO
  1833. * I/F, fill RFB and put each frame into the rReceivedRFBList queue.
  1834. *
  1835. * @param prAdapter Pointer to the Adapter structure.
  1836. *
  1837. * @return (none)
  1838. */
  1839. /*----------------------------------------------------------------------------*/
  1840. VOID nicRxSDIOReceiveRFBs(IN P_ADAPTER_T prAdapter)
  1841. {
  1842. P_SDIO_CTRL_T prSDIOCtrl;
  1843. P_RX_CTRL_T prRxCtrl;
  1844. P_SW_RFB_T prSwRfb = (P_SW_RFB_T) NULL;
  1845. UINT_32 i, rxNum;
  1846. UINT_16 u2RxPktNum, u2RxLength = 0, u2Tmp = 0;
  1847. KAL_SPIN_LOCK_DECLARATION();
  1848. DEBUGFUNC("nicRxSDIOReceiveRFBs");
  1849. ASSERT(prAdapter);
  1850. prSDIOCtrl = prAdapter->prSDIOCtrl;
  1851. ASSERT(prSDIOCtrl);
  1852. prRxCtrl = &prAdapter->rRxCtrl;
  1853. ASSERT(prRxCtrl);
  1854. for (rxNum = 0; rxNum < 2; rxNum++) {
  1855. u2RxPktNum =
  1856. (rxNum == 0 ? prSDIOCtrl->rRxInfo.u.u2NumValidRx0Len : prSDIOCtrl->rRxInfo.u.u2NumValidRx1Len);
  1857. if (u2RxPktNum == 0)
  1858. continue;
  1859. for (i = 0; i < u2RxPktNum; i++) {
  1860. if (rxNum == 0) {
  1861. /* HAL_READ_RX_LENGTH */
  1862. HAL_READ_RX_LENGTH(prAdapter, &u2RxLength, &u2Tmp);
  1863. } else if (rxNum == 1) {
  1864. /* HAL_READ_RX_LENGTH */
  1865. HAL_READ_RX_LENGTH(prAdapter, &u2Tmp, &u2RxLength);
  1866. }
  1867. if (!u2RxLength)
  1868. break;
  1869. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1870. QUEUE_REMOVE_HEAD(&prRxCtrl->rFreeSwRfbList, prSwRfb, P_SW_RFB_T);
  1871. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1872. if (!prSwRfb) {
  1873. DBGLOG(RX, TRACE, "No More RFB\n");
  1874. break;
  1875. }
  1876. ASSERT(prSwRfb);
  1877. if (nicRxEnhanceReadBuffer(prAdapter, rxNum, u2RxLength, prSwRfb) == WLAN_STATUS_FAILURE) {
  1878. DBGLOG(RX, TRACE, "nicRxEnhanceRxReadBuffer failed\n");
  1879. nicRxReturnRFB(prAdapter, prSwRfb);
  1880. break;
  1881. }
  1882. /* prSDIOCtrl->au4RxLength[i] = 0; */
  1883. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1884. QUEUE_INSERT_TAIL(&prRxCtrl->rReceivedRfbList, &prSwRfb->rQueEntry);
  1885. RX_INC_CNT(prRxCtrl, RX_MPDU_TOTAL_COUNT);
  1886. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  1887. }
  1888. }
  1889. prSDIOCtrl->rRxInfo.u.u2NumValidRx0Len = 0;
  1890. prSDIOCtrl->rRxInfo.u.u2NumValidRx1Len = 0;
  1891. } /* end of nicRxSDIOReceiveRFBs() */
  1892. #endif /* CFG_SDIO_INTR_ENHANCE */
  1893. #if CFG_SDIO_RX_AGG
  1894. /*----------------------------------------------------------------------------*/
  1895. /*!
  1896. * @brief Read frames from the data port for SDIO with Rx aggregation enabled
  1897. * I/F, fill RFB and put each frame into the rReceivedRFBList queue.
  1898. *
  1899. * @param prAdapter Pointer to the Adapter structure.
  1900. *
  1901. * @return (none)
  1902. */
  1903. /*----------------------------------------------------------------------------*/
  1904. VOID nicRxSDIOAggReceiveRFBs(IN P_ADAPTER_T prAdapter)
  1905. {
  1906. P_ENHANCE_MODE_DATA_STRUCT_T prEnhDataStr;
  1907. P_RX_CTRL_T prRxCtrl;
  1908. P_SDIO_CTRL_T prSDIOCtrl;
  1909. P_SW_RFB_T prSwRfb = (P_SW_RFB_T) NULL;
  1910. UINT_32 u4RxLength;
  1911. UINT_32 i, rxNum;
  1912. UINT_32 u4RxAggCount = 0, u4RxAggLength = 0;
  1913. UINT_32 u4RxAvailAggLen, u4CurrAvailFreeRfbCnt;
  1914. PUINT_8 pucSrcAddr;
  1915. P_HIF_RX_HEADER_T prHifRxHdr;
  1916. BOOLEAN fgResult = TRUE;
  1917. BOOLEAN fgIsRxEnhanceMode;
  1918. UINT_16 u2RxPktNum;
  1919. #if CFG_SDIO_RX_ENHANCE
  1920. UINT_32 u4MaxLoopCount = CFG_MAX_RX_ENHANCE_LOOP_COUNT;
  1921. #endif
  1922. KAL_SPIN_LOCK_DECLARATION();
  1923. DEBUGFUNC("nicRxSDIOAggReceiveRFBs");
  1924. ASSERT(prAdapter);
  1925. prEnhDataStr = prAdapter->prSDIOCtrl;
  1926. prRxCtrl = &prAdapter->rRxCtrl;
  1927. prSDIOCtrl = prAdapter->prSDIOCtrl;
  1928. #if CFG_SDIO_RX_ENHANCE
  1929. fgIsRxEnhanceMode = TRUE;
  1930. #else
  1931. fgIsRxEnhanceMode = FALSE;
  1932. #endif
  1933. do {
  1934. #if CFG_SDIO_RX_ENHANCE
  1935. /* to limit maximum loop for RX */
  1936. u4MaxLoopCount--;
  1937. if (u4MaxLoopCount == 0)
  1938. break;
  1939. #endif
  1940. if (prEnhDataStr->rRxInfo.u.u2NumValidRx0Len == 0 && prEnhDataStr->rRxInfo.u.u2NumValidRx1Len == 0)
  1941. break;
  1942. for (rxNum = 0; rxNum < 2; rxNum++) {
  1943. u2RxPktNum =
  1944. (rxNum ==
  1945. 0 ? prEnhDataStr->rRxInfo.u.u2NumValidRx0Len : prEnhDataStr->rRxInfo.u.u2NumValidRx1Len);
  1946. /* if this assertion happened, it is most likely a F/W bug */
  1947. ASSERT(u2RxPktNum <= 16);
  1948. if (u2RxPktNum > 16)
  1949. continue;
  1950. if (u2RxPktNum == 0)
  1951. continue;
  1952. #if CFG_HIF_STATISTICS
  1953. prRxCtrl->u4TotalRxAccessNum++;
  1954. prRxCtrl->u4TotalRxPacketNum += u2RxPktNum;
  1955. #endif
  1956. u4CurrAvailFreeRfbCnt = prRxCtrl->rFreeSwRfbList.u4NumElem;
  1957. /* if SwRfb is not enough, abort reading this time */
  1958. if (u4CurrAvailFreeRfbCnt < u2RxPktNum) {
  1959. #if CFG_HIF_RX_STARVATION_WARNING
  1960. DbgPrint("FreeRfb is not enough: %d available, need %d\n", u4CurrAvailFreeRfbCnt,
  1961. u2RxPktNum);
  1962. DbgPrint("Queued Count: %d / Dequeud Count: %d\n", prRxCtrl->u4QueuedCnt,
  1963. prRxCtrl->u4DequeuedCnt);
  1964. #endif
  1965. continue;
  1966. }
  1967. #if CFG_SDIO_RX_ENHANCE
  1968. u4RxAvailAggLen =
  1969. CFG_RX_COALESCING_BUFFER_SIZE - (sizeof(ENHANCE_MODE_DATA_STRUCT_T) +
  1970. 4 /* extra HW padding */);
  1971. #else
  1972. u4RxAvailAggLen = CFG_RX_COALESCING_BUFFER_SIZE;
  1973. #endif
  1974. u4RxAggCount = 0;
  1975. for (i = 0; i < u2RxPktNum; i++) {
  1976. u4RxLength = (rxNum == 0 ?
  1977. (UINT_32) prEnhDataStr->rRxInfo.u.au2Rx0Len[i] :
  1978. (UINT_32) prEnhDataStr->rRxInfo.u.au2Rx1Len[i]);
  1979. if (!u4RxLength) {
  1980. ASSERT(0);
  1981. break;
  1982. }
  1983. if (ALIGN_4(u4RxLength + HIF_RX_HW_APPENDED_LEN) < u4RxAvailAggLen) {
  1984. if (u4RxAggCount < u4CurrAvailFreeRfbCnt) {
  1985. u4RxAvailAggLen -= ALIGN_4(u4RxLength + HIF_RX_HW_APPENDED_LEN);
  1986. u4RxAggCount++;
  1987. } else {
  1988. /* no FreeSwRfb for rx packet */
  1989. ASSERT(0);
  1990. break;
  1991. }
  1992. } else {
  1993. /* CFG_RX_COALESCING_BUFFER_SIZE is not large enough */
  1994. ASSERT(0);
  1995. break;
  1996. }
  1997. }
  1998. u4RxAggLength = (CFG_RX_COALESCING_BUFFER_SIZE - u4RxAvailAggLen);
  1999. /* DBGLOG(RX, INFO, ("u4RxAggCount = %d, u4RxAggLength = %d\n", */
  2000. /* u4RxAggCount, u4RxAggLength)); */
  2001. HAL_READ_RX_PORT(prAdapter,
  2002. rxNum,
  2003. u4RxAggLength, prRxCtrl->pucRxCoalescingBufPtr, CFG_RX_COALESCING_BUFFER_SIZE);
  2004. if (!fgResult) {
  2005. DBGLOG(RX, ERROR, "Read RX Agg Packet Error\n");
  2006. continue;
  2007. }
  2008. pucSrcAddr = prRxCtrl->pucRxCoalescingBufPtr;
  2009. for (i = 0; i < u4RxAggCount; i++) {
  2010. UINT_16 u2PktLength;
  2011. u2PktLength = (rxNum == 0 ?
  2012. prEnhDataStr->rRxInfo.u.au2Rx0Len[i] :
  2013. prEnhDataStr->rRxInfo.u.au2Rx1Len[i]);
  2014. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2015. QUEUE_REMOVE_HEAD(&prRxCtrl->rFreeSwRfbList, prSwRfb, P_SW_RFB_T);
  2016. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2017. ASSERT(prSwRfb);
  2018. kalMemCopy(prSwRfb->pucRecvBuff, pucSrcAddr,
  2019. ALIGN_4(u2PktLength + HIF_RX_HW_APPENDED_LEN));
  2020. /* record the rx time */
  2021. STATS_RX_ARRIVE_TIME_RECORD(prSwRfb); /* ms */
  2022. prHifRxHdr = prSwRfb->prHifRxHdr;
  2023. ASSERT(prHifRxHdr);
  2024. prSwRfb->ucPacketType =
  2025. (UINT_8) (prHifRxHdr->u2PacketType & HIF_RX_HDR_PACKET_TYPE_MASK);
  2026. /* DBGLOG(RX, TRACE, ("ucPacketType = %d\n", prSwRfb->ucPacketType)); */
  2027. prSwRfb->ucStaRecIdx = (UINT_8) (prHifRxHdr->ucStaRecIdx);
  2028. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2029. QUEUE_INSERT_TAIL(&prRxCtrl->rReceivedRfbList, &prSwRfb->rQueEntry);
  2030. RX_INC_CNT(prRxCtrl, RX_MPDU_TOTAL_COUNT);
  2031. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2032. pucSrcAddr += ALIGN_4(u2PktLength + HIF_RX_HW_APPENDED_LEN);
  2033. /* prEnhDataStr->au4RxLength[i] = 0; */
  2034. }
  2035. #if CFG_SDIO_RX_ENHANCE
  2036. kalMemCopy(prAdapter->prSDIOCtrl, (pucSrcAddr + 4), sizeof(ENHANCE_MODE_DATA_STRUCT_T));
  2037. /* do the same thing what nicSDIOReadIntStatus() does */
  2038. if ((prSDIOCtrl->u4WHISR & WHISR_TX_DONE_INT) == 0 &&
  2039. (prSDIOCtrl->rTxInfo.au4WTSR[0] | prSDIOCtrl->rTxInfo.au4WTSR[1])) {
  2040. prSDIOCtrl->u4WHISR |= WHISR_TX_DONE_INT;
  2041. }
  2042. if ((prSDIOCtrl->u4WHISR & BIT(31)) == 0 &&
  2043. HAL_GET_MAILBOX_READ_CLEAR(prAdapter) == TRUE &&
  2044. (prSDIOCtrl->u4RcvMailbox0 != 0 || prSDIOCtrl->u4RcvMailbox1 != 0)) {
  2045. prSDIOCtrl->u4WHISR |= BIT(31);
  2046. }
  2047. /* dispatch to interrupt handler with RX bits masked */
  2048. nicProcessIST_impl(prAdapter,
  2049. prSDIOCtrl->u4WHISR & (~(WHISR_RX0_DONE_INT | WHISR_RX1_DONE_INT)));
  2050. #endif
  2051. }
  2052. #if !CFG_SDIO_RX_ENHANCE
  2053. prEnhDataStr->rRxInfo.u.u2NumValidRx0Len = 0;
  2054. prEnhDataStr->rRxInfo.u.u2NumValidRx1Len = 0;
  2055. #endif
  2056. } while ((prEnhDataStr->rRxInfo.u.u2NumValidRx0Len || prEnhDataStr->rRxInfo.u.u2NumValidRx1Len)
  2057. && fgIsRxEnhanceMode);
  2058. }
  2059. #endif /* CFG_SDIO_RX_AGG */
  2060. /*----------------------------------------------------------------------------*/
  2061. /*!
  2062. * @brief Setup a RFB and allocate the os packet to the RFB
  2063. *
  2064. * @param prAdapter Pointer to the Adapter structure.
  2065. * @param prSwRfb Pointer to the RFB
  2066. *
  2067. * @retval WLAN_STATUS_SUCCESS
  2068. * @retval WLAN_STATUS_RESOURCES
  2069. */
  2070. /*----------------------------------------------------------------------------*/
  2071. WLAN_STATUS nicRxSetupRFB(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  2072. {
  2073. PVOID pvPacket;
  2074. PUINT_8 pucRecvBuff;
  2075. ASSERT(prAdapter);
  2076. ASSERT(prSwRfb);
  2077. if (!prSwRfb->pvPacket) {
  2078. kalMemZero(prSwRfb, sizeof(SW_RFB_T));
  2079. pvPacket = kalPacketAlloc(prAdapter->prGlueInfo, CFG_RX_MAX_PKT_SIZE, &pucRecvBuff);
  2080. if (pvPacket == NULL)
  2081. return WLAN_STATUS_RESOURCES;
  2082. prSwRfb->pvPacket = pvPacket;
  2083. prSwRfb->pucRecvBuff = (PVOID) pucRecvBuff;
  2084. } else {
  2085. kalMemZero(((PUINT_8) prSwRfb + OFFSET_OF(SW_RFB_T, prHifRxHdr)),
  2086. (sizeof(SW_RFB_T) - OFFSET_OF(SW_RFB_T, prHifRxHdr)));
  2087. }
  2088. prSwRfb->prHifRxHdr = (P_HIF_RX_HEADER_T) (prSwRfb->pucRecvBuff);
  2089. return WLAN_STATUS_SUCCESS;
  2090. } /* end of nicRxSetupRFB() */
  2091. VOID nicRxReturnRFBwithUninit(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb
  2092. , IN BOOLEAN fgIsUninitRfb)
  2093. {
  2094. P_RX_CTRL_T prRxCtrl;
  2095. P_QUE_ENTRY_T prQueEntry;
  2096. KAL_SPIN_LOCK_DECLARATION();
  2097. ASSERT(prAdapter);
  2098. ASSERT(prSwRfb);
  2099. prRxCtrl = &prAdapter->rRxCtrl;
  2100. prQueEntry = &prSwRfb->rQueEntry;
  2101. ASSERT(prQueEntry);
  2102. if (fgIsUninitRfb) {
  2103. /*
  2104. * The processing on this RFB is uninitiated, so put it back on the tail of
  2105. * our list
  2106. */
  2107. DBGLOG(RX, WARN,
  2108. "wlanReturnPacket nicRxSetupRFB fail!\n");
  2109. /* insert initialized SwRfb block */
  2110. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2111. QUEUE_INSERT_TAIL(&prRxCtrl->rUnInitializedRfbList, prQueEntry);
  2112. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2113. } else {
  2114. nicRxReturnRFB(prAdapter, prSwRfb);
  2115. }
  2116. }
  2117. /*----------------------------------------------------------------------------*/
  2118. /*!
  2119. * @brief This routine is called to put a RFB back onto the "RFB with Buffer" list
  2120. * or "RFB without buffer" list according to pvPacket.
  2121. *
  2122. * @param prAdapter Pointer to the Adapter structure.
  2123. * @param prSwRfb Pointer to the RFB
  2124. *
  2125. * @return (none)
  2126. */
  2127. /*----------------------------------------------------------------------------*/
  2128. VOID nicRxReturnRFB(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  2129. {
  2130. P_RX_CTRL_T prRxCtrl;
  2131. P_QUE_ENTRY_T prQueEntry;
  2132. KAL_SPIN_LOCK_DECLARATION();
  2133. ASSERT(prAdapter);
  2134. ASSERT(prSwRfb);
  2135. prRxCtrl = &prAdapter->rRxCtrl;
  2136. prQueEntry = &prSwRfb->rQueEntry;
  2137. ASSERT(prQueEntry);
  2138. /* The processing on this RFB is done, so put it back on the tail of
  2139. our list */
  2140. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2141. if (prSwRfb->pvPacket) {
  2142. /* QUEUE_INSERT_TAIL */
  2143. QUEUE_INSERT_TAIL(&prRxCtrl->rFreeSwRfbList, prQueEntry);
  2144. } else {
  2145. /* QUEUE_INSERT_TAIL */
  2146. prSwRfb->pucRecvBuff = NULL;
  2147. QUEUE_INSERT_TAIL(&prRxCtrl->rIndicatedRfbList, prQueEntry);
  2148. }
  2149. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
  2150. } /* end of nicRxReturnRFB() */
  2151. /*----------------------------------------------------------------------------*/
  2152. /*!
  2153. * @brief Process rx interrupt. When the rx
  2154. * Interrupt is asserted, it means there are frames in queue.
  2155. *
  2156. * @param prAdapter Pointer to the Adapter structure.
  2157. *
  2158. * @return (none)
  2159. */
  2160. /*----------------------------------------------------------------------------*/
  2161. VOID nicProcessRxInterrupt(IN P_ADAPTER_T prAdapter)
  2162. {
  2163. ASSERT(prAdapter);
  2164. #if CFG_SDIO_INTR_ENHANCE
  2165. #if CFG_SDIO_RX_AGG
  2166. nicRxSDIOAggReceiveRFBs(prAdapter);
  2167. #else
  2168. nicRxSDIOReceiveRFBs(prAdapter);
  2169. #endif
  2170. #else
  2171. nicRxReceiveRFBs(prAdapter);
  2172. #endif /* CFG_SDIO_INTR_ENHANCE */
  2173. nicRxProcessRFBs(prAdapter);
  2174. return;
  2175. } /* end of nicProcessRxInterrupt() */
  2176. #if CFG_TCP_IP_CHKSUM_OFFLOAD
  2177. /*----------------------------------------------------------------------------*/
  2178. /*!
  2179. * @brief Used to update IP/TCP/UDP checksum statistics of RX Module.
  2180. *
  2181. * @param prAdapter Pointer to the Adapter structure.
  2182. * @param aeCSUM The array of checksum result.
  2183. *
  2184. * @return (none)
  2185. */
  2186. /*----------------------------------------------------------------------------*/
  2187. VOID nicRxUpdateCSUMStatistics(IN P_ADAPTER_T prAdapter, IN const ENUM_CSUM_RESULT_T aeCSUM[])
  2188. {
  2189. P_RX_CTRL_T prRxCtrl;
  2190. ASSERT(prAdapter);
  2191. ASSERT(aeCSUM);
  2192. prRxCtrl = &prAdapter->rRxCtrl;
  2193. ASSERT(prRxCtrl);
  2194. if ((aeCSUM[CSUM_TYPE_IPV4] == CSUM_RES_SUCCESS) ||
  2195. (aeCSUM[CSUM_TYPE_IPV6] == CSUM_RES_SUCCESS)) {
  2196. RX_INC_CNT(prRxCtrl, RX_CSUM_IP_SUCCESS_COUNT);
  2197. } else if ((aeCSUM[CSUM_TYPE_IPV4] == CSUM_RES_FAILED) || (aeCSUM[CSUM_TYPE_IPV6] == CSUM_RES_FAILED)) {
  2198. RX_INC_CNT(prRxCtrl, RX_CSUM_IP_FAILED_COUNT);
  2199. } else if ((aeCSUM[CSUM_TYPE_IPV4] == CSUM_RES_NONE) && (aeCSUM[CSUM_TYPE_IPV6] == CSUM_RES_NONE)) {
  2200. RX_INC_CNT(prRxCtrl, RX_CSUM_UNKNOWN_L3_PKT_COUNT);
  2201. } else {
  2202. ASSERT(0);
  2203. }
  2204. if (aeCSUM[CSUM_TYPE_TCP] == CSUM_RES_SUCCESS) {
  2205. /* count success num */
  2206. RX_INC_CNT(prRxCtrl, RX_CSUM_TCP_SUCCESS_COUNT);
  2207. } else if (aeCSUM[CSUM_TYPE_TCP] == CSUM_RES_FAILED) {
  2208. RX_INC_CNT(prRxCtrl, RX_CSUM_TCP_FAILED_COUNT);
  2209. } else if (aeCSUM[CSUM_TYPE_UDP] == CSUM_RES_SUCCESS) {
  2210. RX_INC_CNT(prRxCtrl, RX_CSUM_UDP_SUCCESS_COUNT);
  2211. } else if (aeCSUM[CSUM_TYPE_UDP] == CSUM_RES_FAILED) {
  2212. RX_INC_CNT(prRxCtrl, RX_CSUM_UDP_FAILED_COUNT);
  2213. } else if ((aeCSUM[CSUM_TYPE_UDP] == CSUM_RES_NONE) && (aeCSUM[CSUM_TYPE_TCP] == CSUM_RES_NONE)) {
  2214. RX_INC_CNT(prRxCtrl, RX_CSUM_UNKNOWN_L4_PKT_COUNT);
  2215. } else {
  2216. ASSERT(0);
  2217. }
  2218. } /* end of nicRxUpdateCSUMStatistics() */
  2219. #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
  2220. /*----------------------------------------------------------------------------*/
  2221. /*!
  2222. * @brief This function is used to query current status of RX Module.
  2223. *
  2224. * @param prAdapter Pointer to the Adapter structure.
  2225. * @param pucBuffer Pointer to the message buffer.
  2226. * @param pu4Count Pointer to the buffer of message length count.
  2227. *
  2228. * @return (none)
  2229. */
  2230. /*----------------------------------------------------------------------------*/
  2231. VOID nicRxQueryStatus(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuffer, OUT PUINT_32 pu4Count)
  2232. {
  2233. P_RX_CTRL_T prRxCtrl;
  2234. PUINT_8 pucCurrBuf = pucBuffer;
  2235. ASSERT(prAdapter);
  2236. prRxCtrl = &prAdapter->rRxCtrl;
  2237. ASSERT(prRxCtrl);
  2238. /* if (pucBuffer) {} */ /* For Windows, we'll print directly instead of sprintf() */
  2239. ASSERT(pu4Count);
  2240. SPRINTF(pucCurrBuf, ("\n\nRX CTRL STATUS:"));
  2241. SPRINTF(pucCurrBuf, ("\n==============="));
  2242. SPRINTF(pucCurrBuf, ("\nFREE RFB w/i BUF LIST :%9u", prRxCtrl->rFreeSwRfbList.u4NumElem));
  2243. SPRINTF(pucCurrBuf, ("\nFREE RFB w/o BUF LIST :%9u", prRxCtrl->rIndicatedRfbList.u4NumElem));
  2244. SPRINTF(pucCurrBuf, ("\nRECEIVED RFB LIST :%9u", prRxCtrl->rReceivedRfbList.u4NumElem));
  2245. SPRINTF(pucCurrBuf, ("\n\n"));
  2246. /* *pu4Count = (UINT_32)((UINT_32)pucCurrBuf - (UINT_32)pucBuffer); */
  2247. } /* end of nicRxQueryStatus() */
  2248. /*----------------------------------------------------------------------------*/
  2249. /*!
  2250. * @brief Clear RX related counters
  2251. *
  2252. * @param prAdapter Pointer of Adapter Data Structure
  2253. *
  2254. * @return - (none)
  2255. */
  2256. /*----------------------------------------------------------------------------*/
  2257. VOID nicRxClearStatistics(IN P_ADAPTER_T prAdapter)
  2258. {
  2259. P_RX_CTRL_T prRxCtrl;
  2260. ASSERT(prAdapter);
  2261. prRxCtrl = &prAdapter->rRxCtrl;
  2262. ASSERT(prRxCtrl);
  2263. RX_RESET_ALL_CNTS(prRxCtrl);
  2264. }
  2265. /*----------------------------------------------------------------------------*/
  2266. /*!
  2267. * @brief This function is used to query current statistics of RX Module.
  2268. *
  2269. * @param prAdapter Pointer to the Adapter structure.
  2270. * @param pucBuffer Pointer to the message buffer.
  2271. * @param pu4Count Pointer to the buffer of message length count.
  2272. *
  2273. * @return (none)
  2274. */
  2275. /*----------------------------------------------------------------------------*/
  2276. VOID nicRxQueryStatistics(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuffer, OUT PUINT_32 pu4Count)
  2277. {
  2278. P_RX_CTRL_T prRxCtrl;
  2279. PUINT_8 pucCurrBuf = pucBuffer;
  2280. ASSERT(prAdapter);
  2281. prRxCtrl = &prAdapter->rRxCtrl;
  2282. ASSERT(prRxCtrl);
  2283. /* if (pucBuffer) {} */ /* For Windows, we'll print directly instead of sprintf() */
  2284. ASSERT(pu4Count);
  2285. #define SPRINTF_RX_COUNTER(eCounter) \
  2286. SPRINTF(pucCurrBuf, ("%-30s : %u\n", #eCounter, (UINT_32)prRxCtrl->au8Statistics[eCounter]))
  2287. SPRINTF_RX_COUNTER(RX_MPDU_TOTAL_COUNT);
  2288. SPRINTF_RX_COUNTER(RX_SIZE_ERR_DROP_COUNT);
  2289. SPRINTF_RX_COUNTER(RX_DATA_INDICATION_COUNT);
  2290. SPRINTF_RX_COUNTER(RX_DATA_RETURNED_COUNT);
  2291. SPRINTF_RX_COUNTER(RX_DATA_RETAINED_COUNT);
  2292. #if CFG_TCP_IP_CHKSUM_OFFLOAD || CFG_TCP_IP_CHKSUM_OFFLOAD_NDIS_60
  2293. SPRINTF_RX_COUNTER(RX_CSUM_TCP_FAILED_COUNT);
  2294. SPRINTF_RX_COUNTER(RX_CSUM_UDP_FAILED_COUNT);
  2295. SPRINTF_RX_COUNTER(RX_CSUM_IP_FAILED_COUNT);
  2296. SPRINTF_RX_COUNTER(RX_CSUM_TCP_SUCCESS_COUNT);
  2297. SPRINTF_RX_COUNTER(RX_CSUM_UDP_SUCCESS_COUNT);
  2298. SPRINTF_RX_COUNTER(RX_CSUM_IP_SUCCESS_COUNT);
  2299. SPRINTF_RX_COUNTER(RX_CSUM_UNKNOWN_L4_PKT_COUNT);
  2300. SPRINTF_RX_COUNTER(RX_CSUM_UNKNOWN_L3_PKT_COUNT);
  2301. SPRINTF_RX_COUNTER(RX_IP_V6_PKT_CCOUNT);
  2302. #endif
  2303. /* *pu4Count = (UINT_32)(pucCurrBuf - pucBuffer); */
  2304. nicRxClearStatistics(prAdapter);
  2305. }
  2306. /*----------------------------------------------------------------------------*/
  2307. /*!
  2308. * @brief Read the Response data from data port
  2309. *
  2310. * @param prAdapter pointer to the Adapter handler
  2311. * @param pucRspBuffer pointer to the Response buffer
  2312. *
  2313. * @retval WLAN_STATUS_SUCCESS: Response packet has been read
  2314. * @retval WLAN_STATUS_FAILURE: Read Response packet timeout or error occurred
  2315. *
  2316. */
  2317. /*----------------------------------------------------------------------------*/
  2318. WLAN_STATUS
  2319. nicRxWaitResponse(IN P_ADAPTER_T prAdapter,
  2320. IN UINT_8 ucPortIdx, OUT PUINT_8 pucRspBuffer, IN UINT_32 u4MaxRespBufferLen, OUT PUINT_32 pu4Length)
  2321. {
  2322. UINT_32 u4Value = 0, u4PktLen = 0;
  2323. UINT_32 i = 0;
  2324. WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
  2325. BOOLEAN fgResult = TRUE;
  2326. UINT_32 u4Time, u4Current;
  2327. DEBUGFUNC("nicRxWaitResponse");
  2328. ASSERT(prAdapter);
  2329. ASSERT(pucRspBuffer);
  2330. ASSERT(ucPortIdx < 2);
  2331. u4Time = kalGetTimeTick();
  2332. do {
  2333. /* Read the packet length */
  2334. HAL_MCR_RD(prAdapter, MCR_WRPLR, &u4Value);
  2335. if (!fgResult) {
  2336. DBGLOG(RX, ERROR, "Read Response Packet Error\n");
  2337. return WLAN_STATUS_FAILURE;
  2338. }
  2339. if (ucPortIdx == 0)
  2340. u4PktLen = u4Value & 0xFFFF;
  2341. else
  2342. u4PktLen = (u4Value >> 16) & 0xFFFF;
  2343. /* DBGLOG(RX, TRACE, ("i = %d, u4PktLen = %d\n", i, u4PktLen)); */
  2344. if (u4PktLen == 0) {
  2345. /* timeout exceeding check */
  2346. u4Current = kalGetTimeTick();
  2347. if ((u4Current > u4Time) && ((u4Current - u4Time) > RX_RESPONSE_TIMEOUT)) {
  2348. DBGLOG(RX, ERROR, "RX_RESPONSE_TIMEOUT1 %u %d %u\n", u4PktLen, i, u4Current);
  2349. return WLAN_STATUS_FAILURE;
  2350. } else if (u4Current < u4Time && ((u4Current + (0xFFFFFFFF - u4Time)) > RX_RESPONSE_TIMEOUT)) {
  2351. DBGLOG(RX, ERROR, "RX_RESPONSE_TIMEOUT2 %u %d %u\n", u4PktLen, i, u4Current);
  2352. return WLAN_STATUS_FAILURE;
  2353. }
  2354. /* Response packet is not ready */
  2355. kalUdelay(50);
  2356. i++;
  2357. continue;
  2358. }
  2359. if (u4PktLen > u4MaxRespBufferLen) {
  2360. /*
  2361. TO: buffer is not enough but we still need to read all data from HIF to avoid
  2362. HIF crazy.
  2363. */
  2364. DBGLOG(RX, ERROR,
  2365. "Not enough Event Buffer: required length = 0x%x, available buffer length = %d\n",
  2366. u4PktLen, u4MaxRespBufferLen);
  2367. DBGLOG(RX, ERROR, "i = %d, u4PktLen = %u\n", i, u4PktLen);
  2368. return WLAN_STATUS_FAILURE;
  2369. }
  2370. HAL_PORT_RD(prAdapter,
  2371. ucPortIdx == 0 ? MCR_WRDR0 : MCR_WRDR1, u4PktLen, pucRspBuffer, u4MaxRespBufferLen);
  2372. /* fgResult will be updated in MACRO */
  2373. if (!fgResult) {
  2374. DBGLOG(RX, ERROR, "Read Response Packet Error\n");
  2375. return WLAN_STATUS_FAILURE;
  2376. }
  2377. DBGLOG(RX, TRACE, "Dump Response buffer, length = 0x%x\n", u4PktLen);
  2378. DBGLOG_MEM8(RX, TRACE, pucRspBuffer, u4PktLen);
  2379. *pu4Length = u4PktLen;
  2380. break;
  2381. } while (TRUE);
  2382. return u4Status;
  2383. }
  2384. /*----------------------------------------------------------------------------*/
  2385. /*!
  2386. * @brief Set filter to enable Promiscuous Mode
  2387. *
  2388. * @param prAdapter Pointer to the Adapter structure.
  2389. *
  2390. * @return (none)
  2391. */
  2392. /*----------------------------------------------------------------------------*/
  2393. VOID nicRxEnablePromiscuousMode(IN P_ADAPTER_T prAdapter)
  2394. {
  2395. ASSERT(prAdapter);
  2396. } /* end of nicRxEnablePromiscuousMode() */
  2397. /*----------------------------------------------------------------------------*/
  2398. /*!
  2399. * @brief Set filter to disable Promiscuous Mode
  2400. *
  2401. * @param prAdapter Pointer to the Adapter structure.
  2402. *
  2403. * @return (none)
  2404. */
  2405. /*----------------------------------------------------------------------------*/
  2406. VOID nicRxDisablePromiscuousMode(IN P_ADAPTER_T prAdapter)
  2407. {
  2408. ASSERT(prAdapter);
  2409. } /* end of nicRxDisablePromiscuousMode() */
  2410. /*----------------------------------------------------------------------------*/
  2411. /*!
  2412. * @brief this function flushes all packets queued in reordering module
  2413. *
  2414. * @param prAdapter Pointer to the Adapter structure.
  2415. *
  2416. * @retval WLAN_STATUS_SUCCESS Flushed successfully
  2417. */
  2418. /*----------------------------------------------------------------------------*/
  2419. WLAN_STATUS nicRxFlush(IN P_ADAPTER_T prAdapter)
  2420. {
  2421. P_SW_RFB_T prSwRfb;
  2422. ASSERT(prAdapter);
  2423. prSwRfb = qmFlushRxQueues(prAdapter);
  2424. if (prSwRfb != NULL) {
  2425. do {
  2426. P_SW_RFB_T prNextSwRfb;
  2427. /* save next first */
  2428. prNextSwRfb = (P_SW_RFB_T) QUEUE_GET_NEXT_ENTRY((P_QUE_ENTRY_T) prSwRfb);
  2429. /* free */
  2430. nicRxReturnRFB(prAdapter, prSwRfb);
  2431. prSwRfb = prNextSwRfb;
  2432. } while (prSwRfb);
  2433. }
  2434. return WLAN_STATUS_SUCCESS;
  2435. }
  2436. /*----------------------------------------------------------------------------*/
  2437. /*!
  2438. * @brief
  2439. *
  2440. * @param
  2441. *
  2442. * @retval
  2443. */
  2444. /*----------------------------------------------------------------------------*/
  2445. WLAN_STATUS nicRxProcessActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  2446. {
  2447. P_WLAN_ACTION_FRAME prActFrame;
  2448. ASSERT(prAdapter);
  2449. ASSERT(prSwRfb);
  2450. if (prSwRfb->u2PacketLen < sizeof(WLAN_ACTION_FRAME) - 1)
  2451. return WLAN_STATUS_INVALID_PACKET;
  2452. prActFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader;
  2453. DBGLOG(RX, INFO, "Category %u\n", prActFrame->ucCategory);
  2454. switch (prActFrame->ucCategory) {
  2455. case CATEGORY_PUBLIC_ACTION:
  2456. if (HIF_RX_HDR_GET_NETWORK_IDX(prSwRfb->prHifRxHdr) == NETWORK_TYPE_AIS_INDEX)
  2457. aisFuncValidateRxActionFrame(prAdapter, prSwRfb);
  2458. #if CFG_ENABLE_WIFI_DIRECT
  2459. else if (prAdapter->fgIsP2PRegistered) {
  2460. rlmProcessPublicAction(prAdapter, prSwRfb);
  2461. p2pFuncValidateRxActionFrame(prAdapter, prSwRfb);
  2462. }
  2463. #endif
  2464. break;
  2465. case CATEGORY_HT_ACTION:
  2466. #if CFG_ENABLE_WIFI_DIRECT
  2467. if (prAdapter->fgIsP2PRegistered)
  2468. rlmProcessHtAction(prAdapter, prSwRfb);
  2469. #endif
  2470. break;
  2471. case CATEGORY_VENDOR_SPECIFIC_ACTION:
  2472. #if CFG_ENABLE_WIFI_DIRECT
  2473. if (prAdapter->fgIsP2PRegistered)
  2474. p2pFuncValidateRxActionFrame(prAdapter, prSwRfb);
  2475. #endif
  2476. break;
  2477. #if CFG_SUPPORT_802_11W
  2478. case CATEGORY_SA_QUERT_ACTION:
  2479. {
  2480. P_HIF_RX_HEADER_T prHifRxHdr;
  2481. prHifRxHdr = prSwRfb->prHifRxHdr;
  2482. if ((HIF_RX_HDR_GET_NETWORK_IDX(prHifRxHdr) == NETWORK_TYPE_AIS_INDEX)
  2483. && prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection /* Use MFP */) {
  2484. if (!(prHifRxHdr->ucReserved & CONTROL_FLAG_UC_MGMT_NO_ENC)) {
  2485. /* MFP test plan 5.3.3.4 */
  2486. rsnSaQueryAction(prAdapter, prSwRfb);
  2487. } else {
  2488. DBGLOG(RSN, TRACE, "Un-Protected SA Query, do nothing\n");
  2489. }
  2490. }
  2491. }
  2492. break;
  2493. #endif
  2494. #if CFG_SUPPORT_802_11V
  2495. case CATEGORY_WNM_ACTION:
  2496. {
  2497. wnmWNMAction(prAdapter, prSwRfb);
  2498. }
  2499. break;
  2500. #endif
  2501. #if CFG_SUPPORT_DFS /* Add by Enlai */
  2502. case CATEGORY_SPEC_MGT:
  2503. {
  2504. if (prAdapter->fgEnable5GBand == TRUE)
  2505. rlmProcessSpecMgtAction(prAdapter, prSwRfb);
  2506. }
  2507. break;
  2508. #endif
  2509. #if (CFG_SUPPORT_TDLS == 1)
  2510. case 12: /* shall not be here */
  2511. /*
  2512. A received TDLS Action frame with the Type field set to Management shall
  2513. be discarded. Note that the TDLS Discovery Response frame is not a TDLS
  2514. frame but a Public Action frame.
  2515. */
  2516. break;
  2517. #endif /* CFG_SUPPORT_TDLS */
  2518. default:
  2519. break;
  2520. } /* end of switch case */
  2521. return WLAN_STATUS_SUCCESS;
  2522. }