📄 support.c
字号:
/*++
Copyright (c) 2000 Microsoft Corporation. All rights reserved.
File: support.c
Developed for Toshiba by Elisa Research Inc., CA
http://www.elisaresearch.com
(510) 770-4920
Abstract:
Author:
A. Wang
Environment:
Kernel mode
Revision History:
09/23/96 kyleb Added tbAtm155RemoveHash to remove the VC_BLOCK
from the hash table when it is deactivated.
01/07/97 awang Initial of Toshiba ATM 155 Device Driver.
--*/
#include "precomp.h"
#pragma hdrstop
#define MODULE_NUMBER MODULE_SUPPORT
#if DBG
VOID
InsertPacketAtTailDpc(
IN PPACKET_QUEUE PacketQ,
IN PNDIS_PACKET Packet
)
/*++
Routine Description:
This routine will insert a packet at the tail end of a packet queue.
Arguments:
PacketQ - Pointer to the structure representing the packet queue
to add the packet to.
Packet - Pointer to the packet to queue.
Return Value:
None.
--*/
{
if (NULL == PacketQ->Head)
{
PacketQ->Head = Packet;
}
else
{
PACKET_RESERVED_FROM_PACKET(PacketQ->Tail)->Next = Packet;
}
PacketQ->Tail = Packet;
PACKET_RESERVED_FROM_PACKET(Packet)->Next = NULL;
PacketQ->References++;
}
VOID
InsertPacketAtTail(
IN PPACKET_QUEUE PacketQ,
IN PNDIS_PACKET Packet
)
/*++
Routine Description:
This routine will insert a packet at the tail end of a packet queue.
Arguments:
PacketQ - Pointer to the structure representing the packet queue
to add the packet to.
Packet - Pointer to the packet to queue.
Return Value:
None.
--*/
{
if (NULL == PacketQ->Head)
{
PacketQ->Head = Packet;
}
else
{
PACKET_RESERVED_FROM_PACKET(PacketQ->Tail)->Next = Packet;
}
PacketQ->Tail = Packet;
PACKET_RESERVED_FROM_PACKET(Packet)->Next = NULL;
PacketQ->References++;
}
VOID
RemovePacketFromHeadDpc(
IN PPACKET_QUEUE PacketQ,
OUT PNDIS_PACKET *Packet
)
/*++
Routine Description:
This routine will remove a packet from the head of the queue.
Arguments:
PacketQ - Pointer to the structure representing the packet queue
to add the packet to.
Packet - Pointer to the place to store the packet removed.
Return Value:
--*/
{
*Packet = PacketQ->Head;
if (NULL != *Packet)
{
PacketQ->Head = PACKET_RESERVED_FROM_PACKET(*Packet)->Next;
PacketQ->References--;
}
PACKET_RESERVED_FROM_PACKET(*Packet)->Next = NULL;
}
VOID
RemovePacketFromHead(
IN PPACKET_QUEUE PacketQ,
OUT PNDIS_PACKET *Packet
)
/*++
Routine Description:
This routine will remove a packet from the head of the queue.
Arguments:
PacketQ - Pointer to the structure representing the packet queue
to add the packet to.
Packet - Pointer to the place to store the packet removed.
Return Value:
--*/
{
*Packet = PacketQ->Head;
if (NULL != *Packet)
{
PacketQ->Head = PACKET_RESERVED_FROM_PACKET(*Packet)->Next;
PacketQ->References--;
}
PACKET_RESERVED_FROM_PACKET(*Packet)->Next = NULL;
}
VOID
InitializeMapRegisterQueue(
IN PMAP_REGISTER_QUEUE MapRegistersQ
)
/*++
Routine Description:
This routine will initialize a MAP_REGISTER queue structure for use.
Arguments:
MapRegistersQ - Pointer to the MAP_REGISTER_QUEUE to initialize.
Return Value:
None.
--*/
{
MapRegistersQ->Head = NULL;
MapRegistersQ->Tail = NULL;
MapRegistersQ->References = 0;
NdisAllocateSpinLock(&MapRegistersQ->lock);
}
VOID
InsertMapRegisterAtTail(
IN PMAP_REGISTER_QUEUE MapRegistersQ,
IN PMAP_REGISTER MapRegister
)
/*++
Routine Description:
This routine will insert an index of map register at the tail end
of a map registers queue.
Arguments:
MapRegistersQ - Pointer to the structure representing the index of
map register to add to.
MapRegister - Pointer to the index of map register to queue.
Return Value:
None.
--*/
{
if (NULL == MapRegistersQ->Head)
{
MapRegistersQ->Head = MapRegister;
}
else
{
MapRegistersQ->Tail->Next = MapRegister;
}
MapRegistersQ->Tail = MapRegister;
MapRegister->Next = NULL;
MapRegistersQ->References++;
}
VOID
RemoveMapRegisterFromHead(
IN PMAP_REGISTER_QUEUE MapRegistersQ,
OUT PMAP_REGISTER *MapRegister
)
/*++
Routine Description:
This routine will remove an index of map register from the head of
the queue.
Arguments:
MapRegistersQ - Pointer to the structure representing the index of
map register to add to.
MapRegister - Pointer to the index of map register to queue.
Return Value:
--*/
{
*MapRegister = MapRegistersQ->Head;
if (NULL != *MapRegister)
{
MapRegistersQ->Head = (*MapRegister)->Next;
(*MapRegister)->Next = NULL;
}
MapRegistersQ->References--;
}
#endif // end of DBG
VOID
tbAtm155InsertRecvBufferAtTail(
IN PRECV_BUFFER_QUEUE pBufferQ,
IN PRECV_BUFFER_HEADER pRecvHeader,
IN BOOLEAN CheckIfInitBuffer
)
/*++
Routine Description:
This routine will insert an receive buffer header into at the tail end
of a receive buffer queue.
Arguments:
pBufferQ - Pointer to the receive buffer queue of
the receive buffer add to.
pRecvHeader - Pointer to the receive buffer to queue.
CheckIfBufferIsFreed - TRUE Check if the buffer is being freed.
FALSE Skip the checking.
Return Value:
None.
--*/
{
//
// DBGPRINT(DBG_COMP_VC, DBG_LEVEL_INFO,
// ("==>tbAtm155InsertRecvBufferAtTail\n"));
//
NdisAcquireSpinLock(&pBufferQ->lock);
if (NULL != pRecvHeader)
{
if (CheckIfInitBuffer == TRUE)
{
//
// Kill the next pointer for the buffers.
//
pRecvHeader->FlushBuffer->Next = NULL;
pRecvHeader->NdisBuffer->Next = NULL;
//
// Re-adjust both the flush and NDIS buffers back to their
// allocation size.
//
NdisAdjustBufferLength(
pRecvHeader->FlushBuffer,
pRecvHeader->Alloc[RECV_BUFFER_ALIGNED].Size);
NdisAdjustBufferLength(
pRecvHeader->NdisBuffer,
pRecvHeader->Alloc[RECV_BUFFER_ALIGNED].Size);
pRecvHeader->pVc = NULL;
#if DBG
NdisZeroMemory (
(PVOID)pRecvHeader->Alloc[RECV_BUFFER_ALIGNED].VirtualAddress,
1536);
#endif // end of DBG
} // end of if (CheckIfInitBuffer == TRUE)
//
// Is the free buffer list empty?
//
if (NULL == pBufferQ->BufListHead)
{
//
// Place the receive buffer at the head of the free list.
//
pBufferQ->BufListHead = pRecvHeader;
pBufferQ->BufListTail = pRecvHeader;
pRecvHeader->Next = NULL;
pRecvHeader->Prev = NULL;
}
else
{
//
// Insert the receive buffer at the end of the free list.
//
pRecvHeader->Prev = pBufferQ->BufListTail;
pRecvHeader->Next = NULL;
pBufferQ->BufListTail->Next = pRecvHeader;
pBufferQ->BufListTail = pRecvHeader;
}
pBufferQ->BufferCount++;
} // end of if (NULL != pRecvHeader)
NdisReleaseSpinLock(&pBufferQ->lock);
//
// DBGPRINT(DBG_COMP_VC, DBG_LEVEL_INFO,
// ("<==tbAtm155InsertRecvBufferAtTail\n"));
//
}
VOID
tbAtm155RemoveReceiveBufferFromHead(
IN PRECV_BUFFER_QUEUE pBufferQ,
OUT PRECV_BUFFER_HEADER *pRecvHeader
)
/*++
Routine Description:
This routine will remove an index of map register from the head of
the queue.
Arguments:
pBufferQ - Pointer to the receive buffer queue of
the receive buffer add to.
pRecvHeader - Pointer to the receive buffer to be removed from
the receive buffer queue.
Return Value:
--*/
{
NdisAcquireSpinLock(&pBufferQ->lock);
*pRecvHeader = pBufferQ->BufListHead;
if (NULL != *pRecvHeader)
{
pBufferQ->BufListHead = (*pRecvHeader)->Next;
if (NULL == (*pRecvHeader)->Next)
{
//
// Reset the pointer of pBufferQ->BufListTail if the
// queue is empty
//
pBufferQ->BufListTail = NULL;
}
else
{
pBufferQ->BufListHead->Prev = NULL;
(*pRecvHeader)->Next = NULL;
}
pBufferQ->BufferCount--;
}
NdisReleaseSpinLock(&pBufferQ->lock);
}
VOID
tbAtm155SearchRecvBufferFromQueue(
IN PRECV_BUFFER_QUEUE pBufferQ,
IN ULONG PostedTag,
OUT PRECV_BUFFER_HEADER *pRecvHeader
)
/*++
Routine Description:
This routine will search the receive in the buffer queue with the
with the specific physcial address.
Arguments:
pBufferQ - Pointer to the receive buffer queue of
the receive buffer add to.
PostedTag - The Tag was reported in Rx report queue.
pRecvHeader - Pointer to the receive buffer we are looking for.
NULL will be return, if the buffer is not found.
Return Value:
None.
--*/
{
PRECV_BUFFER_HEADER ptmpRecvHeader;
ULONG SearchBC;
BOOLEAN BufferIsFound = FALSE;
NdisDprAcquireSpinLock(&pBufferQ->lock);
for (ptmpRecvHeader = pBufferQ->BufListHead, SearchBC = pBufferQ->BufferCount;
((NULL != ptmpRecvHeader) && SearchBC);
ptmpRecvHeader = ptmpRecvHeader->Next, SearchBC--)
{
if (PostedTag == ptmpRecvHeader->TagPosted)
{
//
// Found the receive buffer we are looking for.
// Remove from this list.
//
if ((NULL != ptmpRecvHeader->Next) && (NULL != ptmpRecvHeader->Prev))
{
//
// The receive buffer is in the middle of the list.
//
ptmpRecvHeader->Next->Prev = ptmpRecvHeader->Prev;
ptmpRecvHeader->Prev->Next = ptmpRecvHeader->Next;
}
else if (NULL == ptmpRecvHeader->Next)
{
//
// The receive buffer is at the end of the list.
// Update the BufListTail.
// If this buffer is the last one in the queue,
// pBufferQ->BufListTail will be set to NULL.
//
pBufferQ->BufListTail = ptmpRecvHeader->Prev;
if (NULL == ptmpRecvHeader->Prev)
{
//
// The queue is empty now.
//
pBufferQ->BufListHead = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -