gl_rst.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. ** Id: @(#) gl_rst.c@@
  3. */
  4. /*! \file gl_rst.c
  5. \brief Main routines for supporintg MT6620 whole-chip reset mechanism
  6. This file contains the support routines of Linux driver for MediaTek Inc. 802.11
  7. Wireless LAN Adapters.
  8. */
  9. /*
  10. ** Log: gl_rst.c
  11. *
  12. * 11 10 2011 cp.wu
  13. * [WCXRP00001098] [MT6620 Wi-Fi][Driver] Replace printk by DBG LOG macros in linux porting layer
  14. * 1. eliminaite direct calls to printk in porting layer.
  15. * 2. replaced by DBGLOG, which would be XLOG on ALPS platforms.
  16. *
  17. * 04 22 2011 cp.wu
  18. * [WCXRP00000598] [MT6620 Wi-Fi][Driver] Implementation of interface for communicating with user space process for
  19. * RESET_START and RESET_END events
  20. * skip power-off handshaking when RESET indication is received.
  21. *
  22. * 04 14 2011 cp.wu
  23. * [WCXRP00000598] [MT6620 Wi-Fi][Driver] Implementation of interface for communicating with user space process for
  24. * RESET_START and RESET_END events
  25. * 1. add code to put whole-chip resetting trigger when abnormal firmware assertion is detected
  26. * 2. add dummy function for both Win32 and Linux part.
  27. *
  28. * 03 30 2011 cp.wu
  29. * [WCXRP00000598] [MT6620 Wi-Fi][Driver] Implementation of interface for communicating with user space process for
  30. * RESET_START and RESET_END events
  31. * use netlink unicast instead of broadcast
  32. *
  33. **
  34. */
  35. /*******************************************************************************
  36. * C O M P I L E R F L A G S
  37. ********************************************************************************
  38. */
  39. /*******************************************************************************
  40. * E X T E R N A L R E F E R E N C E S
  41. ********************************************************************************
  42. */
  43. #include <linux/kernel.h>
  44. #include <linux/workqueue.h>
  45. #include "precomp.h"
  46. #include "gl_rst.h"
  47. #if CFG_CHIP_RESET_SUPPORT
  48. /*******************************************************************************
  49. * P U B L I C D A T A
  50. ********************************************************************************
  51. */
  52. BOOLEAN fgIsResetting = FALSE;
  53. UINT_32 g_IsNeedDoChipReset = 0;
  54. /*******************************************************************************
  55. * P R I V A T E D A T A
  56. ********************************************************************************
  57. */
  58. static RESET_STRUCT_T wifi_rst;
  59. static void mtk_wifi_reset(struct work_struct *work);
  60. /*******************************************************************************
  61. * F U N C T I O N D E C L A R A T I O N S
  62. ********************************************************************************
  63. */
  64. static void *glResetCallback(ENUM_WMTDRV_TYPE_T eSrcType,
  65. ENUM_WMTDRV_TYPE_T eDstType,
  66. ENUM_WMTMSG_TYPE_T eMsgType, void *prMsgBody, unsigned int u4MsgLength);
  67. /*******************************************************************************
  68. * F U N C T I O N S
  69. ********************************************************************************
  70. */
  71. /*----------------------------------------------------------------------------*/
  72. /*!
  73. * @brief This routine is responsible for
  74. * 1. register wifi reset callback
  75. * 2. initialize wifi reset work
  76. *
  77. * @param none
  78. *
  79. * @retval none
  80. */
  81. /*----------------------------------------------------------------------------*/
  82. VOID glResetInit(VOID)
  83. {
  84. #if (MTK_WCN_SINGLE_MODULE == 0)
  85. /* 1. Register reset callback */
  86. mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_WIFI, (PF_WMT_CB) glResetCallback);
  87. #endif /* MTK_WCN_SINGLE_MODULE */
  88. /* 2. Initialize reset work */
  89. INIT_WORK(&(wifi_rst.rst_work), mtk_wifi_reset);
  90. }
  91. /*----------------------------------------------------------------------------*/
  92. /*!
  93. * @brief This routine is responsible for
  94. * 1. deregister wifi reset callback
  95. *
  96. * @param none
  97. *
  98. * @retval none
  99. */
  100. /*----------------------------------------------------------------------------*/
  101. VOID glResetUninit(VOID)
  102. {
  103. #if (MTK_WCN_SINGLE_MODULE == 0)
  104. /* 1. Deregister reset callback */
  105. mtk_wcn_wmt_msgcb_unreg(WMTDRV_TYPE_WIFI);
  106. #endif /* MTK_WCN_SINGLE_MODULE */
  107. }
  108. /*----------------------------------------------------------------------------*/
  109. /*!
  110. * @brief This routine is invoked when there is reset messages indicated
  111. *
  112. * @param eSrcType
  113. * eDstType
  114. * eMsgType
  115. * prMsgBody
  116. * u4MsgLength
  117. *
  118. * @retval
  119. */
  120. /*----------------------------------------------------------------------------*/
  121. static void *glResetCallback(ENUM_WMTDRV_TYPE_T eSrcType,
  122. ENUM_WMTDRV_TYPE_T eDstType,
  123. ENUM_WMTMSG_TYPE_T eMsgType, void *prMsgBody, unsigned int u4MsgLength)
  124. {
  125. switch (eMsgType) {
  126. case WMTMSG_TYPE_RESET:
  127. if (u4MsgLength == sizeof(ENUM_WMTRSTMSG_TYPE_T)) {
  128. P_ENUM_WMTRSTMSG_TYPE_T prRstMsg = (P_ENUM_WMTRSTMSG_TYPE_T) prMsgBody;
  129. switch (*prRstMsg) {
  130. case WMTRSTMSG_RESET_START:
  131. DBGLOG(INIT, WARN, "Whole chip reset start!\n");
  132. fgIsResetting = TRUE;
  133. wifi_reset_start();
  134. break;
  135. case WMTRSTMSG_RESET_END:
  136. DBGLOG(INIT, WARN, "Whole chip reset end!\n");
  137. fgIsResetting = FALSE;
  138. wifi_rst.rst_data = RESET_SUCCESS;
  139. schedule_work(&(wifi_rst.rst_work));
  140. break;
  141. case WMTRSTMSG_RESET_END_FAIL:
  142. DBGLOG(INIT, WARN, "Whole chip reset fail!\n");
  143. fgIsResetting = FALSE;
  144. wifi_rst.rst_data = RESET_FAIL;
  145. schedule_work(&(wifi_rst.rst_work));
  146. break;
  147. default:
  148. break;
  149. }
  150. }
  151. break;
  152. default:
  153. break;
  154. }
  155. return NULL;
  156. }
  157. /*----------------------------------------------------------------------------*/
  158. /*!
  159. * @brief This routine is called for wifi reset
  160. *
  161. * @param skb
  162. * info
  163. *
  164. * @retval 0
  165. * nonzero
  166. */
  167. /*----------------------------------------------------------------------------*/
  168. static void mtk_wifi_reset(struct work_struct *work)
  169. {
  170. RESET_STRUCT_T *rst = container_of(work, RESET_STRUCT_T, rst_work);
  171. wifi_reset_end(rst->rst_data);
  172. }
  173. /*----------------------------------------------------------------------------*/
  174. /*!
  175. * @brief This routine is called for generating reset request to WMT
  176. *
  177. * @param None
  178. *
  179. * @retval None
  180. */
  181. /*----------------------------------------------------------------------------*/
  182. VOID glSendResetRequest(VOID)
  183. {
  184. /* WMT thread would trigger whole chip reset itself */
  185. }
  186. /*----------------------------------------------------------------------------*/
  187. /*!
  188. * @brief This routine is called for checking if connectivity chip is resetting
  189. *
  190. * @param None
  191. *
  192. * @retval TRUE
  193. * FALSE
  194. */
  195. /*----------------------------------------------------------------------------*/
  196. BOOLEAN kalIsResetting(VOID)
  197. {
  198. return fgIsResetting;
  199. }
  200. #endif /* CFG_CHIP_RESET_SUPPORT */