wmi_unified_twt_tlv.c 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376
  1. /*
  2. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #include <osdep.h>
  20. #include "wmi.h"
  21. #include "wmi_unified_priv.h"
  22. #include "wmi_unified_twt_param.h"
  23. #include "wmi_unified_twt_api.h"
  24. #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
  25. static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,
  26. struct twt_enable_param *params)
  27. {
  28. wmi_twt_enable_cmd_fixed_param *cmd;
  29. wmi_buf_t buf;
  30. QDF_STATUS status;
  31. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  32. if (!buf) {
  33. wmi_err("Failed to allocate memory");
  34. return QDF_STATUS_E_FAILURE;
  35. }
  36. cmd = (wmi_twt_enable_cmd_fixed_param *)wmi_buf_data(buf);
  37. WMITLV_SET_HDR(&cmd->tlv_header,
  38. WMITLV_TAG_STRUC_wmi_twt_enable_cmd_fixed_param,
  39. WMITLV_GET_STRUCT_TLVLEN
  40. (wmi_twt_enable_cmd_fixed_param));
  41. cmd->pdev_id =
  42. wmi_handle->ops->convert_pdev_id_host_to_target(
  43. wmi_handle,
  44. params->pdev_id);
  45. cmd->sta_cong_timer_ms = params->sta_cong_timer_ms;
  46. cmd->mbss_support = params->mbss_support;
  47. cmd->default_slot_size = params->default_slot_size;
  48. cmd->congestion_thresh_setup = params->congestion_thresh_setup;
  49. cmd->congestion_thresh_teardown = params->congestion_thresh_teardown;
  50. cmd->congestion_thresh_critical = params->congestion_thresh_critical;
  51. cmd->interference_thresh_teardown =
  52. params->interference_thresh_teardown;
  53. cmd->interference_thresh_setup = params->interference_thresh_setup;
  54. cmd->min_no_sta_setup = params->min_no_sta_setup;
  55. cmd->min_no_sta_teardown = params->min_no_sta_teardown;
  56. cmd->no_of_bcast_mcast_slots = params->no_of_bcast_mcast_slots;
  57. cmd->min_no_twt_slots = params->min_no_twt_slots;
  58. cmd->max_no_sta_twt = params->max_no_sta_twt;
  59. cmd->mode_check_interval = params->mode_check_interval;
  60. cmd->add_sta_slot_interval = params->add_sta_slot_interval;
  61. cmd->remove_sta_slot_interval = params->remove_sta_slot_interval;
  62. TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable);
  63. TWT_EN_DIS_FLAGS_SET_B_R_TWT(cmd->flags, params->r_twt_enable);
  64. TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags,
  65. params->b_twt_legacy_mbss_enable);
  66. TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags,
  67. params->b_twt_ax_mbss_enable);
  68. if (params->ext_conf_present) {
  69. TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
  70. TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
  71. TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
  72. }
  73. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  74. WMI_TWT_ENABLE_CMDID);
  75. if (QDF_IS_STATUS_ERROR(status)) {
  76. wmi_err("Failed to send WMI_TWT_ENABLE_CMDID");
  77. wmi_buf_free(buf);
  78. }
  79. return status;
  80. }
  81. static WMI_DISABLE_TWT_REASON_T
  82. wmi_convert_dis_reason_code(enum HOST_TWT_DISABLE_REASON reason)
  83. {
  84. switch (reason) {
  85. case HOST_TWT_DISABLE_REASON_NONE:
  86. return WMI_DISABLE_TWT_REASON_NONE;
  87. case HOST_TWT_DISABLE_REASON_CONCURRENCY_SCC:
  88. return WMI_DISABLE_TWT_REASON_CONCURRENCY_SCC;
  89. case HOST_TWT_DISABLE_REASON_CONCURRENCY_MCC:
  90. return WMI_DISABLE_TWT_REASON_CONCURRENCY_MCC;
  91. case HOST_TWT_DISABLE_REASON_CHANGE_CONGESTION_TIMEOUT:
  92. return WMI_DISABLE_TWT_REASON_CHANGE_CONGESTION_TIMEOUT;
  93. case HOST_TWT_DISABLE_REASON_P2P_GO_NOA:
  94. return WMI_DISABLE_TWT_REASON_P2P_GO_NOA;
  95. default:
  96. return WMI_DISABLE_TWT_REASON_NONE;
  97. }
  98. }
  99. static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
  100. struct twt_disable_param *params)
  101. {
  102. wmi_twt_disable_cmd_fixed_param *cmd;
  103. wmi_buf_t buf;
  104. QDF_STATUS status;
  105. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  106. if (!buf) {
  107. wmi_err("Failed to allocate memory");
  108. return QDF_STATUS_E_FAILURE;
  109. }
  110. cmd = (wmi_twt_disable_cmd_fixed_param *)wmi_buf_data(buf);
  111. WMITLV_SET_HDR(&cmd->tlv_header,
  112. WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
  113. WMITLV_GET_STRUCT_TLVLEN
  114. (wmi_twt_disable_cmd_fixed_param));
  115. cmd->pdev_id =
  116. wmi_handle->ops->convert_pdev_id_host_to_target(
  117. wmi_handle,
  118. params->pdev_id);
  119. if (params->ext_conf_present) {
  120. TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
  121. TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
  122. TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
  123. }
  124. cmd->reason_code = wmi_convert_dis_reason_code(
  125. params->dis_reason_code);
  126. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  127. WMI_TWT_DISABLE_CMDID);
  128. if (QDF_IS_STATUS_ERROR(status)) {
  129. wmi_err("Failed to send WMI_TWT_DISABLE_CMDID");
  130. wmi_buf_free(buf);
  131. }
  132. return status;
  133. }
  134. #ifdef WLAN_SUPPORT_BCAST_TWT
  135. static void
  136. twt_add_dialog_set_bcast_twt_params(struct twt_add_dialog_param *params,
  137. wmi_twt_add_dialog_cmd_fixed_param *cmd)
  138. {
  139. TWT_FLAGS_SET_BTWT_ID0(cmd->flags, params->flag_b_twt_id0);
  140. cmd->b_twt_persistence = params->b_twt_persistence;
  141. cmd->b_twt_recommendation = params->b_twt_recommendation;
  142. }
  143. #else
  144. static void
  145. twt_add_dialog_set_bcast_twt_params(struct twt_add_dialog_param *params,
  146. wmi_twt_add_dialog_cmd_fixed_param *cmd)
  147. {
  148. }
  149. #endif
  150. static QDF_STATUS
  151. send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  152. struct twt_add_dialog_param *params)
  153. {
  154. wmi_twt_add_dialog_cmd_fixed_param *cmd;
  155. wmi_buf_t buf;
  156. QDF_STATUS status;
  157. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  158. if (!buf) {
  159. wmi_err("Failed to allocate memory");
  160. return QDF_STATUS_E_FAILURE;
  161. }
  162. cmd = (wmi_twt_add_dialog_cmd_fixed_param *)wmi_buf_data(buf);
  163. WMITLV_SET_HDR(&cmd->tlv_header,
  164. WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
  165. WMITLV_GET_STRUCT_TLVLEN
  166. (wmi_twt_add_dialog_cmd_fixed_param));
  167. cmd->vdev_id = params->vdev_id;
  168. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  169. &cmd->peer_macaddr);
  170. cmd->dialog_id = params->dialog_id;
  171. cmd->wake_intvl_us = params->wake_intvl_us;
  172. cmd->wake_intvl_mantis = params->wake_intvl_mantis;
  173. cmd->wake_dura_us = params->wake_dura_us;
  174. cmd->sp_offset_us = params->sp_offset_us;
  175. cmd->min_wake_intvl_us = params->min_wake_intvl_us;
  176. cmd->max_wake_intvl_us = params->max_wake_intvl_us;
  177. cmd->min_wake_dura_us = params->min_wake_dura_us;
  178. cmd->max_wake_dura_us = params->max_wake_dura_us;
  179. cmd->sp_start_tsf_lo = (uint32_t)(params->wake_time_tsf & 0xFFFFFFFF);
  180. cmd->sp_start_tsf_hi = (uint32_t)(params->wake_time_tsf >> 32);
  181. cmd->announce_timeout_us = params->announce_timeout_us;
  182. cmd->link_id_bitmap = params->link_id_bitmap;
  183. cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
  184. cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
  185. TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
  186. TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
  187. TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
  188. TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
  189. TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
  190. twt_add_dialog_set_bcast_twt_params(params, cmd);
  191. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  192. WMI_TWT_ADD_DIALOG_CMDID);
  193. if (QDF_IS_STATUS_ERROR(status)) {
  194. wmi_err("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
  195. wmi_buf_free(buf);
  196. }
  197. return status;
  198. }
  199. #ifdef WLAN_SUPPORT_BCAST_TWT
  200. static void
  201. twt_del_dialog_set_bcast_twt_params(struct twt_del_dialog_param *params,
  202. wmi_twt_del_dialog_cmd_fixed_param *cmd)
  203. {
  204. cmd->b_twt_persistence = params->b_twt_persistence;
  205. }
  206. #else
  207. static void
  208. twt_del_dialog_set_bcast_twt_params(struct twt_del_dialog_param *params,
  209. wmi_twt_del_dialog_cmd_fixed_param *cmd)
  210. {
  211. }
  212. #endif
  213. static QDF_STATUS
  214. send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  215. struct twt_del_dialog_param *params)
  216. {
  217. wmi_twt_del_dialog_cmd_fixed_param *cmd;
  218. wmi_buf_t buf;
  219. QDF_STATUS status;
  220. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  221. if (!buf) {
  222. wmi_err("Failed to allocate memory");
  223. return QDF_STATUS_E_FAILURE;
  224. }
  225. cmd = (wmi_twt_del_dialog_cmd_fixed_param *)wmi_buf_data(buf);
  226. WMITLV_SET_HDR(&cmd->tlv_header,
  227. WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
  228. WMITLV_GET_STRUCT_TLVLEN
  229. (wmi_twt_del_dialog_cmd_fixed_param));
  230. cmd->vdev_id = params->vdev_id;
  231. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  232. &cmd->peer_macaddr);
  233. cmd->dialog_id = params->dialog_id;
  234. twt_del_dialog_set_bcast_twt_params(params, cmd);
  235. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  236. WMI_TWT_DEL_DIALOG_CMDID);
  237. if (QDF_IS_STATUS_ERROR(status)) {
  238. wmi_err("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
  239. wmi_buf_free(buf);
  240. }
  241. return status;
  242. }
  243. static QDF_STATUS
  244. send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  245. struct twt_pause_dialog_cmd_param *params)
  246. {
  247. wmi_twt_pause_dialog_cmd_fixed_param *cmd;
  248. wmi_buf_t buf;
  249. QDF_STATUS status;
  250. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  251. if (!buf) {
  252. wmi_err("Failed to allocate memory");
  253. return QDF_STATUS_E_FAILURE;
  254. }
  255. cmd = (wmi_twt_pause_dialog_cmd_fixed_param *)wmi_buf_data(buf);
  256. WMITLV_SET_HDR(&cmd->tlv_header,
  257. WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
  258. WMITLV_GET_STRUCT_TLVLEN
  259. (wmi_twt_pause_dialog_cmd_fixed_param));
  260. cmd->vdev_id = params->vdev_id;
  261. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  262. &cmd->peer_macaddr);
  263. cmd->dialog_id = params->dialog_id;
  264. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  265. WMI_TWT_PAUSE_DIALOG_CMDID);
  266. if (QDF_IS_STATUS_ERROR(status)) {
  267. wmi_err("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
  268. wmi_buf_free(buf);
  269. }
  270. return status;
  271. }
  272. static QDF_STATUS
  273. send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  274. struct twt_nudge_dialog_cmd_param *params)
  275. {
  276. wmi_twt_nudge_dialog_cmd_fixed_param *cmd;
  277. wmi_buf_t buf;
  278. QDF_STATUS status;
  279. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  280. if (!buf)
  281. return QDF_STATUS_E_FAILURE;
  282. cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *)wmi_buf_data(buf);
  283. WMITLV_SET_HDR(&cmd->tlv_header,
  284. WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param,
  285. WMITLV_GET_STRUCT_TLVLEN
  286. (wmi_twt_nudge_dialog_cmd_fixed_param));
  287. cmd->vdev_id = params->vdev_id;
  288. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  289. &cmd->peer_macaddr);
  290. cmd->dialog_id = params->dialog_id;
  291. cmd->suspend_duration_ms = params->suspend_duration / 1000;
  292. cmd->next_twt_size = params->next_twt_size;
  293. cmd->sp_start_offset = params->sp_start_offset;
  294. wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d "
  295. "peer_macaddr: " QDF_MAC_ADDR_FMT " sp_start_offset: %d",
  296. cmd->vdev_id, cmd->dialog_id, cmd->suspend_duration_ms,
  297. cmd->next_twt_size,
  298. QDF_MAC_ADDR_REF(params->peer_macaddr.bytes),
  299. cmd->sp_start_offset);
  300. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  301. WMI_TWT_NUDGE_DIALOG_CMDID);
  302. if (QDF_IS_STATUS_ERROR(status))
  303. wmi_buf_free(buf);
  304. return status;
  305. }
  306. static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  307. struct twt_resume_dialog_cmd_param *params)
  308. {
  309. wmi_twt_resume_dialog_cmd_fixed_param *cmd;
  310. wmi_buf_t buf;
  311. QDF_STATUS status;
  312. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  313. if (!buf) {
  314. wmi_err("Failed to allocate memory");
  315. return QDF_STATUS_E_FAILURE;
  316. }
  317. cmd = (wmi_twt_resume_dialog_cmd_fixed_param *)wmi_buf_data(buf);
  318. WMITLV_SET_HDR(&cmd->tlv_header,
  319. WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
  320. WMITLV_GET_STRUCT_TLVLEN
  321. (wmi_twt_resume_dialog_cmd_fixed_param));
  322. cmd->vdev_id = params->vdev_id;
  323. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  324. &cmd->peer_macaddr);
  325. cmd->dialog_id = params->dialog_id;
  326. cmd->sp_offset_us = params->sp_offset_us;
  327. cmd->next_twt_size = params->next_twt_size;
  328. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  329. WMI_TWT_RESUME_DIALOG_CMDID);
  330. if (QDF_IS_STATUS_ERROR(status)) {
  331. wmi_err("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
  332. wmi_buf_free(buf);
  333. }
  334. return status;
  335. }
  336. #ifdef WLAN_SUPPORT_BCAST_TWT
  337. static QDF_STATUS
  338. send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,
  339. struct twt_btwt_invite_sta_cmd_param *params)
  340. {
  341. wmi_twt_btwt_invite_sta_cmd_fixed_param *cmd;
  342. wmi_buf_t buf;
  343. QDF_STATUS status;
  344. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  345. if (!buf) {
  346. wmi_err("Failed to allocate memory");
  347. return QDF_STATUS_E_FAILURE;
  348. }
  349. cmd = (wmi_twt_btwt_invite_sta_cmd_fixed_param *)wmi_buf_data(buf);
  350. WMITLV_SET_HDR(&cmd->tlv_header,
  351. WMITLV_TAG_STRUC_wmi_twt_btwt_invite_sta_cmd_fixed_param,
  352. WMITLV_GET_STRUCT_TLVLEN
  353. (wmi_twt_btwt_invite_sta_cmd_fixed_param));
  354. cmd->vdev_id = params->vdev_id;
  355. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  356. &cmd->peer_macaddr);
  357. cmd->dialog_id = params->dialog_id;
  358. cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
  359. cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
  360. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  361. WMI_TWT_BTWT_INVITE_STA_CMDID);
  362. if (QDF_IS_STATUS_ERROR(status)) {
  363. wmi_buf_free(buf);
  364. wmi_err("Failed to send WMI_TWT_BTWT_INVITE_STA_CMDID");
  365. }
  366. return status;
  367. }
  368. static QDF_STATUS
  369. send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,
  370. struct twt_btwt_remove_sta_cmd_param
  371. *params)
  372. {
  373. wmi_twt_btwt_remove_sta_cmd_fixed_param *cmd;
  374. wmi_buf_t buf;
  375. QDF_STATUS status;
  376. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  377. if (!buf) {
  378. wmi_err("Failed to allocate memory");
  379. return QDF_STATUS_E_FAILURE;
  380. }
  381. cmd = (wmi_twt_btwt_remove_sta_cmd_fixed_param *)wmi_buf_data(buf);
  382. WMITLV_SET_HDR(&cmd->tlv_header,
  383. WMITLV_TAG_STRUC_wmi_twt_btwt_remove_sta_cmd_fixed_param,
  384. WMITLV_GET_STRUCT_TLVLEN
  385. (wmi_twt_btwt_remove_sta_cmd_fixed_param));
  386. cmd->vdev_id = params->vdev_id;
  387. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
  388. &cmd->peer_macaddr);
  389. cmd->dialog_id = params->dialog_id;
  390. cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
  391. cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
  392. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  393. WMI_TWT_BTWT_REMOVE_STA_CMDID);
  394. if (QDF_IS_STATUS_ERROR(status)) {
  395. wmi_buf_free(buf);
  396. wmi_err("Failed to send WMI_TWT_BTWT_REMOVE_STA_CMDID");
  397. }
  398. return status;
  399. }
  400. #endif
  401. static enum HOST_TWT_ENABLE_STATUS
  402. wmi_twt_enable_status_to_host_twt_status(WMI_ENABLE_TWT_STATUS_T status)
  403. {
  404. switch (status) {
  405. case WMI_ENABLE_TWT_STATUS_OK:
  406. return HOST_TWT_ENABLE_STATUS_OK;
  407. case WMI_ENABLE_TWT_STATUS_ALREADY_ENABLED:
  408. return HOST_TWT_ENABLE_STATUS_ALREADY_ENABLED;
  409. case WMI_ENABLE_TWT_STATUS_NOT_READY:
  410. return HOST_TWT_ENABLE_STATUS_NOT_READY;
  411. case WMI_ENABLE_TWT_INVALID_PARAM:
  412. return HOST_TWT_ENABLE_INVALID_PARAM;
  413. default:
  414. return HOST_TWT_ENABLE_STATUS_UNKNOWN_ERROR;
  415. }
  416. }
  417. static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
  418. uint8_t *evt_buf,
  419. struct twt_enable_complete_event_param *params)
  420. {
  421. WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  422. wmi_twt_enable_complete_event_fixed_param *ev;
  423. param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  424. if (!param_buf) {
  425. wmi_err("evt_buf is NULL");
  426. return QDF_STATUS_E_INVAL;
  427. }
  428. ev = param_buf->fixed_param;
  429. params->pdev_id =
  430. wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
  431. ev->pdev_id);
  432. params->status = wmi_twt_enable_status_to_host_twt_status(ev->status);
  433. return QDF_STATUS_SUCCESS;
  434. }
  435. static enum HOST_TWT_DISABLE_STATUS
  436. wmi_twt_disable_status_to_host_twt_status(WMI_DISABLE_TWT_STATUS_T status)
  437. {
  438. switch (status) {
  439. case WMI_DISABLE_TWT_STATUS_OK:
  440. return HOST_TWT_DISABLE_STATUS_OK;
  441. case WMI_DISABLE_TWT_STATUS_ROAM_IN_PROGRESS:
  442. return HOST_TWT_DISABLE_STATUS_ROAM_IN_PROGRESS;
  443. case WMI_DISABLE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  444. return HOST_TWT_DISABLE_STATUS_CHAN_SW_IN_PROGRESS;
  445. case WMI_DISABLE_TWT_STATUS_SCAN_IN_PROGRESS:
  446. return HOST_TWT_DISABLE_STATUS_SCAN_IN_PROGRESS;
  447. default:
  448. return HOST_TWT_DISABLE_STATUS_UNKNOWN_ERROR;
  449. }
  450. }
  451. static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
  452. uint8_t *evt_buf,
  453. struct twt_disable_complete_event_param *params)
  454. {
  455. WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  456. wmi_twt_disable_complete_event_fixed_param *ev;
  457. param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  458. if (!param_buf) {
  459. wmi_err("evt_buf is NULL");
  460. return QDF_STATUS_E_INVAL;
  461. }
  462. ev = param_buf->fixed_param;
  463. params->pdev_id =
  464. wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
  465. ev->pdev_id);
  466. params->status = wmi_twt_disable_status_to_host_twt_status(ev->status);
  467. return QDF_STATUS_SUCCESS;
  468. }
  469. static enum HOST_TWT_ADD_STATUS
  470. wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)
  471. {
  472. switch (tgt_status) {
  473. case WMI_ADD_TWT_STATUS_OK:
  474. return HOST_TWT_ADD_STATUS_OK;
  475. case WMI_ADD_TWT_STATUS_TWT_NOT_ENABLED:
  476. return HOST_TWT_ADD_STATUS_TWT_NOT_ENABLED;
  477. case WMI_ADD_TWT_STATUS_USED_DIALOG_ID:
  478. return HOST_TWT_ADD_STATUS_USED_DIALOG_ID;
  479. case WMI_ADD_TWT_STATUS_INVALID_PARAM:
  480. return HOST_TWT_ADD_STATUS_INVALID_PARAM;
  481. case WMI_ADD_TWT_STATUS_NOT_READY:
  482. return HOST_TWT_ADD_STATUS_NOT_READY;
  483. case WMI_ADD_TWT_STATUS_NO_RESOURCE:
  484. return HOST_TWT_ADD_STATUS_NO_RESOURCE;
  485. case WMI_ADD_TWT_STATUS_NO_ACK:
  486. return HOST_TWT_ADD_STATUS_NO_ACK;
  487. case WMI_ADD_TWT_STATUS_NO_RESPONSE:
  488. return HOST_TWT_ADD_STATUS_NO_RESPONSE;
  489. case WMI_ADD_TWT_STATUS_DENIED:
  490. return HOST_TWT_ADD_STATUS_DENIED;
  491. case WMI_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE:
  492. return HOST_TWT_ADD_STATUS_AP_PARAMS_NOT_IN_RANGE;
  493. case WMI_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED:
  494. return HOST_TWT_ADD_STATUS_AP_IE_VALIDATION_FAILED;
  495. case WMI_ADD_TWT_STATUS_ROAM_IN_PROGRESS:
  496. return HOST_TWT_ADD_STATUS_ROAM_IN_PROGRESS;
  497. case WMI_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  498. return HOST_TWT_ADD_STATUS_CHAN_SW_IN_PROGRESS;
  499. case WMI_ADD_TWT_STATUS_SCAN_IN_PROGRESS:
  500. return HOST_TWT_ADD_STATUS_SCAN_IN_PROGRESS;
  501. case WMI_ADD_TWT_STATUS_LINK_SWITCH_IN_PROGRESS:
  502. return HOST_TWT_ADD_STATUS_LINK_SWITCH_IN_PROGRESS;
  503. case WMI_ADD_TWT_STATUS_UNSUPPORTED_MODE_MLMR:
  504. return HOST_TWT_ADD_STATUS_UNSUPPORTED_MODE_MLMR;
  505. default:
  506. return HOST_TWT_ADD_STATUS_UNKNOWN_ERROR;
  507. }
  508. }
  509. /**
  510. * extract_twt_add_dialog_comp_event_tlv - Extacts twt add dialog complete wmi
  511. * event from firmware
  512. * @wmi_handle: WMI handle
  513. * @evt_buf: Pointer to wmi event buf of twt add dialog complete event
  514. * @params: Pointer to store the extracted parameters
  515. *
  516. * Return: QDF_STATUS_SUCCESS on success or QDF STATUS error values on failure
  517. */
  518. static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
  519. wmi_unified_t wmi_handle,
  520. uint8_t *evt_buf,
  521. struct twt_add_dialog_complete_event_param *params)
  522. {
  523. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  524. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  525. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  526. if (!param_buf) {
  527. wmi_err("evt_buf is NULL");
  528. return QDF_STATUS_E_INVAL;
  529. }
  530. ev = param_buf->fixed_param;
  531. params->vdev_id = ev->vdev_id;
  532. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  533. params->peer_macaddr.bytes);
  534. params->status = wmi_get_converted_twt_add_dialog_status(ev->status);
  535. params->dialog_id = ev->dialog_id;
  536. params->num_additional_twt_params = param_buf->num_twt_params;
  537. return QDF_STATUS_SUCCESS;
  538. }
  539. /**
  540. * extract_twt_add_dialog_comp_additional_parameters() - Extracts additional twt
  541. * twt parameters, as part of add dialog completion event
  542. * @wmi_handle: wmi handle
  543. * @evt_buf: Pointer event buffer
  544. * @evt_buf_len: length of the add dialog event buffer
  545. * @idx: index of num_twt_params
  546. * @additional_params: twt additional parameters to extract
  547. *
  548. * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_INVAL for failure
  549. */
  550. static QDF_STATUS extract_twt_add_dialog_comp_additional_parameters
  551. (
  552. wmi_unified_t wmi_handle, uint8_t *evt_buf,
  553. uint32_t evt_buf_len, uint32_t idx,
  554. struct twt_add_dialog_additional_params *additional_params
  555. )
  556. {
  557. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  558. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  559. uint32_t flags = 0;
  560. uint32_t expected_len;
  561. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  562. if (!param_buf) {
  563. wmi_err("evt_buf is NULL");
  564. return QDF_STATUS_E_INVAL;
  565. }
  566. ev = param_buf->fixed_param;
  567. if (idx >= param_buf->num_twt_params) {
  568. wmi_err("Invalid idx %d while num_twt_params = %d",
  569. idx, param_buf->num_twt_params);
  570. return QDF_STATUS_E_INVAL;
  571. }
  572. if (!param_buf->twt_params) {
  573. wmi_err("Unable to extract additional twt parameters");
  574. return QDF_STATUS_E_INVAL;
  575. }
  576. expected_len = (sizeof(wmi_twt_add_dialog_complete_event_fixed_param) +
  577. WMI_TLV_HDR_SIZE + (param_buf->num_twt_params *
  578. sizeof(wmi_twt_add_dialog_additional_params)));
  579. if (evt_buf_len != expected_len) {
  580. wmi_err("Got invalid len data from FW %d expected %d",
  581. evt_buf_len, expected_len);
  582. return QDF_STATUS_E_INVAL;
  583. }
  584. flags = param_buf->twt_params[idx].flags;
  585. additional_params->twt_cmd = TWT_FLAGS_GET_CMD(flags);
  586. additional_params->bcast = TWT_FLAGS_GET_BROADCAST(flags);
  587. additional_params->trig_en = TWT_FLAGS_GET_TRIGGER(flags);
  588. additional_params->announce = TWT_FLAGS_GET_FLOW_TYPE(flags);
  589. additional_params->protection = TWT_FLAGS_GET_PROTECTION(flags);
  590. additional_params->b_twt_id0 = TWT_FLAGS_GET_BTWT_ID0(flags);
  591. additional_params->info_frame_disabled =
  592. TWT_FLAGS_GET_TWT_INFO_FRAME_DISABLED(flags);
  593. additional_params->wake_dur_us = param_buf->twt_params[idx].wake_dur_us;
  594. additional_params->wake_intvl_us =
  595. param_buf->twt_params[idx].wake_intvl_us;
  596. additional_params->sp_offset_us =
  597. param_buf->twt_params[idx].sp_offset_us;
  598. additional_params->sp_tsf_us_lo =
  599. param_buf->twt_params[idx].sp_tsf_us_lo;
  600. additional_params->sp_tsf_us_hi =
  601. param_buf->twt_params[idx].sp_tsf_us_hi;
  602. additional_params->pm_responder_bit_valid =
  603. TWT_FLAGS_GET_PM_RESPONDER_MODE_VALID(flags);
  604. additional_params->pm_responder_bit =
  605. TWT_FLAGS_GET_PM_RESPONDER_MODE(flags);
  606. return QDF_STATUS_SUCCESS;
  607. }
  608. static enum HOST_TWT_DEL_STATUS
  609. wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)
  610. {
  611. switch (tgt_status) {
  612. case WMI_DEL_TWT_STATUS_OK:
  613. return HOST_TWT_DEL_STATUS_OK;
  614. case WMI_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  615. return HOST_TWT_DEL_STATUS_DIALOG_ID_NOT_EXIST;
  616. case WMI_DEL_TWT_STATUS_INVALID_PARAM:
  617. return HOST_TWT_DEL_STATUS_INVALID_PARAM;
  618. case WMI_DEL_TWT_STATUS_DIALOG_ID_BUSY:
  619. return HOST_TWT_DEL_STATUS_DIALOG_ID_BUSY;
  620. case WMI_DEL_TWT_STATUS_NO_RESOURCE:
  621. return HOST_TWT_DEL_STATUS_NO_RESOURCE;
  622. case WMI_DEL_TWT_STATUS_NO_ACK:
  623. return HOST_TWT_DEL_STATUS_NO_ACK;
  624. case WMI_DEL_TWT_STATUS_PEER_INIT_TEARDOWN:
  625. return HOST_TWT_DEL_STATUS_PEER_INIT_TEARDOWN;
  626. case WMI_DEL_TWT_STATUS_ROAMING:
  627. return HOST_TWT_DEL_STATUS_ROAMING;
  628. case WMI_DEL_TWT_STATUS_CONCURRENCY:
  629. return HOST_TWT_DEL_STATUS_CONCURRENCY;
  630. case WMI_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  631. return HOST_TWT_DEL_STATUS_CHAN_SW_IN_PROGRESS;
  632. case WMI_DEL_TWT_STATUS_SCAN_IN_PROGRESS:
  633. return HOST_TWT_DEL_STATUS_SCAN_IN_PROGRESS;
  634. default:
  635. return HOST_TWT_DEL_STATUS_UNKNOWN_ERROR;
  636. }
  637. }
  638. static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
  639. wmi_unified_t wmi_handle,
  640. uint8_t *evt_buf,
  641. struct twt_del_dialog_complete_event_param *params)
  642. {
  643. WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  644. wmi_twt_del_dialog_complete_event_fixed_param *ev;
  645. param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  646. if (!param_buf) {
  647. wmi_err("evt_buf is NULL");
  648. return QDF_STATUS_E_INVAL;
  649. }
  650. ev = param_buf->fixed_param;
  651. params->vdev_id = ev->vdev_id;
  652. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  653. params->peer_macaddr.bytes);
  654. params->dialog_id = ev->dialog_id;
  655. params->status = wmi_get_converted_twt_del_dialog_status(ev->status);
  656. return QDF_STATUS_SUCCESS;
  657. }
  658. static enum HOST_TWT_PAUSE_STATUS
  659. wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)
  660. {
  661. switch (status) {
  662. case WMI_PAUSE_TWT_STATUS_OK:
  663. return HOST_TWT_PAUSE_STATUS_OK;
  664. case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  665. return HOST_TWT_PAUSE_STATUS_DIALOG_ID_NOT_EXIST;
  666. case WMI_PAUSE_TWT_STATUS_INVALID_PARAM:
  667. return HOST_TWT_PAUSE_STATUS_INVALID_PARAM;
  668. case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY:
  669. return HOST_TWT_PAUSE_STATUS_DIALOG_ID_BUSY;
  670. case WMI_PAUSE_TWT_STATUS_NO_RESOURCE:
  671. return HOST_TWT_PAUSE_STATUS_NO_RESOURCE;
  672. case WMI_PAUSE_TWT_STATUS_NO_ACK:
  673. return HOST_TWT_PAUSE_STATUS_NO_ACK;
  674. case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED:
  675. return HOST_TWT_PAUSE_STATUS_ALREADY_PAUSED;
  676. case WMI_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  677. return HOST_TWT_PAUSE_STATUS_CHAN_SW_IN_PROGRESS;
  678. case WMI_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS:
  679. return HOST_TWT_PAUSE_STATUS_ROAM_IN_PROGRESS;
  680. case WMI_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS:
  681. return HOST_TWT_PAUSE_STATUS_SCAN_IN_PROGRESS;
  682. default:
  683. return HOST_TWT_PAUSE_STATUS_UNKNOWN_ERROR;
  684. }
  685. }
  686. static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
  687. wmi_unified_t wmi_handle,
  688. uint8_t *evt_buf,
  689. struct twt_pause_dialog_complete_event_param *params)
  690. {
  691. WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  692. wmi_twt_pause_dialog_complete_event_fixed_param *ev;
  693. param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  694. if (!param_buf) {
  695. wmi_err("evt_buf is NULL");
  696. return QDF_STATUS_E_INVAL;
  697. }
  698. ev = param_buf->fixed_param;
  699. params->vdev_id = ev->vdev_id;
  700. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  701. params->peer_macaddr.bytes);
  702. params->status = wmi_twt_pause_status_to_host_twt_status(ev->status);
  703. params->dialog_id = ev->dialog_id;
  704. return QDF_STATUS_SUCCESS;
  705. }
  706. static enum HOST_TWT_NUDGE_STATUS
  707. wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)
  708. {
  709. switch (status) {
  710. case WMI_NUDGE_TWT_STATUS_OK:
  711. return HOST_TWT_NUDGE_STATUS_OK;
  712. case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  713. return HOST_TWT_NUDGE_STATUS_DIALOG_ID_NOT_EXIST;
  714. case WMI_NUDGE_TWT_STATUS_INVALID_PARAM:
  715. return HOST_TWT_NUDGE_STATUS_INVALID_PARAM;
  716. case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY:
  717. return HOST_TWT_NUDGE_STATUS_DIALOG_ID_BUSY;
  718. case WMI_NUDGE_TWT_STATUS_NO_RESOURCE:
  719. return HOST_TWT_NUDGE_STATUS_NO_RESOURCE;
  720. case WMI_NUDGE_TWT_STATUS_NO_ACK:
  721. return HOST_TWT_NUDGE_STATUS_NO_ACK;
  722. case WMI_NUDGE_TWT_STATUS_ALREADY_PAUSED:
  723. return HOST_TWT_NUDGE_STATUS_ALREADY_PAUSED;
  724. case WMI_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  725. return HOST_TWT_NUDGE_STATUS_CHAN_SW_IN_PROGRESS;
  726. case WMI_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS:
  727. return HOST_TWT_NUDGE_STATUS_ROAM_IN_PROGRESS;
  728. case WMI_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS:
  729. return HOST_TWT_NUDGE_STATUS_SCAN_IN_PROGRESS;
  730. default:
  731. return HOST_TWT_NUDGE_STATUS_UNKNOWN_ERROR;
  732. }
  733. }
  734. static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv(
  735. wmi_unified_t wmi_handle,
  736. uint8_t *evt_buf,
  737. struct twt_nudge_dialog_complete_event_param *params)
  738. {
  739. WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  740. wmi_twt_nudge_dialog_complete_event_fixed_param *ev;
  741. param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  742. if (!param_buf) {
  743. wmi_err("evt_buf is NULL");
  744. return QDF_STATUS_E_INVAL;
  745. }
  746. ev = param_buf->fixed_param;
  747. params->vdev_id = ev->vdev_id;
  748. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  749. params->peer_macaddr.bytes);
  750. params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status);
  751. params->dialog_id = ev->dialog_id;
  752. params->next_twt_tsf_us_lo = ev->sp_tsf_us_lo;
  753. params->next_twt_tsf_us_hi = ev->sp_tsf_us_hi;
  754. wmi_debug("vdev_id: %d dialog_id: %d tsf hi : %x tsf lo: %x",
  755. params->vdev_id, params->dialog_id,
  756. params->next_twt_tsf_us_hi, params->next_twt_tsf_us_lo);
  757. return QDF_STATUS_SUCCESS;
  758. }
  759. static enum HOST_TWT_RESUME_STATUS
  760. wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)
  761. {
  762. switch (tgt_status) {
  763. case WMI_RESUME_TWT_STATUS_OK:
  764. return HOST_TWT_RESUME_STATUS_OK;
  765. case WMI_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  766. return HOST_TWT_RESUME_STATUS_DIALOG_ID_NOT_EXIST;
  767. case WMI_RESUME_TWT_STATUS_INVALID_PARAM:
  768. return HOST_TWT_RESUME_STATUS_INVALID_PARAM;
  769. case WMI_RESUME_TWT_STATUS_DIALOG_ID_BUSY:
  770. return HOST_TWT_RESUME_STATUS_DIALOG_ID_BUSY;
  771. case WMI_RESUME_TWT_STATUS_NOT_PAUSED:
  772. return HOST_TWT_RESUME_STATUS_NOT_PAUSED;
  773. case WMI_RESUME_TWT_STATUS_NO_RESOURCE:
  774. return HOST_TWT_RESUME_STATUS_NO_RESOURCE;
  775. case WMI_RESUME_TWT_STATUS_NO_ACK:
  776. return HOST_TWT_RESUME_STATUS_NO_ACK;
  777. case WMI_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  778. return HOST_TWT_RESUME_STATUS_CHAN_SW_IN_PROGRESS;
  779. case WMI_RESUME_TWT_STATUS_ROAM_IN_PROGRESS:
  780. return HOST_TWT_RESUME_STATUS_ROAM_IN_PROGRESS;
  781. case WMI_RESUME_TWT_STATUS_SCAN_IN_PROGRESS:
  782. return HOST_TWT_RESUME_STATUS_SCAN_IN_PROGRESS;
  783. default:
  784. return HOST_TWT_RESUME_STATUS_UNKNOWN_ERROR;
  785. }
  786. }
  787. static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
  788. wmi_unified_t wmi_handle,
  789. uint8_t *evt_buf,
  790. struct twt_resume_dialog_complete_event_param *params)
  791. {
  792. WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  793. wmi_twt_resume_dialog_complete_event_fixed_param *ev;
  794. param_buf =
  795. (WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  796. if (!param_buf) {
  797. wmi_err("evt_buf is NULL");
  798. return QDF_STATUS_E_INVAL;
  799. }
  800. ev = param_buf->fixed_param;
  801. params->vdev_id = ev->vdev_id;
  802. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  803. params->peer_macaddr.bytes);
  804. params->status = wmi_get_converted_twt_resume_dialog_status(ev->status);
  805. params->dialog_id = ev->dialog_id;
  806. return QDF_STATUS_SUCCESS;
  807. }
  808. static enum HOST_TWT_NOTIFY_STATUS
  809. wmi_get_converted_twt_notify_status(WMI_TWT_NOTIFICATION_ID_T tgt_status)
  810. {
  811. switch (tgt_status) {
  812. case WMI_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET:
  813. return HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET;
  814. case WMI_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR:
  815. return HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR;
  816. default:
  817. return HOST_TWT_NOTIFY_EVENT_READY;
  818. }
  819. }
  820. static QDF_STATUS extract_twt_notify_event_tlv(
  821. wmi_unified_t wmi_handle,
  822. uint8_t *evt_buf,
  823. struct twt_notify_event_param *params)
  824. {
  825. WMI_TWT_NOTIFY_EVENTID_param_tlvs *param_buf;
  826. wmi_twt_notify_event_fixed_param *ev;
  827. param_buf =
  828. (WMI_TWT_NOTIFY_EVENTID_param_tlvs *)evt_buf;
  829. if (!param_buf) {
  830. wmi_err("evt_buf is NULL");
  831. return QDF_STATUS_E_INVAL;
  832. }
  833. ev = param_buf->fixed_param;
  834. if (ev->event_id > WMI_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR) {
  835. wmi_debug("Incorrect TWT notify event vdev_id: %d, status: %d",
  836. ev->vdev_id, ev->event_id);
  837. return QDF_STATUS_E_INVAL;
  838. }
  839. params->vdev_id = ev->vdev_id;
  840. params->status = wmi_get_converted_twt_notify_status(ev->event_id);
  841. wmi_debug("Extract notify event vdev_id: %d, status: %d",
  842. params->vdev_id, params->status);
  843. return QDF_STATUS_SUCCESS;
  844. }
  845. #ifdef WLAN_SUPPORT_BCAST_TWT
  846. static QDF_STATUS
  847. extract_twt_btwt_invite_sta_comp_event_tlv(
  848. wmi_unified_t wmi_handle,
  849. uint8_t *evt_buf,
  850. struct
  851. twt_btwt_invite_sta_complete_event_param
  852. *params)
  853. {
  854. WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
  855. wmi_twt_btwt_invite_sta_complete_event_fixed_param *ev;
  856. param_buf =
  857. (WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  858. if (!param_buf) {
  859. wmi_err("evt_buf is NULL");
  860. return QDF_STATUS_E_INVAL;
  861. }
  862. ev = param_buf->fixed_param;
  863. params->vdev_id = ev->vdev_id;
  864. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  865. params->peer_macaddr.bytes);
  866. params->status = ev->status;
  867. params->dialog_id = ev->dialog_id;
  868. return QDF_STATUS_SUCCESS;
  869. }
  870. static QDF_STATUS
  871. extract_twt_btwt_remove_sta_comp_event_tlv(
  872. wmi_unified_t wmi_handle,
  873. uint8_t *evt_buf,
  874. struct
  875. twt_btwt_remove_sta_complete_event_param
  876. *params)
  877. {
  878. WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
  879. wmi_twt_btwt_remove_sta_complete_event_fixed_param *ev;
  880. param_buf =
  881. (WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  882. if (!param_buf) {
  883. wmi_err("evt_buf is NULL");
  884. return QDF_STATUS_E_INVAL;
  885. }
  886. ev = param_buf->fixed_param;
  887. params->vdev_id = ev->vdev_id;
  888. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
  889. params->peer_macaddr.bytes);
  890. params->status = ev->status;
  891. params->dialog_id = ev->dialog_id;
  892. return QDF_STATUS_SUCCESS;
  893. }
  894. #endif
  895. #ifdef WLAN_SUPPORT_BCAST_TWT
  896. static void
  897. wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
  898. {
  899. ops->send_twt_btwt_invite_sta_cmd = send_twt_btwt_invite_sta_cmd_tlv;
  900. ops->send_twt_btwt_remove_sta_cmd = send_twt_btwt_remove_sta_cmd_tlv;
  901. ops->extract_twt_btwt_invite_sta_comp_event =
  902. extract_twt_btwt_invite_sta_comp_event_tlv;
  903. ops->extract_twt_btwt_remove_sta_comp_event =
  904. extract_twt_btwt_remove_sta_comp_event_tlv;
  905. }
  906. #else
  907. static void
  908. wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
  909. {
  910. }
  911. #endif
  912. static QDF_STATUS
  913. extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,
  914. uint8_t *evt_buf,
  915. struct twt_session_stats_event_param
  916. *params)
  917. {
  918. WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
  919. wmi_pdev_twt_session_stats_event_fixed_param *ev;
  920. param_buf =
  921. (WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
  922. if (!param_buf) {
  923. wmi_err("evt_buf is NULL");
  924. return QDF_STATUS_E_INVAL;
  925. }
  926. ev = param_buf->fixed_param;
  927. params->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
  928. wmi_handle,
  929. ev->pdev_id);
  930. params->num_sessions = param_buf->num_twt_sessions;
  931. wmi_debug("pdev_id=%d, num of TWT sessions=%d",
  932. params->pdev_id, params->num_sessions);
  933. return QDF_STATUS_SUCCESS;
  934. }
  935. static QDF_STATUS
  936. extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,
  937. uint8_t *evt_buf,
  938. struct twt_session_stats_event_param
  939. *params,
  940. struct twt_session_stats_info
  941. *session,
  942. uint32_t idx)
  943. {
  944. WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
  945. wmi_twt_session_stats_info *twt_session;
  946. uint32_t flags;
  947. wmi_mac_addr *m1;
  948. uint8_t *m2;
  949. param_buf =
  950. (WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
  951. if (!param_buf) {
  952. wmi_err("evt_buf is NULL");
  953. return QDF_STATUS_E_INVAL;
  954. }
  955. if (idx >= param_buf->num_twt_sessions) {
  956. wmi_err("wrong idx, idx=%d, num_sessions=%d",
  957. idx, param_buf->num_twt_sessions);
  958. return QDF_STATUS_E_INVAL;
  959. }
  960. twt_session = &param_buf->twt_sessions[idx];
  961. session->vdev_id = twt_session->vdev_id;
  962. m1 = &twt_session->peer_mac;
  963. m2 = session->peer_mac.bytes;
  964. WMI_MAC_ADDR_TO_CHAR_ARRAY(m1, m2);
  965. session->event_type = twt_session->event_type;
  966. flags = twt_session->flow_id_flags;
  967. session->flow_id = WMI_TWT_SESSION_FLAG_FLOW_ID_GET(flags);
  968. session->bcast = WMI_TWT_SESSION_FLAG_BCAST_TWT_GET(flags);
  969. session->trig = WMI_TWT_SESSION_FLAG_TRIGGER_TWT_GET(flags);
  970. session->announ = WMI_TWT_SESSION_FLAG_ANNOUN_TWT_GET(flags);
  971. session->protection = WMI_TWT_SESSION_FLAG_TWT_PROTECTION_GET(flags);
  972. session->info_frame_disabled =
  973. WMI_TWT_SESSION_FLAG_TWT_INFO_FRAME_DISABLED_GET(flags);
  974. session->pm_responder_bit =
  975. WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_GET(flags);
  976. session->pm_responder_bit_valid =
  977. WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_VALID_GET(flags);
  978. session->dialog_id = twt_session->dialog_id;
  979. session->wake_dura_us = twt_session->wake_dura_us;
  980. session->wake_intvl_us = twt_session->wake_intvl_us;
  981. session->sp_offset_us = twt_session->sp_offset_us;
  982. session->sp_tsf_us_lo = twt_session->sp_tsf_us_lo;
  983. session->sp_tsf_us_hi = twt_session->sp_tsf_us_hi;
  984. wmi_debug("type=%d id=%d bcast=%d trig=%d announ=%d diagid=%d wake_dur=%ul wake_int=%ul offset=%ul",
  985. session->event_type, session->flow_id,
  986. session->bcast, session->trig,
  987. session->announ, session->dialog_id, session->wake_dura_us,
  988. session->wake_intvl_us, session->sp_offset_us);
  989. wmi_debug("resp_pm_valid=%d resp_pm=%d",
  990. session->pm_responder_bit_valid, session->pm_responder_bit);
  991. return QDF_STATUS_SUCCESS;
  992. }
  993. static QDF_STATUS extract_twt_cap_service_ready_ext2_tlv(
  994. wmi_unified_t wmi_handle, uint8_t *event,
  995. struct wmi_twt_cap_bitmap_params *var)
  996. {
  997. WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *param_buf;
  998. wmi_twt_caps_params *twt_caps;
  999. param_buf = (WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *)event;
  1000. if (!param_buf)
  1001. return QDF_STATUS_E_INVAL;
  1002. twt_caps = param_buf->twt_caps;
  1003. if (!twt_caps)
  1004. return QDF_STATUS_E_INVAL;
  1005. var->twt_ack_support_cap = WMI_GET_BITS(twt_caps->twt_capability_bitmap,
  1006. 0, 1);
  1007. return QDF_STATUS_SUCCESS;
  1008. }
  1009. static enum WMI_HOST_TWT_CMD_FOR_ACK_EVENT
  1010. wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)
  1011. {
  1012. switch (tgt_cmd) {
  1013. case WMI_TWT_ADD_DIALOG_CMDID:
  1014. return WMI_HOST_TWT_ADD_DIALOG_CMDID;
  1015. case WMI_TWT_DEL_DIALOG_CMDID:
  1016. return WMI_HOST_TWT_DEL_DIALOG_CMDID;
  1017. case WMI_TWT_PAUSE_DIALOG_CMDID:
  1018. return WMI_HOST_TWT_PAUSE_DIALOG_CMDID;
  1019. case WMI_TWT_RESUME_DIALOG_CMDID:
  1020. return WMI_HOST_TWT_RESUME_DIALOG_CMDID;
  1021. case WMI_TWT_NUDGE_DIALOG_CMDID:
  1022. return WMI_HOST_TWT_NUDGE_DIALOG_CMDID;
  1023. default:
  1024. return WMI_HOST_TWT_UNKNOWN_CMDID;
  1025. }
  1026. }
  1027. static QDF_STATUS
  1028. extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,
  1029. uint8_t *evt_buf,
  1030. struct twt_ack_complete_event_param *var)
  1031. {
  1032. WMI_TWT_ACK_EVENTID_param_tlvs *param_buf;
  1033. wmi_twt_ack_event_fixed_param *ack_event;
  1034. param_buf = (WMI_TWT_ACK_EVENTID_param_tlvs *)evt_buf;
  1035. if (!param_buf) {
  1036. wmi_err("evt_buf is NULL");
  1037. return QDF_STATUS_E_INVAL;
  1038. }
  1039. ack_event = param_buf->fixed_param;
  1040. var->vdev_id = ack_event->vdev_id;
  1041. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ack_event->peer_macaddr,
  1042. var->peer_macaddr.bytes);
  1043. var->dialog_id = ack_event->dialog_id;
  1044. var->twt_cmd_ack = wmi_get_converted_twt_command_for_ack_event(
  1045. ack_event->twt_cmd);
  1046. switch (ack_event->twt_cmd) {
  1047. case WMI_TWT_ADD_DIALOG_CMDID:
  1048. var->status = wmi_get_converted_twt_add_dialog_status(
  1049. ack_event->status);
  1050. break;
  1051. case WMI_TWT_DEL_DIALOG_CMDID:
  1052. var->status = wmi_get_converted_twt_del_dialog_status(
  1053. ack_event->status);
  1054. break;
  1055. case WMI_TWT_PAUSE_DIALOG_CMDID:
  1056. var->status = wmi_twt_pause_status_to_host_twt_status(
  1057. ack_event->status);
  1058. break;
  1059. case WMI_TWT_RESUME_DIALOG_CMDID:
  1060. var->status = wmi_get_converted_twt_resume_dialog_status(
  1061. ack_event->status);
  1062. break;
  1063. case WMI_TWT_NUDGE_DIALOG_CMDID:
  1064. var->status = wmi_twt_nudge_status_to_host_twt_status(
  1065. ack_event->status);
  1066. break;
  1067. default:
  1068. break;
  1069. }
  1070. return QDF_STATUS_SUCCESS;
  1071. }
  1072. #elif WLAN_SUPPORT_TWT
  1073. static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,
  1074. struct wmi_twt_enable_param *params)
  1075. {
  1076. wmi_twt_enable_cmd_fixed_param *cmd;
  1077. wmi_buf_t buf;
  1078. QDF_STATUS status;
  1079. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1080. if (!buf) {
  1081. wmi_err("Failed to allocate memory");
  1082. return QDF_STATUS_E_FAILURE;
  1083. }
  1084. cmd = (wmi_twt_enable_cmd_fixed_param *) wmi_buf_data(buf);
  1085. WMITLV_SET_HDR(&cmd->tlv_header,
  1086. WMITLV_TAG_STRUC_wmi_twt_enable_cmd_fixed_param,
  1087. WMITLV_GET_STRUCT_TLVLEN
  1088. (wmi_twt_enable_cmd_fixed_param));
  1089. cmd->pdev_id =
  1090. wmi_handle->ops->convert_pdev_id_host_to_target(
  1091. wmi_handle,
  1092. params->pdev_id);
  1093. cmd->sta_cong_timer_ms = params->sta_cong_timer_ms;
  1094. cmd->mbss_support = params->mbss_support;
  1095. cmd->default_slot_size = params->default_slot_size;
  1096. cmd->congestion_thresh_setup = params->congestion_thresh_setup;
  1097. cmd->congestion_thresh_teardown = params->congestion_thresh_teardown;
  1098. cmd->congestion_thresh_critical = params->congestion_thresh_critical;
  1099. cmd->interference_thresh_teardown =
  1100. params->interference_thresh_teardown;
  1101. cmd->interference_thresh_setup = params->interference_thresh_setup;
  1102. cmd->min_no_sta_setup = params->min_no_sta_setup;
  1103. cmd->min_no_sta_teardown = params->min_no_sta_teardown;
  1104. cmd->no_of_bcast_mcast_slots = params->no_of_bcast_mcast_slots;
  1105. cmd->min_no_twt_slots = params->min_no_twt_slots;
  1106. cmd->max_no_sta_twt = params->max_no_sta_twt;
  1107. cmd->mode_check_interval = params->mode_check_interval;
  1108. cmd->add_sta_slot_interval = params->add_sta_slot_interval;
  1109. cmd->remove_sta_slot_interval = params->remove_sta_slot_interval;
  1110. TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable);
  1111. TWT_EN_DIS_FLAGS_SET_B_R_TWT(cmd->flags, params->r_twt_enable);
  1112. TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags,
  1113. params->b_twt_legacy_mbss_enable);
  1114. TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags,
  1115. params->b_twt_ax_mbss_enable);
  1116. if (params->ext_conf_present) {
  1117. TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
  1118. TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
  1119. TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
  1120. }
  1121. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1122. WMI_TWT_ENABLE_CMDID);
  1123. if (QDF_IS_STATUS_ERROR(status)) {
  1124. wmi_err("Failed to send WMI_TWT_ENABLE_CMDID");
  1125. wmi_buf_free(buf);
  1126. }
  1127. return status;
  1128. }
  1129. static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
  1130. struct wmi_twt_disable_param *params)
  1131. {
  1132. wmi_twt_disable_cmd_fixed_param *cmd;
  1133. wmi_buf_t buf;
  1134. QDF_STATUS status;
  1135. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1136. if (!buf) {
  1137. wmi_err("Failed to allocate memory");
  1138. return QDF_STATUS_E_FAILURE;
  1139. }
  1140. cmd = (wmi_twt_disable_cmd_fixed_param *) wmi_buf_data(buf);
  1141. WMITLV_SET_HDR(&cmd->tlv_header,
  1142. WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
  1143. WMITLV_GET_STRUCT_TLVLEN
  1144. (wmi_twt_disable_cmd_fixed_param));
  1145. cmd->pdev_id =
  1146. wmi_handle->ops->convert_pdev_id_host_to_target(
  1147. wmi_handle,
  1148. params->pdev_id);
  1149. if (params->ext_conf_present) {
  1150. TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
  1151. TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
  1152. TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
  1153. }
  1154. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1155. WMI_TWT_DISABLE_CMDID);
  1156. if (QDF_IS_STATUS_ERROR(status)) {
  1157. wmi_err("Failed to send WMI_TWT_DISABLE_CMDID");
  1158. wmi_buf_free(buf);
  1159. }
  1160. return status;
  1161. }
  1162. #ifdef WLAN_SUPPORT_BCAST_TWT
  1163. static void
  1164. twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
  1165. wmi_twt_add_dialog_cmd_fixed_param *cmd)
  1166. {
  1167. TWT_FLAGS_SET_BTWT_ID0(cmd->flags, params->flag_b_twt_id0);
  1168. cmd->b_twt_persistence = params->b_twt_persistence;
  1169. cmd->b_twt_recommendation = params->b_twt_recommendation;
  1170. }
  1171. #else
  1172. static void
  1173. twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
  1174. wmi_twt_add_dialog_cmd_fixed_param *cmd)
  1175. {
  1176. }
  1177. #endif
  1178. static QDF_STATUS
  1179. send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  1180. struct wmi_twt_add_dialog_param *params)
  1181. {
  1182. wmi_twt_add_dialog_cmd_fixed_param *cmd;
  1183. wmi_buf_t buf;
  1184. QDF_STATUS status;
  1185. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1186. if (!buf) {
  1187. wmi_err("Failed to allocate memory");
  1188. return QDF_STATUS_E_FAILURE;
  1189. }
  1190. cmd = (wmi_twt_add_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  1191. WMITLV_SET_HDR(&cmd->tlv_header,
  1192. WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
  1193. WMITLV_GET_STRUCT_TLVLEN
  1194. (wmi_twt_add_dialog_cmd_fixed_param));
  1195. cmd->vdev_id = params->vdev_id;
  1196. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1197. cmd->dialog_id = params->dialog_id;
  1198. cmd->wake_intvl_us = params->wake_intvl_us;
  1199. cmd->wake_intvl_mantis = params->wake_intvl_mantis;
  1200. cmd->wake_dura_us = params->wake_dura_us;
  1201. cmd->sp_offset_us = params->sp_offset_us;
  1202. cmd->min_wake_intvl_us = params->min_wake_intvl_us;
  1203. cmd->max_wake_intvl_us = params->max_wake_intvl_us;
  1204. cmd->min_wake_dura_us = params->min_wake_dura_us;
  1205. cmd->max_wake_dura_us = params->max_wake_dura_us;
  1206. cmd->sp_start_tsf_lo = (uint32_t)(params->wake_time_tsf & 0xFFFFFFFF);
  1207. cmd->sp_start_tsf_hi = (uint32_t)(params->wake_time_tsf >> 32);
  1208. cmd->announce_timeout_us = params->announce_timeout_us;
  1209. cmd->link_id_bitmap = params->link_id_bitmap;
  1210. cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
  1211. cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
  1212. TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
  1213. TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
  1214. TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
  1215. TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
  1216. TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
  1217. twt_add_dialog_set_bcast_twt_params(params, cmd);
  1218. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1219. WMI_TWT_ADD_DIALOG_CMDID);
  1220. if (QDF_IS_STATUS_ERROR(status)) {
  1221. wmi_err("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
  1222. wmi_buf_free(buf);
  1223. }
  1224. return status;
  1225. }
  1226. #ifdef WLAN_SUPPORT_BCAST_TWT
  1227. static void
  1228. twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
  1229. wmi_twt_del_dialog_cmd_fixed_param *cmd)
  1230. {
  1231. cmd->b_twt_persistence = params->b_twt_persistence;
  1232. }
  1233. #else
  1234. static void
  1235. twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
  1236. wmi_twt_del_dialog_cmd_fixed_param *cmd)
  1237. {
  1238. }
  1239. #endif
  1240. static QDF_STATUS
  1241. send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  1242. struct wmi_twt_del_dialog_param *params)
  1243. {
  1244. wmi_twt_del_dialog_cmd_fixed_param *cmd;
  1245. wmi_buf_t buf;
  1246. QDF_STATUS status;
  1247. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1248. if (!buf) {
  1249. wmi_err("Failed to allocate memory");
  1250. return QDF_STATUS_E_FAILURE;
  1251. }
  1252. cmd = (wmi_twt_del_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  1253. WMITLV_SET_HDR(&cmd->tlv_header,
  1254. WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
  1255. WMITLV_GET_STRUCT_TLVLEN
  1256. (wmi_twt_del_dialog_cmd_fixed_param));
  1257. cmd->vdev_id = params->vdev_id;
  1258. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1259. cmd->dialog_id = params->dialog_id;
  1260. twt_del_dialog_set_bcast_twt_params(params, cmd);
  1261. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1262. WMI_TWT_DEL_DIALOG_CMDID);
  1263. if (QDF_IS_STATUS_ERROR(status)) {
  1264. wmi_err("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
  1265. wmi_buf_free(buf);
  1266. }
  1267. return status;
  1268. }
  1269. static QDF_STATUS
  1270. send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  1271. struct wmi_twt_pause_dialog_cmd_param *params)
  1272. {
  1273. wmi_twt_pause_dialog_cmd_fixed_param *cmd;
  1274. wmi_buf_t buf;
  1275. QDF_STATUS status;
  1276. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1277. if (!buf) {
  1278. wmi_err("Failed to allocate memory");
  1279. return QDF_STATUS_E_FAILURE;
  1280. }
  1281. cmd = (wmi_twt_pause_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  1282. WMITLV_SET_HDR(&cmd->tlv_header,
  1283. WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
  1284. WMITLV_GET_STRUCT_TLVLEN
  1285. (wmi_twt_pause_dialog_cmd_fixed_param));
  1286. cmd->vdev_id = params->vdev_id;
  1287. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1288. cmd->dialog_id = params->dialog_id;
  1289. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1290. WMI_TWT_PAUSE_DIALOG_CMDID);
  1291. if (QDF_IS_STATUS_ERROR(status)) {
  1292. wmi_err("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
  1293. wmi_buf_free(buf);
  1294. }
  1295. return status;
  1296. }
  1297. static QDF_STATUS
  1298. send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  1299. struct wmi_twt_nudge_dialog_cmd_param *params)
  1300. {
  1301. wmi_twt_nudge_dialog_cmd_fixed_param *cmd;
  1302. wmi_buf_t buf;
  1303. QDF_STATUS status;
  1304. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1305. if (!buf)
  1306. return QDF_STATUS_E_FAILURE;
  1307. cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  1308. WMITLV_SET_HDR(&cmd->tlv_header,
  1309. WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param,
  1310. WMITLV_GET_STRUCT_TLVLEN
  1311. (wmi_twt_nudge_dialog_cmd_fixed_param));
  1312. cmd->vdev_id = params->vdev_id;
  1313. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1314. cmd->dialog_id = params->dialog_id;
  1315. cmd->suspend_duration_ms = params->suspend_duration / 1000;
  1316. cmd->next_twt_size = params->next_twt_size;
  1317. wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d "
  1318. "peer_macaddr: "QDF_MAC_ADDR_FMT, cmd->vdev_id,
  1319. cmd->dialog_id, cmd->suspend_duration_ms, cmd->next_twt_size,
  1320. QDF_MAC_ADDR_REF(params->peer_macaddr));
  1321. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1322. WMI_TWT_NUDGE_DIALOG_CMDID);
  1323. if (QDF_IS_STATUS_ERROR(status))
  1324. wmi_buf_free(buf);
  1325. return status;
  1326. }
  1327. static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  1328. struct wmi_twt_resume_dialog_cmd_param *params)
  1329. {
  1330. wmi_twt_resume_dialog_cmd_fixed_param *cmd;
  1331. wmi_buf_t buf;
  1332. QDF_STATUS status;
  1333. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1334. if (!buf) {
  1335. wmi_err("Failed to allocate memory");
  1336. return QDF_STATUS_E_FAILURE;
  1337. }
  1338. cmd = (wmi_twt_resume_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  1339. WMITLV_SET_HDR(&cmd->tlv_header,
  1340. WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
  1341. WMITLV_GET_STRUCT_TLVLEN
  1342. (wmi_twt_resume_dialog_cmd_fixed_param));
  1343. cmd->vdev_id = params->vdev_id;
  1344. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1345. cmd->dialog_id = params->dialog_id;
  1346. cmd->sp_offset_us = params->sp_offset_us;
  1347. cmd->next_twt_size = params->next_twt_size;
  1348. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1349. WMI_TWT_RESUME_DIALOG_CMDID);
  1350. if (QDF_IS_STATUS_ERROR(status)) {
  1351. wmi_err("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
  1352. wmi_buf_free(buf);
  1353. }
  1354. return status;
  1355. }
  1356. #ifdef WLAN_SUPPORT_BCAST_TWT
  1357. static QDF_STATUS
  1358. send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,
  1359. struct wmi_twt_btwt_invite_sta_cmd_param
  1360. *params)
  1361. {
  1362. wmi_twt_btwt_invite_sta_cmd_fixed_param *cmd;
  1363. wmi_buf_t buf;
  1364. QDF_STATUS status;
  1365. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1366. if (!buf) {
  1367. wmi_err("Failed to allocate memory");
  1368. return QDF_STATUS_E_FAILURE;
  1369. }
  1370. cmd = (wmi_twt_btwt_invite_sta_cmd_fixed_param *)wmi_buf_data(buf);
  1371. WMITLV_SET_HDR(&cmd->tlv_header,
  1372. WMITLV_TAG_STRUC_wmi_twt_btwt_invite_sta_cmd_fixed_param,
  1373. WMITLV_GET_STRUCT_TLVLEN
  1374. (wmi_twt_btwt_invite_sta_cmd_fixed_param));
  1375. cmd->vdev_id = params->vdev_id;
  1376. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1377. cmd->dialog_id = params->dialog_id;
  1378. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1379. WMI_TWT_BTWT_INVITE_STA_CMDID);
  1380. if (QDF_IS_STATUS_ERROR(status)) {
  1381. wmi_buf_free(buf);
  1382. }
  1383. return status;
  1384. }
  1385. static QDF_STATUS
  1386. send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,
  1387. struct wmi_twt_btwt_remove_sta_cmd_param
  1388. *params)
  1389. {
  1390. wmi_twt_btwt_remove_sta_cmd_fixed_param *cmd;
  1391. wmi_buf_t buf;
  1392. QDF_STATUS status;
  1393. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  1394. if (!buf) {
  1395. wmi_err("Failed to allocate memory");
  1396. return QDF_STATUS_E_FAILURE;
  1397. }
  1398. cmd = (wmi_twt_btwt_remove_sta_cmd_fixed_param *)wmi_buf_data(buf);
  1399. WMITLV_SET_HDR(&cmd->tlv_header,
  1400. WMITLV_TAG_STRUC_wmi_twt_btwt_remove_sta_cmd_fixed_param,
  1401. WMITLV_GET_STRUCT_TLVLEN
  1402. (wmi_twt_btwt_remove_sta_cmd_fixed_param));
  1403. cmd->vdev_id = params->vdev_id;
  1404. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  1405. cmd->dialog_id = params->dialog_id;
  1406. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  1407. WMI_TWT_BTWT_REMOVE_STA_CMDID);
  1408. if (QDF_IS_STATUS_ERROR(status)) {
  1409. wmi_buf_free(buf);
  1410. }
  1411. return status;
  1412. }
  1413. #endif
  1414. static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
  1415. uint8_t *evt_buf,
  1416. struct wmi_twt_enable_complete_event_param *params)
  1417. {
  1418. WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  1419. wmi_twt_enable_complete_event_fixed_param *ev;
  1420. param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1421. if (!param_buf) {
  1422. wmi_err("evt_buf is NULL");
  1423. return QDF_STATUS_E_INVAL;
  1424. }
  1425. ev = param_buf->fixed_param;
  1426. params->pdev_id =
  1427. wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
  1428. ev->pdev_id);
  1429. params->status = ev->status;
  1430. return QDF_STATUS_SUCCESS;
  1431. }
  1432. static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
  1433. uint8_t *evt_buf,
  1434. struct wmi_twt_disable_complete_event *params)
  1435. {
  1436. WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  1437. wmi_twt_disable_complete_event_fixed_param *ev;
  1438. param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1439. if (!param_buf) {
  1440. wmi_err("evt_buf is NULL");
  1441. return QDF_STATUS_E_INVAL;
  1442. }
  1443. ev = param_buf->fixed_param;
  1444. #if 0
  1445. params->pdev_id =
  1446. wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
  1447. ev->pdev_id);
  1448. params->status = ev->status;
  1449. #endif
  1450. return QDF_STATUS_SUCCESS;
  1451. }
  1452. static enum WMI_HOST_ADD_TWT_STATUS
  1453. wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)
  1454. {
  1455. switch (tgt_status) {
  1456. case WMI_ADD_TWT_STATUS_OK:
  1457. return WMI_HOST_ADD_TWT_STATUS_OK;
  1458. case WMI_ADD_TWT_STATUS_TWT_NOT_ENABLED:
  1459. return WMI_HOST_ADD_TWT_STATUS_TWT_NOT_ENABLED;
  1460. case WMI_ADD_TWT_STATUS_USED_DIALOG_ID:
  1461. return WMI_HOST_ADD_TWT_STATUS_USED_DIALOG_ID;
  1462. case WMI_ADD_TWT_STATUS_INVALID_PARAM:
  1463. return WMI_HOST_ADD_TWT_STATUS_INVALID_PARAM;
  1464. case WMI_ADD_TWT_STATUS_NOT_READY:
  1465. return WMI_HOST_ADD_TWT_STATUS_NOT_READY;
  1466. case WMI_ADD_TWT_STATUS_NO_RESOURCE:
  1467. return WMI_HOST_ADD_TWT_STATUS_NO_RESOURCE;
  1468. case WMI_ADD_TWT_STATUS_NO_ACK:
  1469. return WMI_HOST_ADD_TWT_STATUS_NO_ACK;
  1470. case WMI_ADD_TWT_STATUS_NO_RESPONSE:
  1471. return WMI_HOST_ADD_TWT_STATUS_NO_RESPONSE;
  1472. case WMI_ADD_TWT_STATUS_DENIED:
  1473. return WMI_HOST_ADD_TWT_STATUS_DENIED;
  1474. case WMI_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE:
  1475. return WMI_HOST_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE;
  1476. case WMI_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED:
  1477. return WMI_HOST_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED;
  1478. case WMI_ADD_TWT_STATUS_ROAM_IN_PROGRESS:
  1479. return WMI_HOST_ADD_TWT_STATUS_ROAM_IN_PROGRESS;
  1480. case WMI_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  1481. return WMI_HOST_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  1482. case WMI_ADD_TWT_STATUS_SCAN_IN_PROGRESS:
  1483. return WMI_HOST_ADD_TWT_STATUS_SCAN_IN_PROGRESS;
  1484. case WMI_ADD_TWT_STATUS_LINK_SWITCH_IN_PROGRESS:
  1485. return WMI_HOST_ADD_TWT_STATUS_LINK_SWITCH_IN_PROGRESS;
  1486. case WMI_ADD_TWT_STATUS_UNSUPPORTED_MODE_MLMR:
  1487. return WMI_HOST_ADD_TWT_STATUS_UNSUPPORTED_MODE_MLMR;
  1488. default:
  1489. return WMI_HOST_ADD_TWT_STATUS_UNKNOWN_ERROR;
  1490. }
  1491. }
  1492. /**
  1493. * extract_twt_add_dialog_comp_event_tlv - Extacts twt add dialog complete wmi
  1494. * event from firmware
  1495. * @wmi_handle: WMI handle
  1496. * @evt_buf: Pointer to wmi event buf of twt add dialog complete event
  1497. * @params: Pointer to store the extracted parameters
  1498. *
  1499. * Return: QDF_STATUS_SUCCESS on success or QDF STATUS error values on failure
  1500. */
  1501. static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
  1502. wmi_unified_t wmi_handle,
  1503. uint8_t *evt_buf,
  1504. struct wmi_twt_add_dialog_complete_event_param *params)
  1505. {
  1506. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  1507. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  1508. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1509. if (!param_buf) {
  1510. wmi_err("evt_buf is NULL");
  1511. return QDF_STATUS_E_INVAL;
  1512. }
  1513. ev = param_buf->fixed_param;
  1514. params->vdev_id = ev->vdev_id;
  1515. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1516. params->status = wmi_get_converted_twt_add_dialog_status(ev->status);
  1517. params->dialog_id = ev->dialog_id;
  1518. params->num_additional_twt_params = param_buf->num_twt_params;
  1519. return QDF_STATUS_SUCCESS;
  1520. }
  1521. /**
  1522. * extract_twt_add_dialog_comp_additional_parameters() - Extracts additional twt
  1523. * twt parameters, as part of add dialog completion event
  1524. * @wmi_handle: wmi handle
  1525. * @evt_buf: Pointer event buffer
  1526. * @evt_buf_len: length of the add dialog event buffer
  1527. * @idx: index of num_twt_params
  1528. * @additional_params: twt additional parameters to extract
  1529. *
  1530. * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_INVAL for failure
  1531. */
  1532. static QDF_STATUS extract_twt_add_dialog_comp_additional_parameters
  1533. (
  1534. wmi_unified_t wmi_handle, uint8_t *evt_buf,
  1535. uint32_t evt_buf_len, uint32_t idx,
  1536. struct wmi_twt_add_dialog_additional_params *additional_params
  1537. )
  1538. {
  1539. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  1540. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  1541. uint32_t flags = 0;
  1542. uint32_t expected_len;
  1543. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1544. if (!param_buf) {
  1545. wmi_err("evt_buf is NULL");
  1546. return QDF_STATUS_E_INVAL;
  1547. }
  1548. ev = param_buf->fixed_param;
  1549. if (idx >= param_buf->num_twt_params) {
  1550. wmi_err("Invalid idx %d while num_twt_params = %d",
  1551. idx, param_buf->num_twt_params);
  1552. return QDF_STATUS_E_INVAL;
  1553. }
  1554. if (!param_buf->twt_params) {
  1555. wmi_err("Unable to extract additional twt parameters");
  1556. return QDF_STATUS_E_INVAL;
  1557. }
  1558. expected_len = (sizeof(wmi_twt_add_dialog_complete_event_fixed_param) +
  1559. WMI_TLV_HDR_SIZE + (param_buf->num_twt_params *
  1560. sizeof(wmi_twt_add_dialog_additional_params)));
  1561. if (evt_buf_len != expected_len) {
  1562. wmi_err("Got invalid len data from FW %d expected %d",
  1563. evt_buf_len, expected_len);
  1564. return QDF_STATUS_E_INVAL;
  1565. }
  1566. flags = param_buf->twt_params[idx].flags;
  1567. additional_params->twt_cmd = TWT_FLAGS_GET_CMD(flags);
  1568. additional_params->bcast = TWT_FLAGS_GET_BROADCAST(flags);
  1569. additional_params->trig_en = TWT_FLAGS_GET_TRIGGER(flags);
  1570. additional_params->announce = TWT_FLAGS_GET_FLOW_TYPE(flags);
  1571. additional_params->protection = TWT_FLAGS_GET_PROTECTION(flags);
  1572. additional_params->b_twt_id0 = TWT_FLAGS_GET_BTWT_ID0(flags);
  1573. additional_params->info_frame_disabled =
  1574. TWT_FLAGS_GET_TWT_INFO_FRAME_DISABLED(flags);
  1575. additional_params->wake_dur_us = param_buf->twt_params[idx].wake_dur_us;
  1576. additional_params->wake_intvl_us =
  1577. param_buf->twt_params[idx].wake_intvl_us;
  1578. additional_params->sp_offset_us =
  1579. param_buf->twt_params[idx].sp_offset_us;
  1580. additional_params->sp_tsf_us_lo =
  1581. param_buf->twt_params[idx].sp_tsf_us_lo;
  1582. additional_params->sp_tsf_us_hi =
  1583. param_buf->twt_params[idx].sp_tsf_us_hi;
  1584. additional_params->pm_responder_bit_valid =
  1585. TWT_FLAGS_GET_PM_RESPONDER_MODE_VALID(flags);
  1586. additional_params->pm_responder_bit =
  1587. TWT_FLAGS_GET_PM_RESPONDER_MODE(flags);
  1588. return QDF_STATUS_SUCCESS;
  1589. }
  1590. static enum WMI_HOST_DEL_TWT_STATUS
  1591. wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)
  1592. {
  1593. switch (tgt_status) {
  1594. case WMI_DEL_TWT_STATUS_OK:
  1595. return WMI_HOST_DEL_TWT_STATUS_OK;
  1596. case WMI_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  1597. return WMI_HOST_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  1598. case WMI_DEL_TWT_STATUS_INVALID_PARAM:
  1599. return WMI_HOST_DEL_TWT_STATUS_INVALID_PARAM;
  1600. case WMI_DEL_TWT_STATUS_DIALOG_ID_BUSY:
  1601. return WMI_HOST_DEL_TWT_STATUS_DIALOG_ID_BUSY;
  1602. case WMI_DEL_TWT_STATUS_NO_RESOURCE:
  1603. return WMI_HOST_DEL_TWT_STATUS_NO_RESOURCE;
  1604. case WMI_DEL_TWT_STATUS_NO_ACK:
  1605. return WMI_HOST_DEL_TWT_STATUS_NO_ACK;
  1606. case WMI_DEL_TWT_STATUS_UNKNOWN_ERROR:
  1607. return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
  1608. case WMI_DEL_TWT_STATUS_PEER_INIT_TEARDOWN:
  1609. return WMI_HOST_DEL_TWT_STATUS_PEER_INIT_TEARDOWN;
  1610. case WMI_DEL_TWT_STATUS_ROAMING:
  1611. return WMI_HOST_DEL_TWT_STATUS_ROAMING;
  1612. case WMI_DEL_TWT_STATUS_CONCURRENCY:
  1613. return WMI_HOST_DEL_TWT_STATUS_CONCURRENCY;
  1614. case WMI_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  1615. return WMI_HOST_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  1616. case WMI_DEL_TWT_STATUS_SCAN_IN_PROGRESS:
  1617. return WMI_HOST_DEL_TWT_STATUS_SCAN_IN_PROGRESS;
  1618. default:
  1619. return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
  1620. }
  1621. return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
  1622. }
  1623. static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
  1624. wmi_unified_t wmi_handle,
  1625. uint8_t *evt_buf,
  1626. struct wmi_twt_del_dialog_complete_event_param *params)
  1627. {
  1628. WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  1629. wmi_twt_del_dialog_complete_event_fixed_param *ev;
  1630. param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1631. if (!param_buf) {
  1632. wmi_err("evt_buf is NULL");
  1633. return QDF_STATUS_E_INVAL;
  1634. }
  1635. ev = param_buf->fixed_param;
  1636. params->vdev_id = ev->vdev_id;
  1637. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1638. params->dialog_id = ev->dialog_id;
  1639. params->status = wmi_get_converted_twt_del_dialog_status(ev->status);
  1640. return QDF_STATUS_SUCCESS;
  1641. }
  1642. static enum WMI_HOST_PAUSE_TWT_STATUS
  1643. wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)
  1644. {
  1645. switch (status) {
  1646. case WMI_PAUSE_TWT_STATUS_OK:
  1647. return WMI_HOST_PAUSE_TWT_STATUS_OK;
  1648. case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  1649. return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  1650. case WMI_PAUSE_TWT_STATUS_INVALID_PARAM:
  1651. return WMI_HOST_PAUSE_TWT_STATUS_INVALID_PARAM;
  1652. case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY:
  1653. return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_BUSY;
  1654. case WMI_PAUSE_TWT_STATUS_NO_RESOURCE:
  1655. return WMI_HOST_PAUSE_TWT_STATUS_NO_RESOURCE;
  1656. case WMI_PAUSE_TWT_STATUS_NO_ACK:
  1657. return WMI_HOST_PAUSE_TWT_STATUS_NO_ACK;
  1658. case WMI_PAUSE_TWT_STATUS_UNKNOWN_ERROR:
  1659. return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
  1660. case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED:
  1661. return WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED;
  1662. case WMI_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  1663. return WMI_HOST_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  1664. case WMI_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS:
  1665. return WMI_HOST_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS;
  1666. case WMI_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS:
  1667. return WMI_HOST_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS;
  1668. default:
  1669. return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
  1670. }
  1671. }
  1672. static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
  1673. wmi_unified_t wmi_handle,
  1674. uint8_t *evt_buf,
  1675. struct wmi_twt_pause_dialog_complete_event_param *params)
  1676. {
  1677. WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  1678. wmi_twt_pause_dialog_complete_event_fixed_param *ev;
  1679. param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1680. if (!param_buf) {
  1681. wmi_err("evt_buf is NULL");
  1682. return QDF_STATUS_E_INVAL;
  1683. }
  1684. ev = param_buf->fixed_param;
  1685. params->vdev_id = ev->vdev_id;
  1686. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1687. params->status = wmi_twt_pause_status_to_host_twt_status(ev->status);
  1688. params->dialog_id = ev->dialog_id;
  1689. return QDF_STATUS_SUCCESS;
  1690. }
  1691. static enum WMI_HOST_NUDGE_TWT_STATUS
  1692. wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)
  1693. {
  1694. switch (status) {
  1695. case WMI_NUDGE_TWT_STATUS_OK:
  1696. return WMI_HOST_NUDGE_TWT_STATUS_OK;
  1697. case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  1698. return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  1699. case WMI_NUDGE_TWT_STATUS_INVALID_PARAM:
  1700. return WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM;
  1701. case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY:
  1702. return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY;
  1703. case WMI_NUDGE_TWT_STATUS_NO_RESOURCE:
  1704. return WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE;
  1705. case WMI_NUDGE_TWT_STATUS_NO_ACK:
  1706. return WMI_HOST_NUDGE_TWT_STATUS_NO_ACK;
  1707. case WMI_NUDGE_TWT_STATUS_UNKNOWN_ERROR:
  1708. return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
  1709. case WMI_NUDGE_TWT_STATUS_ALREADY_PAUSED:
  1710. return WMI_HOST_NUDGE_TWT_STATUS_ALREADY_PAUSED;
  1711. case WMI_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  1712. return WMI_HOST_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  1713. case WMI_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS:
  1714. return WMI_HOST_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS;
  1715. case WMI_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS:
  1716. return WMI_HOST_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS;
  1717. default:
  1718. return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
  1719. }
  1720. }
  1721. static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv(
  1722. wmi_unified_t wmi_handle,
  1723. uint8_t *evt_buf,
  1724. struct wmi_twt_nudge_dialog_complete_event_param *params)
  1725. {
  1726. WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  1727. wmi_twt_nudge_dialog_complete_event_fixed_param *ev;
  1728. param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1729. if (!param_buf) {
  1730. wmi_err("evt_buf is NULL");
  1731. return QDF_STATUS_E_INVAL;
  1732. }
  1733. ev = param_buf->fixed_param;
  1734. params->vdev_id = ev->vdev_id;
  1735. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1736. params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status);
  1737. params->dialog_id = ev->dialog_id;
  1738. params->next_twt_tsf_us_lo = ev->sp_tsf_us_lo;
  1739. params->next_twt_tsf_us_hi = ev->sp_tsf_us_hi;
  1740. wmi_debug("vdev_id: %d dialog_id: %d tsf hi : %x tsf lo: %x",
  1741. params->vdev_id, params->dialog_id,
  1742. params->next_twt_tsf_us_hi, params->next_twt_tsf_us_lo);
  1743. return QDF_STATUS_SUCCESS;
  1744. }
  1745. static enum WMI_HOST_RESUME_TWT_STATUS
  1746. wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)
  1747. {
  1748. switch (tgt_status) {
  1749. case WMI_RESUME_TWT_STATUS_OK:
  1750. return WMI_HOST_RESUME_TWT_STATUS_OK;
  1751. case WMI_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  1752. return WMI_HOST_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  1753. case WMI_RESUME_TWT_STATUS_INVALID_PARAM:
  1754. return WMI_HOST_RESUME_TWT_STATUS_INVALID_PARAM;
  1755. case WMI_RESUME_TWT_STATUS_DIALOG_ID_BUSY:
  1756. return WMI_HOST_RESUME_TWT_STATUS_DIALOG_ID_BUSY;
  1757. case WMI_RESUME_TWT_STATUS_NOT_PAUSED:
  1758. return WMI_HOST_RESUME_TWT_STATUS_NOT_PAUSED;
  1759. case WMI_RESUME_TWT_STATUS_NO_RESOURCE:
  1760. return WMI_HOST_RESUME_TWT_STATUS_NO_RESOURCE;
  1761. case WMI_RESUME_TWT_STATUS_NO_ACK:
  1762. return WMI_HOST_RESUME_TWT_STATUS_NO_ACK;
  1763. case WMI_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  1764. return WMI_HOST_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  1765. case WMI_RESUME_TWT_STATUS_ROAM_IN_PROGRESS:
  1766. return WMI_HOST_RESUME_TWT_STATUS_ROAM_IN_PROGRESS;
  1767. case WMI_RESUME_TWT_STATUS_SCAN_IN_PROGRESS:
  1768. return WMI_HOST_RESUME_TWT_STATUS_SCAN_IN_PROGRESS;
  1769. default:
  1770. return WMI_HOST_RESUME_TWT_STATUS_UNKNOWN_ERROR;
  1771. }
  1772. }
  1773. static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
  1774. wmi_unified_t wmi_handle,
  1775. uint8_t *evt_buf,
  1776. struct wmi_twt_resume_dialog_complete_event_param *params)
  1777. {
  1778. WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  1779. wmi_twt_resume_dialog_complete_event_fixed_param *ev;
  1780. param_buf =
  1781. (WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1782. if (!param_buf) {
  1783. wmi_err("evt_buf is NULL");
  1784. return QDF_STATUS_E_INVAL;
  1785. }
  1786. ev = param_buf->fixed_param;
  1787. params->vdev_id = ev->vdev_id;
  1788. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1789. params->status = wmi_get_converted_twt_resume_dialog_status(ev->status);
  1790. params->dialog_id = ev->dialog_id;
  1791. return QDF_STATUS_SUCCESS;
  1792. }
  1793. static QDF_STATUS extract_twt_notify_event_tlv(
  1794. wmi_unified_t wmi_handle,
  1795. uint8_t *evt_buf,
  1796. struct wmi_twt_notify_event_param *params)
  1797. {
  1798. WMI_TWT_NOTIFY_EVENTID_param_tlvs *param_buf;
  1799. wmi_twt_notify_event_fixed_param *ev;
  1800. param_buf =
  1801. (WMI_TWT_NOTIFY_EVENTID_param_tlvs *)evt_buf;
  1802. if (!param_buf) {
  1803. wmi_err("evt_buf is NULL");
  1804. return QDF_STATUS_E_INVAL;
  1805. }
  1806. ev = param_buf->fixed_param;
  1807. params->vdev_id = ev->vdev_id;
  1808. return QDF_STATUS_SUCCESS;
  1809. }
  1810. #ifdef WLAN_SUPPORT_BCAST_TWT
  1811. static QDF_STATUS
  1812. extract_twt_btwt_invite_sta_comp_event_tlv(
  1813. wmi_unified_t wmi_handle,
  1814. uint8_t *evt_buf,
  1815. struct
  1816. wmi_twt_btwt_invite_sta_complete_event_param
  1817. *params)
  1818. {
  1819. WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
  1820. wmi_twt_btwt_invite_sta_complete_event_fixed_param *ev;
  1821. param_buf =
  1822. (WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1823. if (!param_buf) {
  1824. wmi_err("evt_buf is NULL");
  1825. return QDF_STATUS_E_INVAL;
  1826. }
  1827. ev = param_buf->fixed_param;
  1828. params->vdev_id = ev->vdev_id;
  1829. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1830. params->status = ev->status;
  1831. params->dialog_id = ev->dialog_id;
  1832. return QDF_STATUS_SUCCESS;
  1833. }
  1834. static QDF_STATUS
  1835. extract_twt_btwt_remove_sta_comp_event_tlv(
  1836. wmi_unified_t wmi_handle,
  1837. uint8_t *evt_buf,
  1838. struct
  1839. wmi_twt_btwt_remove_sta_complete_event_param
  1840. *params)
  1841. {
  1842. WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
  1843. wmi_twt_btwt_remove_sta_complete_event_fixed_param *ev;
  1844. param_buf =
  1845. (WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  1846. if (!param_buf) {
  1847. wmi_err("evt_buf is NULL");
  1848. return QDF_STATUS_E_INVAL;
  1849. }
  1850. ev = param_buf->fixed_param;
  1851. params->vdev_id = ev->vdev_id;
  1852. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  1853. params->status = ev->status;
  1854. params->dialog_id = ev->dialog_id;
  1855. return QDF_STATUS_SUCCESS;
  1856. }
  1857. #endif
  1858. #ifdef WLAN_SUPPORT_BCAST_TWT
  1859. static void
  1860. wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
  1861. {
  1862. ops->send_twt_btwt_invite_sta_cmd = send_twt_btwt_invite_sta_cmd_tlv;
  1863. ops->send_twt_btwt_remove_sta_cmd = send_twt_btwt_remove_sta_cmd_tlv;
  1864. ops->extract_twt_btwt_invite_sta_comp_event =
  1865. extract_twt_btwt_invite_sta_comp_event_tlv;
  1866. ops->extract_twt_btwt_remove_sta_comp_event =
  1867. extract_twt_btwt_remove_sta_comp_event_tlv;
  1868. }
  1869. #else
  1870. static void
  1871. wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
  1872. {
  1873. }
  1874. #endif
  1875. static QDF_STATUS
  1876. extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,
  1877. uint8_t *evt_buf,
  1878. struct wmi_twt_session_stats_event_param
  1879. *params)
  1880. {
  1881. WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
  1882. wmi_pdev_twt_session_stats_event_fixed_param *ev;
  1883. param_buf =
  1884. (WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
  1885. if (!param_buf) {
  1886. wmi_err("evt_buf is NULL");
  1887. return QDF_STATUS_E_INVAL;
  1888. }
  1889. ev = param_buf->fixed_param;
  1890. params->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
  1891. wmi_handle,
  1892. ev->pdev_id);
  1893. params->num_sessions = param_buf->num_twt_sessions;
  1894. wmi_debug("pdev_id=%d, num of TWT sessions=%d",
  1895. params->pdev_id, params->num_sessions);
  1896. return QDF_STATUS_SUCCESS;
  1897. }
  1898. static QDF_STATUS
  1899. extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,
  1900. uint8_t *evt_buf,
  1901. struct wmi_twt_session_stats_event_param
  1902. *params,
  1903. struct wmi_host_twt_session_stats_info
  1904. *session,
  1905. uint32_t idx)
  1906. {
  1907. WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
  1908. wmi_twt_session_stats_info *twt_session;
  1909. uint32_t flags;
  1910. wmi_mac_addr *m1;
  1911. uint8_t *m2;
  1912. param_buf =
  1913. (WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
  1914. if (!param_buf) {
  1915. wmi_err("evt_buf is NULL");
  1916. return QDF_STATUS_E_INVAL;
  1917. }
  1918. if (idx >= param_buf->num_twt_sessions) {
  1919. wmi_err("wrong idx, idx=%d, num_sessions=%d",
  1920. idx, param_buf->num_twt_sessions);
  1921. return QDF_STATUS_E_INVAL;
  1922. }
  1923. twt_session = &param_buf->twt_sessions[idx];
  1924. session->vdev_id = twt_session->vdev_id;
  1925. m1 = &twt_session->peer_mac;
  1926. m2 = session->peer_mac;
  1927. WMI_MAC_ADDR_TO_CHAR_ARRAY(m1, m2);
  1928. session->event_type = twt_session->event_type;
  1929. flags = twt_session->flow_id_flags;
  1930. session->flow_id = WMI_TWT_SESSION_FLAG_FLOW_ID_GET(flags);
  1931. session->bcast = WMI_TWT_SESSION_FLAG_BCAST_TWT_GET(flags);
  1932. session->trig = WMI_TWT_SESSION_FLAG_TRIGGER_TWT_GET(flags);
  1933. session->announ = WMI_TWT_SESSION_FLAG_ANNOUN_TWT_GET(flags);
  1934. session->protection = WMI_TWT_SESSION_FLAG_TWT_PROTECTION_GET(flags);
  1935. session->info_frame_disabled =
  1936. WMI_TWT_SESSION_FLAG_TWT_INFO_FRAME_DISABLED_GET(flags);
  1937. session->pm_responder_bit =
  1938. WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_GET(flags);
  1939. session->pm_responder_bit_valid =
  1940. WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_VALID_GET(flags);
  1941. session->dialog_id = twt_session->dialog_id;
  1942. session->wake_dura_us = twt_session->wake_dura_us;
  1943. session->wake_intvl_us = twt_session->wake_intvl_us;
  1944. session->sp_offset_us = twt_session->sp_offset_us;
  1945. session->sp_tsf_us_lo = twt_session->sp_tsf_us_lo;
  1946. session->sp_tsf_us_hi = twt_session->sp_tsf_us_hi;
  1947. wmi_debug("type=%d id=%d bcast=%d trig=%d announ=%d diagid=%d wake_dur=%ul wake_int=%ul offset=%ul",
  1948. session->event_type, session->flow_id,
  1949. session->bcast, session->trig,
  1950. session->announ, session->dialog_id, session->wake_dura_us,
  1951. session->wake_intvl_us, session->sp_offset_us);
  1952. wmi_debug("resp_pm_valid=%d resp_pm=%d",
  1953. session->pm_responder_bit_valid, session->pm_responder_bit);
  1954. return QDF_STATUS_SUCCESS;
  1955. }
  1956. static QDF_STATUS extract_twt_cap_service_ready_ext2_tlv(
  1957. wmi_unified_t wmi_handle, uint8_t *event,
  1958. struct wmi_twt_cap_bitmap_params *var)
  1959. {
  1960. WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *param_buf;
  1961. wmi_twt_caps_params *twt_caps;
  1962. param_buf = (WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *)event;
  1963. if (!param_buf)
  1964. return QDF_STATUS_E_INVAL;
  1965. twt_caps = param_buf->twt_caps;
  1966. if (!twt_caps)
  1967. return QDF_STATUS_E_INVAL;
  1968. var->twt_ack_support_cap = WMI_GET_BITS(twt_caps->twt_capability_bitmap,
  1969. 0, 1);
  1970. return QDF_STATUS_SUCCESS;
  1971. }
  1972. static enum WMI_HOST_TWT_CMD_FOR_ACK_EVENT
  1973. wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)
  1974. {
  1975. switch (tgt_cmd) {
  1976. case WMI_TWT_ADD_DIALOG_CMDID:
  1977. return WMI_HOST_TWT_ADD_DIALOG_CMDID;
  1978. case WMI_TWT_DEL_DIALOG_CMDID:
  1979. return WMI_HOST_TWT_DEL_DIALOG_CMDID;
  1980. case WMI_TWT_PAUSE_DIALOG_CMDID:
  1981. return WMI_HOST_TWT_PAUSE_DIALOG_CMDID;
  1982. case WMI_TWT_RESUME_DIALOG_CMDID:
  1983. return WMI_HOST_TWT_RESUME_DIALOG_CMDID;
  1984. case WMI_TWT_NUDGE_DIALOG_CMDID:
  1985. return WMI_HOST_TWT_NUDGE_DIALOG_CMDID;
  1986. default:
  1987. return WMI_HOST_TWT_UNKNOWN_CMDID;
  1988. }
  1989. }
  1990. static QDF_STATUS
  1991. extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,
  1992. uint8_t *evt_buf,
  1993. struct wmi_twt_ack_complete_event_param *var)
  1994. {
  1995. WMI_TWT_ACK_EVENTID_param_tlvs *param_buf;
  1996. wmi_twt_ack_event_fixed_param *ack_event;
  1997. param_buf = (WMI_TWT_ACK_EVENTID_param_tlvs *)evt_buf;
  1998. if (!param_buf) {
  1999. wmi_err("evt_buf is NULL");
  2000. return QDF_STATUS_E_INVAL;
  2001. }
  2002. ack_event = param_buf->fixed_param;
  2003. var->vdev_id = ack_event->vdev_id;
  2004. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ack_event->peer_macaddr,
  2005. var->peer_macaddr.bytes);
  2006. var->dialog_id = ack_event->dialog_id;
  2007. var->twt_cmd_ack = wmi_get_converted_twt_command_for_ack_event(
  2008. ack_event->twt_cmd);
  2009. switch (ack_event->twt_cmd) {
  2010. case WMI_TWT_ADD_DIALOG_CMDID:
  2011. var->status = wmi_get_converted_twt_add_dialog_status(
  2012. ack_event->status);
  2013. break;
  2014. case WMI_TWT_DEL_DIALOG_CMDID:
  2015. var->status = wmi_get_converted_twt_del_dialog_status(
  2016. ack_event->status);
  2017. break;
  2018. case WMI_TWT_PAUSE_DIALOG_CMDID:
  2019. var->status = wmi_twt_pause_status_to_host_twt_status(
  2020. ack_event->status);
  2021. break;
  2022. case WMI_TWT_RESUME_DIALOG_CMDID:
  2023. var->status = wmi_get_converted_twt_resume_dialog_status(
  2024. ack_event->status);
  2025. break;
  2026. case WMI_TWT_NUDGE_DIALOG_CMDID:
  2027. var->status = wmi_twt_nudge_status_to_host_twt_status(
  2028. ack_event->status);
  2029. break;
  2030. default:
  2031. break;
  2032. }
  2033. return QDF_STATUS_SUCCESS;
  2034. }
  2035. #endif
  2036. void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
  2037. {
  2038. struct wmi_ops *ops = wmi_handle->ops;
  2039. ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
  2040. ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
  2041. ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
  2042. ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
  2043. ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
  2044. ops->send_twt_nudge_dialog_cmd = send_twt_nudge_dialog_cmd_tlv;
  2045. ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
  2046. ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
  2047. ops->extract_twt_disable_comp_event =
  2048. extract_twt_disable_comp_event_tlv;
  2049. ops->extract_twt_add_dialog_comp_event =
  2050. extract_twt_add_dialog_comp_event_tlv;
  2051. ops->extract_twt_add_dialog_comp_additional_params =
  2052. extract_twt_add_dialog_comp_additional_parameters;
  2053. ops->extract_twt_del_dialog_comp_event =
  2054. extract_twt_del_dialog_comp_event_tlv;
  2055. ops->extract_twt_pause_dialog_comp_event =
  2056. extract_twt_pause_dialog_comp_event_tlv;
  2057. ops->extract_twt_nudge_dialog_comp_event =
  2058. extract_twt_nudge_dialog_comp_event_tlv;
  2059. ops->extract_twt_resume_dialog_comp_event =
  2060. extract_twt_resume_dialog_comp_event_tlv;
  2061. ops->extract_twt_session_stats_event =
  2062. extract_twt_session_stats_event_tlv;
  2063. ops->extract_twt_session_stats_data =
  2064. extract_twt_session_stats_event_data;
  2065. ops->extract_twt_notify_event =
  2066. extract_twt_notify_event_tlv;
  2067. ops->extract_twt_cap_service_ready_ext2 =
  2068. extract_twt_cap_service_ready_ext2_tlv,
  2069. ops->extract_twt_ack_comp_event = extract_twt_ack_comp_event_tlv;
  2070. wmi_twt_attach_bcast_twt_tlv(ops);
  2071. }