- Restore a value that is lost in MiniportReset when AddressingReset is TRUE

- I need to do more investigation on which values need to be restored but I know CurrentLookahead is one of them
 - Add support for protocol-initiated miniport resets

svn path=/trunk/; revision=41718
This commit is contained in:
Cameron Gutman
2009-06-30 18:44:26 +00:00
parent 2fc619f0ec
commit 95f968d50b
3 changed files with 79 additions and 19 deletions
@@ -188,6 +188,14 @@ MiniIsBusy(
PLOGICAL_ADAPTER Adapter,
NDIS_WORK_ITEM_TYPE Type);
NDIS_STATUS
MiniReset(
PLOGICAL_ADAPTER Adapter);
VOID
MiniDoAddressingReset(
PLOGICAL_ADAPTER Adapter);
#endif /* __MINIPORT_H */
/* EOF */
+66 -16
View File
@@ -357,6 +357,9 @@ MiniResetComplete(
PADAPTER_BINDING AdapterBinding;
KIRQL OldIrql;
if (AddressingReset)
MiniDoAddressingReset(Adapter);
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
NdisMIndicateStatusComplete(Adapter);
@@ -638,7 +641,45 @@ MiniLocateDevice(
return Adapter;
}
NDIS_STATUS
MiniSetInformation(
PLOGICAL_ADAPTER Adapter,
NDIS_OID Oid,
ULONG Size,
PVOID Buffer,
PULONG BytesRead)
{
NDIS_STATUS NdisStatus;
PNDIS_REQUEST NdisRequest;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
NdisRequest = ExAllocatePool(NonPagedPool, sizeof(NDIS_REQUEST));
if (!NdisRequest) {
NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
return NDIS_STATUS_RESOURCES;
}
RtlZeroMemory(NdisRequest, sizeof(NDIS_REQUEST));
NdisRequest->RequestType = NdisRequestSetInformation;
NdisRequest->DATA.SET_INFORMATION.Oid = Oid;
NdisRequest->DATA.SET_INFORMATION.InformationBuffer = Buffer;
NdisRequest->DATA.SET_INFORMATION.InformationBufferLength = Size;
NdisStatus = MiniDoRequest(Adapter, NdisRequest);
/* FIXME: Wait in pending case! */
ASSERT(NdisStatus != NDIS_STATUS_PENDING);
*BytesRead = NdisRequest->DATA.SET_INFORMATION.BytesRead;
ExFreePool(NdisRequest);
return NdisStatus;
}
NDIS_STATUS
MiniQueryInformation(
PLOGICAL_ADAPTER Adapter,
@@ -712,21 +753,34 @@ MiniCheckForHang( PLOGICAL_ADAPTER Adapter )
return Ret;
}
VOID
MiniDoAddressingReset(PLOGICAL_ADAPTER Adapter)
{
ULONG BytesRead;
MiniSetInformation(Adapter,
OID_GEN_CURRENT_LOOKAHEAD,
sizeof(ULONG),
&Adapter->NdisMiniportBlock.CurrentLookahead,
&BytesRead);
/* FIXME: Set more stuff */
}
NDIS_STATUS
MiniReset(
PLOGICAL_ADAPTER Adapter,
PBOOLEAN AddressingReset)
PLOGICAL_ADAPTER Adapter)
/*
* FUNCTION: Resets the miniport
* ARGUMENTS:
* Adapter = Pointer to the logical adapter object
* AddressingReset = Set to TRUE if we need to call MiniportSetInformation later
* RETURNS:
* Status of the operation
*/
{
NDIS_STATUS Status;
KIRQL OldIrql;
BOOLEAN AddressingReset = TRUE;
if (MiniIsBusy(Adapter, NdisWorkItemResetRequested)) {
MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL, FALSE);
@@ -739,7 +793,7 @@ MiniReset(
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
AddressingReset);
&AddressingReset);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->NdisMiniportBlock.ResetStatus = Status;
@@ -748,6 +802,9 @@ MiniReset(
KeLowerIrql(OldIrql);
if (Status != NDIS_STATUS_PENDING) {
if (AddressingReset)
MiniDoAddressingReset(Adapter);
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
NdisMIndicateStatusComplete(Adapter);
}
@@ -763,15 +820,11 @@ MiniportHangDpc(
PVOID SystemArgument2)
{
PLOGICAL_ADAPTER Adapter = DeferredContext;
BOOLEAN AddressingReset = FALSE;
if (MiniCheckForHang(Adapter)) {
NDIS_DbgPrint(MIN_TRACE, ("Miniport detected adapter hang\n"));
MiniReset(Adapter, &AddressingReset);
MiniReset(Adapter);
}
/* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */
}
@@ -1133,12 +1186,9 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Adapter->NdisMiniportBlock.MiniportAdapterContext,
&AddressingReset);
if (NdisStatus == NDIS_STATUS_PENDING)
{
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->NdisMiniportBlock.ResetStatus = NDIS_STATUS_PENDING;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
}
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->NdisMiniportBlock.ResetStatus = NdisStatus;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
+5 -3
View File
@@ -341,14 +341,16 @@ ProRequest(
#endif
}
NDIS_STATUS NTAPI
ProReset(
IN NDIS_HANDLE MacBindingHandle)
{
UNIMPLEMENTED
PADAPTER_BINDING AdapterBinding = MacBindingHandle;
return NDIS_STATUS_FAILURE;
/* FIXME: Wait for all packets to be sent */
return MiniReset(AdapterBinding->Adapter);
}
VOID NTAPI