- Merge aicom-network-fixes up to r36371

svn path=/trunk/; revision=36372
This commit is contained in:
Cameron Gutman 2008-09-21 12:41:26 +00:00
parent 82d36803fa
commit 0f1167cbc0
5 changed files with 54 additions and 57 deletions

View file

@ -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

View file

@ -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)

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;