wmi_unified_twt_tlv.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /*
  2. * Copyright (c) 2018 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_LOGE("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. params->pdev_id);
  42. cmd->sta_cong_timer_ms = params->sta_cong_timer_ms;
  43. cmd->mbss_support = params->mbss_support;
  44. cmd->default_slot_size = params->default_slot_size;
  45. cmd->congestion_thresh_setup = params->congestion_thresh_setup;
  46. cmd->congestion_thresh_teardown = params->congestion_thresh_teardown;
  47. cmd->congestion_thresh_critical = params->congestion_thresh_critical;
  48. cmd->interference_thresh_teardown =
  49. params->interference_thresh_teardown;
  50. cmd->interference_thresh_setup = params->interference_thresh_setup;
  51. cmd->min_no_sta_setup = params->min_no_sta_setup;
  52. cmd->min_no_sta_teardown = params->min_no_sta_teardown;
  53. cmd->no_of_bcast_mcast_slots = params->no_of_bcast_mcast_slots;
  54. cmd->min_no_twt_slots = params->min_no_twt_slots;
  55. cmd->max_no_sta_twt = params->max_no_sta_twt;
  56. cmd->mode_check_interval = params->mode_check_interval;
  57. cmd->add_sta_slot_interval = params->add_sta_slot_interval;
  58. cmd->remove_sta_slot_interval = params->remove_sta_slot_interval;
  59. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  60. WMI_TWT_ENABLE_CMDID);
  61. if (QDF_IS_STATUS_ERROR(status)) {
  62. WMI_LOGE("Failed to send WMI_TWT_ENABLE_CMDID");
  63. wmi_buf_free(buf);
  64. }
  65. return status;
  66. }
  67. static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
  68. struct wmi_twt_disable_param *params)
  69. {
  70. wmi_twt_disable_cmd_fixed_param *cmd;
  71. wmi_buf_t buf;
  72. QDF_STATUS status;
  73. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  74. if (!buf) {
  75. WMI_LOGE("Failed to allocate memory");
  76. return QDF_STATUS_E_FAILURE;
  77. }
  78. cmd = (wmi_twt_disable_cmd_fixed_param *) wmi_buf_data(buf);
  79. WMITLV_SET_HDR(&cmd->tlv_header,
  80. WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
  81. WMITLV_GET_STRUCT_TLVLEN
  82. (wmi_twt_disable_cmd_fixed_param));
  83. cmd->pdev_id =
  84. wmi_handle->ops->convert_pdev_id_host_to_target(
  85. params->pdev_id);
  86. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  87. WMI_TWT_DISABLE_CMDID);
  88. if (QDF_IS_STATUS_ERROR(status)) {
  89. WMI_LOGE("Failed to send WMI_TWT_DISABLE_CMDID");
  90. wmi_buf_free(buf);
  91. }
  92. return status;
  93. }
  94. static QDF_STATUS send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  95. struct wmi_twt_add_dialog_param *params)
  96. {
  97. wmi_twt_add_dialog_cmd_fixed_param *cmd;
  98. wmi_buf_t buf;
  99. QDF_STATUS status;
  100. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  101. if (!buf) {
  102. WMI_LOGE("Failed to allocate memory");
  103. return QDF_STATUS_E_FAILURE;
  104. }
  105. cmd = (wmi_twt_add_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  106. WMITLV_SET_HDR(&cmd->tlv_header,
  107. WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
  108. WMITLV_GET_STRUCT_TLVLEN
  109. (wmi_twt_add_dialog_cmd_fixed_param));
  110. cmd->vdev_id = params->vdev_id;
  111. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  112. cmd->dialog_id = params->dialog_id;
  113. cmd->wake_intvl_us = params->wake_intvl_us;
  114. cmd->wake_intvl_mantis = params->wake_intvl_mantis;
  115. cmd->wake_dura_us = params->wake_dura_us;
  116. cmd->sp_offset_us = params->sp_offset_us;
  117. TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
  118. TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
  119. TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
  120. TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
  121. TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
  122. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  123. WMI_TWT_ADD_DIALOG_CMDID);
  124. if (QDF_IS_STATUS_ERROR(status)) {
  125. WMI_LOGE("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
  126. wmi_buf_free(buf);
  127. }
  128. return status;
  129. }
  130. static QDF_STATUS send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  131. struct wmi_twt_del_dialog_param *params)
  132. {
  133. wmi_twt_del_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_LOGE("Failed to allocate memory");
  139. return QDF_STATUS_E_FAILURE;
  140. }
  141. cmd = (wmi_twt_del_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  142. WMITLV_SET_HDR(&cmd->tlv_header,
  143. WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
  144. WMITLV_GET_STRUCT_TLVLEN
  145. (wmi_twt_del_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. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  150. WMI_TWT_DEL_DIALOG_CMDID);
  151. if (QDF_IS_STATUS_ERROR(status)) {
  152. WMI_LOGE("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
  153. wmi_buf_free(buf);
  154. }
  155. return status;
  156. }
  157. static QDF_STATUS send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  158. struct wmi_twt_pause_dialog_cmd_param *params)
  159. {
  160. wmi_twt_pause_dialog_cmd_fixed_param *cmd;
  161. wmi_buf_t buf;
  162. QDF_STATUS status;
  163. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  164. if (!buf) {
  165. WMI_LOGE("Failed to allocate memory");
  166. return QDF_STATUS_E_FAILURE;
  167. }
  168. cmd = (wmi_twt_pause_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  169. WMITLV_SET_HDR(&cmd->tlv_header,
  170. WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
  171. WMITLV_GET_STRUCT_TLVLEN
  172. (wmi_twt_pause_dialog_cmd_fixed_param));
  173. cmd->vdev_id = params->vdev_id;
  174. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  175. cmd->dialog_id = params->dialog_id;
  176. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  177. WMI_TWT_PAUSE_DIALOG_CMDID);
  178. if (QDF_IS_STATUS_ERROR(status)) {
  179. WMI_LOGE("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
  180. wmi_buf_free(buf);
  181. }
  182. return status;
  183. }
  184. static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  185. struct wmi_twt_resume_dialog_cmd_param *params)
  186. {
  187. wmi_twt_resume_dialog_cmd_fixed_param *cmd;
  188. wmi_buf_t buf;
  189. QDF_STATUS status;
  190. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  191. if (!buf) {
  192. WMI_LOGE("Failed to allocate memory");
  193. return QDF_STATUS_E_FAILURE;
  194. }
  195. cmd = (wmi_twt_resume_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  196. WMITLV_SET_HDR(&cmd->tlv_header,
  197. WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
  198. WMITLV_GET_STRUCT_TLVLEN
  199. (wmi_twt_resume_dialog_cmd_fixed_param));
  200. cmd->vdev_id = params->vdev_id;
  201. WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
  202. cmd->dialog_id = params->dialog_id;
  203. cmd->sp_offset_us = params->sp_offset_us;
  204. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  205. WMI_TWT_RESUME_DIALOG_CMDID);
  206. if (QDF_IS_STATUS_ERROR(status)) {
  207. WMI_LOGE("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
  208. wmi_buf_free(buf);
  209. }
  210. return status;
  211. }
  212. static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
  213. uint8_t *evt_buf,
  214. struct wmi_twt_enable_complete_event_param *params)
  215. {
  216. WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  217. wmi_twt_enable_complete_event_fixed_param *ev;
  218. param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  219. if (!param_buf) {
  220. WMI_LOGE("evt_buf is NULL");
  221. return QDF_STATUS_E_INVAL;
  222. }
  223. ev = param_buf->fixed_param;
  224. params->pdev_id =
  225. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  226. params->status = ev->status;
  227. return QDF_STATUS_SUCCESS;
  228. }
  229. static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
  230. uint8_t *evt_buf,
  231. struct wmi_twt_disable_complete_event *params)
  232. {
  233. WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  234. wmi_twt_disable_complete_event_fixed_param *ev;
  235. param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  236. if (!param_buf) {
  237. WMI_LOGE("evt_buf is NULL");
  238. return QDF_STATUS_E_INVAL;
  239. }
  240. ev = param_buf->fixed_param;
  241. #if 0
  242. params->pdev_id =
  243. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  244. params->status = ev->status;
  245. #endif
  246. return QDF_STATUS_SUCCESS;
  247. }
  248. static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
  249. wmi_unified_t wmi_handle,
  250. uint8_t *evt_buf,
  251. struct wmi_twt_add_dialog_complete_event_param *params)
  252. {
  253. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  254. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  255. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  256. if (!param_buf) {
  257. WMI_LOGE("evt_buf is NULL");
  258. return QDF_STATUS_E_INVAL;
  259. }
  260. ev = param_buf->fixed_param;
  261. params->vdev_id = ev->vdev_id;
  262. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  263. params->status = ev->status;
  264. params->dialog_id = ev->dialog_id;
  265. return QDF_STATUS_SUCCESS;
  266. }
  267. static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
  268. wmi_unified_t wmi_handle,
  269. uint8_t *evt_buf,
  270. struct wmi_twt_del_dialog_complete_event_param *params)
  271. {
  272. WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  273. wmi_twt_del_dialog_complete_event_fixed_param *ev;
  274. param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  275. if (!param_buf) {
  276. WMI_LOGE("evt_buf is NULL");
  277. return QDF_STATUS_E_INVAL;
  278. }
  279. ev = param_buf->fixed_param;
  280. params->vdev_id = ev->vdev_id;
  281. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  282. params->dialog_id = ev->dialog_id;
  283. return QDF_STATUS_SUCCESS;
  284. }
  285. static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
  286. wmi_unified_t wmi_handle,
  287. uint8_t *evt_buf,
  288. struct wmi_twt_pause_dialog_complete_event_param *params)
  289. {
  290. WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  291. wmi_twt_pause_dialog_complete_event_fixed_param *ev;
  292. param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  293. if (!param_buf) {
  294. WMI_LOGE("evt_buf is NULL");
  295. return QDF_STATUS_E_INVAL;
  296. }
  297. ev = param_buf->fixed_param;
  298. params->vdev_id = ev->vdev_id;
  299. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  300. params->status = ev->status;
  301. params->dialog_id = ev->dialog_id;
  302. return QDF_STATUS_SUCCESS;
  303. }
  304. static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
  305. wmi_unified_t wmi_handle,
  306. uint8_t *evt_buf,
  307. struct wmi_twt_resume_dialog_complete_event_param *params)
  308. {
  309. WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  310. wmi_twt_resume_dialog_complete_event_fixed_param *ev;
  311. param_buf =
  312. (WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  313. if (!param_buf) {
  314. WMI_LOGE("evt_buf is NULL");
  315. return QDF_STATUS_E_INVAL;
  316. }
  317. ev = param_buf->fixed_param;
  318. params->vdev_id = ev->vdev_id;
  319. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  320. params->status = ev->status;
  321. params->dialog_id = ev->dialog_id;
  322. return QDF_STATUS_SUCCESS;
  323. }
  324. void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
  325. {
  326. struct wmi_ops *ops = wmi_handle->ops;
  327. ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
  328. ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
  329. ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
  330. ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
  331. ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
  332. ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
  333. ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
  334. ops->extract_twt_disable_comp_event =
  335. extract_twt_disable_comp_event_tlv;
  336. ops->extract_twt_add_dialog_comp_event =
  337. extract_twt_add_dialog_comp_event_tlv;
  338. ops->extract_twt_del_dialog_comp_event =
  339. extract_twt_del_dialog_comp_event_tlv;
  340. ops->extract_twt_pause_dialog_comp_event =
  341. extract_twt_pause_dialog_comp_event_tlv;
  342. ops->extract_twt_resume_dialog_comp_event =
  343. extract_twt_resume_dialog_comp_event_tlv;
  344. }