dp_umac_reset.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. */
  126. struct dp_soc_umac_reset_ctx {
  127. qdf_dma_addr_t shmem_paddr_unaligned;
  128. void *shmem_vaddr_unaligned;
  129. qdf_dma_addr_t shmem_paddr_aligned;
  130. htt_umac_hang_recovery_msg_shmem_t *shmem_vaddr_aligned;
  131. size_t shmem_size;
  132. int intr_offset;
  133. enum umac_reset_state current_state;
  134. uint32_t shmem_exp_magic_num;
  135. struct umac_reset_rx_actions rx_actions;
  136. struct dp_intr_bkp *intr_ctx_bkp;
  137. qdf_nbuf_t nbuf_list;
  138. };
  139. /**
  140. * dp_soc_umac_reset_init() - Initialize UMAC reset context
  141. * @soc: DP soc object
  142. *
  143. * Return: QDF status of operation
  144. */
  145. QDF_STATUS dp_soc_umac_reset_init(struct dp_soc *soc);
  146. /**
  147. * dp_soc_umac_reset_deinit() - De-initialize UMAC reset context
  148. * @txrx_soc: DP soc object
  149. *
  150. * Return: QDF status of operation
  151. */
  152. QDF_STATUS dp_soc_umac_reset_deinit(struct cdp_soc_t *txrx_soc);
  153. /**
  154. * dp_umac_reset_interrupt_attach() - Register handlers for UMAC reset interrupt
  155. * @soc: DP soc object
  156. *
  157. * Return: QDF status of operation
  158. */
  159. QDF_STATUS dp_umac_reset_interrupt_attach(struct dp_soc *soc);
  160. /**
  161. * dp_umac_reset_interrupt_detach() - Unregister UMAC reset interrupt handlers
  162. * @soc: DP soc object
  163. *
  164. * Return: QDF status of operation
  165. */
  166. QDF_STATUS dp_umac_reset_interrupt_detach(struct dp_soc *soc);
  167. /**
  168. * dp_umac_reset_register_rx_action_callback() - Register a callback for a given
  169. * UMAC reset action
  170. * @soc: DP soc object
  171. * @handler: callback handler to be registered
  172. * @action: UMAC reset action for which @handler needs to be registered
  173. *
  174. * Return: QDF status of operation
  175. */
  176. QDF_STATUS dp_umac_reset_register_rx_action_callback(
  177. struct dp_soc *soc,
  178. QDF_STATUS (*handler)(struct dp_soc *soc),
  179. enum umac_reset_action action);
  180. /**
  181. * dp_umac_reset_notify_action_completion() - Notify that a given action has
  182. * been completed
  183. * @soc: DP soc object
  184. * @action: UMAC reset action that got completed
  185. *
  186. * Return: QDF status of operation
  187. */
  188. QDF_STATUS dp_umac_reset_notify_action_completion(
  189. struct dp_soc *soc,
  190. enum umac_reset_action action);
  191. #else
  192. static inline
  193. QDF_STATUS dp_soc_umac_reset_init(struct dp_soc *soc)
  194. {
  195. return QDF_STATUS_SUCCESS;
  196. }
  197. static inline
  198. QDF_STATUS dp_soc_umac_reset_deinit(struct cdp_soc_t *txrx_soc)
  199. {
  200. return QDF_STATUS_SUCCESS;
  201. }
  202. static inline
  203. QDF_STATUS dp_umac_reset_register_rx_action_callback(
  204. struct dp_soc *soc,
  205. QDF_STATUS (*handler)(struct dp_soc *soc),
  206. enum umac_reset_action action)
  207. {
  208. return QDF_STATUS_SUCCESS;
  209. }
  210. static inline
  211. QDF_STATUS dp_umac_reset_notify_action_completion(
  212. struct dp_soc *soc,
  213. enum umac_reset_action action)
  214. {
  215. return QDF_STATUS_SUCCESS;
  216. }
  217. #endif /* DP_UMAC_HW_RESET_SUPPORT */
  218. #endif /* _DP_UMAC_RESET_H_ */