📄 rtusb_bulk.c
字号:
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_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);}#elseVOID 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 (!skb_queue_empty(&pAdapter->SendTxWaitQueue)) { 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 + -