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

📄 miniport.cpp

📁 CIRRUS 公司EP93XX系列CPU的WINCE下的BSP
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    // First thing: Figure out required buffer size. Most OIDs require

    // just a UINT, but there are exceptions.

    //

    switch (Oid)

    {

        case OID_GEN_SUPPORTED_LIST:

            cbNeeded = sizeof(v_rgSupportedOids);

            break;

        

        case OID_GEN_DRIVER_VERSION:

        case OID_GEN_VENDOR_DRIVER_VERSION:

            cbNeeded = sizeof(USHORT);

            break;



        case OID_GEN_VENDOR_DESCRIPTION:

            cbNeeded = sizeof(v_lpszVendorDesc);

            break;



        case OID_IRDA_SUPPORTED_SPEEDS:

            cbNeeded = sizeof(ULONG) * NUM_BAUDRATES;

            break;



        default:

            cbNeeded = sizeof(UINT);

            break;

    }



    //

    // Return if the buffer provided is not large enough.

    //



    if ((cbBuf < cbNeeded) || (lpvBuf == NULL))

    {

        *lpcbNeeded  = cbNeeded - cbBuf;

        *lpcbWritten = 0;

        status = NDIS_STATUS_INVALID_LENGTH;

    }



    if(status== NDIS_STATUS_SUCCESS)

    {



        // 

        // Do real work.

        //

        *lpcbWritten = cbNeeded;

        *lpcbNeeded  = 0;



        switch (Oid)

        {

            //

            // General OIDs.

            //



            case OID_GEN_SUPPORTED_LIST:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_SUPPORTED_LIST\r\n"))); 

                NdisMoveMemory(lpvBuf, (PVOID)v_rgSupportedOids, cbNeeded);

                break;



            case OID_GEN_HARDWARE_STATUS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_HARDWARE_STATUS\r\n"))); 

                // If we can be called with a context, the we are ready.

                *(UINT *)lpvBuf = NdisHardwareStatusReady;

                break;



            case OID_GEN_MEDIA_SUPPORTED:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_SUPPORTED\r\n"))); 

                *(UINT *)lpvBuf = NdisMediumIrda;

                break;



            case OID_GEN_MEDIA_IN_USE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_IN_USE\r\n"))); 

                *(UINT *)lpvBuf = NdisMediumIrda;

                break;



            case OID_GEN_MAXIMUM_LOOKAHEAD:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_LOOKAHEAD\r\n"))); 

                *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;

                break;



            case OID_GEN_MAXIMUM_FRAME_SIZE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_FRAME_SIZE\r\n"))); 

                *(UINT *)lpvBuf = MAX_I_DATA_SIZE;

                break;



            case OID_GEN_LINK_SPEED:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_LINK_SPEED\r\n"))); 

                // Link speed in 100 bps.

                *(UINT *)lpvBuf = (UINT)(v_rgSupportedBaudRates[NUM_BAUDRATES - 1].dwBPS/100);

                break;



            case OID_GEN_TRANSMIT_BUFFER_SPACE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BUFFER_SPACE\r\n"))); 

                // We can buffer data, so make it one NDIS packet size.

                *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;

                break;



            case OID_GEN_RECEIVE_BUFFER_SPACE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BUFFER_SPACE\r\n"))); 

                // We can buffer data, so make it one NDIS packet size.

                *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;

                break;



            case OID_GEN_TRANSMIT_BLOCK_SIZE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BLOCK_SIZE\r\n"))); 

                // We can buffer data, so make it one IR packet size.

                *(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;

                break;



            case OID_GEN_RECEIVE_BLOCK_SIZE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BLOCK_SIZE\r\n"))); 

                // We can buffer data, so make it one IR packet size.

                *(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;

                break;



            case OID_GEN_VENDOR_ID:

                //

                // (Todo) Generate a Cirrus Vendor ID.

                //

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_ID\r\n"))); 

                *(UINT *)lpvBuf = 0x00ffffff;

                break;



            case OID_GEN_VENDOR_DRIVER_VERSION:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DRIVER_VERSION\r\n"))); 

                *(USHORT *)lpvBuf = MAKEWORD(IRSIR_MINOR_VERSION, IRSIR_MAJOR_VERSION);

                break;



            case OID_GEN_VENDOR_DESCRIPTION:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DESCRIPTION\r\n"))); 

                NdisMoveMemory(lpvBuf, v_lpszVendorDesc, cbNeeded);

                break;



            case OID_GEN_CURRENT_PACKET_FILTER:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_PACKET_FILTER\r\n"))); 

                *(UINT *)lpvBuf = NDIS_PACKET_TYPE_PROMISCUOUS;

                break;



            case OID_GEN_CURRENT_LOOKAHEAD:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_LOOKAHEAD\r\n"))); 

                *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;

                break;



            case OID_GEN_DRIVER_VERSION:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_DRIVER_VERSION\r\n"))); 

                *(USHORT *)lpvBuf = MAKEWORD(NDIS_MINOR_VERSION, NDIS_MAJOR_VERSION);

                break;



            case OID_GEN_MAXIMUM_TOTAL_SIZE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_TOTAL_SIZE\r\n"))); 

                *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;

                break;



            case OID_GEN_PROTOCOL_OPTIONS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_PROTOCOL_OPTIONS\r\n"))); 

                DEBUGMSG(ZONE_ERROR, (TEXT("This is a set-only OID.\r\n"))); 

                *lpcbWritten = 0;

                status = NDIS_STATUS_NOT_SUPPORTED;

                break;



            case OID_GEN_MAC_OPTIONS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAC_OPTIONS\r\n"))); 

                *(UINT *)lpvBuf = (NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |

                                   NDIS_MAC_OPTION_TRANSFERS_NOT_PEND);

                break;



            case OID_GEN_MEDIA_CONNECT_STATUS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_CONNECT_STATUS\r\n"))); 

                // Since we are not physically connect to a LAN, we can

                // not determine whether or not we are connected, so we 

                // always indicate that we are.

                *(UINT *)lpvBuf = NdisMediaStateConnected;

                break;



            case OID_GEN_MAXIMUM_SEND_PACKETS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_SEND_PACKETS\r\n"))); 

                //

                // Currently we only support IrsirSend and not IrsirSendPackets.

                //

                *(UINT *)lpvBuf = 1;

                break;



            //

            // Statistical OIDs.

            //

            case OID_GEN_XMIT_OK:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_XMIT_OK\r\n"))); 

                *(UINT *)lpvBuf = pMiniport->TxPackets();

                break;



            case OID_GEN_RCV_OK:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_OK\r\n"))); 

                *(UINT *)lpvBuf = pMiniport->RxPackets();

                break;



            case OID_GEN_XMIT_ERROR:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_XMIT_ERROR\r\n"))); 

                *(UINT *)lpvBuf = pMiniport->TxPacketsDropped();

                break;



            case OID_GEN_RCV_ERROR:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_ERROR\r\n"))); 

                *(UINT *)lpvBuf = pMiniport->RxPacketsDropped();

                break;



            case OID_GEN_RCV_NO_BUFFER:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_NO_BUFFER\r\n"))); 

                *(UINT *)lpvBuf = pMiniport->RxPacketsOverflowed();

                break;



            //

            // IrDA OIDs.

            //

            case OID_IRDA_RECEIVING:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_RECEIVING\r\n"))); 

                *(UINT *)lpvBuf = (UINT)TRUE;

                break;



            case OID_IRDA_TURNAROUND_TIME:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_TURNAROUND_TIME\r\n"))); 

                //

                // I don't know if this is right but it is good enough for now.

                //

                //*(UINT *)lpvBuf = MAX(pMiniport->capsDongle.dwTAT_usec, 5000);

                *(UINT *)lpvBuf = 5000;

                break;



            case OID_IRDA_SUPPORTED_SPEEDS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_SUPPORTED_SPEEDS\r\n"))); 

                {

                    DWORD  i;

                    UINT * lpTempBuf = (UINT *)lpvBuf;



                    *lpcbWritten = 0;

                    for (i = 0; i < NUM_BAUDRATES; i++)

                    {

                    

                        *lpTempBuf++ = (UINT)v_rgSupportedBaudRates[i].dwBPS;

                        *lpcbWritten += sizeof(UINT);

                        DEBUGMSG(ZONE_QUERYINFO,

                                (TEXT("    %s BPS Supported.\r\n"),

                                 v_rgSupportedBaudRates[i].lpszDbgSpeed)

                                 );

                    }

                }

                break;



            case OID_IRDA_LINK_SPEED:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_LINK_SPEED\r\n"))); 

                //

                // We want to make sure that the baud rate is protected by a

                // critical section.l.

                //

                EnterCriticalSection( &pMiniport->m_ListCriticalSection);

                ASSERT(pMiniport->GetCurrentBaudRate() != NULL);

                *(UINT *)lpvBuf = (UINT)pMiniport->GetCurrentBaudRate();

                LeaveCriticalSection( &pMiniport->m_ListCriticalSection);

                break;



            //

            // This checks to see if the IRDA is currently busy sending packets.

            //

            case OID_IRDA_MEDIA_BUSY:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MEDIA_BUSY\r\n"))); 

                *(UINT *)lpvBuf = (UINT) pMiniport->m_fMediaBusy;

                break;



            case OID_IRDA_MAX_RECEIVE_WINDOW_SIZE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MAX_RECEIVE_WINDOW_SIZE\r\n"))); 

                *(UINT *)lpvBuf = MAX_RX_PACKETS;

                break;



            case OID_IRDA_MAX_SEND_WINDOW_SIZE:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MAX_SEND_WINDOW_SIZE\r\n"))); 

                *(UINT *)lpvBuf = MAX_TX_PACKETS;

                break;



            //

            // This is the extra begining of frame that occur at 1.152 Kbs.

            // The other values are scaled from this value.  I currently have no

            // idea how many begining of frames are needed to let the systems

            // sync up.

            //

            case OID_IRDA_EXTRA_RCV_BOFS:

                DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_EXTRA_RCV_BOFS\r\n"))); 

                *(UINT *)lpvBuf = (UINT)v_rgSupportedBaudRates[BAUDRATE_115200].dwExtraBOFs;

                break;





            //

            // We really should release the Interrupt thread, Interrupt event and

            // so that the serial port driver could use this function.

            //

            case OID_IRDA_RELEASE_HW_RESOURCES:

                DEBUGMSG(ZONE_QUERYINFO | ZONE_WARN, (TEXT("Query: OID_IRDA_RELEASE_HW_RESOURCES\r\n"))); 

                status = NDIS_STATUS_NOT_SUPPORTED;

                break;



            // Unsupported IrDA OIDs.

            case OID_IRDA_REACQUIRE_HW_RESOURCES:

            case OID_IRDA_RATE_SNIFF:

            case OID_IRDA_UNICAST_LIST:

            case OID_IRDA_MAX_UNICAST_LIST_SIZE:

                status = NDIS_STATUS_NOT_SUPPORTED;

                break;



            default:

                status = NDIS_STATUS_INVALID_OID;

                break;

        }

    }        





    DEBUGMSG(ZONE_QUERYINFO,

             (TEXT("-MiniportQueryInformation [status = 0x%.8X, %dL]"),

              status, status));

    return(status);

}





//****************************************************************************

// MiniportSetInformation

//****************************************************************************

// Allows the protocol to control the miniport by changing some of the 

// information the miniport maintains. 

//

// Arguments:

//

//    hContext    - Handle to miniport context. (IRMiniport *).

//    

//    Oid         - System defined OID_Xxx.

//    

//    lpvBuf      - Buffer containing data for setting the OID information.

//    

//    cbBuf       - Size of lpvBuf in bytes.

//    

//    lpcbWritten - Number of bytes read from lpvBuf.

//    

//    lpcbNeeded  - Additional bytes required if cbBuf less than the information

//                  needed to set the OID.

//

// Returns:

//

//    NDIS_STATUS Code.

//    

//        Success - NDIS_STATUS_SUCCESS.

//        

//                  NDIS_STATUS_PENDING:

//                    Will complete asynchronously and call 

//                    NdisMSetInformationComplete.

//

//        Failure - NDIS_STATUS_INVALID_OID:

//                    Don't recognize the OID.

//

//                  NDIS_STATUS_INVALID_LENGTH:

//                    lpvBuf does not match length for OID.

//

//                  NDIS_STATUS_NOT_ACCEPTED:                      

//                    Failure.

//                    

//                  NDIS_STATUS_NOT_SUPPORTED:

//                    Do not support optional OID.

//                    

//                  NDIS_STATUS_RESOURCES:

//                    Failure resources allocation.    

//

NDIS_STATUS MiniportSetInformation

(

    IN NDIS_HANDLE  hContext,

    IN NDIS_OID     Oid,

    IN PVOID        lpvBuf,

    IN ULONG        cbBuf,

    OUT PULONG      lpcbRead,

    OUT PULONG      lpcbNeeded 

⌨️ 快捷键说明

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