nic_cmd_event.c 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/nic/nic_cmd_event.c#1
  3. */
  4. /*! \file nic_cmd_event.c
  5. \brief Callback functions for Command packets.
  6. Various Event packet handlers which will be setup in the callback function of
  7. a command packet.
  8. */
  9. /*
  10. ** Log: nic_cmd_event.c
  11. *
  12. * 04 10 2012 yuche.tsai
  13. * NULL
  14. * Update address for wifi direct connection issue.
  15. *
  16. * 06 15 2011 cm.chang
  17. * [WCXRP00000785] [MT6620 Wi-Fi][Driver][FW] P2P/BOW MAC address is XOR with AIS MAC address
  18. * P2P/BOW mac address XOR with local bit instead of OR
  19. *
  20. * 03 05 2011 wh.su
  21. * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
  22. * add the code to get the check rsponse and indicate to app.
  23. *
  24. * 03 02 2011 wh.su
  25. * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
  26. * Add security check code.
  27. *
  28. * 02 24 2011 cp.wu
  29. * [WCXRP00000493] [MT6620 Wi-Fi][Driver] Do not indicate redundant disconnection to host when entering into RF
  30. * test mode
  31. * only indicate DISCONNECTION to host when entering RF test if necessary (connected -> disconnected cases)
  32. *
  33. * 01 20 2011 eddie.chen
  34. * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
  35. * Add Oid for sw control debug command
  36. *
  37. * 12 31 2010 cp.wu
  38. * [WCXRP00000335] [MT6620 Wi-Fi][Driver] change to use milliseconds sleep instead of delay to avoid blocking to
  39. * system scheduling
  40. * change to use msleep() and shorten waiting interval to reduce blocking to other task while Wi-Fi driver is being
  41. * loaded
  42. *
  43. * 12 01 2010 cp.wu
  44. * [WCXRP00000223] MT6620 Wi-Fi][Driver][FW] Adopt NVRAM parameters when enter/exit RF test mode
  45. * reload NVRAM settings before entering RF test mode and leaving from RF test mode.
  46. *
  47. * 11 01 2010 cp.wu
  48. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000150] [MT6620 Wi-Fi][Driver]
  49. * Add implementation for querying current TX rate from firmware auto rate module
  50. * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
  51. * 2) Remove CNM CH-RECOVER event handling
  52. * 3) cfg read/write API renamed with kal prefix for unified naming rules.
  53. *
  54. * 10 20 2010 cp.wu
  55. * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
  56. * use OID_CUSTOM_TEST_MODE as indication for driver reset
  57. * by dropping pending TX packets
  58. *
  59. * 10 18 2010 cp.wu
  60. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver]
  61. * The mac address is all zero at android
  62. * complete implementation of Android NVRAM access
  63. *
  64. * 09 21 2010 cp.wu
  65. * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS
  66. * associated
  67. * Do a complete reset with STA-REC null checking for RF test re-entry
  68. *
  69. * 09 15 2010 yuche.tsai
  70. * NULL
  71. * Start to test AT GO only when P2P state is not IDLE.
  72. *
  73. * 09 09 2010 yuche.tsai
  74. * NULL
  75. * Add AT GO Test mode after MAC address available.
  76. *
  77. * 09 03 2010 kevin.huang
  78. * NULL
  79. * Refine #include sequence and solve recursive/nested #include issue
  80. *
  81. * 08 30 2010 cp.wu
  82. * NULL
  83. * eliminate klockwork errors
  84. *
  85. * 08 16 2010 cp.wu
  86. * NULL
  87. * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI.
  88. * There is no CFG_SUPPORT_BOW in driver domain source.
  89. *
  90. * 08 12 2010 cp.wu
  91. * NULL
  92. * [AIS-FSM] honor registry setting for adhoc running mode. (A/B/G)
  93. *
  94. * 08 11 2010 yuche.tsai
  95. * NULL
  96. * Add support for P2P Device Address query from FW.
  97. *
  98. * 08 03 2010 cp.wu
  99. * NULL
  100. * Centralize mgmt/system service procedures into independent calls.
  101. *
  102. * 08 02 2010 cp.wu
  103. * NULL
  104. * reset FSMs before entering RF test mode.
  105. *
  106. * 07 22 2010 cp.wu
  107. *
  108. * 1) refine AIS-FSM indent.
  109. * 2) when entering RF Test mode, flush 802.1X frames as well
  110. * 3) when entering D3 state, flush 802.1X frames as well
  111. *
  112. * 07 08 2010 cp.wu
  113. *
  114. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  115. *
  116. * 07 05 2010 cp.wu
  117. * [WPD00003833][MT6620 and MT5931] Driver migration
  118. * 1) change fake BSS_DESC from channel 6 to channel 1 due to channel switching is not done yet.
  119. * 2) after MAC address is queried from firmware, all related variables in driver domain should be updated as well
  120. *
  121. * 06 21 2010 wh.su
  122. * [WPD00003840][MT6620 5931] Security migration
  123. * remove duplicate variable for migration.
  124. *
  125. * 06 06 2010 kevin.huang
  126. * [WPD00003832][MT6620 5931] Create driver base
  127. * [MT6620 5931] Create driver base
  128. *
  129. * 05 29 2010 cp.wu
  130. * [WPD00001943]Create WiFi test driver framework on WinXP
  131. * change upon request: indicate as disconnected in driver domain when leaving from RF test mode
  132. *
  133. * 05 24 2010 cp.wu
  134. * [WPD00001943]Create WiFi test driver framework on WinXP
  135. * do not clear scanning list array after disassociation
  136. *
  137. * 05 22 2010 cp.wu
  138. * [WPD00001943]Create WiFi test driver framework on WinXP
  139. * 1) disable NETWORK_LAYER_ADDRESSES handling temporally.
  140. * 2) finish statistics OIDs
  141. *
  142. * 05 22 2010 cp.wu
  143. * [WPD00001943]Create WiFi test driver framework on WinXP
  144. * change OID behavior to meet WHQL requirement.
  145. *
  146. * 05 20 2010 cp.wu
  147. * [WPD00001943]Create WiFi test driver framework on WinXP
  148. * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
  149. * 2) buffer statistics data for 2 seconds
  150. * 3) use default value for adhoc parameters instead of 0
  151. *
  152. * 05 19 2010 cp.wu
  153. * [WPD00001943]Create WiFi test driver framework on WinXP
  154. * 1) do not take timeout mechanism for power mode oids
  155. * 2) retrieve network type from connection status
  156. * 3) after disassciation, set radio state to off
  157. * 4) TCP option over IPv6 is supported
  158. *
  159. * 05 17 2010 cp.wu
  160. * [WPD00001943]Create WiFi test driver framework on WinXP
  161. * correct OID_802_11_DISASSOCIATE handling.
  162. *
  163. * 05 17 2010 cp.wu
  164. * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
  165. * 1) add timeout handler mechanism for pending command packets
  166. * 2) add p2p add/removal key
  167. *
  168. * 04 16 2010 cp.wu
  169. * [WPD00001943]Create WiFi test driver framework on WinXP
  170. * treat BUS access failure as kind of card removal.
  171. *
  172. * 04 14 2010 cp.wu
  173. * [WPD00001943]Create WiFi test driver framework on WinXP
  174. * information buffer for query oid/ioctl is now buffered in prCmdInfo
  175. * * * * * * instead of glue-layer variable to improve multiple oid/ioctl capability
  176. *
  177. * 04 13 2010 cp.wu
  178. * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
  179. * add framework for BT-over-Wi-Fi support.
  180. * * * * * * * * * * * * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
  181. * * * * * * * * * * * * * * 2) command sequence number is now increased atomically
  182. * * * * * * * * * * * * * * 3) private data could be hold and taken use for other purpose
  183. *
  184. * 04 07 2010 cp.wu
  185. * [WPD00001943]Create WiFi test driver framework on WinXP
  186. * accessing to firmware load/start address, and access to OID handling information
  187. * are now handled in glue layer
  188. *
  189. * 04 07 2010 cp.wu
  190. * [WPD00001943]Create WiFi test driver framework on WinXP
  191. * rWlanInfo should be placed at adapter rather than glue due to most operations
  192. * * * * are done in adapter layer.
  193. *
  194. * 04 06 2010 cp.wu
  195. * [WPD00001943]Create WiFi test driver framework on WinXP
  196. * add KAL API: kalFlushPendingTxPackets(), and take use of the API
  197. *
  198. * 04 06 2010 cp.wu
  199. * [WPD00001943]Create WiFi test driver framework on WinXP
  200. * eliminate direct access to prGlueInfo->rWlanInfo.eLinkAttr.ucMediaStreamMode from non-glue layer.
  201. *
  202. * 04 06 2010 jeffrey.chang
  203. * [WPD00003826]Initial import for Linux port
  204. * improve none-glude code portability
  205. *
  206. * 04 06 2010 cp.wu
  207. * [WPD00001943]Create WiFi test driver framework on WinXP
  208. * sync statistics data structure definition with firmware implementation
  209. *
  210. * 04 06 2010 cp.wu
  211. * [WPD00001943]Create WiFi test driver framework on WinXP
  212. * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
  213. *
  214. * 04 06 2010 cp.wu
  215. * [WPD00001943]Create WiFi test driver framework on WinXP
  216. * eliminate direct access for prGlueInfo->fgIsCardRemoved in non-glue layer
  217. *
  218. * 03 30 2010 cp.wu
  219. * [WPD00001943]Create WiFi test driver framework on WinXP
  220. * statistics information OIDs are now handled by querying from firmware domain
  221. *
  222. * 03 26 2010 cp.wu
  223. * [WPD00001943]Create WiFi test driver framework on WinXP
  224. * indicate media stream mode after set is done
  225. *
  226. * 03 24 2010 jeffrey.chang
  227. * [WPD00003826]Initial import for Linux port
  228. * initial import for Linux port
  229. *
  230. * 03 03 2010 cp.wu
  231. * [WPD00001943]Create WiFi test driver framework on WinXP
  232. * implement custom OID: EEPROM read/write access
  233. *
  234. * 03 03 2010 cp.wu
  235. * [WPD00001943]Create WiFi test driver framework on WinXP
  236. * implement OID_802_3_MULTICAST_LIST oid handling
  237. *
  238. * 02 25 2010 cp.wu
  239. * [WPD00001943]Create WiFi test driver framework on WinXP
  240. * limit RSSI return value to micxxsoft defined range.
  241. *
  242. * 02 09 2010 cp.wu
  243. * [WPD00001943]Create WiFi test driver framework on WinXP
  244. * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
  245. * * * * * * * 2. follow MSDN defined behavior when associates to another AP
  246. * * * * * * * 3. for firmware download, packet size could be up to 2048 bytes
  247. *
  248. * 01 29 2010 cp.wu
  249. * [WPD00001943]Create WiFi test driver framework on WinXP
  250. * block until firmware finished RF test enter/leave then indicate completion to upper layer
  251. *
  252. * 01 29 2010 cp.wu
  253. * [WPD00001943]Create WiFi test driver framework on WinXP
  254. * when entering RF test mode and leaving from RF test mode, wait for W_FUNC_RDY bit to be asserted forever until it
  255. * is set or card is removed.
  256. *
  257. * 01 27 2010 cp.wu
  258. * [WPD00001943]Create WiFi test driver framework on WinXP
  259. * 1. eliminate improper variable in rHifInfo
  260. * * * * * * * * 2. block TX/ordinary OID when RF test mode is engaged
  261. * * * * * * * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
  262. * * * * * * * * 4. correct some HAL implementation
  263. *
  264. * 01 26 2010 cp.wu
  265. * [WPD00001943]Create WiFi test driver framework on WinXP
  266. * Under WinXP with SDIO, use prGlueInfo->rHifInfo.pvInformationBuffer instead of prGlueInfo->pvInformationBuffer
  267. *
  268. * 01 22 2010 cp.wu
  269. * [WPD00001943]Create WiFi test driver framework on WinXP
  270. * implement following 802.11 OIDs:
  271. * * * * * OID_802_11_RSSI,
  272. * * * * * OID_802_11_RSSI_TRIGGER,
  273. * * * * * OID_802_11_STATISTICS,
  274. * * * * * OID_802_11_DISASSOCIATE,
  275. * * * * * OID_802_11_POWER_MODE
  276. *
  277. * 01 21 2010 cp.wu
  278. * [WPD00001943]Create WiFi test driver framework on WinXP
  279. * implement OID_802_11_MEDIA_STREAM_MODE
  280. *
  281. * 12 30 2009 cp.wu
  282. * [WPD00001943]Create WiFi test driver framework on WinXP
  283. * 1) According to CMD/EVENT documentation v0.8,
  284. * * * * * * * * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
  285. * * * * * * * * and result is retrieved by get ATInfo instead
  286. * * * * * * * * 2) add 4 counter for recording aggregation statistics
  287. ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-12-10 16:47:47 GMT mtk02752
  288. ** only handle MCR read when accessing FW domain register
  289. ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-12-08 17:37:28 GMT mtk02752
  290. ** * refine nicCmdEventQueryMcrRead
  291. ** + add TxStatus/RxStatus for RF test QueryInformation OIDs
  292. ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-12-02 22:05:45 GMT mtk02752
  293. ** kalOidComplete() will decrease i4OidPendingCount
  294. ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-12-01 23:02:57 GMT mtk02752
  295. ** remove unnecessary spin locks
  296. ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-12-01 22:51:18 GMT mtk02752
  297. ** maintein i4OidPendingCount
  298. ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-11-30 10:55:03 GMT mtk02752
  299. ** modify for compatibility
  300. ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-11-23 14:46:32 GMT mtk02752
  301. ** add another version of command-done handler upon new event structure
  302. ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-04-29 15:42:33 GMT mtk01461
  303. ** Add comment
  304. ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-04-21 19:32:42 GMT mtk01461
  305. ** Add nicCmdEventSetCommon() for general set OID
  306. ** \main\maintrunk.MT6620WiFiDriver_Prj\1 2009-04-21 01:40:35 GMT mtk01461
  307. ** Command Done Handler
  308. */
  309. /*******************************************************************************
  310. * C O M P I L E R F L A G S
  311. ********************************************************************************
  312. */
  313. /*******************************************************************************
  314. * E X T E R N A L R E F E R E N C E S
  315. ********************************************************************************
  316. */
  317. #include "precomp.h"
  318. #ifdef FW_CFG_SUPPORT
  319. #include "fwcfg.h"
  320. #endif
  321. /*******************************************************************************
  322. * C O N S T A N T S
  323. ********************************************************************************
  324. */
  325. /*******************************************************************************
  326. * D A T A T Y P E S
  327. ********************************************************************************
  328. */
  329. /*******************************************************************************
  330. * P U B L I C D A T A
  331. ********************************************************************************
  332. */
  333. VOID nicCmdEventQueryMcrRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  334. {
  335. UINT_32 u4QueryInfoLen;
  336. P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrRdInfo;
  337. P_GLUE_INFO_T prGlueInfo;
  338. P_CMD_ACCESS_REG prCmdAccessReg;
  339. ASSERT(prAdapter);
  340. ASSERT(prCmdInfo);
  341. ASSERT(pucEventBuf);
  342. /* 4 <2> Update information of OID */
  343. if (prCmdInfo->fgIsOid) {
  344. prGlueInfo = prAdapter->prGlueInfo;
  345. prCmdAccessReg = (P_CMD_ACCESS_REG) (pucEventBuf);
  346. u4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T);
  347. prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) prCmdInfo->pvInformationBuffer;
  348. prMcrRdInfo->u4McrOffset = prCmdAccessReg->u4Address;
  349. prMcrRdInfo->u4McrData = prCmdAccessReg->u4Data;
  350. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  351. }
  352. return;
  353. }
  354. VOID nicCmdEventQuerySwCtrlRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  355. {
  356. UINT_32 u4QueryInfoLen;
  357. P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo;
  358. P_GLUE_INFO_T prGlueInfo;
  359. P_CMD_SW_DBG_CTRL_T prCmdSwCtrl;
  360. ASSERT(prAdapter);
  361. ASSERT(prCmdInfo);
  362. ASSERT(pucEventBuf);
  363. /* 4 <2> Update information of OID */
  364. if (prCmdInfo->fgIsOid) {
  365. prGlueInfo = prAdapter->prGlueInfo;
  366. prCmdSwCtrl = (P_CMD_SW_DBG_CTRL_T) (pucEventBuf);
  367. u4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T);
  368. prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) prCmdInfo->pvInformationBuffer;
  369. prSwCtrlInfo->u4Id = prCmdSwCtrl->u4Id;
  370. prSwCtrlInfo->u4Data = prCmdSwCtrl->u4Data;
  371. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  372. }
  373. return;
  374. }
  375. VOID nicCmdEventSetCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  376. {
  377. ASSERT(prAdapter);
  378. ASSERT(prCmdInfo);
  379. if (prCmdInfo->fgIsOid) {
  380. /* Update Set Information Length */
  381. kalOidComplete(prAdapter->prGlueInfo,
  382. prCmdInfo->fgSetQuery, prCmdInfo->u4InformationBufferLength, WLAN_STATUS_SUCCESS);
  383. }
  384. }
  385. VOID nicCmdEventSetDisassociate(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  386. {
  387. ASSERT(prAdapter);
  388. ASSERT(prCmdInfo);
  389. if (prCmdInfo->fgIsOid) {
  390. /* Update Set Information Length */
  391. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
  392. }
  393. DBGLOG(NIC, TRACE, "DisByCmdE\n");
  394. kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  395. #if !defined(LINUX)
  396. prAdapter->fgIsRadioOff = TRUE;
  397. #endif
  398. }
  399. VOID nicCmdEventSetIpAddress(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  400. {
  401. UINT_32 u4Count;
  402. ASSERT(prAdapter);
  403. ASSERT(prCmdInfo);
  404. u4Count = (prCmdInfo->u4SetInfoLen - OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress))
  405. / sizeof(IPV4_NETWORK_ADDRESS);
  406. if (prCmdInfo->fgIsOid) {
  407. /* Update Set Information Length */
  408. kalOidComplete(prAdapter->prGlueInfo,
  409. prCmdInfo->fgSetQuery,
  410. OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST, arAddress) + u4Count *
  411. (OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(PARAM_NETWORK_ADDRESS_IP)),
  412. WLAN_STATUS_SUCCESS);
  413. }
  414. }
  415. VOID nicCmdEventQueryRfTestATInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  416. {
  417. P_EVENT_TEST_STATUS prTestStatus, prQueryBuffer;
  418. P_GLUE_INFO_T prGlueInfo;
  419. UINT_32 u4QueryInfoLen;
  420. ASSERT(prAdapter);
  421. ASSERT(prCmdInfo);
  422. prTestStatus = (P_EVENT_TEST_STATUS) pucEventBuf;
  423. if (prCmdInfo->fgIsOid) {
  424. prGlueInfo = prAdapter->prGlueInfo;
  425. prQueryBuffer = (P_EVENT_TEST_STATUS) prCmdInfo->pvInformationBuffer;
  426. /*Memory copy length is depended on upper-layer*/
  427. kalMemCopy(prQueryBuffer, prTestStatus, prCmdInfo->u4InformationBufferLength);
  428. u4QueryInfoLen = sizeof(EVENT_TEST_STATUS);
  429. /* Update Query Information Length */
  430. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  431. }
  432. }
  433. VOID nicCmdEventQueryLinkQuality(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  434. {
  435. PARAM_RSSI rRssi, *prRssi;
  436. P_EVENT_LINK_QUALITY prLinkQuality;
  437. P_GLUE_INFO_T prGlueInfo;
  438. UINT_32 u4QueryInfoLen;
  439. ASSERT(prAdapter);
  440. ASSERT(prCmdInfo);
  441. prLinkQuality = (P_EVENT_LINK_QUALITY) pucEventBuf;
  442. rRssi = (PARAM_RSSI) prLinkQuality->cRssi; /* ranged from (-128 ~ 30) in unit of dBm */
  443. DBGLOG(NIC, INFO, "<rxm> %s: rRssi = %d\n", __func__, rRssi);
  444. if (prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  445. if (rRssi > PARAM_WHQL_RSSI_MAX_DBM)
  446. rRssi = PARAM_WHQL_RSSI_MAX_DBM;
  447. else if (rRssi < PARAM_WHQL_RSSI_MIN_DBM)
  448. rRssi = PARAM_WHQL_RSSI_MIN_DBM;
  449. } else {
  450. rRssi = PARAM_WHQL_RSSI_MIN_DBM;
  451. }
  452. if (prCmdInfo->fgIsOid) {
  453. prGlueInfo = prAdapter->prGlueInfo;
  454. prRssi = (PARAM_RSSI *) prCmdInfo->pvInformationBuffer;
  455. kalMemCopy(prRssi, &rRssi, sizeof(PARAM_RSSI));
  456. u4QueryInfoLen = sizeof(PARAM_RSSI);
  457. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  458. }
  459. }
  460. /*----------------------------------------------------------------------------*/
  461. /*!
  462. * @brief This routine is in response of OID_GEN_LINK_SPEED query request
  463. *
  464. * @param prAdapter Pointer to the Adapter structure.
  465. * @param prCmdInfo Pointer to the pending command info
  466. * @param pucEventBuf
  467. *
  468. * @retval none
  469. */
  470. /*----------------------------------------------------------------------------*/
  471. VOID nicCmdEventQueryLinkSpeed(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  472. {
  473. P_EVENT_LINK_QUALITY prLinkQuality;
  474. P_GLUE_INFO_T prGlueInfo;
  475. UINT_32 u4QueryInfoLen;
  476. PUINT_32 pu4LinkSpeed;
  477. ASSERT(prAdapter);
  478. ASSERT(prCmdInfo);
  479. prLinkQuality = (P_EVENT_LINK_QUALITY) pucEventBuf;
  480. if (prCmdInfo->fgIsOid) {
  481. prGlueInfo = prAdapter->prGlueInfo;
  482. pu4LinkSpeed = (PUINT_32) (prCmdInfo->pvInformationBuffer);
  483. *pu4LinkSpeed = prLinkQuality->u2LinkSpeed * 5000;
  484. u4QueryInfoLen = sizeof(UINT_32);
  485. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  486. }
  487. }
  488. VOID nicCmdEventQueryStatistics(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  489. {
  490. P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
  491. P_EVENT_STATISTICS prEventStatistics;
  492. P_GLUE_INFO_T prGlueInfo;
  493. UINT_32 u4QueryInfoLen;
  494. ASSERT(prAdapter);
  495. ASSERT(prCmdInfo);
  496. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  497. if (prCmdInfo->fgIsOid) {
  498. prGlueInfo = prAdapter->prGlueInfo;
  499. u4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
  500. prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) prCmdInfo->pvInformationBuffer;
  501. prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
  502. prStatistics->rTransmittedFragmentCount = prEventStatistics->rTransmittedFragmentCount;
  503. prStatistics->rMulticastTransmittedFrameCount = prEventStatistics->rMulticastTransmittedFrameCount;
  504. prStatistics->rFailedCount = prEventStatistics->rFailedCount;
  505. prStatistics->rRetryCount = prEventStatistics->rRetryCount;
  506. prStatistics->rMultipleRetryCount = prEventStatistics->rMultipleRetryCount;
  507. prStatistics->rRTSSuccessCount = prEventStatistics->rRTSSuccessCount;
  508. prStatistics->rRTSFailureCount = prEventStatistics->rRTSFailureCount;
  509. prStatistics->rACKFailureCount = prEventStatistics->rACKFailureCount;
  510. prStatistics->rFrameDuplicateCount = prEventStatistics->rFrameDuplicateCount;
  511. prStatistics->rReceivedFragmentCount = prEventStatistics->rReceivedFragmentCount;
  512. prStatistics->rMulticastReceivedFrameCount = prEventStatistics->rMulticastReceivedFrameCount;
  513. prStatistics->rFCSErrorCount = prEventStatistics->rFCSErrorCount;
  514. prStatistics->rTKIPLocalMICFailures.QuadPart = 0;
  515. prStatistics->rTKIPICVErrors.QuadPart = 0;
  516. prStatistics->rTKIPCounterMeasuresInvoked.QuadPart = 0;
  517. prStatistics->rTKIPReplays.QuadPart = 0;
  518. prStatistics->rCCMPFormatErrors.QuadPart = 0;
  519. prStatistics->rCCMPReplays.QuadPart = 0;
  520. prStatistics->rCCMPDecryptErrors.QuadPart = 0;
  521. prStatistics->rFourWayHandshakeFailures.QuadPart = 0;
  522. prStatistics->rWEPUndecryptableCount.QuadPart = 0;
  523. prStatistics->rWEPICVErrorCount.QuadPart = 0;
  524. prStatistics->rDecryptSuccessCount.QuadPart = 0;
  525. prStatistics->rDecryptFailureCount.QuadPart = 0;
  526. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  527. }
  528. }
  529. VOID nicCmdEventEnterRfTest(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  530. {
  531. #define WAIT_FW_READY_RETRY_CNT 200
  532. UINT_32 u4WHISR = 0, u4Value = 0;
  533. UINT_8 aucTxCount[8];
  534. UINT_16 u2RetryCnt = 0;
  535. ASSERT(prAdapter);
  536. ASSERT(prCmdInfo);
  537. /* [driver-land] */
  538. prAdapter->fgTestMode = TRUE;
  539. /* 0. always indicate disconnection */
  540. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED)
  541. kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  542. /* 1. Remove pending TX */
  543. nicTxRelease(prAdapter);
  544. /* 1.1 clear pending Security / Management Frames */
  545. kalClearSecurityFrames(prAdapter->prGlueInfo);
  546. kalClearMgmtFrames(prAdapter->prGlueInfo);
  547. /* 1.2 clear pending TX packet queued in glue layer */
  548. kalFlushPendingTxPackets(prAdapter->prGlueInfo);
  549. /* 2. Reset driver-domain FSMs */
  550. nicUninitMGMT(prAdapter);
  551. nicResetSystemService(prAdapter);
  552. nicInitMGMT(prAdapter, NULL);
  553. /* 3. Disable Interrupt */
  554. HAL_INTR_DISABLE(prAdapter);
  555. /* 4. Block til firmware completed entering into RF test mode */
  556. kalMsleep(500);
  557. while (1) {
  558. HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
  559. if (u4Value & WCIR_WLAN_READY) {
  560. break;
  561. } else if (kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE || fgIsBusAccessFailed == TRUE ||
  562. kalIsResetting() || u2RetryCnt >= WAIT_FW_READY_RETRY_CNT) {
  563. if (prCmdInfo->fgIsOid) {
  564. /* Update Set Information Length */
  565. kalOidComplete(prAdapter->prGlueInfo,
  566. prCmdInfo->fgSetQuery,
  567. prCmdInfo->u4SetInfoLen, WLAN_STATUS_NOT_SUPPORTED);
  568. }
  569. return;
  570. }
  571. kalMsleep(10);
  572. u2RetryCnt++;
  573. }
  574. /* 5. Clear Interrupt Status */
  575. HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
  576. if (HAL_IS_TX_DONE_INTR(u4WHISR))
  577. HAL_READ_TX_RELEASED_COUNT(prAdapter, aucTxCount);
  578. /* 6. Reset TX Counter */
  579. nicTxResetResource(prAdapter);
  580. /* 7. Re-enable Interrupt */
  581. HAL_INTR_ENABLE(prAdapter);
  582. /* 8. completion indication */
  583. if (prCmdInfo->fgIsOid) {
  584. /* Update Set Information Length */
  585. kalOidComplete(prAdapter->prGlueInfo,
  586. prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, WLAN_STATUS_SUCCESS);
  587. }
  588. #if CFG_SUPPORT_NVRAM
  589. /* 9. load manufacture data */
  590. wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
  591. #endif
  592. }
  593. VOID nicCmdEventLeaveRfTest(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  594. {
  595. #define WAIT_FW_READY_RETRY_CNT 200
  596. UINT_32 u4WHISR = 0, u4Value = 0;
  597. UINT_8 aucTxCount[8];
  598. UINT_16 u2RetryCnt = 0;
  599. ASSERT(prAdapter);
  600. ASSERT(prCmdInfo);
  601. /* 1. Disable Interrupt */
  602. HAL_INTR_DISABLE(prAdapter);
  603. /* 2. Block til firmware completed leaving from RF test mode */
  604. kalMsleep(500);
  605. while (1) {
  606. HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
  607. if (u4Value & WCIR_WLAN_READY) {
  608. break;
  609. } else if (kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE || fgIsBusAccessFailed == TRUE ||
  610. kalIsResetting() || u2RetryCnt >= WAIT_FW_READY_RETRY_CNT) {
  611. if (prCmdInfo->fgIsOid) {
  612. /* Update Set Information Length */
  613. kalOidComplete(prAdapter->prGlueInfo,
  614. prCmdInfo->fgSetQuery,
  615. prCmdInfo->u4SetInfoLen, WLAN_STATUS_NOT_SUPPORTED);
  616. }
  617. return;
  618. }
  619. kalMsleep(10);
  620. u2RetryCnt++;
  621. }
  622. /* 3. Clear Interrupt Status */
  623. HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
  624. if (HAL_IS_TX_DONE_INTR(u4WHISR))
  625. HAL_READ_TX_RELEASED_COUNT(prAdapter, aucTxCount);
  626. /* 4. Reset TX Counter */
  627. nicTxResetResource(prAdapter);
  628. /* 5. Re-enable Interrupt */
  629. HAL_INTR_ENABLE(prAdapter);
  630. /* 6. set driver-land variable */
  631. prAdapter->fgTestMode = FALSE;
  632. /* 7. completion indication */
  633. if (prCmdInfo->fgIsOid) {
  634. /* Update Set Information Length */
  635. kalOidComplete(prAdapter->prGlueInfo,
  636. prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, WLAN_STATUS_SUCCESS);
  637. }
  638. /* 8. Indicate as disconnected */
  639. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED) {
  640. kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  641. prAdapter->rWlanInfo.u4SysTime = kalGetTimeTick();
  642. }
  643. #if CFG_SUPPORT_NVRAM
  644. /* 9. load manufacture data */
  645. wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
  646. #endif
  647. /* 10. Override network address */
  648. wlanUpdateNetworkAddress(prAdapter);
  649. }
  650. VOID nicCmdEventQueryAddress(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  651. {
  652. UINT_32 u4QueryInfoLen;
  653. P_GLUE_INFO_T prGlueInfo;
  654. P_EVENT_BASIC_CONFIG prEventBasicConfig;
  655. ASSERT(prAdapter);
  656. ASSERT(prCmdInfo);
  657. ASSERT(pucEventBuf);
  658. prEventBasicConfig = (P_EVENT_BASIC_CONFIG) (pucEventBuf);
  659. /* copy to adapter */
  660. kalMemCopy(&(prAdapter->rMyMacAddr), &(prEventBasicConfig->rMyMacAddr), MAC_ADDR_LEN);
  661. /* 4 <2> Update information of OID */
  662. if (prCmdInfo->fgIsOid) {
  663. prGlueInfo = prAdapter->prGlueInfo;
  664. kalMemCopy(prCmdInfo->pvInformationBuffer, &(prEventBasicConfig->rMyMacAddr), MAC_ADDR_LEN);
  665. u4QueryInfoLen = MAC_ADDR_LEN;
  666. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  667. }
  668. /* 4 <3> Update new MAC address and all 3 networks */
  669. COPY_MAC_ADDR(prAdapter->rWifiVar.aucMacAddress, prAdapter->rMyMacAddr);
  670. COPY_MAC_ADDR(prAdapter->rWifiVar.aucDeviceAddress, prAdapter->rMyMacAddr);
  671. prAdapter->rWifiVar.aucDeviceAddress[0] ^= MAC_ADDR_LOCAL_ADMIN;
  672. COPY_MAC_ADDR(prAdapter->rWifiVar.aucInterfaceAddress, prAdapter->rMyMacAddr);
  673. prAdapter->rWifiVar.aucInterfaceAddress[0] ^= MAC_ADDR_LOCAL_ADMIN;
  674. COPY_MAC_ADDR(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].aucOwnMacAddr, prAdapter->rMyMacAddr);
  675. #if CFG_ENABLE_WIFI_DIRECT
  676. if (prAdapter->fgIsP2PRegistered) {
  677. COPY_MAC_ADDR(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX].aucOwnMacAddr,
  678. prAdapter->rWifiVar.aucDeviceAddress);
  679. }
  680. #endif
  681. #if CFG_ENABLE_BT_OVER_WIFI
  682. COPY_MAC_ADDR(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX].aucOwnMacAddr,
  683. prAdapter->rWifiVar.aucDeviceAddress);
  684. #endif
  685. #if CFG_TEST_WIFI_DIRECT_GO
  686. if (prAdapter->rWifiVar.prP2pFsmInfo->eCurrentState == P2P_STATE_IDLE) {
  687. wlanEnableP2pFunction(prAdapter);
  688. wlanEnableATGO(prAdapter);
  689. }
  690. #endif
  691. kalUpdateMACAddress(prAdapter->prGlueInfo, prAdapter->rWifiVar.aucMacAddress);
  692. }
  693. VOID nicCmdEventQueryMcastAddr(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  694. {
  695. UINT_32 u4QueryInfoLen;
  696. P_GLUE_INFO_T prGlueInfo;
  697. P_EVENT_MAC_MCAST_ADDR prEventMacMcastAddr;
  698. ASSERT(prAdapter);
  699. ASSERT(prCmdInfo);
  700. ASSERT(pucEventBuf);
  701. /* 4 <2> Update information of OID */
  702. if (prCmdInfo->fgIsOid) {
  703. prGlueInfo = prAdapter->prGlueInfo;
  704. prEventMacMcastAddr = (P_EVENT_MAC_MCAST_ADDR) (pucEventBuf);
  705. u4QueryInfoLen = prEventMacMcastAddr->u4NumOfGroupAddr * MAC_ADDR_LEN;
  706. /* buffer length check */
  707. if (prCmdInfo->u4InformationBufferLength < u4QueryInfoLen) {
  708. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_BUFFER_TOO_SHORT);
  709. } else {
  710. kalMemCopy(prCmdInfo->pvInformationBuffer,
  711. prEventMacMcastAddr->arAddress,
  712. prEventMacMcastAddr->u4NumOfGroupAddr * MAC_ADDR_LEN);
  713. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  714. }
  715. }
  716. }
  717. VOID nicCmdEventQueryEepromRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  718. {
  719. UINT_32 u4QueryInfoLen;
  720. P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T prEepromRdInfo;
  721. P_GLUE_INFO_T prGlueInfo;
  722. P_EVENT_ACCESS_EEPROM prEventAccessEeprom;
  723. ASSERT(prAdapter);
  724. ASSERT(prCmdInfo);
  725. ASSERT(pucEventBuf);
  726. /* 4 <2> Update information of OID */
  727. if (prCmdInfo->fgIsOid) {
  728. prGlueInfo = prAdapter->prGlueInfo;
  729. prEventAccessEeprom = (P_EVENT_ACCESS_EEPROM) (pucEventBuf);
  730. u4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
  731. prEepromRdInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T) prCmdInfo->pvInformationBuffer;
  732. prEepromRdInfo->ucEepromIndex = (UINT_8) (prEventAccessEeprom->u2Offset);
  733. prEepromRdInfo->u2EepromData = prEventAccessEeprom->u2Data;
  734. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  735. }
  736. return;
  737. }
  738. VOID nicCmdEventSetMediaStreamMode(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  739. {
  740. PARAM_MEDIA_STREAMING_INDICATION rParamMediaStreamIndication;
  741. ASSERT(prAdapter);
  742. ASSERT(prCmdInfo);
  743. if (prCmdInfo->fgIsOid) {
  744. /* Update Set Information Length */
  745. kalOidComplete(prAdapter->prGlueInfo,
  746. prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, WLAN_STATUS_SUCCESS);
  747. }
  748. rParamMediaStreamIndication.rStatus.eStatusType = ENUM_STATUS_TYPE_MEDIA_STREAM_MODE;
  749. rParamMediaStreamIndication.eMediaStreamMode =
  750. prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ? ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
  751. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  752. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
  753. (PVOID)&rParamMediaStreamIndication, sizeof(PARAM_MEDIA_STREAMING_INDICATION));
  754. }
  755. /* Statistics responder */
  756. VOID nicCmdEventQueryXmitOk(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  757. {
  758. P_EVENT_STATISTICS prEventStatistics;
  759. P_GLUE_INFO_T prGlueInfo;
  760. UINT_32 u4QueryInfoLen;
  761. PUINT_32 pu4Data;
  762. PUINT_64 pu8Data;
  763. ASSERT(prAdapter);
  764. ASSERT(prCmdInfo);
  765. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  766. if (prCmdInfo->fgIsOid) {
  767. prGlueInfo = prAdapter->prGlueInfo;
  768. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  769. u4QueryInfoLen = sizeof(UINT_32);
  770. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  771. *pu4Data = (UINT_32) prEventStatistics->rTransmittedFragmentCount.QuadPart;
  772. } else {
  773. u4QueryInfoLen = sizeof(UINT_64);
  774. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  775. *pu8Data = prEventStatistics->rTransmittedFragmentCount.QuadPart;
  776. }
  777. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  778. }
  779. }
  780. VOID nicCmdEventQueryRecvOk(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  781. {
  782. P_EVENT_STATISTICS prEventStatistics;
  783. P_GLUE_INFO_T prGlueInfo;
  784. UINT_32 u4QueryInfoLen;
  785. PUINT_32 pu4Data;
  786. PUINT_64 pu8Data;
  787. ASSERT(prAdapter);
  788. ASSERT(prCmdInfo);
  789. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  790. if (prCmdInfo->fgIsOid) {
  791. prGlueInfo = prAdapter->prGlueInfo;
  792. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  793. u4QueryInfoLen = sizeof(UINT_32);
  794. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  795. *pu4Data = (UINT_32) prEventStatistics->rReceivedFragmentCount.QuadPart;
  796. } else {
  797. u4QueryInfoLen = sizeof(UINT_64);
  798. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  799. *pu8Data = prEventStatistics->rReceivedFragmentCount.QuadPart;
  800. }
  801. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  802. }
  803. }
  804. VOID nicCmdEventQueryXmitError(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  805. {
  806. P_EVENT_STATISTICS prEventStatistics;
  807. P_GLUE_INFO_T prGlueInfo;
  808. UINT_32 u4QueryInfoLen;
  809. PUINT_32 pu4Data;
  810. PUINT_64 pu8Data;
  811. ASSERT(prAdapter);
  812. ASSERT(prCmdInfo);
  813. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  814. if (prCmdInfo->fgIsOid) {
  815. prGlueInfo = prAdapter->prGlueInfo;
  816. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  817. u4QueryInfoLen = sizeof(UINT_32);
  818. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  819. *pu4Data = (UINT_32) prEventStatistics->rFailedCount.QuadPart;
  820. } else {
  821. u4QueryInfoLen = sizeof(UINT_64);
  822. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  823. *pu8Data = (UINT_64) prEventStatistics->rFailedCount.QuadPart;
  824. }
  825. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  826. }
  827. }
  828. VOID nicCmdEventQueryRecvError(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  829. {
  830. P_EVENT_STATISTICS prEventStatistics;
  831. P_GLUE_INFO_T prGlueInfo;
  832. UINT_32 u4QueryInfoLen;
  833. PUINT_32 pu4Data;
  834. PUINT_64 pu8Data;
  835. ASSERT(prAdapter);
  836. ASSERT(prCmdInfo);
  837. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  838. if (prCmdInfo->fgIsOid) {
  839. prGlueInfo = prAdapter->prGlueInfo;
  840. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  841. u4QueryInfoLen = sizeof(UINT_32);
  842. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  843. *pu4Data = (UINT_32) prEventStatistics->rFCSErrorCount.QuadPart;
  844. /* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
  845. } else {
  846. u4QueryInfoLen = sizeof(UINT_64);
  847. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  848. *pu8Data = prEventStatistics->rFCSErrorCount.QuadPart;
  849. /* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
  850. }
  851. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  852. }
  853. }
  854. VOID nicCmdEventQueryRecvNoBuffer(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  855. {
  856. P_EVENT_STATISTICS prEventStatistics;
  857. P_GLUE_INFO_T prGlueInfo;
  858. UINT_32 u4QueryInfoLen;
  859. PUINT_32 pu4Data;
  860. PUINT_64 pu8Data;
  861. ASSERT(prAdapter);
  862. ASSERT(prCmdInfo);
  863. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  864. if (prCmdInfo->fgIsOid) {
  865. prGlueInfo = prAdapter->prGlueInfo;
  866. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  867. u4QueryInfoLen = sizeof(UINT_32);
  868. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  869. *pu4Data = 0; /* @FIXME? */
  870. } else {
  871. u4QueryInfoLen = sizeof(UINT_64);
  872. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  873. *pu8Data = 0; /* @FIXME? */
  874. }
  875. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  876. }
  877. }
  878. VOID nicCmdEventQueryRecvCrcError(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  879. {
  880. P_EVENT_STATISTICS prEventStatistics;
  881. P_GLUE_INFO_T prGlueInfo;
  882. UINT_32 u4QueryInfoLen;
  883. PUINT_32 pu4Data;
  884. PUINT_64 pu8Data;
  885. ASSERT(prAdapter);
  886. ASSERT(prCmdInfo);
  887. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  888. if (prCmdInfo->fgIsOid) {
  889. prGlueInfo = prAdapter->prGlueInfo;
  890. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  891. u4QueryInfoLen = sizeof(UINT_32);
  892. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  893. *pu4Data = (UINT_32) prEventStatistics->rFCSErrorCount.QuadPart;
  894. } else {
  895. u4QueryInfoLen = sizeof(UINT_64);
  896. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  897. *pu8Data = prEventStatistics->rFCSErrorCount.QuadPart;
  898. }
  899. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  900. }
  901. }
  902. VOID nicCmdEventQueryRecvErrorAlignment(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  903. {
  904. P_EVENT_STATISTICS prEventStatistics;
  905. P_GLUE_INFO_T prGlueInfo;
  906. UINT_32 u4QueryInfoLen;
  907. PUINT_32 pu4Data;
  908. PUINT_64 pu8Data;
  909. ASSERT(prAdapter);
  910. ASSERT(prCmdInfo);
  911. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  912. if (prCmdInfo->fgIsOid) {
  913. prGlueInfo = prAdapter->prGlueInfo;
  914. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  915. u4QueryInfoLen = sizeof(UINT_32);
  916. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  917. *pu4Data = (UINT_32) 0; /* @FIXME */
  918. } else {
  919. u4QueryInfoLen = sizeof(UINT_64);
  920. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  921. *pu8Data = 0; /* @FIXME */
  922. }
  923. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  924. }
  925. }
  926. VOID nicCmdEventQueryXmitOneCollision(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  927. {
  928. P_EVENT_STATISTICS prEventStatistics;
  929. P_GLUE_INFO_T prGlueInfo;
  930. UINT_32 u4QueryInfoLen;
  931. PUINT_32 pu4Data;
  932. PUINT_64 pu8Data;
  933. ASSERT(prAdapter);
  934. ASSERT(prCmdInfo);
  935. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  936. if (prCmdInfo->fgIsOid) {
  937. prGlueInfo = prAdapter->prGlueInfo;
  938. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  939. u4QueryInfoLen = sizeof(UINT_32);
  940. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  941. *pu4Data =
  942. (UINT_32) (prEventStatistics->rMultipleRetryCount.QuadPart -
  943. prEventStatistics->rRetryCount.QuadPart);
  944. } else {
  945. u4QueryInfoLen = sizeof(UINT_64);
  946. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  947. *pu8Data =
  948. (UINT_64) (prEventStatistics->rMultipleRetryCount.QuadPart -
  949. prEventStatistics->rRetryCount.QuadPart);
  950. }
  951. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  952. }
  953. }
  954. VOID nicCmdEventQueryXmitMoreCollisions(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  955. {
  956. P_EVENT_STATISTICS prEventStatistics;
  957. P_GLUE_INFO_T prGlueInfo;
  958. UINT_32 u4QueryInfoLen;
  959. PUINT_32 pu4Data;
  960. PUINT_64 pu8Data;
  961. ASSERT(prAdapter);
  962. ASSERT(prCmdInfo);
  963. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  964. if (prCmdInfo->fgIsOid) {
  965. prGlueInfo = prAdapter->prGlueInfo;
  966. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  967. u4QueryInfoLen = sizeof(UINT_32);
  968. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  969. *pu4Data = (UINT_32) prEventStatistics->rMultipleRetryCount.QuadPart;
  970. } else {
  971. u4QueryInfoLen = sizeof(UINT_64);
  972. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  973. *pu8Data = (UINT_64) prEventStatistics->rMultipleRetryCount.QuadPart;
  974. }
  975. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  976. }
  977. }
  978. VOID nicCmdEventQueryXmitMaxCollisions(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  979. {
  980. P_EVENT_STATISTICS prEventStatistics;
  981. P_GLUE_INFO_T prGlueInfo;
  982. UINT_32 u4QueryInfoLen;
  983. PUINT_32 pu4Data;
  984. PUINT_64 pu8Data;
  985. ASSERT(prAdapter);
  986. ASSERT(prCmdInfo);
  987. prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
  988. if (prCmdInfo->fgIsOid) {
  989. prGlueInfo = prAdapter->prGlueInfo;
  990. if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
  991. u4QueryInfoLen = sizeof(UINT_32);
  992. pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
  993. *pu4Data = (UINT_32) prEventStatistics->rFailedCount.QuadPart;
  994. } else {
  995. u4QueryInfoLen = sizeof(UINT_64);
  996. pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
  997. *pu8Data = (UINT_64) prEventStatistics->rFailedCount.QuadPart;
  998. }
  999. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1000. }
  1001. }
  1002. /*----------------------------------------------------------------------------*/
  1003. /*!
  1004. * @brief This function is called when command by OID/ioctl has been timeout
  1005. *
  1006. * @param prAdapter Pointer to the Adapter structure.
  1007. * @param prCmdInfo Pointer to the command information
  1008. *
  1009. * @return TRUE
  1010. * FALSE
  1011. */
  1012. /*----------------------------------------------------------------------------*/
  1013. VOID nicOidCmdTimeoutCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
  1014. {
  1015. ASSERT(prAdapter);
  1016. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_FAILURE);
  1017. }
  1018. /*----------------------------------------------------------------------------*/
  1019. /*!
  1020. * @brief This function is a generic command timeout handler
  1021. *
  1022. * @param pfnOidHandler Pointer to the OID handler
  1023. *
  1024. * @return none
  1025. */
  1026. /*----------------------------------------------------------------------------*/
  1027. VOID nicCmdTimeoutCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
  1028. {
  1029. ASSERT(prAdapter);
  1030. }
  1031. /*----------------------------------------------------------------------------*/
  1032. /*!
  1033. * @brief This function is called when command for entering RF test has
  1034. * failed sending due to timeout (highly possibly by firmware crash)
  1035. *
  1036. * @param prAdapter Pointer to the Adapter structure.
  1037. * @param prCmdInfo Pointer to the command information
  1038. *
  1039. * @return none
  1040. *
  1041. */
  1042. /*----------------------------------------------------------------------------*/
  1043. VOID nicOidCmdEnterRFTestTimeout(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
  1044. {
  1045. ASSERT(prAdapter);
  1046. /* 1. Remove pending TX frames */
  1047. nicTxRelease(prAdapter);
  1048. /* 1.1 clear pending Security / Management Frames */
  1049. kalClearSecurityFrames(prAdapter->prGlueInfo);
  1050. kalClearMgmtFrames(prAdapter->prGlueInfo);
  1051. /* 1.2 clear pending TX packet queued in glue layer */
  1052. kalFlushPendingTxPackets(prAdapter->prGlueInfo);
  1053. /* 2. indicate for OID failure */
  1054. kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_FAILURE);
  1055. }
  1056. /*----------------------------------------------------------------------------*/
  1057. /*!
  1058. * @brief This function is called when command for memory dump has
  1059. * replied a event.
  1060. *
  1061. * @param prAdapter Pointer to the Adapter structure.
  1062. * @param prCmdInfo Pointer to the command information
  1063. * @param pucEventBuf Pointer to event buffer
  1064. *
  1065. * @return none
  1066. *
  1067. */
  1068. /*----------------------------------------------------------------------------*/
  1069. VOID nicCmdEventQueryMemDump(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1070. {
  1071. UINT_32 u4QueryInfoLen;
  1072. P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
  1073. P_GLUE_INFO_T prGlueInfo;
  1074. P_EVENT_DUMP_MEM_T prEventDumpMem;
  1075. static UINT_8 aucPath[256];
  1076. static UINT_32 u4CurTimeTick;
  1077. ASSERT(prAdapter);
  1078. ASSERT(prCmdInfo);
  1079. ASSERT(pucEventBuf);
  1080. /* 4 <2> Update information of OID */
  1081. if (prCmdInfo->fgIsOid) {
  1082. prGlueInfo = prAdapter->prGlueInfo;
  1083. prEventDumpMem = (P_EVENT_DUMP_MEM_T) (pucEventBuf);
  1084. u4QueryInfoLen = sizeof(P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T);
  1085. prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) prCmdInfo->pvInformationBuffer;
  1086. prMemDumpInfo->u4Address = prEventDumpMem->u4Address;
  1087. prMemDumpInfo->u4Length = prEventDumpMem->u4Length;
  1088. prMemDumpInfo->u4RemainLength = prEventDumpMem->u4RemainLength;
  1089. prMemDumpInfo->ucFragNum = prEventDumpMem->ucFragNum;
  1090. #if 0
  1091. do {
  1092. UINT_32 i = 0;
  1093. DBGLOG(REQ, TRACE, "Rx dump address 0x%X, Length %d, FragNum %d, remain %d\n",
  1094. prEventDumpMem->u4Address,
  1095. prEventDumpMem->u4Length, prEventDumpMem->ucFragNum, prEventDumpMem->u4RemainLength);
  1096. #if 0
  1097. for (i = 0; i < prEventDumpMem->u4Length; i++) {
  1098. DBGLOG(REQ, TRACE, "%02X ", prEventDumpMem->aucBuffer[i]);
  1099. if (i % 32 == 31)
  1100. DBGLOG(REQ, TRACE, "\n");
  1101. }
  1102. #endif
  1103. } while (FALSE);
  1104. #endif
  1105. if (prEventDumpMem->ucFragNum == 1) {
  1106. /* Store memory dump into sdcard,
  1107. * path /sdcard/dump_<current system tick>_<memory address>_<memory length>.hex
  1108. */
  1109. u4CurTimeTick = kalGetTimeTick();
  1110. sprintf(aucPath, "/sdcard/dump_%d_0x%08X_%d.hex",
  1111. u4CurTimeTick,
  1112. prEventDumpMem->u4Address, prEventDumpMem->u4Length + prEventDumpMem->u4RemainLength);
  1113. kalWriteToFile(aucPath, FALSE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
  1114. } else {
  1115. /* Append current memory dump to the hex file */
  1116. kalWriteToFile(aucPath, TRUE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
  1117. }
  1118. if (prEventDumpMem->u4RemainLength == 0 || prEventDumpMem->u4Address == 0xFFFFFFFF) {
  1119. /* The request is finished or firmware response a error */
  1120. /* Reply time tick to iwpriv */
  1121. *((PUINT_32) prCmdInfo->pvInformationBuffer) = u4CurTimeTick;
  1122. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1123. } else {
  1124. /* The memory dump request is not finished, Send next command */
  1125. wlanSendMemDumpCmd(prAdapter,
  1126. prCmdInfo->pvInformationBuffer, prCmdInfo->u4InformationBufferLength);
  1127. }
  1128. }
  1129. return;
  1130. }
  1131. #if CFG_SUPPORT_BATCH_SCAN
  1132. /*----------------------------------------------------------------------------*/
  1133. /*!
  1134. * @brief This function is called when event for SUPPORT_BATCH_SCAN
  1135. *
  1136. * @param prAdapter Pointer to the Adapter structure.
  1137. * @param prCmdInfo Pointer to the command information
  1138. * @param pucEventBuf Pointer to the event buffer
  1139. *
  1140. * @return none
  1141. *
  1142. */
  1143. /*----------------------------------------------------------------------------*/
  1144. VOID nicCmdEventBatchScanResult(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1145. {
  1146. UINT_32 u4QueryInfoLen;
  1147. P_EVENT_BATCH_RESULT_T prEventBatchResult;
  1148. P_GLUE_INFO_T prGlueInfo;
  1149. DBGLOG(SCN, TRACE, "nicCmdEventBatchScanResult");
  1150. ASSERT(prAdapter);
  1151. ASSERT(prCmdInfo);
  1152. ASSERT(pucEventBuf);
  1153. /* 4 <2> Update information of OID */
  1154. if (prCmdInfo->fgIsOid) {
  1155. prGlueInfo = prAdapter->prGlueInfo;
  1156. prEventBatchResult = (P_EVENT_BATCH_RESULT_T) pucEventBuf;
  1157. u4QueryInfoLen = sizeof(EVENT_BATCH_RESULT_T);
  1158. kalMemCopy(prCmdInfo->pvInformationBuffer, prEventBatchResult, sizeof(EVENT_BATCH_RESULT_T));
  1159. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1160. }
  1161. }
  1162. #endif
  1163. #if CFG_SUPPORT_BUILD_DATE_CODE
  1164. /*----------------------------------------------------------------------------*/
  1165. /*!
  1166. * @brief This function is called when event for build date code information
  1167. * has been retrieved
  1168. *
  1169. * @param prAdapter Pointer to the Adapter structure.
  1170. * @param prCmdInfo Pointer to the command information
  1171. * @param pucEventBuf Pointer to the event buffer
  1172. *
  1173. * @return none
  1174. *
  1175. */
  1176. /*----------------------------------------------------------------------------*/
  1177. VOID nicCmdEventBuildDateCode(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1178. {
  1179. UINT_32 u4QueryInfoLen;
  1180. P_EVENT_BUILD_DATE_CODE prEvent;
  1181. P_GLUE_INFO_T prGlueInfo;
  1182. ASSERT(prAdapter);
  1183. ASSERT(prCmdInfo);
  1184. ASSERT(pucEventBuf);
  1185. /* 4 <2> Update information of OID */
  1186. if (prCmdInfo->fgIsOid) {
  1187. prGlueInfo = prAdapter->prGlueInfo;
  1188. prEvent = (P_EVENT_BUILD_DATE_CODE) pucEventBuf;
  1189. u4QueryInfoLen = sizeof(UINT_8) * 16;
  1190. kalMemCopy(prCmdInfo->pvInformationBuffer, prEvent->aucDateCode, sizeof(UINT_8) * 16);
  1191. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1192. }
  1193. }
  1194. #endif
  1195. /*----------------------------------------------------------------------------*/
  1196. /*!
  1197. * @brief This function is called when event for query STA link status
  1198. * has been retrieved
  1199. *
  1200. * @param prAdapter Pointer to the Adapter structure.
  1201. * @param prCmdInfo Pointer to the command information
  1202. * @param pucEventBuf Pointer to the event buffer
  1203. *
  1204. * @return none
  1205. *
  1206. */
  1207. /*----------------------------------------------------------------------------*/
  1208. VOID nicCmdEventQueryStaStatistics(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1209. {
  1210. UINT_32 u4QueryInfoLen;
  1211. P_EVENT_STA_STATISTICS_T prEvent;
  1212. P_GLUE_INFO_T prGlueInfo;
  1213. P_PARAM_GET_STA_STATISTICS prStaStatistics;
  1214. if ((prAdapter == NULL)
  1215. || (prCmdInfo == NULL)
  1216. || (pucEventBuf == NULL)
  1217. || (prCmdInfo->pvInformationBuffer == NULL)) {
  1218. ASSERT(FALSE);
  1219. return;
  1220. }
  1221. if (prCmdInfo->fgIsOid) {
  1222. prGlueInfo = prAdapter->prGlueInfo;
  1223. prEvent = (P_EVENT_STA_STATISTICS_T) pucEventBuf;
  1224. prStaStatistics = (P_PARAM_GET_STA_STATISTICS) prCmdInfo->pvInformationBuffer;
  1225. u4QueryInfoLen = sizeof(PARAM_GET_STA_STA_STATISTICS);
  1226. /* Statistics from FW is valid */
  1227. if (prEvent->u4Flags & BIT(0)) {
  1228. prStaStatistics->ucPer = prEvent->ucPer;
  1229. prStaStatistics->ucRcpi = prEvent->ucRcpi;
  1230. prStaStatistics->u4PhyMode = prEvent->u4PhyMode;
  1231. prStaStatistics->u2LinkSpeed = prEvent->u2LinkSpeed;
  1232. prStaStatistics->u4TxFailCount = prEvent->u4TxFailCount;
  1233. prStaStatistics->u4TxLifeTimeoutCount = prEvent->u4TxLifeTimeoutCount;
  1234. if (prEvent->u4TxCount) {
  1235. UINT_32 u4TxDoneAirTimeMs = USEC_TO_MSEC(prEvent->u4TxDoneAirTime * 32);
  1236. prStaStatistics->u4TxAverageAirTime = (u4TxDoneAirTimeMs / prEvent->u4TxCount);
  1237. } else {
  1238. prStaStatistics->u4TxAverageAirTime = 0;
  1239. }
  1240. }
  1241. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1242. }
  1243. }
  1244. #if CFG_AUTO_CHANNEL_SEL_SUPPORT
  1245. /* 4 Auto Channel Selection */
  1246. /*----------------------------------------------------------------------------*/
  1247. /*!
  1248. * @brief This function is called when event for query STA link status
  1249. * has been retrieved
  1250. *
  1251. * @param prAdapter Pointer to the Adapter structure.
  1252. * @param prCmdInfo Pointer to the command information
  1253. * @param pucEventBuf Pointer to the event buffer
  1254. *
  1255. * @return none
  1256. *
  1257. */
  1258. /*----------------------------------------------------------------------------*/
  1259. VOID nicCmdEventQueryChannelLoad(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1260. {
  1261. UINT_32 u4QueryInfoLen;
  1262. P_EVENT_CHN_LOAD_T prEvent;
  1263. P_GLUE_INFO_T prGlueInfo;
  1264. P_PARAM_GET_CHN_LOAD prChnLoad;
  1265. if ((prAdapter == NULL)
  1266. || (prCmdInfo == NULL)
  1267. || (pucEventBuf == NULL)
  1268. || (prCmdInfo->pvInformationBuffer == NULL)) {
  1269. ASSERT(FALSE);
  1270. return;
  1271. }
  1272. if (prCmdInfo->fgIsOid) {
  1273. prGlueInfo = prAdapter->prGlueInfo;
  1274. prEvent = (P_EVENT_CHN_LOAD_T) pucEventBuf; /* 4 The firmware responsed data */
  1275. /* 4 Fill the firmware data in and send it back to host */
  1276. prChnLoad = (P_PARAM_GET_CHN_LOAD) prCmdInfo->pvInformationBuffer;
  1277. u4QueryInfoLen = sizeof(PARAM_GET_CHN_LOAD);
  1278. /* Statistics from FW is valid */
  1279. if (prEvent->u4Flags & BIT(0)) {
  1280. prChnLoad->rEachChnLoad[0].ucChannel = prEvent->ucChannel;
  1281. prChnLoad->rEachChnLoad[0].u2ChannelLoad = prEvent->u2ChannelLoad;
  1282. DBGLOG(P2P, INFO, "CHN[%d]=%d\n", prEvent->ucChannel, prEvent->u2ChannelLoad);
  1283. }
  1284. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1285. }
  1286. }
  1287. VOID nicCmdEventQueryLTESafeChn(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1288. {
  1289. UINT_8 ucIdx = 0;
  1290. UINT_32 u4QueryInfoLen;
  1291. P_EVENT_LTE_MODE_T prEvent;
  1292. P_GLUE_INFO_T prGlueInfo;
  1293. P_PARAM_GET_CHN_LOAD prLteSafeChnInfo;
  1294. if ((prAdapter == NULL)
  1295. || (prCmdInfo == NULL)
  1296. || (pucEventBuf == NULL)
  1297. || (prCmdInfo->pvInformationBuffer == NULL)) {
  1298. ASSERT(FALSE);
  1299. return;
  1300. }
  1301. if (prCmdInfo->fgIsOid) {
  1302. prGlueInfo = prAdapter->prGlueInfo;
  1303. prEvent = (P_EVENT_LTE_MODE_T) pucEventBuf; /* 4 The firmware responsed data */
  1304. prLteSafeChnInfo = (P_PARAM_GET_CHN_LOAD) prCmdInfo->pvInformationBuffer;
  1305. u4QueryInfoLen = sizeof(PARAM_GET_CHN_LOAD);
  1306. /* Statistics from FW is valid */
  1307. if (prEvent->u4Flags & BIT(0)) {
  1308. for (ucIdx = 0; ucIdx < (NL80211_TESTMODE_AVAILABLE_CHAN_NUM - 1); ucIdx++) {
  1309. prLteSafeChnInfo->rLteSafeChnList.au4SafeChannelBitmask[ucIdx] =
  1310. prEvent->rLteSafeChn.au4SafeChannelBitmask[ucIdx];
  1311. DBGLOG(P2P, INFO,
  1312. "[Auto Channel]LTE safe channels [%d]=[%x]\n", ucIdx,
  1313. (UINT32) prLteSafeChnInfo->rLteSafeChnList.au4SafeChannelBitmask[ucIdx]);
  1314. }
  1315. }
  1316. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1317. }
  1318. }
  1319. #endif
  1320. /*----------------------------------------------------------------------------*/
  1321. /*!
  1322. * @brief This function is called when event for query FW bss info
  1323. * has been retrieved
  1324. *
  1325. * @param prAdapter Pointer to the Adapter structure.
  1326. * @param prCmdInfo Pointer to the command information
  1327. * @param pucEventBuf Pointer to the event buffer
  1328. *
  1329. * @return none
  1330. *
  1331. */
  1332. /*----------------------------------------------------------------------------*/
  1333. VOID nicCmdEventGetBSSInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1334. {
  1335. UINT_32 u4QueryInfoLen;
  1336. P_EVENT_AIS_BSS_INFO_T prEvent;
  1337. P_GLUE_INFO_T prGlueInfo;
  1338. P_BSS_INFO_T prAisBssInfo;
  1339. ASSERT(prAdapter);
  1340. ASSERT(prCmdInfo);
  1341. ASSERT(pucEventBuf);
  1342. /* 4 <2> Update information of OID */
  1343. if (prCmdInfo->fgIsOid) {
  1344. prGlueInfo = prAdapter->prGlueInfo;
  1345. prEvent = (P_EVENT_AIS_BSS_INFO_T) pucEventBuf;
  1346. u4QueryInfoLen = sizeof(EVENT_AIS_BSS_INFO_T);
  1347. kalMemCopy(prCmdInfo->pvInformationBuffer, prEvent, sizeof(EVENT_AIS_BSS_INFO_T));
  1348. prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
  1349. if (prEvent->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
  1350. if (prEvent->eConnectionState != prAisBssInfo->eConnectionState) {
  1351. DBGLOG(NIC, ERROR, "driver[%d] & FW[%d] status didn't sync !!!\n",
  1352. prAisBssInfo->eConnectionState, prEvent->eCurrentOPMode);
  1353. aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, FALSE);
  1354. }
  1355. }
  1356. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1357. }
  1358. }
  1359. #ifdef FW_CFG_SUPPORT
  1360. VOID nicCmdEventQueryCfgRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1361. {
  1362. UINT_32 u4QueryInfoLen;
  1363. struct _CMD_HEADER_T *prInCfgHeader;
  1364. P_GLUE_INFO_T prGlueInfo;
  1365. struct _CMD_HEADER_T *prOutCfgHeader;
  1366. ASSERT(prAdapter);
  1367. ASSERT(prCmdInfo);
  1368. ASSERT(pucEventBuf);
  1369. if (prCmdInfo->fgIsOid) {
  1370. prGlueInfo = prAdapter->prGlueInfo;
  1371. prInCfgHeader = (struct _CMD_HEADER_T *) pucEventBuf;
  1372. u4QueryInfoLen = sizeof(struct _CMD_HEADER_T);
  1373. prOutCfgHeader = (struct _CMD_HEADER_T *) prCmdInfo->pvInformationBuffer;
  1374. kalMemCopy(prOutCfgHeader, prInCfgHeader, sizeof(struct _CMD_HEADER_T));
  1375. kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
  1376. }
  1377. }
  1378. #endif