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

📄 irfir.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:

    if(!thisDev)
    {
        status = NDIS_STATUS_NOT_ACCEPTED;
        goto done;
    }

    NdisAcquireSpinLock(&thisDev->Lock);

    // CE - calls NdisMInitializeTimer instead of NdisInitializeTimer. This
    //      requires the NdisAdapterHandle. Else the timer is initialized
    //      in InitDevice.
    NdisMInitializeTimer(&thisDev->TurnaroundTimer, MiniportAdapterHandle, IrFirTimer, thisDev);

    //Allocate resources for this connection.
    if (!OpenDevice(thisDev))
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: OpenDevice failed\r\n")));
        status = NDIS_STATUS_FAILURE;
        goto done;
    }

    //  This call will associate our adapter handle with the wrapper's
    //  adapter handle.  The wrapper will then always use our handle
    //  when calling us.  We use a pointer to the device object as the context.
    NdisMSetAttributesEx(
        MiniportAdapterHandle,
        (NDIS_HANDLE)thisDev,
        0,    // Default check for hang timeout
        NDIS_ATTRIBUTE_DESERIALIZE,
        NdisInterfaceInternal);

    //  Record the NDIS wrapper's handle for this adapter, which we use
    //  when we call up to the wrapper.
    //  (This miniport's adapter handle is just thisDev, the pointer to the device object.).
    // Set NDIS wrapper context for this miniport.
    thisDev->ndisAdapterHandle = MiniportAdapterHandle;

    // Register an FIR interrupt with NDIS.
    status = NdisMRegisterInterrupt(
        (PNDIS_MINIPORT_INTERRUPT)&(thisDev->FirinterruptObj),
        MiniportAdapterHandle,
        thisDev->sysIntrFir,
        NULL,
        FALSE,   // reqeust ISR
        FALSE,   // share interrupts
        NdisInterruptLatched);
    if (status != NDIS_STATUS_SUCCESS)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: NdisMRegisterInterrupt failed, the error is %d\r\n"), GetLastError()));
        status = NDIS_STATUS_FAILURE;
        goto done;
    }

    // Register an SIR interrupt with NDIS.
    status = NdisMRegisterInterrupt(
        (PNDIS_MINIPORT_INTERRUPT)&(thisDev->SirinterruptObj),
        MiniportAdapterHandle,
        thisDev->sysIntrSir,
        NULL,
        FALSE,   // reqeust ISR
        FALSE,   // share interrupts
        NdisInterruptLatched);
    if (status != NDIS_STATUS_SUCCESS)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: NdisMRegisterInterrupt failed, the error is %d\r\n"), GetLastError()));
        status = NDIS_STATUS_FAILURE;
        goto done;
    }
	thisDev->linkSpeedInfo = NULL;
	thisDev->newSpeed = DEFAULT_BAUD_RATE;
    if (!SetSpeed(thisDev))
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: SetSpeed failed!\r\n")));
        status = NDIS_STATUS_FAILURE;
        goto done;
    }

done:
    if (status == NDIS_STATUS_SUCCESS)
    {
        // Add this device object to the beginning of our global list.
        thisDev->next = gFirstFirDevice;
        gFirstFirDevice = thisDev;

        // For WinCE, we release the resources and they will be reclaimed,
        // when OID_IRDA_REACQUIRE_HW_RESOURCES msg is recvd.
        thisDev->resourcesReleased=TRUE;

        NdisReleaseSpinLock(&thisDev->Lock);
        DEBUGMSG(ZONE_INIT, (TEXT("IrFir: IrFirInitialize succeeded\r\n")));
    }
    else
    {
        if (thisDev)
        {
            FreeDevice(thisDev);
            thisDev->resourcesReleased=TRUE;
        }
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: IrFirInitialize failed\r\n")));
    }

    return status;
}


//-----------------------------------------------------------------------------
//
// Function: IrFirCheckForHang
//
//  This function reports the state of the Fir device.
//
// Parameters:
//      MiniportAdapterContext
//          [in] .
//
// Returns:
//      This function returns TRUE if there is a error in device.
//
//-----------------------------------------------------------------------------
BOOLEAN IrFirCheckForHang( IN NDIS_HANDLE MiniportAdapterContext )
{
    BOOLEAN result = FALSE;
    pFirDevice_t thisDev = (pFirDevice_t)MiniportAdapterContext;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: +IrFirCheckForHang(0x%x)\r\n"),(UINT)MiniportAdapterContext));

    NdisAcquireSpinLock(&thisDev->Lock);
    if(thisDev->HangChk)
    {
        PLIST_ENTRY ListEntry;
        DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: Driver Hang is detected for %d times!!!\r\n"),thisDev->HangChk));

        // Free all resources for the SEND buffer queue.
        while (ListEntry = MyRemoveHeadList(&thisDev->SendQueue))
        {
           PNDIS_PACKET Packet = CONTAINING_RECORD(ListEntry,
               NDIS_PACKET,
               MiniportReserved);
           NdisReleaseSpinLock(&thisDev->Lock);
           NdisMSendComplete(thisDev->ndisAdapterHandle, Packet, NDIS_STATUS_FAILURE);
           NdisAcquireSpinLock(&thisDev->Lock);
        }

        thisDev->HangChk = FALSE;
        result = TRUE;
    }
    NdisReleaseSpinLock(&thisDev->Lock);
    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: -IrFirCheckForHang(0x%x)\r\n"),(UINT)MiniportAdapterContext));

    return result;
}


//-----------------------------------------------------------------------------
//
// Function: IrFirDisableInterrupt
//
//  This function disables interrupts.
//
// Parameters:
//      MiniportAdapterContext
//          [in] .
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
VOID IrFirDisableInterrupt( IN NDIS_HANDLE MiniportAdapterContext )
{
    pFirDevice_t thisDev = (pFirDevice_t)(MiniportAdapterContext);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: +IrFirDisableInterrupt(0x%x)\r\n"), GetLastError()));

    NdisAcquireSpinLock(&thisDev->Lock);

    if (!thisDev->resourcesReleased)
        thisDev->IR_VTbl->m_pDisableInterrupt(thisDev);
    else
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: Error operation on disable interrupt.\r\n")));

    NdisReleaseSpinLock(&thisDev->Lock);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: -IrFirDisableInterrupt(0x%x)\r\n"),(UINT)MiniportAdapterContext));
}


//-----------------------------------------------------------------------------
//
// Function: IrFirEnableInterrupt
//
//  This function enables interrupts.
//
// Parameters:
//      MiniportAdapterContext
//          [in] .
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
VOID IrFirEnableInterrupt( IN NDIS_HANDLE MiniportAdapterContext )
{
    pFirDevice_t thisDev = (pFirDevice_t)(MiniportAdapterContext);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: +IrFirEnableInterrupt(0x%x)\r\n"),(UINT)MiniportAdapterContext));

    NdisAcquireSpinLock(&thisDev->Lock);

    if (!thisDev->resourcesReleased)
        thisDev->IR_VTbl->m_pEnableInterrupt(thisDev);
    else
        DEBUGMSG(ZONE_ERROR, (TEXT("IrFir: Error operation on enable interrupt.\r\n")));

    NdisReleaseSpinLock(&thisDev->Lock);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: -IrFirEnableInterrupt(0x%x)\r\n"),(UINT)MiniportAdapterContext));
}


//-----------------------------------------------------------------------------
//
// Function: IrFirHalt
//
//  This function Halts the Fir device.
//
// Parameters:
//      MiniportAdapterContext
//          [in] .
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
VOID IrFirHalt( IN NDIS_HANDLE MiniportAdapterContext )
{
    pFirDevice_t thisDev = (pFirDevice_t)(MiniportAdapterContext);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: +IrFirHalt(0x%.8X)\r\n"), (UINT)MiniportAdapterContext));

    // Remove this device from our global list
    if (thisDev == gFirstFirDevice)
        gFirstFirDevice = gFirstFirDevice->next;
    else
    {
        pFirDevice_t dev;

        for (dev = gFirstFirDevice; dev && (dev->next != thisDev); dev = dev->next);

        if (dev)
            dev->next = dev->next->next;
        else
        {
            // Don't omit this error check.  I've seen NDIS call
            // MiniportHalt with a bogus context when the system
            // gets corrupted.
            DEBUGMSG(ZONE_WARN, (TEXT("IrFir: Bad context in IrFirHalt\r\n")));
            return;
        }
    }

    // Now destroy the device object.
    NdisAcquireSpinLock(&thisDev->Lock);
    thisDev->IR_VTbl->m_pReleaseAdapterResources(thisDev);
	//SirClose(thisDev);
    FreeDevice(thisDev);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: -IrFirHalt(0x%x)\r\n"), (UINT)MiniportAdapterContext));
}


//-----------------------------------------------------------------------------
//
// Function: IrFirHandleInterrupt
//
//  This function is the interrupt processing routine.
//
// Parameters:
//      MiniportAdapterContext
//          [in] .
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
VOID IrFirHandleInterrupt( IN NDIS_HANDLE MiniportAdapterContext )
{
    pFirDevice_t thisDev = (pFirDevice_t)MiniportAdapterContext;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: +IrFirHandleInterrupt(0x%x)\r\n"), (UINT)MiniportAdapterContext));

    NdisAcquireSpinLock(&thisDev->Lock);
    if (thisDev->resourcesReleased)
    {
        DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: IrFirHandleInterrupt, blow off, no resources!\r\n")));
    }
    else
    {
        DEBUGMSG(ZONE_FUNCTION, (TEXT("IrFir: -IrFirHandleInterrupt()\r\n")));
        thisDev->IR_VTbl->m_pInterruptHandler(thisDev);
    }
    NdisReleaseSpinLock(&thisDev->Lock);

}


//-----------------------------------------------------------------------------
//
// Function: IrFirQueryInformation
//
//  This function queries the capabilities and status of the miniport driver.
//
// Parameters:
//      MiniportAdapterContext
//          [in] .
//      Oid
//          [in] .
//      InformationBuffer
//          [in] .
//      InformationBufferLength
//          [in] .
//      BytesWritten
//          [in] .
//      BytesNeeded
//          [in] .
//
// Returns:
//      This function returns status of query.
//
//-----------------------------------------------------------------------------
NDIS_STATUS IrFirQueryInformation( IN NDIS_HANDLE MiniportAdapterContext,
    IN NDIS_OID Oid, IN PVOID InformationBuffer, IN ULONG InformationBufferLength,
    OUT PULONG BytesWritten, OUT PULONG BytesNeeded )
{
    NDIS_STATUS result = NDIS_STATUS_SUCCESS;
    pFirDevice_t thisDev = (pFirDevice_t)MiniportAdapterContext;
    NDIS_PNP_CAPABILITIES  FirPMCapabilities;
    UINT i, speeds;
    UINT *infoPtr;

    DEBUGMSG(ZONE_QUERYINFO, (TEXT("IrFir: +IrFirQueryInformation(%d)\r\n"), Oid));

    if (InformationBufferLength >= sizeof(int))
    {
        NdisAcquireSpinLock(&thisDev->Lock);

        switch (Oid)
        {
            case OID_GEN_SUPPORTED_LIST:
                DEBUGMSG(ZONE_QUERYINFO, (TEXT("IrFir: IrFirQueryInformation(OID_GEN_SUPPORTED_LIST)\r\n")));

⌨️ 快捷键说明

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