dp_umac_reset.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /*
  2. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #ifndef _DP_UMAC_RESET_H_
  17. #define _DP_UMAC_RESET_H_
  18. #include <qdf_types.h>
  19. struct dp_soc;
  20. /**
  21. * enum umac_reset_action - Actions supported by the UMAC reset
  22. * @UMAC_RESET_ACTION_DO_PRE_RESET: DO_PRE_RESET
  23. * @UMAC_RESET_ACTION_DO_POST_RESET_START: DO_POST_RESET_START
  24. * @UMAC_RESET_ACTION_DO_POST_RESET_COMPLETE: DO_POST_RESET_COMPLETE
  25. * @UMAC_RESET_ACTION_MAX: Maximum actions
  26. */
  27. enum umac_reset_action {
  28. UMAC_RESET_ACTION_DO_PRE_RESET = 0,
  29. UMAC_RESET_ACTION_DO_POST_RESET_START = 1,
  30. UMAC_RESET_ACTION_DO_POST_RESET_COMPLETE = 2,
  31. UMAC_RESET_ACTION_MAX
  32. };
  33. #ifdef DP_UMAC_HW_RESET_SUPPORT
  34. #define dp_umac_reset_alert(params...) \
  35. QDF_TRACE_FATAL(QDF_MODULE_ID_DP_UMAC_RESET, params)
  36. #define dp_umac_reset_err(params...) \
  37. QDF_TRACE_ERROR(QDF_MODULE_ID_DP_UMAC_RESET, params)
  38. #define dp_umac_reset_warn(params...) \
  39. QDF_TRACE_WARN(QDF_MODULE_ID_DP_UMAC_RESET, params)
  40. #define dp_umac_reset_notice(params...) \
  41. QDF_TRACE_INFO(QDF_MODULE_ID_DP_UMAC_RESET, params)
  42. #define dp_umac_reset_info(params...) \
  43. QDF_TRACE_INFO(QDF_MODULE_ID_DP_UMAC_RESET, params)
  44. #define dp_umac_reset_debug(params...) \
  45. QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_UMAC_RESET, params)
  46. #define DP_UMAC_RESET_SHMEM_ALIGN 8
  47. #define DP_UMAC_RESET_SHMEM_MAGIC_NUM (0xDEADBEEF)
  48. /**
  49. * enum umac_reset_state - States required by the UMAC reset state machine
  50. * @UMAC_RESET_STATE_WAIT_FOR_DO_PRE_RESET: Waiting for the DO_PRE_RESET event
  51. * @UMAC_RESET_STATE_DO_PRE_RESET_RECEIVED: Received the DO_PRE_RESET event
  52. * @UMAC_RESET_STATE_HOST_PRE_RESET_DONE: Host has completed handling the
  53. * PRE_RESET event
  54. * @UMAC_RESET_STATE_WAIT_FOR_DO_POST_RESET_START: Waiting for the
  55. * DO_POST_RESET_START event
  56. * @UMAC_RESET_STATE_DO_POST_RESET_START_RECEIVED: Received the
  57. * DO_POST_RESET_START event
  58. * @UMAC_RESET_STATE_HOST_POST_RESET_START_DONE: Host has completed handling the
  59. * POST_RESET_START event
  60. * @UMAC_RESET_STATE_WAIT_FOR_DO_POST_RESET_COMPLETE: Waiting for the
  61. * DO_POST_RESET_COMPLETE event
  62. * @UMAC_RESET_STATE_DO_POST_RESET_COMPLETE_RECEIVED: Received the
  63. * DO_POST_RESET_COMPLETE event
  64. * @UMAC_RESET_STATE_HOST_POST_RESET_COMPLETE_DONE: Host has completed handling
  65. * the DO_POST_RESET_COMPLETE event
  66. */
  67. enum umac_reset_state {
  68. UMAC_RESET_STATE_WAIT_FOR_DO_PRE_RESET = 0,
  69. UMAC_RESET_STATE_DO_PRE_RESET_RECEIVED,
  70. UMAC_RESET_STATE_HOST_PRE_RESET_DONE,
  71. UMAC_RESET_STATE_WAIT_FOR_DO_POST_RESET_START,
  72. UMAC_RESET_STATE_DO_POST_RESET_START_RECEIVED,
  73. UMAC_RESET_STATE_HOST_POST_RESET_START_DONE,
  74. UMAC_RESET_STATE_WAIT_FOR_DO_POST_RESET_COMPLETE,
  75. UMAC_RESET_STATE_DO_POST_RESET_COMPLETE_RECEIVED,
  76. UMAC_RESET_STATE_HOST_POST_RESET_COMPLETE_DONE,
  77. };
  78. /**
  79. * enum umac_reset_rx_event - Rx events deduced by the UMAC reset
  80. * @UMAC_RESET_RX_EVENT_NONE: No event
  81. * @UMAC_RESET_RX_EVENT_DO_PRE_RESET: DO_PRE_RESET event
  82. * @UMAC_RESET_RX_EVENT_DO_POST_RESET_START: DO_POST_RESET_START event
  83. * @UMAC_RESET_RX_EVENT_DO_POST_RESET_COMPELTE: DO_POST_RESET_COMPELTE event
  84. * @UMAC_RESET_RX_EVENT_ERROR: Error while processing the Rx event
  85. */
  86. enum umac_reset_rx_event {
  87. UMAC_RESET_RX_EVENT_NONE = 0x0,
  88. UMAC_RESET_RX_EVENT_DO_PRE_RESET = 0x1,
  89. UMAC_RESET_RX_EVENT_DO_POST_RESET_START = 0x2,
  90. UMAC_RESET_RX_EVENT_DO_POST_RESET_COMPELTE = 0x4,
  91. UMAC_RESET_RX_EVENT_ERROR = 0xFFFFFFFF,
  92. };
  93. /**
  94. * enum umac_reset_tx_cmd: UMAC reset Tx command
  95. * @UMAC_RESET_TX_CMD_PRE_RESET_DONE: PRE_RESET_DONE
  96. * @UMAC_RESET_TX_CMD_POST_RESET_START_DONE: POST_RESET_START_DONE
  97. * @UMAC_RESET_TX_CMD_POST_RESET_COMPLETE_DONE: POST_RESET_COMPLETE_DONE
  98. */
  99. enum umac_reset_tx_cmd {
  100. UMAC_RESET_TX_CMD_PRE_RESET_DONE,
  101. UMAC_RESET_TX_CMD_POST_RESET_START_DONE,
  102. UMAC_RESET_TX_CMD_POST_RESET_COMPLETE_DONE,
  103. };
  104. /**
  105. * struct umac_reset_rx_actions - callbacks for handling UMAC reset actions
  106. * @cb: Array of pointers where each pointer contains callback for each UMAC
  107. * reset action for that index
  108. */
  109. struct umac_reset_rx_actions {
  110. QDF_STATUS (*cb[UMAC_RESET_ACTION_MAX])(struct dp_soc *soc);
  111. };
  112. /**
  113. * struct dp_soc_umac_reset_ctx - UMAC reset context at soc level
  114. * @shmem_paddr_unaligned: Physical address of the shared memory (unaligned)
  115. * @shmem_vaddr_unaligned: Virtual address of the shared memory (unaligned)
  116. * @shmem_paddr_aligned: Physical address of the shared memory (aligned)
  117. * @shmem_vaddr_aligned: Virtual address of the shared memory (aligned)
  118. * @shmem_size: Size of the shared memory
  119. * @intr_offset: Offset of the UMAC reset interrupt w.r.t DP base interrupt
  120. * @current_state: current state of the UMAC reset state machine
  121. * @shmem_exp_magic_num: Expected magic number in the shared memory
  122. * @rx_actions: callbacks for handling UMAC reset actions
  123. * @intr_ctx_bkp: DP Interrupts ring masks backup
  124. * @nbuf_list: skb list for delayed free
  125. * @skel_enable: Enable skeleton code for umac reset
  126. */
  127. struct dp_soc_umac_reset_ctx {
  128. qdf_dma_addr_t shmem_paddr_unaligned;
  129. void *shmem_vaddr_unaligned;
  130. qdf_dma_addr_t shmem_paddr_aligned;
  131. htt_umac_hang_recovery_msg_shmem_t *shmem_vaddr_aligned;
  132. size_t shmem_size;
  133. int intr_offset;
  134. enum umac_reset_state current_state;
  135. uint32_t shmem_exp_magic_num;
  136. struct umac_reset_rx_actions rx_actions;
  137. struct dp_intr_bkp *intr_ctx_bkp;
  138. qdf_nbuf_t nbuf_list;
  139. bool skel_enable;
  140. };
  141. /**
  142. * dp_soc_umac_reset_init() - Initialize UMAC reset context
  143. * @soc: DP soc object
  144. *
  145. * Return: QDF status of operation
  146. */
  147. QDF_STATUS dp_soc_umac_reset_init(struct dp_soc *soc);
  148. /**
  149. * dp_soc_umac_reset_deinit() - De-initialize UMAC reset context
  150. * @txrx_soc: DP soc object
  151. *
  152. * Return: QDF status of operation
  153. */
  154. QDF_STATUS dp_soc_umac_reset_deinit(struct cdp_soc_t *txrx_soc);
  155. /**
  156. * dp_umac_reset_interrupt_attach() - Register handlers for UMAC reset interrupt
  157. * @soc: DP soc object
  158. *
  159. * Return: QDF status of operation
  160. */
  161. QDF_STATUS dp_umac_reset_interrupt_attach(struct dp_soc *soc);
  162. /**
  163. * dp_umac_reset_interrupt_detach() - Unregister UMAC reset interrupt handlers
  164. * @soc: DP soc object
  165. *
  166. * Return: QDF status of operation
  167. */
  168. QDF_STATUS dp_umac_reset_interrupt_detach(struct dp_soc *soc);
  169. /**
  170. * dp_umac_reset_register_rx_action_callback() - Register a callback for a given
  171. * UMAC reset action
  172. * @soc: DP soc object
  173. * @handler: callback handler to be registered
  174. * @action: UMAC reset action for which @handler needs to be registered
  175. *
  176. * Return: QDF status of operation
  177. */
  178. QDF_STATUS dp_umac_reset_register_rx_action_callback(
  179. struct dp_soc *soc,
  180. QDF_STATUS (*handler)(struct dp_soc *soc),
  181. enum umac_reset_action action);
  182. /**
  183. * dp_umac_reset_notify_action_completion() - Notify that a given action has
  184. * been completed
  185. * @soc: DP soc object
  186. * @action: UMAC reset action that got completed
  187. *
  188. * Return: QDF status of operation
  189. */
  190. QDF_STATUS dp_umac_reset_notify_action_completion(
  191. struct dp_soc *soc,
  192. enum umac_reset_action action);
  193. #else
  194. static inline
  195. QDF_STATUS dp_soc_umac_reset_init(struct dp_soc *soc)
  196. {
  197. return QDF_STATUS_SUCCESS;
  198. }
  199. static inline
  200. QDF_STATUS dp_soc_umac_reset_deinit(struct cdp_soc_t *txrx_soc)
  201. {
  202. return QDF_STATUS_SUCCESS;
  203. }
  204. static inline
  205. QDF_STATUS dp_umac_reset_register_rx_action_callback(
  206. struct dp_soc *soc,
  207. QDF_STATUS (*handler)(struct dp_soc *soc),
  208. enum umac_reset_action action)
  209. {
  210. return QDF_STATUS_SUCCESS;
  211. }
  212. static inline
  213. QDF_STATUS dp_umac_reset_notify_action_completion(
  214. struct dp_soc *soc,
  215. enum umac_reset_action action)
  216. {
  217. return QDF_STATUS_SUCCESS;
  218. }
  219. #endif /* DP_UMAC_HW_RESET_SUPPORT */
  220. #endif /* _DP_UMAC_RESET_H_ */