📄 rtusb_bulk.c
字号:
}
#endif
status = pUrb->status;
atomic_set(&pRxContext->IrpLock, IRPLOCK_COMPLETED);
atomic_dec(&pAdapter->PendingRx);
switch (status)
{
case 0:
if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))
{
//RTUSBRxPacket(pUrb);
pAdapter->rx_bh.data = (unsigned long)pUrb;
tasklet_schedule(&pAdapter->rx_bh);
break;
}// STATUS_SUCCESS
DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete (IrpLock) = %d\n", atomic_read(&pRxContext->IrpLock));
break;
case -ECONNRESET: // async unlink
case -ESHUTDOWN: // hardware gone = -108
pUrb = NULL;
DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete Error code = %d\n", status);
//tasklet_schedule(&pAdapter->rx_bh);
break;
}
#if 0
if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))
{
RTUSBRxPacket(pUrb);
//tasklet_schedule(&pAdapter->rx_bh);
}// STATUS_SUCCESS
else
{
DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete Error code = %d\n", status);
pRxContext->InUse = FALSE;
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk In Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_IN);
}
}
#endif
}
VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb, struct pt_regs *pt_regs)
{
PTX_CONTEXT pPsPollContext;
PRT2570ADAPTER pAdapter;
NTSTATUS status;
pPsPollContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pPsPollContext->pAdapter;
pPsPollContext->IRPPending = FALSE;
pPsPollContext->InUse = FALSE;
status = pUrb->status;
if (status == USB_ST_NOERROR)
{
// Don't worry about the queue is empty or not, this function will check itself
RTUSBDeQueuePacket(pAdapter);
}
else
{
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);
}
}
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrameComplete\n");
}
VOID RTUSBBulkOutBeaconComplete(purbb_t pUrb,struct pt_regs *pt_regs)
{
PRT2570ADAPTER pAdapter;
PTX_CONTEXT pBeaconContext;
pBeaconContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pBeaconContext->pAdapter;
DBGPRINT_RAW(RT_DEBUG_TEMP, "--->RTUSBBulkOutBeaconComplete\n");
// Reset Null frame context flags
pBeaconContext->IRPPending = FALSE;
pBeaconContext->InUse = FALSE;
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
}
#else
VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb)
{
PTX_CONTEXT pTxContext;
PRT2570ADAPTER pAdapter;
NTSTATUS status;
DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutDataPacketComplete\n");
pTxContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pTxContext->pAdapter;
status = pUrb->status;
if (status == USB_ST_NOERROR)
{
if (pTxContext->LastOne == TRUE)
{
pAdapter->Counters.GoodTransmits++;
FREE_TX_RING(pAdapter, pTxContext);
if (pAdapter->SendTxWaitQueue.Number > 0)
{
RTUSBDeQueuePacket(pAdapter);
}
}
else
{
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))
{
FREE_TX_RING(pAdapter, pTxContext);
// Indicate next one is frag data which has highest priority
RTUSB_SET_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_FRAG);
}
else
{
while (pTxContext->LastOne != TRUE)
{
FREE_TX_RING(pAdapter, pTxContext);
pTxContext = &(pAdapter->TxContext[pAdapter->NextBulkOutIndex]);
}
FREE_TX_RING(pAdapter, pTxContext);
}
}
}
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
}
VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb)
{
PRT2570ADAPTER pAdapter;
PTX_CONTEXT pNullContext;
NTSTATUS status;
pNullContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pNullContext->pAdapter;
DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutNullFrameComplete\n");
// Reset Null frame context flags
pNullContext->IRPPending = FALSE;
pNullContext->InUse = FALSE;
// Clear Null frame bulk flag
RTUSB_CLEAR_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_NULL);
status = pUrb->status;
if (status == USB_ST_NOERROR)
{
// Don't worry about the queue is empty or not, this function will check itself
RTUSBDeQueuePacket(pAdapter);
}
else
{
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);
}
}
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrameComplete\n");
}
VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb)
{
PTX_CONTEXT pMLMEContext;
PRT2570ADAPTER pAdapter;
NTSTATUS status;
pMLMEContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pMLMEContext->pAdapter;
status = pUrb->status;
pAdapter->PrioRingTxCnt--;
pAdapter->PrioRingFirstIndex++;
if (pAdapter->PrioRingFirstIndex >= PRIO_RING_SIZE)
{
pAdapter->PrioRingFirstIndex = 0;
}
DBGPRINT(RT_DEBUG_INFO, "RTUSBBulkOutMLMEPacketComplete::PrioRingFirstIndex = %d, PrioRingTxCnt = %d, PopMgmtIndex = %d, PushMgmtIndex = %d, NextMLMEIndex = %d\n",
pAdapter->PrioRingFirstIndex,
pAdapter->PrioRingTxCnt, pAdapter->PopMgmtIndex, pAdapter->PushMgmtIndex, pAdapter->NextMLMEIndex);
// Reset MLME context flags
pMLMEContext->IRPPending = FALSE;
pMLMEContext->InUse = FALSE;
if (status == STATUS_SUCCESS)
{
// Don't worry about the queue is empty or not, this function will check itself
RTUSBDequeueMLMEPacket(pAdapter);
}
#if 0
else if (status != STATUS_CANCELLED)
{
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out MLME Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);
}
}
#endif
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutMLMEPacketComplete\n");
}
/*
========================================================================
Routine Description:
This routine process Rx Irp and call rx complete function.
Arguments:
DeviceObject Pointer to the device object for next lower
device. DeviceObject passed in here belongs to
the next lower driver in the stack because we
were invoked via IoCallDriver in USB_RxPacket
AND it is not OUR device object
Irp Ptr to completed IRP
Context Ptr to our Adapter object (context specified
in IoSetCompletionRoutine
Return Value:
Always returns STATUS_MORE_PROCESSING_REQUIRED
Note:
Always returns STATUS_MORE_PROCESSING_REQUIRED
========================================================================
*/
VOID RTUSBBulkRxComplete(purbb_t pUrb)
{
PRX_CONTEXT pRxContext;
PRT2570ADAPTER pAdapter;
NTSTATUS status;
pRxContext= (PRX_CONTEXT)pUrb->context;
pAdapter = pRxContext->pAdapter;
//
// We have a number of cases:
// 1) The USB read timed out and we received no data.
// 2) The USB read timed out and we received some data.
// 3) The USB read was successful and fully filled our irp buffer.
// 4) The irp was cancelled.
// 5) Some other failure from the USB device object.
//
//
// Free the IRP and its mdl because they were alloced by us
//
#if 0
if ( (atomread = (atomic_read(&pRxContext->IrpLock))) == IRPLOCK_CANCE_START)
{
atomic_dec(&pAdapter->PendingRx);
atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCE_COMPLETE);
}
#endif
status = pUrb->status;
atomic_set(&pRxContext->IrpLock, IRPLOCK_COMPLETED);
atomic_dec(&pAdapter->PendingRx);
switch (status)
{
case 0:
if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))
{
//RTUSBRxPacket(pUrb);
pAdapter->rx_bh.data = (unsigned long)pUrb;
tasklet_schedule(&pAdapter->rx_bh);
break;
}// STATUS_SUCCESS
DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete (IrpLock) = %d\n", atomic_read(&pRxContext->IrpLock));
break;
case -ECONNRESET: // async unlink
case -ESHUTDOWN: // hardware gone = -108
pUrb = NULL;
DBGPRINT(RT_DEBUG_ERROR,"==> RTUSBBulkRxComplete Error code = %d\n", status);
//tasklet_schedule(&pAdapter->rx_bh);
break;
}
#if 0
if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))
{
RTUSBRxPacket(pUrb);
//tasklet_schedule(&pAdapter->rx_bh);
}// STATUS_SUCCESS
else
{
DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete Error code = %d\n", status);
pRxContext->InUse = FALSE;
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk In Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_IN);
}
}
#endif
}
VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb)
{
PTX_CONTEXT pPsPollContext;
PRT2570ADAPTER pAdapter;
NTSTATUS status;
pPsPollContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pPsPollContext->pAdapter;
pPsPollContext->IRPPending = FALSE;
pPsPollContext->InUse = FALSE;
status = pUrb->status;
if (status == USB_ST_NOERROR)
{
// Don't worry about the queue is empty or not, this function will check itself
RTUSBDeQueuePacket(pAdapter);
}
else
{
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);
}
}
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrameComplete\n");
}
VOID RTUSBBulkOutBeaconComplete(purbb_t pUrb)
{
PTX_CONTEXT pBeaconContext;
PRT2570ADAPTER pAdapter;
NTSTATUS status;
pBeaconContext= (PTX_CONTEXT)pUrb->context;
pAdapter = pBeaconContext->pAdapter;
pBeaconContext->IRPPending = FALSE;
pBeaconContext->InUse = FALSE;
status = pUrb->status;
if (status != USB_ST_NOERROR)
{
if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))
{
DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Beacon Frame Failed\n");
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);
RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);
}
}
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
pAdapter->BulkOutPending = FALSE;
NdisReleaseSpinLock(&pAdapter->BulkOutLock);
// Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAdapter);
}
#endif
/*
========================================================================
Routine Description:
Arguments:
Return Value:
IRQL =
Note:
========================================================================
*/
VOID RTUSBBulkOutBeacon(
IN PRT2570ADAPTER pAdapter,
IN INT BeaconIndex)
{
PTX_CONTEXT pBeaconContext;
PURB pUrb;
int ret = 0;
NdisAcquireSpinLock(&pAdapter->BulkOutLock);
if (pAdapter->BulkOutPending == TRUE)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -