/* ======================================================================== Routine Description: Release allocated resources. Arguments: *dev Point to the PCI or USB device pAd driver control block pointer Return Value: None Note: ======================================================================== */ static void rt2870_disconnect(struct usb_device *dev, struct rt_rtmp_adapter *pAd) { DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n", dev->bus->bus_name, dev->devpath)); if (!pAd) { usb_put_dev(dev); printk("rtusb_disconnect: pAd == NULL!\n"); return; } RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); /* for debug, wait to show some messages to /proc system */ udelay(1); RtmpPhyNetDevExit(pAd, pAd->net_dev); /* FIXME: Shall we need following delay and flush the schedule?? */ udelay(1); flush_scheduled_work(); udelay(1); /* free the root net_device */ RtmpOSNetDevFree(pAd->net_dev); RtmpRaDevCtrlExit(pAd); /* release a use of the usb device structure */ usb_put_dev(dev); udelay(1); DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n")); }
static VOID __devexit rt2860_remove_one( IN struct pci_dev *pci_dev) { PNET_DEV net_dev = pci_get_drvdata(pci_dev); RTMP_ADAPTER *pAd = NULL; ULONG csr_addr = net_dev->base_addr; // pAd->CSRBaseAddress; GET_PAD_FROM_NET_DEV(pAd, net_dev); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); if (pAd != NULL) { // Unregister/Free all allocated net_device. RtmpPhyNetDevExit(pAd, net_dev); // Unmap CSR base address iounmap((char *)(csr_addr)); // release memory region release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); #ifdef RT_CFG80211_SUPPORT CFG80211_UnRegister(pAd, net_dev); #endif // RT_CFG80211_SUPPORT // #ifdef CREDENTIAL_STORE NdisFreeSpinLock(&pAd->StaCtIf.Lock); #endif /* CREDENTIAL_STORE */ // Free RTMP_ADAPTER related structures. RtmpRaDevCtrlExit(pAd); } else { // Unregister network device RtmpOSNetDevDetach(net_dev); // Unmap CSR base address iounmap((char *)(net_dev->base_addr)); // release memory region release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } // Free the root net_device RtmpOSNetDevFree(net_dev); #ifdef VENDOR_FEATURE4_SUPPORT { extern ULONG OS_NumOfMemAlloc, OS_NumOfMemFree; DBGPRINT(RT_DEBUG_TRACE, ("OS_NumOfMemAlloc = %ld, OS_NumOfMemFree = %ld\n", OS_NumOfMemAlloc, OS_NumOfMemFree)); } #endif // VENDOR_FEATURE4_SUPPORT // }
/* ======================================================================== Routine Description: Release allocated resources. Arguments: *dev Point to the PCI or USB device pAd driver control block pointer Return Value: None Note: ======================================================================== */ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd) { DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n", dev->bus->bus_name, dev->devpath)); if (!pAd) { #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */ while(MOD_IN_USE > 0) { MOD_DEC_USE_COUNT; } #else usb_put_dev(dev); #endif // LINUX_VERSION_CODE // printk("rtusb_disconnect: pAd == NULL!\n"); return; } RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); // for debug, wait to show some messages to /proc system udelay(1); RtmpPhyNetDevExit(pAd, pAd->net_dev); // FIXME: Shall we need following delay and flush the schedule?? udelay(1); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */ #else flush_scheduled_work(); #endif // LINUX_VERSION_CODE // udelay(1); // free the root net_device RtmpOSNetDevFree(pAd->net_dev); #ifdef RT_CFG80211_SUPPORT CFG80211_UnRegister(pAd, pAd->net_dev); #endif // RT_CFG80211_SUPPORT // RtmpRaDevCtrlExit(pAd); // release a use of the usb device structure #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */ while(MOD_IN_USE > 0) { MOD_DEC_USE_COUNT; } #else usb_put_dev(dev); #endif // LINUX_VERSION_CODE // udelay(1); DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n")); }
static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev) { PNET_DEV net_dev = pci_get_drvdata(pci_dev); VOID *pAd = NULL; ULONG csr_addr = net_dev->base_addr; GET_PAD_FROM_NET_DEV(pAd, net_dev); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); if (pAd != NULL) { /* Unregister/Free all allocated net_device. */ RtmpPhyNetDevExit(pAd, net_dev); #ifdef RT_CFG80211_SUPPORT RTMP_DRIVER_80211_UNREGISTER(pAd, net_dev); #endif /* RT_CFG80211_SUPPORT */ /* Free RTMP_ADAPTER related structures. */ RtmpRaDevCtrlExit(pAd); /* Unmap CSR base address */ iounmap((char *)(csr_addr)); /* release memory region */ release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } else { /* Unregister network device */ RtmpOSNetDevDetach(net_dev); /* Unmap CSR base address */ iounmap((char *)(net_dev->base_addr)); /* release memory region */ release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } /* Free the root net_device */ RtmpOSNetDevFree(net_dev); wl_proc_exit(); }
static VOID __devexit rt2860_remove_one( IN struct pci_dev *pci_dev) { PNET_DEV net_dev = pci_get_drvdata(pci_dev); RTMP_ADAPTER *pAd = NULL; ULONG csr_addr = net_dev->base_addr; // pAd->CSRBaseAddress; GET_PAD_FROM_NET_DEV(pAd, net_dev); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); if (pAd != NULL) { // Unregister/Free all allocated net_device. RtmpPhyNetDevExit(pAd, net_dev); // Unmap CSR base address iounmap((char *)(csr_addr)); // release memory region release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); #ifdef RT_CFG80211_SUPPORT CFG80211_UnRegister(pAd, net_dev); #endif // RT_CFG80211_SUPPORT // // Free RTMP_ADAPTER related structures. RtmpRaDevCtrlExit(pAd); } else { // Unregister network device RtmpOSNetDevDetach(net_dev); // Unmap CSR base address iounmap((char *)(net_dev->base_addr)); // release memory region release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } // Free the root net_device RtmpOSNetDevFree(net_dev); }
static VOID DEVEXIT rt_pci_remove(struct pci_dev *pci_dev) { PNET_DEV net_dev = pci_get_drvdata(pci_dev); VOID *pAd = NULL; ULONG csr_addr = net_dev->base_addr; GET_PAD_FROM_NET_DEV(pAd, net_dev); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("===> %s()\n", __FUNCTION__)); if (pAd != NULL) { /* Unregister/Free all allocated net_device. */ RtmpPhyNetDevExit(pAd, net_dev); #ifdef RT_CFG80211_SUPPORT RTMP_DRIVER_80211_UNREGISTER(pAd, net_dev); #endif /* RT_CFG80211_SUPPORT */ /* Free RTMP_ADAPTER related structures. */ RtmpRaDevCtrlExit(pAd); /* Unmap CSR base address */ iounmap((char *)(csr_addr)); /* release memory region */ release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } else { /* Unregister network device */ RtmpOSNetDevDetach(net_dev); /* Unmap CSR base address */ iounmap((char *)(net_dev->base_addr)); /* release memory region */ release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } /* Free the root net_device */ RtmpOSNetDevFree(net_dev); }
VOID rt2880_module_exit(VOID) { struct net_device *net_dev = rt2880_dev; RTMP_ADAPTER *pAd; if (net_dev == NULL) return; pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); if (pAd != NULL) { #ifdef WLAN_LED //extern RALINK_TIMER_STRUCT LedCheckTimer; //extern unsigned char CheckTimerEbl; { BOOLEAN Cancelled; RTMPCancelTimer(&LedCheckTimer, &Cancelled); CheckTimerEbl=0; } #endif // WLAN_LED // RtmpPhyNetDevExit(pAd, net_dev); RtmpRaDevCtrlExit(pAd); } else { RtmpOSNetDevDetach(net_dev); } // Free the root net_device. RtmpOSNetDevFree(net_dev); #if defined(CONFIG_RA_CLASSIFIER)&&(!defined(CONFIG_RA_CLASSIFIER_MODULE)) proc_ptr = proc_ralink_wl_video; if(ra_classifier_release_func!=NULL) ra_classifier_release_func(); #endif wl_proc_exit(); }
static void __devexit rt2860_remove_one(IN struct pci_dev *pci_dev) { struct net_device *net_dev = pci_get_drvdata(pci_dev); struct rt_rtmp_adapter *pAd = NULL; unsigned long csr_addr = net_dev->base_addr; /* pAd->CSRBaseAddress; */ GET_PAD_FROM_NET_DEV(pAd, net_dev); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); if (pAd != NULL) { /* Unregister/Free all allocated net_device. */ RtmpPhyNetDevExit(pAd, net_dev); /* Unmap CSR base address */ iounmap((char *)(csr_addr)); /* release memory region */ release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); /* Free struct rt_rtmp_adapter related structures. */ RtmpRaDevCtrlExit(pAd); } else { /* Unregister network device */ RtmpOSNetDevDetach(net_dev); /* Unmap CSR base address */ iounmap((char *)(net_dev->base_addr)); /* release memory region */ release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } /* Free the root net_device */ RtmpOSNetDevFree(net_dev); }
static VOID __devexit rt2860_remove_one( IN struct pci_dev *pci_dev) { PNET_DEV net_dev = pci_get_drvdata(pci_dev); RTMP_ADAPTER *pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); ULONG csr_addr = net_dev->base_addr; DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); if (pAd != NULL) { RtmpPhyNetDevExit(pAd, net_dev); iounmap((char *)(csr_addr)); release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); RtmpRaDevCtrlExit(pAd); } else { RtmpOSNetDevDetach(net_dev); iounmap((char *)(net_dev->base_addr)); release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); } RtmpOSNetDevFree(net_dev); }
/* ======================================================================== Routine Description: Release allocated resources. Arguments: *dev Point to the PCI or USB device pAd driver control block pointer Return Value: None Note: ======================================================================== */ static void rt2870_disconnect(struct usb_device *dev, VOID *pAd) { struct net_device *net_dev; DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n", dev->bus->bus_name, dev->devpath)); if (!pAd) { #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */ while(MOD_IN_USE > 0) { MOD_DEC_USE_COUNT; } #else usb_put_dev(dev); #endif /* LINUX_VERSION_CODE */ printk("rtusb_disconnect: pAd == NULL!\n"); return; } /* RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); */ RTMP_DRIVER_NIC_NOT_EXIST_SET(pAd); /* for debug, wait to show some messages to /proc system */ udelay(1); RTMP_DRIVER_NET_DEV_GET(pAd, &net_dev); RtmpPhyNetDevExit(pAd, net_dev); /* FIXME: Shall we need following delay and flush the schedule?? */ udelay(1); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */ #else flush_scheduled_work(); #endif /* LINUX_VERSION_CODE */ udelay(1); #ifdef CONFIG_HAS_EARLYSUSPEND RTMP_DRIVER_ADAPTER_UNREGISTER_EARLYSUSPEND(pAd); #endif #ifdef RT_CFG80211_SUPPORT RTMP_DRIVER_80211_UNREGISTER(pAd, net_dev); #endif /* RT_CFG80211_SUPPORT */ /* free the root net_device */ // RtmpOSNetDevFree(net_dev); RtmpRaDevCtrlExit(pAd); /* free the root net_device */ RtmpOSNetDevFree(net_dev); /* release a use of the usb device structure */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */ while(MOD_IN_USE > 0) { MOD_DEC_USE_COUNT; } #else usb_put_dev(dev); #endif /* LINUX_VERSION_CODE */ udelay(1); DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n")); }