u8 rtw_free_drv_sw(struct adapter *padapter) { RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw")); /* we can call rtw_p2p_enable here, but: */ /* 1. rtw_p2p_enable may have IO operation */ /* 2. rtw_p2p_enable is bundled with wext interface */ #ifdef CONFIG_88EU_P2P { struct wifidirect_info *pwdinfo = &padapter->wdinfo; if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { _cancel_timer_ex(&pwdinfo->find_phase_timer); _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); _cancel_timer_ex(&pwdinfo->pre_tx_scan_timer); rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); } } #endif _rtw_spinlock_free(&padapter->br_ext_lock); free_mlme_ext_priv(&padapter->mlmeextpriv); rtw_free_cmd_priv(&padapter->cmdpriv); rtw_free_evt_priv(&padapter->evtpriv); rtw_free_mlme_priv(&padapter->mlmepriv); _rtw_free_xmit_priv(&padapter->xmitpriv); _rtw_free_sta_priv(&padapter->stapriv); /* will free bcmc_stainfo here */ _rtw_free_recv_priv(&padapter->recvpriv); rtw_free_pwrctrl_priv(padapter); rtw_hal_free_data(padapter); RT_TRACE(_module_os_intfs_c_, _drv_info_, ("<== rtw_free_drv_sw\n")); /* free the old_pnetdev */ if (padapter->rereg_nd_name_priv.old_pnetdev) { free_netdev(padapter->rereg_nd_name_priv.old_pnetdev); padapter->rereg_nd_name_priv.old_pnetdev = NULL; } /* clear pbuddystruct adapter to avoid access wrong pointer. */ if (padapter->pbuddy_adapter != NULL) padapter->pbuddy_adapter->pbuddy_adapter = NULL; RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-rtw_free_drv_sw\n")); return _SUCCESS; }
u8 rtw_free_drv_sw(_adapter *padapter) { struct net_device *pnetdev = (struct net_device*)padapter->pnetdev; RT_TRACE(_module_os_intfs_c_,_drv_info_,("==>rtw_free_drv_sw")); //we can call rtw_p2p_enable here, but: // 1. rtw_p2p_enable may have IO operation // 2. rtw_p2p_enable is bundled with wext interface #ifdef CONFIG_P2P { struct wifidirect_info *pwdinfo = &padapter->wdinfo; if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { _cancel_timer_ex( &pwdinfo->find_phase_timer ); _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); } } #endif #ifdef CONFIG_BR_EXT _rtw_spinlock_free(&padapter->br_ext_lock); #endif // CONFIG_BR_EXT free_mlme_ext_priv(&padapter->mlmeextpriv); #ifdef CONFIG_TDLS //rtw_free_tdls_info(&padapter->tdlsinfo); #endif //CONFIG_TDLS rtw_free_cmd_priv(&padapter->cmdpriv); rtw_free_evt_priv(&padapter->evtpriv); rtw_free_mlme_priv(&padapter->mlmepriv); //free_io_queue(padapter); _rtw_free_xmit_priv(&padapter->xmitpriv); _rtw_free_sta_priv(&padapter->stapriv); //will free bcmc_stainfo here _rtw_free_recv_priv(&padapter->recvpriv); rtw_free_pwrctrl_priv(padapter); //rtw_mfree((void *)padapter, sizeof (padapter)); #ifdef CONFIG_DRVEXT_MODULE free_drvext(&padapter->drvextpriv); #endif padapter->HalFunc.free_hal_data(padapter); RT_TRACE(_module_os_intfs_c_,_drv_info_,("<==rtw_free_drv_sw\n")); //free the old_pnetdev if(padapter->rereg_nd_name_priv.old_pnetdev) { free_netdev(padapter->rereg_nd_name_priv.old_pnetdev); padapter->rereg_nd_name_priv.old_pnetdev = NULL; } if(pnetdev) { rtw_free_netdev(pnetdev); } RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_free_drv_sw\n")); return _SUCCESS; }