mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-29 19:26:33 +00:00
- 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:
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user