/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ======================================================================== */ NDIS_STATUS RTUSBEnqueueInternalCmd( IN PRTMP_ADAPTER pAd, IN NDIS_OID Oid, IN PVOID pInformationBuffer, IN UINT32 InformationBufferLength) { NDIS_STATUS status; PCmdQElmt cmdqelmt = NULL; status = RTMPAllocateMemory((PVOID *)&cmdqelmt, sizeof(CmdQElmt)); if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL)) return (NDIS_STATUS_RESOURCES); NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt)); if(InformationBufferLength > 0) { status = RTMPAllocateMemory((PVOID *)&cmdqelmt->buffer, InformationBufferLength); if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL)) { NdisFreeMemory(cmdqelmt, sizeof(CmdQElmt), 0); return (NDIS_STATUS_RESOURCES); } else { NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength); cmdqelmt->bufferlength = InformationBufferLength; } } else { cmdqelmt->buffer = NULL; cmdqelmt->bufferlength = 0; } cmdqelmt->command = Oid; cmdqelmt->CmdFromNdis = FALSE; if (cmdqelmt != NULL) { NdisAcquireSpinLock(&pAd->CmdQLock); if (pAd->CmdQ.CmdQState & RT2870_THREAD_CAN_DO_INSERT) { EnqueueCmd((&pAd->CmdQ), cmdqelmt); status = NDIS_STATUS_SUCCESS; } else { status = NDIS_STATUS_FAILURE; } NdisReleaseSpinLock(&pAd->CmdQLock); if (status == NDIS_STATUS_FAILURE) { if (cmdqelmt->buffer) NdisFreeMemory(cmdqelmt->buffer, cmdqelmt->bufferlength, 0); NdisFreeMemory(cmdqelmt, sizeof(CmdQElmt), 0); } else RTUSBCMDUp(pAd); } return(NDIS_STATUS_SUCCESS); }
/* ======================================================================== Routine Description: Arguments: Return Value: IRQL = Note: ======================================================================== */ NDIS_STATUS RTUSBEnqueueCmdFromNdis( IN PRTMP_ADAPTER pAd, IN NDIS_OID Oid, IN BOOLEAN SetInformation, IN PVOID pInformationBuffer, IN UINT32 InformationBufferLength) { NDIS_STATUS status; PCmdQElmt cmdqelmt = NULL; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; #ifndef RT30xx CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) #endif #ifdef RT30xx if (pObj->RTUSBCmdThr_pid < 0) #endif return (NDIS_STATUS_RESOURCES); status = RTMPAllocateMemory((PVOID *)&cmdqelmt, sizeof(CmdQElmt)); if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL)) return (NDIS_STATUS_RESOURCES); cmdqelmt->buffer = NULL; if (pInformationBuffer != NULL) { status = RTMPAllocateMemory((PVOID *)&cmdqelmt->buffer, InformationBufferLength); if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL)) { kfree(cmdqelmt); return (NDIS_STATUS_RESOURCES); } else { NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength); cmdqelmt->bufferlength = InformationBufferLength; } } else cmdqelmt->bufferlength = 0; cmdqelmt->command = Oid; cmdqelmt->CmdFromNdis = TRUE; if (SetInformation == TRUE) cmdqelmt->SetOperation = TRUE; else cmdqelmt->SetOperation = FALSE; NdisAcquireSpinLock(&pAd->CmdQLock); if (pAd->CmdQ.CmdQState & RT2870_THREAD_CAN_DO_INSERT) { EnqueueCmd((&pAd->CmdQ), cmdqelmt); status = NDIS_STATUS_SUCCESS; } else { status = NDIS_STATUS_FAILURE; } NdisReleaseSpinLock(&pAd->CmdQLock); if (status == NDIS_STATUS_FAILURE) { if (cmdqelmt->buffer) NdisFreeMemory(cmdqelmt->buffer, cmdqelmt->bufferlength, 0); NdisFreeMemory(cmdqelmt, sizeof(CmdQElmt), 0); } else RTUSBCMDUp(pAd); return(NDIS_STATUS_SUCCESS); }
static int usb_rtusb_close_device( IN PRTMP_ADAPTER pAd) { int i = 0; int ret; DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); DECLARE_WAITQUEUE (wait, current); DBGPRINT(RT_DEBUG_TRACE, "-->usb_rtusb_close_device \n"); // ensure there are no more active urbs. add_wait_queue (&unlink_wakeup, &wait); pAd->wait = &unlink_wakeup; // maybe wait for deletions to finish. while ((i < 25) && atomic_read(&pAd->PendingRx) > 0) { #if LINUX_VERSION_CODE >KERNEL_VERSION(2,6,9) msleep(UNLINK_TIMEOUT_MS); #endif i++; } pAd->wait = NULL; remove_wait_queue (&unlink_wakeup, &wait); if (pAd->MLMEThr_pid >= 0) { mlme_kill = 1; RTUSBMlmeUp(pAd); wmb(); // need to check ret = KILL_THREAD_PID (pAd->MLMEThr_pid, SIGTERM, 1); if (ret) { printk (KERN_WARNING "%s: unable to Mlme thread \n", pAd->net_dev->name); } wait_for_completion (&pAd->MlmeThreadNotify); // reset mlme thread pAd->MLMEThr_pid = THREAD_PID_INIT_VALUE; } if (pAd->RTUSBCmdThr_pid>= 0) { RTUSBCmd_kill = 1; RTUSBCMDUp(pAd); wmb(); // need to check ret = KILL_THREAD_PID (pAd->RTUSBCmdThr_pid, SIGTERM, 1); if (ret) { printk (KERN_WARNING "%s: unable to RTUSBCmd thread \n", pAd->net_dev->name); } wait_for_completion (&pAd->CmdThreadNotify); // reset cmd thread pAd->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE; } RTUSBHalt(pAd, TRUE); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); tasklet_kill(&pAd->rx_bh); DBGPRINT(RT_DEBUG_TRACE,"<--usb_rtusb_close_device \n"); return 0; }