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

📄 request.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 3 页
字号:

        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 = pIrDevice->cPacketsTx;
            break;

        case OID_GEN_RCV_OK:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_OK\r\n"))); 
            *(UINT *)lpvBuf = pIrDevice->cPacketsRx;
            break;

        case OID_GEN_XMIT_ERROR:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_XMIT_ERROR\r\n"))); 
            *(UINT *)lpvBuf = pIrDevice->cPacketsTxDropped;
            break;

        case OID_GEN_RCV_ERROR:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_ERROR\r\n"))); 
            *(UINT *)lpvBuf = pIrDevice->cPacketsRxDropped;
            break;

        case OID_GEN_RCV_NO_BUFFER:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_NO_BUFFER\r\n"))); 
            *(UINT *)lpvBuf = pIrDevice->cPacketsRxOverflow;
            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"))); 
            *(UINT *)lpvBuf = MAX(pIrDevice->capsDongle.dwTAT_usec, 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++)
                {
                    if (v_rgSupportedBaudRates[i].dwSpeedMask & 
                        pIrDevice->dwSupportedSpeedsMask)
                    {
                        ASSERT((*lpcbWritten + sizeof(UINT)) <= cbBuf);
                        *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"))); 
            NdisAcquireSpinLock(&pIrDevice->slDevice);
            ASSERT(pIrDevice->pCurrBaud != NULL);
            *(UINT *)lpvBuf = (UINT)pIrDevice->pCurrBaud->dwBPS;
            NdisReleaseSpinLock(&pIrDevice->slDevice);
            break;

        case OID_IRDA_MEDIA_BUSY:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MEDIA_BUSY\r\n"))); 
            NdisAcquireSpinLock(&pIrDevice->slDevice);

            DEBUGMSG(
                ZONE_WARN && (pIrDevice->cMediaBusyRxBytes || pIrDevice->cMediaBusyRxErrs), 
                (TEXT("QMB: %s, cm=%#x, RxBytes=%d, RxErrs=%d\r\n"), 
                 pIrDevice->fMediaBusy == TRUE ? TEXT("Busy") : TEXT("Idle"),
                 pIrDevice->dwCommMask,
                 pIrDevice->cMediaBusyRxBytes,
                 pIrDevice->cMediaBusyRxErrs));

            // Get current status
            if (pIrDevice->pCurrBaud->dwBPS == 576000  ||
                pIrDevice->pCurrBaud->dwBPS == 1152000 ||
                pIrDevice->pCurrBaud->dwBPS == 4000000    )
            {
                FIRMediaBusy(pIrDevice);
            }

            // Since we wait on CommEvents, fMediaBusy will be set if 
            // an error occurs. 
            *(UINT *)lpvBuf = (UINT)pIrDevice->fMediaBusy;

            // Turn of looking for errors IFF fMediaBusy = FALSE. Otherwise,
            // the recv loop will have turned it off.
            if (pIrDevice->fMediaBusy == FALSE)
            {
                pIrDevice->dwCommMask &= ~EV_ERR;
                SetCommMask(pIrDevice->hSerial, pIrDevice->dwCommMask);

                DEBUGMSG(ZONE_COMMMASK,
                         (TEXT("QMB:SetCommMask 0x%.8X\r\n"), 
                          pIrDevice->dwCommMask)
                         );
            }
            NdisReleaseSpinLock(&pIrDevice->slDevice);

            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;

        case OID_IRDA_EXTRA_RCV_BOFS:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_EXTRA_RCV_BOFS\r\n"))); 
            *(UINT *)lpvBuf = (UINT)pIrDevice->capsDongle.dwExtraBOFs;
            break;

        case OID_IRDA_RELEASE_HW_RESOURCES:
            DEBUGMSG(ZONE_QUERYINFO | ZONE_WARN, (TEXT("Query: OID_IRDA_RELEASE_HW_RESOURCES\r\n"))); 
            if (pIrDevice->hSerial != INVALID_HANDLE_VALUE)
            {
                PIRSIR_REQUEST pRequest;
                HANDLE         hRequestThread;
                DWORD          dwRequestThreadId;
    
                pRequest = IrsirAlloc(MT_NOT_SPECIFIED, sizeof(IRSIR_REQUEST));
    
                if (pRequest == NULL)
                {
                    status = NDIS_STATUS_RESOURCES;
                    goto done;
                }
    
                pRequest->pIrDevice = pIrDevice;
                pRequest->NdisRequest.RequestType = NdisRequestQueryInformation;
                pRequest->NdisRequest.DATA.QUERY_INFORMATION.Oid = Oid;
                pRequest->NdisRequest.DATA.QUERY_INFORMATION.InformationBuffer = lpvBuf;
                pRequest->NdisRequest.DATA.QUERY_INFORMATION.InformationBufferLength = cbBuf;
    
                // Worker thread frees the request object.
                hRequestThread = CreateThread(NULL, 0, IrsirpNdisRequest,
                                              pRequest, 0, &dwRequestThreadId);
    
                if (hRequestThread == NULL)
                {
                    status = NDIS_STATUS_RESOURCES;
                    goto done;
                }
    
                CloseHandle(hRequestThread);
    
                status = NDIS_STATUS_PENDING;
            }
            else
            {
                // We already have released resources.
                status = NDIS_STATUS_FAILURE;
                DEBUGMSG(ZONE_ERROR,
                    (TEXT("IrSIR: RELEASE_RESOURCES - Already have released resources!\r\n")));
            }
            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;
    }

done:

    DEBUGMSG(ZONE_QUERYINFO,
             (TEXT("-IrsirQueryInformation [status = 0x%.8X, %dL]")
              TEXT(" *lpcbWritten = %d, *lpcbNeeded = %d.\r\n"),
              status, status, *lpcbWritten, *lpcbNeeded)
             );

    return (status);
}

/*++

 Function:       IrsirSetInformation

 Description:    Allows the protocol to control the miniport by changing
                 some of the information the miniport maintains. 

 Arguments:

    hContext    - Handle to miniport context. (PIR_DEVICE).
    
    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.    

 Comments:

 See v_rgSupportedOids array for supported OIDs.

--*/

NDIS_STATUS
IrsirSetInformation(
    IN  NDIS_HANDLE hContext,
    IN  NDIS_OID    Oid,
    IN  PVOID       lpvBuf,
    IN  ULONG       cbBuf,
    OUT PULONG      lpcbRead,
    OUT PULONG      lpcbNeeded
    )
{
    PIR_DEVICE  pIrDevice = (PIR_DEVICE)hContext;
    NDIS_STATUS status    = NDIS_STATUS_SUCCESS;

    ASSERT(lpvBuf != NULL);
    ASSERT(lpcbRead != NULL);
    ASSERT(lpcbNeeded != NULL);

    DEBUGMSG(ZONE_SETINFO,
             (TEXT("+IrsirSetInformation(0x%.8X, 0x%.8X, 0x%.8x, %d, ")
              TEXT("0x%.8X, 0x%.8X)\r\n"),
              hContext, Oid, lpvBuf, cbBuf, lpcbRead, lpcbNeeded)
             );
    
    //
    // Set defaults.
    //

    *lpcbRead   = sizeof(UINT);
    *lpcbNeeded = 0;

    switch (Oid)
    {
        //
        // Generic OIDs.
        //

//      case OID_GEN_CURRENT_PACKET_FILTER:
//          DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_GEN_CURRENT_PACKET_FILTER\r\n"))); 
//          break;

        case OID_GEN_CURRENT_LOOKAHEAD:
            DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_GEN_CURRENT_LOOKAHEAD\r\n"))); 
            // This is only a suggestion from the protocol. 
            // We always indicate the entire frame at once. Ignore this.
            break;

        case OID_GEN_PROTOCOL_OPTIONS:
            DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_GEN_PROTOCOL_OPTIONS\r\n"))); 
            // Flags to help out the miniport. Ignore.
            break;

        //
        // IrDA OIDs.
        //

        case OID_IRDA_LINK_SPEED:
            DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_IRDA_LINK_SPEED\r\n"))); 
            {
                PIRSIR_REQUEST pRequest;
                HANDLE         hRequestThread;
                DWORD          dwRequestThreadId;

                pRequest = IrsirAlloc(MT_NOT_SPECIFIED, sizeof(IRSIR_REQUEST));

                if (pRequest == NULL)
                {
                    status = NDIS_STATUS_RESOURCES;
                    goto done;
                }

                pRequest->pIrDevice = pIrDevice;
                pRequest->NdisRequest.RequestType = NdisRequestSetInformation;
                pRequest->NdisRequest.DATA.SET_INFORMATION.Oid = Oid;
                pRequest->NdisRequest.DATA.SET_INFORMATION.InformationBuffer = lpvBuf;
                pRequest->NdisRequest.DATA.SET_INFORMATION.InformationBufferLength = cbBuf;

                // Worker thread frees the request object.
                hRequestThread = CreateThread(NULL, 0, IrsirpNdisRequest,

⌨️ 快捷键说明

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