mirror of
https://github.com/reactos/reactos.git
synced 2024-06-19 19:28:22 +00:00
- Merge aicom-network-fixes up to r36371
svn path=/trunk/; revision=36372
This commit is contained in:
parent
82d36803fa
commit
0f1167cbc0
|
@ -97,7 +97,7 @@ typedef struct IPADDR_ENTRY {
|
|||
#define FUNCTION_CLOSE 5
|
||||
#define MAX_FUNCTIONS 6
|
||||
|
||||
#define IN_FLIGHT_REQUESTS 3
|
||||
#define IN_FLIGHT_REQUESTS 4
|
||||
|
||||
#define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
|
||||
* for ancillary data on packet
|
||||
|
|
|
@ -28,38 +28,16 @@ VOID NTAPI HandleDeferredProcessing(
|
|||
* SystemArgument2 = Unused
|
||||
*/
|
||||
{
|
||||
BOOLEAN WasBusy;
|
||||
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
|
||||
|
||||
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
|
||||
|
||||
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
|
||||
|
||||
/* XXX try to grok WasBusy */
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
{
|
||||
WasBusy = Adapter->MiniportBusy;
|
||||
Adapter->MiniportBusy = TRUE;
|
||||
}
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
|
||||
/* Call the deferred interrupt service handler for this adapter */
|
||||
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.HandleInterruptHandler)(
|
||||
Adapter->NdisMiniportBlock.MiniportAdapterContext);
|
||||
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
{
|
||||
if ((!WasBusy) && (Adapter->WorkQueueHead))
|
||||
{
|
||||
KeInsertQueueDpc(&Adapter->NdisMiniportBlock.DeferredDpc, NULL, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
Adapter->MiniportBusy = WasBusy;
|
||||
}
|
||||
}
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
|
||||
/* re-enable the interrupt */
|
||||
NDIS_DbgPrint(MAX_TRACE, ("re-enabling the interrupt\n"));
|
||||
if(Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.EnableInterruptHandler)
|
||||
|
|
|
@ -309,10 +309,11 @@ MiniResetComplete(
|
|||
|
||||
VOID NTAPI
|
||||
MiniRequestComplete(
|
||||
IN PNDIS_MINIPORT_BLOCK Adapter,
|
||||
IN PNDIS_HANDLE MiniportAdapterHandle,
|
||||
IN PNDIS_REQUEST Request,
|
||||
IN NDIS_STATUS Status)
|
||||
{
|
||||
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)Request->MacReserved;
|
||||
KIRQL OldIrql;
|
||||
|
||||
|
@ -326,6 +327,7 @@ MiniRequestComplete(
|
|||
Status);
|
||||
}
|
||||
KeLowerIrql(OldIrql);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
}
|
||||
|
||||
VOID NTAPI
|
||||
|
@ -342,6 +344,7 @@ MiniSendComplete(
|
|||
* Status = Status of send operation
|
||||
*/
|
||||
{
|
||||
PLOGICAL_ADAPTER Adapter = MiniportAdapterHandle;
|
||||
PADAPTER_BINDING AdapterBinding;
|
||||
KIRQL OldIrql;
|
||||
|
||||
|
@ -355,6 +358,7 @@ MiniSendComplete(
|
|||
Packet,
|
||||
Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -375,6 +379,7 @@ MiniTransferDataComplete(
|
|||
IN NDIS_STATUS Status,
|
||||
IN UINT BytesTransferred)
|
||||
{
|
||||
PLOGICAL_ADAPTER Adapter = MiniportAdapterHandle;
|
||||
PADAPTER_BINDING AdapterBinding;
|
||||
KIRQL OldIrql;
|
||||
|
||||
|
@ -388,6 +393,7 @@ MiniTransferDataComplete(
|
|||
Packet,
|
||||
Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -655,6 +661,12 @@ MiniDequeueWorkItem(
|
|||
|
||||
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
|
||||
|
||||
if (Adapter->MiniportBusy) {
|
||||
NDIS_DbgPrint(MID_TRACE, ("Waiting for miniport to become free.\n"));
|
||||
KeInsertQueueDpc(&Adapter->NdisMiniportBlock.DeferredDpc, NULL, NULL);
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
Item = Adapter->WorkQueueHead;
|
||||
|
||||
if (Item)
|
||||
|
@ -670,6 +682,8 @@ MiniDequeueWorkItem(
|
|||
|
||||
ExFreePool(Item);
|
||||
|
||||
Adapter->MiniportBusy = TRUE;
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -738,14 +752,15 @@ NdisMQueryInformationComplete(
|
|||
IN NDIS_HANDLE MiniportAdapterHandle,
|
||||
IN NDIS_STATUS Status)
|
||||
{
|
||||
PNDIS_MINIPORT_BLOCK MiniportBlock =
|
||||
(PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
|
||||
PLOGICAL_ADAPTER Adapter =
|
||||
(PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||
KIRQL OldIrql;
|
||||
ASSERT(MiniportBlock);
|
||||
ASSERT(Adapter);
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
if( MiniportBlock->QueryCompleteHandler )
|
||||
(MiniportBlock->QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
||||
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
|
||||
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
}
|
||||
|
||||
VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
||||
|
@ -783,6 +798,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
|
||||
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
||||
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
|
||||
NdisStatus = NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -794,9 +810,15 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
|
||||
}
|
||||
KeLowerIrql(RaiseOldIrql);
|
||||
}
|
||||
|
||||
NdisStatus = NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
|
||||
NdisStatus = NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
|
||||
if( NdisStatus == NDIS_STATUS_RESOURCES ) {
|
||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||
MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext);
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -816,15 +838,18 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext, 0);
|
||||
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
||||
KeLowerIrql(RaiseOldIrql);
|
||||
if( NdisStatus == NDIS_STATUS_RESOURCES ) {
|
||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||
MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext);
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( NdisStatus == NDIS_STATUS_RESOURCES )
|
||||
MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext);
|
||||
else if( NdisStatus != NDIS_STATUS_PENDING ) {
|
||||
if( NdisStatus != NDIS_STATUS_PENDING ) {
|
||||
NdisMSendComplete
|
||||
( Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus );
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -834,7 +859,9 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
*/
|
||||
/* XXX atm ProIndicatePacket sends a packet up via the loopback adapter only */
|
||||
NdisStatus = ProIndicatePacket(Adapter, (PNDIS_PACKET)WorkItemContext);
|
||||
MiniSendComplete((NDIS_HANDLE)Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus);
|
||||
|
||||
if( NdisStatus != NDIS_STATUS_PENDING )
|
||||
MiniSendComplete((NDIS_HANDLE)Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus);
|
||||
break;
|
||||
|
||||
case NdisWorkItemReturnPackets:
|
||||
|
@ -859,12 +886,12 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
{
|
||||
case NdisRequestQueryInformation:
|
||||
NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
|
||||
MiniRequestComplete( &Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
|
||||
MiniRequestComplete( (NDIS_HANDLE)Adapter, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
|
||||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
NdisMSetInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
|
||||
MiniRequestComplete( &Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
|
||||
MiniRequestComplete( (NDIS_HANDLE)Adapter, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -879,6 +906,9 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
}
|
||||
}
|
||||
|
||||
if( NdisStatus != NDIS_STATUS_PENDING )
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
|
||||
ExFreePool(WorkItem);
|
||||
}
|
||||
|
||||
|
@ -1988,10 +2018,14 @@ NdisMSetInformationComplete(
|
|||
IN NDIS_HANDLE MiniportAdapterHandle,
|
||||
IN NDIS_STATUS Status)
|
||||
{
|
||||
PLOGICAL_ADAPTER Adapter =
|
||||
(PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||
KIRQL OldIrql;
|
||||
ASSERT(Adapter);
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
(*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)(MiniportAdapterHandle, Status);
|
||||
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -143,11 +143,6 @@ ProRequest(
|
|||
{
|
||||
if(Adapter->MiniportBusy)
|
||||
QueueWorkItem = TRUE;
|
||||
else
|
||||
{
|
||||
NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to busy\n"));
|
||||
Adapter->MiniportBusy = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */
|
||||
|
@ -160,18 +155,10 @@ ProRequest(
|
|||
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
|
||||
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest);
|
||||
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest);
|
||||
|
||||
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
|
||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||
{
|
||||
NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to free\n"));
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
|
||||
if (Adapter->WorkQueueHead)
|
||||
KeInsertQueueDpc(&Adapter->NdisMiniportBlock.DeferredDpc, NULL, NULL);
|
||||
}
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
if( NdisStatus == NDIS_STATUS_PENDING )
|
||||
Adapter->MiniportBusy = TRUE;
|
||||
|
||||
return NdisStatus;
|
||||
}
|
||||
|
|
|
@ -26,8 +26,6 @@ PVOID PoolAllocateBuffer(
|
|||
|
||||
Buffer = ExAllocatePool(NonPagedPool, Size);
|
||||
|
||||
RtlZeroMemory(Buffer, Size);
|
||||
|
||||
TI_DbgPrint(DEBUG_MEMORY, ("Allocated (%i) bytes at (0x%X).\n", Size, Buffer));
|
||||
|
||||
return Buffer;
|
||||
|
|
Loading…
Reference in a new issue