- Merge aicom-network-fixes up to r36198

svn path=/trunk/; revision=36204
This commit is contained in:
Cameron Gutman 2008-09-14 00:48:32 +00:00
parent 86e3d23459
commit ddce511a68
5 changed files with 100 additions and 25 deletions

View file

@ -465,7 +465,7 @@ NdisAllocatePacketPool(
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -694,7 +694,7 @@ NdisCopyFromPacketToPacket(
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -710,12 +710,42 @@ NdisDprAllocatePacket(
* PoolHandle = Handle returned by NdisAllocatePacketPool * PoolHandle = Handle returned by NdisAllocatePacketPool
*/ */
{ {
*Status = NDIS_STATUS_FAILURE; PNDIS_PACKET Temp;
PNDISI_PACKET_POOL Pool = (PNDISI_PACKET_POOL)PoolHandle;
NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Packet (0x%X) PoolHandle (0x%X).\n",
Status, Packet, PoolHandle));
*Packet = NULL;
if (Pool == NULL)
{
*Status = NDIS_STATUS_FAILURE;
return;
}
KeAcquireSpinLockAtDpcLevel(&Pool->SpinLock.SpinLock);
if (Pool->FreeList) {
Temp = Pool->FreeList;
Pool->FreeList = (PNDIS_PACKET)Temp->Private.Head;
KeReleaseSpinLockFromDpcLevel(&Pool->SpinLock.SpinLock);
RtlZeroMemory(&Temp->Private, sizeof(NDIS_PACKET_PRIVATE));
Temp->Private.Pool = Pool;
*Packet = Temp;
*Status = NDIS_STATUS_SUCCESS;
} else {
*Status = NDIS_STATUS_RESOURCES;
KeReleaseSpinLockFromDpcLevel(&Pool->SpinLock.SpinLock);
}
} }
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -731,12 +761,37 @@ NdisDprAllocatePacketNonInterlocked(
* PoolHandle = Handle returned by NdisAllocatePacketPool * PoolHandle = Handle returned by NdisAllocatePacketPool
*/ */
{ {
*Status = NDIS_STATUS_FAILURE; PNDIS_PACKET Temp;
PNDISI_PACKET_POOL Pool = (PNDISI_PACKET_POOL)PoolHandle;
NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Packet (0x%X) PoolHandle (0x%X).\n",
Status, Packet, PoolHandle));
*Packet = NULL;
if (Pool == NULL)
{
*Status = NDIS_STATUS_FAILURE;
return;
}
if (Pool->FreeList) {
Temp = Pool->FreeList;
Pool->FreeList = (PNDIS_PACKET)Temp->Private.Head;
RtlZeroMemory(&Temp->Private, sizeof(NDIS_PACKET_PRIVATE));
Temp->Private.Pool = Pool;
*Packet = Temp;
*Status = NDIS_STATUS_SUCCESS;
} else {
*Status = NDIS_STATUS_RESOURCES;
}
} }
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -748,11 +803,17 @@ NdisDprFreePacket(
* Packet = Pointer to packet to free * Packet = Pointer to packet to free
*/ */
{ {
NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet));
KeAcquireSpinLockAtDpcLevel(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock);
Packet->Private.Head = (PNDIS_BUFFER)((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList;
((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList = Packet;
KeReleaseSpinLockFromDpcLevel(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock);
} }
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -764,6 +825,10 @@ NdisDprFreePacketNonInterlocked(
* Packet = Pointer to packet to free * Packet = Pointer to packet to free
*/ */
{ {
NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet));
Packet->Private.Head = (PNDIS_BUFFER)((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList;
((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList = Packet;
} }
@ -891,13 +956,15 @@ NdisGetFirstBufferFromPacket(
Buffer = _Packet->Private.Head; Buffer = _Packet->Private.Head;
*_FirstBuffer = Buffer; *_FirstBuffer = Buffer;
*_FirstBufferVA = MmGetMdlVirtualAddress(Buffer);
if (Buffer != NULL) { if (Buffer != NULL) {
*_FirstBufferLength = MmGetMdlByteCount(Buffer); *_FirstBufferLength = MmGetMdlByteCount(Buffer);
*_FirstBufferVA = MmGetSystemAddressForMdl(Buffer);
Buffer = Buffer->Next; Buffer = Buffer->Next;
} else } else {
*_FirstBufferLength = 0; *_FirstBufferLength = 0;
*_FirstBufferVA = NULL;
}
*_TotalBufferLength = *_FirstBufferLength; *_TotalBufferLength = *_FirstBufferLength;

View file

@ -59,7 +59,7 @@ EthDeleteFilter(
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -100,7 +100,7 @@ EthFilterDprIndicateReceive(
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -112,7 +112,6 @@ EthFilterDprIndicateReceiveComplete(
* Filter = Pointer to Ethernet filter * Filter = Pointer to Ethernet filter
*/ */
{ {
KIRQL OldIrql;
PLIST_ENTRY CurrentEntry; PLIST_ENTRY CurrentEntry;
PLOGICAL_ADAPTER Adapter; PLOGICAL_ADAPTER Adapter;
PADAPTER_BINDING AdapterBinding; PADAPTER_BINDING AdapterBinding;
@ -124,7 +123,7 @@ EthFilterDprIndicateReceiveComplete(
Adapter = (PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport; Adapter = (PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport;
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
{ {
CurrentEntry = Adapter->ProtocolListHead.Flink; CurrentEntry = Adapter->ProtocolListHead.Flink;
@ -138,7 +137,7 @@ EthFilterDprIndicateReceiveComplete(
CurrentEntry = CurrentEntry->Flink; CurrentEntry = CurrentEntry->Flink;
} }
} }
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
} }
/* EOF */ /* EOF */

View file

@ -198,7 +198,7 @@ NdisImmediateWritePortUlong(
/* /*
* @unimplemented * @implemented
*/ */
VOID VOID
EXPORT EXPORT
@ -819,7 +819,7 @@ NdisMRegisterInterrupt(
/* /*
* @unimplemented * @implemented
*/ */
NDIS_STATUS NDIS_STATUS
EXPORT EXPORT

View file

@ -767,16 +767,17 @@ VOID NTAPI MiniportDpc(
PVOID WorkItemContext; PVOID WorkItemContext;
NDIS_WORK_ITEM_TYPE WorkItemType; NDIS_WORK_ITEM_TYPE WorkItemType;
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
NdisStatus = NdisStatus =
MiniDequeueWorkItem MiniDequeueWorkItem
(Adapter, &WorkItemType, &WorkItemContext); (Adapter, &WorkItemType, &WorkItemContext);
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
if (NdisStatus == NDIS_STATUS_SUCCESS) if (NdisStatus == NDIS_STATUS_SUCCESS)
{ {
switch (WorkItemType) switch (WorkItemType)
@ -869,8 +870,6 @@ VOID NTAPI MiniportDpc(
break; break;
} }
} }
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
} }
@ -1207,6 +1206,17 @@ DoQueries(
return NdisStatus; return NdisStatus;
} }
NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_SEND_PACKETS, sizeof(ULONG),
&Adapter->NdisMiniportBlock.MaxSendPackets, &BytesWritten);
if (NdisStatus != NDIS_STATUS_SUCCESS)
{
NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_SEND_PACKETS failed. NdisStatus (0x%X).\n", NdisStatus));
/* Set it to 1 if it fails because some drivers don't support this (?)*/
Adapter->NdisMiniportBlock.MaxSendPackets = 1;
}
NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead)); NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead));
if (Adapter->NdisMiniportBlock.MaximumLookahead != 0) if (Adapter->NdisMiniportBlock.MaximumLookahead != 0)

View file

@ -63,7 +63,6 @@ ProIndicatePacket(
* - XXX ATM, this only handles loopback packets - is that its designed function? * - XXX ATM, this only handles loopback packets - is that its designed function?
*/ */
{ {
KIRQL OldIrql;
UINT BufferedLength; UINT BufferedLength;
UINT PacketLength; UINT PacketLength;
@ -76,12 +75,12 @@ ProIndicatePacket(
NdisQueryPacket(Packet, NULL, NULL, NULL, &PacketLength); NdisQueryPacket(Packet, NULL, NULL, NULL, &PacketLength);
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
{ {
Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = Packet; Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = Packet;
BufferedLength = CopyPacketToBuffer(Adapter->LookaheadBuffer, Packet, 0, Adapter->NdisMiniportBlock.CurrentLookahead); BufferedLength = CopyPacketToBuffer(Adapter->LookaheadBuffer, Packet, 0, Adapter->NdisMiniportBlock.CurrentLookahead);
} }
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
if (BufferedLength > Adapter->MediumHeaderSize) if (BufferedLength > Adapter->MediumHeaderSize)
{ {
@ -96,11 +95,11 @@ ProIndicatePacket(
} }
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
{ {
Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = NULL; Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = NULL;
} }
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }