[mlx4] Remove a redundant driver.
authortzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 4 May 2008 18:42:53 +0000 (18:42 +0000)
committertzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 4 May 2008 18:42:53 +0000 (18:42 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1127 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

39 files changed:
hw/mlx4/kernel/eth/GenDefs.h [deleted file]
hw/mlx4/kernel/eth/GenUtils.cpp [deleted file]
hw/mlx4/kernel/eth/GenUtils.h [deleted file]
hw/mlx4/kernel/eth/connectx_child.cdf [deleted file]
hw/mlx4/kernel/eth/connectx_child.inf [deleted file]
hw/mlx4/kernel/eth/e100.mof [deleted file]
hw/mlx4/kernel/eth/e100.rc [deleted file]
hw/mlx4/kernel/eth/makefile [deleted file]
hw/mlx4/kernel/eth/makefile.inc [deleted file]
hw/mlx4/kernel/eth/mp.h [deleted file]
hw/mlx4/kernel/eth/mp_WorkerThread.cpp [deleted file]
hw/mlx4/kernel/eth/mp_WorkerThread.h [deleted file]
hw/mlx4/kernel/eth/mp_cmn.h [deleted file]
hw/mlx4/kernel/eth/mp_dbg.cpp [deleted file]
hw/mlx4/kernel/eth/mp_dbg.h [deleted file]
hw/mlx4/kernel/eth/mp_def.h [deleted file]
hw/mlx4/kernel/eth/mp_init.cpp [deleted file]
hw/mlx4/kernel/eth/mp_lbfo.cpp [deleted file]
hw/mlx4/kernel/eth/mp_lbfo.h [deleted file]
hw/mlx4/kernel/eth/mp_log.mc [deleted file]
hw/mlx4/kernel/eth/mp_lro.cpp [deleted file]
hw/mlx4/kernel/eth/mp_lro.h [deleted file]
hw/mlx4/kernel/eth/mp_main.cpp [deleted file]
hw/mlx4/kernel/eth/mp_nic.cpp [deleted file]
hw/mlx4/kernel/eth/mp_nic.h [deleted file]
hw/mlx4/kernel/eth/mp_req.cpp [deleted file]
hw/mlx4/kernel/eth/mp_rss.cpp [deleted file]
hw/mlx4/kernel/eth/mp_rss.h [deleted file]
hw/mlx4/kernel/eth/mtnic_cmd.cpp [deleted file]
hw/mlx4/kernel/eth/mtnic_cmd.h [deleted file]
hw/mlx4/kernel/eth/mtnic_dev.h [deleted file]
hw/mlx4/kernel/eth/mtnic_if_defs.h [deleted file]
hw/mlx4/kernel/eth/mtnic_perf.h [deleted file]
hw/mlx4/kernel/eth/mxe_bus.h [deleted file]
hw/mlx4/kernel/eth/offload.h [deleted file]
hw/mlx4/kernel/eth/precomp.h [deleted file]
hw/mlx4/kernel/eth/sources [deleted file]
hw/mlx4/kernel/eth/wineth.def [deleted file]
hw/mlx4/kernel/eth/wpptrace.h [deleted file]

diff --git a/hw/mlx4/kernel/eth/GenDefs.h b/hw/mlx4/kernel/eth/GenDefs.h
deleted file mode 100644 (file)
index bc4884b..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-\r
-\r
-// basic types\r
-typedef unsigned char                  u8, __u8;\r
-typedef unsigned short int     u16, __u16;\r
-typedef unsigned int                           u32, __u32;\r
-typedef unsigned __int64               u64, __u64;\r
-typedef char                   s8, __s8;\r
-typedef short int      s16, __s16;\r
-typedef int                            s32, __s32;\r
-typedef __int64                s64, __s64;\r
-typedef u16 __be16 ;\r
-typedef u32 __be32 ;\r
-typedef u64 __be64 ;\r
-\r
-#ifdef _WIN64\r
-typedef unsigned __int64 uintn_t;\r
-#else\r
-typedef unsigned int uintn_t;\r
-#endif\r
-\r
-//#define dma_addr_t unsigned __int64\r
-#define dma_addr_t NDIS_PHYSICAL_ADDRESS\r
-\r
-typedef unsigned __int64        uint64_t;\r
-\r
-u32 inline CL_NTOH32( u32 x ) {\r
-    return (u32)(          \r
-        (((u32)(x) & 0x000000FF) << 24) |\r
-        (((u32)(x) & 0x0000FF00) << 8) |\r
-        (((u32)(x) & 0x00FF0000) >> 8) |\r
-        (((u32)(x) & 0xFF000000) >> 24) );\r
-}\r
-#define CL_HTON32                              CL_NTOH32\r
-\r
-#ifdef _WIN64\r
-#define __cpu_to_be32(x) ((((x) >> 24)&0x000000ff) | (((x) >> 8)&0x0000ff00) | (((x) << 8)&0x00ff0000) | (((x) << 24)&0xff000000))\r
-#elif defined(_WIN32)\r
-__inline __int32 __cpu_to_be32( __int32 dwX ) \r
-{ \r
-    _asm    mov     eax, dwX     \r
-    _asm    bswap   eax     \r
-    _asm    mov     dwX, eax   \r
-        \r
-    return dwX; \r
-}\r
-#else\r
-#error unsupported platform\r
-#endif\r
-\r
-\r
-#define __cpu_to_be16(x) cpu_to_be16(x)\r
-u16 inline cpu_to_be16(u16 in) {\r
-    return in >> 8 | in << 8;\r
-}\r
-\r
-#define be16_to_cpu __cpu_to_be16\r
-\r
-#define be64_to_cpu RtlUlonglongByteSwap\r
-#define cpu_to_be64 RtlUlonglongByteSwap\r
-\r
-\r
-\r
-#define be32_to_cpu RtlUlongByteSwap\r
-#define cpu_to_be32 RtlUlongByteSwap\r
-// ALIGN\r
-#define ALIGN(x,a) (((x)+(ULONG_PTR)(a)-1)&~((ULONG_PTR)(a)-1))\r
-inline u64 ALIGN64(u64 pAddr, u64 a) {return ((pAddr)+(a)-1)&~((a)-1);}\r
-\r
-\r
-u32 ROUNDUP_LOG2(u32 arg);\r
-\r
-u32 roundup_pow_of_two(u32 arg);\r
-#define XOR(x,y)               (!(x) != !(y))\r
-#define XNOR(x,y)              (!(x) == !(y))\r
-\r
-// Convert the mac from the way that windows gives it to the way we want it.\r
-inline void mac_to_be64(u64 *dst, u64 *src)\r
-{\r
-    char *csrc = (char *)src;\r
-    char *cdst = (char *)dst;\r
-    cdst[0] = csrc[5];\r
-    cdst[1] = csrc[4];\r
-    cdst[2] = csrc[3];\r
-    cdst[3] = csrc[2];\r
-    cdst[4] = csrc[1];\r
-    cdst[5] = csrc[0];\r
-}\r
-\r
-#define IS_BIT_SET(val, mask) \\r
-    (((val) & (mask)) ? 1 : 0)\r
-\r
diff --git a/hw/mlx4/kernel/eth/GenUtils.cpp b/hw/mlx4/kernel/eth/GenUtils.cpp
deleted file mode 100644 (file)
index df926ce..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-\r
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    GenUtils.cpp\r
-    \r
-Abstract:\r
-    This module contains general functions\r
-    \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-#if defined(EVENT_TRACING)\r
-#include "GenUtils.tmh"\r
-#endif\r
-\r
-ULONG g_QueryTimeIncrement;\r
-\r
-\r
-LARGE_INTEGER  TimeFromLong(ULONG HandredNanos)\r
-{\r
-    LARGE_INTEGER  Timeout;\r
-    Timeout.HighPart = 0xffffffff;\r
-    Timeout.LowPart =  0xffffffff ^ HandredNanos;\r
-    return Timeout;\r
-}\r
-\r
-//\r
-// Sleep function must be running at IRQL <= APC_LEVEL\r
-//\r
-NTSTATUS Sleep(ULONG HandredNanos)\r
-{    \r
-    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);\r
-\r
-    NTSTATUS rc = STATUS_SUCCESS;\r
-    LARGE_INTEGER  Timeout = TimeFromLong(HandredNanos);\r
-\r
-    rc = KeDelayExecutionThread( KernelMode, FALSE, &Timeout );\r
-    ASSERT(rc == STATUS_SUCCESS);\r
-    \r
-    return rc;\r
-\r
-}\r
-\r
-// In units of ms\r
-uint64_t MtnicGetTickCount()\r
-{\r
-\r
-    LARGE_INTEGER      Ticks;\r
-    KeQueryTickCount(&Ticks);\r
-    return Ticks.QuadPart * g_QueryTimeIncrement / 10000; // 10,000 moves from 100ns to ms\r
-}\r
-\r
-// In units of nano-seconds\r
-uint64_t GetTickCountInNsec()\r
-{\r
-\r
-    LARGE_INTEGER      Ticks;\r
-    KeQueryTickCount(&Ticks);\r
-    return Ticks.QuadPart * g_QueryTimeIncrement;\r
-}\r
-\r
-// In units of ns\r
-uint64_t GetTimeStamp( void )\r
-{\r
-    LARGE_INTEGER tick_count, frequency;\r
\r
-    tick_count = KeQueryPerformanceCounter( &frequency );\r
-    return( 10000 * tick_count.QuadPart / (frequency.QuadPart / 100000));\r
-}\r
-\r
-u32 ROUNDUP_LOG2(u32 arg)\r
-{\r
-    if (arg <= 1)    return 0;\r
-    if (arg <= 2)    return 1;\r
-    if (arg <= 4)    return 2;\r
-    if (arg <= 8)    return 3;\r
-    if (arg <= 16)   return 4;\r
-    if (arg <= 32)   return 5;\r
-    if (arg <= 64)   return 6;\r
-    if (arg <= 128)  return 7;\r
-    if (arg <= 256)  return 8;\r
-    if (arg <= 512)  return 9;\r
-    if (arg <= 1024) return 10;\r
-    if (arg <= 2048) return 11;\r
-    if (arg <= 4096) return 12;\r
-    if (arg <= 8192) return 13;\r
-    if (arg <= 16384) return 14;\r
-    if (arg <= 32768) return 15;\r
-    if (arg <= 65536) return 16;\r
-    ASSERT(FALSE);\r
-    return 32;\r
-}\r
-\r
-u32 roundup_pow_of_two(u32 arg)\r
-{\r
-    if (arg <= 1)    return 1;\r
-    if (arg <= 2)    return 2;\r
-    if (arg <= 4)    return 4;\r
-    if (arg <= 8)    return 8;\r
-    if (arg <= 16)   return 16;\r
-    if (arg <= 32)   return 32;\r
-    if (arg <= 64)   return 64;\r
-    if (arg <= 128)  return 128;\r
-    if (arg <= 256)  return 256;\r
-    if (arg <= 512)  return 512;\r
-    if (arg <= 1024) return 1024;\r
-    if (arg <= 2048) return 2048;\r
-    if (arg <= 4096) return 4096;\r
-    if (arg <= 8192) return 8192;\r
-    if (arg <= 16384) return 16384;\r
-    if (arg <= 32768) return 32768;    \r
-    if (arg <= 65536) return 65536;\r
-    ASSERT(FALSE);\r
-    return 2147483648;\r
-\r
-}\r
-\r
-/* Nth element of the table contains the index of the first set bit of N; 8 - for N=0 */\r
-char g_set_bit_tbl[256];\r
-\r
-void fill_bit_tbls()\r
-{\r
-    unsigned long i;\r
-    for (i=0; i<256; ++i) {\r
-        g_set_bit_tbl[i] = (char)(_ffs_raw(&i,0) - 1);\r
-    }\r
-    g_set_bit_tbl[0] = 8;\r
-}\r
-\r
-NTSTATUS GenUtilsInit()\r
-{\r
-    fill_bit_tbls();\r
-    g_QueryTimeIncrement = KeQueryTimeIncrement();\r
-\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-NTSTATUS \r
-AllocateSharedMemory(\r
-    IN  NDIS_HANDLE     AdapterHandle,\r
-    IN  ULONG           Length,\r
-    IN  UINT            Allign,\r
-    IN  BOOLEAN         fCache,\r
-    IN  BOOLEAN         fUseDma,\r
-    OUT PVOID  *VirtualAddress,\r
-    OUT PNDIS_PHYSICAL_ADDRESS  PhysicalAddress,\r
-    IN OUT AllocateSharedMemoryDeleteInfo *pDeleteInfo\r
-    )\r
-{\r
-    if (fUseDma)\r
-    {\r
-        NdisMAllocateSharedMemory(\r
-            AdapterHandle,\r
-            Length + Allign,\r
-            fCache,  \r
-            VirtualAddress,\r
-            PhysicalAddress);\r
-\r
-        if(*VirtualAddress == NULL) {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("NdisMAllocateSharedMemory failed (Length + Allign) = %d\n", Length + Allign));\r
-            return STATUS_NO_MEMORY;\r
-        }\r
-    }\r
-    else\r
-    {\r
-        // Allocate the buffer itself (from continious memory)\r
-        PHYSICAL_ADDRESS BoundryAddress = { 0x0, 0x0};\r
-        PHYSICAL_ADDRESS LowestAddress = { 0x0, 0x0};\r
-        PHYSICAL_ADDRESS HighestAddress = { 0xffffffff, 0xffffffff };\r
-        MEMORY_CACHING_TYPE  CacheType = (fCache) ? MmCached : MmNonCached;\r
-\r
-        if (fCache)\r
-        {\r
-            *VirtualAddress = MmAllocateContiguousMemorySpecifyCache(\r
-                                                            Length + Allign, \r
-                                                            LowestAddress, \r
-                                                            HighestAddress, \r
-                                                            BoundryAddress,\r
-                                                            MmCached\r
-                                                            );\r
-        }\r
-        else\r
-        {\r
-            *VirtualAddress = MmAllocateContiguousMemory(Length + Allign, HighestAddress);            \r
-        }\r
-            \r
-        if(*VirtualAddress == NULL) {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("MmAllocateContiguousMemory failed (Length + Allign) = %d\n", Length + Allign));\r
-            return STATUS_NO_MEMORY;\r
-        }\r
-        *PhysicalAddress = MmGetPhysicalAddress(*VirtualAddress);\r
-    }\r
-    \r
-    // Copy the needed data so that we can delete it \r
-\r
-    if (pDeleteInfo) \r
-    {\r
-        ASSERT(pDeleteInfo->Length == 0);\r
-        ASSERT(pDeleteInfo->Cached == FALSE);\r
-        ASSERT(pDeleteInfo->VirtualAddress == NULL);\r
-        ASSERT(pDeleteInfo->PhysicalAddress.QuadPart == NULL);\r
-        pDeleteInfo->Length = Length + Allign;\r
-        pDeleteInfo->Cached = fCache;\r
-        pDeleteInfo->VirtualAddress = *VirtualAddress;\r
-        pDeleteInfo->PhysicalAddress = *PhysicalAddress;       \r
-   }\r
-\r
-    // allign the buffers as needed\r
-    if (Allign != 0) \r
-    {\r
-        *VirtualAddress = (PVOID)ALIGN((ULONG_PTR)*VirtualAddress, Allign);\r
-        LONG xx = PhysicalAddress->HighPart;\r
-        PhysicalAddress->QuadPart = ALIGN64(PhysicalAddress->QuadPart, (u64)Allign);\r
-        ASSERT(PhysicalAddress->HighPart == xx);\r
-    }\r
-    \r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-VOID FreeSharedMemory(\r
-    IN  NDIS_HANDLE     AdapterHandle,\r
-    IN AllocateSharedMemoryDeleteInfo *pDeleteInfo,\r
-    IN BOOLEAN fUseDma\r
-    )\r
-{\r
-    if(pDeleteInfo->VirtualAddress == NULL)\r
-    {\r
-        ASSERT(FALSE);\r
-        return;\r
-    }\r
-    \r
-    if (fUseDma)\r
-    {\r
-        NdisMFreeSharedMemory(\r
-            AdapterHandle,\r
-            pDeleteInfo->Length,\r
-            pDeleteInfo->Cached,\r
-            pDeleteInfo->VirtualAddress,\r
-            pDeleteInfo->PhysicalAddress \r
-            );\r
-    }\r
-    else\r
-    {\r
-        if (pDeleteInfo->Cached)\r
-        {\r
-            MmFreeContiguousMemorySpecifyCache(pDeleteInfo->VirtualAddress, pDeleteInfo->Length, MmCached);\r
-        }\r
-        else\r
-        {\r
-            MmFreeContiguousMemory(pDeleteInfo->VirtualAddress);         \r
-        }\r
-    }\r
-    \r
-    pDeleteInfo->VirtualAddress = NULL;\r
-    pDeleteInfo->PhysicalAddress.QuadPart = NULL;\r
-}\r
-\r
-\r
-\r
-void* __cdecl operator new(size_t n ) throw() {\r
-    return ExAllocatePoolWithTag(NonPagedPool , n, GLOBAL_ALLOCATION_TAG);\r
-}\r
-\r
-void __cdecl operator delete(void* p) {\r
-    ExFreePoolWithTag(p, GLOBAL_ALLOCATION_TAG);\r
-}\r
-\r
-\r
-\r
-NTSTATUS \r
-Array::Init(int MaxNumberofPackets) {\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    m_Size = MaxNumberofPackets;\r
-    m_pData = new void*[MaxNumberofPackets];\r
-    if (m_pData == NULL) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("new failed \n"));\r
-        return STATUS_NO_MEMORY;\r
-    }\r
-    return Status;\r
-}\r
-\r
-NTSTATUS \r
-ProcessorArray::Init(int MaxNumberofPackets) {\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    u32 i = 0,j=0;\r
-    m_NumberOfProcessors = NdisSystemProcessorCount();\r
-    m_Arrays = new Array[m_NumberOfProcessors];\r
-    if (m_Arrays == NULL) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("new failed \n"));\r
-        Status = STATUS_NO_MEMORY;\r
-        goto Cleanup;\r
-    }\r
-    for (i=0; i < m_NumberOfProcessors; i++) {\r
-        Status = m_Arrays[i].Init(MaxNumberofPackets);\r
-        if (!NT_SUCCESS(Status)) {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Array[i].Init failed \n"));\r
-            goto Cleanup;\r
-        }\r
-    }\r
-\r
-Cleanup:\r
-    if (!NT_SUCCESS(Status)) {\r
-        if (m_Arrays) {\r
-            for (j=0; j< i; j++) {\r
-                m_Arrays[i].Shutdown();\r
-            }\r
-            delete []m_Arrays;\r
-            m_Arrays = NULL;\r
-        }\r
-        m_NumberOfProcessors = 0;\r
-\r
-    }\r
-    return Status;\r
-}\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/GenUtils.h b/hw/mlx4/kernel/eth/GenUtils.h
deleted file mode 100644 (file)
index 48bbc69..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-\r
-LARGE_INTEGER  TimeFromLong(ULONG HandredNanos);\r
-\r
-NTSTATUS Sleep(ULONG HandredNanos);\r
-\r
-// In units of ms\r
-uint64_t MtnicGetTickCount();\r
-unsigned __int64 GetTickCountInNsec();\r
-uint64_t GetTimeStamp(void);\r
-\r
-// Nth element of the table contains the index of the first set bit of N; 8 - for N=0\r
-extern char g_set_bit_tbl[256];\r
-#define BITS_PER_LONG          32\r
-\r
-\r
-#define GLOBAL_ALLOCATION_TAG 'XtoC'\r
-\r
-\r
-/**\r
-* _ffs_raw - find the first one bit in a word\r
-* @addr: The address to start the search at\r
-* @offset: The bitnumber to start searching at\r
-*\r
-* returns: 0 - if not found or N+1, if found Nth bit\r
-*/\r
-static __inline int _ffs_raw(const unsigned long *addr, int offset)\r
-{\r
-    //TODO: not an effective code - is better in Assembler\r
-    int mask;\r
-    int rbc;\r
-    int ix;\r
-    if (!*addr) return 0;\r
-    mask = 1 << offset;\r
-    rbc = BITS_PER_LONG - offset;\r
-    for (ix=0; ix<rbc; ix++, mask<<=1) {\r
-        if (*addr & mask)\r
-            return offset + ix + 1;\r
-    }\r
-    return 0;\r
-}\r
-\r
-// as previous with offset = 0\r
-static __inline int _ffs(const unsigned long *addr)\r
-{\r
-    unsigned char *ptr = (unsigned char *)addr;\r
-    if (!*addr) return 0;                                      // skip sero dword\r
-    if (!*(short*)ptr) ptr += 2;                               // get to the non-zero word\r
-    if (!*(char*)ptr) ptr++;                                           // get to the non-zero byte\r
-    return (int)(((ptr - (unsigned char *)addr ) << 3) + g_set_bit_tbl[*ptr] + 1);\r
-}\r
-\r
-\r
-#define ffs(val)       _ffs((const unsigned long *)&val)\r
-\r
-NTSTATUS GenUtilsInit();\r
-\r
-struct AllocateSharedMemoryDeleteInfo {\r
-    ULONG  Length;\r
-    BOOLEAN  Cached;\r
-    PVOID  VirtualAddress;\r
-    NDIS_PHYSICAL_ADDRESS  PhysicalAddress;\r
-};\r
-\r
-NTSTATUS \r
-AllocateSharedMemory(\r
-    IN  NDIS_HANDLE     AdapterHandle,\r
-    IN  ULONG           Length,\r
-    IN  UINT            Allign,\r
-    IN  BOOLEAN         fCache,\r
-    IN  BOOLEAN         fUseDma,\r
-    OUT PVOID  *VirtualAddress,\r
-    OUT PNDIS_PHYSICAL_ADDRESS  PhysicalAddress,\r
-    IN OUT AllocateSharedMemoryDeleteInfo *pDeleteInfo\r
-    );\r
-\r
-VOID FreeSharedMemory(\r
-    IN  NDIS_HANDLE     AdapterHandle,\r
-    IN OUT AllocateSharedMemoryDeleteInfo *pDeleteInfo,\r
-    BOOLEAN fUseDma\r
-    );\r
-\r
-// This is simply a wrapper to the LIST_ENTRY class that allows \r
-// easier work with this list\r
-class LinkedList {\r
-\r
-public:\r
-    LinkedList() {\r
-       size = 0;\r
-       InitializeListHead(&m_Data);\r
-    }\r
-\r
-    // Only used when the constructor can not be used.\r
-    VOID Init() {\r
-       size = 0;\r
-       InitializeListHead(&m_Data);\r
-    }\r
-\r
-    int Size() {return size;}\r
-\r
-    LIST_ENTRY *RemoveHeadList() {\r
-        LIST_ENTRY *pTemp;\r
-        ASSERT(size > 0);\r
-        ASSERT(!IsListEmpty(&m_Data));\r
-        pTemp = ::RemoveHeadList(&m_Data);\r
-        size--;\r
-        return pTemp;        \r
-    }\r
-\r
-    LIST_ENTRY *RemoveTailList() {\r
-        LIST_ENTRY *pTemp;\r
-        ASSERT(size > 0);\r
-        ASSERT(!IsListEmpty(&m_Data));\r
-        pTemp = ::RemoveTailList(&m_Data);\r
-        size--;\r
-        return pTemp;        \r
-    }\r
-\r
-    \r
-    VOID InsertTailList (LIST_ENTRY *Item) {\r
-#if DBG        \r
-        // Before we insert, we have to verify that the object is not in the list\r
-        LIST_ENTRY *current = m_Data.Flink;\r
-        while (current != & m_Data) {\r
-            ASSERT(current != Item);\r
-            current = current->Flink;\r
-        }        \r
-#endif        \r
-        ::InsertTailList(&m_Data, Item);\r
-        size++;\r
-    }\r
-\r
-    VOID InsertHeadList (LIST_ENTRY *Item) {\r
-#if DBG        \r
-        // Before we insert, we have to verify that the object is not in the list\r
-        LIST_ENTRY *current = m_Data.Flink;\r
-        while (current != & m_Data) {\r
-            ASSERT(current != Item);\r
-            current = current->Flink;\r
-        }        \r
-#endif        \r
-        ::InsertHeadList(&m_Data, Item);\r
-        size++;\r
-    }\r
-\r
-    LIST_ENTRY *Head() {\r
-        ASSERT(size > 0);\r
-        ASSERT(!IsListEmpty(&m_Data));\r
-        return m_Data.Flink;\r
-    }\r
-\r
-    LIST_ENTRY *Tail() {\r
-        ASSERT(size > 0);\r
-        ASSERT(!IsListEmpty(&m_Data));\r
-        return m_Data.Blink;\r
-    }\r
-\r
-\r
-    LIST_ENTRY *RawHead() {\r
-        // Return the head of the list without any checks, \r
-        // needed in order to use it as in iterator\r
-        return m_Data.Flink;\r
-    }\r
-    \r
-\r
-    bool IsAfterTheLast(LIST_ENTRY *pEntry) {\r
-        if (size == 0) {\r
-            return true;\r
-        }\r
-        return &m_Data == pEntry;\r
-    }\r
-\r
-    VOID RemoveEntryList(LIST_ENTRY *Item) {\r
-        ASSERT(size > 0);\r
-        ASSERT(!IsListEmpty(&m_Data));        \r
-#if DBG\r
-        // Verify that this item is indeed in the list\r
-        LIST_ENTRY *current = m_Data.Flink;\r
-    while (current != Item) {\r
-        if (current == & m_Data) {\r
-            ASSERT(FALSE);\r
-            //SDP_PRINT(TRACE_LEVEL_ERROR ,SDP_BUFFER_POOL ,("Object is not in the list\n"));\r
-        }\r
-        current = current->Flink;\r
-    }\r
-        \r
-#endif\r
-        ::RemoveEntryList(Item);\r
-        size--;\r
-    }\r
-    \r
-private:\r
-    int size;\r
-    LIST_ENTRY m_Data;\r
-};\r
-\r
-//--------------------------------------\r
-// Queue structure and macros\r
-//--------------------------------------\r
-typedef struct _QUEUE_ENTRY\r
-{\r
-    struct _QUEUE_ENTRY *Next;\r
-} QUEUE_ENTRY, *PQUEUE_ENTRY;\r
-\r
-typedef struct _QUEUE_HEADER\r
-{\r
-    PQUEUE_ENTRY Head;\r
-    PQUEUE_ENTRY Tail;\r
-} QUEUE_HEADER, *PQUEUE_HEADER;\r
-\r
-#define ETH_IS_LOCALLY_ADMINISTERED(Address) \\r
-    (BOOLEAN)(((PUCHAR)(Address))[0] & ((UCHAR)0x02))\r
-    \r
-\r
-#define InitializeQueueHeader(QueueHeader)                 \\r
-    {                                                      \\r
-        (QueueHeader)->Head = (QueueHeader)->Tail = NULL;  \\r
-    }\r
-\r
-#define IsQueueEmpty(QueueHeader) ((QueueHeader)->Head == NULL)\r
-\r
-#define RemoveHeadQueue(QueueHeader)                  \\r
-    (QueueHeader)->Head;                              \\r
-    {                                                 \\r
-        PQUEUE_ENTRY pNext;                           \\r
-        ASSERT((QueueHeader)->Head);                  \\r
-        pNext = (QueueHeader)->Head->Next;            \\r
-        (QueueHeader)->Head = pNext;                  \\r
-        if (pNext == NULL)                            \\r
-            (QueueHeader)->Tail = NULL;               \\r
-    }\r
-\r
-#define InsertHeadQueue(QueueHeader, QueueEntry)                \\r
-    {                                                           \\r
-        ((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \\r
-        (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \\r
-        if ((QueueHeader)->Tail == NULL)                        \\r
-            (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);   \\r
-    }\r
-\r
-#define InsertTailQueue(QueueHeader, QueueEntry)                     \\r
-    {                                                                \\r
-        ((PQUEUE_ENTRY)QueueEntry)->Next = NULL;                     \\r
-        if ((QueueHeader)->Tail)                                     \\r
-            (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry);  \\r
-        else                                                         \\r
-            (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);        \\r
-        (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);            \\r
-    }\r
-\r
-\r
-\r
-// A simpale static array (for now)\r
-class Array {\r
-public:\r
-    NTSTATUS Init(int MaxNumberofPackets);\r
-\r
-    VOID Shutdown() {\r
-        delete[]m_pData;\r
-    }\r
-    \r
-    Array() {\r
-        m_Count = 0;\r
-    }\r
-    void Add(void *ptr) {\r
-        ASSERT(m_Count < (int)m_Size);\r
-        m_pData[m_Count++] = ptr;\r
-    }\r
-\r
-    int GetCount() {return m_Count;}\r
-\r
-    void *GetPtr(int Place) {\r
-        ASSERT(Place < m_Count);\r
-        return m_pData[Place];\r
-    }\r
-    void Reset() {\r
-        m_Count = 0;\r
-    }\r
-\r
-private:\r
-    int m_Count;\r
-    void **m_pData;\r
-    UINT m_Size; // For Debug only\r
-\r
-};\r
-\r
-/*\r
- This class is used for freeing the sent packets.\r
- It is based on the assumpation that this happens at raised irql and therefore,\r
- if we allocate a data structure fro each processor we should be fine\r
-\r
-*/\r
-class ProcessorArray {\r
-\r
-public:\r
-\r
-    ProcessorArray() {\r
-        m_Arrays = NULL;\r
-        m_NumberOfProcessors = 0;\r
-    }\r
-\r
-    NTSTATUS Init(int MaxNumberofPackets);\r
-    \r
-    VOID Shutdown() {\r
-        if (m_Arrays) {\r
-            u32 j;\r
-            for (j=0; j< m_NumberOfProcessors; j++) {\r
-                m_Arrays[j].Shutdown();\r
-            }\r
-            delete []m_Arrays;\r
-            m_Arrays = NULL;\r
-        }\r
-        m_NumberOfProcessors = 0;\r
-\r
-    }\r
-\r
-    Array *GetArray() {\r
-        ASSERT( KeGetCurrentIrql()== DISPATCH_LEVEL);\r
-        ULONG pn = KeGetCurrentProcessorNumber();\r
-        ASSERT(pn < m_NumberOfProcessors);\r
-        m_Arrays[pn].Reset();\r
-        return &m_Arrays[pn];\r
-            \r
-\r
-    }\r
-private:\r
-    Array *m_Arrays;\r
-    ULONG m_NumberOfProcessors;\r
-\r
-};\r
-\r
-\r
-#define SIZE_OF(A) (sizeof(A)/sizeof(A[0]))\r
-\r
diff --git a/hw/mlx4/kernel/eth/connectx_child.cdf b/hw/mlx4/kernel/eth/connectx_child.cdf
deleted file mode 100644 (file)
index 2b0c17c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-[CatalogHeader]\r
-Name=connectx_child.cat\r
-PublicVersion=0x0000001\r
-EncodingType=0x00010001\r
-CATATTR1=0x10010001:OSAttr:2:6.0\r
-[CatalogFiles]\r
-<hash>connectx_child.inf=connectx_child.inf\r
-<hash>connectx.sys=connectx.sys\r
diff --git a/hw/mlx4/kernel/eth/connectx_child.inf b/hw/mlx4/kernel/eth/connectx_child.inf
deleted file mode 100644 (file)
index 3e1664f..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-; /****************************************************************************\r
-; ** COPYRIGHT (C) 1994-1997 INTEL CORPORATION                               **\r
-; ** DEVELOPED FOR MICROSOFT BY INTEL CORP., HILLSBORO, OREGON               **\r
-; ** HTTP://WWW.INTEL.COM/                                                   **\r
-; ** THIS FILE IS PART OF THE INTEL ETHEREXPRESS PRO/100B(TM) AND            **\r
-; ** ETHEREXPRESS PRO/100+(TM) NDIS 5.0 MINIPORT SAMPLE DRIVER               **\r
-; ****************************************************************************/\r
-\r
-[version]\r
-;Layoutfile parameter is reserved for internal Microsoft use only\r
-;LayoutFile = layout.inf\r
-Signature   = "$Chicago$"\r
-Class       = Net\r
-ClassGUID   = {4d36e972-e325-11ce-bfc1-08002be10318}\r
-Provider    = %Mellanox%\r
-Compatible  = 1\r
-DriverVer=02/11/2008,1.1.0.208\r
-CatalogFile=connectx_child.cat\r
-\r
-[Manufacturer]\r
-%Mellanox%     = Mellanox,NTx86,NTia64,NTamd64\r
-\r
-[ControlFlags]\r
-ExcludeFromSelect = PCI\VEN_15B3&DEV_6368\r
-\r
-[Mellanox.NTx86]\r
-; DisplayName           Section       DeviceID\r
-; -----------           -------       --------\r
-%ConnectX.DeviceDesc%  = ConnectX.ndi,    MXE\ConnectX_Nic   ; Mellanox ConnectX Ethernet Adapter\r
-\r
-\r
-[Mellanox.NTia64]\r
-; DisplayName           Section       DeviceID\r
-; -----------           -------       --------\r
-%ConnectX.DeviceDesc%  = ConnectX.ndi,    MXE\ConnectX_Nic   ; Mellanox ConnectX Ethernet Adapter\r
-; Mellanox 82557/82558 Based PCI Ethernet Adapter (10/100) and Mellanox compatibles\r
-\r
-[Mellanox.NTamd64]\r
-; DisplayName           Section       DeviceID\r
-; -----------           -------       --------\r
-%ConnectX.DeviceDesc%  = ConnectX.ndi,    MXE\ConnectX_Nic   ; Mellanox ConnectX Ethernet Adapter\r
-\r
-;\r
-\r
-; Windows NT specific entry\r
-[ConnectX.ndi.NT]\r
-Characteristics = 0x81\r
-AddReg          = 82557.reg, ConnectX.reg, WinCtxTune_reg\r
-CopyFiles       = ConnectX.CopyFiles, Wctxtune.CopyFiles\r
-\r
-[ConnectX.ndi.NT.Services]\r
-AddService = ConnectX, 2, ConnectX.Service, common.EventLog\r
-\r
-;-----------------------------------------------------------------------------\r
-; 82557 common\r
-;\r
-[82557.reg]\r
-HKR, Ndi\params\NumRfd,         ParamDesc,  0, "%ReceiveFrameDescriptors%"\r
-HKR, Ndi\params\NumRfd,         default,    0, "16"\r
-HKR, Ndi\params\NumRfd,         min,        0, "1"\r
-HKR, Ndi\params\NumRfd,         max,        0, "00001024"\r
-HKR, Ndi\params\NumRfd,         step,       0, "1"\r
-HKR, Ndi\params\NumRfd,         Base,       0, "10"\r
-HKR, Ndi\params\NumRfd,         type,       0, "int"\r
-\r
-HKR, Ndi\params\NumTcb,         ParamDesc,  0, "%TransmitControlBlocks%"\r
-HKR, Ndi\params\NumTcb,         default,    0, "16"\r
-HKR, Ndi\params\NumTcb,         min,        0, "1"\r
-HKR, Ndi\params\NumTcb,         max,        0, "00000064"\r
-HKR, Ndi\params\NumTcb,         step,       0, "1"\r
-HKR, Ndi\params\NumTcb,         Base,       0, "10"\r
-HKR, Ndi\params\NumTcb,         type,       0, "int"\r
-\r
-HKR, Ndi\Params\SendChksum,  ParamDesc,     0, "%SendChecksumOffload%"\r
-HKR, Ndi\Params\SendChksum,  Type,          0, "enum"\r
-HKR, Ndi\Params\SendChksum,  Default,       0, "1"\r
-HKR, Ndi\Params\SendChksum,  Optional,      0, "0"\r
-HKR, Ndi\Params\SendChksum\enum, "0",       0, "%Disabled%"\r
-HKR, Ndi\Params\SendChksum\enum, "1",       0, "%Enabled%"\r
\r
-HKR, Ndi\Params\RecvChksum,  ParamDesc, 0, "%RecvChecksumOffload%"\r
-HKR, Ndi\Params\RecvChksum,  Type,  0, "enum"\r
-HKR, Ndi\Params\RecvChksum,  Default, 0, "1"\r
-HKR, Ndi\Params\RecvChksum,  Optional, 0, "0"\r
-HKR, Ndi\Params\RecvChksum\enum, "0", 0, "%Disabled%"\r
-HKR, Ndi\Params\RecvChksum\enum, "1", 0, "%Enabled%"\r
-\r
-HKR, Ndi\Params\LargeSendOffload,  ParamDesc, 0, "%LargeSendOffload%"\r
-HKR, Ndi\Params\LargeSendOffload,  Type,  0, "enum"\r
-HKR, Ndi\Params\LargeSendOffload,  Default, 0, "1"\r
-HKR, Ndi\Params\LargeSendOffload,  Optional, 0, "0"\r
-HKR, Ndi\Params\LargeSendOffload\enum, "0", 0, "%Disabled%"\r
-HKR, Ndi\Params\LargeSendOffload\enum, "1", 0, "%Enabled%"\r
-\r
-HKR, Ndi\Params\UseDma,  ParamDesc, 0, "%UseDma%"\r
-HKR, Ndi\Params\UseDma,  Type,  0, "enum"\r
-HKR, Ndi\Params\UseDma,  Default, 0, "0"\r
-HKR, Ndi\Params\UseDma,  Optional, 0, "0"\r
-HKR, Ndi\Params\UseDma\enum,  "0", 0, "%Disabled%"\r
-HKR, Ndi\Params\UseDma\enum,  "1", 0, "%Enabled%"\r
-\r
-HKR, Ndi\Params\SendCompletionMethod,  ParamDesc, 0, "%SendCompletionMethod%"\r
-HKR, Ndi\Params\SendCompletionMethod,  Type,  0, "enum"\r
-HKR, Ndi\Params\SendCompletionMethod,  Default, 0, "1"\r
-HKR, Ndi\Params\SendCompletionMethod,  Optional, 0, "0"\r
-HKR, Ndi\Params\SendCompletionMethod\enum,  "0", 0, "%Polling%"\r
-HKR, Ndi\Params\SendCompletionMethod\enum,  "1", 0, "%Interrupts%"\r
-\r
-HKR, Ndi\Params\RecvCompletionMethod,  ParamDesc, 0, "%RecvCompletionMethod%"\r
-HKR, Ndi\Params\RecvCompletionMethod,  Type,  0, "enum"\r
-HKR, Ndi\Params\RecvCompletionMethod,  Default, 0, "2"\r
-HKR, Ndi\Params\RecvCompletionMethod,  Optional, 0, "0"\r
-HKR, Ndi\Params\RecvCompletionMethod\enum,  "0", 0, "%Polling%"\r
-HKR, Ndi\Params\RecvCompletionMethod\enum,  "1", 0, "%Interrupts%"\r
-HKR, Ndi\Params\RecvCompletionMethod\enum,  "2", 0, "%Adaptive%"\r
-\r
-HKR, Ndi\Params\RecvRingSize,  ParamDesc, 0, "%RecvRingSize%"\r
-HKR, Ndi\Params\RecvRingSize,  Type,  0, "enum"\r
-HKR, Ndi\Params\RecvRingSize,  Default, 0, "3"\r
-HKR, Ndi\Params\RecvRingSize,  Optional, 0, "0"\r
-HKR, Ndi\Params\RecvRingSize\enum,  "0", 0, "0256"\r
-HKR, Ndi\Params\RecvRingSize\enum,  "1", 0, "0512"\r
-HKR, Ndi\Params\RecvRingSize\enum,  "2", 0, "1024"\r
-HKR, Ndi\Params\RecvRingSize\enum,  "3", 0, "2048"\r
-HKR, Ndi\Params\RecvRingSize\enum,  "4", 0, "4096"\r
-\r
-HKR, Ndi\Params\SendRingSize,  ParamDesc, 0, "%SendRingSize%"\r
-HKR, Ndi\Params\SendRingSize,  Type,  0, "enum"\r
-HKR, Ndi\Params\SendRingSize,  Default, 0, "3"\r
-HKR, Ndi\Params\SendRingSize,  Optional, 0, "0"\r
-HKR, Ndi\Params\SendRingSize\enum,  "0", 0, "0256"\r
-HKR, Ndi\Params\SendRingSize\enum,  "1", 0, "0512"\r
-HKR, Ndi\Params\SendRingSize\enum,  "2", 0, "1024"\r
-HKR, Ndi\Params\SendRingSize\enum,  "3", 0, "2048"\r
-HKR, Ndi\Params\SendRingSize\enum,  "4", 0, "4096"\r
-\r
-HKR, Ndi\Params\RssMode,  ParamDesc, 0, "%RssMode%"\r
-HKR, Ndi\Params\RssMode,  Type,  0, "enum"\r
-HKR, Ndi\Params\RssMode,  Default, 0, "2"\r
-HKR, Ndi\Params\RssMode,  Optional, 0, "0"\r
-HKR, Ndi\Params\RssMode\enum,  "1", 0, "%No_rebalnce%"\r
-HKR, Ndi\Params\RssMode\enum,  "2", 0, "%NDIS_RSS%"\r
-\r
-HKR, Ndi\params\MaxFrameSize,         ParamDesc,  0, "%MaxFrameSize%"\r
-HKR, Ndi\params\MaxFrameSize,         default,    0, "9600"\r
-HKR, Ndi\params\MaxFrameSize,         min,        0, "500"\r
-HKR, Ndi\params\MaxFrameSize,         max,        0, "00009985"\r
-HKR, Ndi\params\MaxFrameSize,         step,       0, "1"\r
-HKR, Ndi\params\MaxFrameSize,         Base,       0, "10"\r
-HKR, Ndi\params\MaxFrameSize,         type,       0, "int"\r
-\r
-HKR, Ndi\params\RecvIntModCount,         ParamDesc,  0, "%RecvIntModCount%"\r
-HKR, Ndi\params\RecvIntModCount,         default,    0, "20"\r
-HKR, Ndi\params\RecvIntModCount,         min,        0, "0"\r
-HKR, Ndi\params\RecvIntModCount,         max,        0, "00000200"\r
-HKR, Ndi\params\RecvIntModCount,         step,       0, "1"\r
-HKR, Ndi\params\RecvIntModCount,         Base,       0, "10"\r
-HKR, Ndi\params\RecvIntModCount,         type,       0, "int"\r
-\r
-HKR, Ndi\params\SendIntModCount,         ParamDesc,  0, "%SendIntModCount%"\r
-HKR, Ndi\params\SendIntModCount,         default,    0, "0"\r
-HKR, Ndi\params\SendIntModCount,         min,        0, "0"\r
-HKR, Ndi\params\SendIntModCount,         max,        0, "00000100"\r
-HKR, Ndi\params\SendIntModCount,         step,       0, "1"\r
-HKR, Ndi\params\SendIntModCount,         Base,       0, "10"\r
-HKR, Ndi\params\SendIntModCount,         type,       0, "int"\r
-\r
-HKR, Ndi\params\RecvIntModTime,         ParamDesc,  0, "%RecvIntModTime%"\r
-HKR, Ndi\params\RecvIntModTime,         default,    0, "20"\r
-HKR, Ndi\params\RecvIntModTime,         min,        0, "0"\r
-HKR, Ndi\params\RecvIntModTime,         max,        0, "00000200"\r
-HKR, Ndi\params\RecvIntModTime,         step,       0, "1"\r
-HKR, Ndi\params\RecvIntModTime,         Base,       0, "10"\r
-HKR, Ndi\params\RecvIntModTime,         type,       0, "int"\r
-\r
-HKR, Ndi\params\SendIntModTime,         ParamDesc,  0, "%SendIntModTime%"\r
-HKR, Ndi\params\SendIntModTime,         default,    0, "0"\r
-HKR, Ndi\params\SendIntModTime,         min,        0, "0"\r
-HKR, Ndi\params\SendIntModTime,         max,        0, "00000100"\r
-HKR, Ndi\params\SendIntModTime,         step,       0, "1"\r
-HKR, Ndi\params\SendIntModTime,         Base,       0, "10"\r
-HKR, Ndi\params\SendIntModTime,         type,       0, "int"\r
-\r
-HKR, Ndi\params\SendPollingModCount,         ParamDesc,  0, "%SendPollingModCount%"\r
-HKR, Ndi\params\SendPollingModCount,         Default,    0, "1"\r
-HKR, Ndi\params\SendPollingModCount,         min,        0, "1"\r
-HKR, Ndi\params\SendPollingModCount,         max,        0, "100"\r
-HKR, Ndi\params\SendPollingModCount,         step,       0, "1"\r
-HKR, Ndi\params\SendPollingModCount,         Base,       0, "10"\r
-HKR, Ndi\params\SendPollingModCount,         type,       0, "int"\r
-\r
-HKR, Ndi\params\SendPollingModTime,         ParamDesc,  0, "%SendPollingModTime%"\r
-HKR, Ndi\params\SendPollingModTime,         Default,    0, "20"\r
-HKR, Ndi\params\SendPollingModTime,         min,        0, "10"\r
-HKR, Ndi\params\SendPollingModTime,         max,        0, "100"\r
-HKR, Ndi\params\SendPollingModTime,         step,       0, "10"\r
-HKR, Ndi\params\SendPollingModTime,         Base,       0, "10"\r
-HKR, Ndi\params\SendPollingModTime,         type,       0, "int"\r
-\r
-HKR, Ndi\params\RecvPollingModCount,         ParamDesc,  0, "%RecvPollingModCount%"\r
-HKR, Ndi\params\RecvPollingModCount,         Default,    0, "20"\r
-HKR, Ndi\params\RecvPollingModCount,         min,        0, "1"\r
-HKR, Ndi\params\RecvPollingModCount,         max,        0, "1000000"\r
-HKR, Ndi\params\RecvPollingModCount,         step,       0, "1"\r
-HKR, Ndi\params\RecvPollingModCount,         Base,       0, "10"\r
-HKR, Ndi\params\RecvPollingModCount,         type,       0, "int"\r
-\r
-\r
-HKR, Ndi\params\ThreadPoll,         ParamDesc,  0, "%ThreadPoll%"\r
-HKR, Ndi\params\ThreadPoll,         Default,    0, "3000"\r
-HKR, Ndi\params\ThreadPoll,         min,        0, "1"\r
-HKR, Ndi\params\ThreadPoll,         max,        0, "10000"\r
-HKR, Ndi\params\ThreadPoll,         step,       0, "1"\r
-HKR, Ndi\params\ThreadPoll,         Base,       0, "10"\r
-HKR, Ndi\params\ThreadPoll,         type,       0, "int"\r
-\r
-HKR, Ndi\Params\FailOver,  ParamDesc, 0, "%FailOver%"\r
-HKR, Ndi\Params\FailOver,  Type,  0, "enum"\r
-HKR, Ndi\Params\FailOver,  Default, 0, "0"\r
-HKR, Ndi\Params\FailOver,  Optional, 0, "0"\r
-HKR, Ndi\Params\FailOver\enum,  "0", 0, "%Disabled%"\r
-HKR, Ndi\Params\FailOver\enum,  "1", 0, "%Enabled%"\r
-\r
-;-----------------------------------------------------------------------------\r
-; ConnectX NT specific\r
-;\r
-\r
-[ConnectX.reg]\r
-; use ndis5 as the upper bound because NT supports it\r
-HKR, Ndi,                       Service,    0, "ConnectX"\r
-HKR, Ndi\Interfaces,            UpperRange, 0, "ndis5"\r
-HKR, Ndi\Interfaces,            LowerRange, 0, "ethernet"\r
-HKR, Ndi\params\BundleMlx,       ParamDesc,  0, "Bundle ID"\r
-HKR,"","AverageFactor"                      ,,"16"\r
-HKR,"","AveragePollThreshold"               ,,"10"\r
-HKR,"","ThisPollThreshold"                  ,,100\r
-HKR,"","MaxNumberOfPacketsToIndicateThread" ,,"100"\r
-HKR,"","InterupptToThreadThreshold"         ,,200\r
-\r
-\r
-\r
-[WinCtxTune_reg]\r
-HKR,,icon,,"-5"\r
-HKR,,EnumPropPages32,,"winctxtune.dll,WinCtxTunePropPageProvider"\r
-\r
-[ConnectX.Service]\r
-DisplayName     = %ConnectX.Service.DispName%\r
-ServiceType     = 1 ;%SERVICE_KERNEL_DRIVER%\r
-StartType       = 3 ;%SERVICE_DEMAND_START%\r
-ErrorControl    = 1 ;%SERVICE_ERROR_NORMAL%\r
-ServiceBinary   = %12%\ConnectX.sys\r
-LoadOrderGroup  = NDIS\r
-AddReg          = Ibbus.ParamsReg\r
-\r
-[Ibbus.ParamsReg]\r
-HKR,"Parameters","MaximumWorkingThreads",%REG_DWORD%,0x2\r
-\r
-\r
-[common.EventLog]\r
-AddReg = common.AddEventLog.reg\r
-\r
-[common.AddEventLog.reg]\r
-HKR, , EventMessageFile, 0x00020000, "%%SystemRoot%%\System32\drivers\ConnectX.sys"\r
-HKR, , TypesSupported,   0x00010001, 7\r
-\r
-;-----------------------------------------------------------------------------\r
-; DestinationDirs\r
-;\r
-\r
-[DestinationDirs]\r
-ConnectX.CopyFiles     = 12\r
-Wctxtune.CopyFiles     = 11\r
-\r
-[ConnectX.CopyFiles]\r
-ConnectX.sys,,,2\r
-\r
-[Wctxtune.CopyFiles]\r
-winctxtune.dll,,,2\r
-\r
-[SourceDisksNames]\r
-;\r
-; diskid = description[, [tagfile] [, <unused>, subdir]]\r
-;\r
-1 = %DiskDescription%,ConnectX.sys,,\r
-\r
-[SourceDisksFiles]\r
-;\r
-; filename_on_source = diskID[, [subdir][, size]]\r
-;\r
-ConnectX.sys = 1,, ; on distribution disk 1\r
-WinCtxTune.DLL = 1 \r
-\r
-[Strings]\r
-Mellanox                 = "Mellanox"\r
-\r
-ReceiveFrameDescriptors  = "Receive Frame Descriptors"\r
-TransmitControlBlocks    = "Transmit Control Blocks"\r
-SendChecksumOffload      = "Send Checksum Offload"\r
-RecvChecksumOffload     = "Receive Checksum Offload"\r
-Disabled                 = "Disabled"\r
-Enabled                  = "Enabled"\r
-LargeSendOffload         = "Large Send Offload (LSO)"\r
-MaxFrameSize             = "Maximum Frame size (MTU)"\r
-RecvIntModCount          = "int moderation recv pkt count"\r
-SendIntModCount          = "int moderation send pkt count"\r
-RecvPollingModCount         = "Polling moderation recv pkt count"\r
-ThreadPoll               = "Number of polls on recieve" \r
-SendPollingModCount      = "Polling moderation send pkt count"\r
-RecvIntModtime           = "int moderation recv pkt time"\r
-SendIntModtime           = "int moderation send pkt time"\r
-SendPollingModTime       = "Polling moderation send pkt time"\r
-UseDma                   = "bus-master DMA Operations"\r
-SendCompletionMethod     = "Send Completion method"\r
-RecvCompletionMethod    = "Receive Completion method"\r
-RecvRingSize             = "Receive ring size"\r
-SendRingSize             = "Send ring size"\r
-Polling                  = "Polling"\r
-Interrupts               = "Interrupts"\r
-Adaptive                 = "Adaptive"\r
-No_rebalnce              = "No Dynamic rebalancing"\r
-NDIS_RSS                 = "Default NDIS rebalancing"\r
-RssMode                  = "RssMode"\r
-FailOver                 = "Fail Over"\r
-\r
-\r
-\r
-ConnectX.DeviceDesc       = "Mellanox ConnectX 10Gb Ethernet Adapter"\r
-\r
-ConnectX.Service.DispName = "Mellanox ConnectX based Ethernet Adapter NT Driver"\r
-DiskDescription              = "Mellanox Driver Disk 1"\r
-REG_DWORD                 = 0x00010001\r
-\r
diff --git a/hw/mlx4/kernel/eth/e100.mof b/hw/mlx4/kernel/eth/e100.mof
deleted file mode 100644 (file)
index b45565a..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-[WMI, Dynamic, Provider("WMIProv"),\r
- guid("{F4A80276-23B7-11d1-9ED9-00A0C9010057}"),\r
- localeid(0x409),\r
- WmiExpense(1),\r
- Description("A UINT to set")]\r
-class E100BExampleSetUINT_OID\r
-{\r
-   [key, read]\r
-   string   InstanceName;           // Instance name returned from WMI\r
-\r
-   [read]\r
-   boolean  Active;\r
-\r
-   [read, write,\r
-    Description("Set this UINT then query it."),\r
-    WmiDataId(1)] uint32   ExampleSetUINT_OID;\r
-};\r
-\r
-[WMI, Dynamic, Provider("WMIProv"),\r
- guid("{F4A80277-23B7-11d1-9ED9-00A0C9010057}"),\r
- localeid(0x409),\r
- WmiExpense(1),\r
- Description("A UINT to Query")]\r
-class E100BExampleQueryUINT_OID\r
-{\r
-   [key, read]\r
-   string   InstanceName;           // Instance name returned from WMI\r
-\r
-   [read]\r
-   boolean  Active;\r
-\r
-   [read,\r
-    Description("Query this UINT and get back the set UINT + 1."),\r
-    WmiDataId(1)] uint32   ExampleQueryUINT_OID;\r
-};\r
-\r
-[WMI, Dynamic, Provider("WMIProv"),\r
- guid("{F4A80278-23B7-11d1-9ED9-00A0C9010057}"),\r
- localeid(0x409),\r
- WmiExpense(1),\r
- Description("An Array to query (should be 4 bytes of MAC address)")]\r
-class E100BExampleQueryArrayOID\r
-{\r
-   [key, read]\r
-   string   InstanceName;           // Instance name returned from WMI\r
-\r
-   [read]\r
-   boolean  Active;\r
-\r
-   [read,\r
-      Description("Number of array elements."),\r
-      WmiDataId(1)] uint32 NumberElements;\r
-\r
-   [read,\r
-        Description("Query this array to get 4 bytes of MAC address."),\r
-      WmiDataId(2),\r
-      WmiSizeIs("NumberElements")]    uint8 ExampleQueryArray[];\r
-\r
-};\r
-\r
-[WMI, Dynamic, Provider("WMIProv"),\r
- guid("{F4A80279-23B7-11d1-9ED9-00A0C9010057}"),\r
- localeid(0x409),\r
- WmiExpense(1),\r
- Description("An ANSI string to Query")]\r
-class E100BExampleQueryStringOID\r
-{\r
-   [key, read]\r
-   string   InstanceName;           // Instance name returned from WMI\r
-\r
-   [read]\r
-   boolean  Active;\r
-\r
-   [read,\r
-    Description("Query this to get an ANSI string back (it will be the VENDORDESCRIPTOR string)."),\r
-    WmiDataId(1)] string   ExampleQueryStringOID;\r
-};\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/e100.rc b/hw/mlx4/kernel/eth/e100.rc
deleted file mode 100644 (file)
index f0fb28e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999, 2000 Microsoft Corporation.\r
-\r
-Module Name:\r
-\r
-   e100.rc\r
-\r
-Abstract:\r
-\r
-    Internal resource file for filter.\r
-\r
---*/\r
-\r
-\r
-#include <oib_ver.h>\r
-\r
-#define VER_FILETYPE                VFT_DRV\r
-#define VER_FILESUBTYPE             VFT2_DRV_NETWORK\r
-#define VER_FILEDESCRIPTION_STR     "Driver for Mellanox ConnectX 10Gb Ethernet Adapters"\r
-#define VER_INTERNALNAME_STR        "ConnectX.sys"\r
-#define VER_ORIGINALFILENAME_STR    "ConnectX.sys"\r
-\r
-\r
-#include <common.ver>\r
-\r
-NdisMofResource         MOFDATA     e100.bmf\r
-\r
-#include "mp_log.rc"\r
diff --git a/hw/mlx4/kernel/eth/makefile b/hw/mlx4/kernel/eth/makefile
deleted file mode 100644 (file)
index a0e9a1d..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#\r
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source\r
-# file to this component.  This file merely indirects to the real make file\r
-# that is shared by all the components of NT\r
-#\r
-\r
-#\r
-# if building in a DDK environment\r
-#\r
-!IF defined(DDK_TARGET_OS)\r
-\r
-#\r
-# ensure that said build environment is at least Windows Longhorn\r
-# 0x500 == Windows 2000\r
-# 0x501 == Windows XP\r
-# 0x502 == Windows Server 2003\r
-# 0x600 == Windows Longhorn\r
-#\r
-!    IF defined(_NT_TARGET_VERSION) && $(_NT_TARGET_VERSION)>=0x501\r
-#!       INCLUDE $(NTMAKEENV)\makefile.def\r
-!        INCLUDE ..\..\..\..\inc\openib.def\r
-!    ELSE\r
-!        message BUILDMSG: Warning : The sample "$(MAKEDIR)" is not valid for the current OS target.\r
-!    ENDIF\r
-\r
-!ELSE\r
-\r
-#\r
-# not a DDK environment, so build\r
-#\r
-\r
-!ENDIF\r
-!include wineth.def\r
-\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/makefile.inc b/hw/mlx4/kernel/eth/makefile.inc
deleted file mode 100644 (file)
index 7a7a9fa..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-$(OBJ_PATH)\$(O)\e100.mof: e100.mof\r
-\r
-$(OBJ_PATH)\$(O)\e100_wmi.h: $(OBJ_PATH)\$(O)\e100.bmf \r
-    wmimofck -h$(OBJ_PATH)\$(O)\e100_wmi.h $(OBJ_PATH)\$(O)\e100.bmf\r
diff --git a/hw/mlx4/kernel/eth/mp.h b/hw/mlx4/kernel/eth/mp.h
deleted file mode 100644 (file)
index 2f41710..0000000
+++ /dev/null
@@ -1,833 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp.h\r
-\r
-Abstract:\r
-    Miniport generic portion header file\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#ifndef _MP_H\r
-#define _MP_H\r
-\r
-#define MP_NDIS_MAJOR_VERSION       5\r
-#define MP_NDIS_MINOR_VERSION       2\r
-\r
-#define ALIGN_16                   16\r
-\r
-#ifndef MIN\r
-#define MIN(a, b)   ((a) > (b) ? b: a)\r
-#endif\r
-\r
-//\r
-// The driver should put the data(after Ethernet header) at 8-bytes boundary\r
-//\r
-\r
-#define ETH_PAGE_ALIGN 4096\r
-// \r
-// Shift HW_RFD 0xA bytes to make Tcp data 8-byte aligned\r
-// Since the ethernet header is 14 bytes long. If a packet is at 0xA bytes \r
-// offset, its data(ethernet user data) will be at 8 byte boundary\r
-// \r
-#define HWRFD_SHIFT_OFFSET                0xA   // Shift HW_RFD 0xA bytes to make Tcp data 8-byte aligned\r
-\r
-//\r
-// The driver has to allocate more data then HW_RFD needs to allow shifting data\r
-// \r
-#define MORE_DATA_FOR_ALIGN         (HWRFD_SHIFT_OFFSET)\r
-\r
-//\r
-// Get the number of bytes the final address shift from the original address\r
-// \r
-#define BYTES_SHIFT(_NewVa, _OrigVa) ((PUCHAR)(_NewVa) - (PUCHAR)(_OrigVa))\r
-\r
-//\r
-// define the maximum speed of the NIC in kbps\r
-//\r
-#define LINE_SPEED_10_GBTS 100000000\r
-\r
-//\r
-// Define max number of processors \r
-//\r
-#define MAX_PROCCESSOR_NUM 256\r
-\r
-//\r
-// define max number of LRO connections\r
-//\r
-#define MAX_LRO_SESSIONS 32\r
-\r
-\r
-//--------------------------------------\r
-// Some utility macros        \r
-//--------------------------------------\r
-#ifndef min\r
-#define min(_a, _b)     (((_a) < (_b)) ? (_a) : (_b))\r
-#endif\r
-\r
-#ifndef max\r
-#define max(_a, _b)     (((_a) > (_b)) ? (_a) : (_b))\r
-#endif\r
-\r
-#define MP_ALIGNMEM(_p, _align) (((_align) == 0) ? (_p) : (PUCHAR)(((ULONG_PTR)(_p) + ((_align)-1)) & (~((ULONG_PTR)(_align)-1))))\r
-#define MP_ALIGNMEM_PA(_p, _align) (((_align) == 0) ?  (_p).QuadPart : (((_p).QuadPart + ((_align)-1)) & (~((ULONGLONG)(_align)-1))))\r
-\r
-#define GetListHeadEntry(ListHead)  ((ListHead)->Flink)\r
-#define GetListTailEntry(ListHead)  ((ListHead)->Blink)\r
-#define GetListFLink(ListEntry)     ((ListEntry)->Flink)\r
-\r
-#define IsSListEmpty(ListHead)  (((PSINGLE_LIST_ENTRY)ListHead)->Next == NULL)\r
-\r
-//--------------------------------------\r
-// Memory manipulation macros        \r
-//--------------------------------------\r
-\r
-/*++\r
-VOID\r
-MP_MEMSET(\r
-    IN  PVOID       Pointer,\r
-    IN  ULONG       Length,\r
-    IN  UCHAR       Value\r
-    )\r
---*/\r
-#define MP_MEMSET(Pointer, Length, Value)   NdisFillMemory(Pointer, Length, Value)\r
-\r
-/*++\r
-VOID\r
-MP_MEMCOPY(\r
-    IN  POPAQUE     Destn,\r
-    IN  POPAQUE     Source,\r
-    IN  ULONG       Length\r
-    )\r
---*/\r
-#define MP_MEMCOPY(Destn, Source, Length) NdisMoveMemory((Destn), (Source), (Length))\r
-\r
-\r
-/*++\r
-ULONG\r
-MP_MEMCOPY(\r
-    IN  PVOID       Destn,\r
-    IN  PVOID       Source,\r
-    IN  ULONG       Length\r
-    )\r
---*/\r
-#define MPMemCmp(Destn, Source, Length)   \\r
-    RtlCompareMemory((PUCHAR)(Destn), (PUCHAR)(Source), (ULONG)(Length))\r
-\r
-#if DBG\r
-\r
-/*++\r
-PVOID\r
-MP_ALLOCMEM(\r
-    IN  ULONG   Size\r
-    )\r
---*/\r
-#define MP_ALLOCMEM(pptr, size, flags, highest) \\r
-    MPAuditAllocMem(pptr, size, flags, highest, _FILENUMBER, __LINE__);\r
-\r
-#define MP_ALLOCMEMTAG(pptr, size) \\r
-    MPAuditAllocMemTag(pptr, size, _FILENUMBER, __LINE__);\r
-\r
-/*++\r
-VOID\r
-MP_FREEMEM(\r
-    IN  PVOID   Pointer\r
-    )\r
---*/\r
-#define MP_FREEMEM(ptr, size, flags) MPAuditFreeMem(ptr, size, flags)\r
-\r
-#else // DBG\r
-\r
-\r
-#define MP_ALLOCMEMTAG(pptr, size) \\r
-    NdisAllocateMemoryWithTag(pptr, size, NIC_TAG)\r
-\r
-#define MP_FREEMEM(ptr, size, flags) NdisFreeMemory(ptr, size, flags)\r
-\r
-#endif \r
-\r
-#define MP_INIT_NDIS_STRING(str)                        \\r
-    (str)->Length = 0;                                  \\r
-    (str)->MaximumLength = 0;                           \\r
-    (str)->Buffer = NULL;\r
-\r
-#define MP_FREE_NDIS_STRING(str)                        \\r
-    NdisFreeMemory((str)->Buffer, (str)->MaximumLength, 0);       \\r
-    (str)->Length = 0;                                  \\r
-    (str)->MaximumLength = 0;                           \\r
-    (str)->Buffer = NULL;\r
-\r
-//--------------------------------------\r
-// Macros for flag and ref count operations       \r
-//--------------------------------------\r
-#define MP_SET_FLAG(_M, _F)         ((_M)->Flags |= (_F))   \r
-#define MP_CLEAR_FLAG(_M, _F)       ((_M)->Flags &= ~(_F))\r
-#define MP_CLEAR_FLAGS(_M)          ((_M)->Flags = 0)\r
-#define MP_TEST_FLAG(_M, _F)        (((_M)->Flags & (_F)) != 0)\r
-#define MP_TEST_FLAGS(_M, _F)       (((_M)->Flags & (_F)) == (_F))\r
-\r
-#define MP_INC_REF(_A)              NdisInterlockedIncrement(&(_A)->RefCount)\r
-#define MP_DEC_REF(_A)              NdisInterlockedDecrement(&(_A)->RefCount); ASSERT(_A->RefCount >= 0)\r
-#define MP_GET_REF(_A)              ((_A)->RefCount)\r
-\r
-#define MP_INC_RCV_REF(_A)          NdisInterlockedIncrement((LONG*)&((_A)->RcvRefCount))\r
-#define MP_DEC_RCV_REF(_A)          NdisInterlockedDecrement((LONG*)&((_A)->RcvRefCount))\r
-#define MP_GET_RCV_REF(_A)          ((_A)->RcvRefCount)\r
-   \r
-\r
-#define MP_LBFO_INC_REF(_A)         NdisInterlockedIncrement(&(_A)->RefCountLBFO)\r
-#define MP_LBFO_DEC_REF(_A)         NdisInterlockedDecrement(&(_A)->RefCountLBFO); ASSERT(_A->RefCountLBFO >= 0)\r
-#define MP_LBFO_GET_REF(_A)         ((_A)->RefCountLBFO)\r
-\r
-\r
-//--------------------------------------\r
-// Coalesce Tx buffer for local data copying                     \r
-//--------------------------------------\r
-typedef struct _MP_TXBUF\r
-{\r
-    SLIST_ENTRY             SList;\r
-    PNDIS_BUFFER            NdisBuffer;\r
-\r
-    ULONG                   AllocSize;\r
-    PVOID                   AllocVa;\r
-    NDIS_PHYSICAL_ADDRESS   AllocPa;\r
-    BOOLEAN                 fAllocCache;\r
-\r
-    PUCHAR                  pBuffer;\r
-    NDIS_PHYSICAL_ADDRESS   BufferPa;\r
-    ULONG                   BufferSize;\r
-\r
-} MP_TXBUF, *PMP_TXBUF;\r
-\r
-inline ULONG CalcNumberOfWqbb(ULONG NumberOfElements)\r
-{\r
-    ULONG nr_frags = NumberOfElements - 1;\r
-    return 1 + (nr_frags >> 1) + (nr_frags & 0x1);\r
-}\r
-\r
-class mtnic_lro;\r
-\r
-//--------------------------------------\r
-// RFD (Receive Frame Descriptor)\r
-//--------------------------------------\r
-typedef struct _MP_RFD\r
-{\r
-    LIST_ENTRY              List;\r
-    PNDIS_PACKET            NdisPacket;\r
-    PNDIS_BUFFER            NdisBuffer;          // Pointer to Buffer\r
-\r
-    VOID *                  HwRfd;\r
-    NDIS_PHYSICAL_ADDRESS   HwRfdPa;             // physical address of RFD   \r
-    \r
-    ULONG                   Flags;\r
-    BOOLEAN                 fAllocCache;\r
-    union\r
-    {\r
-        mtnic_rx_ring* ring;\r
-        mtnic_lro* lro;\r
-    };\r
-    AllocateSharedMemoryDeleteInfo DelInfo;\r
-    PMP_PORT Port;\r
-} MP_RFD, *PMP_RFD;\r
-\r
-//--------------------------------------\r
-// Structure for pended OIS query request\r
-//--------------------------------------\r
-typedef struct _MP_QUERY_REQUEST\r
-{\r
-    IN NDIS_OID Oid;\r
-    IN PVOID InformationBuffer;\r
-    IN ULONG InformationBufferLength;\r
-    OUT PULONG BytesWritten;\r
-    OUT PULONG BytesNeeded;\r
-} MP_QUERY_REQUEST, *PMP_QUERY_REQUEST;\r
-\r
-//--------------------------------------\r
-// Structure for pended OIS set request\r
-//--------------------------------------\r
-typedef struct _MP_SET_REQUEST\r
-{\r
-    IN NDIS_OID Oid;\r
-    IN PVOID InformationBuffer;\r
-    IN ULONG InformationBufferLength;\r
-    OUT PULONG BytesRead;\r
-    OUT PULONG BytesNeeded;\r
-} MP_SET_REQUEST, *PMP_SET_REQUEST;\r
-\r
-//--------------------------------------\r
-// Structure for Power Management Info\r
-//--------------------------------------\r
-typedef struct _MP_POWER_MGMT\r
-{\r
-\r
-\r
-    // List of Wake Up Patterns\r
-    LIST_ENTRY              PatternList;\r
-\r
-    // Number of outstanding Rcv Packet.\r
-    UINT                    OutstandingRecv;\r
-    // Current Power state of the port\r
-    UINT                    PowerState;\r
-\r
-    // Is PME_En on this port\r
-    BOOLEAN                 PME_En;\r
-\r
-    // Wake-up capabailities of the port\r
-    BOOLEAN                 bWakeFromD0;\r
-    BOOLEAN                 bWakeFromD1;\r
-    BOOLEAN                 bWakeFromD2;\r
-    BOOLEAN                 bWakeFromD3Hot;\r
-    BOOLEAN                 bWakeFromD3Aux;\r
-    // Pad\r
-    BOOLEAN                 Pad[2];\r
-\r
-} MP_POWER_MGMT, *PMP_POWER_MGMT;\r
-\r
-typedef struct _MP_WAKE_PATTERN \r
-{\r
-    // Link to the next Pattern\r
-    LIST_ENTRY      linkListEntry;\r
-\r
-    // E100 specific signature of the pattern\r
-    ULONG           Signature;\r
-\r
-    // Size of this allocation\r
-    ULONG           AllocationSize;\r
-\r
-    // Pattern - This contains the NDIS_PM_PACKET_PATTERN\r
-    UCHAR           Pattern[1];\r
-    \r
-} MP_WAKE_PATTERN , *PMP_WAKE_PATTERN ;\r
-\r
-//--------------------------------------\r
-// Macros specific to miniport port structure \r
-//--------------------------------------\r
-\r
-\r
-#define MP_SHOULD_FAIL_SEND(_M)   ((_M)->Flags & fMP_PORT_FAIL_SEND_MASK) \r
-\r
-#define MP_IS_NOT_READY(_M)       ((_M)->Flags & fMP_PORT_NOT_READY_MASK)\r
-#define MP_IS_READY(_M)           !((_M)->Flags & fMP_PORT_NOT_READY_MASK)\r
-#define MP_RESET_IN_PROGRESS(_M)  ((_M)->Flags & fMP_PORT_RESET_IN_PROGRESS)\r
-#define MP_NO_RESET_IN_PROGRESS(_M) !((_M)->Flags & fMP_PORT_RESET_IN_PROGRESS)\r
-\r
-#define MP_SET_PACKET_RFD(_p, _rfd)  *((PMP_RFD *)&(_p)->MiniportReserved[0]) = _rfd\r
-#define MP_GET_PACKET_RFD(_p)        *((PMP_RFD *)&(_p)->MiniportReserved[0])\r
-#define MP_GET_PACKET_MR(_p)         (LIST_ENTRY *)(&(_p)->MiniportReserved[0]) \r
-#define MP_GET_PACKET_MR_V(_p)         (VOID **)(&(_p)->MiniportReserved[0]) \r
-\r
-#define MP_SET_HARDWARE_ERROR(port)    MP_SET_FLAG(port, fMP_PORT_HARDWARE_ERROR) \r
-#define MP_SET_NON_RECOVER_ERROR(port) MP_SET_FLAG(port, fMP_PORT_NON_RECOVER_ERROR)\r
-\r
-#define MP_OFFSET(field)   ((UINT)FIELD_OFFSET(PORT_CONFIGURATION,field))\r
-#define MP_SIZE(field)     sizeof(((PORT_CONFIGURATION*)0)->field)\r
-#define MP_GET_PORT_CONFIG(_p, _f) (_p->Config._f)\r
-\r
-\r
-/*\r
- * PCI-Express Capability\r
- */\r
-typedef struct _PCI_PCIEXP_CAPABILITY {\r
-\r
-    PCI_CAPABILITIES_HEADER    Header;\r
-\r
-    USHORT             Flags;\r
-    ULONG                      DevCapabilities;\r
-    USHORT             DevControl;\r
-    USHORT             DevStatus;\r
-    ULONG                      LinkCapabilities;\r
-    USHORT             LinkControl;\r
-    USHORT             LinkStatus;\r
-    ULONG                      SlotCapabilities;\r
-    USHORT             SlotControl;\r
-    USHORT             SlotStatus;\r
-    USHORT             RootControl;\r
-    USHORT             RootCapabilities;\r
-    USHORT             RootStatus;\r
-} PCI_PCIEXP_CAPABILITY, *PPCI_PCIEXP_CAPABILITY;\r
-\r
-struct NDIS_SET_INFORMATION {\r
-    NDIS_WORK_ITEM  WorkItem;\r
-    NDIS_OID  Oid;\r
-    PVOID  InformationBuffer;\r
-    ULONG  InformationBufferLength;\r
-};\r
-\r
-VOID SetInformationPassive(\r
-    NDIS_WORK_ITEM *  pWorkItem,\r
-    PVOID  Context    \r
-    );\r
-\r
-struct NDIS_GET_INFORMATION {\r
-    NDIS_WORK_ITEM  WorkItem;\r
-    NDIS_OID  Oid;\r
-    PVOID  InformationBuffer;\r
-    ULONG  InformationBufferLength;\r
-    PULONG BytesWritten;\r
-    PULONG BytesNeeded;\r
-};\r
-\r
-VOID GetInformationPassive(\r
-    NDIS_WORK_ITEM *  pWorkItem,\r
-    PVOID  Context    \r
-    );\r
-\r
-VOID InteruptModerationPassive(\r
-    NDIS_WORK_ITEM *  pWorkItem,\r
-    PVOID  Context    \r
-    );\r
-\r
-\r
-struct ALLOC_MEM_ASYNC {\r
-    NDIS_WORK_ITEM  WorkItem;\r
-    NDIS_HANDLE  AdapterHandle;\r
-    ULONG  Length1;\r
-    BOOLEAN Cached;\r
-    PVOID  Context;\r
-};\r
-\r
-VOID AllocMemPassive(\r
-    NDIS_WORK_ITEM *  pWorkItem,\r
-    PVOID  Context    \r
-    );\r
-\r
-VOID mtnic_linkstate(\r
-    NDIS_WORK_ITEM *  pWorkItem,\r
-    PVOID  Context    \r
-    );\r
-\r
-VOID mp_reset_nic(\r
-    NDIS_WORK_ITEM *  pWorkItem,\r
-    PVOID  Context    \r
-    );\r
-\r
-struct _MtnicBusIfc;\r
-\r
-const int RECIEVE_MODE_POOL = 0;\r
-const int RECIEVE_MODE_INTERUPT = 1;\r
-const int RECIEVE_MODE_ADAPTIVE = 2;\r
-const int RECIEVE_MODE_MAX = 2;\r
-\r
-typedef struct _PORT_CONFIGURATION\r
-{\r
-    ULONG   Debug;\r
-    BOOLEAN TxChksumOffload;    // Registry value for checksum offloading in transmit. default = TRUE\r
-    BOOLEAN RxChksumOffload;    // Registry value for checksum offloading in receive. default = TRUE\r
-    BOOLEAN LargeSendOffload;   // Registry value for large send offload\r
-    LONG    LargeReceiveOffload;// Registry value for large Receieve offload\r
-    BOOLEAN fUseDma;            // Registry value for memory allocation type\r
-    BOOLEAN fUseSendInt;        // Registry value for send completion type\r
-    LONG    RecvRingSize;       // Registry value for the size of the recv rings\r
-    LONG    SendRingSize;       // Registry value for the size of the send rings\r
-    LONG    NumTcb;             // Total number of TCBs\r
-    LONG    NumRfd;\r
-    LONG    NumBuffers;\r
-    UCHAR   SpeedDuplex;        // New reg value for speed/duplex\r
-    LONG    MaxFrameSize;       // Registry value for the bigest frame that can be sent (MTU)\r
-    LONG    RecvIntModCount;    // Registry value for Interrupt moderation on recieve (packet count)\r
-    LONG    RecvIntModTime;     // Registry value for Interrupt moderation on recieve (time between packets)\r
-    LONG    SendIntModCount;    // Registry value for Interrupt moderation on send (packet count)\r
-    LONG    SendIntModTime;     // Registry value for Interrupt moderation on send (time between packets)\r
-    LONG    SendPollingModCount;// Registry value for Pooling moderation on send (packet count)\r
-    LONG    SendPollingModTime; // Registry value for Pooling moderation on send (time between packets)\r
-    LONG    RssMode;            // Registry value for the different RSS modes\r
-    LONG    ThreadPoll;         // Registry value for number of times that the reciever thread will poll\r
-    LONG    RecvCompletionMethod;// Registry value for receive completion type    \r
-    LONG    RecvPollingModCount;// Registry value for Pooling moderation on receive (packet count)    \r
-\r
-// Constants that are used by the polling thread \r
-    u32     AverageFactor;         // The weight to give to the last poll\r
-    u32     AveragePollThreshold;  // If the average number of poll is bigger than this \r
-                                   // We will continue to poll\r
-    u32     ThisPollThreshold;     // If the last number of poll is bigger than this number\r
-                                     // We will continue to poll\r
-    u32     MaxNumberOfPacketsToIndicateThread; // This is the maximum number of packets that \r
-                                   // will be indicated by the thread in one time\r
-\r
-    u32     InterupptToThreadThreshold; // If the number of packets that were used is bigger than this \r
-                                   // constant, the polling thread will start to work    \r
-    BOOLEAN  FailOver;           // Registry value for Fail over\r
-\r
-#if LBFO\r
-    LPWSTR  psBundleId;           // BundleId\r
-#endif     \r
-}PORT_CONFIGURATION;        \r
-\r
-typedef struct _OFFLOAD_ENABLE_TASK\r
-{\r
-    ULONG Tx_Checksum:1 ;\r
-    ULONG Rx_Checksum:1;    \r
-}OFFLOAD_ENABLE_TASK;\r
-    \r
-//--------------------------------------\r
-// The miniport port structure\r
-//--------------------------------------\r
-\r
-#ifdef LBFO\r
-class CBundleInfo;\r
-#endif\r
-\r
-typedef struct _MP_PORT\r
-{\r
-    LIST_ENTRY              List;\r
-    LONG                    RefCount;\r
-    NDIS_STRING             AdapterInstanceName;\r
-    \r
-    // Handle given by NDIS when the port registered itself.\r
-    NDIS_HANDLE             PortHandle;\r
-    _MtnicBusIfc*           pMtnicIfc;\r
-    \r
-    //flags \r
-    ULONG                   Flags;\r
-\r
-    // configuration \r
-    UCHAR                   PermanentAddress[ETH_LENGTH_OF_ADDRESS];\r
-    UCHAR                   CurrentAddress[ETH_LENGTH_OF_ADDRESS];\r
-    BOOLEAN                 bOverrideAddress;\r
-\r
-    NDIS_EVENT              ExitEvent;\r
-\r
-    // SEND                       \r
-    LONG                    nCancelSend;\r
-    SLIST_HEADER            SendBufList;       \r
-    KSPIN_LOCK              SendBufListLock;\r
-\r
-    NDIS_HANDLE             SendBufferPool;\r
-\r
-    PUCHAR                  MpTxBufMem;\r
-    ULONG                   MpTxBufMemSize;\r
-\r
-    // RECV\r
-    LONG                    MaxNumRfd; //??? move to ring\r
-    ULONG                   HwRfdSize;\r
-    BOOLEAN                 bAllocNewRfd;\r
-\r
-    NDIS_HANDLE             RecvPacketPool;\r
-    NDIS_HANDLE             RecvBufferPool;\r
-\r
-    // spin locks\r
-    NDIS_SPIN_LOCK          Lock;\r
-\r
-    // Packet Filter and look ahead size.\r
-    ULONG                   PacketFilter;\r
-    u64                     vlanFilter[64];\r
-    ULONG                   ulLookAhead;\r
-\r
-    // multicast list\r
-    UINT                    MCAddressCount;\r
-    PUCHAR                  MCList;\r
-    ULONG                   McListAlocateSize;\r
-\r
-    ULONG                   CacheFillSize;\r
-\r
-    PORT_CONFIGURATION      Config;\r
-    OFFLOAD_ENABLE_TASK     Offload_EnableTask;\r
-    NDIS_DEVICE_POWER_STATE CurrentPowerState;\r
-    NDIS_DEVICE_POWER_STATE NextPowerState;\r
-\r
-    // WMI support\r
-    ULONG                   CustomDriverSet;\r
-    ULONG                   HwErrCount;\r
-\r
-    // Minimize init-time \r
-    BOOLEAN                 bQueryPending;\r
-    BOOLEAN                 bSetPending;\r
-    MP_SET_REQUEST          SetRequest;\r
-    \r
-    MP_POWER_MGMT           PoMgmt;\r
-\r
-#if LBFO\r
-    CBundleInfo*            pBundleInfo;\r
-#endif \r
-   \r
-    NDIS_SPIN_LOCK          SendLock;\r
-    NDIS_SPIN_LOCK          RcvLock;\r
-    ULONG                   RcvRefCount;  // number of packets that have not been returned back\r
-    NDIS_EVENT              AllPacketsReturnedEvent;\r
-    ULONG                   WakeUpEnable;\r
-\r
-    NDIS_ENCAPSULATION_FORMAT   EncapsulationFormat;\r
-\r
-    // MT-nic hardware\r
-\r
-    KDPC                    send_dpc;\r
-    KDPC                    timer_dpc;\r
-\r
-    NDIS_SET_INFORMATION    NdisSetInformation;\r
-    NDIS_GET_INFORMATION    NdisGetInformation;\r
-    ALLOC_MEM_ASYNC         AllocMemAsync;\r
-\r
-    KTIMER                  SendPollingTimer;\r
-    LONG                    nSendPollingCounter;\r
-    \r
-    RSSBalancer             m_RssBalancer;    \r
-    PVOID                   m_RssThreadObject;\r
-    KEVENT                  m_RssThreadTerminationEvent;\r
-    mtnic_priv              priv;\r
-    mtnic_perf_counters     perf_counters;\r
-    NDIS_WORK_ITEM          InteruptModerationWorkItem;\r
-#ifndef _WIN64   \r
-    UCHAR   pad1[4];\r
-#else\r
-    UCHAR pad1[4];\r
-#endif    \r
-    NPAGED_LOOKASIDE_LIST   RecvLookaside;\r
-\r
-} MP_PORT, *PMP_PORT;\r
-\r
-C_ASSERT((FIELD_OFFSET(MP_PORT, RecvLookaside) % 16) == 0);\r
-#ifdef _WIN64\r
-C_ASSERT((FIELD_OFFSET(MP_PORT, SendBufList) % 16) == 0);\r
-#endif\r
-C_ASSERT((sizeof(MP_PORT) % 16) == 0);\r
-\r
-\r
-inline LONG IncPortRefCount(PMP_PORT pPort)\r
-{\r
-    return NdisInterlockedIncrement(&pPort->RefCount);\r
-}\r
-\r
-inline LONG DecPortRefCount(PMP_PORT pPort)\r
-{\r
-    ASSERT(pPort->RefCount > 0);\r
-    LONG count =  NdisInterlockedDecrement(&pPort->RefCount);\r
-    if (count == 0)\r
-    {\r
-        NdisSetEvent(&pPort->ExitEvent);\r
-    }\r
-\r
-    return count;\r
-}\r
-\r
-inline LONG GetPortRefCount(PMP_PORT pPort)\r
-{\r
-    return pPort->RefCount;\r
-}\r
-\r
-\r
-//--------------------------------------\r
-// Stall execution and wait with timeout\r
-//--------------------------------------\r
-/*++\r
-    _condition  - condition to wait for \r
-    _timeout_ms - timeout value in milliseconds\r
-    _result     - TRUE if condition becomes true before it times out\r
---*/\r
-#define MP_STALL_AND_WAIT(_condition, _timeout_ms, _result)     \\r
-{                                                               \\r
-    int counter;                                                \\r
-    _result = FALSE;                                            \\r
-    for(counter = _timeout_ms * 50; counter != 0; counter--)    \\r
-    {                                                           \\r
-        if(_condition)                                          \\r
-        {                                                       \\r
-            _result = TRUE;                                     \\r
-            break;                                              \\r
-        }                                                       \\r
-        NdisStallExecution(20);                                 \\r
-    }                                                           \\r
-}\r
-\r
-\r
-__inline NDIS_STATUS MP_GET_STATUS_FROM_FLAGS(PMP_PORT Port)\r
-{\r
-    NDIS_STATUS Status = NDIS_STATUS_FAILURE;\r
-\r
-    if(MP_TEST_FLAG(Port, fMP_PORT_RESET_IN_PROGRESS))\r
-    {\r
-        Status = NDIS_STATUS_RESET_IN_PROGRESS;      \r
-    }\r
-    else if(MP_TEST_FLAG(Port, fMP_PORT_HARDWARE_ERROR))\r
-    {\r
-        Status = NDIS_STATUS_DEVICE_FAILED;\r
-    }\r
-    else if(Port->priv.last_link_state == NdisMediaStateDisconnected)\r
-    {\r
-        Status = NDIS_STATUS_NO_CABLE;\r
-    }\r
-\r
-    return Status;\r
-}   \r
-\r
-//--------------------------------------\r
-// Miniport routines in MP_MAIN.C\r
-//--------------------------------------\r
-\r
-//NDIS_STATUS DriverEntry(\r
-//    IN  PDRIVER_OBJECT      DriverObject,\r
-//    IN  PUNICODE_STRING     RegistryPath);\r
-\r
-VOID MPAllocateComplete(\r
-    NDIS_HANDLE MiniportAdapterContext,\r
-    IN PVOID VirtualAddress,\r
-    IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress,\r
-    IN ULONG Length,\r
-    IN PVOID Context);\r
-\r
-BOOLEAN MPCheckForHang(\r
-    IN NDIS_HANDLE MiniportAdapterContext);\r
-\r
-VOID MPHalt(\r
-    IN  NDIS_HANDLE MiniportAdapterContext);\r
-\r
-NDIS_STATUS MPInitialize(\r
-    OUT PNDIS_STATUS OpenErrorStatus,\r
-    OUT PUINT SelectedMediumIndex,\r
-    IN PNDIS_MEDIUM MediumArray,\r
-    IN UINT MediumArraySize,\r
-    IN NDIS_HANDLE MiniportAdapterHandle,\r
-    IN NDIS_HANDLE WrapperConfigurationContext);\r
-\r
-NDIS_STATUS MPQueryInformation(\r
-    IN NDIS_HANDLE MiniportAdapterContext,\r
-    IN NDIS_OID Oid,\r
-    IN PVOID InformationBuffer,\r
-    IN ULONG InformationBufferLength,\r
-    OUT PULONG BytesWritten,\r
-    OUT PULONG BytesNeeded);\r
-\r
-NDIS_STATUS MPReset(\r
-    OUT PBOOLEAN AddressingReset,\r
-    IN  NDIS_HANDLE MiniportAdapterContext);\r
-\r
-VOID MPReturnPacket(\r
-    IN NDIS_HANDLE  MiniportAdapterContext,\r
-    IN PNDIS_PACKET Packet);\r
-\r
-VOID MPSendPackets(\r
-    IN  NDIS_HANDLE             MiniportAdapterContext,\r
-    IN  PPNDIS_PACKET           PacketArray,\r
-    IN  UINT                    NumberOfPackets);\r
-\r
-NDIS_STATUS MPSetInformation(\r
-    IN NDIS_HANDLE   MiniportAdapterContext,\r
-    IN NDIS_OID      Oid,\r
-    IN PVOID         InformationBuffer,\r
-    IN ULONG         InformationBufferLength,\r
-    OUT PULONG       BytesRead,\r
-    OUT PULONG       BytesNeeded);\r
-\r
-VOID MPShutdown(\r
-    IN  NDIS_HANDLE MiniportAdapterContext);\r
-\r
-VOID MPCancelSendPackets(\r
-    IN  NDIS_HANDLE    MiniportAdapterContext,\r
-    IN  PVOID          CancelId);\r
-\r
-VOID MPPnPEventNotify(\r
-    IN  NDIS_HANDLE                MiniportAdapterContext,\r
-    IN  NDIS_DEVICE_PNP_EVENT      PnPEvent,\r
-    IN  PVOID                      InformationBuffer,\r
-    IN  ULONG                      InformationBufferLength);\r
-\r
-extern "C" NDIS_STATUS\r
-MPSetPowerD0Private (\r
-    IN PMP_PORT Port\r
-    );\r
-\r
-extern "C" VOID\r
-MPSetPowerLowPrivate(\r
-    PMP_PORT Port \r
-    );\r
-\r
-extern "C" VOID \r
-MpExtractPMInfoFromPciSpace(\r
-    PMP_PORT Port,\r
-    PUCHAR   pPciConfig\r
-    );\r
-\r
-VOID\r
-HwSetWakeUpConfigure(\r
-    IN PMP_PORT Port, \r
-    IN PUCHAR   pPoMgmtConfigType, \r
-    IN UINT     WakeUpParameter\r
-    );\r
-\r
-BOOLEAN  \r
-MPIsPoMgmtSupported(\r
-   IN PMP_PORT Port\r
-   );\r
-\r
-extern "C" VOID \r
-NICIssueSelectiveReset(\r
-    PMP_PORT Port);\r
-\r
-extern "C" NDIS_STATUS\r
-MPCalculateE100PatternForFilter (\r
-    IN PUCHAR       pFrame,\r
-    IN ULONG        FrameLength,\r
-    IN PUCHAR       pMask,\r
-    IN ULONG        MaskLength,\r
-    OUT PULONG      pSignature\r
-    );\r
-\r
-VOID\r
-MPRemoveAllWakeUpPatterns(\r
-    PMP_PORT Port\r
-    );\r
-\r
-VOID\r
-MpSetPowerLowComplete(\r
-    IN PMP_PORT Port\r
-    );\r
-\r
-VOID\r
-OsSendDpc(\r
-    IN struct _KDPC  *Dpc,\r
-    IN PVOID  DeferredContext,\r
-    IN PVOID  SystemArgument1,\r
-    IN PVOID  SystemArgument2\r
-    );\r
-\r
-VOID\r
-OsRecvDpc(\r
-    IN struct _KDPC  *Dpc,\r
-    IN PVOID  DeferredContext,\r
-    IN PVOID  SystemArgument1,\r
-    IN PVOID  SystemArgument2\r
-    );\r
-\r
-\r
-VOID MPUnload(IN PDRIVER_OBJECT DriverObject);\r
-\r
-void \r
-SendComplete(\r
-    PMP_PORT Port,\r
-    PNDIS_PACKET Packet,\r
-    NDIS_STATUS status\r
-    );\r
-\r
-VOID MP_FREE_SEND_PACKET(\r
-    IN  PMP_PORT        Port,\r
-    IN  mtnic_tx_ring*     pRing,\r
-    IN  PNDIS_PACKET    Packet,\r
-    IN  NDIS_STATUS     SendStatus\r
-    );\r
-\r
-NDIS_STATUS \r
-SetPacketFilterInformation(\r
-    IN PMP_PORT pPort,\r
-    IN PVOID InformationBuffer,\r
-    IN ULONG InformationBufferLength,\r
-    OUT PULONG BytesNeeded    \r
-    );\r
-\r
-NDIS_STATUS\r
-SetMulticastInformation(\r
-    PMP_PORT Port,\r
-    PVOID p_info_buf,\r
-    ULONG const info_len,\r
-    PULONG p_bytes_needed\r
-    );\r
-    \r
-\r
-#endif  // _MP_H\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_WorkerThread.cpp b/hw/mlx4/kernel/eth/mp_WorkerThread.cpp
deleted file mode 100644 (file)
index 6f3ed0b..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2007 Mellanox Technologies. All rights reserved.\r
-\r
-Module Name:\r
-    mp_WorkerThread.cpp\r
-\r
-Abstract:\r
-    This module contains Implmentation of RSS functions and data structures\r
-    \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#include "mp_WorkerThread.tmh"\r
-#endif\r
-\r
-VOID RingThread(void *pContext)\r
-{\r
-    class WorkerThreadInfo *pWorkerThreadInfo = (WorkerThreadInfo*)pContext;\r
-    pWorkerThreadInfo->ThreadFunction();\r
-}\r
-\r
-NTSTATUS WorkerThreadInfo::StartThread(USHORT CpuNumber) \r
-{\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    OBJECT_ATTRIBUTES   attr;\r
-    HANDLE  ThreadHandle;\r
-\r
-    KeInitializeEvent(&m_ThreadWaitEvent, SynchronizationEvent, FALSE);\r
-    KeInitializeEvent(&m_ThreadWaitWhenPausedEvent, SynchronizationEvent, FALSE);\r
-    KeInitializeEvent(&m_ThreadIsPausedEvent, SynchronizationEvent, FALSE);\r
-\r
-    \r
-    InitializeObjectAttributes( &attr, NULL, OBJ_KERNEL_HANDLE, NULL, NULL );\r
-\r
-    m_CpuNumber = CpuNumber;\r
-   \r
-    Status = PsCreateSystemThread(\r
-                                &ThreadHandle, \r
-                                THREAD_ALL_ACCESS,\r
-                                &attr,\r
-                                NULL,\r
-                                NULL,\r
-                                ::RingThread,\r
-                                this\r
-                                );\r
-    if (!NT_SUCCESS(Status)) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("PsCreateSystemThread failed\n"));\r
-        goto Cleanup;\r
-    }\r
-    \r
-    // Convert the thread into a handle\r
-    Status = ObReferenceObjectByHandle(\r
-          ThreadHandle,\r
-          THREAD_ALL_ACCESS,\r
-          NULL,\r
-          KernelMode,\r
-          &m_ThreadObject,\r
-          NULL\r
-          );\r
-    \r
-    ASSERT(Status == STATUS_SUCCESS); // According to MSDN, must succeed if I set the params\r
-    \r
-    Status = ZwClose(ThreadHandle);\r
-    ASSERT(NT_SUCCESS(Status)); // Should always succeed\r
-Cleanup:\r
-    return Status;\r
-\r
-}\r
-\r
-\r
-VOID WorkerThreadInfo::StopThread() {\r
-    NTSTATUS Status;\r
-    m_ThreadExit = true;\r
-    KeSetEvent(&m_ThreadWaitEvent, IO_NO_INCREMENT, FALSE);\r
-    Status = KeWaitForSingleObject(\r
-            m_ThreadObject,\r
-            Executive,\r
-            KernelMode,\r
-            FALSE,\r
-            NULL\r
-            );\r
-    ASSERT(Status == STATUS_SUCCESS);\r
-}\r
-\r
-VOID WorkerThreadInfo::PauseThread() \r
-{\r
-    m_ThreadPause = true;\r
-\r
-    KeSetEvent(&m_ThreadWaitEvent, IO_NO_INCREMENT, FALSE);\r
-\r
-    NTSTATUS Status;\r
-    Status = KeWaitForSingleObject(\r
-            &m_ThreadIsPausedEvent,\r
-            Executive,\r
-            KernelMode,\r
-            FALSE,\r
-            NULL\r
-            );\r
-    ASSERT(Status == STATUS_SUCCESS);        \r
-}\r
-\r
-VOID WorkerThreadInfo::ResumeThread()\r
-{\r
-    int i;\r
-    ASSERT(m_ThreadPause == true);\r
-    m_ThreadPause = false;\r
-\r
-    KeSetEvent(&m_ThreadWaitWhenPausedEvent, IO_NO_INCREMENT, FALSE);\r
-}    \r
-\r
-NTSTATUS WorkerThreadInfo::AddRing(\r
-    IN PMP_PORT Port,\r
-    IN mtnic_rx_ring* pRing,\r
-    OUT KEVENT **ppStartWorkEvent, \r
-    OUT char **pWorkByte\r
-    )\r
-{\r
-\r
-    int i;\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    WorkerThreadRingData *pWorkerThreadRingData = NULL;\r
-    PauseThread();\r
-    for (i=0; i < MAX_CARDS * 2; i++) {\r
-        if (m_WorkerThreadRingData[i].m_pRing == NULL) {\r
-            // We have found our entry\r
-            pWorkerThreadRingData = &m_WorkerThreadRingData[i];\r
-            break;\r
-        }\r
-    }\r
-\r
-    if (pWorkerThreadRingData == NULL) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RSS, ("Too many rings? You must have a bug somewhere else\n"));\r
-        ASSERT(FALSE);\r
-        Status = STATUS_NO_MEMORY;\r
-        goto Cleanup;\r
-    }\r
-\r
-    pWorkerThreadRingData->m_pRing = pRing;\r
-    pWorkerThreadRingData->m_Port = Port;\r
-    pWorkerThreadRingData->m_FailToPoll = 0;\r
-    // Next time, start with a maximum\r
-    pWorkerThreadRingData->m_AveragePoll = pWorkerThreadRingData->m_MaxNumberOfPacketsToIndicateThread;\r
-    pWorkerThreadRingData->m_pRecvCq = &Port->priv.cq[pRing->cq];\r
-    pWorkerThreadRingData->m_pSendCq = &Port->priv.cq[Port->priv.tx_ring[0].cq];\r
-    pWorkerThreadRingData->m_ThreadPoll = Port->Config.ThreadPoll;\r
-    pWorkerThreadRingData->m_RecvCompletionMethod = Port->Config.RecvCompletionMethod;   \r
-    pWorkerThreadRingData->m_AverageFactor = Port->Config.AverageFactor;\r
-    pWorkerThreadRingData->m_AveragePollThreshold = Port->Config.AveragePollThreshold;\r
-    pWorkerThreadRingData->m_ThisPollThreshold = Port->Config.ThisPollThreshold;\r
-    pWorkerThreadRingData->m_MaxNumberOfPacketsToIndicateThread = Port->Config.MaxNumberOfPacketsToIndicateThread;\r
-\r
-    if (i == m_MaxNumberOfRings) {\r
-        // We have just added a new record to our table.\r
-        m_MaxNumberOfRings = i+1;\r
-    }\r
-\r
-    *ppStartWorkEvent = &m_ThreadWaitEvent;\r
-    *pWorkByte = &m_StartPoll[i];\r
-        \r
-Cleanup:\r
-    ResumeThread();\r
-    return Status;\r
-\r
-}\r
-\r
-\r
-VOID WorkerThreadInfo::RemoveRing(IN mtnic_rx_ring* pRing)\r
-{\r
-    int i;\r
-    WorkerThreadRingData *pWorkerThreadRingData = NULL;\r
-    PauseThread();\r
-    for (i=0; i < MAX_CARDS * 2; i++) {\r
-        if (m_WorkerThreadRingData[i].m_pRing == pRing) {\r
-            // We have found our entry\r
-            pWorkerThreadRingData = &m_WorkerThreadRingData[i];\r
-\r
-            pWorkerThreadRingData->ClearAll();\r
-            m_StartPoll[i] = false;\r
-            ResumeThread();                    \r
-            return;\r
-        }\r
-    }\r
-\r
-    // The ring that we had to delete is not found\r
-    ASSERT(FALSE);\r
-    ResumeThread();\r
-\r
-}\r
-\r
-VOID WorkerThreadInfo::ThreadFunction() {\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    int i;\r
-    WorkerThreadRingData *pWorkerThreadRingData = NULL;\r
-\r
-    KeSetSystemAffinityThread(1 << m_CpuNumber);\r
-\r
-    ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH, ("RingThread called \n"));\r
-\r
-    for(; ;) {\r
-        Status = KeWaitForSingleObject(\r
-            &m_ThreadWaitEvent,\r
-            Executive,\r
-            KernelMode,\r
-            FALSE,\r
-            NULL\r
-            );\r
-        ASSERT(Status == STATUS_SUCCESS);\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Thread wake up\n"));\r
-\r
-        if (m_ThreadExit) {\r
-            // the driver going down\r
-            break;\r
-        }\r
-        if (m_ThreadPause) {\r
-            KeSetEvent(&m_ThreadIsPausedEvent, IO_NO_INCREMENT, TRUE);\r
-            Status = KeWaitForSingleObject(\r
-                    &m_ThreadWaitWhenPausedEvent,\r
-                    Executive,\r
-                    KernelMode,\r
-                    FALSE,\r
-                    NULL\r
-                    );\r
-            ASSERT(Status == STATUS_SUCCESS);\r
-\r
-        }\r
-        // Here is where we actually start polling\r
-        bool ContineToPoll = true;\r
-        g_pWorkerThreads->StartPolling();\r
-        while(ContineToPoll && m_ThreadPause == false && m_ThreadExit == false) {\r
-            ContineToPoll = false;                \r
-            for (i=0; i < m_MaxNumberOfRings; i++) {\r
-                if(m_StartPoll[i]) { \r
-                    pWorkerThreadRingData = &m_WorkerThreadRingData[i];\r
-                    u32 last_sav = pWorkerThreadRingData->m_pRecvCq->last;\r
-                    mtnic_process_rx_cq_internal(pWorkerThreadRingData->m_Port, pWorkerThreadRingData->m_pRecvCq, pWorkerThreadRingData->m_MaxNumberOfPacketsToIndicateThread);\r
-                    u32 ThisPoll = pWorkerThreadRingData->m_pRecvCq->last - last_sav;\r
-#ifdef MTNIC_PERF_STAT\r
-                    pWorkerThreadRingData->m_Port->perf_counters.rxIndicatedPacketsPoll += ThisPoll;\r
-#endif\r
-                    if (pWorkerThreadRingData->m_Port->Config.fUseSendInt == FALSE) {\r
-                        mtnic_process_tx_cq(pWorkerThreadRingData->m_Port, pWorkerThreadRingData->m_pSendCq);\r
-                    }    \r
-\r
-                    if (pWorkerThreadRingData->m_RecvCompletionMethod == RECIEVE_MODE_POOL) {\r
-\r
-                        if (ThisPoll != 0 ) {\r
-                            pWorkerThreadRingData->m_FailToPoll = 0;\r
-                            g_pWorkerThreads->ContinuePolling();\r
-                            ContineToPoll = true;\r
-                        } \r
-                        else \r
-                        {\r
-                            pWorkerThreadRingData->m_FailToPoll++;\r
-                            if (pWorkerThreadRingData->m_FailToPoll > pWorkerThreadRingData->m_ThreadPoll) {\r
-                                m_StartPoll[i] = false;\r
-                                pWorkerThreadRingData->m_FailToPoll = 0;\r
-                                mtnic_arm_cq(pWorkerThreadRingData->m_Port, pWorkerThreadRingData->m_pRecvCq);\r
-                                KeMemoryBarrier();\r
-\r
-                            } else {\r
-                                ContineToPoll = true;\r
-                            }\r
-                        }\r
-                    }else {\r
-                        ASSERT(pWorkerThreadRingData->m_RecvCompletionMethod == RECIEVE_MODE_ADAPTIVE);\r
-                        \r
-                        pWorkerThreadRingData->m_AveragePoll = \r
-                            (pWorkerThreadRingData->m_AveragePoll * (256 - pWorkerThreadRingData->m_AverageFactor) +\r
-                            pWorkerThreadRingData->m_AverageFactor * ThisPoll + 128) >> 8;\r
-\r
-                        if (ThisPoll > pWorkerThreadRingData->m_ThisPollThreshold &&\r
-                             pWorkerThreadRingData->m_AveragePoll > pWorkerThreadRingData->m_AveragePollThreshold ) {\r
-                            pWorkerThreadRingData->m_FailToPoll = 0;\r
-                            g_pWorkerThreads->ContinuePolling();\r
-                            ContineToPoll = true;\r
-                        } \r
-                        else \r
-                        {\r
-                            m_StartPoll[i] = false;\r
-                            pWorkerThreadRingData->m_FailToPoll = 0;\r
-                            // Next time, start with a maximum\r
-                            pWorkerThreadRingData->m_AveragePoll = pWorkerThreadRingData->m_MaxNumberOfPacketsToIndicateThread;                             \r
-                            mtnic_arm_cq(pWorkerThreadRingData->m_Port, pWorkerThreadRingData->m_pRecvCq);\r
-                            KeMemoryBarrier();\r
-                        }\r
-\r
-                    }\r
-               }\r
-            }\r
-\r
-            g_pWorkerThreads->ContinuePolling();\r
-\r
-        }        \r
-        g_pWorkerThreads->StopPolling();\r
-    \r
-    }\r
-\r
-    PsTerminateSystemThread(STATUS_SUCCESS);\r
-\r
-}\r
-\r
-\r
-\r
-NTSTATUS WorkerThreads::Init() \r
-{\r
-\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    USHORT i, Started = 0;    \r
-    \r
-    m_NumberOfCpus = NdisSystemProcessorCount();\r
-\r
-    m_WorkerThreadsInfo = new WorkerThreadInfo[m_NumberOfCpus];\r
-    if (m_WorkerThreadsInfo == NULL) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RSS, ("new failed \n"));\r
-        Status = STATUS_NO_MEMORY;\r
-        goto Cleanup;\r
-    }\r
-\r
-    // Start all threads\r
-    for (i=0; i < m_NumberOfCpus; i++) {\r
-        Status = m_WorkerThreadsInfo[i].StartThread(i);\r
-        if (! NT_SUCCESS(Status)) {            \r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RSS, ("StartThread failed, Error=0x%x\n", Status));\r
-            Started = i;\r
-            goto Cleanup; \r
-        }\r
-    }\r
-\r
-    m_lThreadNum = 0;\r
-    KeInitializeSemaphore(&m_sem, g_MaximumWorkingThreads, g_MaximumWorkingThreads);\r
-    KeInitializeEvent(&m_Lock, SynchronizationEvent, TRUE);\r
-    \r
-Cleanup:\r
-    if (!NT_SUCCESS(Status)) {\r
-        for (i=0; i < Started; i++) {\r
-            m_WorkerThreadsInfo[i].StopThread();\r
-        }\r
-        if(m_WorkerThreadsInfo) {\r
-            delete []m_WorkerThreadsInfo;\r
-            m_WorkerThreadsInfo = NULL;\r
-        }\r
-    }\r
-    return Status;\r
-\r
-}\r
-\r
-VOID WorkerThreads::ShutDown() \r
-{\r
-    int i;\r
-    for (i=0; i < m_NumberOfCpus; i++) {\r
-        m_WorkerThreadsInfo[i].StopThread();\r
-    }\r
-    delete []m_WorkerThreadsInfo;\r
-    m_WorkerThreadsInfo = NULL;\r
-}\r
-\r
-NTSTATUS WorkerThreads::AddRing(\r
-    IN USHORT CpuNumber, \r
-    IN PMP_PORT Port,\r
-    IN mtnic_rx_ring* pRing,\r
-    OUT KEVENT **ppStartWorkEvent, \r
-    OUT char **pWorkByte\r
-    ) {\r
-\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);\r
-\r
-    Lock();\r
-\r
-    ASSERT(CpuNumber < m_NumberOfCpus);\r
-    WorkerThreadInfo *pThreadInfo = &m_WorkerThreadsInfo[CpuNumber];\r
-\r
-    Status = pThreadInfo->AddRing(Port, pRing, ppStartWorkEvent, pWorkByte);\r
-    if (! NT_SUCCESS(Status)) {            \r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RSS, ("StartThread failed, Error=0x%x\n", Status));\r
-    }\r
-    Unlock();\r
-    return Status;\r
-\r
-}\r
-\r
-VOID WorkerThreads::RemoveRing(IN USHORT CpuNumber, IN mtnic_rx_ring* pRing)\r
-{\r
-    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);\r
-    ASSERT(CpuNumber < m_NumberOfCpus);\r
-    WorkerThreadInfo *pThreadInfo = &m_WorkerThreadsInfo[CpuNumber];\r
-\r
-    Lock();\r
-    pThreadInfo->RemoveRing(pRing);\r
-    Unlock();\r
-}\r
-\r
-\r
-WorkerThreads *g_pWorkerThreads = NULL;\r
diff --git a/hw/mlx4/kernel/eth/mp_WorkerThread.h b/hw/mlx4/kernel/eth/mp_WorkerThread.h
deleted file mode 100644 (file)
index 8eb135d..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2007 Mellanox Technologies. All rights reserved.\r
-\r
-Module Name:\r
-    mp_WorkerThread.h\r
-\r
-Abstract:\r
-    This module contains decleration of RSS functions and data structures\r
-    \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-\r
-// values for the different RSS modes\r
-\r
-const int MAX_CARDS = 32;\r
-\r
-VOID RingThread(void *pContext);\r
-\r
-class WorkerThreadRingData {\r
-public:\r
-    \r
-    mtnic_rx_ring* m_pRing;\r
-    PMP_PORT    m_Port;    \r
-    mtnic_cq*   m_pRecvCq;\r
-    mtnic_cq*   m_pSendCq;\r
-    \r
-    int         m_FailToPoll;            // The number of times we have tried to poll and failed\r
-    u32         m_AveragePoll;           // The moving numbers of poll that we are doing\r
-\r
-/// This are constants that are propogated to here    \r
-\r
-    int         m_RecvCompletionMethod;  // Are we configured to use adaptive of pool\r
-    u32         m_AverageFactor;         // The weight to give to the last poll\r
-    int         m_ThreadPoll;            // The number of times to poll when there is no data\r
-    u32         m_AveragePollThreshold;  // If the average number of poll is bigger than this number\r
-                                         // We will continue to poll\r
-    u32         m_ThisPollThreshold;     // If the last number of poll is bigger than this number\r
-                                         // We will continue to poll\r
-    u32         m_MaxNumberOfPacketsToIndicateThread; // This is the maximum number of packets that \r
-                                         // will be indicated by the thread in one time\r
-\r
-\r
-    VOID ClearAll() {\r
-        m_pRing = NULL;\r
-        m_Port = NULL;\r
-        m_pRecvCq = NULL;\r
-        m_pSendCq = NULL;\r
-        m_FailToPoll = 0;\r
-    }\r
-    \r
-    WorkerThreadRingData() {\r
-        ClearAll();\r
-    }\r
-};\r
-\r
-class WorkerThreadInfo {\r
-public:\r
-\r
-    NTSTATUS StartThread(USHORT CpuNumber); \r
-\r
-    VOID StopThread();\r
-\r
-    VOID PauseThread() ;\r
-\r
-    VOID ResumeThread();\r
-\r
-    VOID ThreadFunction();\r
-    \r
-    NTSTATUS AddRing(\r
-        IN PMP_PORT Port,\r
-        IN mtnic_rx_ring* pRing,\r
-        OUT KEVENT **ppStartWorkEvent, \r
-        OUT char **pWorkByte\r
-        );\r
-\r
-    VOID RemoveRing(IN mtnic_rx_ring* pRing);\r
-\r
-    WorkerThreadInfo() {\r
-        memset(m_StartPoll, 0, sizeof m_StartPoll);\r
-        C_ASSERT(sizeof m_StartPoll == 2 * MAX_CARDS);\r
-        m_CpuNumber = 0;\r
-        m_MaxNumberOfRings = 0;\r
-        m_ThreadPause = false;\r
-        m_ThreadExit = false;\r
-        m_ThreadObject = NULL;\r
-    }\r
-\r
-private:    \r
-    char m_StartPoll[MAX_CARDS * 2];  // A boolean to indicate that we shuld poll on the ring\r
-    WorkerThreadRingData  m_WorkerThreadRingData[MAX_CARDS * 2];    \r
-    USHORT m_CpuNumber;\r
-    u8 m_MaxNumberOfRings;\r
-\r
-    // Needed in order to pause the thread\r
-    KEVENT                  m_ThreadWaitWhenPausedEvent;\r
-    KEVENT                  m_ThreadIsPausedEvent;\r
-    bool                    m_ThreadPause;\r
-\r
-    // Needed in order to stop the thread\r
-\r
-    KEVENT                  m_ThreadWaitEvent;\r
-    bool                    m_ThreadExit;\r
-    PVOID                   m_ThreadObject;\r
-\r
-    \r
-};\r
-\r
-extern LONG g_MaximumWorkingThreads;\r
-\r
-class WorkerThreads {\r
-public:\r
-    NTSTATUS Init();\r
-    VOID ShutDown();\r
-\r
-    NTSTATUS AddRing(\r
-        IN USHORT CpuNumber, \r
-        IN PMP_PORT Port,\r
-        IN mtnic_rx_ring* pRing,\r
-        OUT KEVENT **ppStartWorkEvent, \r
-        OUT char **pWorkByte\r
-        );\r
-\r
-    VOID RemoveRing(IN USHORT CpuNumber, IN mtnic_rx_ring* pRing);\r
-\r
-    inline void StartPolling()\r
-    {\r
-        InterlockedIncrement(&m_lThreadNum);\r
-        NTSTATUS Status = STATUS_SUCCESS;\r
-        \r
-        Status = KeWaitForSingleObject(\r
-                    &m_sem,\r
-                    Executive,\r
-                    KernelMode,\r
-                    FALSE,\r
-                    NULL\r
-                    );\r
-        ASSERT(Status == STATUS_SUCCESS);\r
-    }\r
-\r
-    inline void StopPolling()\r
-    {\r
-        InterlockedDecrement(&m_lThreadNum);\r
-        KeReleaseSemaphore(&m_sem, 0, 1, FALSE);\r
-    }\r
-\r
-    inline void ContinuePolling()\r
-    {\r
-        if (m_lThreadNum <= g_MaximumWorkingThreads )\r
-        {\r
-            return;\r
-        }\r
-        StopPolling();\r
-        StartPolling();\r
-    }\r
-\r
-private:\r
-\r
-    int m_NumberOfCpus;\r
-\r
-    WorkerThreadInfo *m_WorkerThreadsInfo;\r
-\r
-    KEVENT           m_Lock;\r
-    KSEMAPHORE       m_sem;\r
-    LONG             m_lThreadNum;\r
-\r
-    VOID Lock() {\r
-        NTSTATUS Status = STATUS_SUCCESS;\r
-        Status = KeWaitForSingleObject(\r
-                &m_Lock,\r
-                Executive,\r
-                KernelMode,\r
-                FALSE,\r
-                NULL\r
-                );\r
-        ASSERT(Status == STATUS_SUCCESS);\r
-\r
-    }\r
-\r
-    VOID Unlock() {\r
-        KeSetEvent(&m_Lock, IO_NO_INCREMENT, FALSE);\r
-    }\r
-    \r
-};\r
-\r
-\r
-extern WorkerThreads *g_pWorkerThreads;\r
diff --git a/hw/mlx4/kernel/eth/mp_cmn.h b/hw/mlx4/kernel/eth/mp_cmn.h
deleted file mode 100644 (file)
index da78728..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_cmn.h\r
-\r
-Abstract:\r
-    Common definitions for the miniport and kd extension dll\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#ifndef _MP_CMN_H\r
-#define _MP_CMN_H\r
-\r
-               \r
-// MP_RFD flags                           \r
-#define fMP_RFD_RECV_PEND                      0x00000001\r
-#define fMP_RFD_ALLOC_PEND                     0x00000002\r
-#define fMP_RFD_RECV_READY                     0x00000004\r
-#define fMP_RFD_RESOURCES                      0x00000008\r
-#define fMP_RFD_LRO                            0x00000010\r
-\r
-// MP_ADAPTER flags               \r
-#define fMP_PORT_SCATTER_GATHER             0x00000001\r
-#define fMP_PORT_RECV_LOOKASIDE             0x00000002\r
-#define fMP_PORT_SECONDARY                  0x00000008\r
-\r
-#define fMP_PORT_NON_RECOVER_ERROR          0x00800000\r
-\r
-#define fMP_PORT_RESET_IN_PROGRESS          0x01000000\r
-#define fMP_PORT_NO_CABLE                   0x02000000 \r
-#define fMP_PORT_HARDWARE_ERROR             0x04000000\r
-#define fMP_PORT_REMOVE_IN_PROGRESS         0x08000000\r
-#define fMP_PORT_HALT_IN_PROGRESS           0x10000000\r
-                                \r
-#define fMP_PORT_FAIL_SEND_MASK             0x1ff00000                \r
-#define fMP_PORT_NOT_READY_MASK             0x3ff00000    \r
-\r
-#define fMP_PORT_MEMORY_INITIALIZED         0x00000100\r
-#define fMP_PORT_NETDEV_INITIALIZED         0x00000200\r
-#define fMP_PORT_RSS_INITIALIZED            0x00000400\r
-#define fMP_PORT_PORT_INITIALIZED           0x00000800\r
-#define fMP_PORT_RECV_INITIALIZED           0x00001000\r
-#define fMP_PORT_INTR_INITIALIZED           0x00002000\r
-#define fMP_PORT_SEND_POLL_INITIALIZED      0x00002000\r
-\r
-\r
-#endif  // _MP_CMN_H\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_dbg.cpp b/hw/mlx4/kernel/eth/mp_dbg.cpp
deleted file mode 100644 (file)
index 8c5dae3..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_dbg.c\r
-\r
-Abstract:\r
-    This module contains all debug-related code.\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#include "Mp_dbg.tmh"\r
-#endif\r
-\r
-#if DBG\r
-\r
-/**\r
-Constants\r
-**/\r
-\r
-#define _FILENUMBER     'GBED'\r
-\r
-// Bytes to appear on each line of dump output.\r
-//\r
-#define DUMP_BytesPerLine 16\r
-\r
-ULONG               MPDebugLevel = MP_WARN;\r
-ULONG               MPAllocCount = 0;       // the number of outstanding allocs\r
-NDIS_SPIN_LOCK      MPMemoryLock;           // spinlock for the debug mem list\r
-LIST_ENTRY          MPMemoryList;\r
-BOOLEAN             MPInitDone = FALSE;     // debug mem list init flag \r
-\r
-NDIS_STATUS MPAuditAllocMemTag(\r
-    PVOID *  pPointer,\r
-    UINT     Size,\r
-    ULONG    FileNumber,\r
-    ULONG    LineNumber\r
-    )\r
-{\r
-    NDIS_STATUS     Status;\r
-    PMP_ALLOCATION  pAllocInfo;\r
-\r
-    if (!MPInitDone)\r
-    {\r
-        NdisAllocateSpinLock(&MPMemoryLock);\r
-        InitializeListHead(&MPMemoryList);\r
-        MPInitDone = TRUE;\r
-    }\r
-\r
-    Status = NdisAllocateMemoryWithTag(\r
-                 (PVOID *)(&pAllocInfo), \r
-                 (UINT)(Size + sizeof(MP_ALLOCATION)), \r
-                 NIC_TAG);\r
-\r
-    if (pAllocInfo == (PMP_ALLOCATION)NULL)\r
-    {\r
-        *pPointer = NULL;\r
-\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH,\r
-            ("MPAuditAllocMemCore: file %d, line %d, Size %d failed!\n",\r
-            FileNumber, LineNumber, Size));\r
-    }\r
-    else\r
-    {\r
-        *pPointer = (PVOID)&(pAllocInfo->UserData);\r
-        MP_MEMSET(*pPointer, Size, 0xc);\r
-\r
-        pAllocInfo->Signature = 'DOOG';\r
-        pAllocInfo->FileNumber = FileNumber;\r
-        pAllocInfo->LineNumber = LineNumber;\r
-        pAllocInfo->Size = Size;\r
-        pAllocInfo->Location = pPointer;\r
-        pAllocInfo->Flags = 0;\r
-\r
-        NdisAcquireSpinLock(&MPMemoryLock);\r
-        InsertTailList(&MPMemoryList, &pAllocInfo->List);\r
-        MPAllocCount++;\r
-        NdisReleaseSpinLock(&MPMemoryLock);\r
-    }\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH,\r
-        ("MPAuditAllocMemTag: file %c%c%c%c, line %d, %d bytes, [0x%p] <- 0x%p\n",\r
-        (CHAR)(FileNumber & 0xff),\r
-        (CHAR)((FileNumber >> 8) & 0xff),\r
-        (CHAR)((FileNumber >> 16) & 0xff),\r
-        (CHAR)((FileNumber >> 24) & 0xff),\r
-        LineNumber, Size, pPointer, *pPointer));\r
-\r
-    return(Status);\r
-}\r
-\r
-VOID MPAuditFreeMem(\r
-    IN PVOID  Pointer, \r
-    IN UINT   Size,\r
-    IN UINT   Flags\r
-    )\r
-{\r
-    PMP_ALLOCATION  pAllocInfo;\r
-\r
-    pAllocInfo = CONTAINING_RECORD(Pointer, MP_ALLOCATION, UserData);\r
-\r
-    ASSERT(pAllocInfo->Signature == (ULONG)'DOOG');\r
-    ASSERT(pAllocInfo->Size == Size);\r
-    ASSERT(pAllocInfo->Flags == Flags);\r
-\r
-    NdisAcquireSpinLock(&MPMemoryLock);\r
-    pAllocInfo->Signature = (ULONG)'DEAD';\r
-    RemoveEntryList(&pAllocInfo->List);\r
-    MPAllocCount--;\r
-    NdisReleaseSpinLock(&MPMemoryLock);\r
-\r
-    NdisFreeMemory(pAllocInfo, Size + sizeof(MP_ALLOCATION), Flags);\r
-}\r
-\r
-\r
-// Hex dump 'cb' bytes starting at 'p' grouping 'ulGroup' bytes together.\r
-// For example, with 'ulGroup' of 1, 2, and 4:\r
-//\r
-// 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|\r
-// 0000 0000 0000 0000 0000 0000 0000 0000 |................|\r
-// 00000000 00000000 00000000 00000000 |................|\r
-//\r
-// If 'fAddress' is true, the memory address dumped is prepended to each\r
-// line.\r
-//\r
-VOID\r
-Dump(\r
-    __in_bcount(cb) IN CHAR*   p,\r
-    IN ULONG   cb,\r
-    IN BOOLEAN fAddress,\r
-    IN ULONG   ulGroup \r
-    )\r
-{\r
-    INT cbLine;\r
-\r
-    while (cb)\r
-    {\r
-\r
-        cbLine = (cb < DUMP_BytesPerLine) ? cb : DUMP_BytesPerLine;\r
-#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "p is bounded by cb bytes");        \r
-        DumpLine( p, cbLine, fAddress, ulGroup );\r
-        cb -= cbLine;\r
-        p += cbLine;\r
-    }\r
-}\r
-\r
-\r
-VOID\r
-DumpLine(\r
-    __in_bcount(cb) IN CHAR*   p,\r
-    IN ULONG   cb,\r
-    IN BOOLEAN fAddress,\r
-    IN ULONG   ulGroup \r
-    )\r
-{\r
-\r
-    CHAR* pszDigits = "0123456789ABCDEF";\r
-    CHAR szHex[ ((2 + 1) * DUMP_BytesPerLine) + 1 ];\r
-    CHAR* pszHex = szHex;\r
-    CHAR szAscii[ DUMP_BytesPerLine + 1 ];\r
-    CHAR* pszAscii = szAscii;\r
-    ULONG ulGrouped = 0;\r
-\r
-    if (fAddress) \r
-    {\r
-        DbgPrint( "E100: %p: ", p );\r
-    }\r
-    else \r
-    {\r
-        DbgPrint( "E100: " );\r
-    }\r
-\r
-    while (cb)\r
-    {\r
-#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "pszHex accessed is always within bounds");    \r
-        *pszHex++ = pszDigits[ ((UCHAR )*p) / 16 ];\r
-        *pszHex++ = pszDigits[ ((UCHAR )*p) % 16 ];\r
-\r
-        if (++ulGrouped >= ulGroup)\r
-        {\r
-            *pszHex++ = ' ';\r
-            ulGrouped = 0;\r
-        }\r
-\r
-#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "pszAscii is bounded by cb bytes");\r
-        *pszAscii++ = (*p >= 32 && *p < 128) ? *p : '.';\r
-\r
-        ++p;\r
-        --cb;\r
-    }\r
-\r
-    *pszHex = '\0';\r
-    *pszAscii = '\0';\r
-\r
-    DbgPrint(\r
-        "%-*s|%-*s|\n",\r
-        (2 * DUMP_BytesPerLine) + (DUMP_BytesPerLine / ulGroup), szHex,\r
-        DUMP_BytesPerLine, szAscii );\r
-}\r
-\r
-\r
-\r
-#endif // DBG\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_dbg.h b/hw/mlx4/kernel/eth/mp_dbg.h
deleted file mode 100644 (file)
index ad957b8..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_dbg.h\r
-\r
-Abstract:\r
-    Debug definitions and macros\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#ifndef _MP_DBG_H\r
-#define _MP_DBG_H\r
-\r
-//\r
-// Message verbosity: lower values indicate higher urgency\r
-//\r
-#define MP_OFF          0\r
-#define MP_ERROR        1\r
-#define MP_WARN         2\r
-#define MP_TRACE        3\r
-#define MP_INFO         4\r
-#define MP_LOUD         5\r
-\r
-// Define a macro so DbgPrint can work on win9x, 32-bit/64-bit NT's\r
-#ifdef _WIN64\r
-#define PTR_FORMAT      "%p"\r
-#else\r
-#define PTR_FORMAT      "%x"\r
-#endif\r
-                            \r
-#if DBG\r
-\r
-extern ULONG            MPDebugLevel;\r
-extern BOOLEAN          MPInitDone;\r
-extern NDIS_SPIN_LOCK   MPMemoryLock;\r
-\r
-#define DBGPRINT(Level, Fmt) \\r
-{ \\r
-    if (Level <= MPDebugLevel) \\r
-    { \\r
-        DbgPrint NIC_DBG_STRING; \\r
-        DbgPrint Fmt; \\r
-    } \\r
-}\r
-\r
-#undef ASSERT\r
-#define ASSERT(x) if(!(x)) { \\r
-    ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Assertion failed: %s:%d %s\n", __FILE__, __LINE__, #x)); \\r
-    DbgBreakPoint(); }\r
-\r
-//\r
-// The MP_ALLOCATION structure stores all info about MPAuditAllocMem\r
-//\r
-typedef struct _MP_ALLOCATION\r
-{\r
-    LIST_ENTRY              List;\r
-    ULONG                   Signature;\r
-    ULONG                   FileNumber;\r
-    ULONG                   LineNumber;\r
-    ULONG                   Size;\r
-    PVOID                   *Location;   // where the returned pointer was put\r
-    UINT                    Flags;\r
-    union {\r
-        ULONGLONG           Alignment;        \r
-        UCHAR               UserData;\r
-    };\r
-} MP_ALLOCATION, *PMP_ALLOCATION;\r
-\r
-NDIS_STATUS MPAuditAllocMemTag(\r
-    PVOID       *pPointer,\r
-    UINT        Size,\r
-    ULONG       FileNumber,\r
-    ULONG       LineNumber);\r
-\r
-VOID MPAuditFreeMem(\r
-    PVOID       Pointer,\r
-    UINT        Size,\r
-    UINT        Flags);\r
-\r
-VOID mpDbgPrintUnicodeString(\r
-    IN  PUNICODE_STRING UnicodeString);\r
-\r
-\r
-VOID\r
-Dump(\r
-    __in_bcount(cb) CHAR* p,\r
-    ULONG cb,\r
-    BOOLEAN fAddress,\r
-    ULONG ulGroup );\r
-\r
-\r
-\r
-\r
-#else   // !DBG\r
-\r
-#define DBGPRINT(Level, Fmt)\r
-#define Dump(p,cb,fAddress,ulGroup)\r
-\r
-#undef ASSERT\r
-#define ASSERT(x) \r
-\r
-#endif  // DBG\r
-\r
-VOID\r
-DumpLine(\r
-    __in_bcount(cb) CHAR* p,\r
-    ULONG cb,\r
-    BOOLEAN  fAddress,\r
-    ULONG ulGroup );\r
-\r
-\r
-#endif  // _MP_DBG_H\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_def.h b/hw/mlx4/kernel/eth/mp_def.h
deleted file mode 100644 (file)
index e29ebc5..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_def.h\r
-\r
-Abstract:\r
-    NIC specific definitions\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#ifndef _MP_DEF_H\r
-#define _MP_DEF_H\r
-\r
-// memory tag for this driver   \r
-#define NIC_TAG                         ((ULONG)'001E')\r
-#define NIC_DBG_STRING                  ("*MTNIC** %s: ", __FUNCTION__) \r
-\r
-// packet and header sizes\r
-#define NIC_MIN_PACKET_SIZE             16\r
-#define NIC_HEADER_SIZE                 14\r
-\r
-//-------------------------------------------------------------------------\r
-// Receive Frame Descriptor (RFD)\r
-//-------------------------------------------------------------------------\r
-\r
-// multicast list size                          \r
-#define NIC_MAX_MCAST_LIST              32\r
-\r
-// update the driver version number every time you release a new driver\r
-// The high word is the major version. The low word is the minor version. \r
-#define NIC_VENDOR_DRIVER_VERSION       ((VER_FILEMAJORVERSION << 16) | VER_FILEMINORVERSION)\r
-\r
-// NDIS version in use by the NIC driver. \r
-// The high byte is the major version. The low byte is the minor version. \r
-#define NIC_DRIVER_VERSION              0x0502\r
-\r
-// media type, we use ethernet, change if necessary\r
-#define NIC_MEDIA_TYPE                  NdisMedium802_3\r
-\r
-// interface type, we use PCI\r
-#define NIC_INTERFACE_TYPE              NdisInterfacePci\r
-#define NIC_INTERRUPT_MODE              NdisInterruptLevelSensitive \r
-\r
-// NIC PCI Device and vendor IDs \r
-#define NIC_PCI_DEVICE_ID               0x6368\r
-#define NIC_PCI_VENDOR_ID               0x15B3\r
-\r
-// buffer size passed in NdisMQueryAdapterResources                            \r
-// We should only need three adapter resources (IO, interrupt and memory),\r
-// Some devices get extra resources, so have room for 10 resources \r
-#define NIC_RESOURCE_BUF_SIZE           (sizeof(NDIS_RESOURCE_LIST) + \\r
-                                        (10*sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)))\r
-\r
-// IO space length\r
-#define NIC_MAP_IOSPACE_LENGTH          sizeof(CSR_STRUC)\r
-\r
-// PCS config space including the Device Specific part of it/\r
-#define NIC_PCI_E100_HDR_LENGTH         0xe2\r
-\r
-// change to your company name instead of using Microsoft\r
-#define NIC_VENDOR_DESC                 "Mellanox"\r
-\r
-// number of TCBs per processor - min, default and max\r
-#define NIC_MIN_TCBS                    1\r
-#define NIC_DEF_TCBS                    32\r
-#define NIC_MAX_TCBS                    64\r
-\r
-// max number of physical fragments supported per TCB\r
-\r
-\r
-//??????????????? What is this constant ????????????\r
-#define NIC_MAX_PHYS_BUF_COUNT          256     \r
-\r
-// number of RFDs - min, default and max\r
-#define NIC_MIN_RFDS                    128\r
-#define NIC_DEF_RFDS                    100\r
-#define NIC_DEF_MAX_RFDS                600     // good on sw265 = 400\r
-\r
-#define NIC_MAX_CALL_TO_NDIS_INDICATE   2\r
-#define NIC_MAX_RFDS                    128 // the total number that will be used\r
-\r
-// This is the maximum number of RFDs that we will use\r
-#define NIC_MAX_GROW_RFDS               128 \r
-\r
-// How many intervals before the RFD list is shrinked?\r
-#define NIC_RFD_SHRINK_THRESHOLD        10\r
-\r
-// max number of send packets the MiniportSendPackets function can accept                            \r
-#define NIC_MAX_SEND_PACKETS            10\r
-\r
-// supported filters\r
-#define NIC_SUPPORTED_FILTERS (     \\r
-    NDIS_PACKET_TYPE_DIRECTED       | \\r
-    NDIS_PACKET_TYPE_MULTICAST      | \\r
-    NDIS_PACKET_TYPE_BROADCAST      | \\r
-    NDIS_PACKET_TYPE_PROMISCUOUS    | \\r
-    NDIS_PACKET_TYPE_ALL_MULTICAST)\r
-\r
-// Threshold for a remove \r
-#define NIC_HARDWARE_ERROR_THRESHOLD    5\r
-\r
-// The CheckForHang intervals before we decide the send is stuck\r
-#define NIC_SEND_HANG_THRESHOLD         5        \r
-\r
-// NDIS_ERROR_CODE_ADAPTER_NOT_FOUND                                                     \r
-#define ERRLOG_READ_PCI_SLOT_FAILED     0x00000101L\r
-#define ERRLOG_WRITE_PCI_SLOT_FAILED    0x00000102L\r
-#define ERRLOG_VENDOR_DEVICE_NOMATCH    0x00000103L\r
-\r
-// NDIS_ERROR_CODE_ADAPTER_DISABLED\r
-#define ERRLOG_BUS_MASTER_DISABLED      0x00000201L\r
-\r
-// NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION\r
-#define ERRLOG_INVALID_SPEED_DUPLEX     0x00000301L\r
-#define ERRLOG_SET_SECONDARY_FAILED     0x00000302L\r
-\r
-// NDIS_ERROR_CODE_OUT_OF_RESOURCES\r
-#define ERRLOG_OUT_OF_MEMORY            0x00000401L\r
-#define ERRLOG_OUT_OF_SHARED_MEMORY     0x00000402L\r
-#define ERRLOG_OUT_OF_BUFFER_POOL       0x00000404L\r
-#define ERRLOG_OUT_OF_NDIS_BUFFER       0x00000405L\r
-#define ERRLOG_OUT_OF_PACKET_POOL       0x00000406L\r
-#define ERRLOG_OUT_OF_NDIS_PACKET       0x00000407L\r
-#define ERRLOG_OUT_OF_LOOKASIDE_MEMORY  0x00000408L\r
-#define ERRLOG_OUT_OF_SG_RESOURCES      0x00000409L\r
-\r
-// NDIS_ERROR_CODE_HARDWARE_FAILURE\r
-#define ERRLOG_SELFTEST_FAILED          0x00000501L\r
-#define ERRLOG_INITIALIZE_ADAPTER       0x00000502L\r
-#define ERRLOG_REMOVE_MINIPORT          0x00000503L\r
-\r
-// NDIS_ERROR_CODE_RESOURCE_CONFLICT\r
-#define ERRLOG_MAP_IO_SPACE             0x00000601L\r
-#define ERRLOG_QUERY_ADAPTER_RESOURCES  0x00000602L\r
-#define ERRLOG_NO_IO_RESOURCE           0x00000603L\r
-#define ERRLOG_NO_INTERRUPT_RESOURCE    0x00000604L\r
-#define ERRLOG_NO_MEMORY_RESOURCE       0x00000605L\r
-\r
-// NIC specific macros                                        \r
-#define NIC_RFD_GET_STATUS(_HwRfd) ((_HwRfd)->RfdCbHeader.CbStatus)\r
-#define NIC_RFD_STATUS_COMPLETED(_Status) ((_Status) & RFD_STATUS_COMPLETE)\r
-#define NIC_RFD_STATUS_SUCCESS(_Status) ((_Status) & RFD_STATUS_OK)\r
-\r
-// Constants for various purposes of NdisStallExecution\r
-\r
-#define NIC_DELAY_POST_RESET            20\r
-// Wait 5 milliseconds for the self-test to complete\r
-#define NIC_DELAY_POST_SELF_TEST_MS     5\r
-\r
-                                      \r
-// delay used for link detection to minimize the init time\r
-// change this value to match your hardware \r
-#define NIC_LINK_DETECTION_DELAY        100\r
-\r
-// max number of physical fragmented buffers \r
-#define MAX_PHYS_BUF_FRAG_ELEMENTS      0x29\r
-\r
-//\r
-//CUSTOM OID\r
-//===========\r
-// in order to make our custom oids hopefully somewhat unique\r
-// we will use 0xFF (indicating implementation specific OID)\r
-//               A0 (first byte of non zero intel unique identifier)\r
-//               C9 (second byte of non zero intel unique identifier)\r
-//               XX (the custom OID number - providing 255 possible custom oids)\r
-//\r
-#define OID_CUSTOM_DRIVER_SET       0xFFA0C901\r
-#define OID_CUSTOM_DRIVER_QUERY     0xFFA0C902\r
-#define OID_CUSTOM_PERF_COUNTERS    0xFFA0C903\r
-#define OID_CUSTOM_STRING           0xFFA0C904\r
-#define OID_ADD_VALN_ID             0xFFA0C905\r
-#define OID_DELETE_VLAN_ID          0xFFA0C906\r
-\r
-\r
-#endif  // _MP_DEF_H\r
-\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_init.cpp b/hw/mlx4/kernel/eth/mp_init.cpp
deleted file mode 100644 (file)
index 71b6402..0000000
+++ /dev/null
@@ -1,1050 +0,0 @@
-/*++\r
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_init.c\r
-\r
-Abstract:\r
-    This module contains miniport initialization related routines\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-#if defined(EVENT_TRACING)\r
-#include "Mp_init.tmh"\r
-#endif\r
-\r
-#if DBG\r
-#define _FILENUMBER     'TINI'\r
-#endif\r
-\r
-LONG ConvertRingSizeTable[] = {256, 512, 1024, 2048, 4096};\r
-static const LONG MinRinSizeVal = 0;\r
-static const LONG MaxRingSizeVal = sizeof(ConvertRingSizeTable)/sizeof(LONG);\r
-\r
-void NICFreeAdapterMemory(PMP_PORT Port);\r
-\r
-typedef struct _MP_REG_ENTRY\r
-{\r
-    NDIS_STRING RegName;                // variable name text\r
-    BOOLEAN     bRequired;              // 1 -> required, 0 -> optional\r
-    UINT        FieldOffset;            // offset to MP_PORT field\r
-    UINT        FieldSize;              // size (in bytes) of the field\r
-    UINT        Default;                // default value to use\r
-    UINT        Min;                    // minimum value allowed\r
-    UINT        Max;                    // maximum value allowed\r
-} MP_REG_ENTRY, *PMP_REG_ENTRY;\r
-\r
-MP_REG_ENTRY NICRegTable[] = {\r
-// reg value name                           Offset in MP_PORT            Field size                  Default Value           Min             Max\r
-#if DBG                                                                                                                          \r
-    {NDIS_STRING_CONST("Debug"),           0, MP_OFFSET(Debug),                     MP_SIZE(Debug),             MP_WARN,                0,              0xffffffff},\r
-#endif\r
-    {NDIS_STRING_CONST("NumRfd"),           0, MP_OFFSET(NumRfd),                   MP_SIZE(NumRfd),              32,                     NIC_MIN_RFDS,   NIC_MAX_RFDS},\r
-    {NDIS_STRING_CONST("NumTcb"),           0, MP_OFFSET(NumTcb),                   MP_SIZE(NumTcb),              NIC_DEF_TCBS,           1,              NIC_MAX_TCBS},\r
-    {NDIS_STRING_CONST("NumCoalesce"),      0, MP_OFFSET(NumBuffers),               MP_SIZE(NumBuffers),          8,                      1,              32},\r
-    {NDIS_STRING_CONST("SpeedDuplex"),      0, MP_OFFSET(SpeedDuplex),              MP_SIZE(SpeedDuplex),         0,                      0,              4},\r
-    {NDIS_STRING_CONST("SendChksum"),       0, MP_OFFSET(TxChksumOffload),          MP_SIZE(TxChksumOffload),     1,                      0,              1},\r
-    {NDIS_STRING_CONST("RecvChksum"),       0, MP_OFFSET(RxChksumOffload),          MP_SIZE(RxChksumOffload),     1,                      0,              1},\r
-    {NDIS_STRING_CONST("LargeSendOffload"), 0, MP_OFFSET(LargeSendOffload),         MP_SIZE(LargeSendOffload),    1,                      0,              1},\r
-    {NDIS_STRING_CONST("LargeReceiveOffload"), 0, MP_OFFSET(LargeReceiveOffload),   MP_SIZE(LargeReceiveOffload), LRO_MODE_DEFAULT,       0,              LRO_MODE_MAX_VAL},\r
-    {NDIS_STRING_CONST("MaxFrameSize"),     0, MP_OFFSET(MaxFrameSize),             MP_SIZE(MaxFrameSize),        9600,                   500,            9985},\r
-    {NDIS_STRING_CONST("RecvIntModCount"),  0, MP_OFFSET(RecvIntModCount),          MP_SIZE(RecvIntModCount),     0,                      0,              200},\r
-    {NDIS_STRING_CONST("RecvIntModTime"),   0, MP_OFFSET(RecvIntModTime),           MP_SIZE(RecvIntModTime),      0,                      0,              200},\r
-    {NDIS_STRING_CONST("SendIntModCount"),  0, MP_OFFSET(SendIntModCount),          MP_SIZE(SendIntModCount),     0,                      0,              100},\r
-    {NDIS_STRING_CONST("SendIntModTime"),   0, MP_OFFSET(SendIntModTime),           MP_SIZE(SendIntModTime),      0,                      0,              100},\r
-    {NDIS_STRING_CONST("UseDma"),           0, MP_OFFSET(fUseDma),                  MP_SIZE(fUseDma),             0,                      0,              1},\r
-    {NDIS_STRING_CONST("SendCompletionMethod"), 0, MP_OFFSET(fUseSendInt),          MP_SIZE(fUseSendInt),         1,                      0,              1},\r
-    {NDIS_STRING_CONST("RecvRingSize"),     0, MP_OFFSET(RecvRingSize),             MP_SIZE(RecvRingSize),        3,                      MinRinSizeVal,  MaxRingSizeVal},\r
-    {NDIS_STRING_CONST("SendRingSize"),     0, MP_OFFSET(SendRingSize),             MP_SIZE(SendRingSize),        3,                      MinRinSizeVal,  MaxRingSizeVal},\r
-    {NDIS_STRING_CONST("RecvCompletionMethod"), 0, MP_OFFSET(RecvCompletionMethod), MP_SIZE(RecvCompletionMethod),RECIEVE_MODE_ADAPTIVE,  0,              RECIEVE_MODE_MAX},\r
-    {NDIS_STRING_CONST("RecvPollingModCount"), 0, MP_OFFSET(RecvPollingModCount),   MP_SIZE(RecvPollingModCount), 20,                     1,              1000000},\r
-    {NDIS_STRING_CONST("SendPollingModTime"), 0, MP_OFFSET(SendPollingModTime),     MP_SIZE(SendPollingModTime),  20,                     10,             100},\r
-    {NDIS_STRING_CONST("SendPollingModCount"), 0, MP_OFFSET(SendPollingModCount),   MP_SIZE(SendPollingModCount), 3,                      1,              100},\r
-    {NDIS_STRING_CONST("RssMode"),          0, MP_OFFSET(RssMode),                  MP_SIZE(RssMode),             RSS_MODE_NDIS,          RSS_MODE_NO_REBALANCE,              RSS_MODE_MAX},\r
-    {NDIS_STRING_CONST("ThreadPoll"),       0, MP_OFFSET(ThreadPoll),               MP_SIZE(ThreadPoll),          3000,                   0,              10000},\r
-    {NDIS_STRING_CONST("FailOver"),         0, MP_OFFSET(FailOver),                 MP_SIZE(FailOver),            0,                      0,              1},\r
-    {NDIS_STRING_CONST("AverageFactor"),    0, MP_OFFSET(AverageFactor),            MP_SIZE(AverageFactor),       10,                     0,              0x100},\r
-    {NDIS_STRING_CONST("AveragePollThreshold"),       0, MP_OFFSET(AveragePollThreshold),  MP_SIZE(AveragePollThreshold),          0x10,  0,              1000},\r
-    {NDIS_STRING_CONST("ThisPollThreshold"), 0, MP_OFFSET(ThisPollThreshold),     MP_SIZE(ThisPollThreshold), 100,                   0,               1000},\r
-    {NDIS_STRING_CONST("MaxNumberOfPacketsToIndicateThread"), 0, MP_OFFSET(MaxNumberOfPacketsToIndicateThread),               MP_SIZE(MaxNumberOfPacketsToIndicateThread), 100, 10, NIC_DEF_MAX_RFDS},\r
-    {NDIS_STRING_CONST("InterupptToThreadThreshold"),0, MP_OFFSET(InterupptToThreadThreshold),  MP_SIZE(InterupptToThreadThreshold), 200,                  10,              300}\r
-};  \r
-\r
-#define NIC_NUM_REG_PARAMS (sizeof (NICRegTable) / sizeof(MP_REG_ENTRY))\r
-\r
-#if LBFO\r
-NDIS_STRING strBundleId = NDIS_STRING_CONST("BundleMlx");        \r
-#endif\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Initialize MP_PORT data block\r
-\r
-Arguments:\r
-    Port     Pointer to the port object\r
-\r
-Return Value:\r
-    None\r
-    \r
---*/    \r
-void MpInitPort(PMP_PORT Port)\r
-{\r
-    ETH_ENTER(ETH);\r
-\r
-\r
-    NdisZeroMemory(&Port->perf_counters, sizeof(mtnic_perf_counters));\r
-    \r
-    IncPortRefCount(Port);\r
-    MP_CLEAR_FLAGS(Port);\r
-\r
-    InitializeListHead(&Port->PoMgmt.PatternList);\r
-\r
-    NdisInitializeEvent(&Port->ExitEvent);\r
-    NdisInitializeEvent(&Port->AllPacketsReturnedEvent);\r
-    MP_INC_RCV_REF(Port);\r
-\r
-    NdisAllocateSpinLock(&Port->Lock);\r
-    NdisAllocateSpinLock(&Port->SendLock);\r
-    NdisAllocateSpinLock(&Port->RcvLock);\r
-\r
-    NdisInitializeWorkItem(\r
-       &Port->NdisSetInformation.WorkItem,\r
-       SetInformationPassive,\r
-       Port);\r
-    \r
-    NdisInitializeWorkItem(\r
-       &Port->NdisGetInformation.WorkItem,\r
-       GetInformationPassive,\r
-       Port);\r
-    \r
-    NdisInitializeWorkItem(\r
-       &Port->InteruptModerationWorkItem,\r
-       InteruptModerationPassive,\r
-       Port);\r
-\r
-    NdisInitializeWorkItem(\r
-       &Port->AllocMemAsync.WorkItem,\r
-       AllocMemPassive,\r
-       Port);\r
-\r
-    ExInitializeSListHead(&Port->SendBufList);\r
-    KeInitializeSpinLock(&Port->SendBufListLock);\r
-\r
-#ifdef LBFO\r
-    Port->pBundleInfo = NULL;\r
-#endif\r
-    ETH_EXIT(ETH);\r
-}\r
-\r
-\r
-VOID MpDisablePort(\r
-    IN  PMP_PORT Port\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-    Free all the resources and MP_ADAPTER data block\r
-\r
-Arguments:\r
-\r
-    Adapter     Pointer to our adapter\r
-\r
-Return Value:\r
-\r
-    None                                                    \r
-\r
---*/    \r
-{\r
-    mtnic_priv* priv = &Port->priv;\r
-    ULONG i;\r
-\r
-    ETH_ENTER(ETH);\r
-    \r
-    // No active and waiting sends\r
-    for (i = 0; i < priv->tx_ring_num; ++i)\r
-    {\r
-        mtnic_tx_ring* pTxRing = &Port->priv.tx_ring[i];\r
-        ASSERT(pTxRing->nBusySend == 0);\r
-        ASSERT(pTxRing->SendWaitQueue.Size() == 0);\r
-    }\r
-    \r
-    // No other pending operations\r
-    ASSERT(Port->bAllocNewRfd == FALSE);\r
-    ASSERT(MP_GET_REF(Port) == 0);\r
-\r
-    Port->priv.port_state = PORT_DOWN;\r
-\r
-    memset(&Port->NdisSetInformation, 0, sizeof(NDIS_SET_INFORMATION));\r
-    memset(&Port->NdisGetInformation, 0, sizeof(NDIS_GET_INFORMATION));\r
-    memset(&Port->AllocMemAsync, 0, sizeof(ALLOC_MEM_ASYNC));\r
-    \r
-    //\r
-    // Free the receive ring buffers\r
-    //\r
-    for(i = 0; i < Port->priv.rx_ring_num; ++i)\r
-    {\r
-        mtnic_rx_ring *RecvRing = &Port->priv.rx_ring[i];\r
-       \r
-        // After we did the polling, we might have some more packets to send\r
-        while (RecvRing->FreePackets.Size() > 0) \r
-        {\r
-            LIST_ENTRY* pEntry = RecvRing->FreePackets.RemoveHeadList();\r
-\r
-            ASSERT(pEntry);\r
-            PMP_RFD pMpRfd = CONTAINING_RECORD(pEntry, MP_RFD, List);\r
-            NICFreeRfd(Port, pMpRfd);\r
-        }\r
-    }\r
-\r
-    //\r
-    // Free adapter memory\r
-    //\r
-    NICFreeAdapterMemory(Port);\r
-\r
-    //Free all the wake up patterns on this adapter\r
-    MPRemoveAllWakeUpPatterns(Port);\r
-\r
-    NdisFreeSpinLock(&Port->Lock);\r
-    NdisFreeSpinLock(&Port->SendLock);\r
-    NdisFreeSpinLock(&Port->RcvLock);\r
-\r
-\r
-#if LBFO\r
-    if (Port->Config.psBundleId != NULL)\r
-    {\r
-        delete [] Port->Config.psBundleId;\r
-    }\r
-#endif\r
-\r
-    if(Port->MCList != NULL)\r
-    {\r
-        //\r
-        // We don't expect to reach here. Before disabling ther device NDIS should call the\r
-        // driver to reset the multicast list. Than we free the list\r
-        //\r
-        ASSERT(Port->McListAlocateSize != 0);\r
-        MP_FREEMEM(Port->MCList, Port->McListAlocateSize, 0);\r
-\r
-        Port->MCList = NULL;\r
-        Port->McListAlocateSize = 0;\r
-        Port->MCAddressCount = 0;\r
-    }\r
-\r
-#if DBG\r
-    if (MPInitDone)\r
-    {\r
-        NdisFreeSpinLock(&MPMemoryLock);\r
-    }\r
-#endif\r
-\r
-    ETH_EXIT(ETH);\r
-}\r
-\r
-\r
-NDIS_STATUS NICReadRegParameters(\r
-    IN  PMP_PORT Port,\r
-    IN  NDIS_HANDLE WrapperConfigurationContext)\r
-/*++\r
-Routine Description:\r
-\r
-    Read the following from the registry\r
-    1. All the parameters\r
-    2. NetworkAddres\r
-    3. LBFO - BundleId\r
-\r
-Arguments:\r
-\r
-    Adapter                         Pointer to our adapter\r
-    WrapperConfigurationContext     For use by NdisOpenConfiguration\r
-\r
-Return Value:\r
-\r
-    NDIS_STATUS_SUCCESS\r
-    NDIS_STATUS_FAILURE\r
-    NDIS_STATUS_RESOURCES                                       \r
-\r
---*/    \r
-{\r
-    NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\r
-    NDIS_HANDLE     ConfigurationHandle;\r
-    PMP_REG_ENTRY   pRegEntry;\r
-    UINT            i;\r
-    UINT            value;\r
-    PUCHAR          pointer;\r
-    PNDIS_CONFIGURATION_PARAMETER ReturnedValue;\r
-    PUCHAR          NetworkAddress;\r
-    UINT            Length;\r
-\r
-    ETH_ENTER(ETH);\r
-    \r
-    // Open the registry for this adapter\r
-    NdisOpenConfiguration(\r
-        &Status,\r
-        &ConfigurationHandle,\r
-        WrapperConfigurationContext);\r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("NdisOpenConfiguration failed. Status=%x\n", Status));\r
-        return Status;\r
-    }\r
-\r
-    // read all the registry values \r
-    for (i = 0, pRegEntry = NICRegTable; i < NIC_NUM_REG_PARAMS; i++, pRegEntry++)\r
-    {\r
-        //\r
-        // Driver should NOT fail the initialization only because it can not\r
-        // read the registry\r
-        //\r
-        ASSERT(pRegEntry->bRequired == FALSE);\r
-        pointer = (PUCHAR) &Port->Config + pRegEntry->FieldOffset;\r
-\r
-        // Get the configuration value for a specific parameter.  Under NT the\r
-        // parameters are all read in as DWORDs.\r
-        NdisReadConfiguration(\r
-            &Status,\r
-            &ReturnedValue,\r
-            ConfigurationHandle,\r
-            &pRegEntry->RegName,\r
-            NdisParameterInteger);\r
-\r
-        // If the parameter was present, then check its value for validity.\r
-        if (Status == NDIS_STATUS_SUCCESS)\r
-        {\r
-            // Check that param value is not too small or too large\r
-            if (ReturnedValue->ParameterData.IntegerData < pRegEntry->Min ||\r
-                ReturnedValue->ParameterData.IntegerData > pRegEntry->Max)\r
-            {\r
-                value = pRegEntry->Default;\r
-            }\r
-            else\r
-            {\r
-                value = ReturnedValue->ParameterData.IntegerData;\r
-            }\r
-\r
-            ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Read configuration. Registry %S, Value= 0x%x\n", pRegEntry->RegName.Buffer, value));\r
-        }\r
-        else\r
-        {\r
-            if (pRegEntry->bRequired)\r
-            {\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to Read configuration from %S", pRegEntry->RegName.Buffer));\r
-\r
-                ASSERT(FALSE);\r
-\r
-                Status = NDIS_STATUS_FAILURE;\r
-                break;\r
-            }\r
-            else\r
-            {\r
-                value = pRegEntry->Default;\r
-                ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Failed to Read configuration from %ls. Use default value, 0x%x", (PWSTR)&(pRegEntry->RegName), value));\r
-                Status = NDIS_STATUS_SUCCESS;\r
-            }\r
-        }\r
-        //\r
-        // Store the value in the adapter structure.\r
-        //\r
-        switch(pRegEntry->FieldSize)\r
-        {\r
-            case 1:\r
-                *((PUCHAR) pointer) = (UCHAR) value;\r
-                break;\r
-\r
-            case 2:\r
-                *((PUSHORT) pointer) = (USHORT) value;\r
-                break;\r
-\r
-            case 4:\r
-                *((PULONG) pointer) = (ULONG) value;\r
-                break;\r
-\r
-            default:\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Bogus field size %d\n", pRegEntry->FieldSize));\r
-                break;\r
-        }\r
-    }\r
-\r
-    if (Status == NDIS_STATUS_SUCCESS)\r
-    {\r
-        Port->Config.RecvRingSize = ConvertRingSizeTable[Port->Config.RecvRingSize];\r
-        Port->Config.SendRingSize = ConvertRingSizeTable[Port->Config.SendRingSize];\r
-    }\r
-\r
-    // Read NetworkAddress registry value \r
-    // Use it as the current address if any\r
-    if (Status == NDIS_STATUS_SUCCESS)\r
-    {\r
-        NdisReadNetworkAddress(\r
-            &Status,\r
-            (PVOID *)&NetworkAddress,\r
-            &Length,\r
-            ConfigurationHandle);\r
-\r
-        // If there is a NetworkAddress override in registry, use it \r
-        if ((Status == NDIS_STATUS_SUCCESS) && (Length == ETH_LENGTH_OF_ADDRESS))\r
-        {\r
-            if ((ETH_IS_MULTICAST(NetworkAddress) \r
-                    || ETH_IS_BROADCAST(NetworkAddress))\r
-                    || !ETH_IS_LOCALLY_ADMINISTERED (NetworkAddress))\r
-            {\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, \r
-                    ("Overriding NetworkAddress is invalid - %02x-%02x-%02x-%02x-%02x-%02x\n", \r
-                    NetworkAddress[0], NetworkAddress[1], NetworkAddress[2],\r
-                    NetworkAddress[3], NetworkAddress[4], NetworkAddress[5]));\r
-            }\r
-            else\r
-            {              \r
-                ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, \r
-                    ("Overriding NetworkAddress (MAC): %02x-%02x-%02x-%02x-%02x-%02x\n", \r
-                    NetworkAddress[0], NetworkAddress[1], NetworkAddress[2],\r
-                    NetworkAddress[3], NetworkAddress[4], NetworkAddress[5]));\r
-                ETH_COPY_NETWORK_ADDRESS(Port->CurrentAddress, NetworkAddress);\r
-                Port->bOverrideAddress = TRUE;\r
-            }\r
-        }\r
-\r
-        if (!Port->bOverrideAddress)\r
-        {\r
-            ETH_COPY_NETWORK_ADDRESS(Port->CurrentAddress,  Port->PermanentAddress);\r
-        }\r
-        Status = NDIS_STATUS_SUCCESS;\r
-    }\r
-\r
-#if LBFO\r
-    Port->Config.psBundleId = NULL;\r
-\r
-    if ((Status == NDIS_STATUS_SUCCESS) && Port->Config.FailOver)\r
-    {\r
-        // Read BundleIdentifier string\r
-        NdisReadConfiguration(\r
-            &Status,\r
-            &ReturnedValue,\r
-            ConfigurationHandle,\r
-            &strBundleId,\r
-            NdisParameterString);\r
-\r
-        if (Status == NDIS_STATUS_SUCCESS)\r
-        {\r
-            ASSERT(ReturnedValue->ParameterType == NdisParameterString);\r
-\r
-            if (ReturnedValue->ParameterData.StringData.Length !=0)\r
-            {\r
-                Port->Config.psBundleId = (LPWSTR) new UCHAR[ReturnedValue->ParameterData.StringData.MaximumLength];\r
-                memcpy(Port->Config.psBundleId, \r
-                       ReturnedValue->ParameterData.StringData.Buffer, \r
-                       ReturnedValue->ParameterData.StringData.MaximumLength);\r
-            }\r
-        }\r
-        else\r
-        {\r
-            // This parameter is optional, set status to SUCCESS\r
-            Status = NDIS_STATUS_SUCCESS;\r
-        }\r
-    }\r
-#endif   \r
-\r
-    // Close the registry\r
-    NdisCloseConfiguration(ConfigurationHandle);\r
-\r
-    //\r
-    // Adjust MTU to contain the ETH header\r
-    //\r
-    Port->Config.MaxFrameSize += NIC_HEADER_SIZE;\r
-\r
-    //\r
-    // When RecvIntModTime == 0 we also have to set RecvIntModCount to 0\r
-    // This is mandatory to disable interrupt moderation\r
-    //\r
-    if (Port->Config.RecvIntModTime == 0) {\r
-        Port->Config.RecvIntModCount = 0;\r
-    }\r
-    \r
-    ETH_EXIT(ETH);\r
-\r
-    return Status;\r
-}\r
-\r
-\r
-void NICFreeAdapterMemory(PMP_PORT Port)\r
-{\r
-    // Free receive buffer pool\r
-    if (Port->RecvBufferPool)\r
-    {\r
-        NdisFreeBufferPool(Port->RecvBufferPool);\r
-        Port->RecvBufferPool = NULL;\r
-    }\r
-\r
-    // Free receive packet pool\r
-    if (Port->RecvPacketPool)\r
-    {\r
-        NdisFreePacketPool(Port->RecvPacketPool);\r
-        Port->RecvPacketPool = NULL;\r
-    }\r
-\r
-    if (MP_TEST_FLAG(Port, fMP_PORT_RECV_LOOKASIDE))\r
-    {\r
-        NdisDeleteNPagedLookasideList(&Port->RecvLookaside);\r
-        MP_CLEAR_FLAG(Port, fMP_PORT_RECV_LOOKASIDE);\r
-    }\r
-            \r
-    //               \r
-    // Free SEND memory/NDIS buffer/NDIS packets/shared memory\r
-    //\r
-    while (ExQueryDepthSList(&Port->SendBufList) > 0)\r
-    {\r
-        PMP_TXBUF pMpTxBuf = (PMP_TXBUF)ExInterlockedPopEntrySList(&Port->SendBufList, &Port->SendBufListLock);\r
-        ASSERT(pMpTxBuf);\r
-\r
-        // Free the shared memory associated with each MP_TXBUF\r
-        if (pMpTxBuf->AllocVa)\r
-        {\r
-            AllocateSharedMemoryDeleteInfo delInfo = { pMpTxBuf->AllocSize, pMpTxBuf->fAllocCache, pMpTxBuf->AllocVa, pMpTxBuf->AllocPa };\r
-            FreeSharedMemory(Port->PortHandle, &delInfo, Port->Config.fUseDma);\r
-        }\r
-\r
-        // Free the NDIS buffer\r
-        if (pMpTxBuf->NdisBuffer)\r
-        {\r
-            NdisAdjustBufferLength(pMpTxBuf->NdisBuffer, pMpTxBuf->BufferSize);\r
-            NdisFreeBuffer(pMpTxBuf->NdisBuffer);\r
-            pMpTxBuf->NdisBuffer = NULL;\r
-        }\r
-    }\r
-\r
-    // Free the send buffer pool\r
-    if (Port->SendBufferPool)\r
-    {\r
-        NdisFreeBufferPool(Port->SendBufferPool);\r
-        Port->SendBufferPool = NULL;\r
-    }\r
-\r
-    // Free the memory for MP_TXBUF structures\r
-\r
-    if (Port->MpTxBufMem)\r
-    {\r
-        MP_FREEMEM(Port->MpTxBufMem, Port->MpTxBufMemSize, 0);\r
-        Port->MpTxBufMem = NULL;\r
-    }\r
-}\r
-\r
-\r
-NDIS_STATUS NICAllocAdapterMemory(\r
-    IN  PMP_PORT Port\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-    Allocate all the memory blocks for send, receive and others\r
-\r
-Arguments:\r
-\r
-    Adapter     Pointer to our adapter\r
-\r
-Return Value:\r
-\r
-    NDIS_STATUS_SUCCESS\r
-    NDIS_STATUS_FAILURE\r
-    NDIS_STATUS_RESOURCES\r
-\r
---*/    \r
-{\r
-    NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\r
-    PMP_TXBUF       pMpTxbuf;\r
-    PUCHAR          pMem;\r
-    LONG            index;\r
-    ULONG           ErrorValue = 0;\r
-    UINT            MaxNumBuffers;\r
-   \r
-    ETH_ENTER(ETH);\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("NumTcb=%d\n", Port->Config.NumTcb));\r
-\r
-    do\r
-    {\r
-        if (Port->Config.fUseDma)\r
-        {\r
-            Status = NdisMInitializeScatterGatherDma(\r
-                         Port->PortHandle,\r
-                         TRUE,\r
-                         LARGE_SEND_OFFLOAD_SIZE + LSO_MAX_HEADER);\r
-            \r
-            if (Status == NDIS_STATUS_SUCCESS)\r
-            {\r
-                MP_SET_FLAG(Port, fMP_PORT_SCATTER_GATHER);\r
-            }\r
-            else\r
-            {\r
-                ETH_PRINT(TRACE_LEVEL_WARNING, ETH, ("Failed to init ScatterGather DMA\n"));\r
-\r
-                //\r
-                // NDIS 5.1 miniport should NOT use map registers\r
-                //\r
-                ErrorValue = ERRLOG_OUT_OF_SG_RESOURCES;\r
-                break;  \r
-            }\r
-        }\r
-\r
-        //\r
-        // Send + Misc\r
-        //\r
-        //\r
-        // Now the driver needs to allocate send buffer pool, the number \r
-        // of send buffers the driver needs is the larger one of Port->NumBuffer  \r
-        // and Port->Config.NumTcb.\r
-        //\r
-        MaxNumBuffers = Port->Config.NumBuffers > Port->Config.NumTcb ? Port->Config.NumBuffers: Port->Config.NumTcb;\r
-\r
-        NdisAllocateBufferPool(&Status, &Port->SendBufferPool, MaxNumBuffers);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            ErrorValue = ERRLOG_OUT_OF_BUFFER_POOL;\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate send buffer pool\n"));\r
-            break;\r
-        }\r
-\r
-        // Allocate send buffers\r
-        Port->MpTxBufMemSize = Port->Config.NumBuffers * sizeof(MP_TXBUF);\r
-        Status = MP_ALLOCMEMTAG((PVOID *)&pMem, Port->MpTxBufMemSize);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            ErrorValue = ERRLOG_OUT_OF_MEMORY;\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate MP_TXBUF's\n"));\r
-            break;\r
-        }\r
-        NdisZeroMemory(pMem, Port->MpTxBufMemSize);\r
-        Port->MpTxBufMem = pMem;\r
-\r
-        pMpTxbuf = (PMP_TXBUF) pMem;         \r
-\r
-        Port->CacheFillSize = (Port->Config.fUseDma) ? NdisMGetDmaAlignment(Port->PortHandle) : 0;\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("CacheFillSize=%d\n", Port->CacheFillSize));\r
-\r
-        for (index = 0; index < Port->Config.NumBuffers; index++)\r
-        {\r
-            pMpTxbuf->AllocSize = LARGE_SEND_OFFLOAD_SIZE+ LSO_MAX_HEADER + Port->CacheFillSize;\r
-            pMpTxbuf->BufferSize = LARGE_SEND_OFFLOAD_SIZE + LSO_MAX_HEADER;\r
-\r
-            pMpTxbuf->fAllocCache = FALSE;\r
-            Status = AllocateSharedMemory(\r
-                            Port->PortHandle,\r
-                            pMpTxbuf->AllocSize,\r
-                            Port->CacheFillSize,  \r
-                            pMpTxbuf->fAllocCache,\r
-                            Port->Config.fUseDma,\r
-                            &pMpTxbuf->AllocVa,  \r
-                            &pMpTxbuf->AllocPa,\r
-                            NULL);\r
-\r
-            if (Status != STATUS_SUCCESS)\r
-            {\r
-                ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate a big buffer\n"));\r
-                break;\r
-            }\r
-            ASSERT(pMpTxbuf->AllocVa != NULL);\r
-            \r
-            //\r
-            // Align the buffer on the cache line boundary\r
-            //\r
-            pMpTxbuf->pBuffer = (PUCHAR)MP_ALIGNMEM(pMpTxbuf->AllocVa, Port->CacheFillSize);\r
-            pMpTxbuf->BufferPa.QuadPart = MP_ALIGNMEM_PA(pMpTxbuf->AllocPa, Port->CacheFillSize);\r
-\r
-            NdisAllocateBuffer(\r
-                &Status,\r
-                &pMpTxbuf->NdisBuffer,\r
-                Port->SendBufferPool,\r
-                pMpTxbuf->pBuffer,\r
-                pMpTxbuf->AllocSize);  \r
-\r
-            if (Status != NDIS_STATUS_SUCCESS)\r
-            {\r
-                ErrorValue = ERRLOG_OUT_OF_NDIS_BUFFER;\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate NDIS buffer for a big buffer\n"));\r
-\r
-                AllocateSharedMemoryDeleteInfo delInfo = { pMpTxbuf->AllocSize, pMpTxbuf->fAllocCache, pMpTxbuf->AllocVa, pMpTxbuf->AllocPa };\r
-                FreeSharedMemory(Port->PortHandle, &delInfo, Port->Config.fUseDma);\r
-\r
-                break;\r
-            }\r
-\r
-            ExInterlockedPushEntrySList(&Port->SendBufList, &pMpTxbuf->SList, &Port->SendBufListLock);\r
-\r
-            pMpTxbuf++;\r
-        }\r
-\r
-        if (Status != NDIS_STATUS_SUCCESS) \r
-        {\r
-            break;\r
-        }\r
-\r
-        //\r
-        // Recv\r
-        //\r
-        NdisInitializeNPagedLookasideList(\r
-            &Port->RecvLookaside,\r
-            NULL,\r
-            NULL,\r
-            0,\r
-            sizeof(MP_RFD),\r
-            NIC_TAG, \r
-            0);\r
-\r
-        MP_SET_FLAG(Port, fMP_PORT_RECV_LOOKASIDE);\r
-\r
-        // set the max number of RFDs\r
-        // disable the RFD grow/shrink scheme if user specifies a NumRfd value \r
-        // larger than NIC_MAX_GROW_RFDS\r
-        Port->MaxNumRfd = max(Port->Config.NumRfd, NIC_MAX_GROW_RFDS);\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("NumRfd = %d\n", Port->Config.NumRfd));\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("MaxNumRfd = %d\n", Port->MaxNumRfd));\r
-\r
-        //\r
-        // The driver should allocate more data than sizeof(RFD_STRUC) to allow the\r
-        // driver to align the data(after ethernet header) at 8 byte boundary\r
-        //\r
-        Port->HwRfdSize = Port->Config.MaxFrameSize + 100+ MORE_DATA_FOR_ALIGN; //??? what about the 100 ??????\r
-        if (Port->Config.LargeReceiveOffload == LRO_MODE_MINI)\r
-        {\r
-            //\r
-            // for minimal LRO mode allocate duble buffer so we can copy the second packet to first one\r
-            //\r
-            Port->HwRfdSize = Port->HwRfdSize * 2;\r
-        }\r
-        \r
-        // alloc the recv packet pool\r
-\r
-        NdisAllocatePacketPoolEx(\r
-            &Status,\r
-            &Port->RecvPacketPool,\r
-            Port->Config.NumRfd ,\r
-            8024 * 4, //????????????Port->MaxNumRfd, //????? connect to other code\r
-            sizeof(PVOID) * 4);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate receive packet\n"));\r
-            ErrorValue = ERRLOG_OUT_OF_PACKET_POOL;\r
-            break;\r
-        }\r
-\r
-        // alloc the buffer pool\r
-        NdisAllocateBufferPool(\r
-            &Status,\r
-            &Port->RecvBufferPool,\r
-            Port->MaxNumRfd);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate buffer\n"));\r
-            ErrorValue = ERRLOG_OUT_OF_BUFFER_POOL;\r
-            break;\r
-        }\r
-        \r
-        Status = NDIS_STATUS_SUCCESS;\r
-\r
-    } while (FALSE);\r
-\r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        NICFreeAdapterMemory(Port);\r
-        NdisWriteErrorLogEntry(\r
-            Port->PortHandle,\r
-            NDIS_ERROR_CODE_OUT_OF_RESOURCES,\r
-            1,\r
-            ErrorValue);\r
-    }\r
-\r
-    ETH_EXIT(ETH);\r
-    return Status;\r
-\r
-}\r
-\r
-\r
-NDIS_STATUS \r
-NICInitRecv(\r
-    IN  PMP_PORT Port\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-    Initialize receive data structures\r
-\r
-Arguments:\r
-\r
-    Adapter     Pointer to our adapter\r
-\r
-Return Value:\r
-\r
-    NDIS_STATUS_SUCCESS\r
-    NDIS_STATUS_RESOURCES\r
-\r
---*/    \r
-{\r
-    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;\r
-\r
-    PMP_RFD         pMpRfd;      \r
-    u32             RfdCount;\r
-    ULONG           ErrorValue = 0;\r
-    USHORT i;\r
-    VOID *          OriginalHwRfd = NULL;\r
-    NDIS_PHYSICAL_ADDRESS   OriginalHwRfdPa;\r
-\r
-    for (i = 0; i < Port->priv.rx_ring_num; ++i)\r
-    {\r
-        mtnic_rx_ring* ring = &Port->priv.rx_ring[i];\r
-\r
-        // Setup each RFD\r
-        for (RfdCount = 0; RfdCount < ring->size; RfdCount++)\r
-        {\r
-            pMpRfd = (PMP_RFD)NdisAllocateFromNPagedLookasideList(&Port->RecvLookaside);\r
-            if (!pMpRfd)\r
-            {\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("NdisAllocateFromNPagedLookasideList failed\n"));\r
-                ErrorValue = ERRLOG_OUT_OF_LOOKASIDE_MEMORY;\r
-                break;\r
-            }\r
-            MP_CLEAR_FLAGS(pMpRfd);\r
-            memset(&pMpRfd->DelInfo, 0 ,sizeof AllocateSharedMemoryDeleteInfo);\r
-            pMpRfd->ring = ring;\r
-            pMpRfd->Port = Port;\r
-            pMpRfd->fAllocCache = FALSE;\r
-\r
-            //\r
-            // Allocate the shared memory for this RFD. Don't add the new block to AllocateSharedMemoryDeleteInfo\r
-            // we handle it seperatly.\r
-            //\r
-            AllocateSharedMemory(\r
-                Port->PortHandle,\r
-                Port->HwRfdSize,\r
-                ETH_PAGE_ALIGN,\r
-                pMpRfd->fAllocCache,\r
-                Port->Config.fUseDma,\r
-                &OriginalHwRfd,\r
-                &OriginalHwRfdPa,\r
-                &pMpRfd->DelInfo);\r
-\r
-            if (!OriginalHwRfd)\r
-            {\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("AllocateSharedMemory failed\n"));\r
-                ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;\r
-                NdisFreeToNPagedLookasideList(&Port->RecvLookaside, pMpRfd);\r
-                break;\r
-            }\r
-\r
-            pMpRfd->HwRfd = OriginalHwRfd;\r
-            \r
-            //\r
-            // Now HwRfd is already 4k-bytes aligned, and the size of HwPfd header(not data part) is a multiple of 8,\r
-            // If we shift HwRfd 0xA bytes up, the Ethernet header size is 14 bytes long, then the data will be at\r
-            // 8 byte boundary. \r
-            // \r
-            pMpRfd->HwRfd = (VOID *)((PUCHAR)(pMpRfd->HwRfd) + HWRFD_SHIFT_OFFSET);\r
-\r
-            //\r
-            // Update physical address accordingly\r
-            // \r
-            pMpRfd->HwRfdPa.QuadPart = OriginalHwRfdPa.QuadPart + BYTES_SHIFT(pMpRfd->HwRfd, OriginalHwRfd);\r
-\r
-            //\r
-            // ISSUE Type: Need to check if we still need to allocate 100 byte spare. This left from \r
-            // Intel code that uses the extra bytes for saving information\r
-            //\r
-            ErrorValue = NICAllocRfd(Port, pMpRfd, Port->Config.MaxFrameSize + 100);\r
-            if (ErrorValue)\r
-            {\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("NICAllocRfd failed\n"));        \r
-                FreeSharedMemory(Port->PortHandle, &pMpRfd->DelInfo, Port->Config.fUseDma);                \r
-                pMpRfd->HwRfd = NULL;\r
-                OriginalHwRfd = NULL;\r
-\r
-                NdisFreeToNPagedLookasideList(&Port->RecvLookaside, pMpRfd);\r
-                break;\r
-            }\r
-            //\r
-            // Add this RFD to the RecvList\r
-            // \r
-            ring->CurrentlyAllocated++;\r
-            bool Posted = NICReturnRFD(Port, ring, pMpRfd, false);\r
-            ASSERT(Posted);\r
-        }\r
-        if (ErrorValue)\r
-        {\r
-            Status = NDIS_STATUS_RESOURCES;\r
-            break;\r
-        }\r
-\r
-        Status = g_pWorkerThreads->AddRing(ring->cpu_number, Port, ring, &ring->m_pThreadWorkEvent, &ring->m_pThreadStartWorking);\r
-        if (!NT_SUCCESS(Status))\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("g_pWorkerThreads->AddRing. Error=0x%x\n", Status));\r
-            break;\r
-\r
-        }        \r
-    }\r
-    \r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        for(USHORT j = 0; j <= i ; j++)\r
-        {\r
-            mtnic_rx_ring* ring = &Port->priv.rx_ring[j];\r
-            if(ring->m_pThreadStartWorking != NULL)\r
-            {\r
-                g_pWorkerThreads->RemoveRing(ring->cpu_number, ring);\r
-            }\r
-            mtnic_free_rx_buf(Port, ring);\r
-        }\r
-        \r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Initialize receive data structures failed. Error=0x%x\n", ErrorValue));\r
-        NdisWriteErrorLogEntry(\r
-            Port->PortHandle,\r
-            NDIS_ERROR_CODE_OUT_OF_RESOURCES,\r
-            1,\r
-            ErrorValue);\r
-\r
-    }\r
-\r
-    ETH_EXIT(ETH);\r
-    return Status;\r
-}\r
-\r
-ULONG NICAllocRfd(\r
-    IN  PMP_PORT Port,\r
-    IN  PMP_RFD pMpRfd,\r
-    IN  ULONG size\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-    Allocate NDIS_PACKET and NDIS_BUFFER associated with a RFD\r
-\r
-Arguments:\r
-\r
-    Adapter     Pointer to our adapter\r
-    pMpRfd      pointer to a RFD\r
-\r
-Return Value:\r
-\r
-    ERRLOG_OUT_OF_NDIS_PACKET\r
-    ERRLOG_OUT_OF_NDIS_BUFFER\r
-\r
---*/    \r
-{\r
-    ETH_ENTER(ETH);\r
-    \r
-    NDIS_STATUS         Status;\r
-    ULONG               ErrorValue = 0;\r
-\r
-    do\r
-    {\r
-        pMpRfd->Flags = 0;\r
-        pMpRfd->NdisPacket = NULL;\r
-        pMpRfd->NdisBuffer = NULL;\r
-\r
-        NdisAllocatePacket(\r
-            &Status,\r
-            &pMpRfd->NdisPacket,\r
-            Port->RecvPacketPool);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            ASSERT(pMpRfd->NdisPacket == NULL);\r
-            ErrorValue = ERRLOG_OUT_OF_NDIS_PACKET;\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate packet Status =0x%x\n", Status));\r
-            break;\r
-        }\r
-\r
-        //\r
-        // point our buffer for receives at this Rfd\r
-        // \r
-        NdisAllocateBuffer(\r
-            &Status,\r
-            &pMpRfd->NdisBuffer,\r
-            Port->RecvBufferPool,\r
-            pMpRfd->HwRfd,\r
-            size); \r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            ASSERT(pMpRfd->NdisBuffer == NULL);\r
-            ErrorValue = ERRLOG_OUT_OF_NDIS_BUFFER;\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate buffer\n"));\r
-            break;\r
-        }\r
-\r
-        NDIS_SET_PACKET_HEADER_SIZE(pMpRfd->NdisPacket, NIC_HEADER_SIZE);\r
-\r
-        NdisChainBufferAtFront(pMpRfd->NdisPacket, pMpRfd->NdisBuffer);\r
-        //\r
-        // Save ptr to MP_RFD in the packet, used in MPReturnPackets \r
-        // \r
-        MP_SET_PACKET_RFD(pMpRfd->NdisPacket, pMpRfd);      \r
-\r
-\r
-    } while (FALSE);\r
-\r
-    if (ErrorValue)\r
-    {    \r
-        if (pMpRfd->NdisPacket)\r
-        {\r
-            NdisFreePacket(pMpRfd->NdisPacket);\r
-        }\r
-    }\r
-\r
-    ETH_EXIT(ETH);\r
-    return ErrorValue;\r
-}\r
-\r
-\r
-VOID NICFreeRfd(\r
-    IN  PMP_PORT Port,\r
-    IN  PMP_RFD  pMpRfd\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-    Free a RFD and assocaited NDIS_PACKET and NDIS_BUFFER\r
-\r
-Arguments:\r
-\r
-    Adapter     Pointer to our adapter\r
-    pMpRfd      Pointer to a RFD\r
-\r
-Return Value:\r
-\r
-    None                                                    \r
-\r
---*/    \r
-{\r
-    ETH_ENTER(ETH);\r
-\r
-    #pragma prefast(suppress:6011, "pMpRfd can't be NULL")\r
-\r
-    ASSERT(pMpRfd);\r
-    ASSERT(pMpRfd->NdisBuffer);      \r
-    ASSERT(pMpRfd->NdisPacket);  \r
-    ASSERT(pMpRfd->HwRfd);    \r
-    ASSERT(pMpRfd->Port == Port);\r
-    \r
-    NdisAdjustBufferLength(pMpRfd->NdisBuffer, Port->Config.MaxFrameSize);\r
-    NdisFreeBuffer(pMpRfd->NdisBuffer);\r
-    NdisFreePacket(pMpRfd->NdisPacket);\r
-    pMpRfd->NdisBuffer = NULL;\r
-    pMpRfd->NdisPacket = NULL;\r
-\r
-    //\r
-    // Free HwRfd, we need to free the original memory pointed by OriginalHwRfd.\r
-    //\r
-    FreeSharedMemory(Port->PortHandle, &pMpRfd->DelInfo, Port->Config.fUseDma);\r
-\r
-    pMpRfd->HwRfd = NULL;\r
-    \r
-    NdisFreeToNPagedLookasideList(&Port->RecvLookaside, pMpRfd);\r
-\r
-    ETH_EXIT(ETH);    \r
-}\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_lbfo.cpp b/hw/mlx4/kernel/eth/mp_lbfo.cpp
deleted file mode 100644 (file)
index 691a8ac..0000000
+++ /dev/null
@@ -1,709 +0,0 @@
-/*\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_lbfo.cpp\r
-\r
-Abstract:\r
-    This module contains LOBFO functio handler\r
-   \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-#include <stdlib.h>\r
-#include "mp_lbfo.h"\r
-#include "mp_log.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#include "Mp_lbfo.tmh"\r
-#endif \r
-\r
-extern PDRIVER_OBJECT g_pDriverObject;  \r
-\r
-static NDIS_STATUS\r
-AddNewBundle(\r
-    PMP_PORT pPort\r
-    )\r
-{\r
-    CBundleInfo* pBundle = new CBundleInfo();\r
-    if (pBundle == NULL)\r
-    {\r
-        return NDIS_STATUS_RESOURCES;\r
-    }\r
-    \r
-    NDIS_STATUS Status = pBundle->Init(pPort);\r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        pBundle->DecRef();\r
-        return Status;\r
-    }\r
-    \r
-    InsertTailList(&g_BundleList, &pBundle->m_List);\r
-    //\r
-    // do we need a reference count\r
-    //\r
-    pBundle->AddRef();\r
-    pPort->pBundleInfo = pBundle;\r
-\r
-    ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Create new bundle: %S\n", pBundle->GetBundleId()));\r
-    return NDIS_STATUS_SUCCESS; \r
-}\r
-\r
-\r
-/*++\r
-\r
-Routine Description:\r
-    This function adds a new adapter to the global adapter list\r
-    1. Not part of bundle (primary) if BundleId string is empty\r
-    2. Primary if no adapter with the same BundleId\r
-    3. Secondary if there is already one adapter with the same BundleId  \r
-    \r
-Arguments:\r
-    MiniportAdapterContext      Pointer to our adapter\r
-\r
-Return Value:\r
-    None\r
-\r
-Note:\r
-    The function is called in PASSIVE_LEVEL and it used the ConfigChangeEvent to protect\r
-    from multiple calls to add or remove from a list\r
---*/\r
-NDIS_STATUS MpAddAdapterToList(PMP_PORT Port)\r
-{\r
-    NDIS_STATUS  Status = NDIS_STATUS_SUCCESS;\r
-    PMP_PORT     PrimaryPort = NULL;\r
-    CBundleInfo* pBundle = NULL;\r
-\r
-    ASSERT(Port->pBundleInfo == NULL);\r
-    \r
-    //\r
-    // Is this adapter part of a bundle? \r
-    //\r
-    if (Port->Config.psBundleId == NULL)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Adapter %p is not in a bundle\n", Port));\r
-        return NDIS_STATUS_SUCCESS;   \r
-    }\r
-    \r
-    Status = KeWaitForSingleObject(&g_BundleEvent, Executive, KernelMode , FALSE, NULL);\r
-    ASSERT(Status == STATUS_SUCCESS);\r
-             \r
-    do\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Add adapter %p to Bundle\n", Port));\r
-\r
-        //\r
-        // Search for the primary Port if it exists. Skip searching if the list is empty \r
-        //\r
-        if (IsListEmpty(&g_BundleList))\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Bundle list is empty. Mark Adapter %p as primary\n", Port));\r
-            Status = AddNewBundle(Port);\r
-            break;\r
-        }\r
-        \r
-        pBundle = (CBundleInfo*)GetListHeadEntry(&g_BundleList);\r
-        while ((PLIST_ENTRY)pBundle != &g_BundleList)\r
-        {\r
-            if (_wcsicmp(pBundle->GetBundleId(), Port->Config.psBundleId) == 0)\r
-            {\r
-                break;\r
-            }\r
-\r
-            pBundle = (CBundleInfo*)GetListFLink((PLIST_ENTRY)pBundle);   \r
-        }\r
-\r
-        //\r
-        // Does a bundle exist? If not, this Port will be primary.\r
-        //\r
-        if ((PLIST_ENTRY)pBundle == &g_BundleList)\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Bundle %S doesn't exist. Mark Adapter %p as primary\n", Port->Config.psBundleId, Port));\r
-            Status = AddNewBundle(Port);\r
-            break;\r
-        }\r
-\r
-        if (pBundle->IsOffloadingTaskMatched(Port))\r
-        {\r
-            MP_SET_FLAG(Port, fMP_PORT_SECONDARY);\r
-            pBundle->AddRef();\r
-            Port->pBundleInfo = pBundle; \r
-\r
-            //\r
-            // We found the bundle that the port belong it. Set this Port as scondary\r
-            //\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Bundle %S is exist. Mark Adapter %p as secondary\n", Port->Config.psBundleId, Port));\r
-            \r
-            pBundle->AddSecondary(Port);\r
-        }\r
-        else\r
-        {\r
-            //\r
-            // Generate event log\r
-            //\r
-            LPCWSTR pstr[2];\r
-            USHORT ulNumOfStr = 2;\r
-            \r
-            pstr[0] = Port->AdapterInstanceName.Buffer;\r
-            pstr[1] = Port->Config.psBundleId;\r
-            \r
-            NdisWriteEventLogEntry(g_pDriverObject, MTNIC_EVENT_LOG_HA_CONFIG_MISMATCH, 0, ulNumOfStr, &pstr, 0, NULL);        \r
-            delete [] Port->Config.psBundleId;\r
-            Port->Config.psBundleId = NULL;\r
-        }\r
-        \r
-    } while(FALSE);\r
-\r
-    KeSetEvent(&g_BundleEvent, 0, FALSE);        \r
-    return Status;\r
-}\r
-\r
-\r
-/*++\r
-\r
-Routine Description:\r
-    \r
-    This function removes the Port from the global Port list\r
-    1. Not part of bundle (primary) if BundleId string is empty\r
-    2. Secondary - Remove it from primary's secondary Port list\r
-    3. Primary - If a secondary Port exists, promote the secondary\r
-    \r
-Arguments:\r
-\r
-    MiniportPortContext      Pointer to our Port\r
-\r
-Return Value:\r
-\r
-    None\r
-    \r
---*/\r
-VOID MpRemoveAdapterFromList(PMP_PORT Port)\r
-{\r
-    NDIS_STATUS Status;\r
-    ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Remove Adapter %p from the bundle\n", Port));\r
-\r
-    //\r
-    // Is this Port part of a bundle? Just remove it if not\r
-    //\r
-    if (Port->Config.psBundleId == NULL)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Adapter %p not in a bundle\n", Port));\r
-        return;\r
-    }\r
-\r
-    Status = KeWaitForSingleObject(&g_BundleEvent, Executive, KernelMode , FALSE, NULL);\r
-    ASSERT(Status == STATUS_SUCCESS);\r
-\r
-    //\r
-    // Check to see if it's secondary Port, need to remove it from primary \r
-    // Port's secondary list so the primary Port won't pass more packets \r
-    // to this Port\r
-    //\r
-    CBundleInfo* pBundle = Port->pBundleInfo; \r
-    ASSERT(pBundle != NULL);\r
-    \r
-    if (MP_TEST_FLAG(Port, fMP_PORT_SECONDARY))\r
-    {\r
-        //\r
-        // This is a secondary Port\r
-        //\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Remove secondary adapter %p from bundle %S\n", Port, Port->Config.psBundleId));\r
-        pBundle->RemoveSecondary(Port);\r
-    }\r
-    else        \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Remove Primary adapter %p from bundle %S\n", Port, Port->Config.psBundleId));\r
-        pBundle->PromoteSecondary(Port);\r
-    }\r
-\r
-    //\r
-    // Decrement reference on the port that we increment while insert the port to the list\r
-    //\r
-    Port->pBundleInfo = NULL;\r
-    DecPortRefCount(Port);\r
-\r
-    //\r
-    // Remove refernce count form the PORT\r
-    //\r
-    pBundle->DecRef();\r
-\r
-    KeSetEvent(&g_BundleEvent, 0, FALSE);        \r
-}\r
-\r
-\r
-void CBundleInfo::AddSecondary(PMP_PORT pPort)\r
-{\r
-    IncPortRefCount(pPort);\r
-    InsertTailList(&m_SecondaryList, &pPort->List);\r
-\r
-    //\r
-    // Invalid the mac address of the secondary port. We do it out of the spin lock \r
-    //            \r
-    u64 mac_ho ;\r
-    mac_to_be64(&mac_ho,(u64*)pPort->CurrentAddress);     \r
-    mtnic_SET_RX_RING_ADDR(pPort, pPort->priv.port, &mac_ho, NULL, false);\r
-\r
-    SetRssToSecondary(pPort, true);\r
-\r
-    NDIS_STATUS Status = NdisMSetMiniportSecondary(pPort->PortHandle, m_PrimaryPort->PortHandle);\r
-    ASSERT(Status == NDIS_STATUS_SUCCESS);\r
-}\r
-\r
-\r
-void CBundleInfo::RemoveSecondary(PMP_PORT pPort)\r
-{ \r
-    RemoveEntryList(&pPort->List);    \r
-\r
-    PMP_PORT sPort = m_UsedSecondaryPort;\r
-    \r
-    if (pPort == sPort)\r
-    {\r
-        //\r
-        // Need to find another seconary\r
-        //\r
-        ASSERT(m_PrimaryPort->priv.last_link_state == NdisMediaStateDisconnected);\r
-        ASSERT(m_link_state == NdisMediaStateConnected);\r
-        setBundleLink(pPort, NdisMediaStateDisconnected);\r
-    }\r
-}\r
-\r
-\r
-/*++\r
-\r
-Routine Description:\r
-    This function promotes a secondary miniport and sets up this new primary's\r
-    secondary Port list\r
-    \r
-Arguments:\r
-    MiniportAdapterContext      Pointer to our Port\r
-\r
-Return Value:    \r
-    None\r
-    \r
---*/\r
-void CBundleInfo::PromoteSecondary(PMP_PORT pPort)\r
-{\r
-    ASSERT(pPort == m_PrimaryPort);\r
-\r
-    m_PrimaryPort = NULL;\r
-\r
-    if (pPort->priv.last_link_state == NdisMediaStateConnected)\r
-    {\r
-        //\r
-        // Disable MAC address of the primary port\r
-        //\r
-        u64 mac_ho ;\r
-        mac_to_be64(&mac_ho,(u64*)pPort->CurrentAddress);     \r
-        mtnic_SET_RX_RING_ADDR(pPort, pPort->priv.port, &mac_ho, NULL, false);    \r
-    }\r
-    \r
-    //\r
-    // Promote a secondary Port\r
-    //\r
-    NdisAcquireSpinLock(&m_Lock);\r
-    m_UsedSecondaryPort = NULL;\r
-    NdisReleaseSpinLock(&m_Lock);\r
-\r
-    if (!IsListEmpty(&m_SecondaryList))\r
-    {\r
-        PLIST_ENTRY sList = RemoveHeadList(&m_SecondaryList); \r
-        PMP_PORT sPort = (PMP_PORT)sList;\r
-\r
-        ASSERT(sPort != NULL);\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Promote Port %p\n", sPort));\r
-\r
-        m_PrimaryPort = sPort;\r
-        MP_CLEAR_FLAG(sPort, fMP_PORT_SECONDARY);\r
-        \r
-        //\r
-        // set the MAC address of the Promoted Port\r
-        //\r
-        u64 mac_ho ;\r
-        mac_to_be64(&mac_ho,(u64*)sPort->CurrentAddress);     \r
-        mtnic_SET_RX_RING_ADDR(sPort, sPort->priv.port, &mac_ho, NULL, true);    \r
-\r
-        //\r
-        // Update LBFO link state\r
-        //\r
-        setBundleLink(sPort, sPort->priv.last_link_state);\r
-        \r
-        NDIS_STATUS Status = NdisMPromoteMiniport(sPort->PortHandle);\r
-        ASSERT(Status == NDIS_STATUS_SUCCESS);\r
-        return;\r
-    }\r
-\r
-    //\r
-    // The last entry in Bundle. Remove the entry form g_bundleList and decrement the refernce count\r
-    //\r
-    RemoveEntryList(&m_List);\r
-    DecRef();\r
-}\r
-\r
-\r
-NDIS_STATUS CBundleInfo::Init(PMP_PORT pPort)\r
-{\r
-    DWORD len = wcslen(pPort->Config.psBundleId);\r
-    m_BundleId = new WCHAR[len + 1];\r
-    if (m_BundleId == NULL)\r
-    {\r
-        return NDIS_STATUS_RESOURCES;\r
-    }\r
-    \r
-    wcsncpy(m_BundleId, pPort->Config.psBundleId, len);\r
-    m_BundleId[len] = L'\0';\r
-\r
-    //\r
-    // Increment PORT reference count so no one release it while we hold it\r
-    //\r
-    IncPortRefCount(pPort);\r
-    m_PrimaryPort = pPort;\r
-    m_link_state = pPort->priv.last_link_state;\r
-    if (pPort->priv.last_link_state == NdisMediaStateDisconnected)\r
-    {\r
-        //\r
-        // Disabled MAC address on primary port if its link down\r
-        //\r
-        u64 mac_ho ;\r
-        mac_to_be64(&mac_ho,(u64*)pPort->CurrentAddress);             \r
-        mtnic_SET_RX_RING_ADDR(pPort, pPort->priv.port, &mac_ho, NULL, false);    \r
-    }\r
-    \r
-    NdisAllocateSpinLock(&m_Lock);\r
-\r
-    return NDIS_STATUS_SUCCESS;\r
-}        \r
-\r
-void \r
-CBundleInfo::setBundleLink(\r
-    PMP_PORT  Port,\r
-    NDIS_MEDIA_STATE link_state\r
-    )\r
-{\r
-    NDIS_STATUS Status;\r
-\r
-    mtnic_priv *priv = &Port->priv;\r
-    NDIS_MEDIA_STATE prevLinkState = priv->last_link_state;\r
-    priv->last_link_state = link_state;\r
-    PMP_PORT pPrimary = m_PrimaryPort;\r
-\r
-    if (pPrimary == NULL)\r
-    {\r
-        m_link_state = NdisMediaStateDisconnected;\r
-        return;\r
-    }\r
-\r
-    IncPortRefCount(pPrimary);\r
-    PMP_PORT pSecondaryPort = GetSecondaryPort();\r
-    PMP_PORT pNewSecondaryPort = pSecondaryPort;\r
-\r
-    //\r
-    // If the bundle is connected but the primary change its state from disconnected \r
-    // to connected we want to handle it and return the contol to primary port\r
-    // \r
-    if ((link_state == m_link_state) &&\r
-        ((pSecondaryPort == NULL) || (pPrimary!= Port) || (m_link_state == NdisMediaStateDisconnected)))\r
-    {\r
-        if (pSecondaryPort)\r
-        {\r
-            DecPortRefCount(pSecondaryPort);\r
-        }\r
-        DecPortRefCount(pPrimary);\r
-        return;\r
-    }\r
-    \r
-    u64 mac_ho ;\r
-    mac_to_be64(&mac_ho,(u64*)pPrimary->CurrentAddress);   \r
-\r
-    //\r
-    // Check if the bundle state should be changed. It can happen if the bundle \r
-    // state is disconnected and one of the ports become connected or the bundle \r
-    // is connected and one the last port is disconnected\r
-    //\r
-    if (link_state == NdisMediaStateConnected) \r
-    {\r
-        //\r
-        // The bundle was disconnected and one of the ports becomes connected\r
-        //\r
-        if (Port == pPrimary)\r
-        {\r
-            //\r
-            // The primary connection link come up. \r
-            //\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Primary port connected. Disabled secondaary\n"));\r
-            if (pSecondaryPort != NULL)\r
-            {\r
-                //\r
-                // Disable MAC address from secondary port\r
-                //\r
-                DisabledPort(pPrimary, pSecondaryPort);\r
-            }\r
-            pNewSecondaryPort = NULL;\r
-            mtnic_SET_RX_RING_ADDR(Port, Port->priv.port, &mac_ho, NULL, true);            \r
-        }\r
-        else\r
-        {\r
-            //\r
-            // The bundle is disconnected and one of the secondary ports comes up.\r
-            // Mark it as the used port and set it address to the bundle address\r
-            //\r
-            ASSERT(pSecondaryPort == NULL);\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Secondary port connected. the bundle status was disabled . Enabled secondary\n"));\r
-            pNewSecondaryPort = Port;\r
-            EnabledPort(pPrimary, Port);\r
-        }\r
-\r
-        if (m_link_state == NdisMediaStateDisconnected)\r
-        {\r
-            //\r
-            // The pervious state of the bundle is disconnected. change the state status \r
-            // to connect since there is at least one port that is connected\r
-            //\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Port %d - link up\n", m_PrimaryPort->priv.port + 1));\r
-            NdisMIndicateStatus(m_PrimaryPort->PortHandle, NDIS_STATUS_MEDIA_CONNECT, (PVOID)0, 0);    \r
-            NdisMIndicateStatusComplete(m_PrimaryPort->PortHandle);        \r
-            m_link_state = NdisMediaStateConnected;\r
-        }\r
-    }\r
-    else\r
-    {\r
-        if(pSecondaryPort == Port)\r
-        {\r
-            //\r
-            // The secondary connection link come down. remove secondaty\r
-            //\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("The secondary connection come down. disabled secondary\n"));\r
-            DisabledPort(pPrimary, m_UsedSecondaryPort);\r
-            pNewSecondaryPort = NULL;\r
-        }\r
-\r
-        if ((Port == pPrimary) && (prevLinkState == NdisMediaStateConnected))\r
-        {\r
-            //\r
-            // The primary connection link come down. remove Address\r
-            //\r
-            ASSERT(pSecondaryPort == NULL);\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("The primary connection come down. disabled address\n"));\r
-            mtnic_SET_RX_RING_ADDR(Port, Port->priv.port, &mac_ho, NULL, false);    \r
-            pNewSecondaryPort = NULL;\r
-        }\r
-        \r
-        //\r
-        // The primary connection is disconnected and there is no secondary,\r
-        // looks for a secondary port that can take ownership\r
-        //\r
-        if ((m_PrimaryPort->priv.last_link_state != NdisMediaStateConnected) &&\r
-            (pSecondaryPort == NULL))\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Primary is diconnected. Look for secondary connection\n"));\r
-            \r
-            PMP_PORT sPort =  (PMP_PORT)GetListHeadEntry(&m_SecondaryList);\r
-            while ((PLIST_ENTRY)sPort != &m_SecondaryList)\r
-            {\r
-                if (sPort->priv.last_link_state == NdisMediaStateConnected)\r
-                {\r
-                    break;\r
-                }\r
-            \r
-                sPort = (PMP_PORT)GetListFLink((PLIST_ENTRY)sPort);   \r
-            }\r
-\r
-            if ((PLIST_ENTRY)sPort == &m_SecondaryList)\r
-            {\r
-                if (m_link_state == NdisMediaStateConnected)\r
-                {\r
-                    // \r
-                    // No port was found. Report the bundle as disconnected\r
-                    //\r
-                    ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Don't find secondary. Mark the budle as disconnected\n"));\r
-                    ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Port %d - link down\n", m_PrimaryPort->priv.port + 1));\r
-                    NdisMIndicateStatus(m_PrimaryPort->PortHandle, NDIS_STATUS_MEDIA_DISCONNECT, (PVOID)0, 0);\r
-                    NdisMIndicateStatusComplete(m_PrimaryPort->PortHandle);            \r
-                    m_link_state = NdisMediaStateDisconnected;                \r
-                    pNewSecondaryPort = NULL;\r
-                }\r
-            }\r
-            else\r
-            {\r
-                //\r
-                // Secondary port was found. mark it and set it's address to the bundle address\r
-                //\r
-                ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_LBFO, ("Port %d - link up\n", m_PrimaryPort->priv.port + 1));\r
-                ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH,( "found a secondary connection, Port %d. set the mac address\n", sPort->priv.port + 1));\r
-                pNewSecondaryPort = sPort;\r
-                EnabledPort(pPrimary, sPort);    \r
-            }\r
-        }\r
-    }\r
-\r
-    if (pNewSecondaryPort != pSecondaryPort)\r
-    {\r
-        NdisAcquireSpinLock(&m_Lock);\r
-        m_UsedSecondaryPort = pNewSecondaryPort;\r
-        NdisReleaseSpinLock(&m_Lock);\r
-    }\r
-    \r
-    if (pSecondaryPort)\r
-    {\r
-        DecPortRefCount(pSecondaryPort);\r
-    }\r
-\r
-    DecPortRefCount(pPrimary);\r
-}\r
-\r
-\r
-bool CBundleInfo::IsOffloadingTaskMatched(PMP_PORT pPort)\r
-{\r
-    if (pPort == m_PrimaryPort)\r
-    {\r
-        return true;\r
-    }\r
-    \r
-    BOOLEAN TxChksumOffload = MP_GET_PORT_CONFIG(m_PrimaryPort, TxChksumOffload);\r
-    BOOLEAN RxChksumOffload = MP_GET_PORT_CONFIG(m_PrimaryPort, RxChksumOffload);\r
-    BOOLEAN fLargeSendOffload = MP_GET_PORT_CONFIG(m_PrimaryPort, LargeSendOffload);\r
-    LONG lRssMode = MP_GET_PORT_CONFIG(m_PrimaryPort, RssMode);\r
-    \r
-    if (TxChksumOffload != MP_GET_PORT_CONFIG(pPort, TxChksumOffload))\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_WARNING, ETH, ("Tx checksum of port %p doesn't matched the primary\n", pPort));\r
-        return false;\r
-    }\r
-    \r
-    if (RxChksumOffload != MP_GET_PORT_CONFIG(pPort, RxChksumOffload))\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_WARNING, ETH, ("Rx checksum of port %p doesn't matched the primary\n", pPort));\r
-        return false;\r
-    }\r
-    \r
-    if (fLargeSendOffload != MP_GET_PORT_CONFIG(pPort, LargeSendOffload))\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_WARNING, ETH, ("LSO of port %p doesn't matched the primary\n", pPort));\r
-        return false;\r
-    }\r
-\r
-    if (lRssMode != MP_GET_PORT_CONFIG(pPort, RssMode))\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_WARNING, ETH, ("RSS of port %p doesn't matched the primary\n", pPort));\r
-        return false;\r
-    }\r
-    \r
-    return true;\r
-}\r
-\r
-\r
-void CBundleInfo::EnabledPort(PMP_PORT pPrimaryPort,PMP_PORT sPort)\r
-{\r
-    NDIS_STATUS Status;\r
-    ULONG ulBytesNeeded;\r
-    Status = SetPacketFilterInformation(\r
-                            sPort,\r
-                            &pPrimaryPort->PacketFilter,\r
-                            sizeof(ULONG),\r
-                            &ulBytesNeeded\r
-                            );    \r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_LBFO, ("Failed to set Packet filter = 0x%x to the secondary Port: %p. Reset the NIC\n", pPrimaryPort->PacketFilter, sPort));        \r
-    }\r
-    \r
-    \r
-    Status = SetMulticastInformation(\r
-                            sPort,\r
-                            pPrimaryPort->MCList,\r
-                            pPrimaryPort->MCAddressCount * ETH_LENGTH_OF_ADDRESS,\r
-                            &ulBytesNeeded\r
-                            );\r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_LBFO, ("Failed to set multicast address list to the secondary Port: %p. Reset the NIC\n", sPort));        \r
-    }\r
-\r
-    u64 mac_ho ;\r
-    mac_to_be64(&mac_ho,(u64*)pPrimaryPort->CurrentAddress);   \r
-    mtnic_SET_RX_RING_ADDR(sPort, sPort->priv.port, &mac_ho, NULL, true);        \r
-}\r
-\r
-\r
-void CBundleInfo::DisabledPort(PMP_PORT pPrimaryPort, PMP_PORT sPort)\r
-{\r
-    NDIS_STATUS Status;\r
-    ULONG ulPacketFilter = 0;\r
-    ULONG ulBytesNeeded;\r
-    Status = SetPacketFilterInformation(\r
-                            sPort,\r
-                            &ulPacketFilter,\r
-                            sizeof(ULONG),\r
-                            &ulBytesNeeded\r
-                            );    \r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_LBFO, ("Failed to set Packet filter = 0x%x to the secondary Port: %p. Reset the NIC\n", pPrimaryPort->PacketFilter, sPort));        \r
-    }\r
-\r
-    u64 mac_ho ;\r
-    mac_to_be64(&mac_ho,(u64*)pPrimaryPort->CurrentAddress);   \r
-    mtnic_SET_RX_RING_ADDR(sPort, sPort->priv.port, &mac_ho, NULL, false);\r
-}\r
-\r
-\r
-NDIS_STATUS CBundleInfo::SetRssToSecondary(PMP_PORT sPort, bool fHashChanged)\r
-{\r
-    NDIS_STATUS Status;\r
-    mtnic_rss_map* pRss = &m_PrimaryPort->priv.rss_map;\r
-\r
-    if (fHashChanged)\r
-    {\r
-        Status = mtnic_CONFIG_PORT_RSS_STEER(\r
-                            sPort, \r
-                            sPort->priv.port, \r
-                            pRss->map_size ,\r
-                            pRss->hash_type, \r
-                            pRss->key_size,\r
-                            pRss->key\r
-                            );\r
-        if (! NT_SUCCESS(Status))\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to set the RSS configuration to secondary port %P, Error=0x%x\n", sPort, Status));\r
-            return NDIS_STATUS_HARD_ERRORS;\r
-        }\r
-    }\r
-\r
-    Status = mtnic_SET_PORT_RSS_INDIRECTION(\r
-                        sPort,\r
-                        sPort->priv.port, \r
-                        pRss->map_size, \r
-                        pRss->map\r
-                        );\r
-    if (! NT_SUCCESS(Status))\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to set the RSS configuration, Error=0x%x\n", Status));\r
-        return NDIS_STATUS_HARD_ERRORS;\r
-    }\r
-        \r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-NDIS_STATUS CBundleInfo::SetRssToSecondaries(bool fHashChanged)\r
-{\r
-    NDIS_STATUS Status;\r
-    mtnic_rss_map* pRss = &m_PrimaryPort->priv.rss_map;\r
-\r
-    PMP_PORT sPort =  (PMP_PORT)GetListHeadEntry(&m_SecondaryList);\r
-    while ((PLIST_ENTRY)sPort != &m_SecondaryList)\r
-    {\r
-        Status = SetRssToSecondary(sPort, fHashChanged);\r
-        if (! NT_SUCCESS(Status))\r
-        {\r
-            return NDIS_STATUS_HARD_ERRORS;\r
-        }\r
-        sPort = (PMP_PORT)GetListFLink((PLIST_ENTRY)sPort);   \r
-    }\r
-\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_lbfo.h b/hw/mlx4/kernel/eth/mp_lbfo.h
deleted file mode 100644 (file)
index 3c70c4b..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2007 Mellanox Technologies. All rights reserved.\r
-\r
-Module Name:\r
-    mp_lbfo.h\r
-\r
-Abstract:\r
-    This module contains decleration LBFO functions and data structures\r
-    \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-#pragma once\r
-\r
-extern LIST_ENTRY g_BundleList;\r
-extern KEVENT g_BundleEvent;\r
-\r
-NDIS_STATUS MpAddAdapterToList(PMP_PORT Port);\r
-VOID MpRemoveAdapterFromList(PMP_PORT Port);\r
-\r
-class CBundleInfo\r
-{\r
-public:\r
-    CBundleInfo() :\r
-        m_PrimaryPort(NULL),\r
-        m_UsedSecondaryPort(NULL),\r
-        m_link_state(NdisMediaStateDisconnected),\r
-        m_RefCount(1),\r
-        m_BundleId(NULL)\r
-    {\r
-        InitializeListHead(&m_SecondaryList);\r
-    }\r
-\r
-    ~CBundleInfo()\r
-    {\r
-        ASSERT(IsListEmpty(&m_SecondaryList));\r
-        ASSERT(m_RefCount == 0);\r
-        ASSERT(m_PrimaryPort == NULL);\r
-        ASSERT(m_UsedSecondaryPort == NULL);\r
-        \r
-        if (m_BundleId != NULL)\r
-        {\r
-            delete [] m_BundleId;\r
-        }\r
-        \r
-        NdisFreeSpinLock(&m_Lock);  \r
-    }\r
-    \r
-    void AddRef(void)\r
-    {\r
-        NdisInterlockedIncrement(&m_RefCount);\r
-    }\r
-    \r
-    void DecRef(void)\r
-    {\r
-        ASSERT(m_RefCount > 0);\r
-        LONG count =  NdisInterlockedDecrement(&m_RefCount);\r
-        if (count == 0)\r
-        {\r
-            delete this;\r
-        }\r
-    }\r
-\r
-    PMP_PORT GetPrimaryPort(void)\r
-    {\r
-        if (m_PrimaryPort == NULL)\r
-        {\r
-            return NULL;\r
-        }\r
-        IncPortRefCount(m_PrimaryPort);\r
-        return m_PrimaryPort;\r
-    }\r
-\r
-    PMP_PORT GetSecondaryPort(void)\r
-    {\r
-        NdisAcquireSpinLock(&m_Lock);\r
-        PMP_PORT sPort = m_UsedSecondaryPort;\r
-        if (sPort)\r
-        {\r
-            IncPortRefCount(sPort);\r
-        }\r
-        NdisReleaseSpinLock(&m_Lock);\r
-        return sPort;\r
-    }\r
-    \r
-    NDIS_MEDIA_STATE GetLinkState(void) const\r
-    {\r
-        return m_link_state;\r
-    }\r
-\r
-    LPWSTR GetBundleId(void)\r
-    {\r
-        return m_BundleId;\r
-    }\r
-    \r
-    void AddSecondary(PMP_PORT pPort);\r
-    void RemoveSecondary(PMP_PORT pPort);\r
-    void PromoteSecondary(PMP_PORT pPort);    \r
-    NDIS_STATUS Init(PMP_PORT pPort);\r
-    bool IsOffloadingTaskMatched(PMP_PORT pPort);\r
-    void setBundleLink(PMP_PORT  Port, NDIS_MEDIA_STATE link_state);\r
-    NDIS_STATUS SetRssToSecondaries(bool fHashChanged);\r
-    \r
-private:\r
-    void EnabledPort(PMP_PORT pPrimaryPort, PMP_PORT sPort);    \r
-    void DisabledPort(PMP_PORT pPrimaryPort, PMP_PORT sPort);\r
-    NDIS_STATUS SetRssToSecondary(PMP_PORT sPort, bool fHashChanged);\r
-\r
-public:    \r
-    LIST_ENTRY              m_List;\r
-\r
-private:\r
-    PMP_PORT                m_PrimaryPort;\r
-    LIST_ENTRY              m_SecondaryList;\r
-    PMP_PORT                m_UsedSecondaryPort;\r
-    LONG                    m_RefCount;\r
-    NDIS_SPIN_LOCK          m_Lock;\r
-    LPWSTR                  m_BundleId;\r
-    NDIS_MEDIA_STATE        m_link_state;\r
-};\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_log.mc b/hw/mlx4/kernel/eth/mp_log.mc
deleted file mode 100644 (file)
index 7e8f565..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-;/*++\r
-;=============================================================================\r
-;Copyright (c) 2001 Mellanox Technologies\r
-;\r
-;This source code may incorporate intellectual property owned by\r
-;Microsoft Corporation. Our provision of this source code does not\r
-;include any licenses or any other rights to you under any Microsoft\r
-;intellectual property. If you would like a license from Microsoft\r
-;(e.g., to rebrand, redistribute), you need to contact Microsoft\r
-;directly.\r
-;\r
-;Module Name:\r
-;\r
-;    MtnicLog.mc\r
-;\r
-;Abstract:\r
-;\r
-;    MTNIC Driver event log messages\r
-;\r
-;=============================================================================\r
-;--*/\r
-;\r
-MessageIdTypedef = NDIS_ERROR_CODE\r
-\r
-SeverityNames = (\r
-       Success                 = 0x0:STATUS_SEVERITY_SUCCESS\r
-       Informational   = 0x1:STATUS_SEVERITY_INFORMATIONAL\r
-       Warning                 = 0x2:STATUS_SEVERITY_WARNING\r
-       Error                   = 0x3:STATUS_SEVERITY_ERROR\r
-       )\r
-\r
-FacilityNames = (\r
-       System                  = 0x0\r
-       RpcRuntime              = 0x2:FACILITY_RPC_RUNTIME\r
-       RpcStubs                = 0x3:FACILITY_RPC_STUBS\r
-       Io                              = 0x4:FACILITY_IO_ERROR_CODE\r
-       MTNIC           = 0x7:FACILITY_MTNIC_ERROR_CODE\r
-       )\r
-\r
-\r
-MessageId=0x0001\r
-Facility=MTNIC\r
-Severity=Informational\r
-SymbolicName=MTNIC_EVENT_LOG_LOAD_OK\r
-Language=English\r
-%2 device has been successfully initialized and enabled.\r
-.\r
-\r
-MessageId=0x0002\r
-Facility=MTNIC\r
-Severity=ERROR\r
-SymbolicName=MTNIC_EVENT_LOG_LOAD_FAIL\r
-Language=English\r
-Failed to initialize Mellanox ConnectX EN 10Gigabit Ethernet Adapter Port %2.\r
-.\r
-\r
-MessageId=0x0003\r
-Facility=MTNIC\r
-Severity=Informational\r
-SymbolicName=MTNIC_EVENT_LOG_MAC_ADDRESS\r
-Language=English\r
-%2 device has been successfully initialized and enabled. The port's network address is %3.\r
-.\r
-\r
-MessageId=0x0004\r
-Facility=MTNIC\r
-Severity=ERROR\r
-SymbolicName=MTNIC_EVENT_LOG_RSS_MISMATCH\r
-Language=English\r
-%2 device has been configured to use RSS while Windows' TCP RSS is disabled. This configuration prevents the initialization and enabling of the port. You need to either enable Windows' TCP RSS, or configure the adapter's port to disable RSS. For details, see the WinEth User's Manual at  http://www.mellanox.com under WinEth downloads.\r
-.\r
-\r
-MessageId=0x0005\r
-Facility=MTNIC\r
-Severity=Warning\r
-SymbolicName=MTNIC_EVENT_LOG_RESET\r
-Language=English\r
-The Mellanox ConnectX EN 10Gigabit Ethernet NIC was reset.\r
-.\r
-\r
-MessageId=0x0006\r
-Facility=MTNIC\r
-Severity=Error\r
-SymbolicName=MTNIC_EVENT_LOG_RESET_FAIL\r
-Language=English\r
-Failed to reset the Mellanox ConnectX EN 10Gigabit Ethernet NIC. Try disabling then reenabling the \"Mellanox Ethernet Bus Driver\" device via the Windows device manager.\r
-.\r
-\r
-MessageId=0x0007\r
-Facility=MTNIC\r
-Severity=Informational\r
-SymbolicName=MTNIC_EVENT_LOG_DISABLED\r
-Language=English\r
-%2 device has been successfully stopped.\r
-.\r
-\r
-MessageId=0x0008\r
-Facility=MTNIC\r
-Severity=Warning\r
-SymbolicName=MTNIC_EVENT_LOG_HA_CONFIG_MISMATCH\r
-Language=English\r
-%2 device failed to joined to bundle %3. The adapter task offloading or RSS mode configuration does not match the primary port configuration. To fix the problem, configure the task offloading and RSS mode of  all the adapters in the bundle to be the same.  \r
-.\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_lro.cpp b/hw/mlx4/kernel/eth/mp_lro.cpp
deleted file mode 100644 (file)
index 91c9e29..0000000
+++ /dev/null
@@ -1,1614 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2007 Mellanox Technologies. All rights reserved.\r
-\r
-Module Name:\r
-    mp_lro.cpp\r
-\r
-Abstract:\r
-    This module contains handling of LRO algorithm\r
-    \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#include "mp_lro.tmh"\r
-#endif\r
-\r
-#include "mtnic_if_defs.h"\r
-\r
-#define _FILENUMBER     ' LRO'\r
-\r
-#define TCPIP_MASK_32          0x1fc00003\r
-#define MTNIC_BIT_IPOK_32      (MTNIC_BIT_IPOK << 24)\r
-#define MTNIC_BIT_TCP_32       (MTNIC_BIT_TCP << 24)\r
-#define MTNIC_BIT_IPV4_32      (MTNIC_BIT_IPV4 << 16)\r
-#define LRO_MASK_32            (MTNIC_BIT_IPV4_32 | MTNIC_BIT_TCP_32 | MTNIC_BIT_IPOK_32)\r
-\r
-#define MIN_LRO_LENGTH (ETH_HLEN + sizeof(IPHeader) + sizeof(TCPHeader))\r
-\r
-//\r
-// Forward decleration\r
-//\r
-mtnic_lro*\r
-mtnic_lro_alloc_session( \r
-    mtnic_rx_ring* ring\r
-    );\r
-\r
-//\r
-// LRO hash function - using sum of source and destination port LSBs is\r
-// good enough \r
-//\r
-#define LRO_INDEX(th, size) \\r
-       ((*((u8*) &th->tcp_src + 1) + *((u8*) &th->tcp_dest + 1)) & (size - 1))\r
-\r
-#ifdef DBG\r
-\r
-static VOID\r
-PrintPacketBuffers(\r
-    PNDIS_PACKET packet\r
-    )\r
-{\r
-    ULONG PhysBufCount;\r
-    ULONG PacketLength;\r
-    PNDIS_BUFFER buf;\r
-    NdisQueryPacket(packet, (PUINT)&PhysBufCount, NULL, &buf, (PUINT)&PacketLength);\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("Packet = 0x%p, PhysBufCount = %d, PacketLength = %d\n", packet, PhysBufCount, PacketLength));\r
-\r
-    ULONG i = 1;\r
-    while (buf != NULL) \r
-    {\r
-        void* va = MmGetMdlVirtualAddress(buf);\r
-        ULONG offset = MmGetMdlByteOffset(buf);\r
-        ULONG size = MmGetMdlByteCount(buf);\r
-\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("BUFF%d: basic virtual address = 0x%p, offset = %d, size = %d\n", i, va, offset, size));\r
-        i++;\r
-        NdisGetNextBuffer(buf, &buf);\r
-    }\r
-}\r
-#else\r
-    #define PrintPacketBuffers(Packet)\r
-#endif\r
-\r
-/*++\r
-Routine Description:\r
-    Calculate the IP checksum\r
-    \r
-Arguments:\r
-    iph       Pointer to the IP header\r
-\r
-Return Value:\r
-    Checksum value\r
-    \r
---*/ \r
-USHORT\r
-mtnic_lro::CalculateIpChecksum(\r
-    IPHeader* iph\r
-    )\r
-{\r
-    ULONG  xsum = 0;\r
-\r
-    PUSHORT  WordPtr = (PUSHORT)(iph);                     \r
-    for(ULONG WordCount = (sizeof(IPHeader) >> 1); WordCount> 0; --WordCount)\r
-    {                                                      \r
-        xsum += *WordPtr;                              \r
-    }                                                      \r
-\r
-    xsum = (((xsum >> 16) | (xsum << 16)) + xsum) >> 16;   \r
-    return ~(USHORT)xsum;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    the routine returns the packet to the free list and initialize the packet parameters\r
-    \r
-Arguments:\r
-    None.\r
-\r
-Return Value:\r
-    none.\r
-    \r
---*/ \r
-void mtnic_lro::ReturnSession(void)\r
-{\r
-    ASSERT(m_hashIndex == -1);\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: return session 0x%p to free list\n", this));\r
-\r
-    m_buff.Init();\r
-    \r
-    NdisAcquireSpinLock(&m_pRing->m_cs_lro);    \r
-#if DBG\r
-    ASSERT((m_node.Flink == NULL) && (m_node.Blink == NULL));\r
-    ASSERT((m_flush_node.Flink == NULL) && (m_flush_node.Blink == NULL));\r
-#endif\r
-    m_pRing->lro_free.InsertHeadList(&m_node);\r
-    NdisReleaseSpinLock(&m_pRing->m_cs_lro);\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine pushes the lro packets up to the stack. Before it should update the packet properties\r
-    and set checksum as valid.\r
-    The routine can be called when a specific session should be flush due to lack of memeory or packets \r
-    that doesn't match the LRO session properties. The function also can be called as part of flushing \r
-    all the LRO sessions. In such a case we don't want to push up the packets of each session seperatly,\\r
-    but consulidate all the packet to one array and push it up to NDIS once.\r
-\r
-Arguments:\r
-    ppPackets - pointer to NDIS_PACKET array. It's not NULL only when we flush all the sessions\r
-    ulPacketCount - Number of packets that added to the array\r
-    \r
-Return Value:\r
-    None    \r
---*/ \r
-void \r
-mtnic_lro::Flush(\r
-    bool fLroModeMini, \r
-    PNDIS_PACKET* ppPackets,                // = NULL\r
-    UINT* ulPacketCount                     // = NULL\r
-)\r
-{\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Flushing session - saddr:0x%x daddr:0x%x sport:%d dport:%d\n",\r
-          be32_to_cpu(m_saddr), be32_to_cpu(m_daddr),\r
-          be16_to_cpu(*((__be16*) &m_sport_dport)), be16_to_cpu(*((__be16*) &m_sport_dport + 1))));\r
-\r
-    if ((m_buff.GetNumberOfPackets() > 1) && !fLroModeMini)\r
-    {\r
-        PVOID data = m_buff.GetData(false);\r
-        ASSERT(data != NULL);\r
-        \r
-        IPHeader* iph = (IPHeader*) ((PUCHAR)data + ETH_HLEN);\r
-        TCPHeader* th = (TCPHeader*)(iph+1);\r
-        \r
-        //\r
-        // Update IP length and checksum \r
-        //\r
-        iph->iph_length = cpu_to_be16(m_tot_len);\r
-        iph->iph_xsum = 0;      // Rest checksum so it doesn't take into account in checksum calculation\r
-        iph->iph_xsum = CalculateIpChecksum(iph);\r
-\r
-        //\r
-        // Update latest TCP ack, window, psh, and timestamp \r
-        //\r
-        th->tcp_ack = m_ack_seq;\r
-        th->tcp_window = m_window;\r
-        th->psh = !!m_psh;\r
-        if (m_fTimestamp) \r
-        {\r
-            u32* ts = (u32 *) (th + 1);\r
-            #pragma prefast(suppress:28193, "any value is valid")\r
-            ts[1] = cpu_to_be32(m_tsval);\r
-            ts[2] = m_tsecr;\r
-        }\r
-\r
-        u16 len = ETH_HLEN + be16_to_cpu(iph->iph_length);\r
-        NdisAdjustBufferLength(m_buff.GetLroBuffer(false), len);\r
-\r
-        AVG_PERF_COUNTER(&m_Port->perf_counters.lro_size_avg, len);        \r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Flushing session 0x%p - coalesce %d packets\n", this, m_buff.GetNumberOfCaolescePackets()));\r
-\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Flushing LRO session - seq:%d tot_len:%d window:%d ack:%d next_seq:%d\n",\r
-                    be32_to_cpu(th->tcp_seq), m_tot_len, be16_to_cpu(th->tcp_window), \r
-                    be32_to_cpu(th->tcp_ack), m_next_seq));        \r
-    }\r
-    \r
-    //\r
-    // Move the LRO session from the list. It should be done before calling to \r
-    // NdisMIndicateReceivePacket otherwise the completion can be called before we remove the \r
-    // session from the existing lists and it can mess the lists\r
-    //\r
-    m_pRing->lro_hash[m_hashIndex].RemoveEntryList(&m_node);\r
-    m_hashIndex = -1;\r
-    \r
-#if DBG        \r
-    m_node.Flink = NULL;        \r
-    m_node.Blink = NULL;        \r
-#endif        \r
-    m_pRing->lro_flush.RemoveEntryList(&m_flush_node);\r
-#if DBG        \r
-    m_flush_node.Flink = NULL;        \r
-    m_flush_node.Blink = NULL;        \r
-#endif        \r
-\r
-    //\r
-    // NDIS_STATUS_SUCCESS\r
-    //\r
-    PNDIS_PACKET* PacketArray = m_buff.GetPacketArray();\r
-    NDIS_TCP_IP_CHECKSUM_PACKET_INFO chksum;\r
-    chksum.Value = 0x38;  // NdisPacketTcpChecksumSucceeded, NdisPacketIpChecksumSucceeded\r
-    for (ULONG i = 0; i < m_buff.GetNumberOfPackets(); ++i)\r
-    {\r
-        NDIS_SET_PACKET_STATUS(PacketArray[i], NDIS_STATUS_SUCCESS);\r
-        NDIS_PER_PACKET_INFO_FROM_PACKET(PacketArray[i], TcpIpChecksumPacketInfo) = (void*)(uintn_t)(chksum.Value);\r
-    }\r
-\r
-    //\r
-    // Push it up the stack \r
-    //\r
-    ASSERT(m_Port != NULL);\r
-    if (ppPackets == NULL)\r
-    {\r
-#ifdef LBFO\r
-        PMP_PORT pPort = NULL;\r
-        if (m_Port->pBundleInfo)\r
-        {\r
-            pPort = m_Port->pBundleInfo->GetPrimaryPort();\r
-        }\r
-        if (pPort == NULL)\r
-        {\r
-            IncPortRefCount(m_Port);\r
-            pPort = m_Port;\r
-        }\r
-#else\r
-        PMP_PORT pPort = Port;\r
-#endif\r
-    \r
-        INC_PERF_COUNTER(m_Port->perf_counters.lro_flushes);\r
-        AVG_PERF_COUNTER(&m_Port->perf_counters.rxIndicateNumber, m_buff.GetNumberOfPackets());        \r
-        ADD_PERF_COUNTER(m_Port->perf_counters.rx_ndis_indicate, m_buff.GetNumberOfPackets());\r
-        NdisMIndicateReceivePacket(pPort->PortHandle, PacketArray, m_buff.GetNumberOfPackets());\r
-\r
-#ifdef LBFO\r
-        DecPortRefCount(pPort);\r
-#endif\r
-\r
-    }\r
-    else\r
-    {\r
-        m_buff.GetPackets(ppPackets);\r
-        *ulPacketCount = m_buff.GetNumberOfPackets();\r
-    }\r
-\r
-    if((m_buff.GetNumberOfPackets() == 1) || fLroModeMini)\r
-    {\r
-        //\r
-        // we don't coalesce packets. we can return the lro session object to the pull\r
-        //\r
-        ReturnSession();\r
-    }\r
-\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Thre routine returns pointer to IP and TCP headers of the packet.\r
-    We already know that the packet is DIX Ethernet/IPv4/TCP with no VLAN \r
-    (HW stripped it) and no IP options \r
-    \r
-Arguments:\r
-    Pcaket - NDIS Packet object\r
-    ppIPHeader - pointer in which the IP header is returned\r
-    ppTcpHeader - pointer in which the TCP header is returned\r
-\r
-Return Value:\r
-    None\r
-    \r
---*/\r
-static\r
-NTSTATUS\r
-GetHeaders(\r
-    PNDIS_PACKET Packet,\r
-    IPHeader** ppIpHeader,\r
-    TCPHeader** ppTcpHeader\r
-)\r
-{\r
-    ULONG PhysBufCount;\r
-    ULONG PacketLength;\r
-    PNDIS_BUFFER FirstBuffer;\r
-    NdisQueryPacket(Packet, (PUINT)&PhysBufCount, NULL, &FirstBuffer, (PUINT)&PacketLength);\r
-\r
-    ASSERT(PhysBufCount);\r
-    ASSERT(FirstBuffer);\r
-    ASSERT(PacketLength);\r
-    ASSERT(PacketLength >= (ETH_HLEN + sizeof(IPHeader) + sizeof(TCPHeader)));\r
-    \r
-    PUCHAR va;\r
-    ULONG Length;\r
-    NdisQueryBufferSafe(FirstBuffer, &va, &Length, NormalPagePriority);\r
-\r
-    if(va == NULL)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("LRO: NdisQueryBufferSafe failed. System resources are low or exhausted\n"));\r
-        return STATUS_UNSUCCESSFUL;\r
-    }\r
-    \r
-    IPHeader* iph = (IPHeader*)(va + ETH_HLEN);\r
-    TCPHeader* th = (TCPHeader *)(iph + 1);\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: ip(tot_len:%d off:0x%d saddr:0x%x daddr:0x%x)\n",\r
-            be16_to_cpu(iph->iph_length), be16_to_cpu(iph->iph_offset),\r
-            be32_to_cpu(iph->iph_src), be32_to_cpu(iph->iph_dest)));\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: tcp(sport:%d dport:%d seq:%d ack:%u win:%u flags:0x%x)\n",\r
-            be16_to_cpu(th->tcp_src), be16_to_cpu(th->tcp_dest),\r
-            be32_to_cpu(th->tcp_seq), be32_to_cpu(th->tcp_ack),\r
-            be16_to_cpu(th->tcp_window), be16_to_cpu(th->tcp_flags)));\r
-\r
-    *ppIpHeader = iph;\r
-    *ppTcpHeader = th;\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-/*++\r
-Routine Description:\r
-    The routine checks that the new packet matches the previous packets in existing LRO session. \r
-    The routine checks the following parameters:\r
-        - VLAN: 1. the new packet and previous packets have the same VLAN tag\r
-                2. If VLAN exist, checks that the vlan priority is the same\r
-        - Sequence number\r
-        - Check time stamp: If time stamp exist in current packet, the time stamp \r
-                            should be higher than previous one. The echo reply timestamp \r
-                            should be 0.\r
-    \r
-Arguments:\r
-    cqe - Complition queue entry\r
-    lro - lro sessions. contains the parameters of previous connections\r
-    seq - sequence number of current packet\r
-    tsval - time stamp of current packet. If the time stamp isn't part of current packet the \r
-            value is -1 and it indicates that the timestamp option isn't exist\r
-    tsecr - echo time stamp value\r
-    \r
-Return Value:\r
-    TRUE - if packets match\r
-    \r
---*/\r
-BOOLEAN    \r
-mtnic_lro::IsPacketMatchPreviousPackets(\r
-    mtnic_cqe *cqe,\r
-    int seq,\r
-    u32 tsval,\r
-    u32 tsecr\r
-    )\r
-{\r
-    //\r
-    // Check VLAN tag \r
-    //\r
-    if (((cqe->vp & MTNIC_BIT_VLANN_PRESENT) && !m_fVlan) ||\r
-        (!(cqe->vp & MTNIC_BIT_VLANN_PRESENT) && m_fVlan))\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_RECV, ("LRO:  VLAN mismatch. LRO vlan: %d, Packet vlan %d\n", m_fVlan, ((cqe->vp & MTNIC_BIT_VLANN_PRESENT) != 0)));\r
-        return FALSE;\r
-    }\r
-\r
-    if (m_fVlan && (cqe->vlan_prio != m_vlan_prio)) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_RECV, ("LRO:  VLAN priority mismatch - tag found:0x%x expected:0x%x\n",\r
-              be16_to_cpu(cqe->vlan_prio), be16_to_cpu(m_vlan_prio)));\r
-        return FALSE;\r
-    }\r
-\r
-    // \r
-    // Check sequence number \r
-    //\r
-    if (seq != m_next_seq)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("LRO:  Sequence mismatch (found: %d, expected:%d)\n", seq, m_next_seq));\r
-        return FALSE;\r
-    }\r
-\r
-    //\r
-    // Check timestamps \r
-    //\r
-    if ((tsval != (u32)~0UL) && ((m_tsval > tsval) || (tsecr == 0))) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_RECV, ("LRO: bad timestamp. lro: %d, packet: %d, %d\n", m_tsval, tsval, tsecr));\r
-        return FALSE;\r
-    }\r
-\r
-    return TRUE;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Init new LRO session. Set the source and destination address and port and store the first packet.\r
-    \r
-Arguments:\r
-    pMpRfd - pointer to the new packet\r
-    iph - pointer to the IP header of the packet\r
-    th - pointer to TCP header of the packet\r
-    \r
-Return Value:\r
-    None.\r
-    \r
---*/\r
-void\r
-mtnic_lro::InitNewLroSession(\r
-    PMP_RFD pMpRfd,\r
-    IPHeader* iph,\r
-    TCPHeader* th\r
-)\r
-{\r
-    ASSERT(m_hashIndex == -1);\r
-\r
-    //\r
-    // Initialize session \r
-    //\r
-    m_saddr = iph->iph_src;\r
-    m_daddr = iph->iph_dest;\r
-    m_sport_dport = *((u32*) &th->tcp_src);\r
-    m_fAppend = false;\r
-    \r
-    //\r
-    // Add Packet to LRO session\r
-    //\r
-    ASSERT(m_buff.GetNumberOfPackets() == 0);\r
-    m_buff.SetPacket(pMpRfd);\r
-    MP_INC_RCV_REF(m_Port);\r
-\r
-    \r
-    //\r
-    // Activate this session \r
-    //\r
-    m_hashIndex = LRO_INDEX(th, MAX_LRO_SESSIONS);\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Inserting session 0x%p to list at index:%d - saddr:0x%x daddr:0x%x sport:%d dport:%d\n",\r
-          this, m_hashIndex, be32_to_cpu(m_saddr), be32_to_cpu(m_daddr),\r
-          be16_to_cpu(*((__be16*) &m_sport_dport)), be16_to_cpu(*((__be16*) &m_sport_dport + 1))));\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Create new LRO session. \r
-    \r
-Arguments:\r
-    ring - pointer to Rx ring\r
-    pMpRfd - pointer to the new packet\r
-    iph - pointer to the IP header of the packet\r
-    th - pointer to TCP header of the packet\r
-    \r
-Return Value:\r
-    ERROR_FAIL - there is no free LRO session.\r
-    STATUS_PENDING - LRO session is created and the packet is pending till flushing\r
-    \r
---*/\r
-NTSTATUS\r
-mtnic_lro::CreateNewLroSession(\r
-    PMP_PORT pPort,\r
-    mtnic_rx_ring *ring,\r
-    PMP_RFD pMpRfd,\r
-    IPHeader* iph,\r
-    TCPHeader* th,\r
-    mtnic_cqe *cqe,\r
-    u32 tsval,\r
-    u32 tsecr\r
-    \r
-)\r
-{\r
-    mtnic_lro* lro = mtnic_lro_alloc_session(ring);\r
-    if (lro == NULL) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_WARNING, ETH_RECV, ("LRO:No more LRO sessions\n"));\r
-        INC_PERF_COUNTER(pPort->perf_counters.lro_session_ovfl);\r
-        return STATUS_UNSUCCESSFUL;\r
-    }\r
-\r
-    lro->InitNewLroSession(pMpRfd, iph, th);\r
-    \r
-    int index = LRO_INDEX(th, MAX_LRO_SESSIONS);\r
-#if DBG\r
-    ASSERT((lro->m_node.Flink == NULL) && (lro->m_node.Blink == NULL));\r
-    ASSERT((lro->m_flush_node.Flink == NULL) && (lro->m_flush_node.Blink == NULL));\r
-#endif\r
-    ring->lro_hash[index].InsertHeadList(&lro->m_node);\r
-    ring->lro_flush.InsertHeadList(&lro->m_flush_node);\r
-\r
-    lro->m_buff.SetRssValues(pPort, pMpRfd->NdisPacket, cqe);\r
-    lro->m_buff.SetVlanValues(pMpRfd->NdisPacket, cqe);\r
-    \r
-    return STATUS_PENDING;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Set LRO parameters\r
-    \r
-Arguments:\r
-    cqe - pointer to complition entry\r
-    iph - pointer to the IP header of the packet\r
-    th - pointer to TCP header of the packet\r
-    tsval - time stamp value of the packet\r
-    tsecr - time stamp echo value of the packet\r
-\r
-Return Value:\r
-    None        \r
-    \r
---*/\r
-VOID\r
-mtnic_lro::SetLroParameters(\r
-    mtnic_cqe *cqe,\r
-    IPHeader* iph,\r
-    TCPHeader* th,\r
-    u32 tsval,\r
-    u32 tsecr\r
-)\r
-{\r
-    u16 ip_len = be16_to_cpu(iph->iph_length);\r
-    u16 real_len = ETH_HLEN + ip_len;\r
-    int seq = be32_to_cpu(th->tcp_seq);\r
-    int tcp_hlen = (th->doff << 2);  \r
-    int tcp_data_len = ip_len - tcp_hlen - sizeof(IPHeader);\r
-\r
-    m_next_seq = seq + tcp_data_len;\r
-    m_tot_len = ip_len;\r
-    m_psh = th->psh;\r
-    m_ack_seq = th->tcp_ack;\r
-    m_window = th->tcp_window;\r
-    \r
-    //\r
-    // Handle vlans \r
-    //\r
-    if (cqe->vp & MTNIC_BIT_VLANN_PRESENT) \r
-    {\r
-        m_vlan_prio = cqe->vlan_prio;\r
-        m_fVlan = true;\r
-    } \r
-    else\r
-    {\r
-        m_fVlan = false;\r
-    }\r
-    \r
-    //\r
-    // Handle timestamps\r
-    //\r
-    if (tcp_hlen != sizeof(*th)) \r
-    {\r
-        m_tsval = tsval;\r
-        m_tsecr = tsecr;\r
-        m_fTimestamp = true;\r
-    }\r
-    else \r
-    {\r
-        m_tsval = (u32) ~0UL;\r
-        m_fTimestamp = false;\r
-    }\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Add first packet to LRO packet. For the first packet we need to store the packet properties\r
-    so we can check that next packets match the properties and can be coalesc to this packet.\r
-    In addition for first packet we should also copy the headers.\r
-    \r
-Arguments:\r
-    cqe - pointer to complition entry\r
-    pMpRfd - pointer to the new packet\r
-    iph - pointer to the IP header of the packet\r
-    th - pointer to TCP header of the packet\r
-    tsval - time stamp value of the packet\r
-    tsecr - time stamp echo value of the packet\r
-\r
-Return Value:\r
-    STATUS_SUCCESS - the packet appended successfully and it can be released\r
-    ERROR_FAIL - the packet can't store in lro session.                    \r
-        \r
-    \r
---*/\r
-NTSTATUS\r
-mtnic_lro::AddFirstPacket(\r
-    mtnic_cqe *cqe,\r
-    PMP_RFD pMpRfd,\r
-    IPHeader* iph,\r
-    TCPHeader* th,\r
-    u32 tsval,\r
-    u32 tsecr\r
-)\r
-{\r
-    ASSERT(m_buff.GetNumberOfPackets() == 1);\r
-\r
-    SetLroParameters(cqe, iph, th, tsval, tsecr);\r
-\r
-       u16 ip_len = be16_to_cpu(iph->iph_length);\r
-       int tcp_hlen = (th->doff << 2);  \r
-\r
-    ///\r
-    // Append the data\r
-    //\r
-    int hlen = ETH_HLEN + sizeof(IPHeader) + tcp_hlen;\r
-    NTSTATUS Status = m_buff.Append(((PUCHAR)pMpRfd->HwRfd), (ETH_HLEN + ip_len));\r
-    if (Status != STATUS_SUCCESS) \r
-    {\r
-        Flush(false);\r
-        return CreateNewLroSession(m_Port, m_pRing, pMpRfd, iph, th, cqe, tsval, tsecr);\r
-    }\r
-\r
-    MP_INC_RCV_REF(m_Port);\r
-    m_buff.SetNumberOfPackets(2);\r
-\r
-    //\r
-    // Set RSS and VLAN information on the packet\r
-    //\r
-    PNDIS_PACKET pPacket = m_buff.GetLroPacket(false);\r
-    m_buff.SetRssValues(m_Port, pPacket, cqe);\r
-    m_buff.SetVlanValues(pPacket, cqe);\r
-    \r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Add packet to LRO packet. the routine checks if this is the first packet or no and call the \r
-    relevant routine\r
-    \r
-Arguments:\r
-    cqe - pointer to complition entry\r
-    pMpRfd - pointer to the new packet\r
-    iph - pointer to the IP header of the packet\r
-    th - pointer to TCP header of the packet\r
-    tsval - time stamp value of the packet\r
-    tsecr - time stamp echo value of the packet\r
-\r
-Return Value:\r
-    STATUS_SUCCESS - the packet appended successfully and it can be released\r
-    ERROR_FAIL - the packet can't store in lro session.                    \r
-        \r
-    \r
---*/\r
-NTSTATUS\r
-mtnic_lro::AddPacketToLroSession(\r
-    mtnic_cqe *cqe,\r
-    PMP_RFD pMpRfd,\r
-    IPHeader* iph,\r
-    TCPHeader* th,\r
-    u32 tsval,\r
-    u32 tsecr\r
-)\r
-{\r
-    if(m_Port->Config.LargeReceiveOffload == LRO_MODE_MINI)\r
-    {\r
-        return AppendPacketToPreviousPacket(cqe, pMpRfd, iph, th, tsval, tsecr);\r
-    }\r
-    \r
-    if (m_buff.GetNumberOfPackets() == 1)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO (ox%p): first coalesce packet\n", this));\r
-        return AddFirstPacket(cqe, pMpRfd, iph, th, tsval, tsecr);\r
-    }\r
-    \r
-    return AddPacket(cqe, pMpRfd, iph, th, tsval, tsecr);\r
-}\r
-\r
-\r
-NTSTATUS\r
-mtnic_lro::AppendPacketToPreviousPacket(\r
-    mtnic_cqe *cqe,\r
-    PMP_RFD pMpRfd,\r
-    IPHeader* iph,\r
-    TCPHeader* th,\r
-    u32 tsval,\r
-    u32 tsecr\r
-)\r
-{\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO (0x%p): Extending LRO session with current total length:%d\n", this, m_tot_len));\r
-\r
-       u16 ip_len = be16_to_cpu(iph->iph_length);\r
-       u16 real_len = ETH_HLEN + ip_len;\r
-    #pragma prefast(suppress:28193, "any value is valid")\r
-       int seq = be32_to_cpu(th->tcp_seq);\r
-       int tcp_hlen = (th->doff << 2);  \r
-       int tcp_data_len = ip_len - tcp_hlen - sizeof(IPHeader);\r
-\r
-    if (!m_fAppend || (IsPacketMatchPreviousPackets(cqe, seq, tsval, tsecr) == FALSE))\r
-    {\r
-        if (m_buff.GetNumberOfPackets() == NIC_DEF_MAX_RFDS)\r
-        {\r
-            Flush(true);\r
-            return CreateNewLroSession(m_Port, m_pRing, pMpRfd, iph, th, cqe, tsval, tsecr);\r
-        }\r
-        \r
-        m_saddr = iph->iph_src;\r
-        m_daddr = iph->iph_dest;\r
-        m_sport_dport = *((u32*) &th->tcp_src);\r
-\r
-        //\r
-        // Set RSS and VLAN information on the packet\r
-        //\r
-        m_buff.SetRssValues(m_Port, pMpRfd->NdisPacket, cqe);\r
-        m_buff.SetVlanValues(pMpRfd->NdisPacket, cqe);\r
-             \r
-        //\r
-        // Add Packet to LRO session\r
-        //\r
-        m_buff.SetPacket(pMpRfd);\r
-        MP_SET_FLAG(pMpRfd, fMP_RFD_RECV_PEND);\r
-        MP_INC_RCV_REF(m_Port);\r
-\r
-        SetLroParameters(cqe, iph, th, tsval, tsecr);\r
-        m_fAppend = true;\r
-        \r
-        return STATUS_PENDING;\r
-    }\r
-\r
-    if (tcp_data_len)\r
-    {\r
-        ///\r
-        // Append the data\r
-        //\r
-        int hlen = ETH_HLEN + sizeof(IPHeader) + tcp_hlen;\r
-        NTSTATUS Status = m_buff.AppendToFirstPacket(m_tot_len + ETH_HLEN, (((PUCHAR)pMpRfd->HwRfd) + hlen), tcp_data_len);\r
-        ASSERT(Status == STATUS_SUCCESS);\r
-    } \r
-    else \r
-    {\r
-        //\r
-        // If we have no data we are done with this packet. Retun the RFD for futher use \r
-        //\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO (0x%p): No data - update TCP flags and freeing packet\n", this));\r
-    }\r
-\r
-    //\r
-    // Update LRO session\r
-    //\r
-    m_psh |= th->psh;\r
-    m_next_seq += tcp_data_len;\r
-    m_tot_len += (u16)tcp_data_len;\r
-    m_tsval = tsval;\r
-    m_tsecr = tsecr;\r
-    m_ack_seq = th->tcp_ack;\r
-    m_window = th->tcp_window;\r
-\r
-    PVOID data = m_buff.GetData(true);\r
-    ASSERT(data != NULL);\r
-    \r
-    iph = (IPHeader*) ((PUCHAR)data + ETH_HLEN);\r
-    th = (TCPHeader*)(iph+1);\r
-    \r
-    //\r
-    // Update IP length and checksum \r
-    //\r
-    iph->iph_length = cpu_to_be16(m_tot_len);\r
-    iph->iph_xsum = 0;      // Rest checksum so it doesn't take into account in checksum calculation\r
-    iph->iph_xsum = CalculateIpChecksum(iph);\r
-    \r
-    //\r
-    // Update latest TCP ack, window, psh, and timestamp \r
-    //\r
-    th->tcp_ack = m_ack_seq;\r
-    th->tcp_window = m_window;\r
-    th->psh = !!m_psh;\r
-    if (m_fTimestamp) \r
-    {\r
-        u32* ts = (u32 *) (th + 1);\r
-        #pragma prefast(suppress:28193, "any value is valid")\r
-        ts[1] = cpu_to_be32(m_tsval);\r
-        ts[2] = m_tsecr;\r
-    }\r
-    \r
-    u16 len = ETH_HLEN + be16_to_cpu(iph->iph_length);\r
-    NdisAdjustBufferLength(m_buff.GetLroBuffer(true), len);\r
-    m_fAppend = false;\r
-    \r
-    return STATUS_SUCCESS;\r
-\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Add packet to exiting lro session. The packet is appended to exiting packet.\r
-    Before appending the packet the routine checks that the packet properties match\r
-    the pervious packet and that there is enough room for the new packet. If so the \r
-    packet conctinate to previous one. otherwise the lro session is flushed and a new \r
-    lro session is created.\r
-    if the packet is empty, the routine only updates the packet property.\r
-    \r
-Arguments:\r
-    cqe - pointer to complition entry\r
-    pMpRfd - pointer to the new packet\r
-    iph - pointer to the IP header of the packet\r
-    th - pointer to TCP header of the packet\r
-    tsval - time stamp value of the packet\r
-    tsecr - time stamp echo value of the packet\r
-\r
-Return Value:\r
-    STATUS_SUCCESS - the packet appended successfully and it can be released\r
-    STAUS_PENDING - the packet is the first one in lro connection. it was stored \r
-                    locally until the session is flushed.\r
-    ERROR_FAIL - the packet can't store in lro session.                    \r
-    \r
---*/ \r
-NTSTATUS\r
-mtnic_lro::AddPacket(\r
-    mtnic_cqe *cqe,\r
-    PMP_RFD pMpRfd,\r
-    IPHeader* iph,\r
-    TCPHeader* th,\r
-    u32 tsval,\r
-    u32 tsecr\r
-)\r
-{\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO (0x%p): Extending LRO session with current total length:%d\n", this, m_tot_len));\r
-\r
-    u16 ip_len = be16_to_cpu(iph->iph_length);\r
-    u16 real_len = ETH_HLEN + ip_len;\r
-    int seq = be32_to_cpu(th->tcp_seq);\r
-    int tcp_hlen = (th->doff << 2);  \r
-    int tcp_data_len = ip_len - tcp_hlen - sizeof(IPHeader);\r
-\r
-    if (IsPacketMatchPreviousPackets(cqe, seq, tsval, tsecr) == FALSE)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_RECV, ("LRO (0x%p):  Packet mismatch \n", this));\r
-        Flush(false);\r
-        return CreateNewLroSession(m_Port, m_pRing, pMpRfd, iph, th, cqe, tsval, tsecr);\r
-    }\r
-\r
-    //\r
-    // If the cummulative IP length is over 64K, flush and start a new session\r
-    //\r
-    if (m_tot_len + tcp_data_len > MAX_LRO_SIZE) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_RECV, ("LRO (0x%p): 64K exceeded - starting new session\n", this));\r
-        Flush(false);\r
-        return CreateNewLroSession(m_Port, m_pRing, pMpRfd, iph, th, cqe, tsval, tsecr);\r
-    }\r
-\r
-    if (tcp_data_len)\r
-    {\r
-        ///\r
-        // Append the data\r
-        //\r
-        int hlen = ETH_HLEN + sizeof(IPHeader) + tcp_hlen;\r
-        NTSTATUS Status = m_buff.Append((((PUCHAR)pMpRfd->HwRfd) + hlen), tcp_data_len);\r
-        if (Status != STATUS_SUCCESS) \r
-        {\r
-            Flush(false);\r
-            return CreateNewLroSession(m_Port, m_pRing, pMpRfd, iph, th, cqe, tsval, tsecr);\r
-        }\r
-    } \r
-    else \r
-    {\r
-        //\r
-        // If we have no data we are done with this packet. Retun the RFD for futher use \r
-        //\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO (0x%p): No data - update TCP flags and freeing packet\n", this));\r
-    }\r
-\r
-    //\r
-    // Update LRO session\r
-    //\r
-    m_psh |= th->psh;\r
-    m_next_seq += tcp_data_len;\r
-    m_tot_len += (u16)tcp_data_len;\r
-    m_tsval = tsval;\r
-    m_tsecr = tsecr;\r
-    m_ack_seq = th->tcp_ack;\r
-    m_window = th->tcp_window;\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Append data to LRO packet\r
-    \r
-Arguments:\r
-    pSrc - pointer to copied data\r
-    ulSize - number of bytes to copy\r
-\r
-Return Value:\r
-    NDIS_STATUS_RESOURCES - there is no enough free space to copy the data\r
-    STATUS_SUCCESS - the data was copied successfully\r
-    \r
---*/ \r
-NTSTATUS \r
-mtnic_lro_buffer::Append(\r
-    PUCHAR pSrc,\r
-    ULONG ulSize\r
-        ) \r
-{\r
-    ASSERT(m_ulPacketCount != 0);\r
-\r
-    if (ulSize > m_freeSize)\r
-    {\r
-        return NDIS_STATUS_RESOURCES;\r
-    }\r
-    \r
-    NdisMoveMemory(((PUCHAR)m_pMpRfd->HwRfd)+m_offset, pSrc, ulSize);\r
-\r
-    m_offset += ulSize;\r
-    m_freeSize -= ulSize;\r
-\r
-    NdisInterlockedIncrement(&m_noOfCoalescePackets);\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    Append data to pervious packet\r
-    \r
-Arguments:\r
-    pSrc - pointer to copied data\r
-    ulSize - number of bytes to copy\r
-\r
-Return Value:\r
-    NDIS_STATUS_RESOURCES - there is no enough free space to copy the data\r
-    STATUS_SUCCESS - the data was copied successfully\r
-    \r
---*/ \r
-NTSTATUS \r
-mtnic_lro_buffer::AppendToFirstPacket(\r
-    ULONG offset,\r
-    PUCHAR pSrc,\r
-    ULONG ulSize\r
-        ) \r
-{\r
-    ASSERT(m_packets[m_ulPacketCount-1] != NULL);\r
-\r
-    PMP_RFD pMpRfd = MP_GET_PACKET_RFD(m_packets[m_ulPacketCount-1]);\r
-    \r
-    NdisMoveMemory(((PUCHAR)pMpRfd->HwRfd)+offset, pSrc, ulSize);\r
-    NdisInterlockedIncrement(&m_noOfCoalescePackets);\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-    \r
-\r
-/*++\r
-Routine Description:\r
-    Save the first packet in lro session. The TCP window algorithm cause ack for 2 packets or 200 ms. \r
-    in order to avoid from ack delay, we push up 2 packets instead one. so the first packet is stored as is\r
-    while the other packets are coalesced  \r
-    \r
-Arguments:\r
-    pMpRfd - pointer to packet descriptor\r
-\r
-Return Value:\r
-    None.\r
-    \r
---*/ \r
-void \r
-mtnic_lro_buffer::SetPacket(\r
-    PMP_RFD pMpRfd\r
-    )\r
-{\r
-    m_packets[m_ulPacketCount] = pMpRfd->NdisPacket;\r
-    ++m_ulPacketCount;\r
-}\r
-\r
-\r
-NTSTATUS \r
-mtnic_lro_buffer::Init(\r
-    PMP_PORT Port, \r
-    mtnic_lro* lro\r
-    )\r
-{\r
-    VOID *                  OriginalHwRfd = NULL;\r
-    NDIS_PHYSICAL_ADDRESS   OriginalHwRfdPa;\r
-    m_pMpRfd = (PMP_RFD)NdisAllocateFromNPagedLookasideList(&Port->RecvLookaside);\r
-    if (!m_pMpRfd)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("NdisAllocateFromNPagedLookasideList failed\n"));\r
-        return NDIS_STATUS_RESOURCES;\r
-    }\r
-    \r
-    MP_CLEAR_FLAGS(m_pMpRfd);\r
-    memset(&m_pMpRfd->DelInfo, 0 ,sizeof AllocateSharedMemoryDeleteInfo);\r
-    m_pMpRfd->fAllocCache = FALSE;\r
-    m_pMpRfd->Port = Port;\r
-    \r
-    //\r
-    // Allocate the shared memory for this RFD.\r
-    //\r
-    NTSTATUS Status = AllocateSharedMemory(\r
-                            Port->PortHandle,\r
-                            MAX_LRO_ALLOCATE_SIZE,\r
-                            ETH_PAGE_ALIGN,                    \r
-                            m_pMpRfd->fAllocCache,\r
-                            Port->Config.fUseDma,\r
-                            &OriginalHwRfd,\r
-                            &OriginalHwRfdPa,\r
-                            &m_pMpRfd->DelInfo);\r
-    if (Status != NDIS_STATUS_SUCCESS)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("NdisMAllocateSharedMemory failed\n"));\r
-        NdisFreeToNPagedLookasideList(&Port->RecvLookaside, m_pMpRfd);\r
-        return Status;\r
-    }\r
-    \r
-    //\r
-    // Now HwRfd is already 4096-bytes aligned, and the size of HwPfd header(not data part) is a multiple of 8,\r
-    // If we shift HwRfd 0xA bytes up, the Ethernet header size is 14 bytes long, then the data will be at\r
-    // 8 byte boundary. \r
-    // \r
-    m_pMpRfd->HwRfd = (VOID *)((PUCHAR)(m_pMpRfd->HwRfd) + HWRFD_SHIFT_OFFSET);\r
-    \r
-    //\r
-    // Update physical address accordingly\r
-    // \r
-    m_pMpRfd->HwRfdPa.QuadPart = OriginalHwRfdPa.QuadPart + BYTES_SHIFT(m_pMpRfd->HwRfd, OriginalHwRfd);\r
-    \r
-    //\r
-    // ISSUE Type: Need to check if we still need to allocate 100 byte spare. This left from \r
-    // Intel code that uses the extra bytes for saving information\r
-    //\r
-    ULONG ErrorValue = NICAllocRfd(Port, m_pMpRfd, MAX_LRO_SIZE+100);\r
-    if (ErrorValue)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("NICAllocRfd failed\n"));        \r
-        FreeSharedMemory(Port->PortHandle, &m_pMpRfd->DelInfo, Port->Config.fUseDma);        \r
-        m_pMpRfd->HwRfd = NULL;\r
-        \r
-        NdisFreeToNPagedLookasideList(&Port->RecvLookaside, m_pMpRfd);\r
-        return NDIS_STATUS_RESOURCES;\r
-    }\r
-\r
-    m_packets[1] = m_pMpRfd->NdisPacket;\r
-\r
-    m_pMpRfd->lro = lro;\r
-    MP_SET_FLAG(m_pMpRfd, fMP_RFD_LRO);\r
-\r
-    m_pBufVa = m_pMpRfd->HwRfd;\r
-    m_offset = 0;\r
-    m_freeSize = MAX_LRO_SIZE;\r
-    m_ulPacketCount = 0;\r
-\r
-\r
-    m_noOfCoalescePackets = 0;\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine init the lro session \r
-    \r
-Arguments:\r
-    Port - pointer to Port object\r
-    ring - pointer to ring object\r
-    \r
-Return Value:\r
-    NTSTAUS.\r
-    \r
---*/ \r
-NTSTATUS mtnic_lro::Init(PMP_PORT Port, mtnic_rx_ring* ring)\r
-{\r
-    memset(this, 0, sizeof(mtnic_lro));\r
-\r
-    m_Port= Port;\r
-    m_pRing = ring;\r
-    m_hashIndex = -1;\r
-    \r
-    InitializeListHead(&m_node);\r
-    InitializeListHead(&m_flush_node);\r
-\r
-#if DBG        \r
-    m_node.Flink = NULL;        \r
-    m_node.Blink = NULL;        \r
-    m_flush_node.Flink = NULL;        \r
-    m_flush_node.Blink = NULL;        \r
-#endif        \r
-    \r
-    return m_buff.Init(Port, this);\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine release allcoated data \r
-    \r
-Arguments:\r
-    None\r
-    \r
-Return Value:\r
-    none.\r
-    \r
---*/ \r
-void mtnic_lro::Release(void)\r
-{\r
-#if DBG        \r
-    m_node.Flink = NULL;        \r
-    m_node.Blink = NULL;        \r
-    m_flush_node.Flink = NULL;        \r
-    m_flush_node.Blink = NULL;           \r
-#endif        \r
-\r
-    ASSERT(m_Port != NULL);\r
-    m_buff.Release(m_Port);   \r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine looks for existing LRO session that match the TCP connection. \r
-    \r
-Arguments:\r
-    ring - pointer to ring object\r
-    iph - pointer to IP header\r
-    th - pointer to TCP header\r
-    \r
-Return Value:\r
-    pointer to lro object if found. NULL otherwise.\r
-    \r
---*/ \r
-static inline \r
-mtnic_lro*\r
-mtnic_lro_find_session(\r
-    mtnic_rx_ring *ring, \r
-    IPHeader* iph, \r
-    TCPHeader* th\r
-    )\r
-{\r
-    int index = LRO_INDEX(th, MAX_LRO_SESSIONS);\r
-    LinkedList* list = &ring->lro_hash[index];\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Searching session at index:%d\n", index));\r
-\r
-    //\r
-    // Walk through the session looking for a match\r
-    //\r
-    LIST_ENTRY *item = list->RawHead();\r
-    while (!list->IsAfterTheLast(item))\r
-    {\r
-        ASSERT(item);\r
-        mtnic_lro* lro = CONTAINING_RECORD(item, mtnic_lro, m_node);\r
-\r
-        if (lro->IsMatched(iph, th))\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Find session. 0x%p\n", lro));\r
-            return lro;\r
-        } \r
-        \r
-        item = item->Flink;\r
-    }\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Find session failed. There is no existing session for the connection"));\r
-    return NULL;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine alloactes LRO object from the pool\r
-    \r
-Arguments:\r
-    ring - pointer to ring object\r
-    \r
-Return Value:\r
-    pointer to lro object if have. NULL otherwise.\r
-    \r
---*/ \r
-static inline \r
-mtnic_lro*\r
-mtnic_lro_alloc_session( \r
-    mtnic_rx_ring* ring\r
-    )\r
-{\r
-    NdisAcquireSpinLock(&ring->m_cs_lro);    \r
-    \r
-    LinkedList* list = &ring->lro_free;\r
-    if (list->Size() == 0)\r
-    {\r
-        NdisReleaseSpinLock(&ring->m_cs_lro);\r
-        ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH_RECV, ("LRO: There is no free session. Alloc session was failed"));\r
-        return NULL;\r
-    }\r
-\r
-    LIST_ENTRY* item = list->RemoveHeadList();\r
-#if DBG        \r
-    item->Flink = NULL;        \r
-    item->Blink = NULL;        \r
-#endif        \r
-\r
-    NdisReleaseSpinLock(&ring->m_cs_lro);\r
-\r
-    mtnic_lro* lro = CONTAINING_RECORD(item, mtnic_lro, m_node);\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Alloc session 0x%p\n", lro));\r
-    return lro;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine returns LRO object to the pool\r
-    \r
-Arguments:\r
-    pMpRfd - pointer to packet decriptor. the descriptor contains a pointer to the LRO object that should be \r
-             released\r
-    \r
-Return Value:\r
-    None.\r
-    \r
---*/ \r
-void mtnic_lro_return_session(PMP_RFD pMpRfd)\r
-{\r
-    mtnic_lro* lro = pMpRfd->lro;\r
-    lro->ReturnSession();\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine flush all the LRO session and push the packets to NDIS\r
-    \r
-Arguments:\r
-    ring - pointer to ring object\r
-    \r
-Return Value:\r
-    None.\r
-    \r
---*/ \r
-void \r
-mtnic_lro_flush(\r
-    PMP_PORT Port,\r
-    mtnic_rx_ring *ring\r
-    )\r
-{\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: flush all pending LRO sessions\n"));\r
-    PNDIS_PACKET* packets = ring->ppLroPackets; \r
-    \r
-    UINT ulPacketCount = 0;;\r
-\r
-#ifdef LBFO\r
-    PMP_PORT pPrimary = NULL;\r
-    if (Port->pBundleInfo)\r
-    {\r
-        pPrimary = Port->pBundleInfo->GetPrimaryPort();\r
-    }\r
-    if (pPrimary == NULL)\r
-    {\r
-        IncPortRefCount(Port);\r
-        pPrimary = Port;\r
-    }\r
-#else\r
-    PMP_PORT pPrimary = Port;\r
-#endif\r
-    \r
-    while (ring->lro_flush.Size() != 0)\r
-    {\r
-        LIST_ENTRY* pEntry = ring->lro_flush.Head();\r
-        \r
-        ASSERT(pEntry);\r
-\r
-        UINT ulAddedPackets;\r
-        mtnic_lro* lro = CONTAINING_RECORD(pEntry, mtnic_lro, m_flush_node);\r
-\r
-        if (lro->GetNumberOfPackets() > (LRO_PACKET_SIZE - ulPacketCount))\r
-        {\r
-            ASSERT(ulPacketCount > 0);\r
-            //\r
-            // There is no enough space to contain the lro session packets. Indicate NDIS\r
-            // about existing packets and accomulate the rest of the packets\r
-            //\r
-            AVG_PERF_COUNTER(&Port->perf_counters.rxIndicateNumber, ulPacketCount);\r
-            ADD_PERF_COUNTER(Port->perf_counters.rx_ndis_indicate, ulPacketCount);\r
-            NdisMIndicateReceivePacket(pPrimary->PortHandle, packets, ulPacketCount);\r
-            ulPacketCount = 0;\r
-        }            \r
-        \r
-        lro->Flush((Port->Config.LargeReceiveOffload == LRO_MODE_MINI), &packets[ulPacketCount], &ulAddedPackets);\r
-        ulPacketCount += ulAddedPackets;\r
-    }\r
-\r
-    if (ulPacketCount > 0)\r
-    {\r
-        AVG_PERF_COUNTER(&Port->perf_counters.rxIndicateNumber, ulPacketCount);\r
-        ADD_PERF_COUNTER(Port->perf_counters.rx_ndis_indicate, ulPacketCount);\r
-        NdisMIndicateReceivePacket(pPrimary->PortHandle, packets, ulPacketCount);\r
-    }\r
-\r
-#ifdef LBFO\r
-    DecPortRefCount(pPrimary);\r
-#endif\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The entry routine of LRO. The routine checks that the packet fits LRO (no TCP option except \r
-    timestamp). It gets the LRO session and add the packet to the session\r
-    \r
-Arguments:\r
-    ring - pointer to ring object\r
-    pMpRfd - pointer to receive packet descriptor\r
-    cqe - pointer to competion entry object\r
-    \r
-Return Value:\r
-    STATUS_SUCCESS - the packet appended successfully and it can be released\r
-    STAUS_PENDING - the packet is the first one in lro connection. it was stored \r
-                    locally until the session is flushed.\r
-    ERROR_FAIL - the packet can't store in lro session.                    \r
-    \r
---*/ \r
-NTSTATUS \r
-mtnic_lro_rx(\r
-    PMP_PORT pPort,\r
-    mtnic_rx_ring *ring,\r
-    PMP_RFD pMpRfd,\r
-    mtnic_cqe *cqe\r
-    )\r
-{\r
-    u32 tsval = (u32) ~0UL;\r
-    u32 tsecr = 0;\r
-\r
-    //    \r
-    // Get pointer to IP & TCP headers. \r
-    //\r
-    IPHeader* iph;\r
-    TCPHeader* th;\r
-    PNDIS_PACKET Packet = pMpRfd->NdisPacket;\r
-    NTSTATUS Status = GetHeaders(Packet, &iph, &th);\r
-    if (Status != STATUS_SUCCESS)\r
-    {\r
-        return Status;\r
-    }\r
-\r
-    //\r
-    // We only handle timestamp options \r
-    //\r
-    int tcp_hlen = (th->doff << 2);         // Get the actual TCP header size\r
-    if (tcp_hlen == sizeof(*th) + TCPOLEN_TSTAMP_ALIGNED) \r
-    {\r
-        UINT length = be32_to_cpu(cqe->byte_cnt);\r
-        if (length < MIN_LRO_LENGTH + TCPOLEN_TSTAMP_ALIGNED)\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: The packet length is less than expected. Packet length: %d expected: %d\n", length, MIN_LRO_LENGTH + TCPOLEN_TSTAMP_ALIGNED));\r
-            return STATUS_UNSUCCESSFUL;\r
-        }\r
-        \r
-        u32* ts = (u32*)(th + 1);\r
-        u32 tcpOptions = (TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP;\r
-        if (*ts != cpu_to_be32(tcpOptions))\r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: The packet contains unsupported TCP options. TCP options: 0x%x\n", *ts));\r
-            return STATUS_UNSUCCESSFUL;\r
-        }\r
-\r
-        #pragma prefast(suppress:28193, "any value is valid")\r
-        tsval = be32_to_cpu(ts[1]);\r
-        tsecr = ts[2];\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Packet contains time stamp. ts:0x%x tsecr:0x%x\n", tsval, be32_to_cpu(tsecr)));\r
-    } \r
-    else \r
-    {\r
-        if (tcp_hlen != sizeof(*th)) \r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: Cannot LRO - tcp options\n"));\r
-            return STATUS_UNSUCCESSFUL;\r
-        }\r
-    }\r
-\r
-\r
-    //\r
-    // At this point we know we have a TCP packet that is likely to be\r
-    // eligible for LRO. Therefore, see now if we have an oustanding\r
-    // session that corresponds to this packet so we could flush it if\r
-    // something still prevents LRO \r
-    //\r
-    mtnic_lro* lro = mtnic_lro_find_session(ring, iph, th);\r
-\r
-    //\r
-    // ensure no bits set besides ack or psh \r
-    //\r
-    if (th->fin || th->syn || th->rst || th->urg || th->ece ||th->cwr || !th->ack)\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO:Cannot LRO - tcp flags 0x%x\n", th->tcp_flags));\r
-        if (lro) \r
-        {\r
-            //\r
-            // First flush session to keep packets in-order \r
-            //\r
-                       bool fLroModeMini = (pPort->Config.LargeReceiveOffload == LRO_MODE_MINI);\r
-            lro->Flush(fLroModeMini);\r
-        }\r
-        return STATUS_UNSUCCESSFUL;\r
-    }\r
-\r
-    u16 ip_len = be16_to_cpu(iph->iph_length);\r
-    u16 real_len = ETH_HLEN + ip_len;\r
-\r
-    //\r
-    // Get TCP payload length \r
-    //\r
-    int tcp_data_len = ip_len - tcp_hlen - sizeof(IPHeader);\r
-    int seq = be32_to_cpu(th->tcp_seq);\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: tcp data len:%d\n", tcp_data_len));\r
-\r
-    if (lro) \r
-    {  \r
-        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: session found 0x%p - Add the packet to existing session\n", lro));\r
-        return lro->AddPacketToLroSession(cqe, pMpRfd, iph, th, tsval, tsecr);\r
-    }\r
-    \r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("LRO: session not found - Create new\n"));\r
-    return mtnic_lro::CreateNewLroSession(pPort, ring, pMpRfd, iph, th, cqe, tsval, tsecr);\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine release all the objects that allocated for LRO\r
-    \r
-Arguments:\r
-    ring - pointer to ring object\r
-    num_lro - number of LRO objects that allocated\r
-    \r
-Return Value:\r
-    None    \r
-\r
---*/ \r
-void\r
-mtnic_lro_destroy(\r
-    mtnic_rx_ring * ring, \r
-    u32 num_lro\r
-    )\r
-{\r
-    ASSERT(ring->lro_free.Size() == num_lro);\r
-    \r
-    //\r
-    // On this point we don't need to acquire the m_cs_lro spin lock. We assumed that\r
-    // all the received already finished and all the lro session already flushed and\r
-    // returned to free list\r
-    //\r
-    while (ring->lro_free.Size() != 0)\r
-    {\r
-        LIST_ENTRY* pEntry = ring->lro_free.RemoveHeadList();\r
-        \r
-        ASSERT(pEntry);\r
-        mtnic_lro* lro = CONTAINING_RECORD(pEntry, mtnic_lro, m_node);\r
-        lro->Release();        \r
-\r
-        delete lro;\r
-    }\r
-        \r
-    delete [] ring->lro_hash;\r
-    ring->lro_hash = NULL;\r
-\r
-    NdisFreeSpinLock(&ring->m_cs_lro);\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine alloactes the LRO objects \r
-    \r
-Arguments:\r
-    Port - pointer to Port object\r
-    ring - pointer to ring object\r
-    num_lro - number of LRO objects that allocated\r
-    \r
-Return Value:\r
-    NTSTATUS    \r
-\r
---*/ \r
-NTSTATUS\r
-mtnic_lro_init(\r
-    PMP_PORT Port,\r
-    mtnic_rx_ring *ring, \r
-    u32 num_lro\r
-    )\r
-{\r
-    NTSTATUS Status;\r
-\r
-    ring->lro_free.Init();\r
-    ring->lro_flush.Init();\r
-\r
-    ring->lro_hash = new LinkedList[num_lro];\r
-    if (ring->lro_hash == NULL) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("new Failed\n"));\r
-        return STATUS_NO_MEMORY;\r
-    }\r
-\r
-    NdisAllocateSpinLock(&ring->m_cs_lro);\r
-\r
-    for (u32 i = 0; i < num_lro; i++) \r
-    {\r
-        ring->lro_hash[i].Init();\r
-\r
-        #pragma prefast(suppress:28197, "lro is stored in lro_free list and release in lro_destroyed")\r
-        mtnic_lro* lro = new mtnic_lro;\r
-        if (lro == NULL) \r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_ERROR, ETH_RECV, ("new Failed\n"));\r
-            mtnic_lro_destroy(ring, i);\r
-            return STATUS_NO_MEMORY;\r
-        }\r
-\r
-        Status = lro->Init(Port, ring);                 \r
-        if (!NT_SUCCESS(Status)) \r
-        {\r
-            delete lro;\r
-            mtnic_lro_destroy(ring, i);\r
-            return Status;\r
-        }\r
-#if DBG\r
-        ASSERT((lro->m_node.Flink == NULL) && (lro->m_node.Blink == NULL));\r
-#endif\r
-        ring->lro_free.InsertHeadList(&lro->m_node);\r
-    }\r
-    \r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine checks if the packet is eligible for LRO. The packet isn't eligible for LRO in following cases:\r
-    - LRO option is disabled\r
-    - The packet contains at least the ETH, IP and TCP header otherwise we can't analyze it for LRO\r
-    - Packet checksum is wrong\r
-    - It's not TCP/IP packet\r
-    - the packet contains IP options\r
-    - the p[acket is IP fragment\r
-    \r
-Arguments:\r
-    Port - pointer to Port object\r
-    cqe - pointer to completion object\r
-    length - packet length in bytes\r
-    \r
-Return Value:\r
-    true - if eligble, false otherwise    \r
-\r
---*/ \r
-bool \r
-IsPacketEligibleForLro(\r
-    PMP_PORT Port,\r
-    mtnic_cqe *cqe,\r
-    ULONG length\r
-    )\r
-{\r
-    if (Port->Config.LargeReceiveOffload == LRO_MODE_DISABLE)\r
-    {\r
-        //\r
-        // LRO isn't enabled\r
-        //\r
-        return false;\r
-    }\r
-\r
-    if (length < MIN_LRO_LENGTH)\r
-    {\r
-        //\r
-        // the packet size is less than the minimum that requires for lro processing\r
-        // pass it as is to NDIS. This can cause out of order but since it's a rare case\r
-        // we don't handle it and let the TCP stack to deal with\r
-        //\r
-        return false;\r
-    }\r
-    \r
-    if (!Port->Config.RxChksumOffload ||\r
-        !(cqe->flags_h & MTNIC_BIT_IPOK) ||\r
-        cqe->chksum != 0xffff)\r
-    {\r
-        //\r
-        // Receive checksum offload isn't enabled or the checksum is inncorrect\r
-        //\r
-        return false;\r
-    }\r
-\r
-    __be32 flags = *((__be32*) &cqe->flags_h);\r
-    if ((flags & cpu_to_be32(TCPIP_MASK_32)) != cpu_to_be32(LRO_MASK_32))\r
-    {\r
-        //\r
-        // This packet isn't eligible for LRO since one of following reasons isn't meet:\r
-        //     - DIX Ethernet (type interpretation)\r
-        //     - TCP/IP (v4)\r
-        //     - without IP options\r
-        //     - not an IP fragment \r
-        //\r
-        return false;\r
-    }\r
-\r
-    return true;\r
-}\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_lro.h b/hw/mlx4/kernel/eth/mp_lro.h
deleted file mode 100644 (file)
index 319c3e4..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2007 Mellanox Technologies. All rights reserved.\r
-\r
-Module Name:\r
-    mp_lro.h\r
-\r
-Abstract:\r
-    This module contains decleration LRO functions and data structures\r
-    \r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#define MAX_LRO_SIZE (0xFFFF - (100 + MORE_DATA_FOR_ALIGN))\r
-#define MAX_LRO_ALLOCATE_SIZE (MAX_LRO_SIZE + 100 + MORE_DATA_FOR_ALIGN)\r
-\r
-//\r
-// values for the different LRO modes\r
-//\r
-const int LRO_MODE_DISABLE = 0;\r
-const int LRO_MODE_FULL = 1;\r
-const int LRO_MODE_MINI = 2;\r
-const int LRO_MODE_MAX_VAL = 2;\r
-\r
-const int LRO_MODE_DEFAULT = LRO_MODE_DISABLE;\r
-\r
-C_ASSERT(NIC_DEF_MAX_RFDS >= NIC_DEF_RFDS);\r
-const ULONG LRO_PACKET_SIZE = NIC_DEF_MAX_RFDS*4;\r
-\r
-NTSTATUS \r
-mtnic_lro_init(\r
-    PMP_PORT Port,\r
-    mtnic_rx_ring* ring, \r
-    u32 num_lro\r
-    );\r
-\r
-void\r
-mtnic_lro_destroy(\r
-    mtnic_rx_ring * ring, \r
-    u32 num_lro\r
-    );\r
-\r
-bool \r
-IsPacketEligibleForLro(\r
-    PMP_PORT Port,\r
-    mtnic_cqe *cqe,\r
-    ULONG length\r
-    );\r
-\r
-NTSTATUS \r
-mtnic_lro_rx(\r
-    PMP_PORT pPort,\r
-    mtnic_rx_ring *ring,\r
-    PMP_RFD pMpRfd,\r
-    mtnic_cqe *cqe\r
-    );\r
-\r
-void \r
-mtnic_lro_flush(\r
-    PMP_PORT Port,\r
-    mtnic_rx_ring *ring\r
-    );\r
-\r
-void \r
-mtnic_lro_return_session(\r
-    PMP_RFD pMpRfd\r
-    );\r
-\r
-\r
-class mtnic_lro_buffer\r
-{\r
-public:\r
-    NTSTATUS Init(PMP_PORT Port, mtnic_lro* lro);\r
-    void SetPacket(PMP_RFD pMpRfd);\r
-    NTSTATUS Append(PUCHAR  pSrc, ULONG ulSize);\r
-    NTSTATUS AppendToFirstPacket(ULONG offset, PUCHAR  pSrc, ULONG ulSize);\r
-\r
-    void Init(void)\r
-    {\r
-        m_offset = 0;\r
-        m_freeSize = MAX_LRO_SIZE;\r
-        m_noOfCoalescePackets = 0;\r
-        m_ulPacketCount = 0;\r
-    }\r
-    \r
-    UINT GetNumberOfPackets(void) const\r
-    {\r
-        return m_ulPacketCount;\r
-    }\r
-\r
-    void SetNumberOfPackets(UINT i) \r
-    {\r
-        m_ulPacketCount = i;\r
-    }\r
-\r
-    PVOID GetData(bool fLroModeMini)\r
-    {\r
-        if (fLroModeMini)\r
-        {\r
-            ASSERT((m_ulPacketCount > 0) && (m_ulPacketCount < NIC_DEF_MAX_RFDS));\r
-            ASSERT(m_packets[m_ulPacketCount-1] != NULL);\r
-            PMP_RFD pMpRfd = MP_GET_PACKET_RFD(m_packets[m_ulPacketCount-1]);\r
-            return pMpRfd->HwRfd;\r
-        }\r
-        \r
-        return m_pBufVa;\r
-    }\r
-\r
-    PNDIS_BUFFER GetLroBuffer(bool fLroModeMini)\r
-    {\r
-        if (fLroModeMini)\r
-        {\r
-            ASSERT((m_ulPacketCount > 0) && (m_ulPacketCount < NIC_DEF_MAX_RFDS));\r
-            ASSERT(m_packets[m_ulPacketCount-1] != NULL);\r
-            PMP_RFD pMpRfd = MP_GET_PACKET_RFD(m_packets[m_ulPacketCount-1]);\r
-            return pMpRfd->NdisBuffer;\r
-        }\r
-        \r
-        return m_pMpRfd->NdisBuffer;\r
-    }\r
-    \r
-    PNDIS_PACKET GetLroPacket(bool fLroModeMini)\r
-    {\r
-        if (fLroModeMini)\r
-        {            \r
-            ASSERT((m_ulPacketCount > 0) && (m_ulPacketCount < NIC_DEF_MAX_RFDS));\r
-            ASSERT(m_packets[m_ulPacketCount-1] != NULL);\r
-            return m_packets[m_ulPacketCount-1];\r
-        }\r
-        \r
-        return m_pMpRfd->NdisPacket;\r
-    }\r
-    PNDIS_PACKET* GetPacketArray(void)\r
-    {\r
-        return m_packets;\r
-    }\r
-\r
-    long GetNumberOfCaolescePackets(void)\r
-    {\r
-        return m_noOfCoalescePackets;\r
-    }\r
-\r
-    void Release(PMP_PORT Port)\r
-    {\r
-        NICFreeRfd(Port, m_pMpRfd);   \r
-    }\r
-\r
-    void GetPackets(PNDIS_PACKET* ppPackets)\r
-    {\r
-        for(ULONG i = 0; i < m_ulPacketCount; ++i, ++ppPackets)\r
-        {\r
-            *ppPackets = m_packets[i];\r
-        }\r
-    }\r
-\r
-    void SetRssValues(PMP_PORT pPort, PNDIS_PACKET pPacket, mtnic_cqe *cqe)\r
-    {\r
-        if (pPort->Config.RssMode == RSS_MODE_NDIS) {\r
-            NDIS_PACKET_SET_HASH_TYPE(pPacket, NDIS_HASH_TCP_IPV4 );\r
-            NDIS_PACKET_SET_HASH_FUNCTION(pPacket, NdisHashFunctionToeplitz );\r
-            NDIS_PACKET_SET_HASH_VALUE(pPacket, be32_to_cpu(cqe->rss_hash));\r
-        } else {\r
-            NDIS_PACKET_SET_HASH_TYPE(pPacket, 0 );\r
-            NDIS_PACKET_SET_HASH_FUNCTION(pPacket, 0 );\r
-            NDIS_PACKET_SET_HASH_VALUE(pPacket,0);\r
-        }\r
-    }\r
-\r
-    static void SetVlanValues(PNDIS_PACKET pPacket, mtnic_cqe *cqe)\r
-    {\r
-        if ((cqe->vp & MTNIC_BIT_VLANN_PRESENT) == 0)\r
-        {\r
-            return;\r
-        }\r
-        \r
-        u16 vlan_tag = be16_to_cpu(cqe->vlan_prio);\r
-        u16 vlan_id = vlan_tag & 0xFFF;\r
-        u16 priority = (vlan_tag >> 13) & 0x7;\r
-        \r
-        NDIS_PACKET_8021Q_INFO VlanInfo;\r
-        VlanInfo.Value = 0;\r
-        VlanInfo.TagHeader.UserPriority = priority; // Set priority.\r
-        VlanInfo.TagHeader.VlanId = vlan_id; // Set VLAN identifier.\r
-        VlanInfo.TagHeader.CanonicalFormatId = 0; // Should be zero.\r
-        VlanInfo.TagHeader.Reserved = 0; // Should be zero.\r
-        NDIS_PER_PACKET_INFO_FROM_PACKET(pPacket, Ieee8021QInfo) =  VlanInfo.Value;\r
-    }\r
-    \r
-private:    \r
-    PMP_RFD m_pMpRfd;\r
-    PVOID m_pBufVa;\r
-    ULONG m_offset;\r
-    ULONG m_freeSize;\r
-\r
-    long m_noOfCoalescePackets;\r
-    \r
-    PNDIS_PACKET m_packets[NIC_DEF_MAX_RFDS];              \r
-    UINT m_ulPacketCount;\r
-};\r
-\r
-\r
-class mtnic_lro \r
-{\r
-public:\r
-    NTSTATUS Init(PMP_PORT Port, mtnic_rx_ring* ring);\r
-    void Release(void);\r
-    \r
-    void \r
-    Flush(\r
-        bool fFirstPacketChange = false,\r
-        PNDIS_PACKET* ppPackets = NULL,       \r
-        UINT* ulPacketCount = NULL            \r
-    );\r
-\r
-    void ReturnSession(void);\r
-\r
-    NTSTATUS\r
-    AddPacketToLroSession(\r
-        mtnic_cqe *cqe,\r
-        PMP_RFD pMpRfd,\r
-        IPHeader* iph,\r
-        TCPHeader* th,\r
-        u32 tsval,\r
-        u32 tsecr\r
-    );\r
-\r
-    NTSTATUS\r
-    AppendPacketToPreviousPacket(\r
-        mtnic_cqe *cqe,\r
-        PMP_RFD pMpRfd,\r
-        IPHeader* iph,\r
-        TCPHeader* th,\r
-        u32 tsval,\r
-        u32 tsecr\r
-    );\r
-\r
-    void\r
-    InitNewLroSession(\r
-        PMP_RFD pMpRfd,\r
-        IPHeader* iph,\r
-        TCPHeader* th\r
-    );\r
-\r
-    bool\r
-    IsMatched(\r
-        IPHeader* iph, \r
-        TCPHeader* th\r
-        )\r
-    {\r
-        //\r
-        // the source port and destination is stored in 32 bits so we can \r
-        // check both of them in single compare\r
-        //\r
-               return (m_sport_dport == *((u32*) &th->tcp_src) &&\r
-                   m_saddr == iph->iph_src &&\r
-                   m_daddr == iph->iph_dest);\r
-    };\r
-\r
-    ULONG GetNumberOfPackets(void) const\r
-    {\r
-        return m_buff.GetNumberOfPackets();\r
-    }\r
-    \r
-public:    \r
-    static\r
-    NTSTATUS\r
-    CreateNewLroSession(\r
-        PMP_PORT pPort,\r
-        mtnic_rx_ring *ring,\r
-        PMP_RFD pMpRfd,\r
-        IPHeader* iph,\r
-        TCPHeader* th,\r
-        mtnic_cqe *cqe,\r
-        u32 tsval,\r
-        u32 tsecr        \r
-    );\r
-\r
-private:\r
-    BOOLEAN    \r
-    IsPacketMatchPreviousPackets(\r
-        mtnic_cqe *cqe,\r
-        int seq,\r
-        u32 tsval,\r
-        u32 tsecr\r
-        );\r
-\r
-    static\r
-    USHORT\r
-    CalculateIpChecksum(\r
-        IPHeader* iph\r
-        );\r
-\r
-    NTSTATUS\r
-    AddPacket(\r
-        mtnic_cqe *cqe,\r
-        PMP_RFD pMpRfd,\r
-        IPHeader* iph,\r
-        TCPHeader* th,\r
-        u32 tsval,\r
-        u32 tsecr\r
-    );\r
-\r
-    NTSTATUS\r
-    AddFirstPacket(\r
-        mtnic_cqe *cqe,\r
-        PMP_RFD pMpRfd,\r
-        IPHeader* iph,\r
-        TCPHeader* th,\r
-        u32 tsval,\r
-        u32 tsecr\r
-    );\r
-\r
-    VOID\r
-    SetLroParameters(\r
-        mtnic_cqe *cqe,\r
-        IPHeader* iph,\r
-        TCPHeader* th,\r
-        u32 tsval,\r
-        u32 tsecr\r
-    );\r
-    \r
-public:    \r
-       LIST_ENTRY m_node;\r
-       LIST_ENTRY m_flush_node;\r
-\r
-private:\r
-    PMP_PORT m_Port;\r
-    \r
-       /* Id fields come first: */\r
-       u32 m_saddr;\r
-       u32 m_daddr;\r
-       u32 m_sport_dport;\r
-       u32 m_next_seq;\r
-       u16 m_tot_len;\r
-       u8 m_psh;\r
-\r
-       u32 m_tsval;\r
-       u32 m_tsecr;\r
-       u32 m_ack_seq;\r
-       u16 m_window;\r
-       __be16 m_vlan_prio; // VLAN ID and priority\r
-       bool m_fVlan;\r
-       bool m_fTimestamp;\r
-\r
-    mtnic_rx_ring* m_pRing;\r
-    mtnic_lro_buffer m_buff;\r
-\r
-    int m_hashIndex;\r
-    bool m_fAppend;\r
-};\r
-\r
-\r
-\r
diff --git a/hw/mlx4/kernel/eth/mp_main.cpp b/hw/mlx4/kernel/eth/mp_main.cpp
deleted file mode 100644 (file)
index 4b2d525..0000000
+++ /dev/null
@@ -1,2290 +0,0 @@
-\r
-Copyright (c) 1999  Microsoft Corporation\r
-\r
-Module Name:\r
-    mp_main.c\r
-\r
-Abstract:\r
-    This module contains NDIS miniport handlers\r
-\r
-Revision History:\r
-\r
-Notes:\r
-\r
---*/\r
-\r
-#include "precomp.h"\r
-#include <stdlib.h>\r
-#include "mp_log.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#include "Mp_main.tmh"\r
-#else\r
-#if DBG \r
-    const unsigned int g_EthDbgLevel = TRACE_LEVEL_WARNING;//TRACE_LEVEL_VERBOSE;\r
-    const unsigned int g_EthDbgFlags= 0xffff;\r
-#endif \r
-#endif \r
-\r
-KSPIN_LOCK g_TraceLock;\r
-\r
-#if DBG\r
-#define _FILENUMBER     'NIAM'\r
-#endif\r
-\r
-#ifdef ALLOC_PRAGMA\r
-//#pragma alloc_text(INIT, DriverEntry)\r
-#endif\r
-\r
-#ifdef LBFO\r
-LIST_ENTRY g_BundleList;\r
-KEVENT g_BundleEvent;\r
-#endif\r
-\r
-//\r
-// Global object used for event logging reporting\r
-//\r
-PDRIVER_OBJECT g_pDriverObject;  \r
-\r
-//\r
-// Global object used for debugging porpuse\r
-//\r
-u64 g_bogus_interrupts = 0;\r
-int g_DebugCleanPort=0; \r
-LONG g_MaximumWorkingThreads = 2;\r
-\r
-void MpStopPort(PMP_PORT Port);\r
-\r
-\r
-static UINT ulNumOfNics = 0;\r
-pMtnicBusIfc g_NIC[MAX_CARDS] = { NULL }  ;\r
-\r
-const WCHAR x_TCPParametersPath[] = L"\\REGISTRY\\MACHINE\\SYSTEM\\ControlSet001\\Services\\Tcpip";\r
-const WCHAR x_RSSValueName[] = L"EnableRSS";\r
-const WCHAR x_MaxWorkingThreadValueName[] = L"MaximumWorkingThreads";\r
-\r
-\r
-inline void AddNewNicInterface(pMtnicBusIfc pMtnicIfc)\r
-{\r
-    if (ulNumOfNics == MAX_CARDS)\r
-    {\r
-        return;\r
-    }\r
-    \r
-    for(UINT i=0 ; i < ulNumOfNics; i++)\r
-    {\r
-        if (g_NIC[i] == pMtnicIfc)\r
-            return;\r
-    }\r
-\r
-    g_NIC[ulNumOfNics]=pMtnicIfc;\r
-    ++ulNumOfNics;\r
-}\r
-\r
-\r
-NTSTATUS ReadRegistryDword(\r
-    IN PWSTR pszRegistryPath,\r
-    IN PWSTR pszValueName,\r
-    IN ULONG DefaultVal,\r
-    OUT LONG *pVal\r
-    )\r
-{\r
-    NTSTATUS    status;\r
-    /* Remember the terminating entry in the table below. */\r
-    RTL_QUERY_REGISTRY_TABLE    table[2];\r
-    UNICODE_STRING              ParamPath;\r
-\r
-    RtlInitUnicodeString( &ParamPath, NULL );\r
-    ParamPath.MaximumLength = wcslen(pszRegistryPath) + sizeof(L"\\Parameters") + 1;\r
-    ParamPath.Buffer = new WCHAR[ParamPath.MaximumLength];\r
-    if( !ParamPath.Buffer ) \r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Failed to allocate parameters path buffer\n"));\r
-        return STATUS_INSUFFICIENT_RESOURCES;\r
-    }\r
-    \r
-    wcsncpy(ParamPath.Buffer, pszRegistryPath, ParamPath.MaximumLength);\r
-    wcsncat(ParamPath.Buffer, L"\\Parameters", ParamPath.MaximumLength);\r
-    \r
-    //\r
-    //Clear the table.  This clears all the query callback pointers,\r
-    // and sets up the terminating table entry.\r
-    //\r
-    memset(table, 0, sizeof(table));\r
-\r
-    //\r
-    // Setup the table entries. \r
-    //\r
-    table[0].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
-    table[0].Name = pszValueName;\r
-    table[0].EntryContext = pVal;\r
-    table[0].DefaultType = REG_DWORD;\r
-    table[0].DefaultData = &DefaultVal;\r
-    table[0].DefaultLength = sizeof(ULONG);\r
-    \r
-    status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, ParamPath.Buffer, table, NULL, NULL );\r
-\r
-    delete [] ParamPath.Buffer;\r
-    return status;\r
-}\r
-\r
-\r
-/* Forwards the request to the HCA's PDO. */\r
-static NTSTATUS\r
-__get_bus_ifc(\r
-    IN      DEVICE_OBJECT* const pDevObj,\r
-    IN      const   GUID* const pGuid,\r
-    OUT     MXE_INTERFACE *pBusIfc \r
-    )\r
-{\r
-    NTSTATUS status;\r
-    IO_STATUS_BLOCK ioStatus;\r
-    IO_STACK_LOCATION *pIoStack;\r
-    KEVENT event;\r
-\r
-    ASSERT( KeGetCurrentIrql() < DISPATCH_LEVEL );\r
-\r
-    KeInitializeEvent( &event, NotificationEvent, FALSE );\r
-\r
-    /* Build the IRP for the HCA. */\r
-    IRP* pIrp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, pDevObj, NULL, 0, NULL, &event, &ioStatus );\r
-    if( !pIrp )\r
-    {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("IoBuildSynchronousFsdRequest failed\n"));\r
-        return STATUS_INSUFFICIENT_RESOURCES;\r
-    }\r
-\r
-    /* Copy the request query parameters. */\r
-    pIoStack = IoGetNextIrpStackLocation( pIrp );\r
-    pIoStack->MinorFunction = IRP_MN_QUERY_INTERFACE;\r
-    pIoStack->Parameters.QueryInterface.Size = sizeof(MXE_INTERFACE);\r
-    pIoStack->Parameters.QueryInterface.Version = MXE_INTERFACE_VERSION;\r
-    pIoStack->Parameters.QueryInterface.InterfaceType = pGuid;\r
-    pIoStack->Parameters.QueryInterface.Interface = (INTERFACE*)pBusIfc;\r
-    pIoStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;\r
-\r
-    pIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;\r
-\r
-    /* Send the IRP. */\r
-    status = IoCallDriver( pDevObj, pIrp );\r
-    if( status == STATUS_PENDING )\r
-    {\r
-        KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );\r
-        status = ioStatus.Status;\r
-    }\r
-\r
-    return status;\r
-}\r
-\r
-\r
-VOID\r
-OsPortStateDpc(\r
-    IN struct _KDPC  *Dpc,\r
-    IN PVOID  DeferredContext,\r
-    IN PVOID  SystemArgument1,\r
-    IN PVOID  SystemArgument2\r
-    )\r
-{   \r
-    NicData_t* pNic = (NicData_t*)DeferredContext;\r
-    \r
-       //\r
-       // Check that the prot state has not been scheculed yet. If yes, it will be handled and we\r
-       // don't need to schedule it again\r
-       //\r
-       LONG fScheduled = InterlockedExchange (&pNic->fPortStateScheuled, TRUE);\r
-       if (!fScheduled)\r
-       {\r
-           NDIS_STATUS Status = NdisScheduleWorkItem(&pNic->PortStateWorkItem);\r
-       ASSERT(Status == NDIS_STATUS_SUCCESS); // must succeed Acording to the MSDN\r
-    }\r
-}\r
-\r
-VOID\r
-OsTimerDpc(\r
-    IN struct _KDPC  *Dpc,\r
-    IN PVOID  DeferredContext,\r
-    IN PVOID  SystemArgument1,\r
-    IN PVOID  SystemArgument2\r
-    )\r
-{\r
-    PMP_PORT Port = (PMP_PORT)DeferredContext;\r
-    struct mtnic_cq* cq = &Port->priv.cq[Port->priv.tx_ring[0].cq];\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("In a Timer DPC \n"));\r
-\r
-    ASSERT(Port->Config.fUseSendInt == FALSE);\r
-    mtnic_process_tx_cq(Port, cq);\r
-}\r
-\r
-\r
-VOID\r
-OsSendDpc(\r
-    IN struct _KDPC  *Dpc,\r
-    IN PVOID  DeferredContext,\r
-    IN PVOID  SystemArgument1,\r
-    IN PVOID  SystemArgument2\r
-    )\r
-{\r
-    PMP_PORT Port = (PMP_PORT)DeferredContext;\r
-    struct mtnic_cq* cq = (struct mtnic_cq*) SystemArgument1;\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("In a Send DPC \n"));\r
-\r
-    ASSERT(Port->Config.fUseSendInt == TRUE)\r
-    mtnic_process_tx_cq(Port, cq);\r
-}\r
-\r
-VOID\r
-OsRecvDpc(\r
-    IN struct _KDPC  *Dpc,\r
-    IN PVOID  DeferredContext,\r
-    IN PVOID  SystemArgument1,\r
-    IN PVOID  SystemArgument2\r
-    )\r
-{\r
-    PMP_PORT Port = (PMP_PORT)DeferredContext;\r
-    struct mtnic_cq* cq = (struct mtnic_cq*) SystemArgument1;\r
-    \r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("In a Receive DPC \n"));\r
-\r
-    mtnic_process_rx_cq(Port, cq);\r
-}\r
-\r
-\r
-PMP_PORT \r
-GetCompletionPort(\r
-    MtnicBusIfc* pMtnicIfc, \r
-    mtnic_eqe *eqe\r
-    )\r
-{\r
-    for (ULONG i = 0; i< MTNIC_MAX_PORTS; i++) \r
-    {\r
-        if (pMtnicIfc->ports[i].priv.port_state != PORT_UP)\r
-        {\r
-            continue;\r
-        }\r
-        \r
-        PMP_PORT pPort = &pMtnicIfc->ports[i];\r
-        \r
-        if ((eqe->ring_cq >= pMtnicIfc->nic.cq_offset[i]) &&\r
-            (eqe->ring_cq < pMtnicIfc->nic.cq_offset[i] + pPort->priv.cq_num))\r
-        {\r
-            return pPort;\r
-        }\r
-    }\r
-\r
-    return NULL;\r
-}\r
-\r
-/*++\r
-Routine Description:\r
-    Make sure that before we connect to the ISR again, there are no entries from\r
-    the previous time the driver was running.\r
-    \r
---*/\r
-VOID DrainEq(MtnicBusIfc* pMtnicIfc)\r
-{\r
-    mtnic_eq *eq = pMtnicIfc->nic.pEq;\r
-    mtnic_eqe *eqe = &eq->buf[eq->last_isr & (eq->size - 1)];\r
-    while (XNOR(eqe->own & MTNIC_BIT_EQE_OWN, eq->last_isr & eq->size)) \r
-    {\r
-        ++eq->last_isr;\r
-        WRITE_REGISTER_ULONG(pMtnicIfc->nic.eq_db, cpu_to_be32(eq->last_isr & 0xFFFFFF));    \r
-        eqe = &eq->buf[eq->last_isr & (eq->size - 1)];\r
-    }\r
-}\r
-\r
-BOOLEAN OsIsr( PVOID context )\r
-{\r
-    ULONG eqes_found = 0;\r
-    MtnicBusIfc* pMtnicIfc = (MtnicBusIfc*)context;\r
-    NicData_t*   pNicData = &pMtnicIfc->NicData;\r
-\r
-    mtnic_eq *eq = pMtnicIfc->nic.pEq;\r
-    mtnic_eqe *eqe = &eq->buf[eq->last_isr & (eq->size - 1)];\r
-\r
-    while (XNOR(eqe->own & MTNIC_BIT_EQE_OWN, eq->last_isr & eq->size)) \r
-    {\r
-        switch (eqe->type)\r
-        {\r
-            case MTNIC_EVENT_TYPE_COMP:\r
-            {\r
-                PMP_PORT pPort = GetCompletionPort(pMtnicIfc, eqe);\r
-                if (pPort == NULL) \r
-                {\r
-                    ETH_PRINT(TRACE_LEVEL_ERROR, ETH,  ("Received completion event on bogus CQ\n"));\r
-                    break;\r
-                }\r
-                ASSERT(pPort->pMtnicIfc == pMtnicIfc);\r
-                \r
-                //\r
-                // If the Port is in low power state, then it should not \r
-                // recognize any interrupt\r
-                // \r
-                if (pPort->CurrentPowerState > NdisDeviceStateD0) \r
-                {\r
-                    ASSERT(FALSE); \r
-                    break;\r
-                }\r
-                \r
-                ULONG cqId = eqe->ring_cq & pMtnicIfc->nic.cq_mask;\r
-                ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Received completion event for port:%d CQ:%d\n", pPort->priv.port, cqId));\r
-                \r
-                struct mtnic_cq* cq = &pPort->priv.cq[cqId];   \r
-                ++cq->arm_sn;                \r
-                if (cq->is_tx)\r
-                {\r
-                    ASSERT(pPort->Config.fUseSendInt == TRUE) \r
-                    // \r
-                    // insert DPC\r
-                    //\r
-                    INC_PERF_COUNTER(pPort->perf_counters.txInterrupt);\r
-                    \r
-                    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, ("Get complition event for send request in CQ number: %d\n", cq->num));\r
-                    KeInsertQueueDpc(&pPort->send_dpc, cq, NULL );                                        \r
-                }\r
-                else\r
-                {\r
-                    INC_PERF_COUNTER(pPort->perf_counters.rxInterrupt);\r
-                    \r
-                    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("Get complition event for Receive request in CQ number: %d\n", cq->num));\r
-\r
-                    mtnic_rx_ring* ring = &pPort->priv.rx_ring[cq->ring];\r
-                    if((pPort->priv.rx_steer == MTNIC_IF_STEER_RSS) && (pPort->priv.rss_map.RssCpuCount > 1))\r
-                    {\r
-                        ASSERT(ring != NULL);\r
-                        CCHAR CpuNumber = ring->cpu_number + (CCHAR)pPort->priv.rss_map.RssBaseCpu;\r
-                        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_RECV, ("process the Receive request from ring %x in CPU number: %d\n", cq->ring, CpuNumber));\r
-                        KeSetImportanceDpc(&ring->dpc, HighImportance);\r
-                        KeSetTargetProcessorDpc(&ring->dpc, CpuNumber);                        \r
-                    } \r
-\r
-                    KeInsertQueueDpc(&ring->dpc, cq, ring );\r
-                }\r
-                break;\r
-            }\r
-\r
-            case MTNIC_EVENT_PORT_CHANGE:  \r
-                KeInsertQueueDpc(&pNicData->PortStateDpc, NULL, NULL );\r
-                break;\r
-\r
-            case MTNIC_EVENT_RX_LOW_WM:\r
-            case MTNIC_EVENT_CQ_ERROR:\r
-            case MTNIC_INTERNAL_ERROR:                        \r
-                //\r
-                // Nothing to do but reset device. Set the relevant flag on Port object. Inform \r
-                // NDIS about the problem in CheckForHang function\r
-                //\r
-                ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Error event %d. Reset the NIC\n", eqe->type));\r
-                ASSERT(FALSE);\r
-                for (ULONG i = 0; i< MTNIC_MAX_PORTS; i++) \r
-                {\r
-                    PMP_PORT pPort = &pMtnicIfc->ports[i];\r
-                    MP_SET_NON_RECOVER_ERROR(pPort);\r
-                    \r
-                }\r
-                break;\r
-          \r
-             default:\r
-                 ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Unexpected event %d\n", eqe->type));\r
-                 ASSERT(FALSE);\r
-        }\r
-               ++eq->last_isr;\r
-        ++eqes_found;\r
-\r
-        WRITE_REGISTER_ULONG(pMtnicIfc->nic.eq_db, cpu_to_be32(eq->last_isr & 0xFFFFFF));\r
-     \r
-               eqe = &eq->buf[eq->last_isr & (eq->size - 1)];\r
-#ifdef DBG                \r
-        if (eqes_found > eq->size) \r
-        {\r
-            ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Polled more than %d EQEs in a single interrupt!? Stopping...\n", eq->size));\r
-            ASSERT(FALSE);\r
-            break;\r
-        }\r
-#endif /* DBG */\r
-        \r
-    }\r
-    \r
-    if(eqes_found == 0)\r
-    {\r
-        g_bogus_interrupts++;\r
-    }\r
-\r
-    eq->eq_no_progress = 0;\r
-    \r
-       return (eqes_found != 0);\r
-}\r
-\r
-extern "C" NDIS_STATUS DriverEntry(\r
-    IN  PDRIVER_OBJECT   pDriverObject,\r
-    IN  PUNICODE_STRING  RegistryPath\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-    pDriverObject   -   pointer to the driver object\r
-    RegistryPath    -   pointer to the driver registry path\r
-     \r
-Return Value:\r
-    \r
-    NDIS_STATUS - the value returned by NdisMRegisterMiniport \r
-    \r
---*/\r
-{\r
-    NDIS_STATUS                   Status;\r
-    NDIS_HANDLE                   NdisWrapperHandle;\r
-    NDIS_MINIPORT_CHARACTERISTICS MPChar;\r
-\r
-    g_pWorkerThreads = NULL;\r
-    bool WorkerThreadsInitiated = false;\r
-    bool NdisMInitializeWrapperInitated = false;\r
-\r
-    g_pDriverObject = pDriverObject;\r
-    KeInitializeSpinLock(&g_TraceLock);\r
-    #if defined(EVENT_TRACING)\r
-        WPP_INIT_TRACING(pDriverObject, RegistryPath);\r
-    #endif\r
-\r
-    ETH_ENTER(ETH);\r
-\r
-    Status = ReadRegistryDword(RegistryPath->Buffer, (PWSTR)x_MaxWorkingThreadValueName, g_MaximumWorkingThreads, &g_MaximumWorkingThreads);\r
-    if (!NT_SUCCESS(Status)) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("ReadRegistry failed\n"));\r
-        goto Cleanup;\r
-    }\r
-\r
-    Status = GenUtilsInit();\r
-    if (!NT_SUCCESS(Status)) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("MpAllocPortBlock failed\n"));\r
-        goto Cleanup;\r
-    }\r
-\r
-\r
-    //\r
-    // Notify the NDIS wrapper about this driver, get a NDIS wrapper handle back\r
-    //\r
-    NdisMInitializeWrapper(\r
-        &NdisWrapperHandle,\r
-        pDriverObject,\r
-        RegistryPath,\r
-        NULL);\r
-\r
-    if (NdisWrapperHandle == NULL) {\r
-        Status = NDIS_STATUS_FAILURE;\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("<==== DriverEntry failed to InitWrapper, Status=%x\n", Status));\r
-        goto Cleanup;\r
-    }\r
-    NdisMInitializeWrapperInitated = true;\r
-\r
-#if LBFO\r
-    InitializeListHead(&g_BundleList);\r
-    KeInitializeEvent(&g_BundleEvent, SynchronizationEvent, TRUE);\r
-    \r
-#endif      \r
-\r
-    //\r
-    // Fill in the Miniport characteristics structure with the version numbers \r
-    // and the entry points for driver-supplied MiniportXxx \r
-    //\r
-    NdisZeroMemory(&MPChar, sizeof(MPChar));\r
-\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.MajorNdisVersion         = MP_NDIS_MAJOR_VERSION;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.MinorNdisVersion         = MP_NDIS_MINOR_VERSION;\r
-\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.CheckForHangHandler      = MPCheckForHang;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.DisableInterruptHandler  = NULL;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.EnableInterruptHandler   = NULL;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.HaltHandler              = MPHalt;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.InitializeHandler        = MPInitialize;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.QueryInformationHandler  = MPQueryInformation;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.ResetHandler             = MPReset;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.SetInformationHandler    = MPSetInformation;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.HandleInterruptHandler   = NULL;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.Ndis30Chars.ISRHandler               = NULL;\r
-\r
-\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.ReturnPacketHandler      = MPReturnPacket;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.SendPacketsHandler       = MPSendPackets;\r
-    MPChar.Ndis51Chars.Ndis50Chars.Ndis40Chars.AllocateCompleteHandler  = MPAllocateComplete;\r
-\r
-    //\r
-    // Extensions for NDIS 5.1\r
-    //\r
-    MPChar.Ndis51Chars.CancelSendPacketsHandler = MPCancelSendPackets;\r
-    MPChar.Ndis51Chars.PnPEventNotifyHandler    = MPPnPEventNotify;\r
-    MPChar.Ndis51Chars.AdapterShutdownHandler   = MPShutdown;\r
-\r
-    //\r
-    // Extensions for NDIS 5.2\r
-    //\r
-    \r
-    //\r
-    // RSS related handlers.\r
-    //\r
-    MPChar.ISRHandlerEx = NULL;\r
-    MPChar.HandleInterruptHandlerEx = NULL;\r
-\r
-    //\r
-    // Generic Offload initiation and termination handlers.\r
-    //\r
-    MPChar.InitiateOffloadHandler = NULL;\r
-    MPChar.TerminateOffloadHandler = NULL;\r
-\r
-    //\r
-    // Generic offload state control functions.\r
-    //\r
-    MPChar.UpdateOffloadHandler = NULL;\r
-    MPChar.InvalidateOffloadHandler = NULL;\r
-    MPChar.QueryOffloadHandler = NULL;\r
-\r
-    //\r
-    // TCP function handlers\r
-    //\r
-    MPChar.TcpOffloadSendHandler = NULL;\r
-    MPChar.TcpOffloadReceiveHandler = NULL;\r
-    MPChar.TcpOffloadDisconnectHandler = NULL;\r
-    MPChar.TcpOffloadForwardHandler = NULL;\r
-\r
-    //\r
-    // Receive return handler.\r
-    //\r
-    MPChar.TcpOffloadReceiveReturnHandler = NULL;\r
-    MPChar.ReturnPacketsHandlerEx = NULL;\r
-    MPChar.RequestTimeoutDpcHandler = NULL;\r
-\r
-\r
-    g_pWorkerThreads = new WorkerThreads;\r
-    if (g_pWorkerThreads == NULL) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("new WorkerThreads failed\n"));\r
-        Status = STATUS_NO_MEMORY;\r
-        goto Cleanup;\r
-    }\r
-    Status = g_pWorkerThreads->Init();\r
-    if (!NT_SUCCESS(Status)) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("g_pWorkerThreads.Init failed status = 0x%x \n", Status));\r
-        goto Cleanup;\r
-    }\r
-    WorkerThreadsInitiated = true;\r
-\r
-    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Calling NdisMRegisterMiniport...\n"));\r
-\r
-    Status = NdisMRegisterMiniport(\r
-                 NdisWrapperHandle,\r
-                 &MPChar,\r
-                 sizeof(NDIS_MINIPORT_CHARACTERISTICS));\r
-\r
-    if (!NT_SUCCESS(Status)) {\r
-        ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("NdisMRegisterMiniport failed status=0x%x\n", Status));\r
-        goto Cleanup;\r
-    }\r
-    \r
-    NdisMRegisterUnloadHandler(NdisWrapperHandle, MPUnload);\r
-\r
-Cleanup:\r
-    if (!NT_SUCCESS(Status)) {\r
-        if(WorkerThreadsInitiated) {\r
-            g_pWorkerThreads->ShutDown();            \r
-        }\r
-        if(g_pWorkerThreads) {\r
-            delete g_pWorkerThreads;\r
-        }\r
-        if (NdisMInitializeWrapperInitated) {\r
-            NdisTerminateWrapper(NdisWrapperHandle, NULL);\r
-        }\r
-    }\r
-\r
-    ETH_EXIT(ETH);\r
-    return Status;\r
-}\r
-\r
-\r
-static\r
-NDIS_STATUS \r
-GetSupportedMediaType(\r
-    OUT PUINT           SelectedMediumIndex,\r
-    IN  PNDIS_MEDIUM    MediumArray,\r
-    IN  UINT            MediumArraySize\r
-)\r
-{\r
-    //\r
-    // Find the media type we support\r
-    //\r
-    for (UINT index = 0; index < MediumArraySize; ++index) \r
-    {\r
-        if (MediumArray[index] == NIC_MEDIA_TYPE) \r
-        {\r
-            *SelectedMediumIndex = index;\r
-            return NDIS_STATUS_SUCCESS;\r
-        }\r
-    }\r
-    \r
-    ETH_PRINT(TRACE_LEVEL_ERROR, ETH, ("Expected media (%x) is not in MediumArray.\n", NIC_MEDIA_TYPE));\r
-    return NDIS_STATUS_UNSUPPORTED_MEDIA;\r
-}\r
-\r
-VOID RssBalancerThread(void *pContext) {\r
-    PMP_PORT Port = PMP_PORT(pContext);\r
-    NTSTATUS Status = STATUS_SUCCESS;\r
-\r
-    ETH_PRINT(TRACE_LEVEL_INFORMATION, ETH, ("RssBalancerThread called \n"));\r
-\r
-    if (Port->Config.RssMode != RSS_MODE_AGGRESSIVE) {\r
-        // We just exit the function, there will be no rebalancing\r
-        return;\r
-    }