wmi.c 73 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468
  1. /*
  2. * Copyright (c) 2005-2011 Atheros Communications Inc.
  3. * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. #include <linux/skbuff.h>
  18. #include "core.h"
  19. #include "htc.h"
  20. #include "debug.h"
  21. #include "wmi.h"
  22. #include "mac.h"
  23. /* MAIN WMI cmd track */
  24. static struct wmi_cmd_map wmi_cmd_map = {
  25. .init_cmdid = WMI_INIT_CMDID,
  26. .start_scan_cmdid = WMI_START_SCAN_CMDID,
  27. .stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
  28. .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
  29. .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
  30. .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
  31. .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
  32. .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
  33. .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
  34. .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
  35. .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
  36. .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
  37. .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
  38. .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
  39. .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
  40. .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
  41. .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
  42. .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
  43. .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
  44. .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
  45. .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
  46. .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
  47. .vdev_up_cmdid = WMI_VDEV_UP_CMDID,
  48. .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
  49. .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
  50. .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
  51. .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
  52. .peer_create_cmdid = WMI_PEER_CREATE_CMDID,
  53. .peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
  54. .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
  55. .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
  56. .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
  57. .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
  58. .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
  59. .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
  60. .bcn_tx_cmdid = WMI_BCN_TX_CMDID,
  61. .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
  62. .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
  63. .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
  64. .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
  65. .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
  66. .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
  67. .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
  68. .addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
  69. .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
  70. .delba_send_cmdid = WMI_DELBA_SEND_CMDID,
  71. .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
  72. .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
  73. .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
  74. .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
  75. .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
  76. .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
  77. .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
  78. .roam_scan_mode = WMI_ROAM_SCAN_MODE,
  79. .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
  80. .roam_scan_period = WMI_ROAM_SCAN_PERIOD,
  81. .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
  82. .roam_ap_profile = WMI_ROAM_AP_PROFILE,
  83. .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
  84. .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
  85. .ofl_scan_period = WMI_OFL_SCAN_PERIOD,
  86. .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
  87. .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
  88. .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
  89. .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
  90. .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
  91. .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
  92. .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
  93. .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
  94. .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
  95. .wlan_profile_set_hist_intvl_cmdid =
  96. WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
  97. .wlan_profile_get_profile_data_cmdid =
  98. WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
  99. .wlan_profile_enable_profile_id_cmdid =
  100. WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
  101. .wlan_profile_list_profile_id_cmdid =
  102. WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
  103. .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
  104. .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
  105. .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
  106. .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
  107. .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
  108. .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
  109. .wow_enable_disable_wake_event_cmdid =
  110. WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
  111. .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
  112. .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
  113. .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
  114. .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
  115. .vdev_spectral_scan_configure_cmdid =
  116. WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
  117. .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
  118. .request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
  119. .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
  120. .network_list_offload_config_cmdid =
  121. WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
  122. .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
  123. .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
  124. .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
  125. .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
  126. .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
  127. .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
  128. .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
  129. .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
  130. .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
  131. .echo_cmdid = WMI_ECHO_CMDID,
  132. .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
  133. .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
  134. .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
  135. .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
  136. .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
  137. .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
  138. .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
  139. .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
  140. .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
  141. };
  142. /* 10.X WMI cmd track */
  143. static struct wmi_cmd_map wmi_10x_cmd_map = {
  144. .init_cmdid = WMI_10X_INIT_CMDID,
  145. .start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
  146. .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
  147. .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
  148. .scan_sch_prio_tbl_cmdid = WMI_CMD_UNDEFINED,
  149. .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
  150. .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
  151. .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
  152. .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
  153. .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
  154. .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
  155. .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
  156. .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
  157. .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
  158. .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
  159. .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
  160. .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
  161. .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
  162. .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
  163. .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
  164. .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
  165. .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
  166. .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
  167. .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
  168. .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
  169. .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
  170. .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
  171. .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
  172. .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
  173. .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
  174. .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
  175. .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
  176. .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
  177. .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
  178. .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
  179. .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
  180. .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
  181. .bcn_tmpl_cmdid = WMI_CMD_UNDEFINED,
  182. .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
  183. .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
  184. .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
  185. .prb_tmpl_cmdid = WMI_CMD_UNDEFINED,
  186. .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
  187. .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
  188. .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
  189. .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
  190. .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
  191. .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
  192. .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
  193. .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
  194. .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
  195. .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
  196. .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
  197. .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
  198. .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
  199. .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
  200. .roam_scan_rssi_change_threshold =
  201. WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
  202. .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
  203. .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
  204. .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
  205. .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
  206. .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
  207. .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
  208. .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
  209. .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
  210. .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNDEFINED,
  211. .ap_ps_peer_param_cmdid = WMI_CMD_UNDEFINED,
  212. .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNDEFINED,
  213. .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
  214. .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
  215. .wlan_profile_set_hist_intvl_cmdid =
  216. WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
  217. .wlan_profile_get_profile_data_cmdid =
  218. WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
  219. .wlan_profile_enable_profile_id_cmdid =
  220. WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
  221. .wlan_profile_list_profile_id_cmdid =
  222. WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
  223. .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
  224. .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
  225. .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
  226. .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
  227. .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
  228. .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
  229. .wow_enable_disable_wake_event_cmdid =
  230. WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
  231. .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
  232. .wow_hostwakeup_from_sleep_cmdid =
  233. WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
  234. .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
  235. .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
  236. .vdev_spectral_scan_configure_cmdid =
  237. WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
  238. .vdev_spectral_scan_enable_cmdid =
  239. WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
  240. .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
  241. .set_arp_ns_offload_cmdid = WMI_CMD_UNDEFINED,
  242. .network_list_offload_config_cmdid = WMI_CMD_UNDEFINED,
  243. .gtk_offload_cmdid = WMI_CMD_UNDEFINED,
  244. .csa_offload_enable_cmdid = WMI_CMD_UNDEFINED,
  245. .csa_offload_chanswitch_cmdid = WMI_CMD_UNDEFINED,
  246. .chatter_set_mode_cmdid = WMI_CMD_UNDEFINED,
  247. .peer_tid_addba_cmdid = WMI_CMD_UNDEFINED,
  248. .peer_tid_delba_cmdid = WMI_CMD_UNDEFINED,
  249. .sta_dtim_ps_method_cmdid = WMI_CMD_UNDEFINED,
  250. .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNDEFINED,
  251. .sta_keepalive_cmd = WMI_CMD_UNDEFINED,
  252. .echo_cmdid = WMI_10X_ECHO_CMDID,
  253. .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
  254. .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
  255. .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
  256. .pdev_ftm_intg_cmdid = WMI_CMD_UNDEFINED,
  257. .vdev_set_keepalive_cmdid = WMI_CMD_UNDEFINED,
  258. .vdev_get_keepalive_cmdid = WMI_CMD_UNDEFINED,
  259. .force_fw_hang_cmdid = WMI_CMD_UNDEFINED,
  260. .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
  261. .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
  262. };
  263. int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
  264. {
  265. int ret;
  266. ret = wait_for_completion_timeout(&ar->wmi.service_ready,
  267. WMI_SERVICE_READY_TIMEOUT_HZ);
  268. return ret;
  269. }
  270. int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
  271. {
  272. int ret;
  273. ret = wait_for_completion_timeout(&ar->wmi.unified_ready,
  274. WMI_UNIFIED_READY_TIMEOUT_HZ);
  275. return ret;
  276. }
  277. static struct sk_buff *ath10k_wmi_alloc_skb(u32 len)
  278. {
  279. struct sk_buff *skb;
  280. u32 round_len = roundup(len, 4);
  281. skb = ath10k_htc_alloc_skb(WMI_SKB_HEADROOM + round_len);
  282. if (!skb)
  283. return NULL;
  284. skb_reserve(skb, WMI_SKB_HEADROOM);
  285. if (!IS_ALIGNED((unsigned long)skb->data, 4))
  286. ath10k_warn("Unaligned WMI skb\n");
  287. skb_put(skb, round_len);
  288. memset(skb->data, 0, round_len);
  289. return skb;
  290. }
  291. static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
  292. {
  293. dev_kfree_skb(skb);
  294. }
  295. static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
  296. u32 cmd_id)
  297. {
  298. struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
  299. struct wmi_cmd_hdr *cmd_hdr;
  300. int ret;
  301. u32 cmd = 0;
  302. if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
  303. return -ENOMEM;
  304. cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID);
  305. cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
  306. cmd_hdr->cmd_id = __cpu_to_le32(cmd);
  307. memset(skb_cb, 0, sizeof(*skb_cb));
  308. ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
  309. trace_ath10k_wmi_cmd(cmd_id, skb->data, skb->len, ret);
  310. if (ret)
  311. goto err_pull;
  312. return 0;
  313. err_pull:
  314. skb_pull(skb, sizeof(struct wmi_cmd_hdr));
  315. return ret;
  316. }
  317. static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
  318. {
  319. struct wmi_bcn_tx_arg arg = {0};
  320. int ret;
  321. lockdep_assert_held(&arvif->ar->data_lock);
  322. if (arvif->beacon == NULL)
  323. return;
  324. arg.vdev_id = arvif->vdev_id;
  325. arg.tx_rate = 0;
  326. arg.tx_power = 0;
  327. arg.bcn = arvif->beacon->data;
  328. arg.bcn_len = arvif->beacon->len;
  329. ret = ath10k_wmi_beacon_send_nowait(arvif->ar, &arg);
  330. if (ret)
  331. return;
  332. dev_kfree_skb_any(arvif->beacon);
  333. arvif->beacon = NULL;
  334. }
  335. static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
  336. struct ieee80211_vif *vif)
  337. {
  338. struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
  339. ath10k_wmi_tx_beacon_nowait(arvif);
  340. }
  341. static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar)
  342. {
  343. spin_lock_bh(&ar->data_lock);
  344. ieee80211_iterate_active_interfaces_atomic(ar->hw,
  345. IEEE80211_IFACE_ITER_NORMAL,
  346. ath10k_wmi_tx_beacons_iter,
  347. NULL);
  348. spin_unlock_bh(&ar->data_lock);
  349. }
  350. static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
  351. {
  352. /* try to send pending beacons first. they take priority */
  353. ath10k_wmi_tx_beacons_nowait(ar);
  354. wake_up(&ar->wmi.tx_credits_wq);
  355. }
  356. static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb,
  357. u32 cmd_id)
  358. {
  359. int ret = -EINVAL;
  360. wait_event_timeout(ar->wmi.tx_credits_wq, ({
  361. /* try to send pending beacons first. they take priority */
  362. ath10k_wmi_tx_beacons_nowait(ar);
  363. ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
  364. (ret != -EAGAIN);
  365. }), 3*HZ);
  366. if (ret)
  367. dev_kfree_skb_any(skb);
  368. return ret;
  369. }
  370. static int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
  371. {
  372. struct wmi_scan_event *event = (struct wmi_scan_event *)skb->data;
  373. enum wmi_scan_event_type event_type;
  374. enum wmi_scan_completion_reason reason;
  375. u32 freq;
  376. u32 req_id;
  377. u32 scan_id;
  378. u32 vdev_id;
  379. event_type = __le32_to_cpu(event->event_type);
  380. reason = __le32_to_cpu(event->reason);
  381. freq = __le32_to_cpu(event->channel_freq);
  382. req_id = __le32_to_cpu(event->scan_req_id);
  383. scan_id = __le32_to_cpu(event->scan_id);
  384. vdev_id = __le32_to_cpu(event->vdev_id);
  385. ath10k_dbg(ATH10K_DBG_WMI, "WMI_SCAN_EVENTID\n");
  386. ath10k_dbg(ATH10K_DBG_WMI,
  387. "scan event type %d reason %d freq %d req_id %d "
  388. "scan_id %d vdev_id %d\n",
  389. event_type, reason, freq, req_id, scan_id, vdev_id);
  390. spin_lock_bh(&ar->data_lock);
  391. switch (event_type) {
  392. case WMI_SCAN_EVENT_STARTED:
  393. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_EVENT_STARTED\n");
  394. if (ar->scan.in_progress && ar->scan.is_roc)
  395. ieee80211_ready_on_channel(ar->hw);
  396. complete(&ar->scan.started);
  397. break;
  398. case WMI_SCAN_EVENT_COMPLETED:
  399. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_EVENT_COMPLETED\n");
  400. switch (reason) {
  401. case WMI_SCAN_REASON_COMPLETED:
  402. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_REASON_COMPLETED\n");
  403. break;
  404. case WMI_SCAN_REASON_CANCELLED:
  405. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_REASON_CANCELED\n");
  406. break;
  407. case WMI_SCAN_REASON_PREEMPTED:
  408. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_REASON_PREEMPTED\n");
  409. break;
  410. case WMI_SCAN_REASON_TIMEDOUT:
  411. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_REASON_TIMEDOUT\n");
  412. break;
  413. default:
  414. break;
  415. }
  416. ar->scan_channel = NULL;
  417. if (!ar->scan.in_progress) {
  418. ath10k_warn("no scan requested, ignoring\n");
  419. break;
  420. }
  421. if (ar->scan.is_roc) {
  422. ath10k_offchan_tx_purge(ar);
  423. if (!ar->scan.aborting)
  424. ieee80211_remain_on_channel_expired(ar->hw);
  425. } else {
  426. ieee80211_scan_completed(ar->hw, ar->scan.aborting);
  427. }
  428. del_timer(&ar->scan.timeout);
  429. complete_all(&ar->scan.completed);
  430. ar->scan.in_progress = false;
  431. break;
  432. case WMI_SCAN_EVENT_BSS_CHANNEL:
  433. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_EVENT_BSS_CHANNEL\n");
  434. ar->scan_channel = NULL;
  435. break;
  436. case WMI_SCAN_EVENT_FOREIGN_CHANNEL:
  437. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_EVENT_FOREIGN_CHANNEL\n");
  438. ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);
  439. if (ar->scan.in_progress && ar->scan.is_roc &&
  440. ar->scan.roc_freq == freq) {
  441. complete(&ar->scan.on_channel);
  442. }
  443. break;
  444. case WMI_SCAN_EVENT_DEQUEUED:
  445. ath10k_dbg(ATH10K_DBG_WMI, "SCAN_EVENT_DEQUEUED\n");
  446. break;
  447. case WMI_SCAN_EVENT_PREEMPTED:
  448. ath10k_dbg(ATH10K_DBG_WMI, "WMI_SCAN_EVENT_PREEMPTED\n");
  449. break;
  450. case WMI_SCAN_EVENT_START_FAILED:
  451. ath10k_dbg(ATH10K_DBG_WMI, "WMI_SCAN_EVENT_START_FAILED\n");
  452. break;
  453. default:
  454. break;
  455. }
  456. spin_unlock_bh(&ar->data_lock);
  457. return 0;
  458. }
  459. static inline enum ieee80211_band phy_mode_to_band(u32 phy_mode)
  460. {
  461. enum ieee80211_band band;
  462. switch (phy_mode) {
  463. case MODE_11A:
  464. case MODE_11NA_HT20:
  465. case MODE_11NA_HT40:
  466. case MODE_11AC_VHT20:
  467. case MODE_11AC_VHT40:
  468. case MODE_11AC_VHT80:
  469. band = IEEE80211_BAND_5GHZ;
  470. break;
  471. case MODE_11G:
  472. case MODE_11B:
  473. case MODE_11GONLY:
  474. case MODE_11NG_HT20:
  475. case MODE_11NG_HT40:
  476. case MODE_11AC_VHT20_2G:
  477. case MODE_11AC_VHT40_2G:
  478. case MODE_11AC_VHT80_2G:
  479. default:
  480. band = IEEE80211_BAND_2GHZ;
  481. }
  482. return band;
  483. }
  484. static inline u8 get_rate_idx(u32 rate, enum ieee80211_band band)
  485. {
  486. u8 rate_idx = 0;
  487. /* rate in Kbps */
  488. switch (rate) {
  489. case 1000:
  490. rate_idx = 0;
  491. break;
  492. case 2000:
  493. rate_idx = 1;
  494. break;
  495. case 5500:
  496. rate_idx = 2;
  497. break;
  498. case 11000:
  499. rate_idx = 3;
  500. break;
  501. case 6000:
  502. rate_idx = 4;
  503. break;
  504. case 9000:
  505. rate_idx = 5;
  506. break;
  507. case 12000:
  508. rate_idx = 6;
  509. break;
  510. case 18000:
  511. rate_idx = 7;
  512. break;
  513. case 24000:
  514. rate_idx = 8;
  515. break;
  516. case 36000:
  517. rate_idx = 9;
  518. break;
  519. case 48000:
  520. rate_idx = 10;
  521. break;
  522. case 54000:
  523. rate_idx = 11;
  524. break;
  525. default:
  526. break;
  527. }
  528. if (band == IEEE80211_BAND_5GHZ) {
  529. if (rate_idx > 3)
  530. /* Omit CCK rates */
  531. rate_idx -= 4;
  532. else
  533. rate_idx = 0;
  534. }
  535. return rate_idx;
  536. }
  537. static int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
  538. {
  539. struct wmi_mgmt_rx_event_v1 *ev_v1;
  540. struct wmi_mgmt_rx_event_v2 *ev_v2;
  541. struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
  542. struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  543. struct ieee80211_hdr *hdr;
  544. u32 rx_status;
  545. u32 channel;
  546. u32 phy_mode;
  547. u32 snr;
  548. u32 rate;
  549. u32 buf_len;
  550. u16 fc;
  551. int pull_len;
  552. if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features)) {
  553. ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data;
  554. ev_hdr = &ev_v2->hdr.v1;
  555. pull_len = sizeof(*ev_v2);
  556. } else {
  557. ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data;
  558. ev_hdr = &ev_v1->hdr;
  559. pull_len = sizeof(*ev_v1);
  560. }
  561. channel = __le32_to_cpu(ev_hdr->channel);
  562. buf_len = __le32_to_cpu(ev_hdr->buf_len);
  563. rx_status = __le32_to_cpu(ev_hdr->status);
  564. snr = __le32_to_cpu(ev_hdr->snr);
  565. phy_mode = __le32_to_cpu(ev_hdr->phy_mode);
  566. rate = __le32_to_cpu(ev_hdr->rate);
  567. memset(status, 0, sizeof(*status));
  568. ath10k_dbg(ATH10K_DBG_MGMT,
  569. "event mgmt rx status %08x\n", rx_status);
  570. if (rx_status & WMI_RX_STATUS_ERR_DECRYPT) {
  571. dev_kfree_skb(skb);
  572. return 0;
  573. }
  574. if (rx_status & WMI_RX_STATUS_ERR_KEY_CACHE_MISS) {
  575. dev_kfree_skb(skb);
  576. return 0;
  577. }
  578. if (rx_status & WMI_RX_STATUS_ERR_CRC)
  579. status->flag |= RX_FLAG_FAILED_FCS_CRC;
  580. if (rx_status & WMI_RX_STATUS_ERR_MIC)
  581. status->flag |= RX_FLAG_MMIC_ERROR;
  582. status->band = phy_mode_to_band(phy_mode);
  583. status->freq = ieee80211_channel_to_frequency(channel, status->band);
  584. status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
  585. status->rate_idx = get_rate_idx(rate, status->band);
  586. skb_pull(skb, pull_len);
  587. hdr = (struct ieee80211_hdr *)skb->data;
  588. fc = le16_to_cpu(hdr->frame_control);
  589. if (fc & IEEE80211_FCTL_PROTECTED) {
  590. status->flag |= RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED |
  591. RX_FLAG_MMIC_STRIPPED;
  592. hdr->frame_control = __cpu_to_le16(fc &
  593. ~IEEE80211_FCTL_PROTECTED);
  594. }
  595. ath10k_dbg(ATH10K_DBG_MGMT,
  596. "event mgmt rx skb %p len %d ftype %02x stype %02x\n",
  597. skb, skb->len,
  598. fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE);
  599. ath10k_dbg(ATH10K_DBG_MGMT,
  600. "event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
  601. status->freq, status->band, status->signal,
  602. status->rate_idx);
  603. /*
  604. * packets from HTC come aligned to 4byte boundaries
  605. * because they can originally come in along with a trailer
  606. */
  607. skb_trim(skb, buf_len);
  608. ieee80211_rx(ar->hw, skb);
  609. return 0;
  610. }
  611. static int freq_to_idx(struct ath10k *ar, int freq)
  612. {
  613. struct ieee80211_supported_band *sband;
  614. int band, ch, idx = 0;
  615. for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
  616. sband = ar->hw->wiphy->bands[band];
  617. if (!sband)
  618. continue;
  619. for (ch = 0; ch < sband->n_channels; ch++, idx++)
  620. if (sband->channels[ch].center_freq == freq)
  621. goto exit;
  622. }
  623. exit:
  624. return idx;
  625. }
  626. static void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
  627. {
  628. struct wmi_chan_info_event *ev;
  629. struct survey_info *survey;
  630. u32 err_code, freq, cmd_flags, noise_floor, rx_clear_count, cycle_count;
  631. int idx;
  632. ev = (struct wmi_chan_info_event *)skb->data;
  633. err_code = __le32_to_cpu(ev->err_code);
  634. freq = __le32_to_cpu(ev->freq);
  635. cmd_flags = __le32_to_cpu(ev->cmd_flags);
  636. noise_floor = __le32_to_cpu(ev->noise_floor);
  637. rx_clear_count = __le32_to_cpu(ev->rx_clear_count);
  638. cycle_count = __le32_to_cpu(ev->cycle_count);
  639. ath10k_dbg(ATH10K_DBG_WMI,
  640. "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
  641. err_code, freq, cmd_flags, noise_floor, rx_clear_count,
  642. cycle_count);
  643. spin_lock_bh(&ar->data_lock);
  644. if (!ar->scan.in_progress) {
  645. ath10k_warn("chan info event without a scan request?\n");
  646. goto exit;
  647. }
  648. idx = freq_to_idx(ar, freq);
  649. if (idx >= ARRAY_SIZE(ar->survey)) {
  650. ath10k_warn("chan info: invalid frequency %d (idx %d out of bounds)\n",
  651. freq, idx);
  652. goto exit;
  653. }
  654. if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) {
  655. /* During scanning chan info is reported twice for each
  656. * visited channel. The reported cycle count is global
  657. * and per-channel cycle count must be calculated */
  658. cycle_count -= ar->survey_last_cycle_count;
  659. rx_clear_count -= ar->survey_last_rx_clear_count;
  660. survey = &ar->survey[idx];
  661. survey->channel_time = WMI_CHAN_INFO_MSEC(cycle_count);
  662. survey->channel_time_rx = WMI_CHAN_INFO_MSEC(rx_clear_count);
  663. survey->noise = noise_floor;
  664. survey->filled = SURVEY_INFO_CHANNEL_TIME |
  665. SURVEY_INFO_CHANNEL_TIME_RX |
  666. SURVEY_INFO_NOISE_DBM;
  667. }
  668. ar->survey_last_rx_clear_count = rx_clear_count;
  669. ar->survey_last_cycle_count = cycle_count;
  670. exit:
  671. spin_unlock_bh(&ar->data_lock);
  672. }
  673. static void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
  674. {
  675. ath10k_dbg(ATH10K_DBG_WMI, "WMI_ECHO_EVENTID\n");
  676. }
  677. static void ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
  678. {
  679. ath10k_dbg(ATH10K_DBG_WMI, "WMI_DEBUG_MESG_EVENTID\n");
  680. }
  681. static void ath10k_wmi_event_update_stats(struct ath10k *ar,
  682. struct sk_buff *skb)
  683. {
  684. struct wmi_stats_event *ev = (struct wmi_stats_event *)skb->data;
  685. ath10k_dbg(ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
  686. ath10k_debug_read_target_stats(ar, ev);
  687. }
  688. static void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar,
  689. struct sk_buff *skb)
  690. {
  691. struct wmi_vdev_start_response_event *ev;
  692. ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
  693. ev = (struct wmi_vdev_start_response_event *)skb->data;
  694. if (WARN_ON(__le32_to_cpu(ev->status)))
  695. return;
  696. complete(&ar->vdev_setup_done);
  697. }
  698. static void ath10k_wmi_event_vdev_stopped(struct ath10k *ar,
  699. struct sk_buff *skb)
  700. {
  701. ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
  702. complete(&ar->vdev_setup_done);
  703. }
  704. static void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar,
  705. struct sk_buff *skb)
  706. {
  707. ath10k_dbg(ATH10K_DBG_WMI, "WMI_PEER_STA_KICKOUT_EVENTID\n");
  708. }
  709. /*
  710. * FIXME
  711. *
  712. * We don't report to mac80211 sleep state of connected
  713. * stations. Due to this mac80211 can't fill in TIM IE
  714. * correctly.
  715. *
  716. * I know of no way of getting nullfunc frames that contain
  717. * sleep transition from connected stations - these do not
  718. * seem to be sent from the target to the host. There also
  719. * doesn't seem to be a dedicated event for that. So the
  720. * only way left to do this would be to read tim_bitmap
  721. * during SWBA.
  722. *
  723. * We could probably try using tim_bitmap from SWBA to tell
  724. * mac80211 which stations are asleep and which are not. The
  725. * problem here is calling mac80211 functions so many times
  726. * could take too long and make us miss the time to submit
  727. * the beacon to the target.
  728. *
  729. * So as a workaround we try to extend the TIM IE if there
  730. * is unicast buffered for stations with aid > 7 and fill it
  731. * in ourselves.
  732. */
  733. static void ath10k_wmi_update_tim(struct ath10k *ar,
  734. struct ath10k_vif *arvif,
  735. struct sk_buff *bcn,
  736. struct wmi_bcn_info *bcn_info)
  737. {
  738. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data;
  739. struct ieee80211_tim_ie *tim;
  740. u8 *ies, *ie;
  741. u8 ie_len, pvm_len;
  742. /* if next SWBA has no tim_changed the tim_bitmap is garbage.
  743. * we must copy the bitmap upon change and reuse it later */
  744. if (__le32_to_cpu(bcn_info->tim_info.tim_changed)) {
  745. int i;
  746. BUILD_BUG_ON(sizeof(arvif->u.ap.tim_bitmap) !=
  747. sizeof(bcn_info->tim_info.tim_bitmap));
  748. for (i = 0; i < sizeof(arvif->u.ap.tim_bitmap); i++) {
  749. __le32 t = bcn_info->tim_info.tim_bitmap[i / 4];
  750. u32 v = __le32_to_cpu(t);
  751. arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
  752. }
  753. /* FW reports either length 0 or 16
  754. * so we calculate this on our own */
  755. arvif->u.ap.tim_len = 0;
  756. for (i = 0; i < sizeof(arvif->u.ap.tim_bitmap); i++)
  757. if (arvif->u.ap.tim_bitmap[i])
  758. arvif->u.ap.tim_len = i;
  759. arvif->u.ap.tim_len++;
  760. }
  761. ies = bcn->data;
  762. ies += ieee80211_hdrlen(hdr->frame_control);
  763. ies += 12; /* fixed parameters */
  764. ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies,
  765. (u8 *)skb_tail_pointer(bcn) - ies);
  766. if (!ie) {
  767. if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
  768. ath10k_warn("no tim ie found;\n");
  769. return;
  770. }
  771. tim = (void *)ie + 2;
  772. ie_len = ie[1];
  773. pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */
  774. if (pvm_len < arvif->u.ap.tim_len) {
  775. int expand_size = sizeof(arvif->u.ap.tim_bitmap) - pvm_len;
  776. int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len);
  777. void *next_ie = ie + 2 + ie_len;
  778. if (skb_put(bcn, expand_size)) {
  779. memmove(next_ie + expand_size, next_ie, move_size);
  780. ie[1] += expand_size;
  781. ie_len += expand_size;
  782. pvm_len += expand_size;
  783. } else {
  784. ath10k_warn("tim expansion failed\n");
  785. }
  786. }
  787. if (pvm_len > sizeof(arvif->u.ap.tim_bitmap)) {
  788. ath10k_warn("tim pvm length is too great (%d)\n", pvm_len);
  789. return;
  790. }
  791. tim->bitmap_ctrl = !!__le32_to_cpu(bcn_info->tim_info.tim_mcast);
  792. memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
  793. ath10k_dbg(ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
  794. tim->dtim_count, tim->dtim_period,
  795. tim->bitmap_ctrl, pvm_len);
  796. }
  797. static void ath10k_p2p_fill_noa_ie(u8 *data, u32 len,
  798. struct wmi_p2p_noa_info *noa)
  799. {
  800. struct ieee80211_p2p_noa_attr *noa_attr;
  801. u8 ctwindow_oppps = noa->ctwindow_oppps;
  802. u8 ctwindow = ctwindow_oppps >> WMI_P2P_OPPPS_CTWINDOW_OFFSET;
  803. bool oppps = !!(ctwindow_oppps & WMI_P2P_OPPPS_ENABLE_BIT);
  804. __le16 *noa_attr_len;
  805. u16 attr_len;
  806. u8 noa_descriptors = noa->num_descriptors;
  807. int i;
  808. /* P2P IE */
  809. data[0] = WLAN_EID_VENDOR_SPECIFIC;
  810. data[1] = len - 2;
  811. data[2] = (WLAN_OUI_WFA >> 16) & 0xff;
  812. data[3] = (WLAN_OUI_WFA >> 8) & 0xff;
  813. data[4] = (WLAN_OUI_WFA >> 0) & 0xff;
  814. data[5] = WLAN_OUI_TYPE_WFA_P2P;
  815. /* NOA ATTR */
  816. data[6] = IEEE80211_P2P_ATTR_ABSENCE_NOTICE;
  817. noa_attr_len = (__le16 *)&data[7]; /* 2 bytes */
  818. noa_attr = (struct ieee80211_p2p_noa_attr *)&data[9];
  819. noa_attr->index = noa->index;
  820. noa_attr->oppps_ctwindow = ctwindow;
  821. if (oppps)
  822. noa_attr->oppps_ctwindow |= IEEE80211_P2P_OPPPS_ENABLE_BIT;
  823. for (i = 0; i < noa_descriptors; i++) {
  824. noa_attr->desc[i].count =
  825. __le32_to_cpu(noa->descriptors[i].type_count);
  826. noa_attr->desc[i].duration = noa->descriptors[i].duration;
  827. noa_attr->desc[i].interval = noa->descriptors[i].interval;
  828. noa_attr->desc[i].start_time = noa->descriptors[i].start_time;
  829. }
  830. attr_len = 2; /* index + oppps_ctwindow */
  831. attr_len += noa_descriptors * sizeof(struct ieee80211_p2p_noa_desc);
  832. *noa_attr_len = __cpu_to_le16(attr_len);
  833. }
  834. static u32 ath10k_p2p_calc_noa_ie_len(struct wmi_p2p_noa_info *noa)
  835. {
  836. u32 len = 0;
  837. u8 noa_descriptors = noa->num_descriptors;
  838. u8 opp_ps_info = noa->ctwindow_oppps;
  839. bool opps_enabled = !!(opp_ps_info & WMI_P2P_OPPPS_ENABLE_BIT);
  840. if (!noa_descriptors && !opps_enabled)
  841. return len;
  842. len += 1 + 1 + 4; /* EID + len + OUI */
  843. len += 1 + 2; /* noa attr + attr len */
  844. len += 1 + 1; /* index + oppps_ctwindow */
  845. len += noa_descriptors * sizeof(struct ieee80211_p2p_noa_desc);
  846. return len;
  847. }
  848. static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
  849. struct sk_buff *bcn,
  850. struct wmi_bcn_info *bcn_info)
  851. {
  852. struct wmi_p2p_noa_info *noa = &bcn_info->p2p_noa_info;
  853. u8 *new_data, *old_data = arvif->u.ap.noa_data;
  854. u32 new_len;
  855. if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
  856. return;
  857. ath10k_dbg(ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
  858. if (noa->changed & WMI_P2P_NOA_CHANGED_BIT) {
  859. new_len = ath10k_p2p_calc_noa_ie_len(noa);
  860. if (!new_len)
  861. goto cleanup;
  862. new_data = kmalloc(new_len, GFP_ATOMIC);
  863. if (!new_data)
  864. goto cleanup;
  865. ath10k_p2p_fill_noa_ie(new_data, new_len, noa);
  866. spin_lock_bh(&ar->data_lock);
  867. arvif->u.ap.noa_data = new_data;
  868. arvif->u.ap.noa_len = new_len;
  869. spin_unlock_bh(&ar->data_lock);
  870. kfree(old_data);
  871. }
  872. if (arvif->u.ap.noa_data)
  873. if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC))
  874. memcpy(skb_put(bcn, arvif->u.ap.noa_len),
  875. arvif->u.ap.noa_data,
  876. arvif->u.ap.noa_len);
  877. return;
  878. cleanup:
  879. spin_lock_bh(&ar->data_lock);
  880. arvif->u.ap.noa_data = NULL;
  881. arvif->u.ap.noa_len = 0;
  882. spin_unlock_bh(&ar->data_lock);
  883. kfree(old_data);
  884. }
  885. static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
  886. {
  887. struct wmi_host_swba_event *ev;
  888. u32 map;
  889. int i = -1;
  890. struct wmi_bcn_info *bcn_info;
  891. struct ath10k_vif *arvif;
  892. struct sk_buff *bcn;
  893. int vdev_id = 0;
  894. ath10k_dbg(ATH10K_DBG_MGMT, "WMI_HOST_SWBA_EVENTID\n");
  895. ev = (struct wmi_host_swba_event *)skb->data;
  896. map = __le32_to_cpu(ev->vdev_map);
  897. ath10k_dbg(ATH10K_DBG_MGMT, "host swba:\n"
  898. "-vdev map 0x%x\n",
  899. ev->vdev_map);
  900. for (; map; map >>= 1, vdev_id++) {
  901. if (!(map & 0x1))
  902. continue;
  903. i++;
  904. if (i >= WMI_MAX_AP_VDEV) {
  905. ath10k_warn("swba has corrupted vdev map\n");
  906. break;
  907. }
  908. bcn_info = &ev->bcn_info[i];
  909. ath10k_dbg(ATH10K_DBG_MGMT,
  910. "-bcn_info[%d]:\n"
  911. "--tim_len %d\n"
  912. "--tim_mcast %d\n"
  913. "--tim_changed %d\n"
  914. "--tim_num_ps_pending %d\n"
  915. "--tim_bitmap 0x%08x%08x%08x%08x\n",
  916. i,
  917. __le32_to_cpu(bcn_info->tim_info.tim_len),
  918. __le32_to_cpu(bcn_info->tim_info.tim_mcast),
  919. __le32_to_cpu(bcn_info->tim_info.tim_changed),
  920. __le32_to_cpu(bcn_info->tim_info.tim_num_ps_pending),
  921. __le32_to_cpu(bcn_info->tim_info.tim_bitmap[3]),
  922. __le32_to_cpu(bcn_info->tim_info.tim_bitmap[2]),
  923. __le32_to_cpu(bcn_info->tim_info.tim_bitmap[1]),
  924. __le32_to_cpu(bcn_info->tim_info.tim_bitmap[0]));
  925. arvif = ath10k_get_arvif(ar, vdev_id);
  926. if (arvif == NULL) {
  927. ath10k_warn("no vif for vdev_id %d found\n", vdev_id);
  928. continue;
  929. }
  930. bcn = ieee80211_beacon_get(ar->hw, arvif->vif);
  931. if (!bcn) {
  932. ath10k_warn("could not get mac80211 beacon\n");
  933. continue;
  934. }
  935. ath10k_tx_h_seq_no(bcn);
  936. ath10k_wmi_update_tim(ar, arvif, bcn, bcn_info);
  937. ath10k_wmi_update_noa(ar, arvif, bcn, bcn_info);
  938. spin_lock_bh(&ar->data_lock);
  939. if (arvif->beacon) {
  940. ath10k_warn("SWBA overrun on vdev %d\n",
  941. arvif->vdev_id);
  942. dev_kfree_skb_any(arvif->beacon);
  943. }
  944. arvif->beacon = bcn;
  945. ath10k_wmi_tx_beacon_nowait(arvif);
  946. spin_unlock_bh(&ar->data_lock);
  947. }
  948. }
  949. static void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar,
  950. struct sk_buff *skb)
  951. {
  952. ath10k_dbg(ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
  953. }
  954. static void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
  955. {
  956. ath10k_dbg(ATH10K_DBG_WMI, "WMI_PHYERR_EVENTID\n");
  957. }
  958. static void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
  959. {
  960. ath10k_dbg(ATH10K_DBG_WMI, "WMI_ROAM_EVENTID\n");
  961. }
  962. static void ath10k_wmi_event_profile_match(struct ath10k *ar,
  963. struct sk_buff *skb)
  964. {
  965. ath10k_dbg(ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
  966. }
  967. static void ath10k_wmi_event_debug_print(struct ath10k *ar,
  968. struct sk_buff *skb)
  969. {
  970. ath10k_dbg(ATH10K_DBG_WMI, "WMI_DEBUG_PRINT_EVENTID\n");
  971. }
  972. static void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
  973. {
  974. ath10k_dbg(ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
  975. }
  976. static void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar,
  977. struct sk_buff *skb)
  978. {
  979. ath10k_dbg(ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
  980. }
  981. static void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
  982. struct sk_buff *skb)
  983. {
  984. ath10k_dbg(ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
  985. }
  986. static void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
  987. struct sk_buff *skb)
  988. {
  989. ath10k_dbg(ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
  990. }
  991. static void ath10k_wmi_event_rtt_error_report(struct ath10k *ar,
  992. struct sk_buff *skb)
  993. {
  994. ath10k_dbg(ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
  995. }
  996. static void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar,
  997. struct sk_buff *skb)
  998. {
  999. ath10k_dbg(ATH10K_DBG_WMI, "WMI_WOW_WAKEUP_HOST_EVENTID\n");
  1000. }
  1001. static void ath10k_wmi_event_dcs_interference(struct ath10k *ar,
  1002. struct sk_buff *skb)
  1003. {
  1004. ath10k_dbg(ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
  1005. }
  1006. static void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar,
  1007. struct sk_buff *skb)
  1008. {
  1009. ath10k_dbg(ATH10K_DBG_WMI, "WMI_PDEV_TPC_CONFIG_EVENTID\n");
  1010. }
  1011. static void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar,
  1012. struct sk_buff *skb)
  1013. {
  1014. ath10k_dbg(ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
  1015. }
  1016. static void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar,
  1017. struct sk_buff *skb)
  1018. {
  1019. ath10k_dbg(ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
  1020. }
  1021. static void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar,
  1022. struct sk_buff *skb)
  1023. {
  1024. ath10k_dbg(ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
  1025. }
  1026. static void ath10k_wmi_event_delba_complete(struct ath10k *ar,
  1027. struct sk_buff *skb)
  1028. {
  1029. ath10k_dbg(ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
  1030. }
  1031. static void ath10k_wmi_event_addba_complete(struct ath10k *ar,
  1032. struct sk_buff *skb)
  1033. {
  1034. ath10k_dbg(ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
  1035. }
  1036. static void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
  1037. struct sk_buff *skb)
  1038. {
  1039. ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
  1040. }
  1041. static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
  1042. struct sk_buff *skb)
  1043. {
  1044. struct wmi_service_ready_event *ev = (void *)skb->data;
  1045. if (skb->len < sizeof(*ev)) {
  1046. ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
  1047. skb->len, sizeof(*ev));
  1048. return;
  1049. }
  1050. ar->hw_min_tx_power = __le32_to_cpu(ev->hw_min_tx_power);
  1051. ar->hw_max_tx_power = __le32_to_cpu(ev->hw_max_tx_power);
  1052. ar->ht_cap_info = __le32_to_cpu(ev->ht_cap_info);
  1053. ar->vht_cap_info = __le32_to_cpu(ev->vht_cap_info);
  1054. ar->fw_version_major =
  1055. (__le32_to_cpu(ev->sw_version) & 0xff000000) >> 24;
  1056. ar->fw_version_minor = (__le32_to_cpu(ev->sw_version) & 0x00ffffff);
  1057. ar->fw_version_release =
  1058. (__le32_to_cpu(ev->sw_version_1) & 0xffff0000) >> 16;
  1059. ar->fw_version_build = (__le32_to_cpu(ev->sw_version_1) & 0x0000ffff);
  1060. ar->phy_capability = __le32_to_cpu(ev->phy_capability);
  1061. ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains);
  1062. if (ar->fw_version_build > 636)
  1063. set_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features);
  1064. if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) {
  1065. ath10k_warn("hardware advertises support for more spatial streams than it should (%d > %d)\n",
  1066. ar->num_rf_chains, WMI_MAX_SPATIAL_STREAM);
  1067. ar->num_rf_chains = WMI_MAX_SPATIAL_STREAM;
  1068. }
  1069. ar->ath_common.regulatory.current_rd =
  1070. __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd);
  1071. ath10k_debug_read_service_map(ar, ev->wmi_service_bitmap,
  1072. sizeof(ev->wmi_service_bitmap));
  1073. if (strlen(ar->hw->wiphy->fw_version) == 0) {
  1074. snprintf(ar->hw->wiphy->fw_version,
  1075. sizeof(ar->hw->wiphy->fw_version),
  1076. "%u.%u.%u.%u",
  1077. ar->fw_version_major,
  1078. ar->fw_version_minor,
  1079. ar->fw_version_release,
  1080. ar->fw_version_build);
  1081. }
  1082. /* FIXME: it probably should be better to support this */
  1083. if (__le32_to_cpu(ev->num_mem_reqs) > 0) {
  1084. ath10k_warn("target requested %d memory chunks; ignoring\n",
  1085. __le32_to_cpu(ev->num_mem_reqs));
  1086. }
  1087. ath10k_dbg(ATH10K_DBG_WMI,
  1088. "wmi event service ready sw_ver 0x%08x sw_ver1 0x%08x abi_ver %u phy_cap 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_msc 0x%08x sys_cap_info 0x%08x mem_reqs %u num_rf_chains %u\n",
  1089. __le32_to_cpu(ev->sw_version),
  1090. __le32_to_cpu(ev->sw_version_1),
  1091. __le32_to_cpu(ev->abi_version),
  1092. __le32_to_cpu(ev->phy_capability),
  1093. __le32_to_cpu(ev->ht_cap_info),
  1094. __le32_to_cpu(ev->vht_cap_info),
  1095. __le32_to_cpu(ev->vht_supp_mcs),
  1096. __le32_to_cpu(ev->sys_cap_info),
  1097. __le32_to_cpu(ev->num_mem_reqs),
  1098. __le32_to_cpu(ev->num_rf_chains));
  1099. complete(&ar->wmi.service_ready);
  1100. }
  1101. static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb)
  1102. {
  1103. struct wmi_ready_event *ev = (struct wmi_ready_event *)skb->data;
  1104. if (WARN_ON(skb->len < sizeof(*ev)))
  1105. return -EINVAL;
  1106. memcpy(ar->mac_addr, ev->mac_addr.addr, ETH_ALEN);
  1107. ath10k_dbg(ATH10K_DBG_WMI,
  1108. "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
  1109. __le32_to_cpu(ev->sw_version),
  1110. __le32_to_cpu(ev->abi_version),
  1111. ev->mac_addr.addr,
  1112. __le32_to_cpu(ev->status));
  1113. complete(&ar->wmi.unified_ready);
  1114. return 0;
  1115. }
  1116. static void ath10k_wmi_main_process_rx(struct ath10k *ar, struct sk_buff *skb)
  1117. {
  1118. struct wmi_cmd_hdr *cmd_hdr;
  1119. enum wmi_event_id id;
  1120. u16 len;
  1121. cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
  1122. id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
  1123. if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
  1124. return;
  1125. len = skb->len;
  1126. trace_ath10k_wmi_event(id, skb->data, skb->len);
  1127. switch (id) {
  1128. case WMI_MGMT_RX_EVENTID:
  1129. ath10k_wmi_event_mgmt_rx(ar, skb);
  1130. /* mgmt_rx() owns the skb now! */
  1131. return;
  1132. case WMI_SCAN_EVENTID:
  1133. ath10k_wmi_event_scan(ar, skb);
  1134. break;
  1135. case WMI_CHAN_INFO_EVENTID:
  1136. ath10k_wmi_event_chan_info(ar, skb);
  1137. break;
  1138. case WMI_ECHO_EVENTID:
  1139. ath10k_wmi_event_echo(ar, skb);
  1140. break;
  1141. case WMI_DEBUG_MESG_EVENTID:
  1142. ath10k_wmi_event_debug_mesg(ar, skb);
  1143. break;
  1144. case WMI_UPDATE_STATS_EVENTID:
  1145. ath10k_wmi_event_update_stats(ar, skb);
  1146. break;
  1147. case WMI_VDEV_START_RESP_EVENTID:
  1148. ath10k_wmi_event_vdev_start_resp(ar, skb);
  1149. break;
  1150. case WMI_VDEV_STOPPED_EVENTID:
  1151. ath10k_wmi_event_vdev_stopped(ar, skb);
  1152. break;
  1153. case WMI_PEER_STA_KICKOUT_EVENTID:
  1154. ath10k_wmi_event_peer_sta_kickout(ar, skb);
  1155. break;
  1156. case WMI_HOST_SWBA_EVENTID:
  1157. ath10k_wmi_event_host_swba(ar, skb);
  1158. break;
  1159. case WMI_TBTTOFFSET_UPDATE_EVENTID:
  1160. ath10k_wmi_event_tbttoffset_update(ar, skb);
  1161. break;
  1162. case WMI_PHYERR_EVENTID:
  1163. ath10k_wmi_event_phyerr(ar, skb);
  1164. break;
  1165. case WMI_ROAM_EVENTID:
  1166. ath10k_wmi_event_roam(ar, skb);
  1167. break;
  1168. case WMI_PROFILE_MATCH:
  1169. ath10k_wmi_event_profile_match(ar, skb);
  1170. break;
  1171. case WMI_DEBUG_PRINT_EVENTID:
  1172. ath10k_wmi_event_debug_print(ar, skb);
  1173. break;
  1174. case WMI_PDEV_QVIT_EVENTID:
  1175. ath10k_wmi_event_pdev_qvit(ar, skb);
  1176. break;
  1177. case WMI_WLAN_PROFILE_DATA_EVENTID:
  1178. ath10k_wmi_event_wlan_profile_data(ar, skb);
  1179. break;
  1180. case WMI_RTT_MEASUREMENT_REPORT_EVENTID:
  1181. ath10k_wmi_event_rtt_measurement_report(ar, skb);
  1182. break;
  1183. case WMI_TSF_MEASUREMENT_REPORT_EVENTID:
  1184. ath10k_wmi_event_tsf_measurement_report(ar, skb);
  1185. break;
  1186. case WMI_RTT_ERROR_REPORT_EVENTID:
  1187. ath10k_wmi_event_rtt_error_report(ar, skb);
  1188. break;
  1189. case WMI_WOW_WAKEUP_HOST_EVENTID:
  1190. ath10k_wmi_event_wow_wakeup_host(ar, skb);
  1191. break;
  1192. case WMI_DCS_INTERFERENCE_EVENTID:
  1193. ath10k_wmi_event_dcs_interference(ar, skb);
  1194. break;
  1195. case WMI_PDEV_TPC_CONFIG_EVENTID:
  1196. ath10k_wmi_event_pdev_tpc_config(ar, skb);
  1197. break;
  1198. case WMI_PDEV_FTM_INTG_EVENTID:
  1199. ath10k_wmi_event_pdev_ftm_intg(ar, skb);
  1200. break;
  1201. case WMI_GTK_OFFLOAD_STATUS_EVENTID:
  1202. ath10k_wmi_event_gtk_offload_status(ar, skb);
  1203. break;
  1204. case WMI_GTK_REKEY_FAIL_EVENTID:
  1205. ath10k_wmi_event_gtk_rekey_fail(ar, skb);
  1206. break;
  1207. case WMI_TX_DELBA_COMPLETE_EVENTID:
  1208. ath10k_wmi_event_delba_complete(ar, skb);
  1209. break;
  1210. case WMI_TX_ADDBA_COMPLETE_EVENTID:
  1211. ath10k_wmi_event_addba_complete(ar, skb);
  1212. break;
  1213. case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID:
  1214. ath10k_wmi_event_vdev_install_key_complete(ar, skb);
  1215. break;
  1216. case WMI_SERVICE_READY_EVENTID:
  1217. ath10k_wmi_service_ready_event_rx(ar, skb);
  1218. break;
  1219. case WMI_READY_EVENTID:
  1220. ath10k_wmi_ready_event_rx(ar, skb);
  1221. break;
  1222. default:
  1223. ath10k_warn("Unknown eventid: %d\n", id);
  1224. break;
  1225. }
  1226. dev_kfree_skb(skb);
  1227. }
  1228. static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
  1229. {
  1230. if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
  1231. ath10k_warn("Firmware 10.X is not yet supported\n");
  1232. else
  1233. ath10k_wmi_main_process_rx(ar, skb);
  1234. }
  1235. /* WMI Initialization functions */
  1236. int ath10k_wmi_attach(struct ath10k *ar)
  1237. {
  1238. int ret;
  1239. if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
  1240. ath10k_warn("Firmware 10.X is not yet supported\n");
  1241. ar->wmi.cmd = &wmi_10x_cmd_map;
  1242. ret = -ENOTSUPP;
  1243. } else {
  1244. ar->wmi.cmd = &wmi_cmd_map;
  1245. ret = 0;
  1246. }
  1247. init_completion(&ar->wmi.service_ready);
  1248. init_completion(&ar->wmi.unified_ready);
  1249. init_waitqueue_head(&ar->wmi.tx_credits_wq);
  1250. return ret;
  1251. }
  1252. void ath10k_wmi_detach(struct ath10k *ar)
  1253. {
  1254. }
  1255. int ath10k_wmi_connect_htc_service(struct ath10k *ar)
  1256. {
  1257. int status;
  1258. struct ath10k_htc_svc_conn_req conn_req;
  1259. struct ath10k_htc_svc_conn_resp conn_resp;
  1260. memset(&conn_req, 0, sizeof(conn_req));
  1261. memset(&conn_resp, 0, sizeof(conn_resp));
  1262. /* these fields are the same for all service endpoints */
  1263. conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete;
  1264. conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx;
  1265. conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits;
  1266. /* connect to control service */
  1267. conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL;
  1268. status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
  1269. if (status) {
  1270. ath10k_warn("failed to connect to WMI CONTROL service status: %d\n",
  1271. status);
  1272. return status;
  1273. }
  1274. ar->wmi.eid = conn_resp.eid;
  1275. return 0;
  1276. }
  1277. int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g,
  1278. u16 rd5g, u16 ctl2g, u16 ctl5g)
  1279. {
  1280. struct wmi_pdev_set_regdomain_cmd *cmd;
  1281. struct sk_buff *skb;
  1282. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1283. if (!skb)
  1284. return -ENOMEM;
  1285. cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data;
  1286. cmd->reg_domain = __cpu_to_le32(rd);
  1287. cmd->reg_domain_2G = __cpu_to_le32(rd2g);
  1288. cmd->reg_domain_5G = __cpu_to_le32(rd5g);
  1289. cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
  1290. cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
  1291. ath10k_dbg(ATH10K_DBG_WMI,
  1292. "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
  1293. rd, rd2g, rd5g, ctl2g, ctl5g);
  1294. return ath10k_wmi_cmd_send(ar, skb,
  1295. ar->wmi.cmd->pdev_set_regdomain_cmdid);
  1296. }
  1297. int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
  1298. const struct wmi_channel_arg *arg)
  1299. {
  1300. struct wmi_set_channel_cmd *cmd;
  1301. struct sk_buff *skb;
  1302. if (arg->passive)
  1303. return -EINVAL;
  1304. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1305. if (!skb)
  1306. return -ENOMEM;
  1307. cmd = (struct wmi_set_channel_cmd *)skb->data;
  1308. cmd->chan.mhz = __cpu_to_le32(arg->freq);
  1309. cmd->chan.band_center_freq1 = __cpu_to_le32(arg->freq);
  1310. cmd->chan.mode = arg->mode;
  1311. cmd->chan.min_power = arg->min_power;
  1312. cmd->chan.max_power = arg->max_power;
  1313. cmd->chan.reg_power = arg->max_reg_power;
  1314. cmd->chan.reg_classid = arg->reg_class_id;
  1315. cmd->chan.antenna_max = arg->max_antenna_gain;
  1316. ath10k_dbg(ATH10K_DBG_WMI,
  1317. "wmi set channel mode %d freq %d\n",
  1318. arg->mode, arg->freq);
  1319. return ath10k_wmi_cmd_send(ar, skb,
  1320. ar->wmi.cmd->pdev_set_channel_cmdid);
  1321. }
  1322. int ath10k_wmi_pdev_suspend_target(struct ath10k *ar)
  1323. {
  1324. struct wmi_pdev_suspend_cmd *cmd;
  1325. struct sk_buff *skb;
  1326. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1327. if (!skb)
  1328. return -ENOMEM;
  1329. cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
  1330. cmd->suspend_opt = WMI_PDEV_SUSPEND;
  1331. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
  1332. }
  1333. int ath10k_wmi_pdev_resume_target(struct ath10k *ar)
  1334. {
  1335. struct sk_buff *skb;
  1336. skb = ath10k_wmi_alloc_skb(0);
  1337. if (skb == NULL)
  1338. return -ENOMEM;
  1339. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
  1340. }
  1341. int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id,
  1342. u32 value)
  1343. {
  1344. struct wmi_pdev_set_param_cmd *cmd;
  1345. struct sk_buff *skb;
  1346. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1347. if (!skb)
  1348. return -ENOMEM;
  1349. cmd = (struct wmi_pdev_set_param_cmd *)skb->data;
  1350. cmd->param_id = __cpu_to_le32(id);
  1351. cmd->param_value = __cpu_to_le32(value);
  1352. ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
  1353. id, value);
  1354. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
  1355. }
  1356. int ath10k_wmi_cmd_init(struct ath10k *ar)
  1357. {
  1358. struct wmi_init_cmd *cmd;
  1359. struct sk_buff *buf;
  1360. struct wmi_resource_config config = {};
  1361. u32 val;
  1362. config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
  1363. config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS + TARGET_NUM_VDEVS);
  1364. config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS);
  1365. config.num_offload_reorder_bufs =
  1366. __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS);
  1367. config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS);
  1368. config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS);
  1369. config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT);
  1370. config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK);
  1371. config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK);
  1372. config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
  1373. config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
  1374. config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI);
  1375. config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI);
  1376. config.rx_decap_mode = __cpu_to_le32(TARGET_RX_DECAP_MODE);
  1377. config.scan_max_pending_reqs =
  1378. __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS);
  1379. config.bmiss_offload_max_vdev =
  1380. __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV);
  1381. config.roam_offload_max_vdev =
  1382. __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV);
  1383. config.roam_offload_max_ap_profiles =
  1384. __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES);
  1385. config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS);
  1386. config.num_mcast_table_elems =
  1387. __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS);
  1388. config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE);
  1389. config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE);
  1390. config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES);
  1391. config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE);
  1392. config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM);
  1393. val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
  1394. config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
  1395. config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG);
  1396. config.gtk_offload_max_vdev =
  1397. __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV);
  1398. config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
  1399. config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
  1400. buf = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1401. if (!buf)
  1402. return -ENOMEM;
  1403. cmd = (struct wmi_init_cmd *)buf->data;
  1404. cmd->num_host_mem_chunks = 0;
  1405. memcpy(&cmd->resource_config, &config, sizeof(config));
  1406. ath10k_dbg(ATH10K_DBG_WMI, "wmi init\n");
  1407. return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->init_cmdid);
  1408. }
  1409. static int ath10k_wmi_start_scan_calc_len(const struct wmi_start_scan_arg *arg)
  1410. {
  1411. int len;
  1412. len = sizeof(struct wmi_start_scan_cmd);
  1413. if (arg->ie_len) {
  1414. if (!arg->ie)
  1415. return -EINVAL;
  1416. if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN)
  1417. return -EINVAL;
  1418. len += sizeof(struct wmi_ie_data);
  1419. len += roundup(arg->ie_len, 4);
  1420. }
  1421. if (arg->n_channels) {
  1422. if (!arg->channels)
  1423. return -EINVAL;
  1424. if (arg->n_channels > ARRAY_SIZE(arg->channels))
  1425. return -EINVAL;
  1426. len += sizeof(struct wmi_chan_list);
  1427. len += sizeof(__le32) * arg->n_channels;
  1428. }
  1429. if (arg->n_ssids) {
  1430. if (!arg->ssids)
  1431. return -EINVAL;
  1432. if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID)
  1433. return -EINVAL;
  1434. len += sizeof(struct wmi_ssid_list);
  1435. len += sizeof(struct wmi_ssid) * arg->n_ssids;
  1436. }
  1437. if (arg->n_bssids) {
  1438. if (!arg->bssids)
  1439. return -EINVAL;
  1440. if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID)
  1441. return -EINVAL;
  1442. len += sizeof(struct wmi_bssid_list);
  1443. len += sizeof(struct wmi_mac_addr) * arg->n_bssids;
  1444. }
  1445. return len;
  1446. }
  1447. int ath10k_wmi_start_scan(struct ath10k *ar,
  1448. const struct wmi_start_scan_arg *arg)
  1449. {
  1450. struct wmi_start_scan_cmd *cmd;
  1451. struct sk_buff *skb;
  1452. struct wmi_ie_data *ie;
  1453. struct wmi_chan_list *channels;
  1454. struct wmi_ssid_list *ssids;
  1455. struct wmi_bssid_list *bssids;
  1456. u32 scan_id;
  1457. u32 scan_req_id;
  1458. int off;
  1459. int len = 0;
  1460. int i;
  1461. len = ath10k_wmi_start_scan_calc_len(arg);
  1462. if (len < 0)
  1463. return len; /* len contains error code here */
  1464. skb = ath10k_wmi_alloc_skb(len);
  1465. if (!skb)
  1466. return -ENOMEM;
  1467. scan_id = WMI_HOST_SCAN_REQ_ID_PREFIX;
  1468. scan_id |= arg->scan_id;
  1469. scan_req_id = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
  1470. scan_req_id |= arg->scan_req_id;
  1471. cmd = (struct wmi_start_scan_cmd *)skb->data;
  1472. cmd->scan_id = __cpu_to_le32(scan_id);
  1473. cmd->scan_req_id = __cpu_to_le32(scan_req_id);
  1474. cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
  1475. cmd->scan_priority = __cpu_to_le32(arg->scan_priority);
  1476. cmd->notify_scan_events = __cpu_to_le32(arg->notify_scan_events);
  1477. cmd->dwell_time_active = __cpu_to_le32(arg->dwell_time_active);
  1478. cmd->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive);
  1479. cmd->min_rest_time = __cpu_to_le32(arg->min_rest_time);
  1480. cmd->max_rest_time = __cpu_to_le32(arg->max_rest_time);
  1481. cmd->repeat_probe_time = __cpu_to_le32(arg->repeat_probe_time);
  1482. cmd->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time);
  1483. cmd->idle_time = __cpu_to_le32(arg->idle_time);
  1484. cmd->max_scan_time = __cpu_to_le32(arg->max_scan_time);
  1485. cmd->probe_delay = __cpu_to_le32(arg->probe_delay);
  1486. cmd->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags);
  1487. /* TLV list starts after fields included in the struct */
  1488. off = sizeof(*cmd);
  1489. if (arg->n_channels) {
  1490. channels = (void *)skb->data + off;
  1491. channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG);
  1492. channels->num_chan = __cpu_to_le32(arg->n_channels);
  1493. for (i = 0; i < arg->n_channels; i++)
  1494. channels->channel_list[i] =
  1495. __cpu_to_le32(arg->channels[i]);
  1496. off += sizeof(*channels);
  1497. off += sizeof(__le32) * arg->n_channels;
  1498. }
  1499. if (arg->n_ssids) {
  1500. ssids = (void *)skb->data + off;
  1501. ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG);
  1502. ssids->num_ssids = __cpu_to_le32(arg->n_ssids);
  1503. for (i = 0; i < arg->n_ssids; i++) {
  1504. ssids->ssids[i].ssid_len =
  1505. __cpu_to_le32(arg->ssids[i].len);
  1506. memcpy(&ssids->ssids[i].ssid,
  1507. arg->ssids[i].ssid,
  1508. arg->ssids[i].len);
  1509. }
  1510. off += sizeof(*ssids);
  1511. off += sizeof(struct wmi_ssid) * arg->n_ssids;
  1512. }
  1513. if (arg->n_bssids) {
  1514. bssids = (void *)skb->data + off;
  1515. bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG);
  1516. bssids->num_bssid = __cpu_to_le32(arg->n_bssids);
  1517. for (i = 0; i < arg->n_bssids; i++)
  1518. memcpy(&bssids->bssid_list[i],
  1519. arg->bssids[i].bssid,
  1520. ETH_ALEN);
  1521. off += sizeof(*bssids);
  1522. off += sizeof(struct wmi_mac_addr) * arg->n_bssids;
  1523. }
  1524. if (arg->ie_len) {
  1525. ie = (void *)skb->data + off;
  1526. ie->tag = __cpu_to_le32(WMI_IE_TAG);
  1527. ie->ie_len = __cpu_to_le32(arg->ie_len);
  1528. memcpy(ie->ie_data, arg->ie, arg->ie_len);
  1529. off += sizeof(*ie);
  1530. off += roundup(arg->ie_len, 4);
  1531. }
  1532. if (off != skb->len) {
  1533. dev_kfree_skb(skb);
  1534. return -EINVAL;
  1535. }
  1536. ath10k_dbg(ATH10K_DBG_WMI, "wmi start scan\n");
  1537. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
  1538. }
  1539. void ath10k_wmi_start_scan_init(struct ath10k *ar,
  1540. struct wmi_start_scan_arg *arg)
  1541. {
  1542. /* setup commonly used values */
  1543. arg->scan_req_id = 1;
  1544. arg->scan_priority = WMI_SCAN_PRIORITY_LOW;
  1545. arg->dwell_time_active = 50;
  1546. arg->dwell_time_passive = 150;
  1547. arg->min_rest_time = 50;
  1548. arg->max_rest_time = 500;
  1549. arg->repeat_probe_time = 0;
  1550. arg->probe_spacing_time = 0;
  1551. arg->idle_time = 0;
  1552. arg->max_scan_time = 5000;
  1553. arg->probe_delay = 5;
  1554. arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
  1555. | WMI_SCAN_EVENT_COMPLETED
  1556. | WMI_SCAN_EVENT_BSS_CHANNEL
  1557. | WMI_SCAN_EVENT_FOREIGN_CHANNEL
  1558. | WMI_SCAN_EVENT_DEQUEUED;
  1559. arg->scan_ctrl_flags |= WMI_SCAN_ADD_OFDM_RATES;
  1560. arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT;
  1561. arg->n_bssids = 1;
  1562. arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF";
  1563. }
  1564. int ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
  1565. {
  1566. struct wmi_stop_scan_cmd *cmd;
  1567. struct sk_buff *skb;
  1568. u32 scan_id;
  1569. u32 req_id;
  1570. if (arg->req_id > 0xFFF)
  1571. return -EINVAL;
  1572. if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF)
  1573. return -EINVAL;
  1574. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1575. if (!skb)
  1576. return -ENOMEM;
  1577. scan_id = arg->u.scan_id;
  1578. scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX;
  1579. req_id = arg->req_id;
  1580. req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX;
  1581. cmd = (struct wmi_stop_scan_cmd *)skb->data;
  1582. cmd->req_type = __cpu_to_le32(arg->req_type);
  1583. cmd->vdev_id = __cpu_to_le32(arg->u.vdev_id);
  1584. cmd->scan_id = __cpu_to_le32(scan_id);
  1585. cmd->scan_req_id = __cpu_to_le32(req_id);
  1586. ath10k_dbg(ATH10K_DBG_WMI,
  1587. "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
  1588. arg->req_id, arg->req_type, arg->u.scan_id);
  1589. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
  1590. }
  1591. int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
  1592. enum wmi_vdev_type type,
  1593. enum wmi_vdev_subtype subtype,
  1594. const u8 macaddr[ETH_ALEN])
  1595. {
  1596. struct wmi_vdev_create_cmd *cmd;
  1597. struct sk_buff *skb;
  1598. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1599. if (!skb)
  1600. return -ENOMEM;
  1601. cmd = (struct wmi_vdev_create_cmd *)skb->data;
  1602. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1603. cmd->vdev_type = __cpu_to_le32(type);
  1604. cmd->vdev_subtype = __cpu_to_le32(subtype);
  1605. memcpy(cmd->vdev_macaddr.addr, macaddr, ETH_ALEN);
  1606. ath10k_dbg(ATH10K_DBG_WMI,
  1607. "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
  1608. vdev_id, type, subtype, macaddr);
  1609. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
  1610. }
  1611. int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
  1612. {
  1613. struct wmi_vdev_delete_cmd *cmd;
  1614. struct sk_buff *skb;
  1615. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1616. if (!skb)
  1617. return -ENOMEM;
  1618. cmd = (struct wmi_vdev_delete_cmd *)skb->data;
  1619. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1620. ath10k_dbg(ATH10K_DBG_WMI,
  1621. "WMI vdev delete id %d\n", vdev_id);
  1622. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
  1623. }
  1624. static int ath10k_wmi_vdev_start_restart(struct ath10k *ar,
  1625. const struct wmi_vdev_start_request_arg *arg,
  1626. u32 cmd_id)
  1627. {
  1628. struct wmi_vdev_start_request_cmd *cmd;
  1629. struct sk_buff *skb;
  1630. const char *cmdname;
  1631. u32 flags = 0;
  1632. if (cmd_id != ar->wmi.cmd->vdev_start_request_cmdid &&
  1633. cmd_id != ar->wmi.cmd->vdev_restart_request_cmdid)
  1634. return -EINVAL;
  1635. if (WARN_ON(arg->ssid && arg->ssid_len == 0))
  1636. return -EINVAL;
  1637. if (WARN_ON(arg->hidden_ssid && !arg->ssid))
  1638. return -EINVAL;
  1639. if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
  1640. return -EINVAL;
  1641. if (cmd_id == ar->wmi.cmd->vdev_start_request_cmdid)
  1642. cmdname = "start";
  1643. else if (cmd_id == ar->wmi.cmd->vdev_restart_request_cmdid)
  1644. cmdname = "restart";
  1645. else
  1646. return -EINVAL; /* should not happen, we already check cmd_id */
  1647. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1648. if (!skb)
  1649. return -ENOMEM;
  1650. if (arg->hidden_ssid)
  1651. flags |= WMI_VDEV_START_HIDDEN_SSID;
  1652. if (arg->pmf_enabled)
  1653. flags |= WMI_VDEV_START_PMF_ENABLED;
  1654. cmd = (struct wmi_vdev_start_request_cmd *)skb->data;
  1655. cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
  1656. cmd->disable_hw_ack = __cpu_to_le32(arg->disable_hw_ack);
  1657. cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval);
  1658. cmd->dtim_period = __cpu_to_le32(arg->dtim_period);
  1659. cmd->flags = __cpu_to_le32(flags);
  1660. cmd->bcn_tx_rate = __cpu_to_le32(arg->bcn_tx_rate);
  1661. cmd->bcn_tx_power = __cpu_to_le32(arg->bcn_tx_power);
  1662. if (arg->ssid) {
  1663. cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len);
  1664. memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len);
  1665. }
  1666. cmd->chan.mhz = __cpu_to_le32(arg->channel.freq);
  1667. cmd->chan.band_center_freq1 =
  1668. __cpu_to_le32(arg->channel.band_center_freq1);
  1669. cmd->chan.mode = arg->channel.mode;
  1670. cmd->chan.min_power = arg->channel.min_power;
  1671. cmd->chan.max_power = arg->channel.max_power;
  1672. cmd->chan.reg_power = arg->channel.max_reg_power;
  1673. cmd->chan.reg_classid = arg->channel.reg_class_id;
  1674. cmd->chan.antenna_max = arg->channel.max_antenna_gain;
  1675. ath10k_dbg(ATH10K_DBG_WMI,
  1676. "wmi vdev %s id 0x%x freq %d, mode %d, ch_flags: 0x%0X,"
  1677. "max_power: %d\n", cmdname, arg->vdev_id, arg->channel.freq,
  1678. arg->channel.mode, flags, arg->channel.max_power);
  1679. return ath10k_wmi_cmd_send(ar, skb, cmd_id);
  1680. }
  1681. int ath10k_wmi_vdev_start(struct ath10k *ar,
  1682. const struct wmi_vdev_start_request_arg *arg)
  1683. {
  1684. u32 cmd_id = ar->wmi.cmd->vdev_start_request_cmdid;
  1685. return ath10k_wmi_vdev_start_restart(ar, arg, cmd_id);
  1686. }
  1687. int ath10k_wmi_vdev_restart(struct ath10k *ar,
  1688. const struct wmi_vdev_start_request_arg *arg)
  1689. {
  1690. u32 cmd_id = ar->wmi.cmd->vdev_restart_request_cmdid;
  1691. return ath10k_wmi_vdev_start_restart(ar, arg, cmd_id);
  1692. }
  1693. int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
  1694. {
  1695. struct wmi_vdev_stop_cmd *cmd;
  1696. struct sk_buff *skb;
  1697. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1698. if (!skb)
  1699. return -ENOMEM;
  1700. cmd = (struct wmi_vdev_stop_cmd *)skb->data;
  1701. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1702. ath10k_dbg(ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
  1703. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);
  1704. }
  1705. int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
  1706. {
  1707. struct wmi_vdev_up_cmd *cmd;
  1708. struct sk_buff *skb;
  1709. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1710. if (!skb)
  1711. return -ENOMEM;
  1712. cmd = (struct wmi_vdev_up_cmd *)skb->data;
  1713. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1714. cmd->vdev_assoc_id = __cpu_to_le32(aid);
  1715. memcpy(&cmd->vdev_bssid.addr, bssid, 6);
  1716. ath10k_dbg(ATH10K_DBG_WMI,
  1717. "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
  1718. vdev_id, aid, bssid);
  1719. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);
  1720. }
  1721. int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
  1722. {
  1723. struct wmi_vdev_down_cmd *cmd;
  1724. struct sk_buff *skb;
  1725. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1726. if (!skb)
  1727. return -ENOMEM;
  1728. cmd = (struct wmi_vdev_down_cmd *)skb->data;
  1729. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1730. ath10k_dbg(ATH10K_DBG_WMI,
  1731. "wmi mgmt vdev down id 0x%x\n", vdev_id);
  1732. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
  1733. }
  1734. int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id,
  1735. enum wmi_vdev_param param_id, u32 param_value)
  1736. {
  1737. struct wmi_vdev_set_param_cmd *cmd;
  1738. struct sk_buff *skb;
  1739. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1740. if (!skb)
  1741. return -ENOMEM;
  1742. cmd = (struct wmi_vdev_set_param_cmd *)skb->data;
  1743. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1744. cmd->param_id = __cpu_to_le32(param_id);
  1745. cmd->param_value = __cpu_to_le32(param_value);
  1746. ath10k_dbg(ATH10K_DBG_WMI,
  1747. "wmi vdev id 0x%x set param %d value %d\n",
  1748. vdev_id, param_id, param_value);
  1749. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
  1750. }
  1751. int ath10k_wmi_vdev_install_key(struct ath10k *ar,
  1752. const struct wmi_vdev_install_key_arg *arg)
  1753. {
  1754. struct wmi_vdev_install_key_cmd *cmd;
  1755. struct sk_buff *skb;
  1756. if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
  1757. return -EINVAL;
  1758. if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
  1759. return -EINVAL;
  1760. skb = ath10k_wmi_alloc_skb(sizeof(*cmd) + arg->key_len);
  1761. if (!skb)
  1762. return -ENOMEM;
  1763. cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
  1764. cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
  1765. cmd->key_idx = __cpu_to_le32(arg->key_idx);
  1766. cmd->key_flags = __cpu_to_le32(arg->key_flags);
  1767. cmd->key_cipher = __cpu_to_le32(arg->key_cipher);
  1768. cmd->key_len = __cpu_to_le32(arg->key_len);
  1769. cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len);
  1770. cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
  1771. if (arg->macaddr)
  1772. memcpy(cmd->peer_macaddr.addr, arg->macaddr, ETH_ALEN);
  1773. if (arg->key_data)
  1774. memcpy(cmd->key_data, arg->key_data, arg->key_len);
  1775. ath10k_dbg(ATH10K_DBG_WMI,
  1776. "wmi vdev install key idx %d cipher %d len %d\n",
  1777. arg->key_idx, arg->key_cipher, arg->key_len);
  1778. return ath10k_wmi_cmd_send(ar, skb,
  1779. ar->wmi.cmd->vdev_install_key_cmdid);
  1780. }
  1781. int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
  1782. const u8 peer_addr[ETH_ALEN])
  1783. {
  1784. struct wmi_peer_create_cmd *cmd;
  1785. struct sk_buff *skb;
  1786. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1787. if (!skb)
  1788. return -ENOMEM;
  1789. cmd = (struct wmi_peer_create_cmd *)skb->data;
  1790. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1791. memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);
  1792. ath10k_dbg(ATH10K_DBG_WMI,
  1793. "wmi peer create vdev_id %d peer_addr %pM\n",
  1794. vdev_id, peer_addr);
  1795. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
  1796. }
  1797. int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
  1798. const u8 peer_addr[ETH_ALEN])
  1799. {
  1800. struct wmi_peer_delete_cmd *cmd;
  1801. struct sk_buff *skb;
  1802. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1803. if (!skb)
  1804. return -ENOMEM;
  1805. cmd = (struct wmi_peer_delete_cmd *)skb->data;
  1806. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1807. memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);
  1808. ath10k_dbg(ATH10K_DBG_WMI,
  1809. "wmi peer delete vdev_id %d peer_addr %pM\n",
  1810. vdev_id, peer_addr);
  1811. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);
  1812. }
  1813. int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
  1814. const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)
  1815. {
  1816. struct wmi_peer_flush_tids_cmd *cmd;
  1817. struct sk_buff *skb;
  1818. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1819. if (!skb)
  1820. return -ENOMEM;
  1821. cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
  1822. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1823. cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
  1824. memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);
  1825. ath10k_dbg(ATH10K_DBG_WMI,
  1826. "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
  1827. vdev_id, peer_addr, tid_bitmap);
  1828. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
  1829. }
  1830. int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id,
  1831. const u8 *peer_addr, enum wmi_peer_param param_id,
  1832. u32 param_value)
  1833. {
  1834. struct wmi_peer_set_param_cmd *cmd;
  1835. struct sk_buff *skb;
  1836. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1837. if (!skb)
  1838. return -ENOMEM;
  1839. cmd = (struct wmi_peer_set_param_cmd *)skb->data;
  1840. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1841. cmd->param_id = __cpu_to_le32(param_id);
  1842. cmd->param_value = __cpu_to_le32(param_value);
  1843. memcpy(&cmd->peer_macaddr.addr, peer_addr, 6);
  1844. ath10k_dbg(ATH10K_DBG_WMI,
  1845. "wmi vdev %d peer 0x%pM set param %d value %d\n",
  1846. vdev_id, peer_addr, param_id, param_value);
  1847. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
  1848. }
  1849. int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
  1850. enum wmi_sta_ps_mode psmode)
  1851. {
  1852. struct wmi_sta_powersave_mode_cmd *cmd;
  1853. struct sk_buff *skb;
  1854. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1855. if (!skb)
  1856. return -ENOMEM;
  1857. cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data;
  1858. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1859. cmd->sta_ps_mode = __cpu_to_le32(psmode);
  1860. ath10k_dbg(ATH10K_DBG_WMI,
  1861. "wmi set powersave id 0x%x mode %d\n",
  1862. vdev_id, psmode);
  1863. return ath10k_wmi_cmd_send(ar, skb,
  1864. ar->wmi.cmd->sta_powersave_mode_cmdid);
  1865. }
  1866. int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
  1867. enum wmi_sta_powersave_param param_id,
  1868. u32 value)
  1869. {
  1870. struct wmi_sta_powersave_param_cmd *cmd;
  1871. struct sk_buff *skb;
  1872. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1873. if (!skb)
  1874. return -ENOMEM;
  1875. cmd = (struct wmi_sta_powersave_param_cmd *)skb->data;
  1876. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1877. cmd->param_id = __cpu_to_le32(param_id);
  1878. cmd->param_value = __cpu_to_le32(value);
  1879. ath10k_dbg(ATH10K_DBG_WMI,
  1880. "wmi sta ps param vdev_id 0x%x param %d value %d\n",
  1881. vdev_id, param_id, value);
  1882. return ath10k_wmi_cmd_send(ar, skb,
  1883. ar->wmi.cmd->sta_powersave_param_cmdid);
  1884. }
  1885. int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
  1886. enum wmi_ap_ps_peer_param param_id, u32 value)
  1887. {
  1888. struct wmi_ap_ps_peer_cmd *cmd;
  1889. struct sk_buff *skb;
  1890. if (!mac)
  1891. return -EINVAL;
  1892. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1893. if (!skb)
  1894. return -ENOMEM;
  1895. cmd = (struct wmi_ap_ps_peer_cmd *)skb->data;
  1896. cmd->vdev_id = __cpu_to_le32(vdev_id);
  1897. cmd->param_id = __cpu_to_le32(param_id);
  1898. cmd->param_value = __cpu_to_le32(value);
  1899. memcpy(&cmd->peer_macaddr, mac, ETH_ALEN);
  1900. ath10k_dbg(ATH10K_DBG_WMI,
  1901. "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
  1902. vdev_id, param_id, value, mac);
  1903. return ath10k_wmi_cmd_send(ar, skb,
  1904. ar->wmi.cmd->ap_ps_peer_param_cmdid);
  1905. }
  1906. int ath10k_wmi_scan_chan_list(struct ath10k *ar,
  1907. const struct wmi_scan_chan_list_arg *arg)
  1908. {
  1909. struct wmi_scan_chan_list_cmd *cmd;
  1910. struct sk_buff *skb;
  1911. struct wmi_channel_arg *ch;
  1912. struct wmi_channel *ci;
  1913. int len;
  1914. int i;
  1915. len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel);
  1916. skb = ath10k_wmi_alloc_skb(len);
  1917. if (!skb)
  1918. return -EINVAL;
  1919. cmd = (struct wmi_scan_chan_list_cmd *)skb->data;
  1920. cmd->num_scan_chans = __cpu_to_le32(arg->n_channels);
  1921. for (i = 0; i < arg->n_channels; i++) {
  1922. u32 flags = 0;
  1923. ch = &arg->channels[i];
  1924. ci = &cmd->chan_info[i];
  1925. if (ch->passive)
  1926. flags |= WMI_CHAN_FLAG_PASSIVE;
  1927. if (ch->allow_ibss)
  1928. flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
  1929. if (ch->allow_ht)
  1930. flags |= WMI_CHAN_FLAG_ALLOW_HT;
  1931. if (ch->allow_vht)
  1932. flags |= WMI_CHAN_FLAG_ALLOW_VHT;
  1933. if (ch->ht40plus)
  1934. flags |= WMI_CHAN_FLAG_HT40_PLUS;
  1935. ci->mhz = __cpu_to_le32(ch->freq);
  1936. ci->band_center_freq1 = __cpu_to_le32(ch->freq);
  1937. ci->band_center_freq2 = 0;
  1938. ci->min_power = ch->min_power;
  1939. ci->max_power = ch->max_power;
  1940. ci->reg_power = ch->max_reg_power;
  1941. ci->antenna_max = ch->max_antenna_gain;
  1942. ci->antenna_max = 0;
  1943. /* mode & flags share storage */
  1944. ci->mode = ch->mode;
  1945. ci->flags |= __cpu_to_le32(flags);
  1946. }
  1947. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
  1948. }
  1949. int ath10k_wmi_peer_assoc(struct ath10k *ar,
  1950. const struct wmi_peer_assoc_complete_arg *arg)
  1951. {
  1952. struct wmi_peer_assoc_complete_cmd *cmd;
  1953. struct sk_buff *skb;
  1954. if (arg->peer_mpdu_density > 16)
  1955. return -EINVAL;
  1956. if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES)
  1957. return -EINVAL;
  1958. if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES)
  1959. return -EINVAL;
  1960. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  1961. if (!skb)
  1962. return -ENOMEM;
  1963. cmd = (struct wmi_peer_assoc_complete_cmd *)skb->data;
  1964. cmd->vdev_id = __cpu_to_le32(arg->vdev_id);
  1965. cmd->peer_new_assoc = __cpu_to_le32(arg->peer_reassoc ? 0 : 1);
  1966. cmd->peer_associd = __cpu_to_le32(arg->peer_aid);
  1967. cmd->peer_flags = __cpu_to_le32(arg->peer_flags);
  1968. cmd->peer_caps = __cpu_to_le32(arg->peer_caps);
  1969. cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval);
  1970. cmd->peer_ht_caps = __cpu_to_le32(arg->peer_ht_caps);
  1971. cmd->peer_max_mpdu = __cpu_to_le32(arg->peer_max_mpdu);
  1972. cmd->peer_mpdu_density = __cpu_to_le32(arg->peer_mpdu_density);
  1973. cmd->peer_rate_caps = __cpu_to_le32(arg->peer_rate_caps);
  1974. cmd->peer_nss = __cpu_to_le32(arg->peer_num_spatial_streams);
  1975. cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps);
  1976. cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode);
  1977. memcpy(cmd->peer_macaddr.addr, arg->addr, ETH_ALEN);
  1978. cmd->peer_legacy_rates.num_rates =
  1979. __cpu_to_le32(arg->peer_legacy_rates.num_rates);
  1980. memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates,
  1981. arg->peer_legacy_rates.num_rates);
  1982. cmd->peer_ht_rates.num_rates =
  1983. __cpu_to_le32(arg->peer_ht_rates.num_rates);
  1984. memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
  1985. arg->peer_ht_rates.num_rates);
  1986. cmd->peer_vht_rates.rx_max_rate =
  1987. __cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
  1988. cmd->peer_vht_rates.rx_mcs_set =
  1989. __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
  1990. cmd->peer_vht_rates.tx_max_rate =
  1991. __cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
  1992. cmd->peer_vht_rates.tx_mcs_set =
  1993. __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
  1994. ath10k_dbg(ATH10K_DBG_WMI,
  1995. "wmi peer assoc vdev %d addr %pM\n",
  1996. arg->vdev_id, arg->addr);
  1997. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
  1998. }
  1999. int ath10k_wmi_beacon_send_nowait(struct ath10k *ar,
  2000. const struct wmi_bcn_tx_arg *arg)
  2001. {
  2002. struct wmi_bcn_tx_cmd *cmd;
  2003. struct sk_buff *skb;
  2004. skb = ath10k_wmi_alloc_skb(sizeof(*cmd) + arg->bcn_len);
  2005. if (!skb)
  2006. return -ENOMEM;
  2007. cmd = (struct wmi_bcn_tx_cmd *)skb->data;
  2008. cmd->hdr.vdev_id = __cpu_to_le32(arg->vdev_id);
  2009. cmd->hdr.tx_rate = __cpu_to_le32(arg->tx_rate);
  2010. cmd->hdr.tx_power = __cpu_to_le32(arg->tx_power);
  2011. cmd->hdr.bcn_len = __cpu_to_le32(arg->bcn_len);
  2012. memcpy(cmd->bcn, arg->bcn, arg->bcn_len);
  2013. return ath10k_wmi_cmd_send_nowait(ar, skb, ar->wmi.cmd->bcn_tx_cmdid);
  2014. }
  2015. static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
  2016. const struct wmi_wmm_params_arg *arg)
  2017. {
  2018. params->cwmin = __cpu_to_le32(arg->cwmin);
  2019. params->cwmax = __cpu_to_le32(arg->cwmax);
  2020. params->aifs = __cpu_to_le32(arg->aifs);
  2021. params->txop = __cpu_to_le32(arg->txop);
  2022. params->acm = __cpu_to_le32(arg->acm);
  2023. params->no_ack = __cpu_to_le32(arg->no_ack);
  2024. }
  2025. int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
  2026. const struct wmi_pdev_set_wmm_params_arg *arg)
  2027. {
  2028. struct wmi_pdev_set_wmm_params *cmd;
  2029. struct sk_buff *skb;
  2030. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  2031. if (!skb)
  2032. return -ENOMEM;
  2033. cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
  2034. ath10k_wmi_pdev_set_wmm_param(&cmd->ac_be, &arg->ac_be);
  2035. ath10k_wmi_pdev_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
  2036. ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
  2037. ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
  2038. ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
  2039. return ath10k_wmi_cmd_send(ar, skb,
  2040. ar->wmi.cmd->pdev_set_wmm_params_cmdid);
  2041. }
  2042. int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
  2043. {
  2044. struct wmi_request_stats_cmd *cmd;
  2045. struct sk_buff *skb;
  2046. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  2047. if (!skb)
  2048. return -ENOMEM;
  2049. cmd = (struct wmi_request_stats_cmd *)skb->data;
  2050. cmd->stats_id = __cpu_to_le32(stats_id);
  2051. ath10k_dbg(ATH10K_DBG_WMI, "wmi request stats %d\n", (int)stats_id);
  2052. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
  2053. }
  2054. int ath10k_wmi_force_fw_hang(struct ath10k *ar,
  2055. enum wmi_force_fw_hang_type type, u32 delay_ms)
  2056. {
  2057. struct wmi_force_fw_hang_cmd *cmd;
  2058. struct sk_buff *skb;
  2059. skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
  2060. if (!skb)
  2061. return -ENOMEM;
  2062. cmd = (struct wmi_force_fw_hang_cmd *)skb->data;
  2063. cmd->type = __cpu_to_le32(type);
  2064. cmd->delay_ms = __cpu_to_le32(delay_ms);
  2065. ath10k_dbg(ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
  2066. type, delay_ms);
  2067. return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
  2068. }