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

📄 support.c

📁 网络驱动开发
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++

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 + -