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

📄 int.c

📁 VIA VT6656 USB linux source code.
💻 C
字号:
/* * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. * All rights reserved. * * This software is copyrighted by and is the sole property of * VIA Networking Technologies, Inc. This software may only be used * in accordance with the corresponding license agreement. Any unauthorized * use, duplication, transmission, distribution, or disclosure of this * software is expressly forbidden. * * This software is provided by VIA Networking Technologies, Inc. "as is" * and any express or implied warranties, including, but not limited to, the * implied warranties of merchantability and fitness for a particular purpose * are disclaimed. In no event shall VIA Networking Technologies, Inc. * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages. * * * File: int.c * * Purpose: Handle USB interrupt endpoint * * Author: Jerry Chen * * Date: Apr. 2, 2004 * * Functions: * * Revision History: *      04-02-2004 Jerry Chen:  Initial release * */#if !defined(__INT_H__)#include "int.h"#endif#if !defined(__MIB_H__)#include "mib.h"#endif#if !defined(__TBIT_H__)#include "tbit.h"#endif#if !defined(__TMACRO_H__)#include "tmacro.h"#endif#if !defined(__MAC_H__)#include "mac.h"#endif#if !defined(__POWER_H__)#include "power.h"#endif#if !defined(__BSSDB_H__)#include "bssdb.h"#endif#if !defined(__UMEM_H__)#include "umem.h"#endif#if !defined(__USBPIPE_H__)#include "usbpipe.h"#endif/*---------------------  Static Definitions -------------------------*///static int          msglevel                =MSG_LEVEL_DEBUG;static int          msglevel                =MSG_LEVEL_INFO;/*---------------------  Static Classes  ----------------------------*//*---------------------  Static Variables  --------------------------*//*---------------------  Static Functions  --------------------------*//*---------------------  Export Variables  --------------------------*//*---------------------  Export Functions  --------------------------*//*+ * *  Function:   InterruptPollingThread * *  Synopsis:   Thread running at IRQL PASSIVE_LEVEL. * *  Arguments: Device Extension * *  Returns: * *  Algorithm:  Call USBD for input data; * *  History:    dd-mm-yyyy   Author    Comment *  * *  Notes: * *  USB reads are by nature 'Blocking', and when in a read, the device looks like it's *  in a 'stall' condition, so we deliberately time out every second if we've gotten no data *-*/VOIDINTvWorkItem(    PVOID Context    ){    PSDevice pDevice = (PSDevice) Context;    NTSTATUS ntStatus;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Interrupt Polling Thread\n");    spin_lock_irq(&pDevice->lock);    if (pDevice->fKillEventPollingThread != TRUE) {        ntStatus = PIPEnsInterruptRead(pDevice);    }    spin_unlock_irq(&pDevice->lock);     }NTSTATUSINTnsProcessData(    IN  PSDevice pDevice    ){    NTSTATUS        status = STATUS_SUCCESS;    PSINTData       pINTData;    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    struct net_device_stats* pStats = &pDevice->stats;                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptProcessData\n");    pINTData = (PSINTData) pDevice->intBuf.pDataBuf;    if (BITbIsBitOn(pINTData->byTSR0, TSR_VALID)) {        STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt0 & 0x0F), (BYTE) (pINTData->byPkt0>>4), pINTData->byTSR0);        BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic),  pINTData->byTSR0, pINTData->byPkt0);        //DBG_PRN_GRP01(("TSR0 %02x\n", pINTData->byTSR0));    }    if (BITbIsBitOn(pINTData->byTSR1, TSR_VALID)) {        STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt1 & 0x0F), (BYTE) (pINTData->byPkt1>>4), pINTData->byTSR1);        BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic),  pINTData->byTSR1, pINTData->byPkt1);        //DBG_PRN_GRP01(("TSR1 %02x\n", pINTData->byTSR1));    }    if (BITbIsBitOn(pINTData->byTSR2, TSR_VALID)) {        STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt2 & 0x0F), (BYTE) (pINTData->byPkt2>>4), pINTData->byTSR2);        BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic),  pINTData->byTSR2, pINTData->byPkt2);        //DBG_PRN_GRP01(("TSR2 %02x\n", pINTData->byTSR2));    }    if (BITbIsBitOn(pINTData->byTSR3, TSR_VALID)) {        STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt3 & 0x0F), (BYTE) (pINTData->byPkt3>>4), pINTData->byTSR3);        BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic),  pINTData->byTSR3, pINTData->byPkt3);        //DBG_PRN_GRP01(("TSR3 %02x\n", pINTData->byTSR3));    }    if ( pINTData->byISR0 != 0 ) {        if ( BITbIsBitOn(pINTData->byISR0, ISR_BNTX) ) {                        if (pDevice->eOPMode == OP_MODE_AP) {                if(pMgmt->byDTIMCount > 0) {                    pMgmt->byDTIMCount --;                    pMgmt->sNodeDBTable[0].bRxPSPoll = FALSE;                } else if(pMgmt->byDTIMCount == 0) {                    // check if mutltcast tx bufferring                    pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;                    pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;                    if (pMgmt->sNodeDBTable[0].bPSEnable) {                        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RX_PSPOLL, NULL);                    }                }                bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BECON_SEND, NULL);            } // if (pDevice->eOPMode == OP_MODE_AP)                        pDevice->bBeaconSent = TRUE;        } else {            pDevice->bBeaconSent = FALSE;        }        if ( BITbIsBitOn(pINTData->byISR0, ISR_TBTT) ) {            if ( pDevice->bEnablePSMode ) {                bScheduleCommand((HANDLE) pDevice, WLAN_CMD_TBTT_WAKEUP, NULL);            }            if ( pDevice->bChannelSwitch ) {                pDevice->byChannelSwitchCount--;                if ( pDevice->byChannelSwitchCount == 0 ) {                    bScheduleCommand((HANDLE) pDevice, WLAN_CMD_11H_CHSW, NULL);                }            }        }        LODWORD(pDevice->qwCurrTSF) = pINTData->dwLoTSF;        HIDWORD(pDevice->qwCurrTSF) = pINTData->dwHiTSF;        //DBG_PRN_GRP01(("ISR0 = %02x ,LoTsf =  %08x,HiTsf =  %08x\n", pINTData->byISR0, pINTData->dwLoTSF,pINTData->dwHiTSF));                STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic, pINTData->byRTSSuccess,                                pINTData->byRTSFail, pINTData->byACKFail, pINTData->byFCSErr );        STAvUpdateIsrStatCounter(&pDevice->scStatistic, pINTData->byISR0, pINTData->byISR1);            }        if ( pINTData->byISR1 != 0 ) {        if ( BITbIsBitOn(pINTData->byISR1, ISR_GPIO3) ) {            bScheduleCommand((HANDLE) pDevice, WLAN_CMD_RADIO, NULL);        }    }    pDevice->intBuf.uDataLen = 0;    pDevice->intBuf.bInUse = FALSE;        pStats->tx_packets = pDevice->scStatistic.ullTsrOK;    pStats->tx_bytes = pDevice->scStatistic.ullTxDirectedBytes +                       pDevice->scStatistic.ullTxMulticastBytes +                       pDevice->scStatistic.ullTxBroadcastBytes;    pStats->tx_errors = pDevice->scStatistic.dwTsrErr;    pStats->tx_dropped = pDevice->scStatistic.dwTsrErr;    return status;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -