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

📄 dispatch.c

📁 本压缩包为作者截取的PCI9054的WDM官方驱动源码。欢迎下载。
💻 C
📖 第 1 页 / 共 3 页
字号:
            DebugPrintf_NoInfo(("PLX_IOCTL_VPD_WRITE\n"));

            pIoBuffer->ReturnCode =
                PlxPciVpdWrite(
                    pdx,
                    pIoBuffer->u.MgmtData.offset,
                    (U32)pIoBuffer->u.MgmtData.value
                    );
            break;


        /***********************************
         * Serial EEPROM Access Functions
         **********************************/
        case PLX_IOCTL_EEPROM_PRESENT:
            DebugPrintf_NoInfo(("PLX_IOCTL_EEPROM_PRESENT\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxEepromPresent(
                        pdx,
                        &(pIoBuffer->u.MgmtData.u.bFlag)
                        );
            }
            break;

        case PLX_IOCTL_EEPROM_READ_BY_OFFSET:
            DebugPrintf_NoInfo(("PLX_IOCTL_EEPROM_READ_BY_OFFSET\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxEepromReadByOffset(
                        pdx,
                        pIoBuffer->u.MgmtData.offset,
                        (U32*)&(pIoBuffer->u.MgmtData.value)
                        );
            }
            break;

        case PLX_IOCTL_EEPROM_WRITE_BY_OFFSET:
            DebugPrintf_NoInfo(("PLX_IOCTL_EEPROM_WRITE_BY_OFFSET\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxEepromWriteByOffset(
                        pdx,
                        pIoBuffer->u.MgmtData.offset,
                        (U32)pIoBuffer->u.MgmtData.value
                        );
            }
            break;


        /**************************************************
         * Mailbox and Doorbell Register Access Functions
         **************************************************/
        case PLX_IOCTL_MAILBOX_READ:
            DebugPrintf_NoInfo(("PLX_IOCTL_MAILBOX_READ\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode       = ApiPowerDown;
                pIoBuffer->u.MgmtData.value = (U32)-1;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxRegisterMailboxRead(
                        pdx,
                        pIoBuffer->u.MgmtData.offset,
                        (U32*)&(pIoBuffer->u.MgmtData.value)
                        );
            }
            break;

        case PLX_IOCTL_MAILBOX_WRITE:
            DebugPrintf_NoInfo(("PLX_IOCTL_MAILBOX_WRITE\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxRegisterMailboxWrite(
                        pdx,
                        pIoBuffer->u.MgmtData.offset,
                        (U32)pIoBuffer->u.MgmtData.value
                        );
            }
            break;

        case PLX_IOCTL_DOORBELL_READ:
            DebugPrintf_NoInfo(("PLX_IOCTL_DOORBELL_READ\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode       = ApiPowerDown;
                pIoBuffer->u.MgmtData.value = -1;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxRegisterDoorbellRead(
                        pdx,
                        (U32*)&(pIoBuffer->u.MgmtData.value)
                        );
            }
            break;

        case PLX_IOCTL_DOORBELL_WRITE:
            DebugPrintf_NoInfo(("PLX_IOCTL_DOORBELL_WRITE\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxRegisterDoorbellWrite(
                        pdx,
                        (U32)pIoBuffer->u.MgmtData.value
                        );
            }
            break;


        /****************************
         * Messaging Unit Functions
         ****************************/
        case PLX_IOCTL_MU_INBOUND_PORT_READ:
            DebugPrintf_NoInfo(("PLX_IOCTL_MU_INBOUND_PORT_READ\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxMuInboundPortRead(
                        pdx,
                        (U32*)&(pIoBuffer->u.MgmtData.value)
                        );
            }
            break;

        case PLX_IOCTL_MU_INBOUND_PORT_WRITE:
            DebugPrintf_NoInfo(("PLX_IOCTL_MU_INBOUND_PORT_WRITE\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxMuInboundPortWrite(
                        pdx,
                        (U32)pIoBuffer->u.MgmtData.value
                        );
            }
            break;

        case PLX_IOCTL_MU_OUTBOUND_PORT_READ:
            DebugPrintf_NoInfo(("PLX_IOCTL_MU_OUTBOUND_PORT_READ\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxMuOutboundPortRead(
                        pdx,
                        (U32*)&(pIoBuffer->u.MgmtData.value)
                        );
            }
            break;

        case PLX_IOCTL_MU_OUTBOUND_PORT_WRITE:
            DebugPrintf_NoInfo(("PLX_IOCTL_MU_OUTBOUND_PORT_WRITE\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxMuOutboundPortWrite(
                        pdx,
                        (U32)pIoBuffer->u.MgmtData.value
                        );
            }
            break;


        /***********************************
         *    DMA Management Functions
         **********************************/
        case PLX_IOCTL_DMA_CONTROL:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_CONTROL\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaControl(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        pIoBuffer->u.DmaData.u.command
                        );
            }
            break;

        case PLX_IOCTL_DMA_STATUS:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_STATUS\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaStatus(
                        pdx,
                        pIoBuffer->u.DmaData.channel
                        );
            }
            break;


        /***********************
         * Block DMA Functions
         ***********************/
        case PLX_IOCTL_DMA_BLOCK_CHANNEL_OPEN:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_BLOCK_CHANNEL_OPEN\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaBlockChannelOpen(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        &(pIoBuffer->u.DmaData.u.desc),
                        pStack->FileObject
                        );
            }
            break;

        case PLX_IOCTL_DMA_BLOCK_TRANSFER:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_BLOCK_TRANSFER\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaBlockTransfer(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        &(pIoBuffer->u.DmaData.u.TxParams)
                        );
            }
            break;

        case PLX_IOCTL_DMA_BLOCK_CHANNEL_CLOSE:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_BLOCK_CHANNEL_CLOSE\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaBlockChannelClose(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        TRUE
                        );
            }
            break;


        /**********************
         * SGL DMA Functions
         *********************/
        case PLX_IOCTL_DMA_SGL_OPEN:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_SGL_OPEN\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaSglChannelOpen(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        &(pIoBuffer->u.DmaData.u.desc),
                        pStack->FileObject
                        );
            }
            break;

        case PLX_IOCTL_DMA_SGL_TRANSFER:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_SGL_TRANSFER\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaSglTransfer(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        &(pIoBuffer->u.DmaData.u.TxParams)
                        );
            }
            break;

        case PLX_IOCTL_DMA_SGL_CLOSE:
            DebugPrintf_NoInfo(("PLX_IOCTL_DMA_SGL_CLOSE\n"));

            if (pdx->PowerState > MIN_WORKING_POWER_STATE)
            {
                pIoBuffer->ReturnCode = ApiPowerDown;
            }
            else
            {
                pIoBuffer->ReturnCode =
                    PlxDmaSglChannelClose(
                        pdx,
                        pIoBuffer->u.DmaData.channel,
                        TRUE
                        );
            }
            break;


        /*****************************
         *   Unsupported Messages
         ****************************/
        default:
            DebugPrintf_NoInfo((
                "Unsupported PLX_IOCTL_Xxx (0x%08x)\n",
                pStack->Parameters.DeviceIoControl.IoControlCode
                ));

            pIoBuffer->ReturnCode = ApiUnsupportedFunction;
            break;
    }

    PlxUnlockDevice(
        pdx
        );

    return PlxCompleteIrp(
               pIrp,
               STATUS_SUCCESS
               );
}

⌨️ 快捷键说明

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