wmi_unified_wds_tlv.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * Copyright (c) 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_wds_api.h>
  22. /**
  23. * send_peer_add_wds_entry_cmd_tlv() - send peer add command to fw
  24. * @wmi_handle: wmi handle
  25. * @param: pointer holding peer details
  26. *
  27. * Return: QDF_STATUS_SUCCESS for success or error code
  28. */
  29. static QDF_STATUS
  30. send_peer_add_wds_entry_cmd_tlv(wmi_unified_t wmi_handle,
  31. struct peer_add_wds_entry_params *param)
  32. {
  33. wmi_peer_add_wds_entry_cmd_fixed_param *cmd;
  34. wmi_buf_t buf;
  35. int len = sizeof(*cmd);
  36. QDF_STATUS ret;
  37. buf = wmi_buf_alloc(wmi_handle, len);
  38. if (!buf)
  39. return QDF_STATUS_E_NOMEM;
  40. cmd = (wmi_peer_add_wds_entry_cmd_fixed_param *)wmi_buf_data(buf);
  41. WMITLV_SET_HDR(&cmd->tlv_header,
  42. WMITLV_TAG_STRUC_wmi_peer_add_wds_entry_cmd_fixed_param,
  43. WMITLV_GET_STRUCT_TLVLEN
  44. (wmi_peer_add_wds_entry_cmd_fixed_param));
  45. WMI_CHAR_ARRAY_TO_MAC_ADDR(param->dest_addr, &cmd->wds_macaddr);
  46. WMI_CHAR_ARRAY_TO_MAC_ADDR(param->peer_addr, &cmd->peer_macaddr);
  47. cmd->flags = (param->flags & WMI_HOST_WDS_FLAG_STATIC) ?
  48. WMI_WDS_FLAG_STATIC : 0;
  49. cmd->vdev_id = param->vdev_id;
  50. wmi_mtrace(WMI_PEER_ADD_WDS_ENTRY_CMDID, cmd->vdev_id, 0);
  51. ret = wmi_unified_cmd_send(wmi_handle, buf, len,
  52. WMI_PEER_ADD_WDS_ENTRY_CMDID);
  53. if (QDF_IS_STATUS_ERROR(ret))
  54. wmi_buf_free(buf);
  55. return ret;
  56. }
  57. /**
  58. * send_peer_del_wds_entry_cmd_tlv() - send peer delete command to fw
  59. * @wmi_handle: wmi handle
  60. * @param: pointer holding peer details
  61. *
  62. * Return: QDF_STATUS_SUCCESS for success or error code
  63. */
  64. static QDF_STATUS
  65. send_peer_del_wds_entry_cmd_tlv(wmi_unified_t wmi_handle,
  66. struct peer_del_wds_entry_params *param)
  67. {
  68. wmi_peer_remove_wds_entry_cmd_fixed_param *cmd;
  69. wmi_buf_t buf;
  70. int len = sizeof(*cmd);
  71. QDF_STATUS ret;
  72. buf = wmi_buf_alloc(wmi_handle, len);
  73. if (!buf)
  74. return QDF_STATUS_E_NOMEM;
  75. cmd = (wmi_peer_remove_wds_entry_cmd_fixed_param *)wmi_buf_data(buf);
  76. WMITLV_SET_HDR(&cmd->tlv_header,
  77. WMITLV_TAG_STRUC_wmi_peer_remove_wds_entry_cmd_fixed_param,
  78. WMITLV_GET_STRUCT_TLVLEN
  79. (wmi_peer_remove_wds_entry_cmd_fixed_param));
  80. WMI_CHAR_ARRAY_TO_MAC_ADDR(param->dest_addr, &cmd->wds_macaddr);
  81. cmd->vdev_id = param->vdev_id;
  82. wmi_mtrace(WMI_PEER_REMOVE_WDS_ENTRY_CMDID, cmd->vdev_id, 0);
  83. ret = wmi_unified_cmd_send(wmi_handle, buf, len,
  84. WMI_PEER_REMOVE_WDS_ENTRY_CMDID);
  85. if (QDF_IS_STATUS_ERROR(ret))
  86. wmi_buf_free(buf);
  87. return ret;
  88. }
  89. /**
  90. * send_peer_update_wds_entry_cmd_tlv() - send peer update command to fw
  91. * @wmi_handle: wmi handle
  92. * @param: pointer holding peer details
  93. *
  94. * Return: QDF_STATUS_SUCCESS for success or error code
  95. */
  96. static QDF_STATUS
  97. send_peer_update_wds_entry_cmd_tlv(wmi_unified_t wmi_handle,
  98. struct peer_update_wds_entry_params *param)
  99. {
  100. wmi_peer_update_wds_entry_cmd_fixed_param *cmd;
  101. wmi_buf_t buf;
  102. int len = sizeof(*cmd);
  103. QDF_STATUS ret;
  104. buf = wmi_buf_alloc(wmi_handle, len);
  105. if (!buf)
  106. return QDF_STATUS_E_NOMEM;
  107. cmd = (wmi_peer_update_wds_entry_cmd_fixed_param *)wmi_buf_data(buf);
  108. WMITLV_SET_HDR(&cmd->tlv_header,
  109. WMITLV_TAG_STRUC_wmi_peer_update_wds_entry_cmd_fixed_param,
  110. WMITLV_GET_STRUCT_TLVLEN
  111. (wmi_peer_update_wds_entry_cmd_fixed_param));
  112. WMI_CHAR_ARRAY_TO_MAC_ADDR(param->dest_addr, &cmd->wds_macaddr);
  113. WMI_CHAR_ARRAY_TO_MAC_ADDR(param->peer_addr, &cmd->peer_macaddr);
  114. cmd->flags = (param->flags & WMI_HOST_WDS_FLAG_STATIC) ?
  115. WMI_WDS_FLAG_STATIC : 0;
  116. cmd->vdev_id = param->vdev_id;
  117. wmi_mtrace(WMI_PEER_UPDATE_WDS_ENTRY_CMDID, cmd->vdev_id, 0);
  118. ret = wmi_unified_cmd_send(wmi_handle, buf, len,
  119. WMI_PEER_UPDATE_WDS_ENTRY_CMDID);
  120. if (QDF_IS_STATUS_ERROR(ret))
  121. wmi_buf_free(buf);
  122. return ret;
  123. }
  124. void wmi_wds_attach_tlv(wmi_unified_t wmi_handle)
  125. {
  126. struct wmi_ops *ops = wmi_handle->ops;
  127. ops->send_peer_add_wds_entry_cmd = send_peer_add_wds_entry_cmd_tlv;
  128. ops->send_peer_del_wds_entry_cmd = send_peer_del_wds_entry_cmd_tlv;
  129. ops->send_peer_update_wds_entry_cmd =
  130. send_peer_update_wds_entry_cmd_tlv;
  131. }