📄 rtusb_bulk.c
字号:
#endif
}
VOID RTUSBInitTxDesc(
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:
Arguments:
Return Value:
Note:
========================================================================
*/
VOID RTUSBBulkOutDataPacket(
IN PRTMP_ADAPTER pAd,
IN UCHAR BulkOutPipeId,
IN UCHAR Index)
{
PTX_CONTEXT pTxContext;
PURB pUrb;
int ret = 0;
unsigned long IrqFlags;
NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
if (pAd->BulkOutPending[BulkOutPipeId] == TRUE)
{
NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
return;
}
pAd->BulkOutPending[BulkOutPipeId] = TRUE;
NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
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, pTxContext->bWaitingBulkOut != TRUE, Index %d, NextBulkOutIndex %d\n",
Index, pAd->NextBulkOutIndex[BulkOutPipeId]);
NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
pAd->BulkOutPending[BulkOutPipeId] = FALSE;
NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
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.
//
NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
pTxContext->InUse = FALSE;
pTxContext->LastOne = FALSE;
pTxContext->IRPPending = FALSE;
pTxContext->bWaitingBulkOut = FALSE;
pTxContext->BulkOutSize= 0;
pAd->NextBulkOutIndex[BulkOutPipeId] = (pAd->NextBulkOutIndex[BulkOutPipeId] + 1) % TX_RING_SIZE;
pAd->BulkOutPending[BulkOutPipeId] = FALSE;
NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
return;
}
else if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
{
//
// Since there is no connection, so we need to empty the Tx Bulk out Ring.
//
while (atomic_read(&pAd->TxCount) > 0)
{
DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, snice NdisMediaStateDisconnected discard NextBulkOutIndex %d, NextIndex = %d\n",
pAd->NextBulkOutIndex[BulkOutPipeId], pAd->NextTxIndex[BulkOutPipeId]);
FREE_TX_RING(pAd, BulkOutPipeId, pTxContext);
pAd->TxRingTotalNumber[BulkOutPipeId]--; // sync. to TxCount
pTxContext = &(pAd->TxContext[BulkOutPipeId][pAd->NextBulkOutIndex[BulkOutPipeId]]);
}
NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
pAd->BulkOutPending[BulkOutPipeId] = FALSE;
NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
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, "Submit Tx URB failed %d\n", ret);
return;
}
DBGPRINT_RAW(RT_DEBUG_INFO, "<---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 IrqFlags;
NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);
if (pAd->BulkOutPending[0] == TRUE)
{
NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);
return;
}
pAd->BulkOutPending[0] = TRUE;
NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);
// Increase Total transmit byte counter
pAd->RalinkCounters.TransmittedByteCount += pNullContext->BulkOutSize;
DBGPRINT_RAW(RT_DEBUG_INFO, "--->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;
}
DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrame \n");
return;
}
/*
========================================================================
Routine Description:
Arguments:
Return Value:
Note:
========================================================================
*/
VOID RTUSBBulkOutRTSFrame(
IN PRTMP_ADAPTER pAd)
{
PTX_CONTEXT pRTSContext = &(pAd->RTSContext);
PURB pUrb;
int ret = 0;
unsigned long IrqFlags;
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], IrqFlags);
if (pAd->BulkOutPending[PipeID] == TRUE)
{
NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID], IrqFlags);
return;
}
pAd->BulkOutPending[PipeID] = TRUE;
NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID], IrqFlags);
// Increase Total transmit byte counter
pAd->RalinkCounters.TransmittedByteCount += pRTSContext->BulkOutSize;
DBGPRINT_RAW(RT_DEBUG_INFO, "--->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;
}
DBGPRINT_RAW(RT_DEBUG_INFO, "<---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 IrqFlags;
pMLMEContext = &pAd->MLMEContext[Index];
NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);
if (pAd->BulkOutPending[0] == TRUE)
{
NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);
return;
}
pAd->BulkOutPending[0] = TRUE;
NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);
// Increase Total transmit byte counter
pAd->RalinkCounters.TransmittedByteCount += pMLMEContext->BulkOutSize;
// Clear MLME bulk flag
RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
DBGPRINT_RAW(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);
DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutMLMEPacket\n");
// 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;
}
DBGPRINT_RAW(RT_DEBUG_INFO, "<---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 IrqFlags;
NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);
if (pAd->BulkOutPending[0] == TRUE)
{
NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);
return;
}
pAd->BulkOutPending[0] = TRUE;
NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);
DBGPRINT_RAW(RT_DEBUG_INFO, "--->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;
}
DBGPRINT_RAW(RT_DEBUG_INFO, "<---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;
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)))
{
return;
}
DBGPRINT(RT_DEBUG_INFO,"RTUSBBulkReceive:: pAd->NextRxBulkInIndex = %d\n",pAd->NextRxBulkInIndex);
pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);
pRxContext->InUse = TRUE;
pAd->NextRxBulkInIndex = (pAd->NextRxBulkInIndex + 1) % RX_RING_SIZE;
atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCELABLE);
atomic_inc(&pAd->PendingRx);
// Init Rx context descriptor
NdisZeroMemory(pRxContext->TransferBuffer, BUFFER_SIZE);
RTUSBInitRxDesc(pAd, pRxContext);
pUrb = pRxContext->pUrb;
if((ret = rtusb_submit_urb(pUrb))!=0)
{
DBGPRINT(RT_DEBUG_ERROR,"Submit Rx URB failed %d\n", ret);
return;
}
return;
}
VOID RTUSBBulkRxHandle(
IN unsigned long data)
{
purbb_t pUrb = (purbb_t)data;
PRTMP_ADAPTER pAd;
PRX_CONTEXT pRxContext;
pRxContext = (PRX_CONTEXT)pUrb->context;
pAd = pRxContext->pAd;
/* device had been closed */
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS))
return;
RTUSBRxPacket(data);
return;
}
/*
========================================================================
Routine Description:
Arguments:
Return Value:
Note:
========================================================================
*/
VOID RTUSBKickBulkOut(
IN PRTMP_ADAPTER pAd)
{
DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBKickBulkOut\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -