summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c')
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c307
1 files changed, 235 insertions, 72 deletions
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
index 0815a0cc9146..284d23a8d71b 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
@@ -66,6 +66,23 @@ int rtw_resume_process(_adapter *padapter);
static int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid);
static void rtw_dev_remove(struct usb_interface *pusb_intf);
+static void rtw_dev_shutdown(struct device *dev)
+{
+ struct usb_interface *usb_intf = container_of(dev, struct usb_interface, dev);
+ struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);
+ _adapter *adapter = dvobj->if1;
+ int i;
+
+ DBG_871X("%s\n", __func__);
+
+ for (i = 0; i<dvobj->iface_nums; i++) {
+ adapter = dvobj->padapters[i];
+ adapter->bSurpriseRemoved = _TRUE;
+ }
+
+ ATOMIC_SET(&dvobj->continual_io_error, MAX_CONTINUAL_IO_ERR+1);
+}
+
#if (LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,23))
/* Some useful macros to use to create struct usb_device_id */
#define USB_DEVICE_ID_MATCH_VENDOR 0x0001
@@ -320,6 +337,12 @@ struct rtw_usb_drv rtl8192c_usb_drv = {
#ifdef CONFIG_AUTOSUSPEND
.usbdrv.supports_autosuspend = 1,
#endif
+
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
+ .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,
+ #else
+ .usbdrv.driver.shutdown = rtw_dev_shutdown,
+ #endif
};
static struct rtw_usb_drv *usb_drv = &rtl8192c_usb_drv;
@@ -344,6 +367,12 @@ struct rtw_usb_drv rtl8192d_usb_drv = {
#ifdef CONFIG_AUTOSUSPEND
.usbdrv.supports_autosuspend = 1,
#endif
+
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
+ .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,
+ #else
+ .usbdrv.driver.shutdown = rtw_dev_shutdown,
+ #endif
};
static struct rtw_usb_drv *usb_drv = &rtl8192d_usb_drv;
#endif /* CONFIG_RTL8192D */
@@ -367,6 +396,12 @@ struct rtw_usb_drv rtl8723a_usb_drv = {
#ifdef CONFIG_AUTOSUSPEND
.usbdrv.supports_autosuspend = 1,
#endif
+
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
+ .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,
+ #else
+ .usbdrv.driver.shutdown = rtw_dev_shutdown,
+ #endif
};
static struct rtw_usb_drv *usb_drv = &rtl8723a_usb_drv;
@@ -391,6 +426,12 @@ struct rtw_usb_drv rtl8188e_usb_drv = {
#ifdef CONFIG_AUTOSUSPEND
.usbdrv.supports_autosuspend = 1,
#endif
+
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
+ .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,
+ #else
+ .usbdrv.driver.shutdown = rtw_dev_shutdown,
+ #endif
};
static struct rtw_usb_drv *usb_drv = &rtl8188e_usb_drv;
@@ -502,7 +543,7 @@ _func_enter_;
_rtw_mutex_init(&pdvobjpriv->h2c_fwcmd_mutex);
_rtw_mutex_init(&pdvobjpriv->setch_mutex);
_rtw_mutex_init(&pdvobjpriv->setbw_mutex);
-
+ pdvobjpriv->processing_dev_remove = _FALSE;
pdvobjpriv->pusbintf = usb_intf ;
pusbd = pdvobjpriv->pusbdev = interface_to_usbdev(usb_intf);
@@ -629,7 +670,7 @@ _func_enter_;
//.3 misc
_rtw_init_sema(&(pdvobjpriv->usb_suspend_sema), 0);
- rtw_reset_continual_urb_error(pdvobjpriv);
+ rtw_reset_continual_io_error(pdvobjpriv);
usb_get_dev(pusbd);
@@ -724,7 +765,7 @@ static void usb_intf_stop(_adapter *padapter)
}
-static void rtw_dev_unload(_adapter *padapter)
+void rtw_dev_unload(_adapter *padapter)
{
struct net_device *pnetdev= (struct net_device*)padapter->pnetdev;
u8 val8;
@@ -747,7 +788,7 @@ static void rtw_dev_unload(_adapter *padapter)
}
//s4.
- if(!padapter->pwrctrlpriv.bInternalAutoSuspend )
+ if(!adapter_to_pwrctl(padapter)->bInternalAutoSuspend )
rtw_stop_drv_threads(padapter);
@@ -756,7 +797,7 @@ static void rtw_dev_unload(_adapter *padapter)
{
//DBG_871X("r871x_dev_unload()->rtl871x_hal_deinit()\n");
#ifdef CONFIG_WOWLAN
- if((padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE)&&(padapter->pwrctrlpriv.wowlan_mode==_TRUE)){
+ if((adapter_to_pwrctl(padapter)->bSupportRemoteWakeup==_TRUE)&&(adapter_to_pwrctl(padapter)->wowlan_mode==_TRUE)){
DBG_871X("%s bSupportWakeOnWlan==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__);
}
else
@@ -822,7 +863,7 @@ static void process_spec_devid(const struct usb_device_id *pdid)
#ifdef SUPPORT_HW_RFOFF_DETECTED
int rtw_hw_suspend(_adapter *padapter )
{
- struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
struct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf;
struct net_device *pnetdev = padapter->pnetdev;
@@ -900,7 +941,7 @@ error_exit:
int rtw_hw_resume(_adapter *padapter)
{
- struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
struct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf;
struct net_device *pnetdev = padapter->pnetdev;
@@ -949,13 +990,150 @@ error_exit:
}
#endif
+#if 1
+#ifdef CONFIG_WOWLAN
+static void rtw_suspend_wow(_adapter *padapter)
+{
+ struct net_device *pnetdev = padapter->pnetdev;
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+ struct wifidirect_info* pwdinfo = &padapter->wdinfo;
+ struct wowlan_ioctl_param poidparam;
+
+ if (check_fwstate(pmlmepriv, _FW_LINKED))
+ pwrpriv->wowlan_mode = _TRUE;
+ else
+ pwrpriv->wowlan_mode = _FALSE;
+
+ rtw_cancel_all_timer(padapter);
+ LeaveAllPowerSaveMode(padapter);
+
+ rtw_stop_cmd_thread(padapter);
+
+
+ //padapter->net_closed = _TRUE;
+ //s1.
+ if(pnetdev)
+ {
+ netif_carrier_off(pnetdev);
+ rtw_netif_stop_queue(pnetdev);
+ }
+
+ if(pwrpriv->bSupportRemoteWakeup==_TRUE && pwrpriv->wowlan_mode==_TRUE){
+ //set H2C command
+ poidparam.subcode=WOWLAN_ENABLE;
+ padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
+ }
+ else
+ {
+ //s2.
+ rtw_disassoc_cmd(padapter, 0, _FALSE);
+ }
+
+
+#ifdef CONFIG_LAYER2_ROAMING_RESUME
+ if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)&& rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
+ {
+ //DBG_871X("%s:%d assoc_ssid:%s\n", __FUNCTION__, __LINE__, pmlmepriv->assoc_ssid.Ssid);
+ DBG_871X("%s:%d %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, __LINE__,
+ pmlmepriv->cur_network.network.Ssid.Ssid,
+ MAC_ARG(pmlmepriv->cur_network.network.MacAddress),
+ pmlmepriv->cur_network.network.Ssid.SsidLength,
+ pmlmepriv->assoc_ssid.SsidLength);
+
+ rtw_set_roaming(padapter, 1);
+ }
+#endif
+ //s2-2. indicate disconnect to os
+ rtw_indicate_disconnect(padapter);
+ //s2-3.
+ rtw_free_assoc_resources(padapter, 1);
+#ifdef CONFIG_AUTOSUSPEND
+ if(!pwrpriv->bInternalAutoSuspend )
+#endif
+ //s2-4.
+ rtw_free_network_queue(padapter, _TRUE);
+
+ rtw_dev_unload(padapter);
+
+ if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
+ rtw_indicate_scan_done(padapter, 1);
+
+ //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
+ // rtw_indicate_disconnect(padapter);
+
+}
+#endif
+static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
+{
+ struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
+ _adapter *padapter = dvobj->if1;
+ struct net_device *pnetdev = padapter->pnetdev;
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);
+ struct usb_device *usb_dev = interface_to_usbdev(pusb_intf);
+
+
+ int ret = 0;
+ u32 start_time = rtw_get_current_time();
+
+ _func_enter_;
+
+ DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
+
+ if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
+ {
+ DBG_871X("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n",
+ padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved);
+ goto exit;
+ }
+
+ if(pwrpriv->bInternalAutoSuspend )
+ {
+ #ifdef CONFIG_AUTOSUSPEND
+ #ifdef SUPPORT_HW_RFOFF_DETECTED
+ // The FW command register update must after MAC and FW init ready.
+ if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))
+ {
+ u8 bOpen = _TRUE;
+ rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen);
+ //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect
+ }
+ #endif
+ #endif
+ }
+
+ pwrpriv->bInSuspend = _TRUE;
+
+ _enter_pwrlock(&pwrpriv->lock);
+#ifdef CONFIG_WOWLAN
+ rtw_suspend_wow(padapter);
+#else
+ rtw_suspend_common(padapter);
+#endif
+
+#ifdef CONFIG_AUTOSUSPEND
+ pwrpriv->rf_pwrstate = rf_off;
+ pwrpriv->bips_processing = _FALSE;
+#endif
+ _exit_pwrlock(&pwrpriv->lock);
+
+
+exit:
+ DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__
+ , ret, rtw_get_passing_time_ms(start_time));
+
+ _func_exit_;
+ return ret;
+}
+#else
static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
{
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
_adapter *padapter = dvobj->if1;
struct net_device *pnetdev = padapter->pnetdev;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
- struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);
struct usb_device *usb_dev = interface_to_usbdev(pusb_intf);
#ifdef CONFIG_WOWLAN
struct wowlan_ioctl_param poidparam;
@@ -970,9 +1148,9 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
#ifdef CONFIG_WOWLAN
if (check_fwstate(pmlmepriv, _FW_LINKED))
- padapter->pwrctrlpriv.wowlan_mode = _TRUE;
+ pwrpriv->wowlan_mode = _TRUE;
else
- padapter->pwrctrlpriv.wowlan_mode = _FALSE;
+ pwrpriv->wowlan_mode = _FALSE;
#endif
if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
@@ -987,7 +1165,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
#ifdef CONFIG_AUTOSUSPEND
#ifdef SUPPORT_HW_RFOFF_DETECTED
// The FW command register update must after MAC and FW init ready.
- if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))
+ if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))
{
u8 bOpen = _TRUE;
rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen);
@@ -1000,6 +1178,8 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
rtw_cancel_all_timer(padapter);
LeaveAllPowerSaveMode(padapter);
+ rtw_stop_cmd_thread(padapter);
+
_enter_pwrlock(&pwrpriv->lock);
//padapter->net_closed = _TRUE;
//s1.
@@ -1010,7 +1190,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
}
#ifdef CONFIG_WOWLAN
- if(padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE&&padapter->pwrctrlpriv.wowlan_mode==_TRUE){
+ if(pwrpriv->bSupportRemoteWakeup==_TRUE && pwrpriv->wowlan_mode==_TRUE){
//set H2C command
poidparam.subcode=WOWLAN_ENABLE;
padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
@@ -1067,12 +1247,13 @@ exit:
return ret;
}
+#endif
static int rtw_resume(struct usb_interface *pusb_intf)
{
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
_adapter *padapter = dvobj->if1;
struct net_device *pnetdev = padapter->pnetdev;
- struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);
int ret = 0;
if(pwrpriv->bInternalAutoSuspend ){
@@ -1083,7 +1264,7 @@ static int rtw_resume(struct usb_interface *pusb_intf)
#else
if (rtw_is_earlysuspend_registered(pwrpriv)
#ifdef CONFIG_WOWLAN
- && !padapter->pwrctrlpriv.wowlan_mode
+ && !pwrpriv->wowlan_mode
#endif /* CONFIG_WOWLAN */
) {
/* jeff: bypass resume here, do in late_resume */
@@ -1113,7 +1294,7 @@ int rtw_resume_process(_adapter *padapter)
if(padapter) {
pnetdev= padapter->pnetdev;
- pwrpriv = &padapter->pwrctrlpriv;
+ pwrpriv = adapter_to_pwrctl(padapter);
} else {
goto exit;
}
@@ -1138,15 +1319,13 @@ int rtw_resume_process(_adapter *padapter)
}
#endif //#ifdef CONFIG_AUTOSUSPEND
#endif //#ifdef CONFIG_BT_COEXIST
- rtw_reset_drv_sw(padapter);
- pwrpriv->bkeepfwalive = _FALSE;
- DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
- if(pm_netdev_open(pnetdev,_TRUE) != 0)
- goto exit;
- netif_device_attach(pnetdev);
- netif_carrier_on(pnetdev);
+ if(rtw_resume_common(padapter)!= 0) {
+ DBG_871X("%s rtw_resume_common failed\n",__FUNCTION__);
+ _exit_pwrlock(&pwrpriv->lock);
+ goto exit;
+ }
#ifdef CONFIG_AUTOSUSPEND
if(pwrpriv->bInternalAutoSuspend )
@@ -1154,7 +1333,7 @@ int rtw_resume_process(_adapter *padapter)
#ifdef CONFIG_AUTOSUSPEND
#ifdef SUPPORT_HW_RFOFF_DETECTED
// The FW command register update must after MAC and FW init ready.
- if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))
+ if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect) && (padapter->registrypriv.usbss_enable ))
{
//rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect
u8 bOpen = _FALSE;
@@ -1165,7 +1344,7 @@ int rtw_resume_process(_adapter *padapter)
#ifdef CONFIG_BT_COEXIST
DBG_871X("pwrpriv->bAutoResume (%x)\n",pwrpriv->bAutoResume );
if( _TRUE == pwrpriv->bAutoResume ){
- pwrpriv->bInternalAutoSuspend = _FALSE;
+ pwrpriv->bInternalAutoSuspend = _FALSE;
pwrpriv->bAutoResume=_FALSE;
DBG_871X("pwrpriv->bAutoResume (%x) pwrpriv->bInternalAutoSuspend(%x)\n",pwrpriv->bAutoResume,pwrpriv->bInternalAutoSuspend );
}
@@ -1174,24 +1353,6 @@ int rtw_resume_process(_adapter *padapter)
pwrpriv->bInternalAutoSuspend = _FALSE;
#endif //#ifdef CONFIG_BT_COEXIST
pwrpriv->brfoffbyhw = _FALSE;
- {
- DBG_871X("enc_algorithm(%x),wepkeymask(%x)\n",
- padapter->securitypriv.dot11PrivacyAlgrthm,pwrpriv->wepkeymask);
- if( (_WEP40_ == padapter->securitypriv.dot11PrivacyAlgrthm) ||
- (_WEP104_ == padapter->securitypriv.dot11PrivacyAlgrthm))
- {
- sint keyid;
-
- for(keyid=0;keyid<4;keyid++){
- if(pwrpriv->wepkeymask & BIT(keyid)) {
- if(keyid == padapter->securitypriv.dot11PrivacyKeyIndex)
- rtw_set_key(padapter,&padapter->securitypriv, keyid, 1);
- else
- rtw_set_key(padapter,&padapter->securitypriv, keyid, 0);
- }
- }
- }
- }
}
#endif
_exit_pwrlock(&pwrpriv->lock);
@@ -1199,11 +1360,7 @@ int rtw_resume_process(_adapter *padapter)
if( padapter->pid[1]!=0) {
DBG_871X("pid[1]:%d\n",padapter->pid[1]);
rtw_signal_process(padapter->pid[1], SIGUSR2);
- }
-
- #ifdef CONFIG_LAYER2_ROAMING_RESUME
- rtw_roaming(padapter, NULL);
- #endif
+ }
ret = 0;
exit:
@@ -1223,7 +1380,7 @@ exit:
#ifdef CONFIG_AUTOSUSPEND
void autosuspend_enter(_adapter* padapter)
{
- struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
DBG_871X("==>autosuspend_enter...........\n");
@@ -1279,7 +1436,7 @@ void autosuspend_enter(_adapter* padapter)
int autoresume_enter(_adapter* padapter)
{
int result = _SUCCESS;
- struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
struct security_priv* psecuritypriv=&(padapter->securitypriv);
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
@@ -1447,13 +1604,13 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
#ifdef CONFIG_PM
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
- if(padapter->pwrctrlpriv.bSupportRemoteWakeup)
+ if(adapter_to_pwrctl(padapter)->bSupportRemoteWakeup)
{
dvobj->pusbdev->do_remote_wakeup=1;
pusb_intf->needs_remote_wakeup = 1;
device_init_wakeup(&pusb_intf->dev, 1);
- DBG_871X("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n");
- DBG_871X("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev));
+ DBG_871X("\n pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n");
+ DBG_871X("\n pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev));
}
#endif
#endif
@@ -1493,7 +1650,7 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
}
#endif
#ifdef CONFIG_BT_COEXIST
- padapter->pwrctrlpriv.autopm_cnt=1;
+ adapter_to_pwrctl(padapter)->autopm_cnt=1;
#endif
// set mac addr
@@ -1538,6 +1695,7 @@ static void rtw_usb_if1_deinit(_adapter *if1)
{
struct net_device *pnetdev = if1->pnetdev;
struct mlme_priv *pmlmepriv= &if1->mlmepriv;
+ struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(if1);
if(check_fwstate(pmlmepriv, _FW_LINKED))
rtw_disassoc_cmd(if1, 0, _FALSE);
@@ -1549,18 +1707,18 @@ static void rtw_usb_if1_deinit(_adapter *if1)
hostapd_mode_unload(if1);
#endif
#endif
-
+/*
if(if1->DriverState != DRIVER_DISAPPEAR) {
if(pnetdev) {
unregister_netdev(pnetdev); //will call netdev_close()
rtw_proc_remove_one(pnetdev);
}
}
-
+*/
rtw_cancel_all_timer(if1);
#ifdef CONFIG_WOWLAN
- if1->pwrctrlpriv.wowlan_mode=_FALSE;
+ pwrctl->wowlan_mode=_FALSE;
#endif //CONFIG_WOWLAN
rtw_dev_unload(if1);
@@ -1572,13 +1730,13 @@ static void rtw_usb_if1_deinit(_adapter *if1)
#ifdef CONFIG_IOCTL_CFG80211
if(if1->rtw_wdev)
{
- rtw_wdev_unregister(if1->rtw_wdev);
+ //rtw_wdev_unregister(if1->rtw_wdev);
rtw_wdev_free(if1->rtw_wdev);
}
#endif
#ifdef CONFIG_BT_COEXIST
- if(1 == if1->pwrctrlpriv.autopm_cnt){
+ if(1 == pwrctl->autopm_cnt){
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))
usb_autopm_put_interface(adapter_to_dvobj(if1)->pusbintf);
#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))
@@ -1586,7 +1744,7 @@ static void rtw_usb_if1_deinit(_adapter *if1)
#else
usb_autosuspend_device(adapter_to_dvobj(if1)->pusbdev, 1);
#endif
- if1->pwrctrlpriv.autopm_cnt --;
+ pwrctl->autopm_cnt --;
}
#endif
@@ -1804,7 +1962,7 @@ free_dvobj:
exit:
return status == _SUCCESS?0:-ENODEV;
}
-
+extern void rtw_unregister_netdevs(struct dvobj_priv *dvobj);
/*
* dev_remove() - our device is being removed
*/
@@ -1820,7 +1978,9 @@ _func_enter_;
DBG_871X("+rtw_dev_remove\n");
RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+dev_remove()\n"));
-
+ dvobj->processing_dev_remove = _TRUE;
+ rtw_unregister_netdevs(dvobj);
+
if(usb_drv->drv_registered == _TRUE)
{
//DBG_871X("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n");
@@ -1836,7 +1996,7 @@ _func_enter_;
MPT_DeInitAdapter(padapter);
#endif
#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
- rtw_unregister_early_suspend(&padapter->pwrctrlpriv);
+ rtw_unregister_early_suspend(dvobj_to_pwrctl(dvobj));
#endif
rtw_pm_set_ips(padapter, IPS_NONE);
@@ -1864,9 +2024,6 @@ _func_enter_;
rtw_sw_export=NULL;
#endif
- #ifdef DBG_MEM_ALLOC
- rtw_dump_mem_stat ();
- #endif
_func_exit_;
return;
@@ -1900,7 +2057,7 @@ static int __init rtw_drv_entry(void)
#endif //CONFIG_RTL8723A
#endif //CONFIG_PLATFORM_ARM_SUNxI
-#ifdef CONFIG_PLATFORM_ARM_SUN6I
+#if defined CONFIG_PLATFORM_ARM_SUN6I
script_item_value_type_e type;
type = script_get_item("wifi_para", "wifi_usbc_id", &item);
@@ -1912,8 +2069,11 @@ static int __init rtw_drv_entry(void)
printk("sw_usb_enable_hcd: usbc_num = %d\n", item.val);
wifi_pm_power(1);
mdelay(10);
+
+ #ifndef CONFIG_RTL8723A
sw_usb_enable_hcd(item.val);
-#endif //CONFIG_PLATFORM_ARM_SUN6I
+ #endif
+#endif // defined CONFIG_PLATFORM_ARM_SUN6I && !(defined CONFIG_RTL8723A)
RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n"));
@@ -1933,9 +2093,7 @@ static int __init rtw_drv_entry(void)
static void __exit rtw_drv_halt(void)
{
RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n"));
- DBG_871X("+rtw_drv_halt\n");
-
- rtw_suspend_lock_uninit();
+ DBG_871X("+rtw_drv_halt\n");
usb_drv->drv_registered = _FALSE;
usb_deregister(&usb_drv->usbdrv);
@@ -1947,12 +2105,17 @@ static void __exit rtw_drv_halt(void)
#endif //ifndef CONFIG_RTL8723A
#endif //CONFIG_PLATFORM_ARM_SUNxI
-#ifdef CONFIG_PLATFORM_ARM_SUN6I
+#if defined CONFIG_PLATFORM_ARM_SUN6I
+ #ifndef CONFIG_RTL8723A
sw_usb_disable_hcd(item.val);
+ #endif
wifi_pm_power(0);
-#endif
+#endif // defined CONFIG_PLATFORM_ARM_SUN6I && !(defined CONFIG_RTL8723A)
+ rtw_suspend_lock_uninit();
DBG_871X("-rtw_drv_halt\n");
+
+ rtw_mstat_dump();
}