⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbpipe.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -