rendered paste bodyVOID 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__"--");}