wmi_unified_twt_tlv.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  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. cmd->next_twt_size = params->next_twt_size;
  205. status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
  206. WMI_TWT_RESUME_DIALOG_CMDID);
  207. if (QDF_IS_STATUS_ERROR(status)) {
  208. WMI_LOGE("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
  209. wmi_buf_free(buf);
  210. }
  211. return status;
  212. }
  213. static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
  214. uint8_t *evt_buf,
  215. struct wmi_twt_enable_complete_event_param *params)
  216. {
  217. WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  218. wmi_twt_enable_complete_event_fixed_param *ev;
  219. param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  220. if (!param_buf) {
  221. WMI_LOGE("evt_buf is NULL");
  222. return QDF_STATUS_E_INVAL;
  223. }
  224. ev = param_buf->fixed_param;
  225. params->pdev_id =
  226. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  227. params->status = ev->status;
  228. return QDF_STATUS_SUCCESS;
  229. }
  230. static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
  231. uint8_t *evt_buf,
  232. struct wmi_twt_disable_complete_event *params)
  233. {
  234. WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
  235. wmi_twt_disable_complete_event_fixed_param *ev;
  236. param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  237. if (!param_buf) {
  238. WMI_LOGE("evt_buf is NULL");
  239. return QDF_STATUS_E_INVAL;
  240. }
  241. ev = param_buf->fixed_param;
  242. #if 0
  243. params->pdev_id =
  244. wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
  245. params->status = ev->status;
  246. #endif
  247. return QDF_STATUS_SUCCESS;
  248. }
  249. static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
  250. wmi_unified_t wmi_handle,
  251. uint8_t *evt_buf,
  252. struct wmi_twt_add_dialog_complete_event_param *params)
  253. {
  254. WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  255. wmi_twt_add_dialog_complete_event_fixed_param *ev;
  256. param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  257. if (!param_buf) {
  258. WMI_LOGE("evt_buf is NULL");
  259. return QDF_STATUS_E_INVAL;
  260. }
  261. ev = param_buf->fixed_param;
  262. params->vdev_id = ev->vdev_id;
  263. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  264. params->status = ev->status;
  265. params->dialog_id = ev->dialog_id;
  266. return QDF_STATUS_SUCCESS;
  267. }
  268. static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
  269. wmi_unified_t wmi_handle,
  270. uint8_t *evt_buf,
  271. struct wmi_twt_del_dialog_complete_event_param *params)
  272. {
  273. WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  274. wmi_twt_del_dialog_complete_event_fixed_param *ev;
  275. param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  276. if (!param_buf) {
  277. WMI_LOGE("evt_buf is NULL");
  278. return QDF_STATUS_E_INVAL;
  279. }
  280. ev = param_buf->fixed_param;
  281. params->vdev_id = ev->vdev_id;
  282. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  283. params->dialog_id = ev->dialog_id;
  284. return QDF_STATUS_SUCCESS;
  285. }
  286. static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
  287. wmi_unified_t wmi_handle,
  288. uint8_t *evt_buf,
  289. struct wmi_twt_pause_dialog_complete_event_param *params)
  290. {
  291. WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  292. wmi_twt_pause_dialog_complete_event_fixed_param *ev;
  293. param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  294. if (!param_buf) {
  295. WMI_LOGE("evt_buf is NULL");
  296. return QDF_STATUS_E_INVAL;
  297. }
  298. ev = param_buf->fixed_param;
  299. params->vdev_id = ev->vdev_id;
  300. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  301. params->status = ev->status;
  302. params->dialog_id = ev->dialog_id;
  303. return QDF_STATUS_SUCCESS;
  304. }
  305. static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
  306. wmi_unified_t wmi_handle,
  307. uint8_t *evt_buf,
  308. struct wmi_twt_resume_dialog_complete_event_param *params)
  309. {
  310. WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
  311. wmi_twt_resume_dialog_complete_event_fixed_param *ev;
  312. param_buf =
  313. (WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
  314. if (!param_buf) {
  315. WMI_LOGE("evt_buf is NULL");
  316. return QDF_STATUS_E_INVAL;
  317. }
  318. ev = param_buf->fixed_param;
  319. params->vdev_id = ev->vdev_id;
  320. WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
  321. params->status = ev->status;
  322. params->dialog_id = ev->dialog_id;
  323. return QDF_STATUS_SUCCESS;
  324. }
  325. void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
  326. {
  327. struct wmi_ops *ops = wmi_handle->ops;
  328. ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
  329. ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
  330. ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
  331. ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
  332. ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
  333. ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
  334. ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
  335. ops->extract_twt_disable_comp_event =
  336. extract_twt_disable_comp_event_tlv;
  337. ops->extract_twt_add_dialog_comp_event =
  338. extract_twt_add_dialog_comp_event_tlv;
  339. ops->extract_twt_del_dialog_comp_event =
  340. extract_twt_del_dialog_comp_event_tlv;
  341. ops->extract_twt_pause_dialog_comp_event =
  342. extract_twt_pause_dialog_comp_event_tlv;
  343. ops->extract_twt_resume_dialog_comp_event =
  344. extract_twt_resume_dialog_comp_event_tlv;
  345. }