repository: C:/dev/kvm-guest-drivers-windows
branch: master
commit 0dcc90e15d9c0d27aeb46b0773700787a58d743b
Author: Yan Vugenfirer <[email protected]>
Date: Sat Jun 12 17:42:58 2010 +0300
[WIN-GUEST_DRIVERS] [NetKVM] Use virtio library with published indexes with
NetKVM driver.
Signed-off-by: Yan Vugenfirer <[email protected]>
diff --git a/NetKVM/Common/ParaNdis-Common.c b/NetKVM/Common/ParaNdis-Common.c
index 3c64cb0..a1c8a74 100644
--- a/NetKVM/Common/ParaNdis-Common.c
+++ b/NetKVM/Common/ParaNdis-Common.c
@@ -110,6 +110,7 @@ typedef struct _tagConfigurationEntries
tConfigurationEntry PriorityVlanTagging;
tConfigurationEntry VlanId;
tConfigurationEntry UseMergeableBuffers;
+ tConfigurationEntry PublishIndices;
tConfigurationEntry MTU;
}tConfigurationEntries;
@@ -148,6 +149,7 @@ static const tConfigurationEntries defaultConfiguration =
{ "*PriorityVLANTag", 3, 0, 3},
{ "VlanId", 0, 0, 4095},
{ "MergeableBuf", 1, 0, 1},
+ { "PublishIndices", 1, 0, 1},
{ "MTU", 1500, 500, 65500},
};
@@ -277,6 +279,7 @@ static void ReadNicConfiguration(PARANDIS_ADAPTER
*pContext, PUCHAR *ppNewMACAdd
GetConfigurationEntry(cfg,
&pConfiguration->PriorityVlanTagging);
GetConfigurationEntry(cfg, &pConfiguration->VlanId);
GetConfigurationEntry(cfg,
&pConfiguration->UseMergeableBuffers);
+ GetConfigurationEntry(cfg,
&pConfiguration->PublishIndices);
GetConfigurationEntry(cfg, &pConfiguration->MTU);
#if !defined(WPP_EVENT_TRACING)
@@ -318,6 +321,7 @@ static void ReadNicConfiguration(PARANDIS_ADAPTER
*pContext, PUCHAR *ppNewMACAdd
pContext->ulPriorityVlanSetting =
pConfiguration->PriorityVlanTagging.ulValue;
pContext->VlanId = pConfiguration->VlanId.ulValue;
pContext->bUseMergedBuffers =
pConfiguration->UseMergeableBuffers.ulValue != 0;
+ pContext->bDoPublishIndices =
pConfiguration->PublishIndices.ulValue != 0;
pContext->MaxPacketSize.nMaxDataSize =
pConfiguration->MTU.ulValue;
if (!pContext->bDoSupportPriority)
pContext->ulPriorityVlanSetting = 0;
@@ -432,6 +436,8 @@ static void DumpVirtIOFeatures(VirtIODevice *pIO)
{VIRTIO_NET_F_HOST_UFO, "VIRTIO_NET_F_HOST_UFO"},
{VIRTIO_NET_F_MRG_RXBUF, "VIRTIO_NET_F_MRG_RXBUF"},
{VIRTIO_NET_F_STATUS, "VIRTIO_NET_F_STATUS"},
+ {VIRTIO_F_INDIRECT, "VIRTIO_F_INDIRECT"},
+ {VIRTIO_F_PUBLISH_INDICES, "VIRTIO_F_PUBLISH_INDICES"},
};
UINT i;
for (i = 0; i < sizeof(Features)/sizeof(Features[0]); ++i)
@@ -472,7 +478,7 @@ static void PrintStatistics(PARANDIS_ADAPTER *pContext)
pContext->nofFreeHardwareBuffers,
pContext->minFreeHardwareBuffers));
pContext->minFreeHardwareBuffers = pContext->nofFreeHardwareBuffers;
DPrintf(0, ("[Diag!] TX packets to return %d",
pContext->NetTxPacketsToReturn));
- DPrintf(0, ("[Diag!] Bytes transmitted %I64u, received %I64u",
pContext->Statistics.ifHCOutOctets, pContext->Statistics.ifHCInOctets));
+ DPrintf(0, ("[Diag!] Bytes transmitted %I64u, received %I64u,
interrupts %d", pContext->Statistics.ifHCOutOctets,
pContext->Statistics.ifHCInOctets, pContext->ulIrqReceived));
}
@@ -614,6 +620,16 @@ NDIS_STATUS ParaNdis_InitializeContext(
pContext->CurrentMacAddress[4],
pContext->CurrentMacAddress[5]));
}
+ if (pContext->bDoPublishIndices)
+ pContext->bDoPublishIndices =
VirtIODeviceGetHostFeature(&pContext->IODevice, VIRTIO_F_PUBLISH_INDICES) != 0;
+ if (pContext->bDoPublishIndices &&
VirtIODeviceHasFeature(VIRTIO_F_PUBLISH_INDICES))
+ {
+ VirtIODeviceEnableGuestFeature(&pContext->IODevice,
VIRTIO_F_PUBLISH_INDICES);
+ }
+ else
+ {
+ pContext->bDoPublishIndices = FALSE;
+ }
}
else
{
@@ -2082,6 +2098,8 @@ VOID ParaNdis_PowerOn(PARANDIS_ADAPTER *pContext)
Dummy = VirtIODeviceGetHostFeature(&pContext->IODevice,
VIRTIO_NET_F_MAC);
if (pContext->bUseMergedBuffers)
VirtIODeviceEnableGuestFeature(&pContext->IODevice,
VIRTIO_NET_F_MRG_RXBUF);
+ if (pContext->bDoPublishIndices)
+ VirtIODeviceEnableGuestFeature(&pContext->IODevice,
VIRTIO_F_PUBLISH_INDICES);
VirtIODeviceRenewVirtualQueue(pContext->NetReceiveQueue);
VirtIODeviceRenewVirtualQueue(pContext->NetSendQueue);
diff --git a/NetKVM/Common/ndis56common.h b/NetKVM/Common/ndis56common.h
index 7977c7a..7200538 100644
--- a/NetKVM/Common/ndis56common.h
+++ b/NetKVM/Common/ndis56common.h
@@ -83,6 +83,7 @@
#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can handle merged Rx buffers and
requires bigger header for that. */
#define VIRTIO_NET_F_STATUS 16
+
#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
#define VIRTIO_NET_INVALID_INTERRUPT_STATUS 0xFF
@@ -265,6 +266,7 @@ typedef struct _tagPARANDIS_ADAPTER
BOOLEAN bDoIPCheck;
BOOLEAN bFixIPChecksum;
BOOLEAN bUseMergedBuffers;
+ BOOLEAN bDoPublishIndices;
BOOLEAN bDoKickOnNoBuffer;
BOOLEAN bSurprizeRemoved;
BOOLEAN bUsingMSIX;
@@ -272,6 +274,7 @@ typedef struct _tagPARANDIS_ADAPTER
LONG counterDPCInside;
LONG bDPCInactive;
LONG InterruptStatus;
+ ULONG ulIrqReceived;
ULONG ulPriorityVlanSetting;
ULONG VlanId;
ULONG ulFormalLinkSpeed;
@@ -355,7 +358,6 @@ typedef struct _tagPARANDIS_ADAPTER
NDIS_HANDLE DmaHandle;
NDIS_HANDLE ConnectTimer;
NDIS_HANDLE InterruptRecoveryTimer;
- ULONG ulIrqReceived;
NDIS_OFFLOAD ReportedOffloadCapabilities;
NDIS_OFFLOAD ReportedOffloadConfiguration;
BOOLEAN bOffloadEnabled;
diff --git a/NetKVM/wlh/netkvm.inf b/NetKVM/wlh/netkvm.inf
index 8143375..058380e 100644
--- a/NetKVM/wlh/netkvm.inf
+++ b/NetKVM/wlh/netkvm.inf
@@ -229,6 +229,12 @@ HKR, Ndi\Params\MergeableBuf, type,
0, "enum"
HKR, Ndi\Params\MergeableBuf\enum, "1", 0,
%Enable%
HKR, Ndi\Params\MergeableBuf\enum, "0", 0,
%Disable%
+HKR, Ndi\Params\PublishIndices, ParamDesc, 0,
%PublishIndices%
+HKR, Ndi\Params\PublishIndices, Default, 0,
"1"
+HKR, Ndi\Params\PublishIndices, type, 0,
"enum"
+HKR, Ndi\Params\PublishIndices\enum, "1", 0,
%Enable%
+HKR, Ndi\Params\PublishIndices\enum, "0", 0,
%Disable%
+
[kvmnet6.CopyFiles]
netkvm.sys,,,2
@@ -308,4 +314,5 @@ PriorityOnly = "Priority"
VLan = "VLan"
Priority_Vlan = "All"
MergeableBuf = "Use mergeable buffers"
+PublishIndices = "Publish Indices"
MTU = "MTU size"
diff --git a/NetKVM/wxp/ParaNdis5-Driver.c b/NetKVM/wxp/ParaNdis5-Driver.c
index 160f579..72f5672 100644
--- a/NetKVM/wxp/ParaNdis5-Driver.c
+++ b/NetKVM/wxp/ParaNdis5-Driver.c
@@ -351,6 +351,7 @@ static VOID ParaNdis5_MiniportISR(OUT PBOOLEAN
InterruptRecognized,
*QueueMiniportHandleInterrupt = FALSE;
b = ParaNdis_OnInterrupt(pContext, QueueMiniportHandleInterrupt, isAny);
*InterruptRecognized = b;
+ pContext->ulIrqReceived += b;
DEBUG_EXIT_STATUS(7, (ULONG)b);
}
diff --git a/NetKVM/wxp/netkvm.inf b/NetKVM/wxp/netkvm.inf
index c7f1fca..428882d 100644
--- a/NetKVM/wxp/netkvm.inf
+++ b/NetKVM/wxp/netkvm.inf
@@ -201,6 +201,11 @@ HKR, Ndi\Params\MergeableBuf, type,
0, "enum"
HKR, Ndi\Params\MergeableBuf\enum, "1", 0,
%Enable%
HKR, Ndi\Params\MergeableBuf\enum, "0", 0,
%Disable%
+HKR, Ndi\Params\PublishIndices, ParamDesc, 0,
%PublishIndices%
+HKR, Ndi\Params\PublishIndices, Default, 0,
"1"
+HKR, Ndi\Params\PublishIndices, type, 0,
"enum"
+HKR, Ndi\Params\PublishIndices\enum, "1", 0,
%Enable%
+HKR, Ndi\Params\PublishIndices\enum, "0", 0,
%Disable%
[kvmnet5.CopyFiles]
netkvm.sys,,,2
@@ -275,4 +280,5 @@ PriorityOnly = "Priority"
VLan = "VLan"
Priority_Vlan = "All"
MergeableBuf = "Use mergeable buffers"
+PublishIndices = "Publish Indices"
MTU = "MTU size"
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html