diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index 6461b6b0337..c2d6a4cc98d 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -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 */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 3da2ad16e12..f24ad39603f 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -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); diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index 741156309df..c5588c3acd9 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -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