rtw_sreset.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #include <drv_types.h>
  16. #include <hal_data.h>
  17. #include <rtw_sreset.h>
  18. void sreset_init_value(_adapter *padapter)
  19. {
  20. #if defined(DBG_CONFIG_ERROR_DETECT)
  21. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  22. struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  23. _rtw_mutex_init(&psrtpriv->silentreset_mutex);
  24. psrtpriv->silent_reset_inprogress = _FALSE;
  25. psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  26. psrtpriv->last_tx_time = 0;
  27. psrtpriv->last_tx_complete_time = 0;
  28. #endif
  29. }
  30. void sreset_reset_value(_adapter *padapter)
  31. {
  32. #if defined(DBG_CONFIG_ERROR_DETECT)
  33. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  34. struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  35. psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  36. psrtpriv->last_tx_time = 0;
  37. psrtpriv->last_tx_complete_time = 0;
  38. #endif
  39. }
  40. u8 sreset_get_wifi_status(_adapter *padapter)
  41. {
  42. #if defined(DBG_CONFIG_ERROR_DETECT)
  43. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  44. struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  45. u8 status = WIFI_STATUS_SUCCESS;
  46. u32 val32 = 0;
  47. if (psrtpriv->silent_reset_inprogress == _TRUE)
  48. return status;
  49. val32 = rtw_read32(padapter, REG_TXDMA_STATUS);
  50. if (val32 == 0xeaeaeaea)
  51. psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST;
  52. else if (val32 != 0) {
  53. RTW_INFO("txdmastatu(%x)\n", val32);
  54. psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR;
  55. }
  56. if (WIFI_STATUS_SUCCESS != psrtpriv->Wifi_Error_Status) {
  57. RTW_INFO("==>%s error_status(0x%x)\n", __FUNCTION__, psrtpriv->Wifi_Error_Status);
  58. status = (psrtpriv->Wifi_Error_Status & (~(USB_READ_PORT_FAIL | USB_WRITE_PORT_FAIL)));
  59. }
  60. RTW_INFO("==> %s wifi_status(0x%x)\n", __FUNCTION__, status);
  61. /* status restore */
  62. psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  63. return status;
  64. #else
  65. return WIFI_STATUS_SUCCESS;
  66. #endif
  67. }
  68. void sreset_set_wifi_error_status(_adapter *padapter, u32 status)
  69. {
  70. #if defined(DBG_CONFIG_ERROR_DETECT)
  71. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  72. pHalData->srestpriv.Wifi_Error_Status = status;
  73. #endif
  74. }
  75. void sreset_set_trigger_point(_adapter *padapter, s32 tgp)
  76. {
  77. #if defined(DBG_CONFIG_ERROR_DETECT)
  78. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  79. pHalData->srestpriv.dbg_trigger_point = tgp;
  80. #endif
  81. }
  82. bool sreset_inprogress(_adapter *padapter)
  83. {
  84. #if defined(DBG_CONFIG_ERROR_RESET)
  85. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  86. return pHalData->srestpriv.silent_reset_inprogress;
  87. #else
  88. return _FALSE;
  89. #endif
  90. }
  91. void sreset_restore_security_station(_adapter *padapter)
  92. {
  93. struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  94. struct sta_priv *pstapriv = &padapter->stapriv;
  95. struct sta_info *psta;
  96. struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;
  97. {
  98. u8 val8;
  99. if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) {
  100. val8 = 0xcc;
  101. #ifdef CONFIG_WAPI_SUPPORT
  102. } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) {
  103. /* Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. */
  104. val8 = 0x4c;
  105. #endif
  106. } else
  107. val8 = 0xcf;
  108. rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
  109. }
  110. if ((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
  111. (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) {
  112. psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv));
  113. if (psta == NULL) {
  114. /* DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail\n")); */
  115. } else {
  116. /* pairwise key */
  117. rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _FALSE);
  118. /* group key */
  119. rtw_set_key(padapter, &padapter->securitypriv, padapter->securitypriv.dot118021XGrpKeyid, 0, _FALSE);
  120. }
  121. }
  122. }
  123. void sreset_restore_network_station(_adapter *padapter)
  124. {
  125. struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  126. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  127. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  128. u8 doiqk = _FALSE;
  129. rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure, RTW_CMDF_DIRECTLY);
  130. {
  131. u8 threshold;
  132. #ifdef CONFIG_USB_HCI
  133. /* TH=1 => means that invalidate usb rx aggregation */
  134. /* TH=0 => means that validate usb rx aggregation, use init value. */
  135. #ifdef CONFIG_80211N_HT
  136. if (mlmepriv->htpriv.ht_option) {
  137. if (padapter->registrypriv.wifi_spec == 1)
  138. threshold = 1;
  139. else
  140. threshold = 0;
  141. rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
  142. } else {
  143. threshold = 1;
  144. rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
  145. }
  146. #endif /* CONFIG_80211N_HT */
  147. #endif
  148. }
  149. doiqk = _TRUE;
  150. rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK , &doiqk);
  151. set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  152. doiqk = _FALSE;
  153. rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk);
  154. /* disable dynamic functions, such as high power, DIG */
  155. /*rtw_phydm_func_disable_all(padapter);*/
  156. rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
  157. {
  158. u8 join_type = 0;
  159. rtw_hal_rcr_set_chk_bssid(padapter, MLME_STA_CONNECTING);
  160. rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  161. }
  162. Set_MSR(padapter, (pmlmeinfo->state & 0x3));
  163. mlmeext_joinbss_event_callback(padapter, 1);
  164. /* restore Sequence No. */
  165. rtw_hal_set_hwreg(padapter, HW_VAR_RESTORE_HW_SEQ, 0);
  166. sreset_restore_security_station(padapter);
  167. }
  168. void sreset_restore_network_status(_adapter *padapter)
  169. {
  170. struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  171. if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) {
  172. RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  173. sreset_restore_network_station(padapter);
  174. } else if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) {
  175. RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(padapter), MLME_IS_AP(padapter) ? "AP" : "MESH");
  176. rtw_ap_restore_network(padapter);
  177. } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE))
  178. RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  179. else
  180. RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  181. }
  182. void sreset_stop_adapter(_adapter *padapter)
  183. {
  184. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  185. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  186. if (padapter == NULL)
  187. return;
  188. RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  189. rtw_netif_stop_queue(padapter->pnetdev);
  190. rtw_cancel_all_timer(padapter);
  191. /* TODO: OS and HCI independent */
  192. #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)
  193. tasklet_kill(&pxmitpriv->xmit_tasklet);
  194. #endif
  195. if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
  196. rtw_scan_abort(padapter);
  197. if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) {
  198. rtw_set_to_roam(padapter, 0);
  199. rtw_join_timeout_handler(padapter);
  200. }
  201. }
  202. void sreset_start_adapter(_adapter *padapter)
  203. {
  204. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  205. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  206. if (padapter == NULL)
  207. return;
  208. RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  209. if (check_fwstate(pmlmepriv, _FW_LINKED))
  210. sreset_restore_network_status(padapter);
  211. /* TODO: OS and HCI independent */
  212. #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)
  213. tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
  214. #endif
  215. if (is_primary_adapter(padapter))
  216. _set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000);
  217. rtw_netif_wake_queue(padapter->pnetdev);
  218. }
  219. void sreset_reset(_adapter *padapter)
  220. {
  221. #ifdef DBG_CONFIG_ERROR_RESET
  222. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  223. struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  224. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  225. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  226. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  227. _irqL irqL;
  228. systime start = rtw_get_current_time();
  229. struct dvobj_priv *psdpriv = padapter->dvobj;
  230. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  231. RTW_INFO("%s\n", __FUNCTION__);
  232. psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  233. #ifdef CONFIG_LPS
  234. rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET");
  235. #endif/* #ifdef CONFIG_LPS */
  236. _enter_pwrlock(&pwrpriv->lock);
  237. psrtpriv->silent_reset_inprogress = _TRUE;
  238. pwrpriv->change_rfpwrstate = rf_off;
  239. rtw_mi_sreset_adapter_hdl(padapter, _FALSE);/*sreset_stop_adapter*/
  240. #ifdef CONFIG_IPS
  241. _ips_enter(padapter);
  242. _ips_leave(padapter);
  243. #endif
  244. #ifdef CONFIG_CONCURRENT_MODE
  245. rtw_mi_ap_info_restore(padapter);
  246. #endif
  247. rtw_mi_sreset_adapter_hdl(padapter, _TRUE);/*sreset_start_adapter*/
  248. psrtpriv->silent_reset_inprogress = _FALSE;
  249. _exit_pwrlock(&pwrpriv->lock);
  250. RTW_INFO("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start));
  251. pdbgpriv->dbg_sreset_cnt++;
  252. psrtpriv->self_dect_fw = _FALSE;
  253. psrtpriv->rx_cnt = 0;
  254. #endif
  255. }