wmi_unified_twt_tlv.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  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. cmd->dialog_id = params->dialog_id;
  148. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  149. WMI_TWT_DEL_DIALOG_CMDID);
  150. if (QDF_IS_STATUS_ERROR(status)) {
  151. WMI_LOGE("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
  152. wmi_buf_free(buf);
  153. }
  154. return status;
  155. }
  156. static QDF_STATUS send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  157. struct wmi_twt_pause_dialog_cmd_param *params)
  158. {
  159. wmi_twt_pause_dialog_cmd_fixed_param *cmd;
  160. wmi_buf_t buf;
  161. QDF_STATUS status;
  162. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  163. if (!buf) {
  164. WMI_LOGE("Failed to allocate memory");
  165. return QDF_STATUS_E_FAILURE;
  166. }
  167. cmd = (wmi_twt_pause_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  168. WMITLV_SET_HDR(&cmd->tlv_header,
  169. WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
  170. WMITLV_GET_STRUCT_TLVLEN
  171. (wmi_twt_pause_dialog_cmd_fixed_param));
  172. cmd->vdev_id = params->vdev_id;
  173. cmd->dialog_id = params->dialog_id;
  174. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  175. WMI_TWT_PAUSE_DIALOG_CMDID);
  176. if (QDF_IS_STATUS_ERROR(status)) {
  177. WMI_LOGE("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
  178. wmi_buf_free(buf);
  179. }
  180. return status;
  181. }
  182. static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
  183. struct wmi_twt_resume_dialog_cmd_param *params)
  184. {
  185. wmi_twt_resume_dialog_cmd_fixed_param *cmd;
  186. wmi_buf_t buf;
  187. QDF_STATUS status;
  188. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  189. if (!buf) {
  190. WMI_LOGE("Failed to allocate memory");
  191. return QDF_STATUS_E_FAILURE;
  192. }
  193. cmd = (wmi_twt_resume_dialog_cmd_fixed_param *) wmi_buf_data(buf);
  194. WMITLV_SET_HDR(&cmd->tlv_header,
  195. WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
  196. WMITLV_GET_STRUCT_TLVLEN
  197. (wmi_twt_resume_dialog_cmd_fixed_param));
  198. cmd->vdev_id = params->vdev_id;
  199. cmd->dialog_id = params->dialog_id;
  200. cmd->sp_offset_us = params->sp_offset_us;
  201. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  202. WMI_TWT_RESUME_DIALOG_CMDID);
  203. if (QDF_IS_STATUS_ERROR(status)) {
  204. WMI_LOGE("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
  205. wmi_buf_free(buf);
  206. }
  207. return status;
  208. }
  209. static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
  210. uint8_t *evt_buf,
  211. struct wmi_twt_enable_complete_event_param *params)
  212. {
  213. WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  214. wmi_twt_enable_complete_event_fixed_param *ev;
  215. param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  216. if (!param_buf) {
  217. WMI_LOGE("evt_buf is NULL");
  218. return QDF_STATUS_E_INVAL;
  219. }
  220. ev = param_buf->fixed_param;
  221. params->pdev_id =
  222. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  223. params->status = ev->status;
  224. return QDF_STATUS_SUCCESS;
  225. }
  226. static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
  227. uint8_t *evt_buf,
  228. struct wmi_twt_disable_complete_event *params)
  229. {
  230. WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  231. wmi_twt_disable_complete_event_fixed_param *ev;
  232. param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  233. if (!param_buf) {
  234. WMI_LOGE("evt_buf is NULL");
  235. return QDF_STATUS_E_INVAL;
  236. }
  237. ev = param_buf->fixed_param;
  238. #if 0
  239. params->pdev_id =
  240. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  241. params->status = ev->status;
  242. #endif
  243. return QDF_STATUS_SUCCESS;
  244. }
  245. static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
  246. wmi_unified_t wmi_handle,
  247. uint8_t *evt_buf,
  248. struct wmi_twt_add_dialog_complete_event_param *params)
  249. {
  250. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  251. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  252. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  253. if (!param_buf) {
  254. WMI_LOGE("evt_buf is NULL");
  255. return QDF_STATUS_E_INVAL;
  256. }
  257. ev = param_buf->fixed_param;
  258. params->vdev_id = ev->vdev_id;
  259. params->status = ev->status;
  260. params->dialog_id = ev->dialog_id;
  261. return QDF_STATUS_SUCCESS;
  262. }
  263. static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
  264. wmi_unified_t wmi_handle,
  265. uint8_t *evt_buf,
  266. struct wmi_twt_del_dialog_complete_event_param *params)
  267. {
  268. WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  269. wmi_twt_del_dialog_complete_event_fixed_param *ev;
  270. param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  271. if (!param_buf) {
  272. WMI_LOGE("evt_buf is NULL");
  273. return QDF_STATUS_E_INVAL;
  274. }
  275. ev = param_buf->fixed_param;
  276. params->vdev_id = ev->vdev_id;
  277. params->dialog_id = ev->dialog_id;
  278. return QDF_STATUS_SUCCESS;
  279. }
  280. static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
  281. wmi_unified_t wmi_handle,
  282. uint8_t *evt_buf,
  283. struct wmi_twt_pause_dialog_complete_event_param *params)
  284. {
  285. WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  286. wmi_twt_pause_dialog_complete_event_fixed_param *ev;
  287. param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  288. if (!param_buf) {
  289. WMI_LOGE("evt_buf is NULL");
  290. return QDF_STATUS_E_INVAL;
  291. }
  292. ev = param_buf->fixed_param;
  293. params->vdev_id = ev->vdev_id;
  294. params->status = ev->status;
  295. params->dialog_id = ev->dialog_id;
  296. return QDF_STATUS_SUCCESS;
  297. }
  298. static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
  299. wmi_unified_t wmi_handle,
  300. uint8_t *evt_buf,
  301. struct wmi_twt_resume_dialog_complete_event_param *params)
  302. {
  303. WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  304. wmi_twt_resume_dialog_complete_event_fixed_param *ev;
  305. param_buf =
  306. (WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  307. if (!param_buf) {
  308. WMI_LOGE("evt_buf is NULL");
  309. return QDF_STATUS_E_INVAL;
  310. }
  311. ev = param_buf->fixed_param;
  312. params->vdev_id = ev->vdev_id;
  313. params->status = ev->status;
  314. params->dialog_id = ev->dialog_id;
  315. return QDF_STATUS_SUCCESS;
  316. }
  317. void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
  318. {
  319. struct wmi_ops *ops = wmi_handle->ops;
  320. ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
  321. ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
  322. ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
  323. ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
  324. ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
  325. ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
  326. ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
  327. ops->extract_twt_disable_comp_event =
  328. extract_twt_disable_comp_event_tlv;
  329. ops->extract_twt_add_dialog_comp_event =
  330. extract_twt_add_dialog_comp_event_tlv;
  331. ops->extract_twt_del_dialog_comp_event =
  332. extract_twt_del_dialog_comp_event_tlv;
  333. ops->extract_twt_pause_dialog_comp_event =
  334. extract_twt_pause_dialog_comp_event_tlv;
  335. ops->extract_twt_resume_dialog_comp_event =
  336. extract_twt_resume_dialog_comp_event_tlv;
  337. }