wmi_unified_twt_tlv.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. /*
  2. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include <osdep.h>
  19. #include "wmi.h"
  20. #include "wmi_unified_priv.h"
  21. #include "wmi_unified_twt_param.h"
  22. #include "wmi_unified_twt_api.h"
  23. static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,
  24. struct wmi_twt_enable_param *params)
  25. {
  26. wmi_twt_enable_cmd_fixed_param *cmd;
  27. wmi_buf_t buf;
  28. QDF_STATUS status;
  29. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  30. if (!buf) {
  31. wmi_err("Failed to allocate memory");
  32. return QDF_STATUS_E_FAILURE;
  33. }
  34. cmd = (wmi_twt_enable_cmd_fixed_param *) wmi_buf_data(buf);
  35. WMITLV_SET_HDR(&cmd->tlv_header,
  36. WMITLV_TAG_STRUC_wmi_twt_enable_cmd_fixed_param,
  37. WMITLV_GET_STRUCT_TLVLEN
  38. (wmi_twt_enable_cmd_fixed_param));
  39. cmd->pdev_id =
  40. wmi_handle->ops->convert_pdev_id_host_to_target(
  41. wmi_handle,
  42. params->pdev_id);
  43. cmd->sta_cong_timer_ms = params->sta_cong_timer_ms;
  44. cmd->mbss_support = params->mbss_support;
  45. cmd->default_slot_size = params->default_slot_size;
  46. cmd->congestion_thresh_setup = params->congestion_thresh_setup;
  47. cmd->congestion_thresh_teardown = params->congestion_thresh_teardown;
  48. cmd->congestion_thresh_critical = params->congestion_thresh_critical;
  49. cmd->interference_thresh_teardown =
  50. params->interference_thresh_teardown;
  51. cmd->interference_thresh_setup = params->interference_thresh_setup;
  52. cmd->min_no_sta_setup = params->min_no_sta_setup;
  53. cmd->min_no_sta_teardown = params->min_no_sta_teardown;
  54. cmd->no_of_bcast_mcast_slots = params->no_of_bcast_mcast_slots;
  55. cmd->min_no_twt_slots = params->min_no_twt_slots;
  56. cmd->max_no_sta_twt = params->max_no_sta_twt;
  57. cmd->mode_check_interval = params->mode_check_interval;
  58. cmd->add_sta_slot_interval = params->add_sta_slot_interval;
  59. cmd->remove_sta_slot_interval = params->remove_sta_slot_interval;
  60. TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable);
  61. TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags,
  62. params->b_twt_legacy_mbss_enable);
  63. TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags,
  64. params->b_twt_ax_mbss_enable);
  65. if (params->ext_conf_present) {
  66. TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
  67. TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
  68. TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
  69. }
  70. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  71. WMI_TWT_ENABLE_CMDID);
  72. if (QDF_IS_STATUS_ERROR(status)) {
  73. wmi_err("Failed to send WMI_TWT_ENABLE_CMDID");
  74. wmi_buf_free(buf);
  75. }
  76. return status;
  77. }
  78. static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
  79. struct wmi_twt_disable_param *params)
  80. {
  81. wmi_twt_disable_cmd_fixed_param *cmd;
  82. wmi_buf_t buf;
  83. QDF_STATUS status;
  84. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  85. if (!buf) {
  86. wmi_err("Failed to allocate memory");
  87. return QDF_STATUS_E_FAILURE;
  88. }
  89. cmd = (wmi_twt_disable_cmd_fixed_param *) wmi_buf_data(buf);
  90. WMITLV_SET_HDR(&cmd->tlv_header,
  91. WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
  92. WMITLV_GET_STRUCT_TLVLEN
  93. (wmi_twt_disable_cmd_fixed_param));
  94. cmd->pdev_id =
  95. wmi_handle->ops->convert_pdev_id_host_to_target(
  96. wmi_handle,
  97. params->pdev_id);
  98. if (params->ext_conf_present) {
  99. TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
  100. TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
  101. TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
  102. }
  103. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  104. WMI_TWT_DISABLE_CMDID);
  105. if (QDF_IS_STATUS_ERROR(status)) {
  106. wmi_err("Failed to send WMI_TWT_DISABLE_CMDID");
  107. wmi_buf_free(buf);
  108. }
  109. return status;
  110. }
  111. #ifdef WLAN_SUPPORT_BCAST_TWT
  112. static void
  113. twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
  114. wmi_twt_add_dialog_cmd_fixed_param *cmd)
  115. {
  116. TWT_FLAGS_SET_BTWT_ID0(cmd->flags, params->flag_b_twt_id0);
  117. cmd->b_twt_persistence = params->b_twt_persistence;
  118. cmd->b_twt_recommendation = params->b_twt_recommendation;
  119. return;
  120. }
  121. #else
  122. static void
  123. twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
  124. wmi_twt_add_dialog_cmd_fixed_param *cmd)
  125. {
  126. return;
  127. }
  128. #endif
  129. static QDF_STATUS
  130. send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  131. struct wmi_twt_add_dialog_param *params)
  132. {
  133. wmi_twt_add_dialog_cmd_fixed_param *cmd;
  134. wmi_buf_t buf;
  135. QDF_STATUS status;
  136. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  137. if (!buf) {
  138. wmi_err("Failed to allocate memory");
  139. return QDF_STATUS_E_FAILURE;
  140. }
  141. cmd = (wmi_twt_add_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  142. WMITLV_SET_HDR(&cmd->tlv_header,
  143. WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
  144. WMITLV_GET_STRUCT_TLVLEN
  145. (wmi_twt_add_dialog_cmd_fixed_param));
  146. cmd->vdev_id = params->vdev_id;
  147. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  148. cmd->dialog_id = params->dialog_id;
  149. cmd->wake_intvl_us = params->wake_intvl_us;
  150. cmd->wake_intvl_mantis = params->wake_intvl_mantis;
  151. cmd->wake_dura_us = params->wake_dura_us;
  152. cmd->sp_offset_us = params->sp_offset_us;
  153. cmd->min_wake_intvl_us = params->min_wake_intvl_us;
  154. cmd->max_wake_intvl_us = params->max_wake_intvl_us;
  155. cmd->min_wake_dura_us = params->min_wake_dura_us;
  156. cmd->max_wake_dura_us = params->max_wake_dura_us;
  157. TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
  158. TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
  159. TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
  160. TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
  161. TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
  162. twt_add_dialog_set_bcast_twt_params(params, cmd);
  163. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  164. WMI_TWT_ADD_DIALOG_CMDID);
  165. if (QDF_IS_STATUS_ERROR(status)) {
  166. wmi_err("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
  167. wmi_buf_free(buf);
  168. }
  169. return status;
  170. }
  171. #ifdef WLAN_SUPPORT_BCAST_TWT
  172. static void
  173. twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
  174. wmi_twt_del_dialog_cmd_fixed_param *cmd)
  175. {
  176. cmd->b_twt_persistence = params->b_twt_persistence;
  177. return;
  178. }
  179. #else
  180. static void
  181. twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
  182. wmi_twt_del_dialog_cmd_fixed_param *cmd)
  183. {
  184. return;
  185. }
  186. #endif
  187. static QDF_STATUS
  188. send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  189. struct wmi_twt_del_dialog_param *params)
  190. {
  191. wmi_twt_del_dialog_cmd_fixed_param *cmd;
  192. wmi_buf_t buf;
  193. QDF_STATUS status;
  194. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  195. if (!buf) {
  196. wmi_err("Failed to allocate memory");
  197. return QDF_STATUS_E_FAILURE;
  198. }
  199. cmd = (wmi_twt_del_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  200. WMITLV_SET_HDR(&cmd->tlv_header,
  201. WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
  202. WMITLV_GET_STRUCT_TLVLEN
  203. (wmi_twt_del_dialog_cmd_fixed_param));
  204. cmd->vdev_id = params->vdev_id;
  205. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  206. cmd->dialog_id = params->dialog_id;
  207. twt_del_dialog_set_bcast_twt_params(params, cmd);
  208. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  209. WMI_TWT_DEL_DIALOG_CMDID);
  210. if (QDF_IS_STATUS_ERROR(status)) {
  211. wmi_err("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
  212. wmi_buf_free(buf);
  213. }
  214. return status;
  215. }
  216. static QDF_STATUS
  217. send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  218. struct wmi_twt_pause_dialog_cmd_param *params)
  219. {
  220. wmi_twt_pause_dialog_cmd_fixed_param *cmd;
  221. wmi_buf_t buf;
  222. QDF_STATUS status;
  223. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  224. if (!buf) {
  225. wmi_err("Failed to allocate memory");
  226. return QDF_STATUS_E_FAILURE;
  227. }
  228. cmd = (wmi_twt_pause_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  229. WMITLV_SET_HDR(&cmd->tlv_header,
  230. WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
  231. WMITLV_GET_STRUCT_TLVLEN
  232. (wmi_twt_pause_dialog_cmd_fixed_param));
  233. cmd->vdev_id = params->vdev_id;
  234. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  235. cmd->dialog_id = params->dialog_id;
  236. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  237. WMI_TWT_PAUSE_DIALOG_CMDID);
  238. if (QDF_IS_STATUS_ERROR(status)) {
  239. wmi_err("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
  240. wmi_buf_free(buf);
  241. }
  242. return status;
  243. }
  244. static QDF_STATUS
  245. send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  246. struct wmi_twt_nudge_dialog_cmd_param *params)
  247. {
  248. wmi_twt_nudge_dialog_cmd_fixed_param *cmd;
  249. wmi_buf_t buf;
  250. QDF_STATUS status;
  251. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  252. if (!buf)
  253. return QDF_STATUS_E_FAILURE;
  254. cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  255. WMITLV_SET_HDR(&cmd->tlv_header,
  256. WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param,
  257. WMITLV_GET_STRUCT_TLVLEN
  258. (wmi_twt_nudge_dialog_cmd_fixed_param));
  259. cmd->vdev_id = params->vdev_id;
  260. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  261. cmd->dialog_id = params->dialog_id;
  262. cmd->suspend_duration_ms = params->suspend_duration / 1000;
  263. cmd->next_twt_size = params->next_twt_size;
  264. wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d "
  265. "peer_macaddr: "QDF_MAC_ADDR_FMT, cmd->vdev_id,
  266. cmd->dialog_id, cmd->suspend_duration_ms, cmd->next_twt_size,
  267. QDF_MAC_ADDR_REF(params->peer_macaddr));
  268. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  269. WMI_TWT_NUDGE_DIALOG_CMDID);
  270. if (QDF_IS_STATUS_ERROR(status))
  271. wmi_buf_free(buf);
  272. return status;
  273. }
  274. static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  275. struct wmi_twt_resume_dialog_cmd_param *params)
  276. {
  277. wmi_twt_resume_dialog_cmd_fixed_param *cmd;
  278. wmi_buf_t buf;
  279. QDF_STATUS status;
  280. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  281. if (!buf) {
  282. wmi_err("Failed to allocate memory");
  283. return QDF_STATUS_E_FAILURE;
  284. }
  285. cmd = (wmi_twt_resume_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  286. WMITLV_SET_HDR(&cmd->tlv_header,
  287. WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
  288. WMITLV_GET_STRUCT_TLVLEN
  289. (wmi_twt_resume_dialog_cmd_fixed_param));
  290. cmd->vdev_id = params->vdev_id;
  291. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  292. cmd->dialog_id = params->dialog_id;
  293. cmd->sp_offset_us = params->sp_offset_us;
  294. cmd->next_twt_size = params->next_twt_size;
  295. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  296. WMI_TWT_RESUME_DIALOG_CMDID);
  297. if (QDF_IS_STATUS_ERROR(status)) {
  298. wmi_err("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
  299. wmi_buf_free(buf);
  300. }
  301. return status;
  302. }
  303. #ifdef WLAN_SUPPORT_BCAST_TWT
  304. static QDF_STATUS
  305. send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,
  306. struct wmi_twt_btwt_invite_sta_cmd_param
  307. *params)
  308. {
  309. wmi_twt_btwt_invite_sta_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_btwt_invite_sta_cmd_fixed_param *)wmi_buf_data(buf);
  318. WMITLV_SET_HDR(&cmd->tlv_header,
  319. WMITLV_TAG_STRUC_wmi_twt_btwt_invite_sta_cmd_fixed_param,
  320. WMITLV_GET_STRUCT_TLVLEN
  321. (wmi_twt_btwt_invite_sta_cmd_fixed_param));
  322. cmd->vdev_id = params->vdev_id;
  323. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  324. cmd->dialog_id = params->dialog_id;
  325. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  326. WMI_TWT_BTWT_INVITE_STA_CMDID);
  327. if (QDF_IS_STATUS_ERROR(status)) {
  328. wmi_buf_free(buf);
  329. }
  330. return status;
  331. }
  332. static QDF_STATUS
  333. send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,
  334. struct wmi_twt_btwt_remove_sta_cmd_param
  335. *params)
  336. {
  337. wmi_twt_btwt_remove_sta_cmd_fixed_param *cmd;
  338. wmi_buf_t buf;
  339. QDF_STATUS status;
  340. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  341. if (!buf) {
  342. wmi_err("Failed to allocate memory");
  343. return QDF_STATUS_E_FAILURE;
  344. }
  345. cmd = (wmi_twt_btwt_remove_sta_cmd_fixed_param *)wmi_buf_data(buf);
  346. WMITLV_SET_HDR(&cmd->tlv_header,
  347. WMITLV_TAG_STRUC_wmi_twt_btwt_remove_sta_cmd_fixed_param,
  348. WMITLV_GET_STRUCT_TLVLEN
  349. (wmi_twt_btwt_remove_sta_cmd_fixed_param));
  350. cmd->vdev_id = params->vdev_id;
  351. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  352. cmd->dialog_id = params->dialog_id;
  353. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  354. WMI_TWT_BTWT_REMOVE_STA_CMDID);
  355. if (QDF_IS_STATUS_ERROR(status)) {
  356. wmi_buf_free(buf);
  357. }
  358. return status;
  359. }
  360. #endif
  361. static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
  362. uint8_t *evt_buf,
  363. struct wmi_twt_enable_complete_event_param *params)
  364. {
  365. WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  366. wmi_twt_enable_complete_event_fixed_param *ev;
  367. param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  368. if (!param_buf) {
  369. wmi_err("evt_buf is NULL");
  370. return QDF_STATUS_E_INVAL;
  371. }
  372. ev = param_buf->fixed_param;
  373. params->pdev_id =
  374. wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
  375. ev->pdev_id);
  376. params->status = ev->status;
  377. return QDF_STATUS_SUCCESS;
  378. }
  379. static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
  380. uint8_t *evt_buf,
  381. struct wmi_twt_disable_complete_event *params)
  382. {
  383. WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  384. wmi_twt_disable_complete_event_fixed_param *ev;
  385. param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  386. if (!param_buf) {
  387. wmi_err("evt_buf is NULL");
  388. return QDF_STATUS_E_INVAL;
  389. }
  390. ev = param_buf->fixed_param;
  391. #if 0
  392. params->pdev_id =
  393. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  394. params->status = ev->status;
  395. #endif
  396. return QDF_STATUS_SUCCESS;
  397. }
  398. static enum WMI_HOST_ADD_TWT_STATUS
  399. wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)
  400. {
  401. switch (tgt_status) {
  402. case WMI_ADD_TWT_STATUS_OK:
  403. return WMI_HOST_ADD_TWT_STATUS_OK;
  404. case WMI_ADD_TWT_STATUS_TWT_NOT_ENABLED:
  405. return WMI_HOST_ADD_TWT_STATUS_TWT_NOT_ENABLED;
  406. case WMI_ADD_TWT_STATUS_USED_DIALOG_ID:
  407. return WMI_HOST_ADD_TWT_STATUS_USED_DIALOG_ID;
  408. case WMI_ADD_TWT_STATUS_INVALID_PARAM:
  409. return WMI_HOST_ADD_TWT_STATUS_INVALID_PARAM;
  410. case WMI_ADD_TWT_STATUS_NOT_READY:
  411. return WMI_HOST_ADD_TWT_STATUS_NOT_READY;
  412. case WMI_ADD_TWT_STATUS_NO_RESOURCE:
  413. return WMI_HOST_ADD_TWT_STATUS_NO_RESOURCE;
  414. case WMI_ADD_TWT_STATUS_NO_ACK:
  415. return WMI_HOST_ADD_TWT_STATUS_NO_ACK;
  416. case WMI_ADD_TWT_STATUS_NO_RESPONSE:
  417. return WMI_HOST_ADD_TWT_STATUS_NO_RESPONSE;
  418. case WMI_ADD_TWT_STATUS_DENIED:
  419. return WMI_HOST_ADD_TWT_STATUS_DENIED;
  420. case WMI_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE:
  421. return WMI_HOST_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE;
  422. case WMI_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED:
  423. return WMI_HOST_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED;
  424. case WMI_ADD_TWT_STATUS_ROAM_IN_PROGRESS:
  425. return WMI_HOST_ADD_TWT_STATUS_ROAM_IN_PROGRESS;
  426. case WMI_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  427. return WMI_HOST_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  428. case WMI_ADD_TWT_STATUS_SCAN_IN_PROGRESS:
  429. return WMI_HOST_ADD_TWT_STATUS_SCAN_IN_PROGRESS;
  430. default:
  431. return WMI_HOST_ADD_TWT_STATUS_UNKNOWN_ERROR;
  432. }
  433. }
  434. /**
  435. * extract_twt_add_dialog_comp_event_tlv - Extacts twt add dialog complete wmi
  436. * event from firmware
  437. * @wmi_hande: WMI handle
  438. * @evt_buf: Pointer to wmi event buf of twt add dialog complete event
  439. * @params: Pointer to store the extracted parameters
  440. *
  441. * Return: QDF_STATUS_SUCCESS on success or QDF STATUS error values on failure
  442. */
  443. static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
  444. wmi_unified_t wmi_handle,
  445. uint8_t *evt_buf,
  446. struct wmi_twt_add_dialog_complete_event_param *params)
  447. {
  448. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  449. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  450. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  451. if (!param_buf) {
  452. wmi_err("evt_buf is NULL");
  453. return QDF_STATUS_E_INVAL;
  454. }
  455. ev = param_buf->fixed_param;
  456. params->vdev_id = ev->vdev_id;
  457. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  458. params->status = wmi_get_converted_twt_add_dialog_status(ev->status);
  459. params->dialog_id = ev->dialog_id;
  460. params->num_additional_twt_params = param_buf->num_twt_params;
  461. return QDF_STATUS_SUCCESS;
  462. }
  463. /**
  464. * extract_twt_add_dialog_comp_additional_parameters() - Extracts additional twt
  465. * twt parameters, as part of add dialog completion event
  466. * @wmi_hdl: wmi handle
  467. * @evt_buf: Pointer event buffer
  468. * @evt_buf_len: length of the add dialog event buffer
  469. * @idx: index of num_twt_params
  470. * @additional_params: twt additional parameters to extract
  471. *
  472. * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_INVAL for failure
  473. */
  474. static QDF_STATUS extract_twt_add_dialog_comp_additional_parameters
  475. (
  476. wmi_unified_t wmi_handle, uint8_t *evt_buf,
  477. uint32_t evt_buf_len, uint32_t idx,
  478. struct wmi_twt_add_dialog_additional_params *additional_params
  479. )
  480. {
  481. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  482. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  483. uint32_t flags = 0;
  484. uint32_t expected_len;
  485. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  486. if (!param_buf) {
  487. wmi_err("evt_buf is NULL");
  488. return QDF_STATUS_E_INVAL;
  489. }
  490. ev = param_buf->fixed_param;
  491. if (idx >= param_buf->num_twt_params) {
  492. wmi_err("Invalid idx %d while num_twt_params = %d",
  493. idx, param_buf->num_twt_params);
  494. return QDF_STATUS_E_INVAL;
  495. }
  496. if (!param_buf->twt_params) {
  497. wmi_err("Unable to extract additional twt parameters");
  498. return QDF_STATUS_E_INVAL;
  499. }
  500. expected_len = (sizeof(wmi_twt_add_dialog_complete_event_fixed_param) +
  501. WMI_TLV_HDR_SIZE + (param_buf->num_twt_params *
  502. sizeof(wmi_twt_add_dialog_additional_params)));
  503. if (evt_buf_len != expected_len) {
  504. wmi_err("Got invalid len data from FW %d expected %d",
  505. evt_buf_len, expected_len);
  506. return QDF_STATUS_E_INVAL;
  507. }
  508. flags = param_buf->twt_params[idx].flags;
  509. additional_params->twt_cmd = TWT_FLAGS_GET_CMD(flags);
  510. additional_params->bcast = TWT_FLAGS_GET_BROADCAST(flags);
  511. additional_params->trig_en = TWT_FLAGS_GET_TRIGGER(flags);
  512. additional_params->announce = TWT_FLAGS_GET_FLOW_TYPE(flags);
  513. additional_params->protection = TWT_FLAGS_GET_PROTECTION(flags);
  514. additional_params->b_twt_id0 = TWT_FLAGS_GET_BTWT_ID0(flags);
  515. additional_params->info_frame_disabled =
  516. TWT_FLAGS_GET_TWT_INFO_FRAME_DISABLED(flags);
  517. additional_params->wake_dur_us = param_buf->twt_params[idx].wake_dur_us;
  518. additional_params->wake_intvl_us =
  519. param_buf->twt_params[idx].wake_intvl_us;
  520. additional_params->sp_offset_us =
  521. param_buf->twt_params[idx].sp_offset_us;
  522. additional_params->sp_tsf_us_lo =
  523. param_buf->twt_params[idx].sp_tsf_us_lo;
  524. additional_params->sp_tsf_us_hi =
  525. param_buf->twt_params[idx].sp_tsf_us_hi;
  526. return QDF_STATUS_SUCCESS;
  527. }
  528. static enum WMI_HOST_DEL_TWT_STATUS
  529. wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)
  530. {
  531. switch (tgt_status) {
  532. case WMI_DEL_TWT_STATUS_OK:
  533. return WMI_HOST_DEL_TWT_STATUS_OK;
  534. case WMI_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  535. return WMI_HOST_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  536. case WMI_DEL_TWT_STATUS_INVALID_PARAM:
  537. return WMI_HOST_DEL_TWT_STATUS_INVALID_PARAM;
  538. case WMI_DEL_TWT_STATUS_DIALOG_ID_BUSY:
  539. return WMI_HOST_DEL_TWT_STATUS_DIALOG_ID_BUSY;
  540. case WMI_DEL_TWT_STATUS_NO_RESOURCE:
  541. return WMI_HOST_DEL_TWT_STATUS_NO_RESOURCE;
  542. case WMI_DEL_TWT_STATUS_NO_ACK:
  543. return WMI_HOST_DEL_TWT_STATUS_NO_ACK;
  544. case WMI_DEL_TWT_STATUS_UNKNOWN_ERROR:
  545. return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
  546. case WMI_DEL_TWT_STATUS_PEER_INIT_TEARDOWN:
  547. return WMI_HOST_DEL_TWT_STATUS_PEER_INIT_TEARDOWN;
  548. case WMI_DEL_TWT_STATUS_ROAMING:
  549. return WMI_HOST_DEL_TWT_STATUS_ROAMING;
  550. case WMI_DEL_TWT_STATUS_CONCURRENCY:
  551. return WMI_HOST_DEL_TWT_STATUS_CONCURRENCY;
  552. case WMI_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  553. return WMI_HOST_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  554. case WMI_DEL_TWT_STATUS_SCAN_IN_PROGRESS:
  555. return WMI_HOST_DEL_TWT_STATUS_SCAN_IN_PROGRESS;
  556. default:
  557. return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
  558. }
  559. return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
  560. }
  561. static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
  562. wmi_unified_t wmi_handle,
  563. uint8_t *evt_buf,
  564. struct wmi_twt_del_dialog_complete_event_param *params)
  565. {
  566. WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  567. wmi_twt_del_dialog_complete_event_fixed_param *ev;
  568. param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  569. if (!param_buf) {
  570. wmi_err("evt_buf is NULL");
  571. return QDF_STATUS_E_INVAL;
  572. }
  573. ev = param_buf->fixed_param;
  574. params->vdev_id = ev->vdev_id;
  575. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  576. params->dialog_id = ev->dialog_id;
  577. params->status = wmi_get_converted_twt_del_dialog_status(ev->status);
  578. return QDF_STATUS_SUCCESS;
  579. }
  580. static enum WMI_HOST_PAUSE_TWT_STATUS
  581. wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)
  582. {
  583. switch (status) {
  584. case WMI_PAUSE_TWT_STATUS_OK:
  585. return WMI_HOST_PAUSE_TWT_STATUS_OK;
  586. case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  587. return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  588. case WMI_PAUSE_TWT_STATUS_INVALID_PARAM:
  589. return WMI_HOST_PAUSE_TWT_STATUS_INVALID_PARAM;
  590. case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY:
  591. return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_BUSY;
  592. case WMI_PAUSE_TWT_STATUS_NO_RESOURCE:
  593. return WMI_HOST_PAUSE_TWT_STATUS_NO_RESOURCE;
  594. case WMI_PAUSE_TWT_STATUS_NO_ACK:
  595. return WMI_HOST_PAUSE_TWT_STATUS_NO_ACK;
  596. case WMI_PAUSE_TWT_STATUS_UNKNOWN_ERROR:
  597. return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
  598. case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED:
  599. return WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED;
  600. case WMI_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  601. return WMI_HOST_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  602. case WMI_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS:
  603. return WMI_HOST_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS;
  604. case WMI_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS:
  605. return WMI_HOST_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS;
  606. default:
  607. return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
  608. }
  609. }
  610. static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
  611. wmi_unified_t wmi_handle,
  612. uint8_t *evt_buf,
  613. struct wmi_twt_pause_dialog_complete_event_param *params)
  614. {
  615. WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  616. wmi_twt_pause_dialog_complete_event_fixed_param *ev;
  617. param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  618. if (!param_buf) {
  619. wmi_err("evt_buf is NULL");
  620. return QDF_STATUS_E_INVAL;
  621. }
  622. ev = param_buf->fixed_param;
  623. params->vdev_id = ev->vdev_id;
  624. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  625. params->status = wmi_twt_pause_status_to_host_twt_status(ev->status);
  626. params->dialog_id = ev->dialog_id;
  627. return QDF_STATUS_SUCCESS;
  628. }
  629. static enum WMI_HOST_NUDGE_TWT_STATUS
  630. wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)
  631. {
  632. switch (status) {
  633. case WMI_NUDGE_TWT_STATUS_OK:
  634. return WMI_HOST_NUDGE_TWT_STATUS_OK;
  635. case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  636. return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  637. case WMI_NUDGE_TWT_STATUS_INVALID_PARAM:
  638. return WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM;
  639. case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY:
  640. return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY;
  641. case WMI_NUDGE_TWT_STATUS_NO_RESOURCE:
  642. return WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE;
  643. case WMI_NUDGE_TWT_STATUS_NO_ACK:
  644. return WMI_HOST_NUDGE_TWT_STATUS_NO_ACK;
  645. case WMI_NUDGE_TWT_STATUS_UNKNOWN_ERROR:
  646. return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
  647. case WMI_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  648. return WMI_HOST_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  649. case WMI_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS:
  650. return WMI_HOST_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS;
  651. case WMI_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS:
  652. return WMI_HOST_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS;
  653. default:
  654. return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
  655. }
  656. }
  657. static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv(
  658. wmi_unified_t wmi_handle,
  659. uint8_t *evt_buf,
  660. struct wmi_twt_nudge_dialog_complete_event_param *params)
  661. {
  662. WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  663. wmi_twt_nudge_dialog_complete_event_fixed_param *ev;
  664. param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  665. if (!param_buf) {
  666. wmi_err("evt_buf is NULL");
  667. return QDF_STATUS_E_INVAL;
  668. }
  669. ev = param_buf->fixed_param;
  670. params->vdev_id = ev->vdev_id;
  671. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  672. params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status);
  673. params->dialog_id = ev->dialog_id;
  674. params->next_twt_tsf_us_lo = ev->sp_tsf_us_lo;
  675. params->next_twt_tsf_us_hi = ev->sp_tsf_us_hi;
  676. wmi_debug("vdev_id: %d dialog_id: %d tsf hi : %x tsf lo: %x",
  677. params->vdev_id, params->dialog_id,
  678. params->next_twt_tsf_us_hi, params->next_twt_tsf_us_lo);
  679. return QDF_STATUS_SUCCESS;
  680. }
  681. static enum WMI_HOST_RESUME_TWT_STATUS
  682. wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)
  683. {
  684. switch (tgt_status) {
  685. case WMI_RESUME_TWT_STATUS_OK:
  686. return WMI_HOST_RESUME_TWT_STATUS_OK;
  687. case WMI_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST:
  688. return WMI_HOST_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST;
  689. case WMI_RESUME_TWT_STATUS_INVALID_PARAM:
  690. return WMI_HOST_RESUME_TWT_STATUS_INVALID_PARAM;
  691. case WMI_RESUME_TWT_STATUS_DIALOG_ID_BUSY:
  692. return WMI_HOST_RESUME_TWT_STATUS_DIALOG_ID_BUSY;
  693. case WMI_RESUME_TWT_STATUS_NOT_PAUSED:
  694. return WMI_HOST_RESUME_TWT_STATUS_NOT_PAUSED;
  695. case WMI_RESUME_TWT_STATUS_NO_RESOURCE:
  696. return WMI_HOST_RESUME_TWT_STATUS_NO_RESOURCE;
  697. case WMI_RESUME_TWT_STATUS_NO_ACK:
  698. return WMI_HOST_RESUME_TWT_STATUS_NO_ACK;
  699. case WMI_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS:
  700. return WMI_HOST_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS;
  701. case WMI_RESUME_TWT_STATUS_ROAM_IN_PROGRESS:
  702. return WMI_HOST_RESUME_TWT_STATUS_ROAM_IN_PROGRESS;
  703. case WMI_RESUME_TWT_STATUS_SCAN_IN_PROGRESS:
  704. return WMI_HOST_RESUME_TWT_STATUS_SCAN_IN_PROGRESS;
  705. default:
  706. return WMI_HOST_RESUME_TWT_STATUS_UNKNOWN_ERROR;
  707. }
  708. }
  709. static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
  710. wmi_unified_t wmi_handle,
  711. uint8_t *evt_buf,
  712. struct wmi_twt_resume_dialog_complete_event_param *params)
  713. {
  714. WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  715. wmi_twt_resume_dialog_complete_event_fixed_param *ev;
  716. param_buf =
  717. (WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  718. if (!param_buf) {
  719. wmi_err("evt_buf is NULL");
  720. return QDF_STATUS_E_INVAL;
  721. }
  722. ev = param_buf->fixed_param;
  723. params->vdev_id = ev->vdev_id;
  724. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  725. params->status = wmi_get_converted_twt_resume_dialog_status(ev->status);
  726. params->dialog_id = ev->dialog_id;
  727. return QDF_STATUS_SUCCESS;
  728. }
  729. static QDF_STATUS extract_twt_notify_event_tlv(
  730. wmi_unified_t wmi_handle,
  731. uint8_t *evt_buf,
  732. struct wmi_twt_notify_event_param *params)
  733. {
  734. WMI_TWT_NOTIFY_EVENTID_param_tlvs *param_buf;
  735. wmi_twt_notify_event_fixed_param *ev;
  736. param_buf =
  737. (WMI_TWT_NOTIFY_EVENTID_param_tlvs *)evt_buf;
  738. if (!param_buf) {
  739. wmi_err("evt_buf is NULL");
  740. return QDF_STATUS_E_INVAL;
  741. }
  742. ev = param_buf->fixed_param;
  743. params->vdev_id = ev->vdev_id;
  744. return QDF_STATUS_SUCCESS;
  745. }
  746. #ifdef WLAN_SUPPORT_BCAST_TWT
  747. static QDF_STATUS
  748. extract_twt_btwt_invite_sta_comp_event_tlv(
  749. wmi_unified_t wmi_handle,
  750. uint8_t *evt_buf,
  751. struct
  752. wmi_twt_btwt_invite_sta_complete_event_param
  753. *params)
  754. {
  755. WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
  756. wmi_twt_btwt_invite_sta_complete_event_fixed_param *ev;
  757. param_buf =
  758. (WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  759. if (!param_buf) {
  760. wmi_err("evt_buf is NULL");
  761. return QDF_STATUS_E_INVAL;
  762. }
  763. ev = param_buf->fixed_param;
  764. params->vdev_id = ev->vdev_id;
  765. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  766. params->status = ev->status;
  767. params->dialog_id = ev->dialog_id;
  768. return QDF_STATUS_SUCCESS;
  769. }
  770. static QDF_STATUS
  771. extract_twt_btwt_remove_sta_comp_event_tlv(
  772. wmi_unified_t wmi_handle,
  773. uint8_t *evt_buf,
  774. struct
  775. wmi_twt_btwt_remove_sta_complete_event_param
  776. *params)
  777. {
  778. WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
  779. wmi_twt_btwt_remove_sta_complete_event_fixed_param *ev;
  780. param_buf =
  781. (WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  782. if (!param_buf) {
  783. wmi_err("evt_buf is NULL");
  784. return QDF_STATUS_E_INVAL;
  785. }
  786. ev = param_buf->fixed_param;
  787. params->vdev_id = ev->vdev_id;
  788. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  789. params->status = ev->status;
  790. params->dialog_id = ev->dialog_id;
  791. return QDF_STATUS_SUCCESS;
  792. }
  793. #endif
  794. #ifdef WLAN_SUPPORT_BCAST_TWT
  795. static void
  796. wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
  797. {
  798. ops->send_twt_btwt_invite_sta_cmd = send_twt_btwt_invite_sta_cmd_tlv;
  799. ops->send_twt_btwt_remove_sta_cmd = send_twt_btwt_remove_sta_cmd_tlv;
  800. ops->extract_twt_btwt_invite_sta_comp_event =
  801. extract_twt_btwt_invite_sta_comp_event_tlv;
  802. ops->extract_twt_btwt_remove_sta_comp_event =
  803. extract_twt_btwt_remove_sta_comp_event_tlv;
  804. return;
  805. }
  806. #else
  807. static void
  808. wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
  809. {
  810. return;
  811. }
  812. #endif
  813. static QDF_STATUS
  814. extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,
  815. uint8_t *evt_buf,
  816. struct wmi_twt_session_stats_event_param
  817. *params)
  818. {
  819. WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
  820. wmi_pdev_twt_session_stats_event_fixed_param *ev;
  821. param_buf =
  822. (WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
  823. if (!param_buf) {
  824. wmi_err("evt_buf is NULL");
  825. return QDF_STATUS_E_INVAL;
  826. }
  827. ev = param_buf->fixed_param;
  828. params->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
  829. wmi_handle,
  830. ev->pdev_id);
  831. params->num_sessions = param_buf->num_twt_sessions;
  832. wmi_debug("pdev_id=%d, num of TWT sessions=%d",
  833. params->pdev_id, params->num_sessions);
  834. return QDF_STATUS_SUCCESS;
  835. }
  836. static QDF_STATUS
  837. extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,
  838. uint8_t *evt_buf,
  839. struct wmi_twt_session_stats_event_param
  840. *params,
  841. struct wmi_host_twt_session_stats_info
  842. *session,
  843. uint32_t idx)
  844. {
  845. WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
  846. wmi_twt_session_stats_info *twt_session;
  847. uint32_t flags;
  848. wmi_mac_addr *m1;
  849. uint8_t *m2;
  850. param_buf =
  851. (WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
  852. if (!param_buf) {
  853. wmi_err("evt_buf is NULL");
  854. return QDF_STATUS_E_INVAL;
  855. }
  856. if (idx >= param_buf->num_twt_sessions) {
  857. wmi_err("wrong idx, idx=%d, num_sessions=%d",
  858. idx, param_buf->num_twt_sessions);
  859. return QDF_STATUS_E_INVAL;
  860. }
  861. twt_session = &param_buf->twt_sessions[idx];
  862. session->vdev_id = twt_session->vdev_id;
  863. m1 = &twt_session->peer_mac;
  864. m2 = session->peer_mac;
  865. WMI_MAC_ADDR_TO_CHAR_ARRAY(m1, m2);
  866. session->event_type = twt_session->event_type;
  867. flags = twt_session->flow_id_flags;
  868. session->flow_id = WMI_TWT_SESSION_FLAG_FLOW_ID_GET(flags);
  869. session->bcast = WMI_TWT_SESSION_FLAG_BCAST_TWT_GET(flags);
  870. session->trig = WMI_TWT_SESSION_FLAG_TRIGGER_TWT_GET(flags);
  871. session->announ = WMI_TWT_SESSION_FLAG_ANNOUN_TWT_GET(flags);
  872. session->protection = WMI_TWT_SESSION_FLAG_TWT_PROTECTION_GET(flags);
  873. session->info_frame_disabled =
  874. WMI_TWT_SESSION_FLAG_TWT_INFO_FRAME_DISABLED_GET(flags);
  875. session->dialog_id = twt_session->dialog_id;
  876. session->wake_dura_us = twt_session->wake_dura_us;
  877. session->wake_intvl_us = twt_session->wake_intvl_us;
  878. session->sp_offset_us = twt_session->sp_offset_us;
  879. session->sp_tsf_us_lo = twt_session->sp_tsf_us_lo;
  880. session->sp_tsf_us_hi = twt_session->sp_tsf_us_hi;
  881. wmi_debug("type=%d id=%d bcast=%d trig=%d announ=%d diagid=%d wake_dur=%ul wake_int=%ul offset=%ul",
  882. session->event_type, session->flow_id,
  883. session->bcast, session->trig,
  884. session->announ, session->dialog_id, session->wake_dura_us,
  885. session->wake_intvl_us, session->sp_offset_us);
  886. return QDF_STATUS_SUCCESS;
  887. }
  888. static QDF_STATUS extract_twt_cap_service_ready_ext2_tlv(
  889. wmi_unified_t wmi_handle, uint8_t *event,
  890. struct wmi_twt_cap_bitmap_params *var)
  891. {
  892. WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *param_buf;
  893. wmi_twt_caps_params *twt_caps;
  894. param_buf = (WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *)event;
  895. if (!param_buf)
  896. return QDF_STATUS_E_INVAL;
  897. twt_caps = param_buf->twt_caps;
  898. if (!twt_caps)
  899. return QDF_STATUS_E_INVAL;
  900. var->twt_ack_support_cap = WMI_GET_BITS(twt_caps->twt_capability_bitmap,
  901. 0, 1);
  902. return QDF_STATUS_SUCCESS;
  903. }
  904. static enum WMI_HOST_TWT_CMD_FOR_ACK_EVENT
  905. wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)
  906. {
  907. switch (tgt_cmd) {
  908. case WMI_TWT_ADD_DIALOG_CMDID:
  909. return WMI_HOST_TWT_ADD_DIALOG_CMDID;
  910. case WMI_TWT_DEL_DIALOG_CMDID:
  911. return WMI_HOST_TWT_DEL_DIALOG_CMDID;
  912. case WMI_TWT_PAUSE_DIALOG_CMDID:
  913. return WMI_HOST_TWT_PAUSE_DIALOG_CMDID;
  914. case WMI_TWT_RESUME_DIALOG_CMDID:
  915. return WMI_HOST_TWT_RESUME_DIALOG_CMDID;
  916. case WMI_TWT_NUDGE_DIALOG_CMDID:
  917. return WMI_HOST_TWT_NUDGE_DIALOG_CMDID;
  918. default:
  919. return WMI_HOST_TWT_UNKNOWN_CMDID;
  920. }
  921. }
  922. static QDF_STATUS
  923. extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,
  924. uint8_t *evt_buf,
  925. struct wmi_twt_ack_complete_event_param *var)
  926. {
  927. WMI_TWT_ACK_EVENTID_param_tlvs *param_buf;
  928. wmi_twt_ack_event_fixed_param *ack_event;
  929. param_buf = (WMI_TWT_ACK_EVENTID_param_tlvs *)evt_buf;
  930. if (!param_buf) {
  931. wmi_err("evt_buf is NULL");
  932. return QDF_STATUS_E_INVAL;
  933. }
  934. ack_event = param_buf->fixed_param;
  935. var->vdev_id = ack_event->vdev_id;
  936. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ack_event->peer_macaddr,
  937. var->peer_macaddr.bytes);
  938. var->dialog_id = ack_event->dialog_id;
  939. var->twt_cmd_ack = wmi_get_converted_twt_command_for_ack_event(
  940. ack_event->twt_cmd);
  941. switch (ack_event->twt_cmd) {
  942. case WMI_TWT_ADD_DIALOG_CMDID:
  943. var->status = wmi_get_converted_twt_add_dialog_status(
  944. ack_event->status);
  945. break;
  946. case WMI_TWT_DEL_DIALOG_CMDID:
  947. var->status = wmi_get_converted_twt_del_dialog_status(
  948. ack_event->status);
  949. break;
  950. case WMI_TWT_PAUSE_DIALOG_CMDID:
  951. var->status = wmi_twt_pause_status_to_host_twt_status(
  952. ack_event->status);
  953. break;
  954. case WMI_TWT_RESUME_DIALOG_CMDID:
  955. var->status = wmi_get_converted_twt_resume_dialog_status(
  956. ack_event->status);
  957. break;
  958. case WMI_TWT_NUDGE_DIALOG_CMDID:
  959. var->status = wmi_twt_nudge_status_to_host_twt_status(
  960. ack_event->status);
  961. break;
  962. default:
  963. break;
  964. }
  965. return QDF_STATUS_SUCCESS;
  966. }
  967. void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
  968. {
  969. struct wmi_ops *ops = wmi_handle->ops;
  970. ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
  971. ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
  972. ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
  973. ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
  974. ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
  975. ops->send_twt_nudge_dialog_cmd = send_twt_nudge_dialog_cmd_tlv;
  976. ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
  977. ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
  978. ops->extract_twt_disable_comp_event =
  979. extract_twt_disable_comp_event_tlv;
  980. ops->extract_twt_add_dialog_comp_event =
  981. extract_twt_add_dialog_comp_event_tlv;
  982. ops->extract_twt_add_dialog_comp_additional_params =
  983. extract_twt_add_dialog_comp_additional_parameters;
  984. ops->extract_twt_del_dialog_comp_event =
  985. extract_twt_del_dialog_comp_event_tlv;
  986. ops->extract_twt_pause_dialog_comp_event =
  987. extract_twt_pause_dialog_comp_event_tlv;
  988. ops->extract_twt_nudge_dialog_comp_event =
  989. extract_twt_nudge_dialog_comp_event_tlv;
  990. ops->extract_twt_resume_dialog_comp_event =
  991. extract_twt_resume_dialog_comp_event_tlv;
  992. ops->extract_twt_session_stats_event =
  993. extract_twt_session_stats_event_tlv;
  994. ops->extract_twt_session_stats_data =
  995. extract_twt_session_stats_event_data;
  996. ops->extract_twt_notify_event =
  997. extract_twt_notify_event_tlv;
  998. ops->extract_twt_cap_service_ready_ext2 =
  999. extract_twt_cap_service_ready_ext2_tlv,
  1000. ops->extract_twt_ack_comp_event = extract_twt_ack_comp_event_tlv;
  1001. wmi_twt_attach_bcast_twt_tlv(ops);
  1002. }