📄 rtusb_bulk.c
字号:
IN PRTMP_ADAPTER pAd, IN PTX_CONTEXT pTxContext, IN UCHAR BulkOutPipeId, IN usb_complete_t Func){ PURB pUrb; PUCHAR pSrc = NULL; pUrb = pTxContext->pUrb; ASSERT(pUrb); // Store BulkOut PipeId pTxContext->BulkOutPipeId = BulkOutPipeId; pSrc = (PUCHAR) &pTxContext->TransferBuffer->TxDesc; //Initialize a tx bulk urb RTusb_fill_bulk_urb(pUrb, pAd->pUsb_Dev, usb_sndbulkpipe(pAd->pUsb_Dev, 1), pSrc, pTxContext->BulkOutSize, Func, pTxContext);}VOID RTUSBInitRxDesc( IN PRTMP_ADAPTER pAd, IN PRX_CONTEXT pRxContext){ PURB pUrb; pUrb = pRxContext->pUrb; ASSERT(pUrb); //Initialize a rx bulk urb RTusb_fill_bulk_urb(pUrb, pAd->pUsb_Dev, usb_rcvbulkpipe(pAd->pUsb_Dev, 1), pRxContext->TransferBuffer, BUFFER_SIZE, RTUSBBulkRxComplete, pRxContext);}/* ======================================================================== Routine Description: Admit one URB for transmit. This routine submits one URB at a time, even though there may be multiple entries in the Tx ring. Arguments: Return Value: Note: TODO: Make sure Ralink's controller doesn't blow up before we try to change this to enqueue multiple URBs - bb. ========================================================================*/VOID RTUSBBulkOutDataPacket( IN PRTMP_ADAPTER pAd, IN UCHAR BulkOutPipeId, IN UCHAR Index){ PTX_CONTEXT pTxContext; PURB pUrb; int ret = 0; unsigned long flags; NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); if (pAd->BulkOutPending[BulkOutPipeId] == TRUE) { NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); return; } pAd->BulkOutPending[BulkOutPipeId] = TRUE; NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); pTxContext = &(pAd->TxContext[BulkOutPipeId][Index]); // Increase Total transmit byte counter pAd->RalinkCounters.TransmittedByteCount += pTxContext->BulkOutSize; // Clear Data flag RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)); RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); if (pTxContext->bWaitingBulkOut != TRUE) { DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, " "bWaitingBulkOut != TRUE, Index %d, NextBulkOutIndex %d\n", Index, pAd->NextBulkOutIndex[BulkOutPipeId]); NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); pAd->BulkOutPending[BulkOutPipeId] = FALSE; NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); return; } else if (pTxContext->BulkOutSize == 0) { // // This may happen on CCX Leap Ckip or Cmic // When the Key was been set not on time. // We will break it when the Key was Zero on RTUSBHardTransmit // And this will cause deadlock that the TxContext always InUse. // DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, " "BulkOutSize==0\n"); NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); FREE_TX_RING(pAd, BulkOutPipeId, pTxContext); pAd->TxRingTotalNumber[BulkOutPipeId]--; // sync. to PendingTx pAd->BulkOutPending[BulkOutPipeId] = FALSE; NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); return; } else if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && !(pAd->PortCfg.BssType == BSS_MONITOR && pAd->bAcceptRFMONTx==TRUE)) { // // There is no connection, so we need to empty the Tx Bulk out Ring. // DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, " "Media Disconnected NextBulkOutIndex %d, NextIndex=%d\n", pAd->NextBulkOutIndex[BulkOutPipeId], pAd->NextTxIndex[BulkOutPipeId]); while (pTxContext->InUse != FALSE) { FREE_TX_RING(pAd, BulkOutPipeId, pTxContext); pAd->TxRingTotalNumber[BulkOutPipeId]--; // sync. to PendingTx pTxContext = nextTxContext(pAd, BulkOutPipeId); } NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); pAd->BulkOutPending[BulkOutPipeId] = FALSE; NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]); return; } // Init Tx context descriptor RTUSBInitTxDesc(pAd, pTxContext, BulkOutPipeId, RTUSBBulkOutDataPacketComplete); pTxContext->IRPPending = TRUE; pUrb = pTxContext->pUrb; if((ret = rtusb_submit_urb(pUrb))!=0) { DBGPRINT(RT_DEBUG_ERROR, "- %s: Submit Tx URB failed %d\n", __FUNCTION__, ret); return; } else { atomic_inc(&pAd->PendingTx); } DBGPRINT(RT_DEBUG_TRACE, "<-- RTUSBBulkOutDataPacket \n"); return;}/* ======================================================================== Routine Description: Arguments: Return Value: Note: NULL frame use BulkOutPipeId = 0 ========================================================================*/VOID RTUSBBulkOutNullFrame( IN PRTMP_ADAPTER pAd){ PTX_CONTEXT pNullContext = &(pAd->NullContext); PURB pUrb; int ret = 0; unsigned long flags; NdisAcquireSpinLock(&pAd->BulkOutLock[0]); if (pAd->BulkOutPending[0] == TRUE) { NdisReleaseSpinLock(&pAd->BulkOutLock[0]); return; } pAd->BulkOutPending[0] = TRUE; NdisReleaseSpinLock(&pAd->BulkOutLock[0]); // Increase Total transmit byte counter pAd->RalinkCounters.TransmittedByteCount += pNullContext->BulkOutSize; DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutNullFrame \n"); // Clear Null frame bulk flag RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL); // Init Tx context descriptor RTUSBInitTxDesc(pAd, pNullContext, 0, RTUSBBulkOutNullFrameComplete); pNullContext->IRPPending = TRUE; pUrb = pNullContext->pUrb; if((ret = rtusb_submit_urb(pUrb))!=0) { DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret); return; } else { atomic_inc(&pAd->PendingTx); } DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutNullFrame PendingTx=%d\n", atomic_read(&pAd->PendingTx)); return;}/* ======================================================================== Routine Description: Arguments: Return Value: Note: Apparently not called - bb. ========================================================================*/VOID RTUSBBulkOutRTSFrame( IN PRTMP_ADAPTER pAd){ PTX_CONTEXT pRTSContext = &(pAd->RTSContext); PURB pUrb; int ret = 0; unsigned long flags; UCHAR PipeID=0; if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4)) PipeID= 3; else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3)) PipeID= 2; else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2)) PipeID= 1; else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL)) PipeID= 0; NdisAcquireSpinLock(&pAd->BulkOutLock[PipeID]); if (pAd->BulkOutPending[PipeID] == TRUE) { NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID]); return; } pAd->BulkOutPending[PipeID] = TRUE; NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID]); // Increase Total transmit byte counter pAd->RalinkCounters.TransmittedByteCount += pRTSContext->BulkOutSize; DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutRTSFrame \n"); // Clear RTS frame bulk flag RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_RTS); // Init Tx context descriptor RTUSBInitTxDesc(pAd, pRTSContext, PipeID, RTUSBBulkOutRTSFrameComplete); pRTSContext->IRPPending = TRUE; pUrb = pRTSContext->pUrb; if((ret = rtusb_submit_urb(pUrb))!=0) { DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret); return; } else { atomic_inc(&pAd->PendingTx); } DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutRTSFrame \n"); return;}/* ======================================================================== Routine Description: Arguments: Return Value: Note: MLME use BulkOutPipeId = 0 ========================================================================*/VOID RTUSBBulkOutMLMEPacket( IN PRTMP_ADAPTER pAd, IN UCHAR Index){ PTX_CONTEXT pMLMEContext; PURB pUrb; int ret = 0; unsigned long flags; pMLMEContext = &pAd->MLMEContext[Index]; NdisAcquireSpinLock(&pAd->BulkOutLock[0]); if (pAd->BulkOutPending[0] == TRUE) { NdisReleaseSpinLock(&pAd->BulkOutLock[0]); return; } pAd->BulkOutPending[0] = TRUE; NdisReleaseSpinLock(&pAd->BulkOutLock[0]); DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutMLMEPacket\n"); // Increase Total transmit byte counter pAd->RalinkCounters.TransmittedByteCount += pMLMEContext->BulkOutSize; // Clear MLME bulk flag RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);#if 0 DBGPRINT(RT_DEBUG_INFO, "RTUSBBulkOutMLMEPacket::PrioRingFirstIndex = %d, PrioRingTxCnt = %d, PopMgmtIndex = %d, PushMgmtIndex = %d, NextMLMEIndex = %d\n", pAd->PrioRingFirstIndex, pAd->PrioRingTxCnt, pAd->PopMgmtIndex, pAd->PushMgmtIndex, pAd->NextMLMEIndex);#endif // Init Tx context descriptor RTUSBInitTxDesc(pAd, pMLMEContext, 0, RTUSBBulkOutMLMEPacketComplete); pMLMEContext->IRPPending = TRUE; pUrb = pMLMEContext->pUrb; if((ret = rtusb_submit_urb(pUrb))!=0) { DBGPRINT(RT_DEBUG_ERROR,"Submit MLME URB failed %d\n", ret); return; } else { atomic_inc(&pAd->PendingTx); } DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutMLMEPacket \n"); return;}/* ======================================================================== Routine Description: Arguments: Return Value: Note: PsPoll use BulkOutPipeId = 0 ========================================================================*/VOID RTUSBBulkOutPsPoll( IN PRTMP_ADAPTER pAd){ PTX_CONTEXT pPsPollContext = &(pAd->PsPollContext); PURB pUrb; int ret = 0; unsigned long flags; NdisAcquireSpinLock(&pAd->BulkOutLock[0]); if (pAd->BulkOutPending[0] == TRUE) { NdisReleaseSpinLock(&pAd->BulkOutLock[0]); return; } pAd->BulkOutPending[0] = TRUE; NdisReleaseSpinLock(&pAd->BulkOutLock[0]); DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutPsPoll \n"); // Clear PS-Poll bulk flag RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL); // Init Tx context descriptor RTUSBInitTxDesc(pAd, pPsPollContext, 0, RTUSBBulkOutPsPollComplete); pPsPollContext->IRPPending = TRUE; pUrb = pPsPollContext->pUrb; if((ret = rtusb_submit_urb(pUrb))!=0) { DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret); return; } else { atomic_inc(&pAd->PendingTx); } DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutPsPoll \n"); return;}/* ======================================================================== Routine Description: USB_RxPacket initializes a URB and uses the Rx IRP to submit it to USB. It checks if an Rx Descriptor is available and passes the the coresponding buffer to be filled. If no descriptor is available fails the request. When setting the completion routine we pass our Adapter Object as Context. Arguments: Return Value: TRUE found matched tuple cache FALSE no matched found Note: ========================================================================*/VOID RTUSBBulkReceive( IN PRTMP_ADAPTER pAd){ PRX_CONTEXT pRxContext; PURB pUrb; int ret = 0; DBGPRINT(RT_DEBUG_TRACE,"RTUSBBulkReceive:: pAd->NextRxBulkInIndex = %d\n", pAd->NextRxBulkInIndex); if ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS))) { DBGPRINT(RT_DEBUG_INFO,"RTUSBBulkReceive:: can't start\n"); return; } pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]); if (pRxContext->InUse == FALSE) { // Init Rx context descriptor memset(pRxContext->TransferBuffer, 0, BUFFER_SIZE); RTUSBInitRxDesc(pAd, pRxContext); pUrb = pRxContext->pUrb; atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCELABLE); // s/w timing if((ret = rtusb_submit_urb(pUrb)) == 0) { pRxContext->InUse = TRUE; atomic_inc(&pAd->PendingRx); pAd->NextRxBulkInIndex = (pAd->NextRxBulkInIndex+1) % RX_RING_SIZE; } else { // -EPIPE -> disconnected atomic_set(&pRxContext->IrpLock, IRPLOCK_COMPLETED); } DBGPRINT(RT_DEBUG_TRACE,"<-- %s: Submit Rx URB ret=%d\n", __FUNCTION__, ret); } else { DBGPRINT(RT_DEBUG_TRACE,"<-- %s (Rx Ring full)\n", __FUNCTION__); } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -