)
{
PXENNET_ADAPTER Adapter = Argument;
+ LONG Count;
+
+ (VOID) InterlockedDecrement(&AdapterCount);
+
+ Count = InterlockedIncrement(&AdapterCount);
+ ASSERT(Count != 0);
- (VOID) __AdapterSetDistribution(Adapter);
+ if (Count == 1)
+ (VOID) __AdapterSetDistribution(Adapter);
}
static NTSTATUS
Count = InterlockedIncrement(&AdapterCount);
ASSERT(Count != 0);
- if (Count != 1)
- goto done;
-
- status = __AdapterSetDistribution(Adapter);
- if (!NT_SUCCESS(status))
- goto fail1;
+ if (Count == 1)
+ (VOID) __AdapterSetDistribution(Adapter);
status = XENBUS_SUSPEND(Register,
&Adapter->SuspendInterface,
Adapter,
&Adapter->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
-done:
Trace("<====\n");
return STATUS_SUCCESS;
-fail2:
- Error("fail2\n");
-
- __AdapterClearDistribution(Adapter);
-
fail1:
Error("fail1 (%08x)\n", status);
+ Count = InterlockedDecrement(&AdapterCount);
+
+ if (Count == 0)
+ __AdapterClearDistribution(Adapter);
+
return status;
}
Trace("====>\n");
- Count = InterlockedDecrement(&AdapterCount);
-
- if (Count != 0)
- goto done;
-
XENBUS_SUSPEND(Deregister,
&Adapter->SuspendInterface,
Adapter->SuspendCallbackLate);
Adapter->SuspendCallbackLate = NULL;
- __AdapterClearDistribution(Adapter);
+ Count = InterlockedDecrement(&AdapterCount);
+
+ if (Count == 0)
+ __AdapterClearDistribution(Adapter);
-done:
Trace("<====\n");
}
if (!NT_SUCCESS(status))
goto fail2;
- (VOID) AdapterSetDistribution(Adapter);
+ status = AdapterSetDistribution(Adapter);
+ if (!NT_SUCCESS(status))
+ goto fail3;
status = XENVIF_VIF(Enable,
&Adapter->VifInterface,
AdapterVifCallback,
Adapter);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail4;
AdapterMediaStateChange(Adapter);
return NDIS_STATUS_SUCCESS;
-fail3:
+fail4:
AdapterClearDistribution(Adapter);
+fail3:
XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
fail2:
NdisMDeregisterScatterGatherDma(Adapter->NdisDmaHandle);
Adapter->NdisDmaHandle = NULL;
- AdapterClearDistribution(Adapter);
-
XENVIF_VIF(Release, &Adapter->VifInterface);
RtlZeroMemory(&Adapter->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));