wmi_unified_twt_tlv.c 12 KB

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