📄 irfir.cpp
字号:
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 + -