wlan_pmo_tgt_wow.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (c) 2017-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. /**
  19. * DOC: Implements public API for pmo to interact with target/WMI
  20. */
  21. #include "wlan_pmo_tgt_api.h"
  22. #include "wlan_pmo_wow.h"
  23. #include "wlan_pmo_obj_mgmt_public_struct.h"
  24. #include "wlan_pmo_main.h"
  25. QDF_STATUS pmo_tgt_enable_wow_wakeup_event(
  26. struct wlan_objmgr_vdev *vdev,
  27. uint32_t *bitmap)
  28. {
  29. QDF_STATUS status;
  30. struct wlan_objmgr_psoc *psoc;
  31. struct wlan_pmo_tx_ops pmo_tx_ops;
  32. pmo_enter();
  33. psoc = pmo_vdev_get_psoc(vdev);
  34. pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
  35. if (!pmo_tx_ops.send_enable_wow_wakeup_event_req) {
  36. pmo_err("send_enable_wow_wakeup_event_req is null");
  37. status = QDF_STATUS_E_NULL_VALUE;
  38. goto out;
  39. }
  40. status = pmo_tx_ops.send_enable_wow_wakeup_event_req(vdev, bitmap);
  41. if (status != QDF_STATUS_SUCCESS)
  42. pmo_err("Failed to enable wow wakeup event");
  43. out:
  44. pmo_exit();
  45. return status;
  46. }
  47. QDF_STATUS pmo_tgt_disable_wow_wakeup_event(
  48. struct wlan_objmgr_vdev *vdev,
  49. uint32_t *bitmap)
  50. {
  51. QDF_STATUS status;
  52. struct wlan_objmgr_psoc *psoc;
  53. struct wlan_pmo_tx_ops pmo_tx_ops;
  54. pmo_enter();
  55. psoc = pmo_vdev_get_psoc(vdev);
  56. pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
  57. if (!pmo_tx_ops.send_disable_wow_wakeup_event_req) {
  58. pmo_err("send_disable_wow_wakeup_event_req is null");
  59. status = QDF_STATUS_E_NULL_VALUE;
  60. goto out;
  61. }
  62. status = pmo_tx_ops.send_disable_wow_wakeup_event_req(vdev, bitmap);
  63. if (status != QDF_STATUS_SUCCESS)
  64. pmo_err("Failed to disable wow wakeup event");
  65. out:
  66. pmo_exit();
  67. return status;
  68. }
  69. QDF_STATUS pmo_tgt_send_wow_patterns_to_fw(
  70. struct wlan_objmgr_vdev *vdev, uint8_t ptrn_id,
  71. const uint8_t *ptrn, uint8_t ptrn_len,
  72. uint8_t ptrn_offset, const uint8_t *mask,
  73. uint8_t mask_len, bool user)
  74. {
  75. QDF_STATUS status;
  76. struct pmo_vdev_priv_obj *vdev_ctx;
  77. struct wlan_objmgr_psoc *psoc;
  78. struct wlan_pmo_tx_ops pmo_tx_ops;
  79. pmo_enter();
  80. psoc = pmo_vdev_get_psoc(vdev);
  81. vdev_ctx = pmo_vdev_get_priv(vdev);
  82. pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
  83. if (!pmo_tx_ops.send_add_wow_pattern) {
  84. pmo_err("send_add_wow_pattern is null");
  85. status = QDF_STATUS_E_NULL_VALUE;
  86. goto out;
  87. }
  88. status = pmo_tx_ops.send_add_wow_pattern(
  89. vdev, ptrn_id, ptrn,
  90. ptrn_len, ptrn_offset, mask,
  91. mask_len, user);
  92. if (status != QDF_STATUS_SUCCESS) {
  93. if (!user)
  94. pmo_decrement_wow_default_ptrn(vdev_ctx);
  95. pmo_err("Failed to send wow pattern event");
  96. goto out;
  97. }
  98. if (user)
  99. pmo_increment_wow_user_ptrn(vdev_ctx);
  100. out:
  101. pmo_exit();
  102. return status;
  103. }
  104. QDF_STATUS pmo_tgt_del_wow_pattern(
  105. struct wlan_objmgr_vdev *vdev, uint8_t ptrn_id,
  106. bool user)
  107. {
  108. QDF_STATUS status;
  109. struct pmo_vdev_priv_obj *vdev_ctx;
  110. struct wlan_objmgr_psoc *psoc;
  111. struct wlan_pmo_tx_ops pmo_tx_ops;
  112. pmo_enter();
  113. psoc = pmo_vdev_get_psoc(vdev);
  114. vdev_ctx = pmo_vdev_get_priv(vdev);
  115. pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
  116. if (!pmo_tx_ops.del_wow_pattern) {
  117. pmo_err("del_wow_pattern is null");
  118. status = QDF_STATUS_E_NULL_VALUE;
  119. goto out;
  120. }
  121. status = pmo_tx_ops.del_wow_pattern(vdev, ptrn_id);
  122. if (status) {
  123. status = QDF_STATUS_E_FAILURE;
  124. goto out;
  125. }
  126. if (user)
  127. pmo_decrement_wow_user_ptrn(vdev_ctx);
  128. out:
  129. pmo_exit();
  130. return status;
  131. }