- Merge aicom-network-fixes up to r36558

svn path=/trunk/; revision=36559
This commit is contained in:
Cameron Gutman
2008-09-27 21:25:27 +00:00
parent b4d8244133
commit 12604c6f99
8 changed files with 83 additions and 66 deletions

View File

@@ -194,6 +194,8 @@ TdiBuildConnectionInfoPair
ULONG TdiAddressSize;
PTDI_CONNECTION_INFORMATION FromTdiConn, ToTdiConn;
if (!From) return STATUS_INVALID_PARAMETER;
/* FIXME: Get from socket information */
TdiAddressSize = TdiAddressSizeFromType(From->Address[0].AddressType);
SizeOfEntry = TdiAddressSize + sizeof(TDI_CONNECTION_INFORMATION);
@@ -207,15 +209,10 @@ TdiBuildConnectionInfoPair
RtlZeroMemory( LayoutFrame, 2 * SizeOfEntry );
FromTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame;
ToTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame + SizeOfEntry;
FromTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame;
ToTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame + SizeOfEntry;
if (From != NULL) {
TdiBuildConnectionInfoInPlace( FromTdiConn, From );
} else {
TdiBuildNullConnectionInfoInPlace( FromTdiConn,
From->Address[0].AddressType );
}
TdiBuildConnectionInfoInPlace( FromTdiConn, From );
TdiBuildConnectionInfoInPlace( ToTdiConn, To );

View File

@@ -544,6 +544,8 @@ static VOID NICStartTransmit(
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
if (Adapter->TXCurrent < 0) return;
//FrameStart = Adapter->TXStart + Adapter->TXCurrent * DRIVER_BLOCK_SIZE;
//FrameStart = Adapter->TXStart;
FrameStart = (UCHAR)(Adapter->TXStart + (UCHAR)(Adapter->TXCurrent * BUFFERS_PER_TX_BUF));

View File

@@ -669,13 +669,9 @@ static NDIS_STATUS STDCALL MiniportSend(
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
#ifndef NOCARD
NDIS_DbgPrint(MID_TRACE, ("Queueing packet.\n"));
#ifdef NOCARD
NdisMSendComplete(Adapter->MiniportAdapterHandle,
Packet,
NDIS_STATUS_SUCCESS);
#else
/* Queue the packet on the transmit queue */
RESERVED(Packet)->Next = NULL;
if (Adapter->TXQueueHead == NULL) {
@@ -688,8 +684,11 @@ static NDIS_STATUS STDCALL MiniportSend(
/* Transmit the packet */
NICTransmit(Adapter);
#endif
return NDIS_STATUS_PENDING;
#else
return NDIS_STATUS_SUCCESS;
#endif
}

View File

@@ -146,7 +146,7 @@ MiniDequeueWorkItem(
NDIS_STATUS
MiniDoRequest(
PNDIS_MINIPORT_BLOCK Adapter,
PLOGICAL_ADAPTER Adapter,
PNDIS_REQUEST NdisRequest);
BOOLEAN

View File

@@ -326,8 +326,10 @@ MiniRequestComplete(
Request,
Status);
}
KeLowerIrql(OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->MiniportBusy = FALSE;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
}
VOID NTAPI
@@ -357,8 +359,10 @@ MiniSendComplete(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
Packet,
Status);
KeLowerIrql(OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->MiniportBusy = FALSE;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
}
@@ -392,8 +396,10 @@ MiniTransferDataComplete(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
Packet,
Status);
KeLowerIrql(OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->MiniportBusy = FALSE;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
}
@@ -619,14 +625,18 @@ MiniReset(
* Status of the operation
*/
{
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
NDIS_STATUS Status;
KIRQL OldIrql;
/* FIXME: What should we return if there isn't a reset handler? */
if (Adapter->MiniportBusy) {
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL);
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
return NDIS_STATUS_PENDING;
}
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
AddressingReset);
KeLowerIrql(OldIrql);
@@ -763,7 +773,7 @@ MiniDequeueWorkItem(
NDIS_STATUS
MiniDoRequest(
PNDIS_MINIPORT_BLOCK Adapter,
PLOGICAL_ADAPTER Adapter,
PNDIS_REQUEST NdisRequest)
/*
* FUNCTION: Sends a request to a miniport
@@ -778,14 +788,14 @@ MiniDoRequest(
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
Adapter->MediaRequest = NdisRequest;
Adapter->NdisMiniportBlock.MediaRequest = NdisRequest;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
switch (NdisRequest->RequestType)
{
case NdisRequestQueryInformation:
Status = (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
Adapter->MiniportAdapterContext,
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
NdisRequest->DATA.QUERY_INFORMATION.Oid,
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
@@ -794,8 +804,8 @@ MiniDoRequest(
break;
case NdisRequestSetInformation:
Status = (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
Adapter->MiniportAdapterContext,
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
NdisRequest->DATA.SET_INFORMATION.Oid,
NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
@@ -807,6 +817,12 @@ MiniDoRequest(
Status = NDIS_STATUS_FAILURE;
}
if (Status == NDIS_STATUS_PENDING) {
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->MiniportBusy = TRUE;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
}
KeLowerIrql(OldIrql);
return Status;
}
@@ -829,8 +845,10 @@ NdisMQueryInformationComplete(
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
KeLowerIrql(OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->MiniportBusy = FALSE;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
}
VOID NTAPI MiniportWorker(IN PVOID WorkItem)
@@ -841,6 +859,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
NDIS_STATUS NdisStatus;
PVOID WorkItemContext;
NDIS_WORK_ITEM_TYPE WorkItemType;
BOOLEAN AddressingReset;
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
@@ -938,6 +957,16 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
break;
case NdisWorkItemResetRequested:
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
&AddressingReset);
KeLowerIrql(OldIrql);
if (NdisStatus == NDIS_STATUS_PENDING)
break;
MiniResetComplete(Adapter, NdisStatus, AddressingReset);
break;
case NdisWorkItemResetInProgress:
@@ -947,7 +976,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
break;
case NdisWorkItemRequest:
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext);
NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
if (NdisStatus == NDIS_STATUS_PENDING)
break;
@@ -976,8 +1005,11 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
}
}
if( NdisStatus != NDIS_STATUS_PENDING )
Adapter->MiniportBusy = FALSE;
if( NdisStatus != NDIS_STATUS_PENDING ) {
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
Adapter->MiniportBusy = FALSE;
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
}
ExFreePool(WorkItem);
}
@@ -1004,6 +1036,7 @@ VOID NTAPI MiniportDpc(
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_WORK_ITEM));
if (!NdisWorkItem) return;
WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved;
@@ -1496,7 +1529,7 @@ NdisIPnPStartDevice(
if (Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL)
{
ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0].
ResourceCount = Stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].
PartialResourceList.Count;
ResourceListSize =
FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
@@ -2108,8 +2141,10 @@ NdisMSetInformationComplete(
ASSERT(Adapter);
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
KeLowerIrql(OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->MiniportBusy = FALSE;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
KeLowerIrql(OldIrql);
}

View File

@@ -43,6 +43,8 @@ NdisCompleteBindAdapter(
{
PROTOCOL_BINDING *Protocol = (PROTOCOL_BINDING *)BindAdapterContext;
if (!NT_SUCCESS(Status)) return;
/* Put protocol binding struct on global list */
ExInterlockedInsertTailList(&ProtocolListHead, &Protocol->ListEntry, &ProtocolListLock);
}
@@ -119,8 +121,6 @@ ProRequest(
*/
{
KIRQL OldIrql;
BOOLEAN QueueWorkItem = FALSE;
NDIS_STATUS NdisStatus;
PADAPTER_BINDING AdapterBinding;
PLOGICAL_ADAPTER Adapter;
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
@@ -141,26 +141,15 @@ ProRequest(
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
{
if(Adapter->MiniportBusy)
QueueWorkItem = TRUE;
if (Adapter->MiniportBusy) {
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
return NDIS_STATUS_PENDING;
}
}
/* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */
if (QueueWorkItem)
{
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
return NDIS_STATUS_PENDING;
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest);
if( NdisStatus == NDIS_STATUS_PENDING )
Adapter->MiniportBusy = TRUE;
return NdisStatus;
return MiniDoRequest(Adapter, NdisRequest);
}

View File

@@ -485,16 +485,9 @@ NDIS_STATUS STDCALL ProtocolReceive(
}
else
{
if (NdisStatus == NDIS_STATUS_SUCCESS)
{
NdisTransferData(&NdisStatus, Adapter->NdisHandle,
MacReceiveContext, 0, PacketSize,
NdisPacket, &BytesTransferred);
}
else
{
BytesTransferred = 0;
}
NdisTransferData(&NdisStatus, Adapter->NdisHandle,
MacReceiveContext, 0, PacketSize,
NdisPacket, &BytesTransferred);
}
TI_DbgPrint(DEBUG_DATALINK, ("Calling complete\n"));

View File

@@ -242,12 +242,14 @@ VOID IPAddInterfaceRoute( PIP_INTERFACE IF ) {
NUD_PERMANENT);
if (!NCE) {
TI_DbgPrint(MIN_TRACE, ("Could not create NCE.\n"));
return;
}
AddrWidenAddress( &NetworkAddress, &IF->Unicast, &IF->Netmask );
if (!RouterAddRoute(&NetworkAddress, &IF->Netmask, NCE, 1)) {
TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n"));
return;
}
/* Allow TCP to hang some configuration on this interface */
@@ -352,10 +354,10 @@ VOID IPRegisterProtocol(
* To unregister a protocol handler, call this function with Handler = NULL
*/
{
#ifdef DBG
if (ProtocolNumber >= IP_PROTOCOL_TABLE_SIZE)
if (ProtocolNumber >= IP_PROTOCOL_TABLE_SIZE) {
TI_DbgPrint(MIN_TRACE, ("Protocol number is out of range (%d).\n", ProtocolNumber));
#endif
return;
}
ProtocolTable[ProtocolNumber] = Handler;
}