Locked);
ASSERT(IsZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO)));
+ ASSERT3P(Packet->Ring, ==, Ring);
return Packet;
}
Receiver = Ring->Receiver;
Frontend = Receiver->Frontend;
+ ASSERT3P(Packet->Ring, ==, Ring);
ASSERT(IsZeroMemory(&Packet->ListEntry, sizeof (LIST_ENTRY)));
Packet->Offset = 0;
)
{
PXENVIF_FRONTEND Frontend;
+ CHAR Name[MAXNAMELEN];
NTSTATUS status;
Frontend = Receiver->Frontend;
KeInitializeTimer(&(*Ring)->Timer);
KeInitializeDpc(&(*Ring)->TimerDpc, ReceiverRingDpc, *Ring);
+ status = RtlStringCbPrintfA(Name,
+ sizeof (Name),
+ "%s_receiver_packet",
+ (*Ring)->Path);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ for (Index = 0; Name[Index] != '\0'; Index++)
+ if (Name[Index] == '/')
+ Name[Index] = '_';
+
+ status = XENBUS_CACHE(Create,
+ &Receiver->CacheInterface,
+ Name,
+ sizeof (XENVIF_RECEIVER_PACKET),
+ 0,
+ ReceiverPacketCtor,
+ ReceiverPacketDtor,
+ ReceiverRingAcquireLock,
+ ReceiverRingReleaseLock,
+ *Ring,
+ &(*Ring)->PacketCache);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+ status = RtlStringCbPrintfA(Name,
+ sizeof (Name),
+ "%s_receiver_fragment",
+ (*Ring)->Path);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
+ for (Index = 0; Name[Index] != '\0'; Index++)
+ if (Name[Index] == '/')
+ Name[Index] = '_';
+
+ status = XENBUS_CACHE(Create,
+ &Receiver->CacheInterface,
+ Name,
+ sizeof (XENVIF_RECEIVER_FRAGMENT),
+ 0,
+ ReceiverFragmentCtor,
+ ReceiverFragmentDtor,
+ ReceiverRingAcquireLock,
+ ReceiverRingReleaseLock,
+ *Ring,
+ &(*Ring)->FragmentCache);
+ if (!NT_SUCCESS(status))
+ goto fail6;
+
status = ThreadCreate(ReceiverRingWatchdog,
*Ring,
&(*Ring)->WatchdogThread);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail7;
return STATUS_SUCCESS;
+fail7:
+ Error("fail7\n");
+
+ XENBUS_CACHE(Destroy,
+ &Receiver->CacheInterface,
+ (*Ring)->FragmentCache);
+ (*Ring)->FragmentCache = NULL;
+
+fail6:
+ Error("fail6\n");
+
+fail5:
+ Error("fail5\n");
+
+ XENBUS_CACHE(Destroy,
+ &Receiver->CacheInterface,
+ (*Ring)->PacketCache);
+ (*Ring)->PacketCache = NULL;
+
+fail4:
+ Error("fail4\n");
+
fail3:
Error("fail3\n");
Receiver = Ring->Receiver;
Frontend = Receiver->Frontend;
- status = RtlStringCbPrintfA(Name,
- sizeof (Name),
- "%s_receiver_packet",
- Ring->Path);
- if (!NT_SUCCESS(status))
- goto fail1;
-
- for (Index = 0; Name[Index] != '\0'; Index++)
- if (Name[Index] == '/')
- Name[Index] = '_';
-
- status = XENBUS_CACHE(Create,
- &Receiver->CacheInterface,
- Name,
- sizeof (XENVIF_RECEIVER_PACKET),
- 0,
- ReceiverPacketCtor,
- ReceiverPacketDtor,
- ReceiverRingAcquireLock,
- ReceiverRingReleaseLock,
- Ring,
- &Ring->PacketCache);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- status = RtlStringCbPrintfA(Name,
- sizeof (Name),
- "%s_receiver_fragment",
- Ring->Path);
- if (!NT_SUCCESS(status))
- goto fail3;
-
- for (Index = 0; Name[Index] != '\0'; Index++)
- if (Name[Index] == '/')
- Name[Index] = '_';
-
- status = XENBUS_CACHE(Create,
- &Receiver->CacheInterface,
- Name,
- sizeof (XENVIF_RECEIVER_FRAGMENT),
- 0,
- ReceiverFragmentCtor,
- ReceiverFragmentDtor,
- ReceiverRingAcquireLock,
- ReceiverRingReleaseLock,
- Ring,
- &Ring->FragmentCache);
- if (!NT_SUCCESS(status))
- goto fail4;
-
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_receiver",
Ring->Path);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail1;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
Ring,
&Ring->GnttabCache);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail2;
Ring->Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Ring->Mdl == NULL)
- goto fail7;
+ goto fail3;
Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
ASSERT(Ring->Shared != NULL);
FALSE,
&Ring->Entry);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail4;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
__MODULE__ "|RECEIVER[%u]",
Ring->Index);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail5;
ASSERT(!Ring->Connected);
status = STATUS_UNSUCCESSFUL;
if (Ring->Channel == NULL)
- goto fail10;
+ goto fail6;
status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
ASSERT(NT_SUCCESS(status));
Ring,
&Ring->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail7;
return STATUS_SUCCESS;
-fail11:
- Error("fail11\n");
+fail7:
+ Error("fail7\n");
Ring->Connected = FALSE;
Ring->Events = 0;
-fail10:
- Error("fail10\n");
+fail6:
+ Error("fail6\n");
-fail9:
- Error("fail9\n");
+fail5:
+ Error("fail5\n");
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Receiver->GnttabInterface,
Ring->Entry);
Ring->Entry = NULL;
-fail8:
- Error("fail8\n");
+fail4:
+ Error("fail4\n");
RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
RtlZeroMemory(Ring->Shared, PAGE_SIZE);
__FreePage(Ring->Mdl);
Ring->Mdl = NULL;
-fail7:
- Error("fail7\n");
+fail3:
+ Error("fail3\n");
XENBUS_GNTTAB(DestroyCache,
&Receiver->GnttabInterface,
Ring->GnttabCache);
Ring->GnttabCache = NULL;
-fail6:
- Error("fail6\n");
-
-fail5:
- Error("fail5\n");
-
- XENBUS_CACHE(Destroy,
- &Receiver->CacheInterface,
- Ring->FragmentCache);
- Ring->FragmentCache = NULL;
-
-fail4:
- Error("fail4\n");
-
-fail3:
- Error("fail3\n");
-
- XENBUS_CACHE(Destroy,
- &Receiver->CacheInterface,
- Ring->PacketCache);
- Ring->PacketCache = NULL;
-
fail2:
Error("fail2\n");
&Receiver->GnttabInterface,
Ring->GnttabCache);
Ring->GnttabCache = NULL;
-
- XENBUS_CACHE(Destroy,
- &Receiver->CacheInterface,
- Ring->FragmentCache);
- Ring->FragmentCache = NULL;
-
- XENBUS_CACHE(Destroy,
- &Receiver->CacheInterface,
- Ring->PacketCache);
- Ring->PacketCache = NULL;
}
static FORCEINLINE VOID
ThreadJoin(Ring->WatchdogThread);
Ring->WatchdogThread = NULL;
+ XENBUS_CACHE(Destroy,
+ &Receiver->CacheInterface,
+ Ring->FragmentCache);
+ Ring->FragmentCache = NULL;
+
+ XENBUS_CACHE(Destroy,
+ &Receiver->CacheInterface,
+ Ring->PacketCache);
+ Ring->PacketCache = NULL;
+
ASSERT(IsListEmpty(&Ring->PacketList));
RtlZeroMemory(&Ring->PacketList, sizeof (LIST_ENTRY));
(*Receiver)->Frontend = Frontend;
+ status = XENBUS_CACHE(Acquire, &(*Receiver)->CacheInterface);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
MaxQueues = FrontendGetMaxQueues(Frontend);
(*Receiver)->Ring = __ReceiverAllocate(sizeof (PXENVIF_RECEIVER_RING) *
MaxQueues);
status = STATUS_NO_MEMORY;
if ((*Receiver)->Ring == NULL)
- goto fail2;
+ goto fail3;
Index = 0;
while (Index < MaxQueues) {
status = __ReceiverRingInitialize(*Receiver, Index, &Ring);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail4;
(*Receiver)->Ring[Index] = Ring;
Index++;
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
+fail4:
+ Error("fail4\n");
while (--Index >= 0) {
PXENVIF_RECEIVER_RING Ring = (*Receiver)->Ring[Index];
(*Receiver)->Ring = NULL;
+fail3:
+ Error("fail3\n");
+
+ XENBUS_CACHE(Release, &(*Receiver)->CacheInterface);
+
fail2:
Error("fail2\n");
if (!NT_SUCCESS(status))
goto fail3;
- status = XENBUS_CACHE(Acquire, &Receiver->CacheInterface);
- if (!NT_SUCCESS(status))
- goto fail4;
-
status = XENBUS_GNTTAB(Acquire, &Receiver->GnttabInterface);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
Index = 0;
while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
status = __ReceiverRingConnect(Ring);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail5;
Index++;
}
Receiver,
&Receiver->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail6;
Trace("<====\n");
return STATUS_SUCCESS;
-fail7:
- Error("fail7\n");
+fail6:
+ Error("fail6\n");
Index = FrontendGetNumQueues(Frontend);
-fail6:
- Error("fail6\n");
+fail5:
+ Error("fail5\n");
while (--Index >= 0) {
PXENVIF_RECEIVER_RING Ring = Receiver->Ring[Index];
XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
-fail5:
- Error("fail5\n");
-
- XENBUS_CACHE(Release, &Receiver->CacheInterface);
-
fail4:
Error("fail4\n");
XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
- XENBUS_CACHE(Release, &Receiver->CacheInterface);
-
XENBUS_EVTCHN(Release, &Receiver->EvtchnInterface);
XENBUS_STORE(Release, &Receiver->StoreInterface);
__ReceiverFree(Receiver->Ring);
Receiver->Ring = NULL;
+ XENBUS_CACHE(Release, &Receiver->CacheInterface);
+
Receiver->Frontend = NULL;
RtlZeroMemory(&Receiver->EvtchnInterface,
__ReceiverRingReturnPacket(Ring, Packet, FALSE);
+ KeMemoryBarrier();
+
Returned = InterlockedIncrement(&Receiver->Returned);
// Make sure Loaned is not sampled before Returned
Frontend = Receiver->Frontend;
- Info("%s: ====>\n", FrontendGetPath(Frontend));
+ Trace("%s: ====>\n", FrontendGetPath(Frontend));
Returned = Receiver->Returned;
ASSERT3S(Loaned, ==, Receiver->Loaned);
}
- Info("%s: <====\n", FrontendGetPath(Frontend));
+ Info("%s: (Loaned = %d Returned = %d)\n",
+ FrontendGetPath(Frontend),
+ Loaned,
+ Returned);
+
+ Trace("%s: <====\n", FrontendGetPath(Frontend));
}
VOID
)
{
PXENVIF_FRONTEND Frontend;
+ CHAR Name[MAXNAMELEN];
NTSTATUS status;
Frontend = Transmitter->Frontend;
KeInitializeTimer(&(*Ring)->Timer);
KeInitializeDpc(&(*Ring)->TimerDpc, TransmitterRingDpc, *Ring);
- status = ThreadCreate(TransmitterRingWatchdog,
- *Ring,
- &(*Ring)->WatchdogThread);
- if (!NT_SUCCESS(status))
- goto fail3;
-
- return STATUS_SUCCESS;
-
-fail3:
- Error("fail3\n");
-
- RtlZeroMemory(&(*Ring)->TimerDpc, sizeof (KDPC));
- RtlZeroMemory(&(*Ring)->Timer, sizeof (KTIMER));
- RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC));
-
- RtlZeroMemory(&(*Ring)->PacketComplete, sizeof (LIST_ENTRY));
- RtlZeroMemory(&(*Ring)->RequestQueue, sizeof (LIST_ENTRY));
- RtlZeroMemory(&(*Ring)->PacketQueue, sizeof (LIST_ENTRY));
-
- FrontendFreePath(Frontend, (*Ring)->Path);
- (*Ring)->Path = NULL;
-
-fail2:
- Error("fail2\n");
-
- (*Ring)->Index = 0;
- (*Ring)->Transmitter = NULL;
-
- ASSERT(IsZeroMemory(*Ring, sizeof (XENVIF_TRANSMITTER_RING)));
- __TransmitterFree(*Ring);
- *Ring = NULL;
-
-fail1:
- Error("fail1 (%08x)\n", status);
-
- return status;
-}
-
-static FORCEINLINE NTSTATUS
-__TransmitterRingConnect(
- IN PXENVIF_TRANSMITTER_RING Ring
- )
-{
- PXENVIF_TRANSMITTER Transmitter;
- PXENVIF_FRONTEND Frontend;
- PFN_NUMBER Pfn;
- CHAR Name[MAXNAMELEN];
- ULONG Index;
- PROCESSOR_NUMBER ProcNumber;
- NTSTATUS status;
-
- ASSERT(!Ring->Connected);
-
- Transmitter = Ring->Transmitter;
- Frontend = Transmitter->Frontend;
-
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter_buffer",
- Ring->Path);
+ (*Ring)->Path);
if (!NT_SUCCESS(status))
- goto fail1;
+ goto fail3;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
TransmitterBufferDtor,
TransmitterRingAcquireLock,
TransmitterRingReleaseLock,
- Ring,
- &Ring->BufferCache);
+ *Ring,
+ &(*Ring)->BufferCache);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail4;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter_multicast_control",
- Ring->Path);
+ (*Ring)->Path);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail5;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
TransmitterMulticastControlDtor,
TransmitterRingAcquireLock,
TransmitterRingReleaseLock,
- Ring,
- &Ring->MulticastControlCache);
+ *Ring,
+ &(*Ring)->MulticastControlCache);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail6;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter_req_id",
- Ring->Path);
+ (*Ring)->Path);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail7;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
status = XENBUS_RANGE_SET(Create,
&Transmitter->RangeSetInterface,
Name,
- &Ring->RangeSet);
+ &(*Ring)->RangeSet);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail8;
status = XENBUS_RANGE_SET(Put,
&Transmitter->RangeSetInterface,
- Ring->RangeSet,
+ (*Ring)->RangeSet,
1,
XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail9;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter_fragment",
- Ring->Path);
+ (*Ring)->Path);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail10;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
TransmitterFragmentDtor,
TransmitterRingAcquireLock,
TransmitterRingReleaseLock,
- Ring,
- &Ring->FragmentCache);
+ *Ring,
+ &(*Ring)->FragmentCache);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail11;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter_request",
- Ring->Path);
+ (*Ring)->Path);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail12;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
TransmitterRequestDtor,
TransmitterRingAcquireLock,
TransmitterRingReleaseLock,
- Ring,
- &Ring->RequestCache);
+ *Ring,
+ &(*Ring)->RequestCache);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail13;
+
+ status = ThreadCreate(TransmitterRingWatchdog,
+ *Ring,
+ &(*Ring)->WatchdogThread);
+ if (!NT_SUCCESS(status))
+ goto fail14;
+
+ return STATUS_SUCCESS;
+
+fail14:
+ Error("fail14\n");
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ (*Ring)->RequestCache);
+ (*Ring)->RequestCache = NULL;
+
+fail13:
+ Error("fail13\n");
+
+fail12:
+ Error("fail12\n");
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ (*Ring)->FragmentCache);
+ (*Ring)->FragmentCache = NULL;
+
+fail11:
+ Error("fail11\n");
+
+fail10:
+ Error("fail10\n");
+
+ (VOID) XENBUS_RANGE_SET(Get,
+ &Transmitter->RangeSetInterface,
+ (*Ring)->RangeSet,
+ 1,
+ XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
+
+fail9:
+ Error("fail9\n");
+
+ XENBUS_RANGE_SET(Destroy,
+ &Transmitter->RangeSetInterface,
+ (*Ring)->RangeSet);
+ (*Ring)->RangeSet = NULL;
+
+fail8:
+ Error("fail8\n");
+
+fail7:
+ Error("fail7\n");
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ (*Ring)->MulticastControlCache);
+ (*Ring)->MulticastControlCache = NULL;
+
+fail6:
+ Error("fail6\n");
+
+fail5:
+ Error("fail5\n");
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ (*Ring)->BufferCache);
+ (*Ring)->BufferCache = NULL;
+
+fail4:
+ Error("fail4\n");
+
+fail3:
+ Error("fail3\n");
+
+ RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC));
+
+ RtlZeroMemory(&(*Ring)->PacketComplete, sizeof (LIST_ENTRY));
+ RtlZeroMemory(&(*Ring)->RequestQueue, sizeof (LIST_ENTRY));
+ RtlZeroMemory(&(*Ring)->PacketQueue, sizeof (LIST_ENTRY));
+
+ FrontendFreePath(Frontend, (*Ring)->Path);
+ (*Ring)->Path = NULL;
+
+fail2:
+ Error("fail2\n");
+
+ (*Ring)->Index = 0;
+ (*Ring)->Transmitter = NULL;
+
+ ASSERT(IsZeroMemory(*Ring, sizeof (XENVIF_TRANSMITTER_RING)));
+ __TransmitterFree(*Ring);
+ *Ring = NULL;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+static FORCEINLINE NTSTATUS
+__TransmitterRingConnect(
+ IN PXENVIF_TRANSMITTER_RING Ring
+ )
+{
+ PXENVIF_TRANSMITTER Transmitter;
+ PXENVIF_FRONTEND Frontend;
+ PFN_NUMBER Pfn;
+ CHAR Name[MAXNAMELEN];
+ ULONG Index;
+ PROCESSOR_NUMBER ProcNumber;
+ NTSTATUS status;
+
+ ASSERT(!Ring->Connected);
+
+ Transmitter = Ring->Transmitter;
+ Frontend = Transmitter->Frontend;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter",
Ring->Path);
if (!NT_SUCCESS(status))
- goto fail12;
+ goto fail1;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
Ring,
&Ring->GnttabCache);
if (!NT_SUCCESS(status))
- goto fail13;
+ goto fail2;
Ring->Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Ring->Mdl == NULL)
- goto fail14;
+ goto fail3;
Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
ASSERT(Ring->Shared != NULL);
FALSE,
&Ring->Entry);
if (!NT_SUCCESS(status))
- goto fail15;
+ goto fail4;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
__MODULE__ "|TRANSMITTER[%u]",
Ring->Index);
if (!NT_SUCCESS(status))
- goto fail16;
+ goto fail5;
ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
status = STATUS_UNSUCCESSFUL;
if (Ring->Channel == NULL)
- goto fail17;
+ goto fail6;
status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
ASSERT(NT_SUCCESS(status));
Ring,
&Ring->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail18;
+ goto fail7;
Ring->Connected = TRUE;
return STATUS_SUCCESS;
-fail18:
- Error("fail18\n");
+fail7:
+ Error("fail7\n");
XENBUS_EVTCHN(Close,
&Transmitter->EvtchnInterface,
Ring->Events = 0;
-fail17:
- Error("fail17\n");
+fail6:
+ Error("fail6\n");
-fail16:
- Error("fail16\n");
+fail5:
+ Error("fail5\n");
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Transmitter->GnttabInterface,
Ring->Entry);
Ring->Entry = NULL;
-fail15:
- Error("fail15\n");
+fail4:
+ Error("fail4\n");
RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
RtlZeroMemory(Ring->Shared, PAGE_SIZE);
__FreePage(Ring->Mdl);
Ring->Mdl = NULL;
-fail14:
- Error("fail14\n");
+fail3:
+ Error("fail3\n");
XENBUS_GNTTAB(DestroyCache,
&Transmitter->GnttabInterface,
Ring->GnttabCache);
Ring->GnttabCache = NULL;
-fail13:
- Error("fail13\n");
-
-fail12:
- Error("fail12\n");
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->RequestCache);
- Ring->RequestCache = NULL;
-
-fail11:
- Error("fail11\n");
-
-fail10:
- Error("fail10\n");
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->FragmentCache);
- Ring->FragmentCache = NULL;
-
-fail9:
- Error("fail9\n");
-
-fail8:
- Error("fail8\n");
-
- (VOID) XENBUS_RANGE_SET(Get,
- &Transmitter->RangeSetInterface,
- Ring->RangeSet,
- 1,
- XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
-
-fail7:
- Error("fail7\n");
-
- XENBUS_RANGE_SET(Destroy,
- &Transmitter->RangeSetInterface,
- Ring->RangeSet);
- Ring->RangeSet = NULL;
-
-fail6:
- Error("fail6\n");
-
-fail5:
- Error("fail5\n");
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->MulticastControlCache);
- Ring->MulticastControlCache = NULL;
-
-fail4:
- Error("fail4\n");
-
-fail3:
- Error("fail3\n");
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->BufferCache);
- Ring->BufferCache = NULL;
-
fail2:
Error("fail2\n");
&Transmitter->GnttabInterface,
Ring->GnttabCache);
Ring->GnttabCache = NULL;
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->RequestCache);
- Ring->RequestCache = NULL;
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->FragmentCache);
- Ring->FragmentCache = NULL;
-
- (VOID) XENBUS_RANGE_SET(Get,
- &Transmitter->RangeSetInterface,
- Ring->RangeSet,
- 1,
- XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
-
- XENBUS_RANGE_SET(Destroy,
- &Transmitter->RangeSetInterface,
- Ring->RangeSet);
- Ring->RangeSet = NULL;
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->MulticastControlCache);
- Ring->MulticastControlCache = NULL;
-
- XENBUS_CACHE(Destroy,
- &Transmitter->CacheInterface,
- Ring->BufferCache);
- Ring->BufferCache = NULL;
}
static FORCEINLINE VOID
ThreadJoin(Ring->WatchdogThread);
Ring->WatchdogThread = NULL;
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ Ring->RequestCache);
+ Ring->RequestCache = NULL;
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ Ring->FragmentCache);
+ Ring->FragmentCache = NULL;
+
+ (VOID) XENBUS_RANGE_SET(Get,
+ &Transmitter->RangeSetInterface,
+ Ring->RangeSet,
+ 1,
+ XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
+
+ XENBUS_RANGE_SET(Destroy,
+ &Transmitter->RangeSetInterface,
+ Ring->RangeSet);
+ Ring->RangeSet = NULL;
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ Ring->MulticastControlCache);
+ Ring->MulticastControlCache = NULL;
+
+ XENBUS_CACHE(Destroy,
+ &Transmitter->CacheInterface,
+ Ring->BufferCache);
+ Ring->BufferCache = NULL;
+
ASSERT(IsListEmpty(&Ring->PacketComplete));
RtlZeroMemory(&Ring->PacketComplete, sizeof (LIST_ENTRY));
(*Transmitter)->Frontend = Frontend;
KeInitializeSpinLock(&(*Transmitter)->Lock);
+ status = XENBUS_RANGE_SET(Acquire, &(*Transmitter)->RangeSetInterface);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = XENBUS_CACHE(Acquire, &(*Transmitter)->CacheInterface);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
MaxQueues = FrontendGetMaxQueues(Frontend);
(*Transmitter)->Ring = __TransmitterAllocate(sizeof (PXENVIF_TRANSMITTER_RING) *
MaxQueues);
status = STATUS_NO_MEMORY;
if ((*Transmitter)->Ring == NULL)
- goto fail2;
+ goto fail4;
Index = 0;
while (Index < MaxQueues) {
status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail5;
(*Transmitter)->Ring[Index] = Ring;
Index++;
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
+fail5:
+ Error("fail5\n");
while (--Index > 0) {
PXENVIF_TRANSMITTER_RING Ring = (*Transmitter)->Ring[Index];
__TransmitterFree((*Transmitter)->Ring);
(*Transmitter)->Ring = NULL;
+fail4:
+ Error("fail4\n");
+
+ XENBUS_CACHE(Release, &(*Transmitter)->CacheInterface);
+
+fail3:
+ Error("fail3\n");
+
+ XENBUS_RANGE_SET(Release, &(*Transmitter)->RangeSetInterface);
+
fail2:
Error("fail2\n");
if (!NT_SUCCESS(status))
goto fail3;
- status = XENBUS_RANGE_SET(Acquire, &Transmitter->RangeSetInterface);
- if (!NT_SUCCESS(status))
- goto fail4;
-
- status = XENBUS_CACHE(Acquire, &Transmitter->CacheInterface);
- if (!NT_SUCCESS(status))
- goto fail5;
-
status = XENBUS_GNTTAB(Acquire, &Transmitter->GnttabInterface);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail4;
status = RtlStringCbPrintfA(Name,
sizeof (Name),
"%s_transmitter_packet",
FrontendGetPath(Frontend));
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail5;
for (Index = 0; Name[Index] != '\0'; Index++)
if (Name[Index] == '/')
Transmitter,
&Transmitter->PacketCache);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail6;
status = XENBUS_STORE(Read,
&Transmitter->StoreInterface,
status = __TransmitterRingConnect(Ring);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail7;
Index++;
}
Transmitter,
&Transmitter->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail8;
Trace("<====\n");
return STATUS_SUCCESS;
-fail10:
- Error("fail10\n");
+fail8:
+ Error("fail8\n");
Index = FrontendGetNumQueues(Frontend);
-fail9:
- Error("fail9\n");
+fail7:
+ Error("fail7\n");
while (--Index >= 0) {
PXENVIF_TRANSMITTER_RING Ring;
Transmitter->PacketCache);
Transmitter->PacketCache = NULL;
-fail8:
- Error("fail8\n");
-
-fail7:
- Error("fail7\n");
-
- XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
-
fail6:
Error("fail6\n");
- XENBUS_CACHE(Release, &Transmitter->CacheInterface);
-
fail5:
Error("fail5\n");
- XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
+ XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
fail4:
Error("fail4\n");
XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
- XENBUS_CACHE(Release, &Transmitter->CacheInterface);
-
- XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
-
XENBUS_EVTCHN(Release, &Transmitter->EvtchnInterface);
XENBUS_STORE(Release, &Transmitter->StoreInterface);
__TransmitterFree(Transmitter->Ring);
Transmitter->Ring = NULL;
+ XENBUS_CACHE(Release, &Transmitter->CacheInterface);
+
+ XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
+
Transmitter->Frontend = NULL;
RtlZeroMemory(&Transmitter->Lock,