亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? plxinterrupt.c

?? PCI接口產品中橋芯片PLX6000、PLX8000、PLX9000和PLXsrv驅動模塊源碼
?? C
字號:
/*******************************************************************************
 * Copyright (c) 2007 PLX Technology, Inc.
 *
 * PLX Technology Inc. licenses this software under specific terms and
 * conditions.  Use of any of the software or derviatives thereof in any
 * product without a PLX Technology chip is strictly prohibited.
 *
 * PLX Technology, Inc. provides this software AS IS, WITHOUT ANY WARRANTY,
 * EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  PLX makes no guarantee
 * or representations regarding the use of, or the results of the use of,
 * the software and documentation in terms of correctness, accuracy,
 * reliability, currentness, or otherwise; and you rely on the software,
 * documentation and results solely at your own risk.
 *
 * IN NO EVENT SHALL PLX BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS,
 * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES
 * OF ANY KIND.  IN NO EVENT SHALL PLX'S TOTAL LIABILITY EXCEED THE SUM
 * PAID TO PLX FOR THE PRODUCT LICENSED HEREUNDER.
 *
 ******************************************************************************/

/******************************************************************************
 *
 * File Name:
 *
 *      PlxInterrupt.c
 *
 * Description:
 *
 *      This file handles interrupts for the PLX device
 *
 * Revision History:
 *
 *      01-01-07 : PLX SDK v5.00
 *
 ******************************************************************************/


#include "PciSupport.h"
#include "PlxChipFn.h"
#include "PlxInterrupt.h"
#include "SupportFunc.h"




/******************************************************************************
 *
 * Function   :  OnInterrupt
 *
 * Description:  The Interrupt Service Routine for the PLX device
 *
 ******************************************************************************/
BOOLEAN
OnInterrupt(
    PKINTERRUPT pInterrupt,
    PVOID       ServiceContext
    )
{
    U32               RegValue;
    U32               RegPciInt;
    U32               InterruptSource;
    DEVICE_EXTENSION *pdx;


    // Get the device extension
    pdx = (DEVICE_EXTENSION *)ServiceContext;

    // Read interrupt status register
    RegPciInt =
        PLX_9000_REG_READ(
            pdx,
            PCI9656_INT_CTRL_STAT
            );

    /****************************************************
     * If the chip is in a low power state, then local
     * register reads are disabled and will always return
     * 0xFFFFFFFF.  If the PLX chip's interrupt is shared
     * with another PCI device, the PXL ISR may continue
     * to be called.  This case is handled to avoid
     * erroneous reporting of an active interrupt.
     ***************************************************/
    if (RegPciInt == 0xFFFFFFFF)
        return FALSE;

    // Check for master PCI interrupt enable
    if ((RegPciInt & (1 << 8)) == 0)
        return FALSE;

    // Verify that an interrupt is truly active

    // Clear the interrupt type flag
    InterruptSource = INTR_TYPE_NONE;

    // Check if PCI Doorbell Interrupt is active and not masked
    if ((RegPciInt & (1 << 13)) && (RegPciInt & (1 << 9)))
    {
        InterruptSource |= INTR_TYPE_DOORBELL;
    }

    // Check if PCI Abort Interrupt is active and not masked
    if ((RegPciInt & (1 << 14)) && (RegPciInt & (1 << 10)))
    {
        InterruptSource |= INTR_TYPE_PCI_ABORT;
    }

    // Check if Local->PCI Interrupt is active and not masked
    if ((RegPciInt & (1 << 15)) && (RegPciInt & (1 << 11)))
    {
        InterruptSource |= INTR_TYPE_LOCAL_1;
    }

    // Check if DMA Channel 0 Interrupt is active and not masked
    if ((RegPciInt & (1 << 21)) && (RegPciInt & (1 << 18)))
    {
        // Verify the DMA interrupt is routed to PCI
        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_DMA0_MODE
                );

        if (RegValue & (1 << 17))
        {
            InterruptSource |= INTR_TYPE_DMA_0;
        }
    }

    // Check if DMA Channel 1 Interrupt is active and not masked
    if ((RegPciInt & (1 << 22)) && (RegPciInt & (1 << 19)))
    {
        // Verify the DMA interrupt is routed to PCI
        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_DMA1_MODE
                );

        if (RegValue & (1 << 17))
        {
            InterruptSource |= INTR_TYPE_DMA_1;
        }
    }

    // Check if MU Outbound Post interrupt is active
    RegValue =
        PLX_9000_REG_READ(
            pdx,
            PCI9656_OUTPOST_INT_STAT
            );

    if (RegValue & (1 << 3))
    {
        // Check if MU Outbound Post interrupt is not masked
        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_OUTPOST_INT_MASK
                );

        if ((RegValue & (1 << 3)) == 0)
        {
            InterruptSource |= INTR_TYPE_OUTBOUND_POST;
        }
    }

    // Return if no interrupts are active
    if (InterruptSource == INTR_TYPE_NONE)
        return FALSE;

    // At this point, the device interrupt is verified

    // Mask the PCI Interrupt
    PLX_9000_REG_WRITE(
        pdx,
        PCI9656_INT_CTRL_STAT,
        RegPciInt & ~(1 << 8)
        );

    //
    // Schedule deferred procedure (DPC) to complete interrupt processing
    //

    KeInsertQueueDpc(
        &(pdx->DpcForIsr),
        (VOID *)(PLX_UINT_PTR)InterruptSource,
        NULL
        );

    return TRUE;
}




/******************************************************************************
 *
 * Function   :  DpcForIsr
 *
 * Description:  This routine will be triggered by the ISR to service an interrupt
 *
 ******************************************************************************/
VOID
DpcForIsr(
    PKDPC pDpc,
    PVOID pContext,
    PVOID pArg1,
    PVOID pArg2
    )
{
    U32                 RegValue;
    PLX_REG_DATA        RegData;
    DEVICE_EXTENSION   *pdx;
    PLX_INTERRUPT_DATA  IntData;


    // Get the device extension
    pdx = (DEVICE_EXTENSION *)pContext;

    // Get interrupt source
    IntData.Source_Ints     = PtrToUlong(pArg1);
    IntData.Source_Doorbell = 0;

    KeAcquireSpinLockAtDpcLevel(
        &(pdx->Lock_HwAccess)
        );

    // Local Interrupt 1
    if (IntData.Source_Ints & INTR_TYPE_LOCAL_1)
    {
        // Setup to synchronize access to Interrupt Control/Status Register
        RegData.pdx         = pdx;
        RegData.offset      = PCI9656_INT_CTRL_STAT;
        RegData.BitsToSet   = 0;
        RegData.BitsToClear = (1 << 11);

        // Mask local interrupt 1 since true source is unknown
        KeSynchronizeExecution(
            pdx->pInterruptObject,
            PlxSynchronizedRegisterModify,
            (VOID *)&RegData
            );
    }

    // Doorbell Interrupt
    if (IntData.Source_Ints & INTR_TYPE_DOORBELL)
    {
        // Get Doorbell register
        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_PCI_DOORBELL
                );

        // Clear Doorbell interrupt
        PLX_9000_REG_WRITE(
            pdx,
            PCI9656_PCI_DOORBELL,
            RegValue
            );

        // Save the doorbell value
        IntData.Source_Doorbell = RegValue;
    }

    // PCI Abort interrupt
    if (IntData.Source_Ints & INTR_TYPE_PCI_ABORT)
    {
        // Get the PCI Command register
        PLX_PCI_REG_READ(
            pdx,
            CFG_COMMAND,
            &RegValue
            );

        // Write to back to clear PCI Abort
        PLX_PCI_REG_WRITE(
            pdx,
            CFG_COMMAND,
            RegValue
            );
    }

    // DMA Channel 0 interrupt
    if (IntData.Source_Ints & INTR_TYPE_DMA_0)
    {
        // Get DMA Control/Status
        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_DMA_COMMAND_STAT
                );

        // Clear DMA interrupt
        PLX_9000_REG_WRITE(
            pdx,
            PCI9656_DMA_COMMAND_STAT,
            RegValue | (1 << 3)
            );

        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_DMA0_MODE
                );

        // Check if SGL is enabled & cleanup
        if (RegValue & (1 << 9))
        {
            PlxSglDmaTransferComplete(
                pdx,
                0
                );
        }
    }

    // DMA Channel 1 interrupt
    if (IntData.Source_Ints & INTR_TYPE_DMA_1)
    {
        // Get DMA Control/Status
        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_DMA_COMMAND_STAT
                );

        // Clear DMA interrupt
        PLX_9000_REG_WRITE(
            pdx,
            PCI9656_DMA_COMMAND_STAT,
            RegValue | (1 << 11)
            );

        RegValue =
            PLX_9000_REG_READ(
                pdx,
                PCI9656_DMA1_MODE
                );

        // Check if SGL is enabled & cleanup
        if (RegValue & (1 << 9))
        {
            PlxSglDmaTransferComplete(
                pdx,
                1
                );
        }
    }

    // Outbound post FIFO interrupt
    if (IntData.Source_Ints & INTR_TYPE_OUTBOUND_POST)
    {
        // Mask Outbound Post interrupt
        PLX_9000_REG_WRITE(
            pdx,
            PCI9656_OUTPOST_INT_MASK,
            (1 << 3)
            );
    }

    KeReleaseSpinLockFromDpcLevel(
        &(pdx->Lock_HwAccess)
        );

    // Signal any objects waiting for notification
    PlxSignalNotifications(
        pdx,
        &IntData
        );

    // Re-enable interrupts
    KeSynchronizeExecution(
        pdx->pInterruptObject,
        PlxChipInterruptsEnable,
        pdx
        );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区成人| 高清在线观看日韩| 日韩美女视频19| 2021久久国产精品不只是精品| 欧美性猛片xxxx免费看久爱| 91小视频在线| 色婷婷综合视频在线观看| av电影在线观看一区| www.日本不卡| 91麻豆6部合集magnet| 色婷婷精品大视频在线蜜桃视频| 99久久精品费精品国产一区二区| 99精品视频在线观看免费| 99国产精品视频免费观看| 色综合久久88色综合天天免费| 色噜噜久久综合| 欧美人体做爰大胆视频| 欧美高清性hdvideosex| 欧美www视频| 欧美国产日本视频| 最新国产の精品合集bt伙计| 亚洲观看高清完整版在线观看| 亚洲在线观看免费| 青青草一区二区三区| 久久99精品久久久久久| 国产成人精品免费视频网站| 91网站在线观看视频| 欧美日韩中文另类| 久久综合色综合88| 亚洲视频一区二区在线| 日本视频在线一区| 国产成人免费在线观看不卡| 色一情一乱一乱一91av| 日韩免费视频线观看| 国产精品乱码久久久久久| 亚洲国产欧美在线| 美女网站一区二区| av不卡免费电影| 日韩写真欧美这视频| 国产三区在线成人av| 亚洲国产视频一区| 国产sm精品调教视频网站| 91美女在线视频| 精品国产自在久精品国产| 综合网在线视频| 免费高清成人在线| 色94色欧美sute亚洲线路一久| 7777精品伊人久久久大香线蕉经典版下载| 日韩精品一区二区三区在线观看 | 日韩一区二区精品| 国产日韩欧美电影| 丝袜a∨在线一区二区三区不卡| 国产成人综合精品三级| 欧美日韩国产高清一区二区三区| 久久久一区二区三区捆绑**| 婷婷久久综合九色综合绿巨人| 国产乱码精品一区二区三区av| 欧美少妇bbb| 国产精品电影一区二区三区| 麻豆精品在线看| 欧美日韩免费电影| 国产精品国产三级国产aⅴ中文 | 精品一区二区三区欧美| 欧洲视频一区二区| 国产精品人人做人人爽人人添| 久久不见久久见免费视频7| 欧美日免费三级在线| 亚洲同性gay激情无套| 国产成人福利片| 国产片一区二区| 久久99国产精品久久99果冻传媒| 欧美日韩三级在线| 亚洲一二三四区| 一本色道久久综合亚洲aⅴ蜜桃| 欧美韩国日本综合| 国产精一区二区三区| 欧美大片一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 欧美日韩在线播放三区| 亚洲一区在线观看网站| 欧美视频一区二区三区在线观看 | 91麻豆精品91久久久久同性| 亚洲精品伦理在线| 91精品福利在线| 一区二区欧美视频| 欧美色大人视频| 青椒成人免费视频| 精品欧美乱码久久久久久1区2区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩视频不卡| 国产传媒日韩欧美成人| 欧美经典一区二区三区| 国产福利视频一区二区三区| 国产视频在线观看一区二区三区| 国产91清纯白嫩初高中在线观看| 欧美激情在线一区二区三区| 国产成人丝袜美腿| 国产精品美女久久久久aⅴ国产馆| 99久久精品国产观看| 三级久久三级久久| 久久亚洲捆绑美女| 色综合 综合色| 日本欧美肥老太交大片| 国产日韩欧美麻豆| 色综合久久久久久久久久久| 亚洲成av人片www| 精品国产免费一区二区三区四区| 青青草97国产精品免费观看无弹窗版 | 裸体健美xxxx欧美裸体表演| 精品久久久久一区| 99国产精品久久久久| 偷拍日韩校园综合在线| 欧美大片一区二区三区| 99re在线精品| 日本大胆欧美人术艺术动态| 国产精品乱子久久久久| 欧美久久久久免费| 99久久精品一区二区| 日本成人中文字幕| 亚洲日本在线天堂| 日韩一区二区三区免费观看| 91在线视频网址| 久久99在线观看| 亚洲综合激情另类小说区| 精品国产免费人成电影在线观看四季| 波多野结衣亚洲一区| 精品一区二区三区的国产在线播放| 国产精品久久久久永久免费观看| 制服丝袜激情欧洲亚洲| 99精品久久只有精品| 精品一区中文字幕| 日本视频一区二区| 亚洲国产中文字幕在线视频综合| 国产亚洲精久久久久久| 欧美一区二区三区在线视频| 91蝌蚪porny| 国产成人激情av| 国产一区二区三区免费看| 日本伊人色综合网| 亚洲一二三四在线观看| 自拍偷拍国产亚洲| 国产视频一区在线观看 | 高清在线观看日韩| 久久99最新地址| 日韩高清国产一区在线| 一级精品视频在线观看宜春院| 国产女人18水真多18精品一级做| 日韩欧美一级二级| 日韩一二三区不卡| 91精品免费在线观看| 欧美日韩欧美一区二区| 色一情一伦一子一伦一区| 91一区一区三区| 97超碰欧美中文字幕| 风间由美一区二区三区在线观看 | 麻豆国产精品官网| 午夜精品在线视频一区| 一区二区三区四区在线| 亚洲人成伊人成综合网小说| 国产精品福利一区二区三区| 欧美国产视频在线| 国产精品人妖ts系列视频| 日本一区二区三区在线观看| 日本一区二区三区久久久久久久久不 | 午夜国产精品一区| 亚洲成人777| 日本欧美在线看| 美女爽到高潮91| 国产精品一区二区在线观看不卡| 国产一区在线看| 国产91对白在线观看九色| 国产精品亚洲第一区在线暖暖韩国| 国产精品综合视频| av在线综合网| 在线看一区二区| 欧美日韩一区二区在线观看视频 | 成人国产精品免费观看动漫| 成人av在线电影| 91久久一区二区| 欧美日本在线观看| 欧美草草影院在线视频| 亚洲国产精品传媒在线观看| 一区二区三区中文字幕精品精品| 亚洲成人1区2区| 国产精品一二三四| 在线观看三级视频欧美| 精品日产卡一卡二卡麻豆| 国产精品白丝在线| 日韩成人午夜电影| 99精品国产热久久91蜜凸| 777亚洲妇女| 国产精品久久久久久久午夜片| 亚洲福利电影网| 岛国av在线一区| 欧美伦理电影网| 国产精品色噜噜| 美女网站视频久久| 色婷婷精品久久二区二区蜜臂av | www.亚洲精品| 欧美高清性hdvideosex|