📄 usbpipe.c
字号:
pDevice->usb, usb_rcvbulkpipe(pDevice->usb, 1), (PVOID) pDevice->intBuf.pDataBuf, MAX_INTERRUPT_SIZE, s_nsInterruptUsbIoCompleteRead, pDevice);#endif#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus); } #else if (pDevice->bEventAvailable == FALSE) { if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus); } } #endif DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----s_nsStartInterruptUsbRead Return(%x)\n",ntStatus); return ntStatus;}/* * Description: * Complete function of usb interrupt in irp. * * Parameters: * In: * pDevice - Pointer to the adapter * * Out: * none * * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver * *///2007-0508-05<Add>by MikeLiu#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))staticVOID s_nsInterruptUsbIoCompleteRead( IN struct urb *urb, IN struct pt_regs *regs )#else staticVOID s_nsInterruptUsbIoCompleteRead( IN struct urb *urb )#endif { PSDevice pDevice; NTSTATUS ntStatus; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptUsbIoCompleteRead\n"); // // The context given to IoSetCompletionRoutine is the receive buffer object // pDevice = (PSDevice)urb->context; // // 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. // ntStatus = urb->status; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_nsInterruptUsbIoCompleteRead Status %d\n", ntStatus); // if we were not successful, we need to free the int buffer for future use right here // otherwise interrupt data handler will free int buffer after it handle it. if (( ntStatus != STATUS_SUCCESS )) { pDevice->ulBulkInError++; pDevice->intBuf.bInUse = FALSE;// if (ntStatus == USBD_STATUS_CRC) {// pDevice->ulIntInContCRCError++;// }// if (ntStatus == STATUS_NOT_CONNECTED ) // { pDevice->fKillEventPollingThread = TRUE;// } DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"IntUSBIoCompleteControl STATUS = %d\n", ntStatus ); } else { pDevice->ulIntInBytesRead += (ULONG)urb->actual_length; pDevice->ulIntInContCRCError = 0; pDevice->bEventAvailable = TRUE; INTnsProcessData(pDevice); } STAvUpdateUSBCounter(&pDevice->scStatistic.USB_InterruptStat, ntStatus); if (pDevice->fKillEventPollingThread != TRUE) { #if 0 //reserve int URB submit #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) if ((ntStatus = vntwusb_submit_urb(urb)) != 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Re-Submit int URB failed %d\n", ntStatus); } #else if (pDevice->bEventAvailable == FALSE) { if ((ntStatus = vntwusb_submit_urb(urb)) != 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Re-Submit int URB failed %d\n", ntStatus); } } #endif #else //replace int URB submit by bulk transfer #ifdef Safe_Close usb_fill_bulk_urb(pDevice->pInterruptURB, pDevice->usb, usb_rcvbulkpipe(pDevice->usb, 1), (PVOID) pDevice->intBuf.pDataBuf, MAX_INTERRUPT_SIZE, s_nsInterruptUsbIoCompleteRead, pDevice); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus); } #else if (pDevice->bEventAvailable == FALSE) { if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus); } } #endif #else tasklet_schedule(&pDevice->EventWorkItem); #endif#endif } // // We return STATUS_MORE_PROCESSING_REQUIRED so that the completion // routine (IofCompleteRequest) will stop working on the irp. // return ;}/* * Description: * Allocates an usb BulkIn irp and calls USBD. * * Parameters: * In: * pDevice - Pointer to the adapter * Out: * none * * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver * */NTSTATUSPIPEnsBulkInUsbRead( IN PSDevice pDevice, IN PRCB pRCB ){ NTSTATUS ntStatus= 0; struct urb *pUrb; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsStartBulkInUsbRead\n"); if (MP_TEST_FLAG(pDevice, fMP_DISCONNECTED)) return STATUS_FAILURE; pDevice->ulBulkInPosted++; pUrb = pRCB->pUrb; // // Now that we have created the urb, we will send a // request to the USB device object. // if (pRCB->skb == NULL) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pRCB->skb is null \n"); return ntStatus; } usb_fill_bulk_urb(pUrb, pDevice->usb, usb_rcvbulkpipe(pDevice->usb, 2), (PVOID) (pRCB->skb->data), MAX_TOTAL_SIZE_WITH_ALL_HEADERS, s_nsBulkInUsbIoCompleteRead, pRCB); if((ntStatus = vntwusb_submit_urb(pUrb)!=0)){ DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit Rx URB failed %d\n", ntStatus); return STATUS_FAILURE ; } pRCB->Ref = 1; pRCB->bBoolInUse= TRUE; return ntStatus;}/* * Description: * Complete function of usb BulkIn irp. * * Parameters: * In: * pDevice - Pointer to the adapter * * Out: * none * * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver * *///2007-0508-06<Add>by MikeLiu#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))staticVOID s_nsBulkInUsbIoCompleteRead( IN struct urb *urb, IN struct pt_regs *regs )#elsestaticVOID s_nsBulkInUsbIoCompleteRead( IN struct urb *urb )#endif { PRCB pRCB = (PRCB)urb->context; PSDevice pDevice = (PSDevice)pRCB->pDevice; ULONG bytesRead; BOOLEAN bIndicateReceive = FALSE; BOOL bReAllocSkb = FALSE; NTSTATUS status; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkInUsbIoCompleteRead\n"); status = urb->status; bytesRead = urb->actual_length; if (status) { pDevice->ulBulkInError++; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BULK In failed %d\n", status); #ifdef Calcu_LinkQual pDevice->scStatistic.RxFcsErrCnt ++; #endif//todo...xxxxxx// if (status == USBD_STATUS_CRC) {// pDevice->ulBulkInContCRCError++;// }// if (status == STATUS_DEVICE_NOT_CONNECTED ) // {// MP_SET_FLAG(pDevice, fMP_DISCONNECTED);// } } else { bIndicateReceive = TRUE; pDevice->ulBulkInContCRCError = 0; pDevice->ulBulkInBytesRead += bytesRead; #ifdef Calcu_LinkQual pDevice->scStatistic.RxOkCnt ++; #endif } STAvUpdateUSBCounter(&pDevice->scStatistic.USB_BulkInStat, status); if (bIndicateReceive) { spin_lock(&pDevice->lock); if (RXbBulkInProcessData(pDevice, pRCB, bytesRead) == TRUE) bReAllocSkb = TRUE; spin_unlock(&pDevice->lock); } pRCB->Ref--; if (pRCB->Ref == 0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeNormal %d \n",pDevice->NumRecvFreeList); spin_lock(&pDevice->lock); RXvFreeRCB(pRCB, bReAllocSkb); spin_unlock(&pDevice->lock); } return;}/* * Description: * Allocates an usb BulkOut irp and calls USBD. * * Parameters: * In: * pDevice - Pointer to the adapter * Out: * none * * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver * */NDIS_STATUSPIPEnsSendBulkOut( IN PSDevice pDevice, IN PUSB_SEND_CONTEXT pContext ){ NTSTATUS status; struct urb *pUrb; pDevice->bPWBitOn = FALSE;/* if (pDevice->pPendingBulkOutContext != NULL) { pDevice->NumContextsQueued++; EnqueueContext(pDevice->FirstTxContextQueue, pDevice->LastTxContextQueue, pContext); status = STATUS_PENDING; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Send pending!\n"); return status; }*/ DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_nsSendBulkOut\n"); if(MP_IS_READY(pDevice) && MP_TEST_FLAG(pDevice, fMP_POST_WRITES)) { pUrb = pContext->pUrb; pDevice->ulBulkOutPosted++;// pDevice->pPendingBulkOutContext = pContext; usb_fill_bulk_urb( pUrb, pDevice->usb, usb_sndbulkpipe(pDevice->usb, 3), (PVOID) &(pContext->Data[0]), pContext->uBufLen, s_nsBulkOutIoCompleteWrite, pContext); if((status = vntwusb_submit_urb(pUrb))!=0) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit Tx URB failed %d\n", status); return STATUS_FAILURE; } return STATUS_PENDING; } else { pContext->bBoolInUse = FALSE; return STATUS_RESOURCES; }}/* * Description: s_nsBulkOutIoCompleteWrite * 1a) Indicate to the protocol the status of the write. * 1b) Return ownership of the packet to the protocol. * * 2) If any more packets are queue for sending, send another packet * to USBD. * If the attempt to send the packet to the driver fails, * return ownership of the packet to the protocol and * try another packet (until one succeeds). * * Parameters: * In: * pdoUsbDevObj - pointer to the USB device object which * completed the irp * pIrp - the irp which was completed by the * device object * pContext - the context given to IoSetCompletionRoutine * before calling IoCallDriver on the irp * The pContext is a pointer to the USB device object. * Out: * none * * Return Value: STATUS_MORE_PROCESSING_REQUIRED - allows the completion routine * (IofCompleteRequest) to stop working on the irp. * *///2007-0508-07<Add>by MikeLiu#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))staticVOID s_nsBulkOutIoCompleteWrite( IN struct urb *urb, IN struct pt_regs *regs )#elsestaticVOID s_nsBulkOutIoCompleteWrite( IN struct urb *urb )#endif { PSDevice pDevice; NTSTATUS status; CONTEXT_TYPE ContextType; ULONG ulBufLen; PUSB_SEND_CONTEXT pContext; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkOutIoCompleteWrite\n"); // // The context given to IoSetCompletionRoutine is an USB_CONTEXT struct // pContext = (PUSB_SEND_CONTEXT) urb->context; ASSERT( NULL != pContext ); pDevice = pContext->pDevice; ContextType = pContext->Type; ulBufLen = pContext->uBufLen; if (!netif_device_present(pDevice->dev)) return; // // Perform various IRP, URB, and buffer 'sanity checks' // status = urb->status; //we should have failed, succeeded, or cancelled, but NOT be pending STAvUpdateUSBCounter(&pDevice->scStatistic.USB_BulkOutStat, status); if(status == STATUS_SUCCESS) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Write %d bytes\n",(int)ulBufLen); pDevice->ulBulkOutBytesWrite += ulBufLen; pDevice->ulBulkOutContCRCError = 0; } else { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BULK Out failed %d\n", status); pDevice->ulBulkOutError++; }// pDevice->ulCheckForHangCount = 0;// pDevice->pPendingBulkOutContext = NULL; if ( CONTEXT_DATA_PACKET == ContextType ) { // Indicate to the protocol the status of the sent packet and return // ownership of the packet. if (pContext->pPacket != NULL) { dev_kfree_skb_irq(pContext->pPacket); pContext->pPacket = NULL; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"tx %d bytes\n",(int)ulBufLen); } pDevice->dev->trans_start = jiffies; if (status == STATUS_SUCCESS) { pDevice->packetsSent++; } else { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Send USB error! [%08xh]\n", status); pDevice->packetsSentDropped++; } //2007-0115-06<Add>by MikeLiu #ifdef TxInSleep pDevice->nTxDataTimeCout = 0; #endif } if (pDevice->bLinkPass == TRUE) { if (netif_queue_stopped(pDevice->dev)) netif_wake_queue(pDevice->dev); } pContext->bBoolInUse = FALSE; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -