All pastes #2093397 Raw Edit

Anonymous

public c v1 · immutable
#2093397 ·published 2011-11-09 17:40 UTC
rendered paste body
VOID SqnUsbVMapAndSubscribeFreeFrames(IN  PSQNUSBV_ADAPTER	Adapter){	PSQNUSBV_RX_PACKET_DESCRIPTOR pLastOperationalPacket = NULL;	PSQNUSBV_RX_FRAME_DESCRIPTOR pFrameDescriptor;	PLIST_ENTRY pPacketEntry;	PLIST_ENTRY pFrameEntry;	LIST_ENTRY TempFrameList;	NDIS_STATUS status;	ULONG FreeFramesCounter = 0;	//SqnUsbVDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++");	InitializeListHead(&TempFrameList);	while (!IsListEmpty(&Adapter->RXFreeFrames)) 	{	NdisAcquireSpinLock(&Adapter->RXFreeFramesLock);		while (!IsListEmpty(&Adapter->RXFreeFrames))	{		pFrameEntry = RemoveHeadList(&Adapter->RXFreeFrames);		Adapter->RXFreeFrameCount--;		pFrameDescriptor = CONTAINING_RECORD(pFrameEntry, SQNUSBV_RX_FRAME_DESCRIPTOR, ListEntry);		// If packet already processed		ASSERT (!pFrameDescriptor->IsProcessing);		InsertTailList(&TempFrameList, &pFrameDescriptor->SubscribeListEntry);		if (++FreeFramesCounter >= SQBUSBV_MAX_FRAMES_PER_BATCH)		{			FreeFramesCounter = 0;			break;		}	}	NdisReleaseSpinLock(&Adapter->RXFreeFramesLock);    if (IsListEmpty(&TempFrameList))	{		return;	}	NdisAcquireSpinLock(&Adapter->RXFramesLock);	//NdisAcquireSpinLock(&Adapter->RXOperationalPacketsLock);	if (!IsListEmpty(&Adapter->RXOperationalPackets))	{		// List of operational packets is not empty		// Let's get a tail of it		pLastOperationalPacket = CONTAINING_RECORD(Adapter->RXOperationalPackets.Blink, SQNUSBV_RX_PACKET_DESCRIPTOR, ListEntry);	}	else	{		// List of operational packets is empty		// Let's get a new one from free packet queue and add to operational packets' queue		NdisDprAcquireSpinLock(&Adapter->RXFreePacketsLock);		if (!IsListEmpty(&Adapter->RXFreePackets))        {		    pPacketEntry = RemoveHeadList(&Adapter->RXFreePackets);		    Adapter->RXFreePacketCount--;		    pLastOperationalPacket = CONTAINING_RECORD(pPacketEntry, SQNUSBV_RX_PACKET_DESCRIPTOR, ListEntry);        }		NdisDprReleaseSpinLock(&Adapter->RXFreePacketsLock);        if (pLastOperationalPacket)		    InsertTailList(&Adapter->RXOperationalPackets, &pLastOperationalPacket->ListEntry);	}    if (!pLastOperationalPacket)    {        // allocate packet        pLastOperationalPacket = SqnUsbVCreateRxPacketDescriptor(Adapter);        if (pLastOperationalPacket)        {		    InsertTailList(&Adapter->RXOperationalPackets, &pLastOperationalPacket->ListEntry);        }        else        { // return free frames to list and leave            NdisReleaseSpinLock(&Adapter->RXFramesLock);            NdisAcquireSpinLock(&Adapter->RXFreeFramesLock);		        while (!IsListEmpty(&TempFrameList))	        {		        pFrameEntry = RemoveHeadList(&TempFrameList);		        ++Adapter->RXFreeFrameCount;		        pFrameDescriptor = CONTAINING_RECORD(pFrameEntry, SQNUSBV_RX_FRAME_DESCRIPTOR, SubscribeListEntry);		        InsertTailList(&Adapter->RXFreeFrames, &pFrameDescriptor->ListEntry);	        }            NdisReleaseSpinLock(&Adapter->RXFreeFramesLock);            return;        }    }	pFrameEntry = TempFrameList.Flink;	while (pFrameEntry != &TempFrameList)	{		pFrameDescriptor = CONTAINING_RECORD(pFrameEntry, SQNUSBV_RX_FRAME_DESCRIPTOR, SubscribeListEntry);		pFrameDescriptor->Packet = pLastOperationalPacket;		pFrameDescriptor->IsProcessing = TRUE;		InsertTailList(&pLastOperationalPacket->MappedFrames, &pFrameDescriptor->ListEntry);		pLastOperationalPacket->TotalFramesCount++;		pFrameEntry = pFrameEntry->Flink;	}	//NdisReleaseSpinLock(&Adapter->RXOperationalPacketsLock);	NdisReleaseSpinLock(&Adapter->RXFramesLock);	NdisAcquireSpinLock(&Adapter->RXSubscribeLock);	SqnUsbVSubscribeFrameList(Adapter, &TempFrameList);	NdisReleaseSpinLock(&Adapter->RXSubscribeLock);	}	//SqnUsbVDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--");}