<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Helvetica;
        panose-1:2 11 5 4 2 2 2 2 2 4;}
@font-face
        {font-family:Courier;
        panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Tms Rmn";
        panose-1:2 2 6 3 4 5 5 2 3 4;}
@font-face
        {font-family:Helv;
        panose-1:2 11 6 4 2 2 2 3 2 4;}
@font-face
        {font-family:"New York";
        panose-1:2 4 5 3 6 5 6 2 3 4;}
@font-face
        {font-family:System;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:Batang;
        panose-1:2 3 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
        {font-family:Dotum;
        panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:SimHei;
        panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
        {font-family:MingLiU;
        panose-1:2 2 5 9 0 0 0 0 0 0;}
@font-face
        {font-family:Mincho;
        panose-1:2 2 6 9 4 3 5 8 3 5;}
@font-face
        {font-family:Gulim;
        panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:Century;
        panose-1:2 4 6 4 5 5 5 2 3 4;}
@font-face
        {font-family:"Angsana New";
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Cordia New";
        panose-1:2 11 3 4 2 2 2 2 2 4;}
@font-face
        {font-family:Mangal;
        panose-1:2 4 5 3 5 2 3 3 2 2;}
@font-face
        {font-family:Latha;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Sylfaen;
        panose-1:1 10 5 2 5 3 6 3 3 3;}
@font-face
        {font-family:Vrinda;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Raavi;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Shruti;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Sendnya;
        panose-1:0 0 4 0 0 0 0 0 0 0;}
@font-face
        {font-family:Gautami;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Tunga;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Estrangelo Edessa";
        panose-1:3 8 6 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:"Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Cambria;
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
span.msoDel
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:line-through;
        color:red;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
 /* List Definitions */
 @list l0
        {mso-list-id:575089512;
        mso-list-type:hybrid;
        mso-list-template-ids:329657756 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style><!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Signed-off-by: Irena Gannon (<a href="mailto:irena@mellanox.co.il">irena@mellanox.co.il</a>)
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This patch:<o:p></o:p></p>
<p class="MsoListParagraph" style="text-indent:-.25in;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">      
</span></span><![endif]><span dir="LTR"></span>Unifies some general utilities functions into one library called genutils (see core/genutils/kernel/readme.txt for details)<o:p></o:p></p>
<p class="MsoListParagraph" style="text-indent:-.25in;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">      
</span></span><![endif]><span dir="LTR"></span>Moves all l2w functionalities into a separate directory under the core dir<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/dirs<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/dirs               (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/dirs            (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -5,4 +5,6 @@<o:p></o:p></p>
<p class="MsoNormal">                iou                                          \<o:p></o:p></p>
<p class="MsoNormal">                ibat                        \<o:p></o:p></p>
<p class="MsoNormal">                winverbs             \<o:p></o:p></p>
<p class="MsoNormal">-              winmad<o:p></o:p></p>
<p class="MsoNormal">+             winmad                                \<o:p></o:p></p>
<p class="MsoNormal">+             genutils                \<o:p></o:p></p>
<p class="MsoNormal">+             l2w<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_precomp.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_precomp.h              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_precomp.h           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,16 @@<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_dbg.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_wpptrace.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <wdm.h><o:p></o:p></p>
<p class="MsoNormal">+#include <ntstrsafe.h>               <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <stdarg.h><o:p></o:p></p>
<p class="MsoNormal">+#include <string.h><o:p></o:p></p>
<p class="MsoNormal">+#include <strsafe.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/SOURCES<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/SOURCES           (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/SOURCES        (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,59 @@<o:p></o:p></p>
<p class="MsoNormal">+TARGETNAME=l2w<o:p></o:p></p>
<p class="MsoNormal">+TARGETPATH=..\..\..\bin\kernel\obj$(BUILD_ALT_DIR)<o:p></o:p></p>
<p class="MsoNormal">+TARGETTYPE=DRIVER_LIBRARY<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+!if $(FREEBUILD)<o:p></o:p></p>
<p class="MsoNormal">+ENABLE_EVENT_TRACING=1<o:p></o:p></p>
<p class="MsoNormal">+!else<o:p></o:p></p>
<p class="MsoNormal">+#ENABLE_EVENT_TRACING=1<o:p></o:p></p>
<p class="MsoNormal">+!endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+DLLDEF=l2w.def<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+SOURCES= \<o:p></o:p></p>
<p class="MsoNormal">+             l2w.rc    \<o:p></o:p></p>
<p class="MsoNormal">+             l2w.c                                      \<o:p></o:p></p>
<p class="MsoNormal">+             l2w_debug.c                                      \<o:p></o:p></p>
<p class="MsoNormal">+             l2w_radix.c                         \<o:p></o:p></p>
<p class="MsoNormal">+             packer.c                               \<o:p></o:p></p>
<p class="MsoNormal">+             ud_header.c                      \<o:p></o:p></p>
<p class="MsoNormal">+             l2w_memory.c                  \<o:p></o:p></p>
<p class="MsoNormal">+             l2w_workqueue.c                           \<o:p></o:p></p>
<p class="MsoNormal">+             l2w_umem.c                      \<o:p></o:p></p>
<p class="MsoNormal">+             l2w_dbg.c<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..\..\..\inc; \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\inc\kernel; \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\inc\kernel\l2w; \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\hw\mlx4\kernel\bus\inc; \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\hw\mlx4\kernel\bus\core; \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\hw\mlx4\kernel\bus\net; \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\hw\mlx4\kernel\inc; \<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS <o:p>
</o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+TARGETLIBS= \<o:p></o:p></p>
<p class="MsoNormal">+             $(TARGETPATH)\*\complib.lib \<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+!IFDEF ENABLE_EVENT_TRACING<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+C_DEFINES = $(C_DEFINES) -DEVENT_TRACING<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+RUN_WPP= $(SOURCES) -km -dll -ext: .c .cpp .h .C .CPP .H\<o:p></o:p></p>
<p class="MsoNormal">+             -preserveext:.c .h\<o:p></o:p></p>
<p class="MsoNormal">+             -scan:l2w_wpptrace.h\<o:p></o:p></p>
<p class="MsoNormal">+             -func:L2W_PRINT(LEVEL,FLAGS,MSG,...) <o:p></o:p></p>
<p class="MsoNormal">+!ENDIF<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+MC_SOURCEDIR=.  <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+MSC_WARNING_LEVEL= /W4<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+PRECOMPILED_INCLUDE=l2w_precomp.h<o:p></o:p></p>
<p class="MsoNormal">+PRECOMPILED_PCH=l2w_precomp.pch<o:p></o:p></p>
<p class="MsoNormal">+PRECOMPILED_CXX=1<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w.c    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w.c (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,282 @@<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "core.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "pa_cash.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "mlx4.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* Nth element of the table contains the index of the first set bit of N; 8 - for N=0 */<o:p></o:p></p>
<p class="MsoNormal">+char g_set_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* Nth element of the table contains the index of the first 0 bit of N; 8 - for N=255 */<o:p></o:p></p>
<p class="MsoNormal">+char g_clr_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* interval for a cmd go-bit waiting */<o:p></o:p></p>
<p class="MsoNormal">+// TODO: not clear what is to be this value:<o:p></o:p></p>
<p class="MsoNormal">+// 1. it has to be enough great, so as the tread will go waiting;<o:p></o:p></p>
<p class="MsoNormal">+// 2. it has to be enough small, so as there is no too large waiting after first command try;<o:p></o:p></p>
<p class="MsoNormal">+// 3. it has to be enough great, so as not to cause to intensive rescheduling;<o:p></o:p></p>
<p class="MsoNormal">+#define CMD_WAIT_USECS                                     2<o:p></o:p></p>
<p class="MsoNormal">+#define CMD_WAIT_INTERVAL                              ((-10) * CMD_WAIT_USECS)<o:p></o:p></p>
<p class="MsoNormal">+LARGE_INTEGER g_cmd_interval = { (ULONG)CMD_WAIT_INTERVAL, 0 };<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// PCI POOL <o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+pci_pool_t *<o:p></o:p></p>
<p class="MsoNormal">+pci_pool_create (const char *name, struct pci_dev *pdev,<o:p></o:p></p>
<p class="MsoNormal">+             size_t size, size_t align, size_t allocation)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             pci_pool_t *pool;<o:p></o:p></p>
<p class="MsoNormal">+             UNREFERENCED_PARAMETER(align);<o:p></o:p></p>
<p class="MsoNormal">+             UNREFERENCED_PARAMETER(allocation);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             // allocation parameter is not handled yet<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(allocation == 0);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: not absolutely correct: Linux's pci_pool_alloc provides contiguous physical memory,<o:p></o:p></p>
<p class="MsoNormal">+             // while default alloc function  - ExAllocatePoolWithTag -doesn't.<o:p></o:p></p>
<p class="MsoNormal">+             // But for now it is used for elements of size <= PAGE_SIZE<o:p></o:p></p>
<p class="MsoNormal">+             // Anyway - a sanity check:<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(size <= PAGE_SIZE);<o:p></o:p></p>
<p class="MsoNormal">+             if (size > PAGE_SIZE)<o:p></o:p></p>
<p class="MsoNormal">+                             return NULL;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // allocate object<o:p></o:p></p>
<p class="MsoNormal">+             pool = (pci_pool_t *)ExAllocatePoolWithTag( NonPagedPool, sizeof(pci_pool_t), MT_TAG_PCIPOOL );<o:p></o:p></p>
<p class="MsoNormal">+             if (pool == NULL) <o:p></o:p></p>
<p class="MsoNormal">+                             return NULL;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: not too effective: one can read its own alloc/free functions<o:p></o:p></p>
<p class="MsoNormal">+             ExInitializeNPagedLookasideList( &pool->pool_hdr, NULL, NULL, 0, size, MT_TAG_PCIPOOL, 0 );<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             // fill the object<o:p></o:p></p>
<p class="MsoNormal">+             pool->mdev = pdev->dev;<o:p></o:p></p>
<p class="MsoNormal">+             pool->size = size;<o:p></o:p></p>
<p class="MsoNormal">+             strncpy( pool->name, name, sizeof pool->name );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return pool;                        <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// BIT TECHNIQUES <o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void fill_bit_tbls()<o:p></o:p></p>
<p class="MsoNormal">+{            <o:p></o:p></p>
<p class="MsoNormal">+             unsigned long i;<o:p></o:p></p>
<p class="MsoNormal">+             for (i=0; i<256; ++i) {<o:p></o:p></p>
<p class="MsoNormal">+                             g_set_bit_tbl[i] = (char)(_ffs_raw(&i,0) - 1);<o:p></o:p></p>
<p class="MsoNormal">+                             g_clr_bit_tbl[i] = (char)(_ffz_raw(&i,0) - 1);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             g_set_bit_tbl[0] = g_clr_bit_tbl[255] = 8;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// BIT MAPS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int __bitmap_full(const unsigned long *bitmap, int bits)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int k, lim = bits/BITS_PER_LONG;<o:p></o:p></p>
<p class="MsoNormal">+             for (k = 0; k < lim; ++k)<o:p></o:p></p>
<p class="MsoNormal">+                             if (~bitmap[k])<o:p></o:p></p>
<p class="MsoNormal">+                             return 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (bits % BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">+                             if (~bitmap[k] & BITMAP_LAST_WORD_MASK(bits))<o:p></o:p></p>
<p class="MsoNormal">+                             return 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return 1;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int __bitmap_empty(const unsigned long *bitmap, int bits)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int k, lim = bits/BITS_PER_LONG;<o:p></o:p></p>
<p class="MsoNormal">+             for (k = 0; k < lim; ++k)<o:p></o:p></p>
<p class="MsoNormal">+                             if (bitmap[k])<o:p></o:p></p>
<p class="MsoNormal">+                                             return 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (bits % BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">+                             if (bitmap[k] & BITMAP_LAST_WORD_MASK(bits))<o:p></o:p></p>
<p class="MsoNormal">+                                             return 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return 1;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// DEBUG PRINT<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+WriteEventLogEntry(<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Routine Description:<o:p></o:p></p>
<p class="MsoNormal">+    Writes an event log entry to the event log.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Arguments:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             pi_pIoObject......... The IO object ( driver object or device object ).<o:p></o:p></p>
<p class="MsoNormal">+             pi_ErrorCode......... The error code.<o:p></o:p></p>
<p class="MsoNormal">+             pi_UniqueErrorCode... A specific error code.<o:p></o:p></p>
<p class="MsoNormal">+             pi_FinalStatus....... The final status.<o:p></o:p></p>
<p class="MsoNormal">+             pi_nDataItems........ Number of data items.<o:p></o:p></p>
<p class="MsoNormal">+             .<o:p></o:p></p>
<p class="MsoNormal">+             . data items values<o:p></o:p></p>
<p class="MsoNormal">+             .<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Return Value:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             None .<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+{ /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Variable argument list */    <o:p></o:p></p>
<p class="MsoNormal">+             va_list                                                                   l_Argptr;<o:p></o:p></p>
<p class="MsoNormal">+             /* Pointer to an error log entry */<o:p></o:p></p>
<p class="MsoNormal">+             PIO_ERROR_LOG_PACKET           l_pErrorLogEntry;
<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Init the variable argument list */   <o:p></o:p></p>
<p class="MsoNormal">+             va_start(l_Argptr, pi_nDataItems);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Allocate an error log entry */ <o:p></o:p></p>
<p class="MsoNormal">+             l_pErrorLogEntry = <o:p></o:p></p>
<p class="MsoNormal">+             (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                             pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                             (UCHAR)(sizeof(IO_ERROR_LOG_PACKET)+pi_nDataItems*sizeof(ULONG))<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                             );
<o:p></o:p></p>
<p class="MsoNormal">+             /* Check allocation */<o:p></o:p></p>
<p class="MsoNormal">+             if ( l_pErrorLogEntry != NULL) <o:p></o:p></p>
<p class="MsoNormal">+             { /* OK */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Data item index */<o:p></o:p></p>
<p class="MsoNormal">+                             USHORT l_nDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Set the error log entry header */<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->ErrorCode                                     = pi_ErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->DumpDataSize                            = (USHORT) (pi_nDataItems*sizeof(ULONG));
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->SequenceNumber    = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->MajorFunctionCode = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->IoControlCode                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->RetryCount                  = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->UniqueErrorValue     = pi_UniqueErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->FinalStatus                    = pi_FinalStatus;
<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Insert the data items */<o:p></o:p></p>
<p class="MsoNormal">+                             for (l_nDataItem = 0; l_nDataItem < pi_nDataItems; l_nDataItem++)
<o:p></o:p></p>
<p class="MsoNormal">+                             { /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             /* Current data item */<o:p></o:p></p>
<p class="MsoNormal">+                                             int l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+                                                            
<o:p></o:p></p>
<p class="MsoNormal">+                                             /* Get next data item */<o:p></o:p></p>
<p class="MsoNormal">+                                             l_CurDataItem = va_arg( l_Argptr, int);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             /* Put it into the data array */<o:p></o:p></p>
<p class="MsoNormal">+                                             l_pErrorLogEntry->DumpData[l_nDataItem] = l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             } /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Write the packet */<o:p></o:p></p>
<p class="MsoNormal">+                             IoWriteErrorLogEntry(l_pErrorLogEntry);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             } /* OK */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Term the variable argument list */   <o:p></o:p></p>
<p class="MsoNormal">+             va_end(l_Argptr);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+} /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// GENERAL <o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// from lib/string.c<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* strlcpy - Copy a %NUL terminated string into a sized buffer<o:p></o:p></p>
<p class="MsoNormal">+* @dest: Where to copy the string to<o:p></o:p></p>
<p class="MsoNormal">+* @src: Where to copy the string from<o:p></o:p></p>
<p class="MsoNormal">+* @size: size of destination buffer<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* Compatible with *BSD: the result is always a valid<o:p></o:p></p>
<p class="MsoNormal">+* NUL-terminated string that fits in the buffer (unless,<o:p></o:p></p>
<p class="MsoNormal">+* of course, the buffer size is zero). It does not pad<o:p></o:p></p>
<p class="MsoNormal">+* out the result like strncpy() does.<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+SIZE_T strlcpy(char *dest, const void *src, SIZE_T size)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             SIZE_T ret = strlen(src);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (size) {<o:p></o:p></p>
<p class="MsoNormal">+                             SIZE_T len = (ret >= size) ? size-1 : ret;<o:p></o:p></p>
<p class="MsoNormal">+                             memcpy(dest, src, len);<o:p></o:p></p>
<p class="MsoNormal">+                             dest[len] = '\0';<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return ret;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int parse_dev_location(<o:p></o:p></p>
<p class="MsoNormal">+             const char *buffer,<o:p></o:p></p>
<p class="MsoNormal">+             const char *format,<o:p></o:p></p>
<p class="MsoNormal">+             int *bus, int *dev, int *func<o:p></o:p></p>
<p class="MsoNormal">+)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return sscanf( buffer, format, bus, dev, func );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int core_init()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int err;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             fill_bit_tbls();<o:p></o:p></p>
<p class="MsoNormal">+             init_qp_state_tbl();<o:p></o:p></p>
<p class="MsoNormal">+             err =  ib_core_init();<o:p></o:p></p>
<p class="MsoNormal">+             if (err)<o:p></o:p></p>
<p class="MsoNormal">+                             return err;<o:p></o:p></p>
<p class="MsoNormal">+             return pa_cash_init();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void core_cleanup()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ib_core_cleanup();<o:p></o:p></p>
<p class="MsoNormal">+             pa_cash_release();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int l2w_init()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             fill_bit_tbls();<o:p></o:p></p>
<p class="MsoNormal">+    init_workqueues();<o:p></o:p></p>
<p class="MsoNormal">+             return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void l2w_cleanup()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    shutdown_workqueues();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/packer.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/packer.c             (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/packer.c          (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,214 @@<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">+ * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">+ * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">+ * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">+ * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">+ *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">+ *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">+ *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">+ * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * $Id: packer.c 1349 2004-12-16 21:09:43Z roland $<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "ib_pack.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_dbg.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_wpptrace.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#include "packer.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static u64 value_read(int offset, int size, u8 *structure)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             switch (size) {<o:p></o:p></p>
<p class="MsoNormal">+             case 1: return                *(u8  *) (structure + offset);<o:p></o:p></p>
<p class="MsoNormal">+             case 2: return be16_to_cpup((__be16 *) (structure + offset));<o:p></o:p></p>
<p class="MsoNormal">+             case 4: return be32_to_cpup((__be32 *) (structure + offset));<o:p></o:p></p>
<p class="MsoNormal">+             case 8: return be64_to_cpup((__be64 *) (structure + offset));<o:p></o:p></p>
<p class="MsoNormal">+             default:<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Field size %d bits not handled\n", size * 8);<o:p></o:p></p>
<p class="MsoNormal">+                             return 0;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_pack - Pack a structure into a buffer<o:p></o:p></p>
<p class="MsoNormal">+ * @desc:Array of structure field descriptions<o:p></o:p></p>
<p class="MsoNormal">+ * @desc_len:Number of entries in @desc<o:p></o:p></p>
<p class="MsoNormal">+ * @structure:Structure to pack from<o:p></o:p></p>
<p class="MsoNormal">+ * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_pack() packs a list of structure fields into a buffer,<o:p></o:p></p>
<p class="MsoNormal">+ * controlled by the array of fields in @desc.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+void ib_pack(const struct ib_field        *desc,<o:p></o:p></p>
<p class="MsoNormal">+                  int                           desc_len,<o:p></o:p></p>
<p class="MsoNormal">+                  void                         *structure,<o:p></o:p></p>
<p class="MsoNormal">+                  u8                         *buf)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int i;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             for (i = 0; i < desc_len; ++i) {<o:p></o:p></p>
<p class="MsoNormal">+                             if (desc[i].size_bits <= 32) {<o:p></o:p></p>
<p class="MsoNormal">+                                             int shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             u32 val;<o:p></o:p></p>
<p class="MsoNormal">+                                             __be32 mask;<o:p></o:p></p>
<p class="MsoNormal">+                                             __be32 *addr;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             shift = 32 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">+                                             if (desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">+                                                             val = (u32)(value_read((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                                             (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                                             structure) << shift);<o:p></o:p></p>
<p class="MsoNormal">+                                             else<o:p></o:p></p>
<p class="MsoNormal">+                                                             val = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             mask = cpu_to_be32(((1ull << desc[i].size_bits) - 1) << shift);<o:p></o:p></p>
<p class="MsoNormal">+                                             addr = (__be32 *) buf + desc[i].offset_words;<o:p></o:p></p>
<p class="MsoNormal">+                                             *addr = (*addr & ~mask) | (cpu_to_be32(val) & mask);<o:p></o:p></p>
<p class="MsoNormal">+                             } else if (desc[i].size_bits <= 64) {<o:p></o:p></p>
<p class="MsoNormal">+                                             int shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             u64 val;<o:p></o:p></p>
<p class="MsoNormal">+                                             __be64 mask;<o:p></o:p></p>
<p class="MsoNormal">+                                             __be64 *addr;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             shift = 64 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">+                                             if (desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">+                                                             val = value_read((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                                             (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                                             structure) << shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             else<o:p></o:p></p>
<p class="MsoNormal">+                                                             val = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             mask = cpu_to_be64((~0ull >> (64 - desc[i].size_bits)) << shift);<o:p></o:p></p>
<p class="MsoNormal">+                                             addr = (__be64 *) ((__be32 *) buf + desc[i].offset_words);<o:p></o:p></p>
<p class="MsoNormal">+                                             *addr = (*addr & ~mask) | (cpu_to_be64(val) & mask);<o:p></o:p></p>
<p class="MsoNormal">+                             } else {<o:p></o:p></p>
<p class="MsoNormal">+                                             if (desc[i].offset_bits % 8 ||<o:p></o:p></p>
<p class="MsoNormal">+                                                 desc[i].size_bits   % 8) {<o:p></o:p></p>
<p class="MsoNormal">+                                                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W ,<o:p></o:p></p>
<p class="MsoNormal">+                                                                             "Structure field %s of size %d bits is not byte-aligned\n",<o:p></o:p></p>
<p class="MsoNormal">+                                                                    desc[i].field_name, desc[i].size_bits);<o:p></o:p></p>
<p class="MsoNormal">+                                             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             if (desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">+                                                             memcpy(buf + desc[i].offset_words * 4 +<o:p></o:p></p>
<p class="MsoNormal">+                                                                    desc[i].offset_bits / 8,<o:p></o:p></p>
<p class="MsoNormal">+                                                                    (u8*)structure + desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                    desc[i].size_bits / 8);<o:p></o:p></p>
<p class="MsoNormal">+                                             else<o:p></o:p></p>
<p class="MsoNormal">+                                                             memset(buf + desc[i].offset_words * 4 +<o:p></o:p></p>
<p class="MsoNormal">+                                                                    desc[i].offset_bits / 8,<o:p></o:p></p>
<p class="MsoNormal">+                                                                    0,<o:p></o:p></p>
<p class="MsoNormal">+                                                                    desc[i].size_bits / 8);<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+EXPORT_SYMBOL(ib_pack);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static void value_write(int offset, int size, u64 val, u8 *structure)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             switch (size * 8) {<o:p></o:p></p>
<p class="MsoNormal">+             case 8:  *(    u8 *) (structure + offset) = (u8)val; break;<o:p></o:p></p>
<p class="MsoNormal">+             case 16: *(__be16 *) (structure + offset) = cpu_to_be16(val); break;<o:p></o:p></p>
<p class="MsoNormal">+             case 32: *(__be32 *) (structure + offset) = cpu_to_be32(val); break;<o:p></o:p></p>
<p class="MsoNormal">+             case 64: *(__be64 *) (structure + offset) = cpu_to_be64(val); break;<o:p></o:p></p>
<p class="MsoNormal">+             default:<o:p></o:p></p>
<p class="MsoNormal">+             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Field size %d bits not handled\n", size * 8);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_unpack - Unpack a buffer into a structure<o:p></o:p></p>
<p class="MsoNormal">+ * @desc:Array of structure field descriptions<o:p></o:p></p>
<p class="MsoNormal">+ * @desc_len:Number of entries in @desc<o:p></o:p></p>
<p class="MsoNormal">+ * @buf:Buffer to unpack from<o:p></o:p></p>
<p class="MsoNormal">+ * @structure:Structure to unpack into<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_pack() unpacks a list of structure fields from a buffer,<o:p></o:p></p>
<p class="MsoNormal">+ * controlled by the array of fields in @desc.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+void ib_unpack(const struct ib_field        *desc,<o:p></o:p></p>
<p class="MsoNormal">+                    int                           desc_len,<o:p></o:p></p>
<p class="MsoNormal">+                    void                         *buf,<o:p></o:p></p>
<p class="MsoNormal">+                    void                         *structure)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int i;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             for (i = 0; i < desc_len; ++i) {<o:p></o:p></p>
<p class="MsoNormal">+                             if (!desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">+                                             continue;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if (desc[i].size_bits <= 32) {<o:p></o:p></p>
<p class="MsoNormal">+                                             int shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             u32  val;<o:p></o:p></p>
<p class="MsoNormal">+                                             u32  mask;<o:p></o:p></p>
<p class="MsoNormal">+                                             __be32 *addr;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             shift = 32 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">+                                             mask = ((1ull << desc[i].size_bits) - 1) << shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             addr = (__be32 *) buf + desc[i].offset_words;<o:p></o:p></p>
<p class="MsoNormal">+                                             val = (be32_to_cpup(addr) & mask) >> shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             value_write((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 val,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 structure);<o:p></o:p></p>
<p class="MsoNormal">+                             } else if (desc[i].size_bits <= 64) {<o:p></o:p></p>
<p class="MsoNormal">+                                             int shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             u64  val;<o:p></o:p></p>
<p class="MsoNormal">+                                             u64  mask;<o:p></o:p></p>
<p class="MsoNormal">+                                             __be64 *addr;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             shift = 64 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">+                                             mask = (~0ull >> (64 - desc[i].size_bits)) << shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             addr = (__be64 *) buf + desc[i].offset_words;<o:p></o:p></p>
<p class="MsoNormal">+                                             val = (be64_to_cpup(addr) & mask) >> shift;<o:p></o:p></p>
<p class="MsoNormal">+                                             value_write((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 val,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 structure);<o:p></o:p></p>
<p class="MsoNormal">+                             } else {<o:p></o:p></p>
<p class="MsoNormal">+                                             if (desc[i].offset_bits % 8 ||<o:p></o:p></p>
<p class="MsoNormal">+                                                 desc[i].size_bits   % 8) {<o:p></o:p></p>
<p class="MsoNormal">+                                                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W ,
<o:p></o:p></p>
<p class="MsoNormal">+                                                                                             "Structure field %s of size %d bits is not byte-aligned\n",<o:p></o:p></p>
<p class="MsoNormal">+                                                                    desc[i].field_name, desc[i].size_bits);<o:p></o:p></p>
<p class="MsoNormal">+                                             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             memcpy((u8*)structure + desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                    (u8*)buf + desc[i].offset_words * 4 +<o:p></o:p></p>
<p class="MsoNormal">+                                                    desc[i].offset_bits / 8,<o:p></o:p></p>
<p class="MsoNormal">+                                                    desc[i].size_bits / 8);<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+EXPORT_SYMBOL(ib_unpack);<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_wpptrace.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_wpptrace.c              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_wpptrace.c           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,24 @@<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_wpptrace.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+u32 ROUNDUP_LOG2(u32 arg)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 1)    return 0;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 2)    return 1;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 4)    return 2;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 8)    return 3;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 16)   return 4;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 32)   return 5;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 64)   return 6;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 128)  return 7;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 256)  return 8;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 512)  return 9;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 1024) return 10;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 2048) return 11;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 4096) return 12;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 8192) return 13;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 16384) return 14;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 32768) return 15;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 65536) return 16;<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+    return 32;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_debug.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_debug.c    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_debug.c (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,440 @@<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "device.h"<o:p></o:p></p>
<p class="MsoNormal">+//#include "ev_log.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define MAX_BUFFER_SIZE                     256<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct mlx4_dev;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* <o:p></o:p></p>
<p class="MsoNormal">+ * This function sends to Event Log messages with one WCHAR string and several binary parameters.<o:p></o:p></p>
<p class="MsoNormal">+ * The string will be inserted instead of %2 parameter of the message.<o:p></o:p></p>
<p class="MsoNormal">+ * Binary parameters will be shown in Dump Area of the message.<o:p></o:p></p>
<p class="MsoNormal">+ * Binary parameters should be of type LONG.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+WriteEventLogEntryStr(<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">+             PWCHAR              pi_InsertionStr,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Routine Description:<o:p></o:p></p>
<p class="MsoNormal">+    Writes an event log entry to the event log.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Arguments:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             pi_pIoObject......... The IO object ( driver object or device object ).<o:p></o:p></p>
<p class="MsoNormal">+             pi_ErrorCode......... The error code.<o:p></o:p></p>
<p class="MsoNormal">+             pi_UniqueErrorCode... A specific error code.<o:p></o:p></p>
<p class="MsoNormal">+             pi_FinalStatus....... The final status.<o:p></o:p></p>
<p class="MsoNormal">+             pi_nDataItems........ Number of data items.<o:p></o:p></p>
<p class="MsoNormal">+             .<o:p></o:p></p>
<p class="MsoNormal">+             . data items values<o:p></o:p></p>
<p class="MsoNormal">+             .<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Return Value:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             None .<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+{ /* WriteEventLogEntryStr */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Variable argument list */    <o:p></o:p></p>
<p class="MsoNormal">+             va_list                                                                   l_Argptr;<o:p></o:p></p>
<p class="MsoNormal">+             /* Pointer to an error log entry */<o:p></o:p></p>
<p class="MsoNormal">+             PIO_ERROR_LOG_PACKET           l_pErrorLogEntry;
<o:p></o:p></p>
<p class="MsoNormal">+             /* sizeof insertion string */<o:p></o:p></p>
<p class="MsoNormal">+             int           l_Size = (int)((pi_InsertionStr) ? ((wcslen(pi_InsertionStr) + 1) * sizeof( WCHAR )) : 0);<o:p></o:p></p>
<p class="MsoNormal">+             int l_PktSize =sizeof(IO_ERROR_LOG_PACKET)+pi_nDataItems*sizeof(ULONG);<o:p></o:p></p>
<p class="MsoNormal">+             int l_TotalSize =l_PktSize +l_Size;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (pi_pIoObject == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(pi_pIoObject != NULL);<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Init the variable argument list */   <o:p></o:p></p>
<p class="MsoNormal">+             va_start(l_Argptr, pi_nDataItems);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Allocate an error log entry */ <o:p></o:p></p>
<p class="MsoNormal">+             if (l_TotalSize >= ERROR_LOG_MAXIMUM_SIZE - 2)
<o:p></o:p></p>
<p class="MsoNormal">+                             l_TotalSize = ERROR_LOG_MAXIMUM_SIZE - 2;<o:p></o:p></p>
<p class="MsoNormal">+             l_pErrorLogEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(<o:p></o:p></p>
<p class="MsoNormal">+                             pi_pIoObject,  (UCHAR)l_TotalSize );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Check allocation */<o:p></o:p></p>
<p class="MsoNormal">+             if ( l_pErrorLogEntry != NULL) <o:p></o:p></p>
<p class="MsoNormal">+             { /* OK */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Data item index */<o:p></o:p></p>
<p class="MsoNormal">+                             USHORT l_nDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Set the error log entry header */<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->ErrorCode                                     = pi_ErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->DumpDataSize                            = (USHORT) (pi_nDataItems*sizeof(ULONG));
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->SequenceNumber    = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->MajorFunctionCode = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->IoControlCode                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->RetryCount                  = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->UniqueErrorValue     = pi_UniqueErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->FinalStatus                    = pi_FinalStatus;
<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Insert the data items */<o:p></o:p></p>
<p class="MsoNormal">+                             for (l_nDataItem = 0; l_nDataItem < pi_nDataItems; l_nDataItem++)
<o:p></o:p></p>
<p class="MsoNormal">+                             { /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             /* Current data item */<o:p></o:p></p>
<p class="MsoNormal">+                                             int l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+                                                            
<o:p></o:p></p>
<p class="MsoNormal">+                                             /* Get next data item */<o:p></o:p></p>
<p class="MsoNormal">+                                             l_CurDataItem = va_arg( l_Argptr, int);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             /* Put it into the data array */<o:p></o:p></p>
<p class="MsoNormal">+                                             l_pErrorLogEntry->DumpData[l_nDataItem] = l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             } /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* add insertion string */<o:p></o:p></p>
<p class="MsoNormal">+                             if (pi_InsertionStr) {<o:p></o:p></p>
<p class="MsoNormal">+                                             char *ptr; <o:p>
</o:p></p>
<p class="MsoNormal">+                                             int sz = min( l_TotalSize - l_PktSize, l_Size );<o:p></o:p></p>
<p class="MsoNormal">+                                             l_pErrorLogEntry->NumberOfStrings = 1;<o:p></o:p></p>
<p class="MsoNormal">+                                             l_pErrorLogEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET) + l_pErrorLogEntry->DumpDataSize;<o:p></o:p></p>
<p class="MsoNormal">+                                             ptr = (char*)l_pErrorLogEntry + l_pErrorLogEntry->StringOffset;<o:p></o:p></p>
<p class="MsoNormal">+                                             memcpy( ptr, pi_InsertionStr, sz );<o:p></o:p></p>
<p class="MsoNormal">+                                             *(WCHAR*)&ptr[sz - 2] = (WCHAR)0;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             /* Write the packet */<o:p></o:p></p>
<p class="MsoNormal">+                             IoWriteErrorLogEntry(l_pErrorLogEntry);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             } /* OK */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Term the variable argument list */   <o:p></o:p></p>
<p class="MsoNormal">+             va_end(l_Argptr);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+} /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* <o:p></o:p></p>
<p class="MsoNormal">+ * This function sends to Event Log messages with various parameters.<o:p></o:p></p>
<p class="MsoNormal">+ * Every parameter should be coded as a pair: a format specifier and the value.<o:p></o:p></p>
<p class="MsoNormal">+ * 'pi_nDataItems' presents the number of the pairs.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * Here is an example:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * To print a message (from MC file) like:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *                          MessageId=0x0006 Facility=MLX4 Severity=Informational SymbolicName=EVENT_MLX4_INFO_TEST<o:p></o:p></p>
<p class="MsoNormal">+ *                          Language=English<o:p></o:p></p>
<p class="MsoNormal">+ *                          some_long %2, some_short %3, some_byte %4, some_wide_char_str %5, some_ansii_str %6<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * you have to code:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *                          WriteEventLogEntryData( pdev->p_self_do, (ULONG)EVENT_MLX4_INFO_TEST, 0, 0, 5,<o:p></o:p></p>
<p class="MsoNormal">+ *                                          L"%d", long_int,                                                                                                               // LONG<o:p></o:p></p>
<p class="MsoNormal">+ *                                          L"%04x", (ULONG)short_int,                                                                      // SHORT<o:p></o:p></p>
<p class="MsoNormal">+ *                                          L"%02x", (ULONG)byte_int,                                                                        // CHAR<o:p></o:p></p>
<p class="MsoNormal">+ *                                          L"%s", wide_char_str,                                                                                   // PWCHAR<o:p></o:p></p>
<p class="MsoNormal">+ *                                          L"%S", ansii_str                                                                                                 // PCHAR<o:p></o:p></p>
<p class="MsoNormal">+ *                          );<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+WriteEventLogEntryData(<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Routine Description:<o:p></o:p></p>
<p class="MsoNormal">+    Writes an event log entry to the event log.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Arguments:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             pi_pIoObject......... The IO object ( driver object or device object ).<o:p></o:p></p>
<p class="MsoNormal">+             pi_ErrorCode......... The error code.<o:p></o:p></p>
<p class="MsoNormal">+             pi_UniqueErrorCode... A specific error code.<o:p></o:p></p>
<p class="MsoNormal">+             pi_FinalStatus....... The final status.<o:p></o:p></p>
<p class="MsoNormal">+             pi_nDataItems........ Number of data items (i.e. pairs of data parameters).<o:p></o:p></p>
<p class="MsoNormal">+             .<o:p></o:p></p>
<p class="MsoNormal">+             . data items values<o:p></o:p></p>
<p class="MsoNormal">+             .<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Return Value:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             None .<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+{ /* WriteEventLogEntryData */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Variable argument list */    <o:p></o:p></p>
<p class="MsoNormal">+             va_list                                                                   l_Argptr;<o:p></o:p></p>
<p class="MsoNormal">+             /* Pointer to an error log entry */<o:p></o:p></p>
<p class="MsoNormal">+             PIO_ERROR_LOG_PACKET           l_pErrorLogEntry;
<o:p></o:p></p>
<p class="MsoNormal">+             /* sizeof insertion string */<o:p></o:p></p>
<p class="MsoNormal">+             int           l_Size = 0;            <o:p></o:p></p>
<p class="MsoNormal">+             /* temp buffer */<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR l_Buf[ERROR_LOG_MAXIMUM_SIZE - 2];<o:p></o:p></p>
<p class="MsoNormal">+             /* position in buffer */<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR * l_Ptr = l_Buf;<o:p></o:p></p>
<p class="MsoNormal">+             /* Data item index */<o:p></o:p></p>
<p class="MsoNormal">+             USHORT l_nDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+             /* total packet size */<o:p></o:p></p>
<p class="MsoNormal">+             int l_TotalSize;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (pi_pIoObject == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(pi_pIoObject != NULL);<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Init the variable argument list */   <o:p></o:p></p>
<p class="MsoNormal">+             va_start(l_Argptr, pi_nDataItems);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Create the insertion strings Insert the data items */<o:p></o:p></p>
<p class="MsoNormal">+             memset( l_Buf, 0, sizeof(l_Buf) );<o:p></o:p></p>
<p class="MsoNormal">+             for (l_nDataItem = 0; l_nDataItem < pi_nDataItems; l_nDataItem++)
<o:p></o:p></p>
<p class="MsoNormal">+             { <o:p></o:p></p>
<p class="MsoNormal">+                             NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">+                             /* Current binary data item */<o:p></o:p></p>
<p class="MsoNormal">+                             int l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+                             /* Current pointer data item */<o:p></o:p></p>
<p class="MsoNormal">+                             void* l_CurPtrDataItem ;<o:p></o:p></p>
<p class="MsoNormal">+                             /* format specifier */<o:p></o:p></p>
<p class="MsoNormal">+                             WCHAR* l_FormatStr;<o:p></o:p></p>
<p class="MsoNormal">+                             /* the rest of the buffer */<o:p></o:p></p>
<p class="MsoNormal">+                             int l_BufSize = (int)(l_Buf + sizeof(l_Buf)- l_Ptr);<o:p></o:p></p>
<p class="MsoNormal">+                             /* size of insertion string */<o:p></o:p></p>
<p class="MsoNormal">+                             size_t l_StrSize;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* print as much as we can */<o:p></o:p></p>
<p class="MsoNormal">+                             if ( l_BufSize < 4 )<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             /* Get format specifier */<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+                             l_FormatStr = va_arg( l_Argptr, PWCHAR);<o:p></o:p></span></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+                             /* Get next data item */<o:p></o:p></p>
<p class="MsoNormal">+                             if ( !wcscmp( l_FormatStr, L"%s" ) || !wcscmp( l_FormatStr, L"%S" ) ) {<o:p></o:p></p>
<p class="MsoNormal">+                                             l_CurPtrDataItem = va_arg( l_Argptr, PWCHAR);<o:p></o:p></p>
<p class="MsoNormal">+                                             /* convert to string */
<o:p></o:p></p>
<p class="MsoNormal">+                                             status = RtlStringCchPrintfW( (NTSTRSAFE_PWSTR)l_Ptr, l_BufSize>>1, l_FormatStr , l_CurPtrDataItem );<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             else {<o:p></o:p></p>
<p class="MsoNormal">+                                             l_CurDataItem = va_arg( l_Argptr, int);<o:p></o:p></p>
<p class="MsoNormal">+                                             /* convert to string */
<o:p></o:p></p>
<p class="MsoNormal">+                                             status = RtlStringCchPrintfW( (NTSTRSAFE_PWSTR)l_Ptr, l_BufSize>>1, l_FormatStr , l_CurDataItem );<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if (!NT_SUCCESS(status))<o:p></o:p></p>
<p class="MsoNormal">+                                             return;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* prepare the next loop */<o:p></o:p></p>
<p class="MsoNormal">+                             status = RtlStringCbLengthW( (NTSTRSAFE_PWSTR)l_Ptr, l_BufSize, &l_StrSize );<o:p></o:p></p>
<p class="MsoNormal">+                             if (!NT_SUCCESS(status))<o:p></o:p></p>
<p class="MsoNormal">+                                             return;<o:p></o:p></p>
<p class="MsoNormal">+                             *(WCHAR*)&l_Ptr[l_StrSize] = (WCHAR)0;<o:p></o:p></p>
<p class="MsoNormal">+                             l_StrSize += 2;<o:p></o:p></p>
<p class="MsoNormal">+                             l_Size = l_Size + (int)l_StrSize;<o:p></o:p></p>
<p class="MsoNormal">+                             l_Ptr = l_Buf + l_Size;<o:p></o:p></p>
<p class="MsoNormal">+                             l_BufSize = (int)(l_Buf + sizeof(l_Buf)- l_Ptr);<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             } /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Term the variable argument list */   <o:p></o:p></p>
<p class="MsoNormal">+             va_end(l_Argptr);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Allocate an error log entry */ <o:p></o:p></p>
<p class="MsoNormal">+             l_TotalSize =sizeof(IO_ERROR_LOG_PACKET) +l_Size;<o:p></o:p></p>
<p class="MsoNormal">+             if (l_TotalSize >= ERROR_LOG_MAXIMUM_SIZE - 2) {<o:p></o:p></p>
<p class="MsoNormal">+                             l_TotalSize = ERROR_LOG_MAXIMUM_SIZE - 2;<o:p></o:p></p>
<p class="MsoNormal">+                             l_Size = l_TotalSize - sizeof(IO_ERROR_LOG_PACKET);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             l_pErrorLogEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(<o:p></o:p></p>
<p class="MsoNormal">+                             pi_pIoObject,  (UCHAR)l_TotalSize );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Check allocation */<o:p></o:p></p>
<p class="MsoNormal">+             if ( l_pErrorLogEntry != NULL) <o:p></o:p></p>
<p class="MsoNormal">+             { /* OK */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Set the error log entry header */<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->ErrorCode                                     = pi_ErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->DumpDataSize                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->SequenceNumber    = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->MajorFunctionCode = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->IoControlCode                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->RetryCount                  = 0;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->UniqueErrorValue     = pi_UniqueErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->FinalStatus                    = pi_FinalStatus;
<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->NumberOfStrings = l_nDataItem;<o:p></o:p></p>
<p class="MsoNormal">+                             l_pErrorLogEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET) + l_pErrorLogEntry->DumpDataSize;<o:p></o:p></p>
<p class="MsoNormal">+                             l_Ptr = (UCHAR*)l_pErrorLogEntry + l_pErrorLogEntry->StringOffset;<o:p></o:p></p>
<p class="MsoNormal">+                             if ( l_Size )<o:p></o:p></p>
<p class="MsoNormal">+                                             memcpy( l_Ptr, l_Buf, l_Size );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             /* Write the packet */<o:p></o:p></p>
<p class="MsoNormal">+                             IoWriteErrorLogEntry(l_pErrorLogEntry);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             } /* OK */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+} /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// bsize is to be a strlen(src)<o:p></o:p></p>
<p class="MsoNormal">+// dest has to have enough place, i.e at least (2*strlen(src) + 2)<o:p></o:p></p>
<p class="MsoNormal">+void __ansi_to_wchar( USHORT *dest, UCHAR *src, int bsize)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int i;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             for (i=0; i<bsize; ++i)<o:p></o:p></p>
<p class="MsoNormal">+                             *dest++ = *src++;<o:p></o:p></p>
<p class="MsoNormal">+             *dest = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+mlx4_err(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev *      mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             va_list                   list;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                 buf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+             //WCHAR                            wbuf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Debugger<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             buf[MAX_BUFFER_SIZE - 1] = '\0';<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (mdev == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(mdev != NULL);<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             if (RtlStringCbVPrintfA( (char*)buf, sizeof(buf), format, list))<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             cl_dbg_out( "%s\n", (char*)buf );<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Event Log<o:p></o:p></p>
<p class="MsoNormal">+             //__ansi_to_wchar( wbuf, buf, (int)strlen((void*)buf) );<o:p></o:p></p>
<p class="MsoNormal">+             //WriteEventLogEntryStr( mdev->pdev->p_self_do, (ULONG)EVENT_MLX4_ANY_ERROR, 0, 0, wbuf, 0, 0 );
<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+mlx4_warn(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev *      mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             va_list                   list;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                 buf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+             //WCHAR                            wbuf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Debugger<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             buf[MAX_BUFFER_SIZE - 1] = '\0';<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (mdev == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(mdev != NULL);<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             if (RtlStringCbVPrintfA( (char*)buf, sizeof(buf), format, list))<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             cl_dbg_out( "%s\n", (char*)buf );<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Event Log<o:p></o:p></p>
<p class="MsoNormal">+             //__ansi_to_wchar( wbuf, buf, (int)strlen((void*)buf) );<o:p></o:p></p>
<p class="MsoNormal">+             //WriteEventLogEntryStr( mdev->pdev->p_self_do, (ULONG)EVENT_MLX4_ANY_WARN, 0, 0, wbuf, 0, 0 );
<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+mlx4_dbg(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev *      mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+             va_list                   list;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                 buf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(mdev);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Debugger<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             buf[MAX_BUFFER_SIZE - 1] = '\0';<o:p></o:p></p>
<p class="MsoNormal">+             RtlStringCbVPrintfA( (char*)buf, sizeof(buf), format, list);<o:p></o:p></p>
<p class="MsoNormal">+             cl_dbg_out( "%s\n", (char*)buf );<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+#else  <o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(mdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(format);<o:p></o:p></p>
<p class="MsoNormal">+#endif //DBG<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+dev_err(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev **   mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             va_list                   list;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                 buf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+             //WCHAR                            wbuf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (mdev == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(mdev != NULL);<o:p></o:p></p>
<p class="MsoNormal">+                             return;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Debugger<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             buf[MAX_BUFFER_SIZE - 1] = '\0';<o:p></o:p></p>
<p class="MsoNormal">+             RtlStringCbVPrintfA( (char*)buf, sizeof(buf), format, list);<o:p></o:p></p>
<p class="MsoNormal">+             cl_dbg_out( "%s\n", (char*)buf );<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Event Log<o:p></o:p></p>
<p class="MsoNormal">+             //RtlStringCchPrintfW(wbuf, sizeof(wbuf)/sizeof(wbuf[0]), L"%S", buf);<o:p></o:p></p>
<p class="MsoNormal">+             //WriteEventLogEntryStr( (*mdev)->pdev->p_self_do, (ULONG)EVENT_MLX4_ANY_ERROR, 0, 0, wbuf, 0, 0 );
<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+dev_info(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev **   p_mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+             va_list                   list;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                 buf[MAX_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(p_mdev);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // print to Debugger<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             buf[MAX_BUFFER_SIZE - 1] = '\0';<o:p></o:p></p>
<p class="MsoNormal">+             RtlStringCbVPrintfA( (char*)buf, sizeof(buf), format, list);<o:p></o:p></p>
<p class="MsoNormal">+             cl_dbg_out( "%s\n", (char*)buf );<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+#else  <o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(p_mdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(format);<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_workqueue.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_workqueue.c         (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_workqueue.c      (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,85 @@<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static struct workqueue_struct *delayed_wq = NULL;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int init_workqueues()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    delayed_wq = create_singlethread_workqueue("DELAYED_WQ");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(delayed_wq == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return -1;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void shutdown_workqueues()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    flush_workqueue(delayed_wq);<o:p></o:p></p>
<p class="MsoNormal">+    destroy_workqueue(delayed_wq);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static void queue_delayed_work_timer(void* context)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct delayed_work *work = (struct delayed_work *) context;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    queue_work(delayed_wq, &work->work);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int cancel_work_sync(struct work_struct *work)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct workqueue_struct *wq = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    int pending = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(work == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(work->func == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {// work was not initialized<o:p></o:p></p>
<p class="MsoNormal">+        return 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    wq = work->wq;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(wq == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    spin_lock(&wq->lock);<o:p></o:p></p>
<p class="MsoNormal">+    if(wq->current_work == work)<o:p></o:p></p>
<p class="MsoNormal">+    {// work is running - wait for completion<o:p></o:p></p>
<p class="MsoNormal">+        while(wq->current_work == work)<o:p></o:p></p>
<p class="MsoNormal">+        {<o:p></o:p></p>
<p class="MsoNormal">+            spin_unlock(&wq->lock);<o:p></o:p></p>
<p class="MsoNormal">+            msleep(10);<o:p></o:p></p>
<p class="MsoNormal">+            spin_lock(&wq->lock);<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        spin_unlock(&wq->lock);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    else<o:p></o:p></p>
<p class="MsoNormal">+    {// work is pending in the queue<o:p></o:p></p>
<p class="MsoNormal">+        if(work->wq != NULL)<o:p></o:p></p>
<p class="MsoNormal">+        {// work is queued, and not just initialized<o:p></o:p></p>
<p class="MsoNormal">+            list_del(&work->list);<o:p></o:p></p>
<p class="MsoNormal">+            pending = 1;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        spin_unlock(&wq->lock);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return pending;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void cancel_delayed_work_sync(struct delayed_work *work)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(work->timer.pfn_callback != NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {// timer was set<o:p></o:p></p>
<p class="MsoNormal">+        del_timer_sync(&work->timer);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    cancel_work_sync(&work->work);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_wpptrace.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_wpptrace.h             (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_wpptrace.h          (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,84 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_wpptrace.h<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This module contains all debug-related code.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Revision History:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_CONTROL_GUIDS \<o:p></o:p></p>
<p class="MsoNormal">+        WPP_DEFINE_CONTROL_GUID(EthrnetGuid,(684E068C, 3FDC, 4bce, 89C3, CDB77A8B75A4),  \<o:p></o:p></p>
<p class="MsoNormal">+        WPP_DEFINE_BIT(L2W)                    \<o:p></o:p></p>
<p class="MsoNormal">+        WPP_DEFINE_BIT(L2W_INIT))               \<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level  >= lvl)<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_FLAG_ENABLED(flags)(WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level  >= TRACE_LEVEL_VERBOSE)<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_FLAG_LOGGER(flags) WPP_LEVEL_LOGGER(flags)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// begin_wpp config<o:p></o:p></p>
<p class="MsoNormal">+// L2W_ENTER();<o:p></o:p></p>
<p class="MsoNormal">+// L2W_EXIT();<o:p></o:p></p>
<p class="MsoNormal">+// USESUFFIX(L2W_PRINT, "%!STDPREFIX! %!FUNC!");<o:p></o:p></p>
<p class="MsoNormal">+// L2W_PRINT(LEVEL,FLAGS,MSG,...)<o:p></o:p></p>
<p class="MsoNormal">+// USESUFFIX(L2W_ENTER, "====>>> %!FUNC! ");<o:p></o:p></p>
<p class="MsoNormal">+// USESUFFIX(L2W_EXIT, "<<<====== %!FUNC!]");<o:p></o:p></p>
<p class="MsoNormal">+// end_wpp<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else //defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Debug toppics<o:p></o:p></p>
<p class="MsoNormal">+#define L2W                                    0x000001<o:p></o:p></p>
<p class="MsoNormal">+#define L2W_INIT                         0x000020<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_CRITICAL    DPFLTR_ERROR_LEVEL        <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_FATAL       DPFLTR_ERROR_LEVEL        <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_ERROR       DPFLTR_ERROR_LEVEL       <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_WARNING     DPFLTR_WARNING_LEVEL      <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_INFORMATION DPFLTR_TRACE_LEVEL   <o:p></o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_VERBOSE     DPFLTR_INFO_LEVEL   <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DBG_LEVEL_THRESH   TRACE_LEVEL_ERROR<o:p></o:p></p>
<p class="MsoNormal">+#define DBG_FLAGS                                    0xffff<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void<o:p></o:p></p>
<p class="MsoNormal">+TraceL2WMessage(<o:p></o:p></p>
<p class="MsoNormal">+    char*  func,<o:p></o:p></p>
<p class="MsoNormal">+    char*  file,<o:p></o:p></p>
<p class="MsoNormal">+    unsigned long   line,<o:p></o:p></p>
<p class="MsoNormal">+    unsigned long   level,<o:p></o:p></p>
<p class="MsoNormal">+    char*  format,<o:p></o:p></p>
<p class="MsoNormal">+    ...<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4296)  // expression is always true/false  
<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4127) //conditional expression is constant<o:p></o:p></p>
<p class="MsoNormal">+#define L2W_PRINT(_level_,_flag_, _format_, ...)                         \<o:p></o:p></p>
<p class="MsoNormal">+    if ((DBG_FLAGS & (_flag_)) && (DBG_LEVEL_THRESH >= (_level_)))       \<o:p></o:p></p>
<p class="MsoNormal">+    {                                                                    \<o:p></o:p></p>
<p class="MsoNormal">+        TraceL2WMessage(__FUNCTION__, __FILE__, __LINE__, _level_, _format_, __VA_ARGS__);  \<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+#define L2W_ENTER()\<o:p></o:p></p>
<p class="MsoNormal">+             L2W_PRINT(TRACE_LEVEL_VERBOSE, L2W, "===>\n");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define L2W_EXIT()\<o:p></o:p></p>
<p class="MsoNormal">+             L2W_PRINT(TRACE_LEVEL_VERBOSE, L2W, "<===\n");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif //defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_dbg.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_dbg.c         (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_dbg.c      (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,104 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_dbg.cpp<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This modulde contains all related dubug code<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_dbg.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define TEMP_BUFFER_SIZE 128<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if 0<o:p></o:p></p>
<p class="MsoNormal">+VOID cl_dbg_out( IN PCCH  format, ...)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             va_list  list;<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             vDbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_ERROR_LEVEL, format, list);<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if !defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+void<o:p></o:p></p>
<p class="MsoNormal">+TraceL2WMessage(<o:p></o:p></p>
<p class="MsoNormal">+    char*  func,<o:p></o:p></p>
<p class="MsoNormal">+    char*  file,<o:p></o:p></p>
<p class="MsoNormal">+    unsigned long   line,<o:p></o:p></p>
<p class="MsoNormal">+    unsigned long   level,<o:p></o:p></p>
<p class="MsoNormal">+    char*  format,<o:p></o:p></p>
<p class="MsoNormal">+    ...<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Routine Description:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    Debug print for the sample driver.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Arguments:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    TraceEventsLevel - print level between 0 and 3, with 3 the most verbose<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Return Value:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    None.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ --*/<o:p></o:p></p>
<p class="MsoNormal">+ {<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    va_list    list;<o:p></o:p></p>
<p class="MsoNormal">+    long   status;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    char psPrefix[TEMP_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+    char*  fileName = strrchr(file, '\\');<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+    va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (!fileName)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        fileName++;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    if(level == TRACE_LEVEL_ERROR) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        status = RtlStringCchPrintfA(psPrefix, TEMP_BUFFER_SIZE, "***ERROR***  %s (%s:%d) ", func, fileName, line);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    else<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        status = RtlStringCchPrintfA(psPrefix, TEMP_BUFFER_SIZE, "%s (%s:%d) ", func, fileName, line);<o:p></o:p></p>
<p class="MsoNormal">+        level = TRACE_LEVEL_ERROR;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(status >= 0);<o:p></o:p></p>
<p class="MsoNormal">+    vDbgPrintExWithPrefix(psPrefix , DPFLTR_IHVNETWORK_ID, level, format, list);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    UNREFERENCED_PARAMETER(TraceEventsLevel);<o:p></o:p></p>
<p class="MsoNormal">+    UNREFERENCED_PARAMETER(TraceEventsFlag);<o:p></o:p></p>
<p class="MsoNormal">+    UNREFERENCED_PARAMETER(DebugMessage);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif // DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/ud_header.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/ud_header.c    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/ud_header.c (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,392 @@<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">+ * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">+ * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">+ * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">+ * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">+ *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">+ *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">+ *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">+ * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * $Id: ud_header.c 1349 2004-12-16 21:09:43Z roland $<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "ib_pack.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_dbg.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_wpptrace.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "ud_header.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define STRUCT_FIELD(header, field) \<o:p></o:p></p>
<p class="MsoNormal">+             .struct_offset_bytes = offsetof(struct ib_unpacked_ ## header, field),      \<o:p></o:p></p>
<p class="MsoNormal">+             .struct_size_bytes   = sizeof ((struct ib_unpacked_ ## header *) 0)->field, \<o:p></o:p></p>
<p class="MsoNormal">+             .field_name          = #header ":" #field<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define STRUCT_FIELD_INIT(header, field,ow,ob,sb) \<o:p></o:p></p>
<p class="MsoNormal">+             offsetof(struct ib_unpacked_ ## header, field),      \<o:p></o:p></p>
<p class="MsoNormal">+             sizeof ((struct ib_unpacked_ ## header *) 0)->field, \<o:p></o:p></p>
<p class="MsoNormal">+             ow,ob,sb, \<o:p></o:p></p>
<p class="MsoNormal">+             #header ":" #field<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define STRUCT_FIELD_INITR(ow,ob,sb) \<o:p></o:p></p>
<p class="MsoNormal">+                             0, 0, ow, ob, sb, "reserved"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static const struct ib_field lrh_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, virtual_lane, 0, 0, 4) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, link_version, 0, 4, 4) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, service_level, 0, 8, 4) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INITR(0,12,2) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, link_next_header, 0, 14, 2) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, destination_lid, 0, 16, 16) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INITR(1,0,5) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, packet_length, 1, 5, 11) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(lrh, source_lid, 1, 16, 16) }<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static const struct ib_field eth_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(eth, dmac_h, 0, 0, 32) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(eth, dmac_l, 1, 0, 16) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(eth, smac_h, 1, 16,16) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(eth, smac_l, 2, 0 ,32) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(eth, type, 3, 0, 16)}<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static const struct ib_field grh_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, ip_version, 0, 0, 4) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, traffic_class, 0, 4, 8) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, flow_label, 0, 12, 20) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, payload_length, 1, 0, 16) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, next_header, 1, 16, 8) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, hop_limit, 1, 24, 8) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, source_gid, 2, 0, 128) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(grh, destination_gid, 6, 0, 128) }<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static const struct ib_field bth_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, opcode, 0, 0, 8) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, solicited_event, 0, 8, 1) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, mig_req, 0, 9, 1) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, pad_count, 0, 10, 2) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, transport_header_version, 0, 12, 4) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, pkey, 0, 16, 16) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INITR(1,0,8) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, destination_qpn, 1, 8, 24) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, ack_req, 2, 0, 1) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INITR(2,1,7) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(bth, psn, 2, 8, 24) }<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static const struct ib_field deth_table[] = {<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(deth, qkey, 0, 0, 32) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INITR(1,0,8) },<o:p></o:p></p>
<p class="MsoNormal">+             { STRUCT_FIELD_INIT(deth, source_qpn, 1, 8, 24) }<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_init - Initialize UD header structure<o:p></o:p></p>
<p class="MsoNormal">+ * @payload_bytes:Length of packet payload<o:p></o:p></p>
<p class="MsoNormal">+ * @grh_present:GRH flag (if non-zero, GRH will be included)<o:p></o:p></p>
<p class="MsoNormal">+ * @header:Structure to initialize<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header,<o:p></o:p></p>
<p class="MsoNormal">+ * lrh.packet_length, grh.ip_version, grh.payload_length,<o:p></o:p></p>
<p class="MsoNormal">+ * grh.next_header, bth.opcode, bth.pad_count and<o:p></o:p></p>
<p class="MsoNormal">+ * bth.transport_header_version fields of a &struct ib_ud_header given<o:p></o:p></p>
<p class="MsoNormal">+ * the payload length and whether a GRH will be included.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+void ib_ud_header_init(int                           payload_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                    int                                        grh_present,<o:p></o:p></p>
<p class="MsoNormal">+                                    struct ib_ud_header *header)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int header_len;<o:p></o:p></p>
<p class="MsoNormal">+             u16 packet_length;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             memset(header, 0, sizeof *header);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             header_len =<o:p></o:p></p>
<p class="MsoNormal">+                             IB_LRH_BYTES  +<o:p></o:p></p>
<p class="MsoNormal">+                             IB_BTH_BYTES  +<o:p></o:p></p>
<p class="MsoNormal">+                             IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+             if (grh_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             header_len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             header->lrh.link_version     = 0;<o:p></o:p></p>
<p class="MsoNormal">+             header->lrh.link_next_header =<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+                             grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL;<o:p></o:p></span></p>
<p class="MsoNormal">+             packet_length                        = (u16)((IB_LRH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">+                                                                             IB_BTH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">+                                                                             IB_DETH_BYTES    +<o:p></o:p></p>
<p class="MsoNormal">+                                                                             payload_bytes    +<o:p></o:p></p>
<p class="MsoNormal">+                                                                             4                + /* ICRC     */<o:p></o:p></p>
<p class="MsoNormal">+                                                                             3) / 4);            /* round up */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             header->grh_present          = grh_present;<o:p></o:p></p>
<p class="MsoNormal">+             if (grh_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             packet_length                      += IB_GRH_BYTES / 4;<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh.ip_version      = 6;<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh.payload_length  =<o:p></o:p></p>
<p class="MsoNormal">+                                             cpu_to_be16((IB_BTH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">+                                                                  IB_DETH_BYTES    +<o:p></o:p></p>
<p class="MsoNormal">+                                                                 payload_bytes    +<o:p></o:p></p>
<p class="MsoNormal">+                                                                  4                + /* ICRC     */<o:p></o:p></p>
<p class="MsoNormal">+                                                                  3) & ~3);          /* round up */<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh.next_header     = 0x1b;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             header->lrh.packet_length = cpu_to_be16(packet_length);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->immediate_present)<o:p></o:p></p>
<p class="MsoNormal">+                             header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;<o:p></o:p></p>
<p class="MsoNormal">+             header->bth.pad_count                = (u8)((4 - payload_bytes) & 3);<o:p></o:p></p>
<p class="MsoNormal">+             header->bth.transport_header_version = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+EXPORT_SYMBOL(ib_ud_header_init);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_pack - Pack UD header struct into wire format<o:p></o:p></p>
<p class="MsoNormal">+ * @header:UD header struct<o:p></o:p></p>
<p class="MsoNormal">+ * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_pack() packs the UD header structure @header into wire<o:p></o:p></p>
<p class="MsoNormal">+ * format in the buffer @buf.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+int ib_ud_header_pack(struct ib_ud_header *header,<o:p></o:p></p>
<p class="MsoNormal">+                                   u8                *buf)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int len = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_pack(lrh_table, ARRAY_SIZE(lrh_table),<o:p></o:p></p>
<p class="MsoNormal">+                             &header->lrh, buf);<o:p></o:p></p>
<p class="MsoNormal">+             len += IB_LRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->grh_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             ib_pack(grh_table, ARRAY_SIZE(grh_table),<o:p></o:p></p>
<p class="MsoNormal">+                                             &header->grh, buf + len);<o:p></o:p></p>
<p class="MsoNormal">+                             len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_pack(bth_table, ARRAY_SIZE(bth_table),<o:p></o:p></p>
<p class="MsoNormal">+                             &header->bth, buf + len);<o:p></o:p></p>
<p class="MsoNormal">+             len += IB_BTH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_pack(deth_table, ARRAY_SIZE(deth_table),<o:p></o:p></p>
<p class="MsoNormal">+                             &header->deth, buf + len);<o:p></o:p></p>
<p class="MsoNormal">+             len += IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->immediate_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             memcpy(buf + len, &header->immediate_data, sizeof header->immediate_data);<o:p></o:p></p>
<p class="MsoNormal">+                             len += sizeof header->immediate_data;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return len;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+EXPORT_SYMBOL(ib_ud_header_pack);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_unpack - Unpack UD header struct from wire format<o:p></o:p></p>
<p class="MsoNormal">+ * @header:UD header struct<o:p></o:p></p>
<p class="MsoNormal">+ * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_pack() unpacks the UD header structure @header from wire<o:p></o:p></p>
<p class="MsoNormal">+ * format in the buffer @buf.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+int ib_ud_header_unpack(u8                *buf,<o:p></o:p></p>
<p class="MsoNormal">+                                             struct ib_ud_header *header)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ib_unpack(lrh_table, ARRAY_SIZE(lrh_table),<o:p></o:p></p>
<p class="MsoNormal">+                               buf, &header->lrh);<o:p></o:p></p>
<p class="MsoNormal">+             buf += IB_LRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->lrh.link_version != 0) {<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Invalid LRH.link_version %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                                    header->lrh.link_version);<o:p></o:p></p>
<p class="MsoNormal">+                             return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             switch (header->lrh.link_next_header) {<o:p></o:p></p>
<p class="MsoNormal">+             case IB_LNH_IBA_LOCAL:<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh_present = 0;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             case IB_LNH_IBA_GLOBAL:<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh_present = 1;<o:p></o:p></p>
<p class="MsoNormal">+                             ib_unpack(grh_table, ARRAY_SIZE(grh_table),<o:p></o:p></p>
<p class="MsoNormal">+                                               buf, &header->grh);<o:p></o:p></p>
<p class="MsoNormal">+                             buf += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if (header->grh.ip_version != 6) {<o:p></o:p></p>
<p class="MsoNormal">+                                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Invalid GRH.ip_version %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                                                    header->grh.ip_version);<o:p></o:p></p>
<p class="MsoNormal">+                                             return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             if (header->grh.next_header != 0x1b) {<o:p></o:p></p>
<p class="MsoNormal">+                                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Invalid GRH.next_header 0x%02x\n",<o:p></o:p></p>
<p class="MsoNormal">+                                                    header->grh.next_header);<o:p></o:p></p>
<p class="MsoNormal">+                                             return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             default:<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Invalid LRH.link_next_header %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                                    header->lrh.link_next_header);<o:p></o:p></p>
<p class="MsoNormal">+                             return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_unpack(bth_table, ARRAY_SIZE(bth_table),<o:p></o:p></p>
<p class="MsoNormal">+                               buf, &header->bth);<o:p></o:p></p>
<p class="MsoNormal">+             buf += IB_BTH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             switch (header->bth.opcode) {<o:p></o:p></p>
<p class="MsoNormal">+             case IB_OPCODE_UD_SEND_ONLY:<o:p></o:p></p>
<p class="MsoNormal">+                             header->immediate_present = 0;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             case IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE:<o:p></o:p></p>
<p class="MsoNormal">+                             header->immediate_present = 1;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             default:<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Invalid BTH.opcode 0x%02x\n",<o:p></o:p></p>
<p class="MsoNormal">+                                    header->bth.opcode);<o:p></o:p></p>
<p class="MsoNormal">+                             return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->bth.transport_header_version != 0) {<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W , "Invalid BTH.transport_header_version %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                                    header->bth.transport_header_version);<o:p></o:p></p>
<p class="MsoNormal">+                             return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_unpack(deth_table, ARRAY_SIZE(deth_table),<o:p></o:p></p>
<p class="MsoNormal">+                               buf, &header->deth);<o:p></o:p></p>
<p class="MsoNormal">+             buf += IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->immediate_present)<o:p></o:p></p>
<p class="MsoNormal">+                             memcpy(&header->immediate_data, buf, sizeof header->immediate_data);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+EXPORT_SYMBOL(ib_ud_header_unpack);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_rdmaoe_ud_header_init - Initialize UD header structure<o:p></o:p></p>
<p class="MsoNormal">+ * @payload_bytes:Length of packet payload<o:p></o:p></p>
<p class="MsoNormal">+ * @grh_present:GRH flag (if non-zero, GRH will be included)<o:p></o:p></p>
<p class="MsoNormal">+ * @header:Structure to initialize<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_rdmaoe_ud_header_init() initializes the grh.ip_version, grh.payload_length,<o:p></o:p></p>
<p class="MsoNormal">+ * grh.next_header, bth.opcode, bth.pad_count and<o:p></o:p></p>
<p class="MsoNormal">+ * bth.transport_header_version fields of a &struct eth_ud_header given<o:p></o:p></p>
<p class="MsoNormal">+ * the payload length and whether a GRH will be included.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+void ib_rdmaoe_ud_header_init(int                                        payload_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                int                            grh_present,<o:p></o:p></p>
<p class="MsoNormal">+                                                struct eth_ud_header    *header)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int header_len;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             memset(header, 0, sizeof *header);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             header_len =<o:p></o:p></p>
<p class="MsoNormal">+                             sizeof header->eth  +<o:p></o:p></p>
<p class="MsoNormal">+                             IB_BTH_BYTES  +<o:p></o:p></p>
<p class="MsoNormal">+                             IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+             if (grh_present)<o:p></o:p></p>
<p class="MsoNormal">+                             header_len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             header->grh_present          = grh_present;<o:p></o:p></p>
<p class="MsoNormal">+             if (grh_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh.ip_version      = 6;<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh.payload_length  =<o:p></o:p></p>
<p class="MsoNormal">+                                             cpu_to_be16((IB_BTH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">+                                                                  IB_DETH_BYTES    +<o:p></o:p></p>
<p class="MsoNormal">+                                                                  payload_bytes    +<o:p></o:p></p>
<p class="MsoNormal">+                                                                  4                + /* ICRC     */<o:p></o:p></p>
<p class="MsoNormal">+                                                                  3) & ~3);          /* round up */<o:p></o:p></p>
<p class="MsoNormal">+                             header->grh.next_header     = 0x1b;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->immediate_present)<o:p></o:p></p>
<p class="MsoNormal">+                             header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;<o:p></o:p></p>
<p class="MsoNormal">+             header->bth.pad_count                =(u8) ((4 - payload_bytes) & 3);<o:p></o:p></p>
<p class="MsoNormal">+             header->bth.transport_header_version = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * rdmaoe_ud_header_pack - Pack UD header struct into eth wire format<o:p></o:p></p>
<p class="MsoNormal">+ * @header:UD header struct<o:p></o:p></p>
<p class="MsoNormal">+ * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * ib_ud_header_pack() packs the UD header structure @header into wire<o:p></o:p></p>
<p class="MsoNormal">+ * format in the buffer @buf.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+int rdmaoe_ud_header_pack(struct eth_ud_header *header,<o:p></o:p></p>
<p class="MsoNormal">+                                    void                 *buf)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int len = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_pack(eth_table, ARRAY_SIZE(eth_table),<o:p></o:p></p>
<p class="MsoNormal">+                             &header->eth, buf);<o:p></o:p></p>
<p class="MsoNormal">+             len += IB_ETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->grh_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             ib_pack(grh_table, ARRAY_SIZE(grh_table),<o:p></o:p></p>
<p class="MsoNormal">+                                             &header->grh, (u8*)buf + len);<o:p></o:p></p>
<p class="MsoNormal">+                             len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_pack(bth_table, ARRAY_SIZE(bth_table),<o:p></o:p></p>
<p class="MsoNormal">+                             &header->bth, (u8*)buf + len);<o:p></o:p></p>
<p class="MsoNormal">+             len += IB_BTH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ib_pack(deth_table, ARRAY_SIZE(deth_table),<o:p></o:p></p>
<p class="MsoNormal">+                             &header->deth, (u8*)buf + len);<o:p></o:p></p>
<p class="MsoNormal">+             len += IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (header->immediate_present) {<o:p></o:p></p>
<p class="MsoNormal">+                             memcpy((u8*)buf + len, &header->immediate_data,<o:p></o:p></p>
<p class="MsoNormal">+                                    sizeof header->immediate_data);<o:p></o:p></p>
<p class="MsoNormal">+                             len += sizeof header->immediate_data;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return len;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_dbg.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_dbg.h         (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_dbg.h      (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,40 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2010 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_dbg.h<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This modulde contains all related dubug code<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef _PREFAST_<o:p></o:p></p>
<p class="MsoNormal">+#define CONDITION_ASSUMED(X) __analysis_assume((X))<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+#define CONDITION_ASSUMED(X) <o:p></o:p></p>
<p class="MsoNormal">+#endif // _PREFAST_<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#undef ASSERT<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT(x) if(!(x)) { \<o:p></o:p></p>
<p class="MsoNormal">+             DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_ERROR_LEVEL, "Assertion failed: %s:%d %s\n", __FILE__, __LINE__, #x);\<o:p></o:p></p>
<p class="MsoNormal">+    DbgBreakPoint(); }\<o:p></o:p></p>
<p class="MsoNormal">+    CONDITION_ASSUMED(x);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT_ALWAYS(x) ASSERT(x)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else   // !DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#undef ASSERT<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT(x)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT_ALWAYS(x) if(!(x)) { \<o:p></o:p></p>
<p class="MsoNormal">+    DbgBreakPoint(); }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif  // DBG<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w.rc<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w.rc  (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w.rc               (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,46 @@<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This software is available to you under the OpenIB.org BSD license<o:p></o:p></p>
<p class="MsoNormal">+ * below:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">+ *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">+ *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">+ *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">+ * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * $Id: ibal.rc 1611 2006-08-20 14:48:55Z sleybo $<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <oib_ver.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define VER_FILETYPE                                                                VFT_DRV<o:p></o:p></p>
<p class="MsoNormal">+#define VER_FILESUBTYPE                                                        VFT2_UNKNOWN<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef _DEBUG_<o:p></o:p></p>
<p class="MsoNormal">+#define VER_FILEDESCRIPTION_STR                    "L2W Library (Debug)"<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+#define VER_FILEDESCRIPTION_STR                    "L2W Library"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define VER_INTERNALNAME_STR                      "l2w.lib"<o:p></o:p></p>
<p class="MsoNormal">+#define VER_ORIGINALFILENAME_STR              "l2w.lib"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_umem.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_umem.c    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_umem.c (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,181 @@<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "ib_verbs.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined (EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_umem.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_umem_release - release memory pinned with ib_umem_get<o:p></o:p></p>
<p class="MsoNormal">+ * @umem: umem struct to release<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+void ib_umem_release(struct ib_umem *p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (p_ib_umem->secure_handle) {<o:p></o:p></p>
<p class="MsoNormal">+                             __try {<o:p></o:p></p>
<p class="MsoNormal">+                                             MmUnsecureVirtualMemory( p_ib_umem->secure_handle );<o:p></o:p></p>
<p class="MsoNormal">+                                             p_ib_umem->secure_handle = NULL;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             __except (EXCEPTION_EXECUTE_HANDLER) {<o:p></o:p></p>
<p class="MsoNormal">+                                             NTSTATUS Status = GetExceptionCode();<o:p></o:p></p>
<p class="MsoNormal">+                                             UNUSED_PARAM_WOWPP(Status);<o:p></o:p></p>
<p class="MsoNormal">+                                             L2W_PRINT(TRACE_LEVEL_ERROR ,L2W ,<o:p></o:p></p>
<p class="MsoNormal">+                                                             "Exception 0x%x on MmUnsecureVirtualMemory(), addr %I64x, size %I64x, seg_num %d, nr_pages %d\n",
<o:p></o:p></p>
<p class="MsoNormal">+                                                             Status, p_ib_umem->iobuf.va, (u64)p_ib_umem->iobuf.size,
<o:p></o:p></p>
<p class="MsoNormal">+                                                             p_ib_umem->iobuf.seg_num, p_ib_umem->iobuf.nr_pages );<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             if (p_ib_umem->iobuf_used)<o:p></o:p></p>
<p class="MsoNormal">+                             iobuf_deregister_with_cash(&p_ib_umem->iobuf);<o:p></o:p></p>
<p class="MsoNormal">+             kfree(p_ib_umem);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * ib_umem_get - Pin and DMA map userspace memory.<o:p></o:p></p>
<p class="MsoNormal">+ * @context: userspace context to pin memory for<o:p></o:p></p>
<p class="MsoNormal">+ * @addr: userspace virtual address to start at<o:p></o:p></p>
<p class="MsoNormal">+ * @size: length of region to pin<o:p></o:p></p>
<p class="MsoNormal">+ * @access: IB_ACCESS_xxx flags for memory being pinned<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+struct ib_umem *ib_umem_get(struct ib_ucontext *context, u64 addr,<o:p></o:p></p>
<p class="MsoNormal">+                                                 size_t size, enum ib_access_flags access, boolean_t secure)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int err;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_umem *p_ib_umem;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // create the object<o:p></o:p></p>
<p class="MsoNormal">+             p_ib_umem = kzalloc(sizeof *p_ib_umem, GFP_KERNEL);<o:p></o:p></p>
<p class="MsoNormal">+             if (!p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">+                             goto err_nomem;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             p_ib_umem->p_uctx = context;<o:p></o:p></p>
<p class="MsoNormal">+             p_ib_umem->page_size = PAGE_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             // register the memory <o:p></o:p></p>
<p class="MsoNormal">+             iobuf_init( addr, (u64)size, !!context, &p_ib_umem->iobuf);<o:p></o:p></p>
<p class="MsoNormal">+             err =  iobuf_register_with_cash( addr, (u64)size, !!context,
<o:p></o:p></p>
<p class="MsoNormal">+                             &access, &p_ib_umem->iobuf );<o:p></o:p></p>
<p class="MsoNormal">+             if (err)<o:p></o:p></p>
<p class="MsoNormal">+                             goto err_reg_mem;<o:p></o:p></p>
<p class="MsoNormal">+             p_ib_umem->iobuf_used = TRUE;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // TODO: map the memory for DMA<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             // secure memory<o:p></o:p></p>
<p class="MsoNormal">+             if (!context || !secure)<o:p></o:p></p>
<p class="MsoNormal">+                             goto done;<o:p></o:p></p>
<p class="MsoNormal">+             __try {<o:p></o:p></p>
<p class="MsoNormal">+                             p_ib_umem->secure_handle = MmSecureVirtualMemory (
<o:p></o:p></p>
<p class="MsoNormal">+                                             (PVOID)(ULONG_PTR)addr, size,<o:p></o:p></p>
<p class="MsoNormal">+                                             (access & IB_ACCESS_LOCAL_WRITE) ? PAGE_READWRITE : PAGE_READONLY );<o:p></o:p></p>
<p class="MsoNormal">+                             if (p_ib_umem->secure_handle == NULL)
<o:p></o:p></p>
<p class="MsoNormal">+                                             goto err_secure;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             __except (EXCEPTION_EXECUTE_HANDLER) {<o:p></o:p></p>
<p class="MsoNormal">+                             NTSTATUS Status = GetExceptionCode();<o:p></o:p></p>
<p class="MsoNormal">+                             UNUSED_PARAM_WOWPP(Status);<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_ERROR ,L2W ,<o:p></o:p></p>
<p class="MsoNormal">+                                             "Exception 0x%x on MmSecureVirtualMemory(), addr %I64x, size %I64x, access %#x\n",
<o:p></o:p></p>
<p class="MsoNormal">+                                             Status, addr, (u64)size, access );<o:p></o:p></p>
<p class="MsoNormal">+                             goto err_secure;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             goto done;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+err_secure:<o:p></o:p></p>
<p class="MsoNormal">+             iobuf_deregister(&p_ib_umem->iobuf);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+err_reg_mem:               <o:p></o:p></p>
<p class="MsoNormal">+             kfree(p_ib_umem);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+err_nomem:   <o:p></o:p></p>
<p class="MsoNormal">+             p_ib_umem = ERR_PTR(-ENOMEM);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+done: <o:p></o:p></p>
<p class="MsoNormal">+             return p_ib_umem;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int ib_umem_page_count(struct ib_umem *p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return (int)p_ib_umem->iobuf.nr_pages;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+dma_addr_t ib_umem_get_dma(struct ib_umem *p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             u64 pages[1] = { 0 };<o:p></o:p></p>
<p class="MsoNormal">+             iobuf_iter_t iobuf_iter;<o:p></o:p></p>
<p class="MsoNormal">+             dma_addr_t dma_addr = { 0, 0 , 0 };<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             iobuf_iter_init( &p_ib_umem->iobuf, &iobuf_iter );<o:p></o:p></p>
<p class="MsoNormal">+             iobuf_get_tpt_seg( &p_ib_umem->iobuf, &iobuf_iter, 1, pages );<o:p></o:p></p>
<p class="MsoNormal">+             // TODO: convert phys address to DMA one<o:p></o:p></p>
<p class="MsoNormal">+             dma_addr.da = pages[0];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return dma_addr;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Returns: 0 on success, -ENOMEM or -EACCESS or -EFAULT on error<o:p></o:p></p>
<p class="MsoNormal">+int ib_umem_map(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           u64 va,<o:p></o:p></p>
<p class="MsoNormal">+             IN                           u64 size,<o:p></o:p></p>
<p class="MsoNormal">+             IN                           ib_access_t acc,<o:p></o:p></p>
<p class="MsoNormal">+             OUT                       PMDL *mdl,<o:p></o:p></p>
<p class="MsoNormal">+             OUT                       void **kva)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             PMDL p_mdl;<o:p></o:p></p>
<p class="MsoNormal">+             int rc = 0;<o:p></o:p></p>
<p class="MsoNormal">+             LOCK_OPERATION lock_op = (acc & IB_AC_LOCAL_WRITE) ? IoModifyAccess : IoReadAccess;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             p_mdl = IoAllocateMdl( (PVOID)(ULONG_PTR)va, (ULONG)size, FALSE,FALSE,NULL);<o:p></o:p></p>
<p class="MsoNormal">+             if (p_mdl == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             rc = -ENOMEM;<o:p></o:p></p>
<p class="MsoNormal">+                             goto err_alloc_mdl;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             __try { <o:p></o:p></p>
<p class="MsoNormal">+                             MmProbeAndLockPages( p_mdl, UserMode, lock_op );   /* lock memory */<o:p></o:p></p>
<p class="MsoNormal">+             } <o:p></o:p></p>
<p class="MsoNormal">+             __except (EXCEPTION_EXECUTE_HANDLER)       {<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_ERROR ,L2W ,
<o:p></o:p></p>
<p class="MsoNormal">+                                             "MOSAL_iobuf_register: Exception 0x%x on MmProbeAndLockPages(), va %I64d, sz %I64d\n",
<o:p></o:p></p>
<p class="MsoNormal">+                                             GetExceptionCode(), va, size);<o:p></o:p></p>
<p class="MsoNormal">+                             rc = -EACCES;<o:p></o:p></p>
<p class="MsoNormal">+                             goto err_probe;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             *kva = MmMapLockedPagesSpecifyCache( p_mdl, <o:p>
</o:p></p>
<p class="MsoNormal">+                             KernelMode, MmNonCached, NULL, FALSE, NormalPagePriority );<o:p></o:p></p>
<p class="MsoNormal">+             if (*kva == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_ERROR ,L2W ,"MmMapLockedPagesSpecifyCache failed\n");<o:p></o:p></p>
<p class="MsoNormal">+                             rc = -EFAULT;<o:p></o:p></p>
<p class="MsoNormal">+                             goto err_map;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             *mdl = p_mdl;<o:p></o:p></p>
<p class="MsoNormal">+             return 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+err_map:<o:p></o:p></p>
<p class="MsoNormal">+             MmUnlockPages(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">+err_probe:<o:p></o:p></p>
<p class="MsoNormal">+             IoFreeMdl(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">+err_alloc_mdl:  <o:p></o:p></p>
<p class="MsoNormal">+             return rc;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void ib_umem_unmap(<o:p></o:p></p>
<p class="MsoNormal">+             IN PMDL p_mdl,<o:p></o:p></p>
<p class="MsoNormal">+             IN void *kva)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (kva) {<o:p></o:p></p>
<p class="MsoNormal">+                             MmUnmapLockedPages( kva, p_mdl );<o:p></o:p></p>
<p class="MsoNormal">+                             MmUnlockPages(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">+                             IoFreeMdl(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/readme.txt<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/readme.txt       (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/readme.txt    (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,118 @@<o:p></o:p></p>
<p class="MsoNormal">+This library is intended for drivers ported from Linux.<o:p></o:p></p>
<p class="MsoNormal">+It contains mostly wrappers for Linux kernel/compiler tools.<o:p></o:p></p>
<p class="MsoNormal">+To use it one needs to include l2w.h file and to link with l2w.lib.<o:p></o:p></p>
<p class="MsoNormal">+l2w.lib uses in turn complib.lib library.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Here are the services, l2w provides:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// l2w_atomic.h - dealing with atomics<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// data types<o:p></o:p></p>
<p class="MsoNormal">+atomic_t                                                                                                           - 32-bit atomic variable<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// methods<o:p></o:p></p>
<p class="MsoNormal">+atomic_read                                                                                                    - read atomic value<o:p></o:p></p>
<p class="MsoNormal">+atomic_set                                                                                                       - set atomic value<o:p></o:p></p>
<p class="MsoNormal">+atomic_inc                                                                                                       - increment atomic value<o:p></o:p></p>
<p class="MsoNormal">+atomic_dec                                                                                                      - decrement atomic value<o:p></o:p></p>
<p class="MsoNormal">+atomic_inc_and_test                                                  - increment and test atomic value<o:p></o:p></p>
<p class="MsoNormal">+atomic_dec_and_test                                                                 - decrement and test atomic value<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// l2w_bit.h     - dealing with bit dwords and maps<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// methods<o:p></o:p></p>
<p class="MsoNormal">+fls                                                                                                                                         - find last set bit in a dword<o:p></o:p></p>
<p class="MsoNormal">+ffs                                                                                                                                        - find first set bit in a dword<o:p></o:p></p>
<p class="MsoNormal">+ffz                                                                                                                                        - find first zero bit in a dword<o:p></o:p></p>
<p class="MsoNormal">+find_first_bit                                                                                   - find first set bit in a map<o:p></o:p></p>
<p class="MsoNormal">+find_first_zero_bit                                                                       - find first zero bit in a map<o:p></o:p></p>
<p class="MsoNormal">+find_next_zero_bit                                                                      - find the next zero bit in a map<o:p></o:p></p>
<p class="MsoNormal">+DECLARE_BITMAP                                                                                        - declare a bit map<o:p></o:p></p>
<p class="MsoNormal">+atomic_set_bit                                                                                               - set atomically a bit in a bit map<o:p></o:p></p>
<p class="MsoNormal">+atomic_clear_bit                                                                           - clear atomically a bit in a bit map<o:p></o:p></p>
<p class="MsoNormal">+set_bit                                                                                                                               - set atomically a bit in a dword<o:p></o:p></p>
<p class="MsoNormal">+clear_bit                                                                                                            - clear atomically a bit in a dword<o:p></o:p></p>
<p class="MsoNormal">+test_bit                                                                                                             - test a bit in a dword<o:p></o:p></p>
<p class="MsoNormal">+bitmap_zero                                                                                                   - zero a bit map<o:p></o:p></p>
<p class="MsoNormal">+bitmap_full                                                                                                      - returns TRUE if bit map is full (all bits are set)<o:p></o:p></p>
<p class="MsoNormal">+bitmap_empty                                                                                               - returns TRUE if bit map is empty (all bits are clear)<o:p></o:p></p>
<p class="MsoNormal">+bitmap_fill                                                                                                        - fill a map with ones<o:p></o:p></p>
<p class="MsoNormal">+ilog2                                                                                                                    - find log2 of the value, stored in dword<o:p></o:p></p>
<p class="MsoNormal">+is_power_of_2                                                                                              - return TRUE if the value, stored in dword is a power of 2<o:p></o:p></p>
<p class="MsoNormal">+roundup_pow_of_two                                                                              - round a dword value to an upper power of 2 (e.g., 5-->8)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// l2w_list.h     - dealing with double-linked lists<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// data types<o:p></o:p></p>
<p class="MsoNormal">+list_head                                                                                                           - a list header/link<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// methods<o:p></o:p></p>
<p class="MsoNormal">+LIST_HEAD                                                                                                       - define and initialize a list header<o:p></o:p></p>
<p class="MsoNormal">+INIT_LIST_HEAD                                                                                            - initialize a list header<o:p></o:p></p>
<p class="MsoNormal">+list_entry                                                                                                          - get to the beginning of the structure for the given list entry<o:p></o:p></p>
<p class="MsoNormal">+list_for_each_entry                                                                     - iterate over a list of 'list_els' of given 'type'<o:p></o:p></p>
<p class="MsoNormal">+list_for_each_entry_reverse                                   - iterate backwards over a list of 'list_els' of given 'type'<o:p></o:p></p>
<p class="MsoNormal">+list_for_each_entry_safe                                          - iterate over a list of given type safe against removal of list entry<o:p></o:p></p>
<p class="MsoNormal">+list_add                                                                                                             - insert a new entry after the specified head<o:p></o:p></p>
<p class="MsoNormal">+list_add_tail                                                                                     - insert a new entry before the specified head<o:p></o:p></p>
<p class="MsoNormal">+list_del                                                                                                               - deletes an entry from a list<o:p></o:p></p>
<p class="MsoNormal">+list_empty                                                                                                        - tests whether a list is empty<o:p></o:p></p>
<p class="MsoNormal">+list_splice_init                                                                 - insert src_list into dst_list and reinitialise the emptied src_list<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// l2w_memory.h - dealing with memory allocations<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// data types<o:p></o:p></p>
<p class="MsoNormal">+dma_addr_t                                                                                                    - implementatin of Linux dma_addr_t type, describing DMA address<o:p></o:p></p>
<p class="MsoNormal">+struct scatterlist                                                                             - implementatin of Linux struct scatterlist<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// methods<o:p></o:p></p>
<p class="MsoNormal">+get_order                                                                                                         - returns log of number of pages (i.e for size <= 4096 ==> 0, for size <= 8192 ==> 1)<o:p></o:p></p>
<p class="MsoNormal">+kmalloc                                                                                                                              - allocate kernel memory<o:p></o:p></p>
<p class="MsoNormal">+kzalloc                                                                                                                                - allocate kernel memory and zero it<o:p></o:p></p>
<p class="MsoNormal">+kcalloc                                                                                                                                - allocate and array of elements in kernel memory and zero it<o:p></o:p></p>
<p class="MsoNormal">+kfree                                                                                                                  - free kernel memory<o:p></o:p></p>
<p class="MsoNormal">+ioremap                                                                                                                            - map bus memory into CPU space<o:p></o:p></p>
<p class="MsoNormal">+iounmap                                                                                                                           - unmap bus memory<o:p></o:p></p>
<p class="MsoNormal">+lowmem_page_address                                                                            - get virtual address of dma_addr_t
<o:p></o:p></p>
<p class="MsoNormal">+__get_free_page                                                                                         - allocate a page and zero it<o:p></o:p></p>
<p class="MsoNormal">+dma_sync_single                                                                                          - flush DMA buffers (not implemented)<o:p></o:p></p>
<p class="MsoNormal">+sg_dma_addr                                                                                                 - returns of dma_addr_t of SC list<o:p></o:p></p>
<p class="MsoNormal">+sg_page                                                                                                                            - returns of dma_addr_t of SC list<o:p></o:p></p>
<p class="MsoNormal">+sg_dma_address                                                                                           - returns physical address of SC list<o:p></o:p></p>
<p class="MsoNormal">+sg_dma_address_inc                                                                  - increment physical address in SC list<o:p></o:p></p>
<p class="MsoNormal">+sg_dma_len                                                                                                    - returns the size of SG list<o:p></o:p></p>
<p class="MsoNormal">+sg_init_table                                                                                   - zero an array of SG list<o:p></o:p></p>
<p class="MsoNormal">+sg_set_buf                                                                                                      - set offset in SG list<o:p></o:p></p>
<p class="MsoNormal">+sg_set_page                                                                                                   - set offset and buffer address in SG list<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// l2w_pci.h - work with PCI bus<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// methods<o:p></o:p></p>
<p class="MsoNormal">+pci_resource_start                                                                       - get BAR physical address<o:p></o:p></p>
<p class="MsoNormal">+pci_resource_len                                                                          - get BAR size<o:p></o:p></p>
<p class="MsoNormal">+readq                                                                                                                 - read a word from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+readl                                                                                                                   - read a dword from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+reads                                                                                                                  - read a word from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+readb                                                                                                                 - read a byte from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+writeq                                                                                                                                - write a word from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+writel                                                                                                                  - write a dword from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+writes                                                                                                                 - write a word from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+writeb                                                                                                                                - write a byte from IO space, mapped to system memory<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// <o:p></o:p></p>
<p class="MsoNormal">+// <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_radix.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_radix.c       (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_radix.c    (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,74 @@<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This software is available to you under the OpenIB.org BSD license<o:p></o:p></p>
<p class="MsoNormal">+ * below:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">+ *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">+ *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">+ *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">+ * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * $Id: radix.c 1611 2006-08-20 14:48:55Z sleybo $<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "errno.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int radix_tree_insert(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">+             unsigned long index, void *item)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if ( NULL == cl_map_insert( &root->map, (const uint64_t)index, item ) )<o:p></o:p></p>
<p class="MsoNormal">+                             return -EFAULT;<o:p></o:p></p>
<p class="MsoNormal">+             return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *radix_tree_lookup(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">+             unsigned long index)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             void* item = cl_map_get( &root->map, (const uint64_t)index );<o:p></o:p></p>
<p class="MsoNormal">+             return item;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *radix_tree_delete(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">+             unsigned long index)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             void* item = cl_map_remove( &root->map, (const uint64_t)index );<o:p></o:p></p>
<p class="MsoNormal">+             return item;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+cl_status_t radix_tree_create(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">+             gfp_t gfp_mask)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#define MIN_ITEMS                    32<o:p></o:p></p>
<p class="MsoNormal">+             cl_status_t cl_status;<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             cl_map_construct( &root->map );<o:p></o:p></p>
<p class="MsoNormal">+             cl_status = cl_map_init( &root->map, MIN_ITEMS );<o:p></o:p></p>
<p class="MsoNormal">+             return cl_status;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void radix_tree_destroy(struct radix_tree_root *root )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             cl_map_destroy( &root->map );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/makefile<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/makefile            (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/makefile         (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,7 @@<o:p></o:p></p>
<p class="MsoNormal">+#<o:p></o:p></p>
<p class="MsoNormal">+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source<o:p></o:p></p>
<p class="MsoNormal">+# file to this component.  This file merely indirects to the real make file<o:p></o:p></p>
<p class="MsoNormal">+# that is shared by all the driver components of the Windows NT DDK<o:p></o:p></p>
<p class="MsoNormal">+#<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+!INCLUDE $(NTMAKEENV)\makefile.def<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_memory.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_memory.c                (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/kernel/l2w_memory.c             (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,174 @@<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2005 Mellanox Technologies.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">+ * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">+ * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">+ * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">+ * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">+ *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">+ *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">+ *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">+ * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * $Id: mt_memory.c 2020 2007-05-01 09:29:10Z leonid $<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_memory.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void st_dev_add_cont_mem_stat( PMLX4_ST_DEVICE p_stat, ULONG size );<o:p></o:p></p>
<p class="MsoNormal">+void st_dev_rmv_cont_mem_stat( PMLX4_ST_DEVICE p_stat, ULONG size );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *alloc_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">+             IN                           unsigned long size,<o:p></o:p></p>
<p class="MsoNormal">+             OUT                       dma_addr_t*p_dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             void *va = NULL;<o:p></o:p></p>
<p class="MsoNormal">+             PHYSICAL_ADDRESS  pa = {0};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             memset( p_dma_addr, 0, sizeof(dma_addr_t) );<o:p></o:p></p>
<p class="MsoNormal">+             if (!size)<o:p></o:p></p>
<p class="MsoNormal">+                             goto end;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// DmaOperations->AllocateCommonBuffer can get stuck for a long time
<o:p></o:p></p>
<p class="MsoNormal">+// when there is no enough contiguous memory<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef SUPPORT_DMA_MEMORY<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             DMA_ADAPTER *p_adapter = pdev->p_dma_adapter;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             va           = p_adapter->DmaOperations->AllocateCommonBuffer(<o:p></o:p></p>
<p class="MsoNormal">+                                             p_adapter, size, &pa, FALSE );<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+                             if (va) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+                                             p_dma_addr->da = pa.QuadPart;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+                                             p_dma_addr->va = va;<o:p></o:p></span></p>
<p class="MsoNormal">+                                             p_dma_addr->sz             = (ULONG)size;<o:p></o:p></p>
<p class="MsoNormal">+                                             st_dev_add_cont_mem_stat( pdev->p_stat, size );<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             PHYSICAL_ADDRESS la = {0}, ha = {(u64)(-1I64)};<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             va = MmAllocateContiguousMemorySpecifyCache( (SIZE_T)size, la, ha, pa, MmCached );<o:p></o:p></p>
<p class="MsoNormal">+                             if (va) {<o:p></o:p></p>
<p class="MsoNormal">+                                             pa = MmGetPhysicalAddress( va );<o:p></o:p></p>
<p class="MsoNormal">+                                             // TODO: convert physical adress to dma one
<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+                                             p_dma_addr->da = pa.QuadPart;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+                                             p_dma_addr->va = va;<o:p></o:p></span></p>
<p class="MsoNormal">+                                             p_dma_addr->sz             = (ULONG)size;<o:p></o:p></p>
<p class="MsoNormal">+                                             st_dev_add_cont_mem_stat( pdev->p_stat, size );<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+end:<o:p></o:p></p>
<p class="MsoNormal">+             if (!va)<o:p></o:p></p>
<p class="MsoNormal">+                             L2W_PRINT(TRACE_LEVEL_WARNING ,L2W ,<o:p></o:p></p>
<p class="MsoNormal">+                                             "%s: AllocateCommonBuffer: failed to allocate contiguous %#x bytes\n",
<o:p></o:p></p>
<p class="MsoNormal">+                                             pdev->name, size );<o:p></o:p></p>
<p class="MsoNormal">+             return va;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void free_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">+             IN                           dma_addr_t*p_dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#ifdef SUPPORT_DMA_MEMORY<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             DMA_ADAPTER *p_adapter = pdev->p_dma_adapter;<o:p></o:p></p>
<p class="MsoNormal">+                             PHYSICAL_ADDRESS  pa;<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+                             pa.QuadPart = p_dma_addr->da;<o:p></o:p></p>
<p class="MsoNormal">+                             p_adapter->DmaOperations->FreeCommonBuffer(
<o:p></o:p></p>
<p class="MsoNormal">+                                             p_adapter, p_dma_addr->sz, pa, p_dma_addr->va, FALSE );<o:p></o:p></p>
<p class="MsoNormal">+                             st_dev_rmv_cont_mem_stat( pdev->p_stat, p_dma_addr->sz );<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             KIRQL old_irql = 0, cur_irql = KeGetCurrentIrql();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+                             if (cur_irql < APC_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">+                                             KeRaiseIrql( APC_LEVEL, &old_irql );<o:p></o:p></p>
<p class="MsoNormal">+                             MmFreeContiguousMemory( p_dma_addr->va );<o:p></o:p></p>
<p class="MsoNormal">+                             st_dev_rmv_cont_mem_stat( pdev->p_stat, (ULONG)(p_dma_addr->sz) );<o:p></o:p></p>
<p class="MsoNormal">+                             if (cur_irql < APC_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">+                                             KeLowerIrql( old_irql );<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *<o:p></o:p></p>
<p class="MsoNormal">+dma_alloc_coherent( struct mlx4_dev **dev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">+             dma_addr_t *p_dma_addr, gfp_t gfp )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(gfp);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (!size)<o:p></o:p></p>
<p class="MsoNormal">+                             return NULL;<o:p></o:p></p>
<p class="MsoNormal">+             return alloc_cont_mem( (*dev)->pdev, (unsigned long)size, p_dma_addr );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+dma_free_coherent( struct mlx4_dev **dev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">+             void *vaddr, dma_addr_t dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(vaddr);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(size == dma_addr.sz);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(vaddr == dma_addr.va);<o:p></o:p></p>
<p class="MsoNormal">+             free_cont_mem( (*dev)->pdev, &dma_addr );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+pci_free_consistent( struct pci_dev *pdev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">+             void *vaddr, dma_addr_t dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             dma_free_coherent( &pdev->dev, size, vaddr, dma_addr );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/l2w/dirs<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/l2w/dirs      (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/l2w/dirs   (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,2 @@<o:p></o:p></p>
<p class="MsoNormal">+DIRS=\<o:p></o:p></p>
<p class="MsoNormal">+             kernel<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/SOURCES<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/SOURCES  (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/SOURCES               (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,36 @@<o:p></o:p></p>
<p class="MsoNormal">+TARGETNAME=genutils<o:p></o:p></p>
<p class="MsoNormal">+TARGETPATH=..\..\..\bin\kernel\obj$(BUILD_ALT_DIR)<o:p></o:p></p>
<p class="MsoNormal">+TARGETTYPE=DRIVER_LIBRARY<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+!if $(FREEBUILD)<o:p></o:p></p>
<p class="MsoNormal">+ENABLE_EVENT_TRACING=1 <o:p></o:p></p>
<p class="MsoNormal">+!endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+SOURCES= \<o:p></o:p></p>
<p class="MsoNormal">+             gu_timer.cpp     \<o:p></o:p></p>
<p class="MsoNormal">+             gu_utils.cpp       \<o:p></o:p></p>
<p class="MsoNormal">+             gu_dbg.cpp        <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\..\inc\kernel\genutils;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+C_DEFINES = $(C_DEFINES) -DIOCTL_INTERFACE=1<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+!IFDEF ENABLE_EVENT_TRACING<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+C_DEFINES = $(C_DEFINES) -DEVENT_TRACING<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+RUN_WPP= $(SOURCES) -km -dll -ext: .c .cpp .h .C .CPP .H\<o:p></o:p></p>
<p class="MsoNormal">+             -preserveext:.cpp .h\<o:p></o:p></p>
<p class="MsoNormal">+             -scan:..\..\..\inc\kernel\genutils\gu_wpptrace.h\<o:p></o:p></p>
<p class="MsoNormal">+             -func:GU_PRINT(LEVEL,FLAGS,MSG,...) <o:p></o:p></p>
<p class="MsoNormal">+!ENDIF<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+MC_SOURCEDIR=.  <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+MSC_WARNING_LEVEL= /W4<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+PRECOMPILED_INCLUDE=gu_precomp.h<o:p></o:p></p>
<p class="MsoNormal">+PRECOMPILED_PCH=gu_precomp.pch<o:p></o:p></p>
<p class="MsoNormal">+PRECOMPILED_CXX=1<o:p></o:p></p>
<p class="MsoNormal">\ No newline at end of file<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/gu_precomp.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/gu_precomp.h       (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/gu_precomp.h    (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,38 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4214)   // bit field types other than int<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4201)   // nameless struct/union<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4115)   // named type definition in parentheses<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4127)   // conditional expression is constant<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4054)   // cast of function pointer to PVOID<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4206)   // translation unit is empty<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4100)   // unreferenced formal parameter<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//extern "C" {<o:p></o:p></p>
<p class="MsoNormal">+#include <ntddk.h><o:p></o:p></p>
<p class="MsoNormal">+#include <wdm.h><o:p></o:p></p>
<p class="MsoNormal">+//#include <wdf.h><o:p></o:p></p>
<p class="MsoNormal">+#include <wdmsec.h><o:p></o:p></p>
<p class="MsoNormal">+#include <ndis.h><o:p></o:p></p>
<p class="MsoNormal">+//}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <ntintsafe.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <ntstatus.h><o:p></o:p></p>
<p class="MsoNormal">+#include <initguid.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">+#include <WinDef.h><o:p></o:p></p>
<p class="MsoNormal">+#include <ntstrsafe.h><o:p></o:p></p>
<p class="MsoNormal">+#include <strsafe.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdlib.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdarg.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_defs.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_dbg.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_wpptrace.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_utils.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "shutter.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/gu_dbg.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/gu_dbg.cpp             (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/gu_dbg.cpp          (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,128 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_dbg.cpp<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This modulde contains all related dubug code<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+#include <stdarg.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_dbg.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define TEMP_BUFFER_SIZE 128<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUDebugFlags g_GUDbgFlagsDef[] = {<o:p></o:p></p>
<p class="MsoNormal">+    { L"GU", TRACE_LEVEL_ERROR},<o:p></o:p></p>
<p class="MsoNormal">+    { L"GU_INIT", TRACE_LEVEL_ERROR}<o:p></o:p></p>
<p class="MsoNormal">+    };<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID cl_dbg_out( IN PCCH  format, ...)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             va_list  list;<o:p></o:p></p>
<p class="MsoNormal">+             va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+             vDbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_ERROR_LEVEL, format, list);<o:p></o:p></p>
<p class="MsoNormal">+             va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void DebugGUPrintInit(IN LPCWSTR pszRegistryPath)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    LONG resultFromRegistry = TRACE_LEVEL_ERROR;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    for (int i = 0; i < SIZE_OF(g_GUDbgFlagsDef); ++i)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        DWORD defaultVal = g_GUDbgFlagsDef[i].dbgLevel;<o:p></o:p></p>
<p class="MsoNormal">+        NTSTATUS Status = ReadRegistryDword(<o:p></o:p></p>
<p class="MsoNormal">+                                pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+                                L"\\Parameters\\Debug",<o:p></o:p></p>
<p class="MsoNormal">+                                g_GUDbgFlagsDef[i].pszName,<o:p></o:p></p>
<p class="MsoNormal">+                                defaultVal,<o:p></o:p></p>
<p class="MsoNormal">+                                &resultFromRegistry);       
<o:p></o:p></p>
<p class="MsoNormal">+        if (NT_SUCCESS(Status))  <o:p></o:p></p>
<p class="MsoNormal">+        {<o:p></o:p></p>
<p class="MsoNormal">+            g_GUDbgFlagsDef[i].dbgLevel = resultFromRegistry;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if !defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+TraceGUMessage(<o:p></o:p></p>
<p class="MsoNormal">+    IN PCCHAR  func,<o:p></o:p></p>
<p class="MsoNormal">+    IN PCCHAR  file,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG   line,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG   level,<o:p></o:p></p>
<p class="MsoNormal">+    IN PCCHAR  format,<o:p></o:p></p>
<p class="MsoNormal">+    ...<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Routine Description:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    Debug print for the sample driver.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Arguments:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    TraceEventsLevel - print level between 0 and 3, with 3 the most verbose<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Return Value:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    None.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ --*/<o:p></o:p></p>
<p class="MsoNormal">+ {<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    va_list    list;<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS   status;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    va_start(list, format);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    char psPrefix[TEMP_BUFFER_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+    PCCHAR  fileName = strrchr(file, '\\');<o:p></o:p></p>
<p class="MsoNormal">+    if (fileName != NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        fileName++;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    if(level == TRACE_LEVEL_ERROR) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        status = RtlStringCchPrintfA(psPrefix, TEMP_BUFFER_SIZE, "***ERROR***  %s (%s:%d) ", func, fileName, line);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    else<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        status = RtlStringCchPrintfA(psPrefix, TEMP_BUFFER_SIZE, "%s (%s:%d) ", func, fileName, line);<o:p></o:p></p>
<p class="MsoNormal">+        level = TRACE_LEVEL_ERROR;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NT_SUCCESS(status));<o:p></o:p></p>
<p class="MsoNormal">+    vDbgPrintExWithPrefix(psPrefix , DPFLTR_IHVNETWORK_ID, level, format, list);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    va_end(list);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    UNREFERENCED_PARAMETER(TraceEventsLevel);<o:p></o:p></p>
<p class="MsoNormal">+    UNREFERENCED_PARAMETER(TraceEventsFlag);<o:p></o:p></p>
<p class="MsoNormal">+    UNREFERENCED_PARAMETER(DebugMessage);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif // DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/readme.txt<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/readme.txt              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/readme.txt           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,141 @@<o:p></o:p></p>
<p class="MsoNormal">+This library unifies in it general useful utilities.<o:p></o:p></p>
<p class="MsoNormal">+To use it one needs to link with genutils.lib.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+genutils provides:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// gu_utils.h - general utils file<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Flags manipulation:<o:p></o:p></p>
<p class="MsoNormal">+             (assuming M has a field named Flags)<o:p></o:p></p>
<p class="MsoNormal">+             - GU_SET_FLAG(_M, _F)<o:p></o:p></p>
<p class="MsoNormal">+             - GU_CLEAR_FLAG(_M, _F)<o:p></o:p></p>
<p class="MsoNormal">+             - GU_CLEAR_FLAGS(_M)<o:p></o:p></p>
<p class="MsoNormal">+             - GU_TEST_FLAG(_M, _F)<o:p></o:p></p>
<p class="MsoNormal">+             - GU_TEST_FLAGS(_M, _F)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Time utilities:<o:p></o:p></p>
<p class="MsoNormal">+             - GenUtilsInit()                                  - init the QueryTimeIncrement factor<o:p></o:p></p>
<p class="MsoNormal">+             - GetTickCountInMsec()                                               - returns tick count in milliseconds<o:p></o:p></p>
<p class="MsoNormal">+             - GetTickCountInNsec()                                                - returns tick count in nanoseconds        
<o:p></o:p></p>
<p class="MsoNormal">+             - GetTimeStamp()                                           - returns tick count divided by frequency in units of nanoseconds<o:p></o:p></p>
<p class="MsoNormal">+             - TimeFromLong(ULONG HandredNanos)             - converts time from ULONG representation to LARGE_INTEGER representation<o:p></o:p></p>
<p class="MsoNormal">+             - Sleep(ULONG HandredNanos)                                - returns STATUS_SUCCESS after the specified time has passed.<o:p></o:p></p>
<p class="MsoNormal">+                                                                                               Sleep function must be running at IRQL <= APC_LEVEL.<o:p></o:p></p>
<p class="MsoNormal">+                                                                                               NOTE: The input parameter is in 100 Nano Second units. Multiply by 10000 to specify Milliseconds.<o:p></o:p></p>
<p class="MsoNormal">+             - MyKeWaitForSingleObject                        - A wrapper for the KeWaitForSingleObject that adds assertions to the values returned by it<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+General utils:<o:p></o:p></p>
<p class="MsoNormal">+             - ROUNDUP_LOG2(u32 arg)                                        - return the log2 of the given number rounded up<o:p></o:p></p>
<p class="MsoNormal">+             - guid_to_str(u64 guid, WCHAR* pstr, DWORD BufLen)<o:p></o:p></p>
<p class="MsoNormal">+             - H_TO_BE(const u32 src)<o:p></o:p></p>
<p class="MsoNormal">+             - Floor_4(UINT value)<o:p></o:p></p>
<p class="MsoNormal">+             - nthos(USHORT in)<o:p></o:p></p>
<p class="MsoNormal">+             - DbgPrintIpAddress(LPCSTR str_description, u8 ipAddress[], unsigned int traceLevel)<o:p></o:p></p>
<p class="MsoNormal">+             - DbgPrintMacAddress(LPCSTR str_description, u8 macAddress[], unsigned int traceLevel)<o:p></o:p></p>
<p class="MsoNormal">+             - UpdateRc(NTSTATUS *rc, NTSTATUS rc1)           - set rc to be rc1 if rc was a success value (>0)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Memory utils:<o:p></o:p></p>
<p class="MsoNormal">+             - AllocateSharedMemory             - allocate ndis shared memory according to Ndis.h _NDIS_SHARED_MEMORY_PARAMETERS<o:p></o:p></p>
<p class="MsoNormal">+             - FreeSharedMemory<o:p></o:p></p>
<p class="MsoNormal">+             - CopyFromUser                               - copy from source buffer to destination buffer a given number of bytes. Checks that the source can be read<o:p></o:p></p>
<p class="MsoNormal">+             - CopyToUser                    - copy from source buffer to destination buffer a given number of bytes. Checks that the destination can be written to<o:p></o:p></p>
<p class="MsoNormal">+             - MapUserMemory                         - lock and map specified memory pages<o:p></o:p></p>
<p class="MsoNormal">+             - UnMapMemory                            - unmap and unlock specified memory pages<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Registry values:<o:p></o:p></p>
<p class="MsoNormal">+             - ReadRegistryDword<o:p></o:p></p>
<p class="MsoNormal">+             - ReadRegStrRegistryValueInNonPagedMemory<o:p></o:p></p>
<p class="MsoNormal">+             - ReadRegistryValue<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+VERIFY_DISPATCH_LEVEL:<o:p></o:p></p>
<p class="MsoNormal">+             At the begining of the function one should call:<o:p></o:p></p>
<p class="MsoNormal">+             VERIFY_DISPATCH_LEVEL(KIRQL irql), this call will verify that the current IRQL is the given IRQL.<o:p></o:p></p>
<p class="MsoNormal">+             At the end of the function the distructor of the class will ASSERT that the level stayed the same
<o:p></o:p></p>
<p class="MsoNormal">+             throughout the function.<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+CSpinLockWrapper:<o:p></o:p></p>
<p class="MsoNormal">+             - CSpinLockWrapper (KSPIN_LOCK &SpinLock)   - Spinlock must already be initialized<o:p></o:p></p>
<p class="MsoNormal">+             - Lock()                                                                                 - Uses KeAcquireSpinLock and saves the IRQL by itself<o:p></o:p></p>
<p class="MsoNormal">+             - Unlock()                                                                            - Uses KeReleaseSpinLock<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+LinkedList:<o:p></o:p></p>
<p class="MsoNormal">+             - Init() <o:p></o:p></p>
<p class="MsoNormal">+             - Size()<o:p></o:p></p>
<p class="MsoNormal">+             - RemoveHeadList()                                        - returns LIST_ENTRY*<o:p></o:p></p>
<p class="MsoNormal">+             - RemoveTailList()                                            - returns LIST_ENTRY*<o:p></o:p></p>
<p class="MsoNormal">+             - InsertTailList(LIST_ENTRY *Item)<o:p></o:p></p>
<p class="MsoNormal">+             - InsertHeadList(LIST_ENTRY *Item)<o:p></o:p></p>
<p class="MsoNormal">+             - Head()                                                               - returns LIST_ENTRY*. ASSERTS that the list is not empty!
<o:p></o:p></p>
<p class="MsoNormal">+             - Tail()                                                   - returns LIST_ENTRY*. ASSERTS that the list is not empty!
<o:p></o:p></p>
<p class="MsoNormal">+             - RawHead()                                                       - returns LIST_ENTRY*. Return the head of the list without any checks, to be used as an iterator<o:p></o:p></p>
<p class="MsoNormal">+             - IsAfterTheLast(LIST_ENTRY *pEntry)    - true if the list is empty or the entry is the raw head.<o:p></o:p></p>
<p class="MsoNormal">+             - RemoveEntryList(LIST_ENTRY *Item)                   - ASSERTS that the list is not empty!<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Queue:<o:p></o:p></p>
<p class="MsoNormal">+             - InitializeQueueHeader(QueueHeader)                
<o:p></o:p></p>
<p class="MsoNormal">+             - IsQueueEmpty(QueueHeader) <o:p></o:p></p>
<p class="MsoNormal">+             - RemoveHeadQueue(QueueHeader)                <o:p>
</o:p></p>
<p class="MsoNormal">+             - InsertHeadQueue(QueueHeader, QueueEntry)    <o:p>
</o:p></p>
<p class="MsoNormal">+             - InsertTailQueue(QueueHeader, QueueEntry)                    
<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+Array (A simple static array):<o:p></o:p></p>
<p class="MsoNormal">+             - Init(int MaxNumberofPackets)<o:p></o:p></p>
<p class="MsoNormal">+             - Shutdown()   <o:p></o:p></p>
<p class="MsoNormal">+             - Array()<o:p></o:p></p>
<p class="MsoNormal">+             - Add(void *ptr)               - add member to the current count (as indicated by GetCount())<o:p></o:p></p>
<p class="MsoNormal">+             - GetCount()<o:p></o:p></p>
<p class="MsoNormal">+             - GetPtr(int Place)           - get member from a given index<o:p></o:p></p>
<p class="MsoNormal">+             - Reset()                              - after a call to this function the next add will be into the first index<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ProcessorArray:<o:p></o:p></p>
<p class="MsoNormal">+             This class is used for freeing the sent packets.<o:p></o:p></p>
<p class="MsoNormal">+             It is based on the assumption that this happens at raised irql and therefore,<o:p></o:p></p>
<p class="MsoNormal">+             if we allocate a data structure for each processor we should be fine<o:p></o:p></p>
<p class="MsoNormal">+             - Init(int MaxNumberofPackets)<o:p></o:p></p>
<p class="MsoNormal">+             - Shutdown() <o:p></o:p></p>
<p class="MsoNormal">+             - GetArray()                       - returns a reseted array of the current processor<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+FIFO:<o:p></o:p></p>
<p class="MsoNormal">+             - Init(int MaxSize)<o:p></o:p></p>
<p class="MsoNormal">+             - Shutdown() <o:p></o:p></p>
<p class="MsoNormal">+             - Push(T pNewItem)<o:p></o:p></p>
<p class="MsoNormal">+             - Pop() <o:p></o:p></p>
<p class="MsoNormal">+             - Count() <o:p></o:p></p>
<p class="MsoNormal">+             - IsFull()<o:p></o:p></p>
<p class="MsoNormal">+             - IsEmpty() <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Bitmap:<o:p></o:p></p>
<p class="MsoNormal">+             - Set(ULONG* pData, ULONG BitIndex) - returns true if the bit was set and false if it was already set or is out of range<o:p></o:p></p>
<p class="MsoNormal">+             - Clear(ULONG* pData, ULONG BitIndex)             - returns true if the bit was cleared and false if it was already clear or is out of range<o:p></o:p></p>
<p class="MsoNormal">+             - Test(ULONG* pData, ULONG BitIndex)               - returns true if the bit is set and false if it is clear or out of range<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// gu_timer.h <o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+IGUWorkItem:<o:p></o:p></p>
<p class="MsoNormal">+             The element that is queue for execution. It must have a void Execute() function.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUWorkerThread:<o:p></o:p></p>
<p class="MsoNormal">+             - Start()                                - start the thread. The thread will run its Run() function.<o:p></o:p></p>
<p class="MsoNormal">+             - Stop()                 - signals the Run() function to stop its execution.<o:p></o:p></p>
<p class="MsoNormal">+             - Run()                                  - while Stop() was not called, wait for an item to be enqueued and execute all currently enqueued items<o:p></o:p></p>
<p class="MsoNormal">+             - EnqueueWorkItem(IGUWorkItem *pWorkItem)          
<o:p></o:p></p>
<p class="MsoNormal">+             - DequeueWorkItem(IGUWorkItem *pWorkItem)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUTimer:<o:p></o:p></p>
<p class="MsoNormal">+             - Initialize(CGUWorkerThread *pThread, IGUWorkItem *pWorkItem, ULONG TimerIntervalMillis = 0, bool  IsPeriodic = true)<o:p></o:p></p>
<p class="MsoNormal">+                                                                             - init a timer on an execution thread, a specific work item.
<o:p></o:p></p>
<p class="MsoNormal">+                                                                               The thread will enqueue the item after a given delay
<o:p></o:p></p>
<p class="MsoNormal">+                                                                               and will requeue it each interval if the timer is periodic.<o:p></o:p></p>
<p class="MsoNormal">+             - Run()                                                  - enqueue the item for execution. Called when the delay expires.<o:p></o:p></p>
<p class="MsoNormal">+             - Cancel()                                             - stops the wait for the delay to end, meaning the enqueue at the end of the delay will not take place.<o:p></o:p></p>
<p class="MsoNormal">+                                                                               returns true if timer was canceled and will not run or was idle<o:p></o:p></p>
<p class="MsoNormal">+                                                                               returns false if the event has just finished running and cannot be canceled anymore<o:p></o:p></p>
<p class="MsoNormal">+             - Start()                                                - internally used to re-start the timer on the delay time, if the timer is periodic<o:p></o:p></p>
<p class="MsoNormal">+             - Start(ULONG dwInterval)          - may be used to re-start the timer on a new delay time<o:p></o:p></p>
<p class="MsoNormal">+             - Stop()                                 - Cancel and release timer<o:p></o:p></p>
<p class="MsoNormal">+             - PassiveRun()                                   - internally used to run the work item in PASSIVE_LEVEL<o:p></o:p></p>
<p class="MsoNormal">+ <o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/gu_timer.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/gu_timer.cpp          (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/gu_timer.cpp       (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,471 @@<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_timer.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_timer.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+LONG IGUWorkItem::AddRef(LPCSTR str)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(RefCount >= 0);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    LONG rc = InterlockedIncrement(&RefCount);<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "AddRef (%s): WI %p: new count %d\n", str, this, rc);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return rc;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+LONG IGUWorkItem::Release(LPCSTR str)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(RefCount > 0);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ULONG rc = InterlockedDecrement(&RefCount);<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "Release (%s): WI %p: new count %d\n", str, this, rc);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (rc == 0)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        // Free memory if there is no outstanding reference.<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU, "Free WI %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+        delete this;<o:p></o:p></p>
<p class="MsoNormal">+    }   <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return rc;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+IGUWorkItem::~IGUWorkItem()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    //  The work item must be executed<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_pWorkerThread == NULL);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    if(m_pWorkerThread != NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        m_pWorkerThread->DequeueWorkItem(this);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID GUThreadFunc(void *pContext)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    class CGUWorkerThread *pWorkerThread = (CGUWorkerThread*) pContext;<o:p></o:p></p>
<p class="MsoNormal">+    pWorkerThread->Run();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUWorkerThread::CGUWorkerThread() : <o:p></o:p></p>
<p class="MsoNormal">+    m_bIsStarted(false),<o:p></o:p></p>
<p class="MsoNormal">+    m_bExit(false)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    InitializeListHead(&m_WorkItems);<o:p></o:p></p>
<p class="MsoNormal">+    KeInitializeSpinLock(&m_Lock);<o:p></o:p></p>
<p class="MsoNormal">+    KeInitializeEvent(&m_Event, SynchronizationEvent, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUWorkerThread::~CGUWorkerThread()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(m_bIsStarted && ! m_bExit)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        Stop();<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NDIS_STATUS CGUWorkerThread::Start() <o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Status = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    OBJECT_ATTRIBUTES   attr;<o:p></o:p></p>
<p class="MsoNormal">+    HANDLE  ThreadHandle;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CGUWorkerThread::Start: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    InitializeObjectAttributes( &attr, NULL, OBJ_KERNEL_HANDLE, NULL, NULL );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    Status = PsCreateSystemThread(<o:p></o:p></p>
<p class="MsoNormal">+                                &ThreadHandle, <o:p></o:p></p>
<p class="MsoNormal">+                                THREAD_ALL_ACCESS,<o:p></o:p></p>
<p class="MsoNormal">+                                &attr,<o:p></o:p></p>
<p class="MsoNormal">+                                NULL,<o:p></o:p></p>
<p class="MsoNormal">+                                NULL,<o:p></o:p></p>
<p class="MsoNormal">+                                ::GUThreadFunc,<o:p></o:p></p>
<p class="MsoNormal">+                                this<o:p></o:p></p>
<p class="MsoNormal">+                                );<o:p></o:p></p>
<p class="MsoNormal">+    if (!NT_SUCCESS(Status)) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "PsCreateSystemThread failed\n");<o:p></o:p></p>
<p class="MsoNormal">+        goto Cleanup;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    // Convert the thread into a handle<o:p></o:p></p>
<p class="MsoNormal">+    Status = ObReferenceObjectByHandle(<o:p></o:p></p>
<p class="MsoNormal">+          ThreadHandle,<o:p></o:p></p>
<p class="MsoNormal">+          THREAD_ALL_ACCESS,<o:p></o:p></p>
<p class="MsoNormal">+          NULL,<o:p></o:p></p>
<p class="MsoNormal">+          KernelMode,<o:p></o:p></p>
<p class="MsoNormal">+          &m_ThreadObject,<o:p></o:p></p>
<p class="MsoNormal">+          NULL<o:p></o:p></p>
<p class="MsoNormal">+          );<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(Status == STATUS_SUCCESS); // According to MSDN, must succeed if I set the params<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    Status = ZwClose(ThreadHandle);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NT_SUCCESS(Status)); // Should always succeed<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    m_bIsStarted = true;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+Cleanup:<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CGUWorkerThread::Stop: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+    return Status;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CGUWorkerThread::Stop() <o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_bIsStarted == true);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_bExit == false);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Status = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CGUWorkerThread::Stop: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(! m_bExit)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        m_bExit = true;<o:p></o:p></p>
<p class="MsoNormal">+        KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        Status = KeWaitForSingleObject(<o:p></o:p></p>
<p class="MsoNormal">+                m_ThreadObject,<o:p></o:p></p>
<p class="MsoNormal">+                Executive,<o:p></o:p></p>
<p class="MsoNormal">+                KernelMode,<o:p></o:p></p>
<p class="MsoNormal">+                FALSE,<o:p></o:p></p>
<p class="MsoNormal">+                NULL<o:p></o:p></p>
<p class="MsoNormal">+                );<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(Status == STATUS_SUCCESS);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(IsListEmpty(&m_WorkItems) == TRUE);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CGUWorkerThread::Stop: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CGUWorkerThread::Run()<o:p></o:p></p>
<p class="MsoNormal">+{    <o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Status;<o:p></o:p></p>
<p class="MsoNormal">+    KIRQL irql;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    while(! m_bExit)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+        Status = KeWaitForSingleObject(<o:p></o:p></p>
<p class="MsoNormal">+            &m_Event,<o:p></o:p></p>
<p class="MsoNormal">+            Executive,<o:p></o:p></p>
<p class="MsoNormal">+            KernelMode,<o:p></o:p></p>
<p class="MsoNormal">+            FALSE,<o:p></o:p></p>
<p class="MsoNormal">+            NULL<o:p></o:p></p>
<p class="MsoNormal">+            );<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(Status == STATUS_SUCCESS);<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "Thread wake up\n");<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+        KeAcquireSpinLock(&m_Lock, &irql);<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+        while (!IsListEmpty(&m_WorkItems))<o:p></o:p></p>
<p class="MsoNormal">+        {<o:p></o:p></p>
<p class="MsoNormal">+            PLIST_ENTRY p = m_WorkItems.Flink;        <o:p>
</o:p></p>
<p class="MsoNormal">+            IGUWorkItem* pWorkItem = CONTAINING_RECORD(p, IGUWorkItem, m_Link);<o:p></o:p></p>
<p class="MsoNormal">+            RemoveHeadList(&m_WorkItems);<o:p></o:p></p>
<p class="MsoNormal">+            pWorkItem->Release("CGUWorkerThread::Run");<o:p></o:p></p>
<p class="MsoNormal">+            pWorkItem->m_pWorkerThread = NULL;<o:p></o:p></p>
<p class="MsoNormal">+            KeReleaseSpinLock(&m_Lock, irql);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+            pWorkItem->Execute();<o:p></o:p></p>
<p class="MsoNormal">+            <o:p></o:p></p>
<p class="MsoNormal">+            KeAcquireSpinLock(&m_Lock, &irql);<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+            <o:p></o:p></p>
<p class="MsoNormal">+        KeReleaseSpinLock(&m_Lock, irql);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    PsTerminateSystemThread(STATUS_SUCCESS);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NDIS_STATUS CGUWorkerThread::EnqueueWorkItem(IGUWorkItem *pWorkItem)<o:p></o:p></p>
<p class="MsoNormal">+{    <o:p></o:p></p>
<p class="MsoNormal">+    BOOLEAN IsEmpty = false;<o:p></o:p></p>
<p class="MsoNormal">+    KIRQL irql;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CGUWorkerThread::EnqueueWorkItem: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+    if(! m_bExit)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        KeAcquireSpinLock(&m_Lock, &irql);<o:p></o:p></p>
<p class="MsoNormal">+        IsEmpty = IsListEmpty(&m_WorkItems);<o:p></o:p></p>
<p class="MsoNormal">+        InsertTailList(&m_WorkItems, &pWorkItem->m_Link);<o:p></o:p></p>
<p class="MsoNormal">+        pWorkItem->AddRef("CGUWorkerThread::EnqueueWorkItem");<o:p></o:p></p>
<p class="MsoNormal">+        pWorkItem->m_pWorkerThread = this;<o:p></o:p></p>
<p class="MsoNormal">+        KeReleaseSpinLock(&m_Lock, irql);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+        if(IsEmpty)<o:p></o:p></p>
<p class="MsoNormal">+            KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CGUWorkerThread::EnqueueWorkItem: thread %p SUCCESS\n", this);<o:p></o:p></p>
<p class="MsoNormal">+        return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CGUWorkerThread::EnqueueWorkItem: thread %p - NOT ACCEPTED\n", this);<o:p></o:p></p>
<p class="MsoNormal">+    return NDIS_STATUS_NOT_ACCEPTED;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NDIS_STATUS CGUWorkerThread::DequeueWorkItem(IGUWorkItem *pWorkItem)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    KIRQL irql;<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CGUWorkerThread::DequeueWorkItem: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+    KeAcquireSpinLock(&m_Lock, &irql);<o:p></o:p></p>
<p class="MsoNormal">+    RemoveEntryList(&pWorkItem->m_Link);<o:p></o:p></p>
<p class="MsoNormal">+    pWorkItem->Release("CGUWorkerThread::DequeueWorkItem");<o:p></o:p></p>
<p class="MsoNormal">+    pWorkItem->m_pWorkerThread = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    KeReleaseSpinLock(&m_Lock, irql);<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CGUWorkerThread::DequeueWorkItem: thread %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+ GUTimerFunc(<o:p></o:p></p>
<p class="MsoNormal">+    IN struct _KDPC  *Dpc,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  DeferredContext,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  SystemArgument1,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  SystemArgument2<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    CGUTimer* pTimer = (CGUTimer *) DeferredContext;<o:p></o:p></p>
<p class="MsoNormal">+    pTimer->Run();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUTimer::CGUTimer()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_ERROR, GU, "====>CGUTimer::CGUTimer: Timer %p, RefCount %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                this, m_RefCount);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_ERROR, GU, "<====CGUTimer::CGUTimer: Timer %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CGUTimer::~CGUTimer()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_ERROR, GU, "====>CGUTimer::~CGUTimer: Timer %p, RefCount %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                this, m_RefCount);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_ERROR, GU, "<====CGUTimer::~CGUTimer: Timer %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CGUTimer::Initialize(<o:p></o:p></p>
<p class="MsoNormal">+             CGUWorkerThread *pThread, <o:p></o:p></p>
<p class="MsoNormal">+             IGUWorkItem *pWorkItem, <o:p></o:p></p>
<p class="MsoNormal">+             ULONG TimerIntervalMillis,<o:p></o:p></p>
<p class="MsoNormal">+    bool  IsPeriodic)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    m_pThread = pThread;<o:p></o:p></p>
<p class="MsoNormal">+    m_pWorkItem = pWorkItem;<o:p></o:p></p>
<p class="MsoNormal">+    m_bExit = false;<o:p></o:p></p>
<p class="MsoNormal">+    m_IsPeriodic = IsPeriodic;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+   KeInitializeTimer(&m_Timer);<o:p></o:p></p>
<p class="MsoNormal">+   KeInitializeDpc(&m_Dpc, GUTimerFunc, this);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+   m_TimerIntervalMillis = TimerIntervalMillis;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+   shutter_init(&m_cancel);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+   KeInitializeEvent(&m_Event, SynchronizationEvent, TRUE);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+   m_TimerWorkItem.Init(this);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+   AddRef("CGUTimer::CGUTimer");<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+LONG CGUTimer::AddRef(LPCSTR str)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_RefCount >= 0);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    LONG rc = InterlockedIncrement(&m_RefCount);<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "AddRef (%s): Timer %p: new count %d\n", str, this, rc);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return rc;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+LONG CGUTimer::Release(LPCSTR str)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_RefCount > 0);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    UINT rc = InterlockedDecrement(&m_RefCount);<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "Release (%s): Timer %p: new count %d\n", str, this, rc);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (rc == 0)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        // Free memory if there is no outstanding reference.<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU, "Free Timer %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+        delete this;<o:p></o:p></p>
<p class="MsoNormal">+    }   <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return rc;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+bool CGUTimer::Start()<o:p></o:p></p>
<p class="MsoNormal">+{    <o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_IsPeriodic);<o:p></o:p></p>
<p class="MsoNormal">+    return Start(m_TimerIntervalMillis);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+bool CGUTimer::Start(DWORD dwTimerIntervalMillis)<o:p></o:p></p>
<p class="MsoNormal">+{    <o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "===>CGUTimer::Start\n");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    KeWaitForSingleObject(&m_Event, Executive, KernelMode , FALSE, NULL);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    bool bret = true;<o:p></o:p></p>
<p class="MsoNormal">+    if (shutter_use(&m_cancel) <= 0) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU, "Cancelling is in progress\n");<o:p></o:p></p>
<p class="MsoNormal">+        bret = false;<o:p></o:p></p>
<p class="MsoNormal">+        goto Exit;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    BOOLEAN bPrevTimerWasCancelled = FALSE;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    AddRef("CGUTimer::Start");<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER TimerInterval;<o:p></o:p></p>
<p class="MsoNormal">+    if(dwTimerIntervalMillis == 0)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        m_pThread->EnqueueWorkItem(&m_TimerWorkItem);<o:p></o:p></p>
<p class="MsoNormal">+        goto Exit;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    else<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        TimerInterval.QuadPart = ((LONGLONG)-10000) * dwTimerIntervalMillis;<o:p></o:p></p>
<p class="MsoNormal">+    }   <o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    bPrevTimerWasCancelled = KeSetTimer(&m_Timer, TimerInterval, &m_Dpc);<o:p></o:p></p>
<p class="MsoNormal">+    if(bPrevTimerWasCancelled)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        Release("CGUTimer::Start");<o:p></o:p></p>
<p class="MsoNormal">+    }    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<===CGUTimer::Start\n");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Exit:    <o:p></o:p></p>
<p class="MsoNormal">+    KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+    return bret;  <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CGUTimer::Stop()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CMuxTimer::Stop: Timer %p, RefCount %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                this, m_RefCount);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    Cancel();<o:p></o:p></p>
<p class="MsoNormal">+    Release("CMuxTimer::Stop");<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CMuxTimer::Stop: Timer %p\n",<o:p></o:p></p>
<p class="MsoNormal">+                this);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// true = timer was canceled and will not run<o:p></o:p></p>
<p class="MsoNormal">+// false = event has just finished running<o:p></o:p></p>
<p class="MsoNormal">+bool CGUTimer::Cancel()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CGUTimer::cancel: Timer %p, RefCount %d\n",<o:p></o:p></p>
<p class="MsoNormal">+                this, m_RefCount);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    KeWaitForSingleObject(&m_Event, Executive, KernelMode , FALSE, NULL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    bool bret = false;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(m_cancel.cnt == 0)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        //  Do not fail cancel call.<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU, "Cancel called while timer is idle\n");<o:p></o:p></p>
<p class="MsoNormal">+        KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        return true;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    m_bExit = true;<o:p></o:p></p>
<p class="MsoNormal">+    BOOLEAN bTimerCancelled = KeCancelTimer(&m_Timer);<o:p></o:p></p>
<p class="MsoNormal">+    if(bTimerCancelled)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        shutter_loose(&m_cancel);<o:p></o:p></p>
<p class="MsoNormal">+        Release("CMuxTimer::Stop_cancel");<o:p></o:p></p>
<p class="MsoNormal">+        bret = true;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    // the call is still running<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    shutter_shut(&m_cancel);<o:p></o:p></p>
<p class="MsoNormal">+    shutter_alive(&m_cancel);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CGUTimer::cancel: Timer %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+    return bret;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CGUTimer::Run() <o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER CurrentTime;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "====>CMuxTimer::Run: Timer %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(m_pWorkItem && !m_bExit)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        CurrentTime.QuadPart = GetTickCountInMsec();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+        if (! m_IsPeriodic || (CurrentTime.QuadPart - m_LastRunTime.QuadPart) >= m_TimerIntervalMillis)<o:p></o:p></p>
<p class="MsoNormal">+        {<o:p></o:p></p>
<p class="MsoNormal">+            Status = m_pThread->EnqueueWorkItem(&m_TimerWorkItem);<o:p></o:p></p>
<p class="MsoNormal">+            m_LastRunTime.QuadPart = CurrentTime.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        else<o:p></o:p></p>
<p class="MsoNormal">+        {<o:p></o:p></p>
<p class="MsoNormal">+            ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    Release("CMuxTimer::Run");<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, "<====CMuxTimer::Run: Timer %p\n", this);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CGUTimer::PassiveRun()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    m_pWorkItem->Execute();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    shutter_loose(&m_cancel);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(! m_bExit && m_IsPeriodic)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        Start(); <o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void CTimerWorkItem::Execute()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    m_pTimer->PassiveRun();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/gu_utils.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/gu_utils.cpp            (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/gu_utils.cpp         (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,794 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    GenUtils.cpp<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This module contains all debug-related code.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Revision History:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_utils.tmh"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ULONG g_QueryTimeIncrement;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+LARGE_INTEGER  TimeFromLong(ULONG HandredNanos)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER  Timeout;<o:p></o:p></p>
<p class="MsoNormal">+    Timeout.HighPart = 0xffffffff;<o:p></o:p></p>
<p class="MsoNormal">+    Timeout.LowPart =  0xffffffff ^ HandredNanos;<o:p></o:p></p>
<p class="MsoNormal">+    return Timeout;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// Sleep function must be running at IRQL <= APC_LEVEL<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// NOTE: The input parameter is in 100 Nano Second units. Multiply by 10000 to specify Milliseconds.<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS Sleep(ULONG HandredNanos)<o:p></o:p></p>
<p class="MsoNormal">+{    <o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS rc = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER  Timeout = TimeFromLong(HandredNanos);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    rc = KeDelayExecutionThread( KernelMode, FALSE, &Timeout );<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(rc == STATUS_SUCCESS);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    return rc;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// In units of ms<o:p></o:p></p>
<p class="MsoNormal">+uint64_t GetTickCountInMsec()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER        Ticks;<o:p></o:p></p>
<p class="MsoNormal">+    KeQueryTickCount(&Ticks);<o:p></o:p></p>
<p class="MsoNormal">+    return Ticks.QuadPart * g_QueryTimeIncrement / 10000; // 10,000 moves from 100ns to ms<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// In units of nano-seconds<o:p></o:p></p>
<p class="MsoNormal">+uint64_t GetTickCountInNsec()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER        Ticks;<o:p></o:p></p>
<p class="MsoNormal">+    KeQueryTickCount(&Ticks);<o:p></o:p></p>
<p class="MsoNormal">+    return Ticks.QuadPart * g_QueryTimeIncrement * 100;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// In units of ns<o:p></o:p></p>
<p class="MsoNormal">+uint64_t GetTimeStamp( void )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER tick_count, frequency;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    tick_count = KeQueryPerformanceCounter( &frequency );<o:p></o:p></p>
<p class="MsoNormal">+    double dtick_count = (double)tick_count.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">+    double dfrequency = (double)frequency.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">+    return (uint64_t)( 1000000000 * dtick_count / dfrequency );<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+u32 ROUNDUP_LOG2(u32 arg)<o:p></o:p></span></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 1)    return 0;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 2)    return 1;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 4)    return 2;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 8)    return 3;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 16)   return 4;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 32)   return 5;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 64)   return 6;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 128)  return 7;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 256)  return 8;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 512)  return 9;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 1024) return 10;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 2048) return 11;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 4096) return 12;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 8192) return 13;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 16384) return 14;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 32768) return 15;<o:p></o:p></p>
<p class="MsoNormal">+    if (arg <= 65536) return 16;<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+    return 32;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS GenUtilsInit()<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    //fill_bit_tbls();  // Do we need this ? <o:p></o:p></p>
<p class="MsoNormal">+    g_QueryTimeIncrement = KeQueryTimeIncrement();<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class ZeroMemoryClass {<o:p></o:p></p>
<p class="MsoNormal">+} zmClass;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void* __cdecl operator new(size_t n ) throw() {<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             //From WinDDK: "Avoid calling ExAllocatePoolWithTag with memory size == 0. Doing so will result in pool header wastage"<o:p></o:p></p>
<p class="MsoNormal">+             // Verifier with low mem simulation will crash with  memory size == 0<o:p></o:p></p>
<p class="MsoNormal">+             //TODO throw exception<o:p></o:p></p>
<p class="MsoNormal">+             if (n ==0) {<o:p></o:p></p>
<p class="MsoNormal">+                             return &zmClass;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    void * p = ExAllocatePoolWithTag(NonPagedPool , n, GLOBAL_ALLOCATION_TAG);<o:p></o:p></p>
<p class="MsoNormal">+    if (p) {<o:p></o:p></p>
<p class="MsoNormal">+        RtlZeroMemory(p , n);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return p;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void __cdecl operator delete(void* p) {<o:p></o:p></p>
<p class="MsoNormal">+             if (p != &zmClass)<o:p></o:p></p>
<p class="MsoNormal">+    {   <o:p></o:p></p>
<p class="MsoNormal">+        ExFreePoolWithTag(p, GLOBAL_ALLOCATION_TAG);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void* __cdecl operator new(size_t n, void *addr ) throw() {<o:p></o:p></p>
<p class="MsoNormal">+    return addr;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS <o:p></o:p></p>
<p class="MsoNormal">+Array::Init(int MaxNumberofPackets) {<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Status = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    m_Size = MaxNumberofPackets;<o:p></o:p></p>
<p class="MsoNormal">+    m_pData = new void*[MaxNumberofPackets];<o:p></o:p></p>
<p class="MsoNormal">+    if (m_pData == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU,"new failed \n");<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_NO_MEMORY;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return Status;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if 0<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+ProcessorArray::Init(int MaxNumberofPackets) {<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Status = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    u32 i = 0,j=0;<o:p></o:p></p>
<p class="MsoNormal">+    m_NumberOfProcessors = NdisSystemProcessorCount();<o:p></o:p></p>
<p class="MsoNormal">+    m_Arrays = new Array[m_NumberOfProcessors];<o:p></o:p></p>
<p class="MsoNormal">+    if (m_Arrays == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU,"new failed \n");<o:p></o:p></p>
<p class="MsoNormal">+        Status = STATUS_NO_MEMORY;<o:p></o:p></p>
<p class="MsoNormal">+        goto Cleanup;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    for (i=0; i < m_NumberOfProcessors; i++) {<o:p></o:p></p>
<p class="MsoNormal">+        Status = m_Arrays[i].Init(MaxNumberofPackets);<o:p></o:p></p>
<p class="MsoNormal">+        if (!NT_SUCCESS(Status)) {<o:p></o:p></p>
<p class="MsoNormal">+            GU_PRINT(TRACE_LEVEL_ERROR, GU,"Array[i].Init failed \n");<o:p></o:p></p>
<p class="MsoNormal">+            goto Cleanup;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Cleanup:<o:p></o:p></p>
<p class="MsoNormal">+    if (!NT_SUCCESS(Status)) {<o:p></o:p></p>
<p class="MsoNormal">+        if (m_Arrays) {<o:p></o:p></p>
<p class="MsoNormal">+            for (j=0; j< i; j++) {<o:p></o:p></p>
<p class="MsoNormal">+                m_Arrays[i].Shutdown();<o:p></o:p></p>
<p class="MsoNormal">+            }<o:p></o:p></p>
<p class="MsoNormal">+            delete []m_Arrays;<o:p></o:p></p>
<p class="MsoNormal">+            m_Arrays = NULL;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        m_NumberOfProcessors = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return Status;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS ReadRegistryDword(<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG DefaultVal,<o:p></o:p></p>
<p class="MsoNormal">+    OUT LONG *pVal<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS    status;<o:p></o:p></p>
<p class="MsoNormal">+    /* Remember the terminating entry in the table below. */<o:p></o:p></p>
<p class="MsoNormal">+    RTL_QUERY_REGISTRY_TABLE    table[2];<o:p></o:p></p>
<p class="MsoNormal">+    UNICODE_STRING              ParamPath;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != pszRegistryPath);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != pszValueName);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != pVal);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    USHORT suffixLength = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (NULL != pszSuffix)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        suffixLength = (USHORT)wcslen(pszSuffix) ;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    RtlInitUnicodeString( &ParamPath, NULL );<o:p></o:p></p>
<p class="MsoNormal">+    USHORT length = (USHORT)wcslen(pszRegistryPath) + suffixLength + 1;<o:p></o:p></p>
<p class="MsoNormal">+    ParamPath.Length = (length -1) * sizeof(WCHAR);       // length in bytes, of the Buffer, not including the terminating NULL character<o:p></o:p></p>
<p class="MsoNormal">+    ParamPath.MaximumLength = length * sizeof(WCHAR);     // total size in bytes, of memory allocated for Buffer<o:p></o:p></p>
<p class="MsoNormal">+    ParamPath.Buffer = new WCHAR[length];<o:p></o:p></p>
<p class="MsoNormal">+    if( !ParamPath.Buffer ) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU,"Failed to allocate parameters path buffer\n");<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    RtlStringCchCopyW(ParamPath.Buffer, length, pszRegistryPath);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (NULL != pszSuffix)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        #pragma prefast(suppress:6053, "The ParamPath.Buffer is preallocated to the required length, and the assert checks for this assumption")<o:p></o:p></p>
<p class="MsoNormal">+        RtlStringCchCatW(ParamPath.Buffer, length, pszSuffix);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    //Clear the table.  This clears all the query callback pointers,<o:p></o:p></p>
<p class="MsoNormal">+    // and sets up the terminating table entry.<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    memset(table, 0, sizeof(table));<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    // Setup the table entries. <o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    table[0].Flags = RTL_QUERY_REGISTRY_DIRECT;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].Name = const_cast <LPWSTR>(pszValueName);<o:p></o:p></p>
<p class="MsoNormal">+    table[0].EntryContext = pVal;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].DefaultType = REG_DWORD;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].DefaultData = &DefaultVal;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].DefaultLength = sizeof(ULONG);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, ParamPath.Buffer, table, NULL, NULL );<o:p></o:p></p>
<p class="MsoNormal">+    if (!NT_SUCCESS(status)) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU,"RtlQueryRegistryValues failed status =0x%x\n", status);<o:p></o:p></p>
<p class="MsoNormal">+        *pVal = DefaultVal;<o:p></o:p></p>
<p class="MsoNormal">+        status = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, " status %#x, path %S, name %S \n",
<o:p></o:p></p>
<p class="MsoNormal">+        status, ParamPath.Buffer, table[0].Name );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    delete [] ParamPath.Buffer;<o:p></o:p></p>
<p class="MsoNormal">+    return status;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS <o:p></o:p></p>
<p class="MsoNormal">+ReadRegStrRegistryValueInNonPagedMemory(<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+    IN UINT flags,<o:p></o:p></p>
<p class="MsoNormal">+    OUT LPWSTR * pWstr<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    // NDIS Query Unicode in ReadRegistryValue allocates PAGED memory<o:p></o:p></p>
<p class="MsoNormal">+    // In Dispatch leavel this causes an ASSERT<o:p></o:p></p>
<p class="MsoNormal">+    // Hence this function using our customized operator new for Non paged allocation<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    UCHAR* pWcharTemp = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    *pWstr = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    UNICODE_STRING tempString = { 0, 0, NULL};<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS ntStatus = ReadRegistryValue(<o:p></o:p></p>
<p class="MsoNormal">+        pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+        pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+        pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+        REG_NONE,<o:p></o:p></p>
<p class="MsoNormal">+        NULL,<o:p></o:p></p>
<p class="MsoNormal">+        0,<o:p></o:p></p>
<p class="MsoNormal">+        flags,<o:p></o:p></p>
<p class="MsoNormal">+        &tempString<o:p></o:p></p>
<p class="MsoNormal">+        );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(tempString.Buffer == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    if(ntStatus != STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        switch (ntStatus)<o:p></o:p></p>
<p class="MsoNormal">+        {<o:p></o:p></p>
<p class="MsoNormal">+            case STATUS_OBJECT_NAME_NOT_FOUND:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU,  "Resitry string failed to read: Suffix =  %S, Name = %S not found\n",pszSuffix, pszValueName);<o:p></o:p></p>
<p class="MsoNormal">+                break;                <o:p></o:p></p>
<p class="MsoNormal">+            default:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU,  "Resitry string failed to read with NTSTATUS 0x%X\n",ntStatus);<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        return ntStatus;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU,  "Read string value from registry: %S\n", tempString.Buffer);<o:p></o:p></p>
<p class="MsoNormal">+    const ULONG c_NdisStringMaxLength = tempString.MaximumLength;<o:p></o:p></p>
<p class="MsoNormal">+    pWcharTemp = new UCHAR[c_NdisStringMaxLength];<o:p></o:p></p>
<p class="MsoNormal">+    if (NULL == pWcharTemp)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        // Allocaton failed<o:p></o:p></p>
<p class="MsoNormal">+        //<o:p></o:p></p>
<p class="MsoNormal">+        RtlFreeUnicodeString(&tempString);<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    RtlCopyMemory(pWcharTemp,tempString.Buffer, c_NdisStringMaxLength);<o:p></o:p></p>
<p class="MsoNormal">+    *pWstr = (LPWSTR)pWcharTemp;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    RtlFreeUnicodeString(&tempString);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS ReadRegistryValue(<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG DefaultValueType,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID DefaultVal,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG DefaultValLength,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG Flags,<o:p></o:p></p>
<p class="MsoNormal">+    OUT PVOID pVal<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS    status;<o:p></o:p></p>
<p class="MsoNormal">+    /* Remember the terminating entry in the table below. */<o:p></o:p></p>
<p class="MsoNormal">+    RTL_QUERY_REGISTRY_TABLE    table[2];<o:p></o:p></p>
<p class="MsoNormal">+    UNICODE_STRING              ParamPath;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != pszRegistryPath);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != pszValueName);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != pVal);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    USHORT suffixLength = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (NULL != pszSuffix)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        suffixLength = (USHORT)wcslen(pszSuffix) ;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    RtlInitUnicodeString( &ParamPath, NULL );<o:p></o:p></p>
<p class="MsoNormal">+    USHORT length = (USHORT)wcslen(pszRegistryPath) + suffixLength + 1;<o:p></o:p></p>
<p class="MsoNormal">+    ParamPath.Length = (length -1) * sizeof(WCHAR);       // length in bytes, of the Buffer, not including the terminating NULL character<o:p></o:p></p>
<p class="MsoNormal">+    ParamPath.MaximumLength = length * sizeof(WCHAR);     // total size in bytes, of memory allocated for Buffer<o:p></o:p></p>
<p class="MsoNormal">+    ParamPath.Buffer = new WCHAR[length];    <o:p></o:p></p>
<p class="MsoNormal">+    if( !ParamPath.Buffer ) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    RtlStringCchCopyW(ParamPath.Buffer, length, pszRegistryPath);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if (NULL != pszSuffix)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        #pragma prefast(suppress:6053, "The ParamPath.Buffer is preallocated to the required length, and the assert checks for this assumption")<o:p></o:p></p>
<p class="MsoNormal">+        RtlStringCchCatW(ParamPath.Buffer, length, pszSuffix);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    //Clear the table.  This clears all the query callback pointers,<o:p></o:p></p>
<p class="MsoNormal">+    // and sets up the terminating table entry.<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    memset(table, 0, sizeof(table));<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    // Setup the table entries. <o:p></o:p></p>
<p class="MsoNormal">+    //<o:p></o:p></p>
<p class="MsoNormal">+    table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | Flags;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].Name = const_cast <LPWSTR>(pszValueName);<o:p></o:p></p>
<p class="MsoNormal">+    table[0].EntryContext = pVal;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].DefaultType = DefaultValueType;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].DefaultData = DefaultVal;<o:p></o:p></p>
<p class="MsoNormal">+    table[0].DefaultLength = DefaultValLength;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, ParamPath.Buffer, table, NULL, NULL );<o:p></o:p></p>
<p class="MsoNormal">+    if (!NT_SUCCESS(status) && DefaultVal != NULL) <o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_WARNING, GU, "RtlQueryRegistryValues failed to read %S\\%S. status =0x%x. Use deafault value.\n", ParamPath.Buffer, table[0].Name, status);<o:p></o:p></p>
<p class="MsoNormal">+        RtlCopyMemory(pVal, DefaultVal, DefaultValLength);<o:p></o:p></p>
<p class="MsoNormal">+        status = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(TRACE_LEVEL_INFORMATION, GU, " status 0x%x, path %S, name %S \n", status, ParamPath.Buffer, table[0].Name);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    delete [] ParamPath.Buffer;    <o:p></o:p></p>
<p class="MsoNormal">+    return status;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+DbgPrintMacAddress(<o:p></o:p></p>
<p class="MsoNormal">+    LPCSTR str_description, <o:p></o:p></p>
<p class="MsoNormal">+    u8 macAddress[],<o:p></o:p></p>
<p class="MsoNormal">+    unsigned int traceLevel<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != macAddress);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != str_description);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(traceLevel, GU, <o:p></o:p></p>
<p class="MsoNormal">+                        "%s%.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",<o:p></o:p></p>
<p class="MsoNormal">+                        str_description,<o:p></o:p></p>
<p class="MsoNormal">+                        macAddress[0], macAddress[1],macAddress[2],<o:p></o:p></p>
<p class="MsoNormal">+                        macAddress[3],macAddress[4],macAddress[5]<o:p></o:p></p>
<p class="MsoNormal">+                        );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+DbgPrintIpAddress(<o:p></o:p></p>
<p class="MsoNormal">+    LPCSTR str_description,<o:p></o:p></p>
<p class="MsoNormal">+    u8 ipAddress[],<o:p></o:p></p>
<p class="MsoNormal">+    unsigned int traceLevel<o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != ipAddress);<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != str_description);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    GU_PRINT(traceLevel, GU, <o:p></o:p></p>
<p class="MsoNormal">+                        "%s%d.%d.%d.%d\n",<o:p></o:p></p>
<p class="MsoNormal">+                        str_description,<o:p></o:p></p>
<p class="MsoNormal">+                        ipAddress[0], ipAddress[1],ipAddress[2],ipAddress[3]<o:p></o:p></p>
<p class="MsoNormal">+                        );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+bool<o:p></o:p></p>
<p class="MsoNormal">+Validate16bitValue(<o:p></o:p></p>
<p class="MsoNormal">+    __be16  be16_currentValue,<o:p></o:p></p>
<p class="MsoNormal">+    u16 expectedValue,<o:p></o:p></p>
<p class="MsoNormal">+    LPCSTR valueName)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != valueName);<o:p></o:p></p>
<p class="MsoNormal">+    u16 valueByHardwareBytesOrder = be16_to_cpu(be16_currentValue);<o:p></o:p></p>
<p class="MsoNormal">+    if (valueByHardwareBytesOrder != expectedValue)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_VERBOSE, GU, <o:p></o:p></p>
<p class="MsoNormal">+            "ARP detection: %s field; Expected Value = %0xX, current Value = %0xX\n",<o:p></o:p></p>
<p class="MsoNormal">+            valueName,expectedValue,valueByHardwareBytesOrder<o:p></o:p></p>
<p class="MsoNormal">+            );<o:p></o:p></p>
<p class="MsoNormal">+        return false;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return true;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+bool<o:p></o:p></p>
<p class="MsoNormal">+Validate8BitValue(<o:p></o:p></p>
<p class="MsoNormal">+    u8 value,<o:p></o:p></p>
<p class="MsoNormal">+    u8 expectedValue,<o:p></o:p></p>
<p class="MsoNormal">+    LPCSTR valueName)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(NULL != valueName);<o:p></o:p></p>
<p class="MsoNormal">+    if (value != expectedValue)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_VERBOSE, GU, <o:p></o:p></p>
<p class="MsoNormal">+            "ARP detection: %s field; Expected Value = %0xX, current Value = %0xX\n",<o:p></o:p></p>
<p class="MsoNormal">+            valueName,expectedValue,value<o:p></o:p></p>
<p class="MsoNormal">+            );<o:p></o:p></p>
<p class="MsoNormal">+        return false;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return true;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void guid_to_str(u64 guid, WCHAR * pWstr, DWORD BufLen)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    PUCHAR pGuid = (UCHAR*)&guid;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    char temp[BUFFER_SIZE] = {0};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    HRESULT hr = StringCbPrintf(temp, BUFFER_SIZE , "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[7],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[6],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[5],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[4],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[3],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[2],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[1],<o:p></o:p></p>
<p class="MsoNormal">+                                                    pGuid[0]<o:p></o:p></p>
<p class="MsoNormal">+                                                    );<o:p></o:p></p>
<p class="MsoNormal">+    if (!SUCCEEDED(hr))<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(false);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    mbstowcs(pWstr, temp, BUFFER_SIZE);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+template <class T><o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS  FIFO<T>::Init(int MaxSize) {<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(m_pData == NULL);<o:p></o:p></p>
<p class="MsoNormal">+    m_pData = new VOID *[MaxSize];<o:p></o:p></p>
<p class="MsoNormal">+    if (m_pData == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU,"new failed\n");<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_NO_MEMORY;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    m_Head = m_Tail = 0;<o:p></o:p></p>
<p class="MsoNormal">+    m_Size = MaxSize;<o:p></o:p></p>
<p class="MsoNormal">+    m_Count = 0;<o:p></o:p></p>
<p class="MsoNormal">+    return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// This is needed in order to force the compiler to create the function 
<o:p></o:p></p>
<p class="MsoNormal">+void FIFO_DUMMY_FUNCTION(){<o:p></o:p></p>
<p class="MsoNormal">+    FIFO <VOID *> m_DataToSend;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    m_DataToSend.Init(5);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+///////////////////////////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+// Tracer Class                                                              //<o:p></o:p></p>
<p class="MsoNormal">+///////////////////////////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID Tracer::Init() {<o:p></o:p></p>
<p class="MsoNormal">+    m_CurrentLocation = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID Tracer::AddEvent(EventType Event, int ExtraData) {<o:p></o:p></p>
<p class="MsoNormal">+    if (m_CurrentLocation >= MAX_EVENTS) {<o:p></o:p></p>
<p class="MsoNormal">+        return;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    int Location = m_CurrentLocation++;<o:p></o:p></p>
<p class="MsoNormal">+    if ((Location > 0) && ( Event == PROCESS_RX_INTERNAL_START)) {<o:p></o:p></p>
<p class="MsoNormal">+        if (m_data[Location-1].Event == PROCESS_RX_INTERNAL_START) {<o:p></o:p></p>
<p class="MsoNormal">+            ExtraData = 0;<o:p></o:p></p>
<p class="MsoNormal">+            Event = PROCESS_RX_INTERNAL_START_SKIPING;<o:p></o:p></p>
<p class="MsoNormal">+        } else if (m_data[Location-1].Event == PROCESS_RX_INTERNAL_START_SKIPING) {<o:p></o:p></p>
<p class="MsoNormal">+        Location--;<o:p></o:p></p>
<p class="MsoNormal">+            ExtraData = m_data[Location].ExtraData+1;<o:p></o:p></p>
<p class="MsoNormal">+            Event = PROCESS_RX_INTERNAL_START_SKIPING;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    m_data[Location].TimeStamp = GetTimeStamp();<o:p></o:p></p>
<p class="MsoNormal">+    m_data[Location].Event = Event;<o:p></o:p></p>
<p class="MsoNormal">+    m_data[Location].ExtraData = ExtraData;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void Tracer::Printxx() {<o:p></o:p></p>
<p class="MsoNormal">+    int i;<o:p></o:p></p>
<p class="MsoNormal">+    for(i=0; i < m_CurrentLocation; i++) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR, GU, "Time = %I64d: ", m_data[i].TimeStamp / 1000);<o:p></o:p></p>
<p class="MsoNormal">+        switch(m_data[i].Event) {<o:p></o:p></p>
<p class="MsoNormal">+            case PROCESS_RX_START:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "PROCESS_RX_START\n");<o:p></o:p></p>
<p class="MsoNormal">+                break;<o:p></o:p></p>
<p class="MsoNormal">+            case PROCESS_RX_END:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "PROCESS_RX_END handeled %d packets\n", m_data[i].ExtraData);<o:p></o:p></p>
<p class="MsoNormal">+                break;<o:p></o:p></p>
<p class="MsoNormal">+            case PROCESS_RX_INTERNAL_START:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "PROCESS_RX_INTERNAL_START\n");<o:p></o:p></p>
<p class="MsoNormal">+                break;<o:p></o:p></p>
<p class="MsoNormal">+            case PROCESS_RX_INTERNAL_START_SKIPING:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "PROCESS_RX_INTERNAL_START_SKIPING pooled %d times\n", m_data[i].ExtraData);<o:p></o:p></p>
<p class="MsoNormal">+                break;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+            case MP_PORT_SEND_PACKETS:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "MP_PORT_SEND_PACKETS \n");<o:p></o:p></p>
<p class="MsoNormal">+                break;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+            case COMPLEATD_INDICATING:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "COMPLEATD_INDICATING handeled %d packets\n", m_data[i].ExtraData);<o:p></o:p></p>
<p class="MsoNormal">+                break;<o:p></o:p></p>
<p class="MsoNormal">+            default:<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_ERROR, GU, "iligal event %d\n", m_data[i].Event);<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    m_CurrentLocation = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+USHORT ntohs(USHORT in)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return ((in & 0xff) << 8) | ((in & 0xff00) >> 8);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// BUGBUG: Understand how to reomove the 20 from the code.<o:p></o:p></p>
<p class="MsoNormal">+// This function is a wrapper for the KeWaitForSingleObject that adds<o:p></o:p></p>
<p class="MsoNormal">+// assertsions to the valuas returned by it<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS <o:p></o:p></p>
<p class="MsoNormal">+  MyKeWaitForSingleObject(<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  Object,<o:p></o:p></p>
<p class="MsoNormal">+    IN KWAIT_REASON  WaitReason,<o:p></o:p></p>
<p class="MsoNormal">+    IN KPROCESSOR_MODE  WaitMode,<o:p></o:p></p>
<p class="MsoNormal">+    IN BOOLEAN  Alertable,<o:p></o:p></p>
<p class="MsoNormal">+    IN PLARGE_INTEGER  Timeout  OPTIONAL,<o:p></o:p></p>
<p class="MsoNormal">+    IN BOOLEAN ExceptApc    <o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS rc = STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    int i;<o:p></o:p></p>
<p class="MsoNormal">+    for (i=0; i < 20; i++) {<o:p></o:p></p>
<p class="MsoNormal">+        rc = KeWaitForSingleObject(<o:p></o:p></p>
<p class="MsoNormal">+                Object,<o:p></o:p></p>
<p class="MsoNormal">+                WaitReason,<o:p></o:p></p>
<p class="MsoNormal">+                WaitMode,<o:p></o:p></p>
<p class="MsoNormal">+                Alertable,<o:p></o:p></p>
<p class="MsoNormal">+                Timeout<o:p></o:p></p>
<p class="MsoNormal">+        );<o:p></o:p></p>
<p class="MsoNormal">+        if (!NT_SUCCESS(rc)) {<o:p></o:p></p>
<p class="MsoNormal">+            ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+            GU_PRINT(TRACE_LEVEL_ERROR ,GU ,"KeWaitForSingleObject failed rc = 0x%x\n", rc );<o:p></o:p></p>
<p class="MsoNormal">+            // No meter what we do the program can't continue, let's crush it<o:p></o:p></p>
<p class="MsoNormal">+            int *i = NULL;<o:p></o:p></p>
<p class="MsoNormal">+            *i = 5;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT((rc == STATUS_SUCCESS ) ||<o:p></o:p></p>
<p class="MsoNormal">+               (rc == STATUS_ALERTED  ) ||<o:p></o:p></p>
<p class="MsoNormal">+               (rc == STATUS_USER_APC  ) ||<o:p></o:p></p>
<p class="MsoNormal">+               (rc == STATUS_TIMEOUT  )); // This are simply all the return code from DDK<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+        ASSERT( (Timeout != NULL ) || rc != STATUS_TIMEOUT);<o:p></o:p></p>
<p class="MsoNormal">+        if (rc != STATUS_USER_APC) {<o:p></o:p></p>
<p class="MsoNormal">+            break;<o:p></o:p></p>
<p class="MsoNormal">+        } else {<o:p></o:p></p>
<p class="MsoNormal">+            // Currently we only expect to have an APC from the user threads call back<o:p></o:p></p>
<p class="MsoNormal">+            if (ExceptApc == FALSE) {<o:p></o:p></p>
<p class="MsoNormal">+                GU_PRINT(TRACE_LEVEL_WARNING ,GU ,("KeWaitForSingleObject was stoped because of STATUS_USER_APC\n" ));<o:p></o:p></p>
<p class="MsoNormal">+                ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+            } else {<o:p></o:p></p>
<p class="MsoNormal">+                break;                <o:p></o:p></p>
<p class="MsoNormal">+            }<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    if (i == 20) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR ,GU ,("!!!! KeWaitForSingleObject was Exhausted STATUS_USER_APC\n" ));<o:p></o:p></p>
<p class="MsoNormal">+        // This is probably fine if we are runnign for a user thread<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT((WaitReason == UserRequest) && (WaitMode == UserMode));<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return rc;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int ExceptionFilter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {<o:p></o:p></p>
<p class="MsoNormal">+    // This filter currently only allows us to check the error, before we contiue<o:p></o:p></p>
<p class="MsoNormal">+    ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+    return EXCEPTION_EXECUTE_HANDLER;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS<o:p></o:p></p>
<p class="MsoNormal">+CopyFromUser(<o:p></o:p></p>
<p class="MsoNormal">+    IN  void* const         p_dest,<o:p></o:p></p>
<p class="MsoNormal">+    IN  const void* const   p_src,<o:p></o:p></p>
<p class="MsoNormal">+    IN  const size_t        count )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    /*<o:p></o:p></p>
<p class="MsoNormal">+     * The memory copy must be done within a try/except block as the<o:p></o:p></p>
<p class="MsoNormal">+     * memory could be changing while the buffer is copied.<o:p></o:p></p>
<p class="MsoNormal">+     */<o:p></o:p></p>
<p class="MsoNormal">+    __try<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ProbeForRead( (void*)p_src, count, 1 );<o:p></o:p></p>
<p class="MsoNormal">+#ifdef DONT_COPY_DATA        <o:p></o:p></p>
<p class="MsoNormal">+        if (count < 1000){<o:p></o:p></p>
<p class="MsoNormal">+            RtlCopyMemory( p_dest, p_src, count );<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+        RtlCopyMemory( p_dest, p_src, count );<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    __except(ExceptionFilter(GetExceptionCode(), GetExceptionInformation())) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR ,GU ,("copying memory from user failed\n"));<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_ACCESS_DENIED;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS<o:p></o:p></p>
<p class="MsoNormal">+CopyToUser(<o:p></o:p></p>
<p class="MsoNormal">+    IN  void* const         p_dest,<o:p></o:p></p>
<p class="MsoNormal">+    IN  const void* const   p_src,<o:p></o:p></p>
<p class="MsoNormal">+    IN  const size_t        count <o:p></o:p></p>
<p class="MsoNormal">+    )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    /*<o:p></o:p></p>
<p class="MsoNormal">+     * The memory copy must be done within a try/except block as the<o:p></o:p></p>
<p class="MsoNormal">+     * memory could be changing while the buffer is copied.<o:p></o:p></p>
<p class="MsoNormal">+     */<o:p></o:p></p>
<p class="MsoNormal">+    __try<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ProbeForWrite( p_dest, count, 1 );<o:p></o:p></p>
<p class="MsoNormal">+#ifdef DONT_COPY_DATA        <o:p></o:p></p>
<p class="MsoNormal">+        if (count < 1000){<o:p></o:p></p>
<p class="MsoNormal">+            RtlCopyMemory( p_dest, p_src, count );<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+        RtlCopyMemory( p_dest, p_src, count );<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    __except(ExceptionFilter(GetExceptionCode(), GetExceptionInformation())) {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR ,GU ,("copying memory to user failed\n"));<o:p></o:p></p>
<p class="MsoNormal">+        return STATUS_ACCESS_DENIED;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID * MapUserMemory(<o:p></o:p></p>
<p class="MsoNormal">+    IN     PVOID Address, <o:p></o:p></p>
<p class="MsoNormal">+    IN     ULONG size,<o:p></o:p></p>
<p class="MsoNormal">+    OUT PMDL *ppMdl<o:p></o:p></p>
<p class="MsoNormal">+    ) {<o:p></o:p></p>
<p class="MsoNormal">+    // Create the MDL:<o:p></o:p></p>
<p class="MsoNormal">+    PMDL pMdl = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    PVOID pKernelAddress;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    // Probe here for write<o:p></o:p></p>
<p class="MsoNormal">+    __try<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        ProbeForWrite( Address, size, 1 );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+        pMdl = IoAllocateMdl(Address, size, FALSE, FALSE, NULL);<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(pMdl != NULL);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    __except(EXCEPTION_EXECUTE_HANDLER)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        GU_PRINT(TRACE_LEVEL_ERROR ,GU ,("copying memory to user failed\n"));<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(FALSE);        <o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    if (pMdl == NULL) {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    __try {<o:p></o:p></p>
<p class="MsoNormal">+        MmProbeAndLockPages(pMdl, KernelMode , IoModifyAccess );<o:p></o:p></p>
<p class="MsoNormal">+    } __except(EXCEPTION_EXECUTE_HANDLER) {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        IoFreeMdl(pMdl);<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    pKernelAddress = MmMapLockedPagesSpecifyCache(<o:p></o:p></p>
<p class="MsoNormal">+        pMdl,<o:p></o:p></p>
<p class="MsoNormal">+        KernelMode,<o:p></o:p></p>
<p class="MsoNormal">+        MmCached , //??????????????<o:p></o:p></p>
<p class="MsoNormal">+        NULL,<o:p></o:p></p>
<p class="MsoNormal">+        FALSE,<o:p></o:p></p>
<p class="MsoNormal">+        LowPagePriority <o:p></o:p></p>
<p class="MsoNormal">+        );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    // Copy the output data<o:p></o:p></p>
<p class="MsoNormal">+    *ppMdl = pMdl;<o:p></o:p></p>
<p class="MsoNormal">+    return pKernelAddress;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID UnMapMemory(<o:p></o:p></p>
<p class="MsoNormal">+    IN  VOID *pKernelAddress,<o:p></o:p></p>
<p class="MsoNormal">+    IN PMDL pMdl)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    MmUnmapLockedPages(pKernelAddress, pMdl);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    MmUnlockPages(pMdl);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    IoFreeMdl(pMdl);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID UpdateRc(NTSTATUS *rc, NTSTATUS rc1)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    // We want to keep the first errro<o:p></o:p></p>
<p class="MsoNormal">+    if (NT_SUCCESS(*rc)) {<o:p></o:p></p>
<p class="MsoNormal">+        *rc = rc1;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/kernel/makefile<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/kernel/makefile   (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/kernel/makefile                (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,7 @@<o:p></o:p></p>
<p class="MsoNormal">+#<o:p></o:p></p>
<p class="MsoNormal">+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source<o:p></o:p></p>
<p class="MsoNormal">+# file to this component.  This file merely indirects to the real make file<o:p></o:p></p>
<p class="MsoNormal">+# that is shared by all the driver components of the Windows NT DDK<o:p></o:p></p>
<p class="MsoNormal">+#<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+!INCLUDE $(NTMAKEENV)\makefile.def<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/core/genutils/dirs<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/core/genutils/dirs             (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/core/genutils/dirs          (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,3 @@<o:p></o:p></p>
<p class="MsoNormal">+DIRS=\<o:p></o:p></p>
<p class="MsoNormal">+             kernel                   \<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_pcipool.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_pcipool.h     (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_pcipool.h  (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,102 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef struct pci_pool {<o:p></o:p></p>
<p class="MsoNormal">+             size_t                                                                    size;<o:p></o:p></p>
<p class="MsoNormal">+             struct mlx4_dev               *                             mdev;<o:p></o:p></p>
<p class="MsoNormal">+             char                                                                       name [32];<o:p></o:p></p>
<p class="MsoNormal">+             NPAGED_LOOKASIDE_LIST          pool_hdr;<o:p></o:p></p>
<p class="MsoNormal">+} pci_pool_t;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+// taken from dmapool.c<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* pci_pool_create - Creates a pool of consistent memory blocks, for dma.<o:p></o:p></p>
<p class="MsoNormal">+* @name: name of pool, for diagnostics<o:p></o:p></p>
<p class="MsoNormal">+* @mdev: device that will be doing the DMA<o:p></o:p></p>
<p class="MsoNormal">+* @size: size of the blocks in this pool.<o:p></o:p></p>
<p class="MsoNormal">+* @align: alignment requirement for blocks; must be a power of two<o:p></o:p></p>
<p class="MsoNormal">+* @allocation: returned blocks won't cross this boundary (or zero)<o:p></o:p></p>
<p class="MsoNormal">+* Context: !in_interrupt()<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* Returns a dma allocation pool with the requested characteristics, or<o:p></o:p></p>
<p class="MsoNormal">+* null if one can't be created.  Given one of these pools, dma_pool_alloc()<o:p></o:p></p>
<p class="MsoNormal">+* may be used to allocate memory.  Such memory will all have "consistent"<o:p></o:p></p>
<p class="MsoNormal">+* DMA mappings, accessible by the device and its driver without using<o:p></o:p></p>
<p class="MsoNormal">+* cache flushing primitives.  The actual size of blocks allocated may be<o:p></o:p></p>
<p class="MsoNormal">+* larger than requested because of alignment.<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* If allocation is nonzero, objects returned from dma_pool_alloc() won't<o:p></o:p></p>
<p class="MsoNormal">+ * cross that size boundary.  This is useful for devices which have<o:p></o:p></p>
<p class="MsoNormal">+ * addressing restrictions on individual DMA transfers, such as not crossing<o:p></o:p></p>
<p class="MsoNormal">+ * boundaries of 4KBytes.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+ <o:p></o:p></p>
<p class="MsoNormal">+pci_pool_t *<o:p></o:p></p>
<p class="MsoNormal">+pci_pool_create (const char *name, struct pci_dev *pdev,<o:p></o:p></p>
<p class="MsoNormal">+        size_t size, size_t align, size_t allocation);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * dma_pool_alloc - get a block of consistent memory<o:p></o:p></p>
<p class="MsoNormal">+ * @pool: dma pool that will produce the block<o:p></o:p></p>
<p class="MsoNormal">+ * @mem_flags: GFP_* bitmask<o:p></o:p></p>
<p class="MsoNormal">+ * @handle: pointer to dma address of block<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This returns the kernel virtual address of a currently unused block,<o:p></o:p></p>
<p class="MsoNormal">+ * and reports its dma address through the handle.<o:p></o:p></p>
<p class="MsoNormal">+ * If such a memory block can't be allocated, null is returned.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+static inline void * <o:p></o:p></p>
<p class="MsoNormal">+pci_pool_alloc (pci_pool_t *pool, int mem_flags, dma_addr_t *handle)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             PHYSICAL_ADDRESS pa;<o:p></o:p></p>
<p class="MsoNormal">+             void * ptr;<o:p></o:p></p>
<p class="MsoNormal">+             UNREFERENCED_PARAMETER(mem_flags);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ptr = ExAllocateFromNPagedLookasideList( &pool->pool_hdr );<o:p></o:p></p>
<p class="MsoNormal">+             if (ptr != NULL) {<o:p></o:p></p>
<p class="MsoNormal">+                             pa = MmGetPhysicalAddress( ptr );<o:p></o:p></p>
<p class="MsoNormal">+                             // TODO: convert physical adress to dma one
<o:p></o:p></p>
<p class="MsoNormal">+                             handle->da = pa.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">+                             handle->va = ptr;<o:p></o:p></p>
<p class="MsoNormal">+                             handle->sz = 0; /* not known here */<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return ptr; <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* dma_pool_free - put block back into dma pool<o:p></o:p></p>
<p class="MsoNormal">+* @pool: the dma pool holding the block<o:p></o:p></p>
<p class="MsoNormal">+* @vaddr: virtual address of block<o:p></o:p></p>
<p class="MsoNormal">+* @dma: dma address of block<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* Caller promises neither device nor driver will again touch this block<o:p></o:p></p>
<p class="MsoNormal">+* unless it is first re-allocated.<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static inline       void<o:p></o:p></p>
<p class="MsoNormal">+pci_pool_free (pci_pool_t *pool, void *vaddr, dma_addr_t dma)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNREFERENCED_PARAMETER(dma);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             ExFreeToNPagedLookasideList( &pool->pool_hdr, vaddr );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+ * pci_pool_destroy - destroys a pool of dma memory blocks.<o:p></o:p></p>
<p class="MsoNormal">+ * @pool: dma pool that will be destroyed<o:p></o:p></p>
<p class="MsoNormal">+ * Context: !in_interrupt()<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * Caller guarantees that no more memory from the pool is in use,<o:p></o:p></p>
<p class="MsoNormal">+ * and that nothing will try to use the pool after this call.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+static inline       void<o:p></o:p></p>
<p class="MsoNormal">+pci_pool_destroy (pci_pool_t *pool)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ExDeleteNPagedLookasideList( &pool->pool_hdr );<o:p></o:p></p>
<p class="MsoNormal">+             ExFreePool( pool);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_radix.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_radix.h          (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_radix.h       (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,26 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_map.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct radix_tree_root {<o:p></o:p></p>
<p class="MsoNormal">+             cl_map_t             map;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int radix_tree_insert(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">+             unsigned long index, void *item);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *radix_tree_lookup(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">+             unsigned long index);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *radix_tree_delete(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">+             unsigned long index);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+cl_status_t radix_tree_create(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">+             gfp_t gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void radix_tree_destroy(struct radix_tree_root *root );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define INIT_RADIX_TREE(root, mask)               radix_tree_create(root, mask)<o:p></o:p></p>
<p class="MsoNormal">+#define RMV_RADIX_TREE(root)                           radix_tree_destroy(root)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_memory.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_memory.h  (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_memory.h               (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,406 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "iobuf.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "complib\cl_debug.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "complib\cl_memory.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// CONSTANTS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define MT_TAG_ATOMIC                       'MOTA'<o:p></o:p></p>
<p class="MsoNormal">+#define MT_TAG_KERNEL                        'LNRK'<o:p></o:p></p>
<p class="MsoNormal">+#define MT_TAG_HIGH                                             'HGIH'<o:p></o:p></p>
<p class="MsoNormal">+#define MT_TAG_PCIPOOL                      'PICP'<o:p></o:p></p>
<p class="MsoNormal">+#define MT_TAG_IOMAP                         'PAMI'<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// SUBSTITUTIONS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// MACROS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define PAGE_MASK                                                                                  (~(PAGE_SIZE-1))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ ////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+ //<o:p></o:p></p>
<p class="MsoNormal">+ // Helper functions<o:p></o:p></p>
<p class="MsoNormal">+ //<o:p></o:p></p>
<p class="MsoNormal">+ ////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// returns log of number of pages, i.e<o:p></o:p></p>
<p class="MsoNormal">+// for size <= 4096 ==> 0<o:p></o:p></p>
<p class="MsoNormal">+// for size <= 8192 ==> 1<o:p></o:p></p>
<p class="MsoNormal">+static inline int get_order(unsigned long size)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int order;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             size = (size-1) >> (PAGE_SHIFT-1);<o:p></o:p></p>
<p class="MsoNormal">+             order = -1;<o:p></o:p></p>
<p class="MsoNormal">+             do {<o:p></o:p></p>
<p class="MsoNormal">+                             size >>= 1;<o:p></o:p></p>
<p class="MsoNormal">+                             order++;<o:p></o:p></p>
<p class="MsoNormal">+             } while (size);<o:p></o:p></p>
<p class="MsoNormal">+             return order;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// SYSTEM MEMORY<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef enum _gfp {<o:p></o:p></p>
<p class="MsoNormal">+             __GFP_NOWARN                            = 0,         /* Suppress page allocation failure warning */<o:p></o:p></p>
<p class="MsoNormal">+             __GFP_HIGHMEM                          = 0,         /* high memory */<o:p></o:p></p>
<p class="MsoNormal">+             GFP_ATOMIC                                    = 1,         /* can't wait (i.e. DPC or higher) */<o:p></o:p></p>
<p class="MsoNormal">+             GFP_KERNEL                                      = 2,         /* can wait (npaged) */<o:p></o:p></p>
<p class="MsoNormal">+             GFP_HIGHUSER                                = 4          /* GFP_KERNEL, that can be in HIGH memory */<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+gfp_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct vm_area_struct {<o:p></o:p></p>
<p class="MsoNormal">+             void *    ptr;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void * kmalloc( SIZE_T bsize, gfp_t gfp_mask)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             void *ptr;<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(bsize);<o:p></o:p></p>
<p class="MsoNormal">+             switch (gfp_mask) {<o:p></o:p></p>
<p class="MsoNormal">+                             case GFP_ATOMIC:<o:p></o:p></p>
<p class="MsoNormal">+                                             ptr = ExAllocatePoolWithTag( NonPagedPool, bsize, MT_TAG_ATOMIC );<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+                             case GFP_KERNEL:<o:p></o:p></p>
<p class="MsoNormal">+                                             ptr = ExAllocatePoolWithTag( NonPagedPool, bsize, MT_TAG_KERNEL );<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+                             case GFP_HIGHUSER:<o:p></o:p></p>
<p class="MsoNormal">+                                             ptr = ExAllocatePoolWithTag( NonPagedPool, bsize, MT_TAG_HIGH );<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+                             default:<o:p></o:p></p>
<p class="MsoNormal">+                                             cl_dbg_out("kmalloc: unsupported flag %d\n", gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">+                                             ptr = NULL;<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return ptr;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void * kzalloc( SIZE_T bsize, gfp_t gfp_mask)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             void* va = kmalloc(bsize, gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">+             if (va)<o:p></o:p></p>
<p class="MsoNormal">+                             RtlZeroMemory(va, bsize);<o:p></o:p></p>
<p class="MsoNormal">+             return va;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void *kcalloc(size_t n, size_t size, gfp_t flags)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (n != 0 && size > ULONG_MAX / n)<o:p></o:p></p>
<p class="MsoNormal">+                             return NULL;<o:p></o:p></p>
<p class="MsoNormal">+             return kzalloc(n * size, flags);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void kfree (const void *pobj)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             if (pobj)<o:p></o:p></p>
<p class="MsoNormal">+                             ExFreePool((void *)pobj);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define vmalloc(size)         kmalloc(size, GFP_KERNEL)<o:p></o:p></p>
<p class="MsoNormal">+#define vfree                 kfree<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define get_zeroed_page(mask)                                          kzalloc(PAGE_SIZE, mask)<o:p></o:p></p>
<p class="MsoNormal">+#define free_page(ptr)                                                                              kfree(ptr)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// IO SPACE <==> SYSTEM MEMORY<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* ioremap     -   map bus memory into CPU space<o:p></o:p></p>
<p class="MsoNormal">+* @addr:      bus address of the memory<o:p></o:p></p>
<p class="MsoNormal">+* @size:      size of the resource to map<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* ioremap performs a platform specific sequence of operations to<o:p></o:p></p>
<p class="MsoNormal">+* make bus memory CPU accessible via the readb/readw/readl/writeb/<o:p></o:p></p>
<p class="MsoNormal">+* writew/writel functions and the other mmio helpers. The returned<o:p></o:p></p>
<p class="MsoNormal">+* address is not guaranteed to be usable directly as a virtual<o:p></o:p></p>
<p class="MsoNormal">+* address. <o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static inline       void *ioremap(io_addr_t addr, SIZE_T size, MEMORY_CACHING_TYPE cache_type)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             PHYSICAL_ADDRESS pa;<o:p></o:p></p>
<p class="MsoNormal">+             void *va;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             pa.QuadPart = addr;<o:p></o:p></p>
<p class="MsoNormal">+             va = MmMapIoSpace( pa, size, cache_type ); <o:p>
</o:p></p>
<p class="MsoNormal">+             return va;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void iounmap(void *va, SIZE_T size)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             MmUnmapIoSpace( va, size );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// DMA SUPPORT<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+enum dma_data_direction {<o:p></o:p></p>
<p class="MsoNormal">+             PCI_DMA_BIDIRECTIONAL = 0,<o:p></o:p></p>
<p class="MsoNormal">+             PCI_DMA_TODEVICE = 1,<o:p></o:p></p>
<p class="MsoNormal">+             PCI_DMA_FROMDEVICE = 2,<o:p></o:p></p>
<p class="MsoNormal">+    PCI_DMA_NONE = 3,<o:p></o:p></p>
<p class="MsoNormal">+             DMA_TO_DEVICE = PCI_DMA_TODEVICE,<o:p></o:p></p>
<p class="MsoNormal">+    DMA_FROM_DEVICE = PCI_DMA_FROMDEVICE,<o:p></o:p></p>
<p class="MsoNormal">+    DMA_BIDIRECTIONAL = PCI_DMA_BIDIRECTIONAL,<o:p></o:p></p>
<p class="MsoNormal">+    DMA_NONE = PCI_DMA_NONE,<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define dma_get_cache_alignment                     (int)KeGetRecommendedSharedDataAlignment<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// wrapper to DMA address<o:p></o:p></p>
<p class="MsoNormal">+typedef struct _dma_addr<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             // TODO: in some cases it is still physical address today<o:p></o:p></p>
<p class="MsoNormal">+             io_addr_t                                            da;                          /* logical (device) address */<o:p></o:p></p>
<p class="MsoNormal">+             void *                                                    va;                          /* kernel virtual address */<o:p></o:p></p>
<p class="MsoNormal">+             size_t                    sz;           /* buffer size */<o:p></o:p></p>
<p class="MsoNormal">+} dma_addr_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define lowmem_page_address(dma_addr)   ((dma_addr).va)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct mlx4_dev;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *alloc_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">+             IN                           unsigned long size,<o:p></o:p></p>
<p class="MsoNormal">+             OUT                       dma_addr_t*p_dma_addr);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void free_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">+             IN                           dma_addr_t*p_dma_addr);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// TODO: translate to DMA space - for now is not done anything<o:p></o:p></p>
<p class="MsoNormal">+static inline dma_addr_t pci_map_page(struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">+             dma_addr_t dma_addr, unsigned long offset, SIZE_T size, int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(offset);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             return dma_addr; <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline dma_addr_t <o:p></o:p></p>
<p class="MsoNormal">+alloc_pages( struct pci_dev *pdev, gfp_t gfp, int order )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             dma_addr_t dma_addr;<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(gfp);<o:p></o:p></p>
<p class="MsoNormal">+             alloc_cont_mem( pdev, PAGE_SIZE << order, &dma_addr );<o:p></o:p></p>
<p class="MsoNormal">+             return dma_addr;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define alloc_page(pdev, mask)                            alloc_pages(pdev, (mask), 0)<o:p></o:p></p>
<p class="MsoNormal">+#define __get_free_page(mask)                          kzalloc(PAGE_SIZE, mask)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void <o:p></o:p></p>
<p class="MsoNormal">+__free_pages( struct pci_dev *pdev, dma_addr_t dma_addr, int order )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(order);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT((PAGE_SIZE << order) == (int)dma_addr.sz);<o:p></o:p></p>
<p class="MsoNormal">+             free_cont_mem( pdev, &dma_addr );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define __free_page(pdev, dma_addr)             __free_pages(pdev, (dma_addr), 0)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int pci_dma_mapping_error(dma_addr_t dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return !dma_addr.sz;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void pci_unmap_page(struct pci_dev *pdev, <o:p>
</o:p></p>
<p class="MsoNormal">+             dma_addr_t dma_addr, SIZE_T size, int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(dma_addr);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+dma_sync_single( void *vdev, dma_addr_t dma_addr,<o:p></o:p></p>
<p class="MsoNormal">+             size_t size, int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(vdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(dma_addr);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+             // TODO: here is to be used FlushAdapterBuffers()<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct pci_dev;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void *<o:p></o:p></p>
<p class="MsoNormal">+dma_alloc_coherent( struct mlx4_dev **dev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">+             dma_addr_t *p_dma, gfp_t gfp );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void dma_free_coherent( struct mlx4_dev **dev, size_t size,
<o:p></o:p></p>
<p class="MsoNormal">+             void *vaddr, dma_addr_t dma_handle);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ void pci_free_consistent( struct pci_dev *pdev, size_t size,
<o:p></o:p></p>
<p class="MsoNormal">+             void *vaddr, dma_addr_t dma_handle);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline dma_addr_t pci_map_single(struct pci_dev *pdev, void *buf, size_t buf_size, int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             dma_addr_t dma;<o:p></o:p></p>
<p class="MsoNormal">+             PHYSICAL_ADDRESS pa;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             pa = MmGetPhysicalAddress(buf);<o:p></o:p></p>
<p class="MsoNormal">+             dma.da = pa.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">+             dma.va = buf;<o:p></o:p></p>
<p class="MsoNormal">+             dma.sz = buf_size;<o:p></o:p></p>
<p class="MsoNormal">+             return dma;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void pci_unmap_single(struct pci_dev *hwdev, u64 ba, size_t size,<o:p></o:p></p>
<p class="MsoNormal">+     int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(hwdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(ba);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// SG lists<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define sg_dma_addr(sg)                                                                         ((sg)->dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+#define sg_dma_address(sg)                                                  ((sg)->dma_addr.da)<o:p></o:p></p>
<p class="MsoNormal">+#define sg_dma_len(sg)                                                                            ((sg)->dma_addr.sz)<o:p></o:p></p>
<p class="MsoNormal">+#define sg_dma_address_inc(p_dma,val)         (p_dma)->da += val<o:p></o:p></p>
<p class="MsoNormal">+#define sg_page(sg)                                                                                    ((sg)->dma_addr)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct scatterlist {<o:p></o:p></p>
<p class="MsoNormal">+             dma_addr_t                                       dma_addr;          /* logical (device) address */<o:p></o:p></p>
<p class="MsoNormal">+             unsigned int                       offset;                  /* offset in the first page */<o:p></o:p></p>
<p class="MsoNormal">+             unsigned int                       length;                 
<o:p></o:p></p>
<p class="MsoNormal">+             PMDL                                                    p_mdl;                  /* MDL, if any (used for user space buffers) */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct sg_table {<o:p></o:p></p>
<p class="MsoNormal">+    struct scatterlist *sgl;        /* the list */<o:p></o:p></p>
<p class="MsoNormal">+    unsigned int nents;             /* number of mapped entries */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define offset_in_page(va)     ((ULONG)((ULONG_PTR)(va) & ~PAGE_MASK))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define sg_next(sg)     (sg)++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+* Loop over each sg element, following the pointer to a new list if necessary<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+#define for_each_sg(sglist, sg, nr, __i)        \<o:p></o:p></p>
<p class="MsoNormal">+        for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define scsi_for_each_sg(cmd, sg, nseg, __i)                    \<o:p></o:p></p>
<p class="MsoNormal">+                for_each_sg(scsi_sglist(cmd), sg, nseg, __i)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             memset(sgl, 0, sizeof(*sgl) * nents);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void sg_set_buf(struct scatterlist *sg, void *buf,<o:p></o:p></p>
<p class="MsoNormal">+             unsigned int buflen)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    PHYSICAL_ADDRESS pa = {0};<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+             sg->offset = offset_in_page(buf);<o:p></o:p></p>
<p class="MsoNormal">+    sg->length = buflen;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    pa = MmGetPhysicalAddress(buf);<o:p></o:p></p>
<p class="MsoNormal">+    sg->dma_addr.da = pa.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">+    sg->dma_addr.va = buf;<o:p></o:p></p>
<p class="MsoNormal">+    sg->dma_addr.sz = buflen;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void sg_set_page(struct scatterlist *sg, <o:p>
</o:p></p>
<p class="MsoNormal">+             dma_addr_t dma_addr, unsigned int len, unsigned int offset)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             sg->offset = offset;<o:p></o:p></p>
<p class="MsoNormal">+             sg->dma_addr = dma_addr;<o:p></o:p></p>
<p class="MsoNormal">+    sg->length = len;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void sg_init_one(struct scatterlist *sg, void *buf, unsigned int buflen)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             sg_init_table(sg, 1);<o:p></o:p></p>
<p class="MsoNormal">+             sg_set_buf(sg, buf, buflen);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* Returns: the number of unmapped sg elements */<o:p></o:p></p>
<p class="MsoNormal">+static inline int pci_map_sg(struct pci_dev *pdev, <o:p></o:p></p>
<p class="MsoNormal">+             struct scatterlist *sg, int nents, int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(sg);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+             return nents;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* Returns: the number of unmapped sg elements */<o:p></o:p></p>
<p class="MsoNormal">+static inline int pci_unmap_sg(struct pci_dev *pdev, <o:p></o:p></p>
<p class="MsoNormal">+             struct scatterlist *sg,      int nents, int direction)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(sg);<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">+             return nents;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* highmem mapping */<o:p></o:p></p>
<p class="MsoNormal">+enum km_type {<o:p></o:p></p>
<p class="MsoNormal">+    KM_BOUNCE_READ,<o:p></o:p></p>
<p class="MsoNormal">+    KM_SKB_SUNRPC_DATA,<o:p></o:p></p>
<p class="MsoNormal">+    KM_SKB_DATA_SOFTIRQ, <o:p></o:p></p>
<p class="MsoNormal">+    KM_USER0,<o:p></o:p></p>
<p class="MsoNormal">+    KM_USER1,<o:p></o:p></p>
<p class="MsoNormal">+    KM_BIO_SRC_IRQ,<o:p></o:p></p>
<p class="MsoNormal">+    KM_BIO_DST_IRQ,<o:p></o:p></p>
<p class="MsoNormal">+    KM_IRQ0,<o:p></o:p></p>
<p class="MsoNormal">+    KM_IRQ1,<o:p></o:p></p>
<p class="MsoNormal">+    KM_SOFTIRQ0,<o:p></o:p></p>
<p class="MsoNormal">+    KM_SOFTIRQ1,<o:p></o:p></p>
<p class="MsoNormal">+    KM_TYPE_NR<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_pci.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_pci.h              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_pci.h           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,86 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// ===========================================<o:p></o:p></p>
<p class="MsoNormal">+// LITERALS<o:p></o:p></p>
<p class="MsoNormal">+// ===========================================<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// ===========================================<o:p></o:p></p>
<p class="MsoNormal">+// TYPES<o:p></o:p></p>
<p class="MsoNormal">+// ===========================================<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// ===========================================<o:p></o:p></p>
<p class="MsoNormal">+// MACROS/FUNCTIONS<o:p></o:p></p>
<p class="MsoNormal">+// ===========================================<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define PCI_DEVFN(slot, func)                               ((((slot) & 0x1f) << 3) | ((func) & 0x07))<o:p></o:p></p>
<p class="MsoNormal">+#define PCI_SLOT(devfn)                                                          (((devfn) >> 3) & 0x1f)<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+#define PCI_FUNC(devfn)                                                        ((devfn) & 0x07)<o:p></o:p></span></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS pci_hca_reset( struct pci_dev *pdev);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* use shim to implement that */<o:p></o:p></p>
<p class="MsoNormal">+#define mlx4_reset(dev)                          pci_hca_reset(dev->pdev)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// get bar boundaries<o:p></o:p></p>
<p class="MsoNormal">+#define pci_resource_start(dev,bar_num)       ((dev)->bar[bar_num >> 1].phys)<o:p></o:p></p>
<p class="MsoNormal">+#define pci_resource_len(dev,bar_num)          ((dev)->bar[bar_num >> 1].size)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// i/o to registers<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline u64 readq(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: write atomic implementation of _IO_READ_QWORD and change mthca_doorbell.h<o:p></o:p></p>
<p class="MsoNormal">+             u64 val;<o:p></o:p></p>
<p class="MsoNormal">+             READ_REGISTER_BUFFER_ULONG((PULONG)(addr), (PULONG)&val, 2 );<o:p></o:p></p>
<p class="MsoNormal">+             return val;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline u32 readl(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return READ_REGISTER_ULONG((PULONG)(addr));<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline u16 reads(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return READ_REGISTER_USHORT((PUSHORT)(addr));<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline u8 readb(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return READ_REGISTER_UCHAR((PUCHAR)(addr));<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_readq                 readq<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_readl                  readl<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_reads                 reads<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_readb                 readb<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void writeq(unsigned __int64 val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: write atomic implementation of _IO_WRITE_QWORD and change mthca_doorbell.h<o:p></o:p></p>
<p class="MsoNormal">+             WRITE_REGISTER_BUFFER_ULONG( (PULONG)(addr), (PULONG)&val, 2 );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void writel(unsigned int val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             WRITE_REGISTER_ULONG((PULONG)(addr),val);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void writes(unsigned short val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             WRITE_REGISTER_USHORT((PUSHORT)(addr),val);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void writeb(unsigned char val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             WRITE_REGISTER_UCHAR((PUCHAR)(addr),val);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_writeq                               writeq<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_writel                 writel<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_writes                                writes<o:p></o:p></p>
<p class="MsoNormal">+#define __raw_writeb                               writeb<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_list.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_list.h              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_list.h           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,99 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// TYPES<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Use the type, defined in wdm.h<o:p></o:p></p>
<p class="MsoNormal">+#define list_head          _LIST_ENTRY<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// MACROS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Define and initialize a list header<o:p></o:p></p>
<p class="MsoNormal">+#define LIST_HEAD(name) \<o:p></o:p></p>
<p class="MsoNormal">+             struct list_head name = { &(name), &(name) }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Initialize a list header<o:p></o:p></p>
<p class="MsoNormal">+#define INIT_LIST_HEAD(ptr)                  InitializeListHead(ptr)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Get to the beginning of the struct for this list entry<o:p></o:p></p>
<p class="MsoNormal">+#define list_entry(ptr, type, member)                CONTAINING_RECORD(ptr, type, member)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Iterate over list of 'list_els' of given 'type'<o:p></o:p></p>
<p class="MsoNormal">+#define list_for_each_entry(list_el, head, member, type)                                        \<o:p></o:p></p>
<p class="MsoNormal">+             for ( list_el = list_entry((head)->Flink, type, member);                   \<o:p></o:p></p>
<p class="MsoNormal">+                             &list_el->member != (head);                                                                                                                                     \<o:p></o:p></p>
<p class="MsoNormal">+                             list_el = list_entry(list_el->member.Flink, type, member))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Iterate backwards over list of 'list_els' of given 'type'<o:p></o:p></p>
<p class="MsoNormal">+#define list_for_each_entry_reverse(list_el, head, member, type)      \<o:p></o:p></p>
<p class="MsoNormal">+             for (list_el = list_entry((head)->Blink, type, member);                                   \<o:p></o:p></p>
<p class="MsoNormal">+                             &list_el->member != (head);                                                                                                                                     \<o:p></o:p></p>
<p class="MsoNormal">+                             list_el = list_entry(list_el->member.Blink, type, member))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Iterate over list of given type safe against removal of list entry<o:p></o:p></p>
<p class="MsoNormal">+#define list_for_each_entry_safe(list_el, tmp_list_el, head, member,type, tmp_type)              \<o:p></o:p></p>
<p class="MsoNormal">+             for (list_el = list_entry((head)->Flink, type, member),                                                                                                    \<o:p></o:p></p>
<p class="MsoNormal">+                             tmp_list_el = list_entry(list_el->member.Flink, type, member);                                                                \<o:p></o:p></p>
<p class="MsoNormal">+                             &list_el->member != (head);                                                                                                                                                                                                    
 \<o:p></o:p></p>
<p class="MsoNormal">+                             list_el = tmp_list_el,                                                                                                                                                                                                                      
 \<o:p></o:p></p>
<p class="MsoNormal">+                             tmp_list_el = list_entry(tmp_list_el->member.Flink, tmp_type, member))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// FUNCTIONS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Insert a new entry after the specified head.<o:p></o:p></p>
<p class="MsoNormal">+static inline void list_add(struct list_head *new_entry, struct list_head *head)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             InsertHeadList( head, new_entry );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Insert a new entry before the specified head.<o:p></o:p></p>
<p class="MsoNormal">+static inline void list_add_tail(struct list_head *new_entry, struct list_head *head)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             InsertTailList( head, new_entry );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Deletes entry from list.<o:p></o:p></p>
<p class="MsoNormal">+static inline void list_del(struct list_head *entry)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             RemoveEntryList( entry );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Tests whether a list is empty<o:p></o:p></p>
<p class="MsoNormal">+static inline int list_empty(const struct list_head *head)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return IsListEmpty( head );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Insert src_list into dst_list and reinitialise the emptied src_list.<o:p></o:p></p>
<p class="MsoNormal">+static inline void list_splice_init(struct list_head *src_list,<o:p></o:p></p>
<p class="MsoNormal">+             struct list_head *dst_list)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (!list_empty(src_list)) {<o:p></o:p></p>
<p class="MsoNormal">+                             struct list_head *first = src_list->Flink;<o:p></o:p></p>
<p class="MsoNormal">+                             struct list_head *last = src_list->Blink;<o:p></o:p></p>
<p class="MsoNormal">+                             struct list_head *at = dst_list->Flink;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             first->Blink = dst_list;<o:p></o:p></p>
<p class="MsoNormal">+                             dst_list->Flink = first;<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             last->Flink = at;<o:p></o:p></p>
<p class="MsoNormal">+                             at->Blink = last;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             INIT_LIST_HEAD(src_list);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_sync.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_sync.h           (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_sync.h        (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,165 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// literals<o:p></o:p></p>
<p class="MsoNormal">+#ifndef LONG_MAX<o:p></o:p></p>
<p class="MsoNormal">+#define LONG_MAX      2147483647L   /* maximum (signed) long value */<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef ULONG_MAX<o:p></o:p></p>
<p class="MsoNormal">+#define ULONG_MAX 4294967295UL<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// mutex wrapper<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct mutex<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KMUTEX m;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DEFINE_MUTEX(a)                      struct mutex a<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void mutex_init( struct mutex * mutex )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KeInitializeMutex( &mutex->m, 0 );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void mutex_lock( struct mutex * mutex )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             NTSTATUS           status;<o:p></o:p></p>
<p class="MsoNormal">+             int                                           need_to_wait = 1;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             while (need_to_wait) {<o:p></o:p></p>
<p class="MsoNormal">+                             status = KeWaitForSingleObject( &mutex->m, Executive, KernelMode, FALSE,   NULL );<o:p></o:p></p>
<p class="MsoNormal">+                             if (status == STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void mutex_unlock( struct mutex * mutex )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             KeReleaseMutex( &mutex->m, FALSE );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// semaphore wrapper<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct semaphore<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KSEMAPHORE s;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void sema_init(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct semaphore *sem,<o:p></o:p></p>
<p class="MsoNormal">+             IN LONG  cnt)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             KeInitializeSemaphore( &sem->s, cnt, cnt );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void up( struct semaphore *sem )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             KeReleaseSemaphore( &sem->s, 0, 1, FALSE );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+static inline void down( struct semaphore *sem )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             NTSTATUS                           status;<o:p></o:p></p>
<p class="MsoNormal">+             int need_to_wait = 1;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             while (need_to_wait) {<o:p></o:p></p>
<p class="MsoNormal">+                             status = KeWaitForSingleObject( &sem->s, Executive, KernelMode, FALSE,  NULL );<o:p></o:p></p>
<p class="MsoNormal">+                             if (status == STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// completion wrapper<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct completion<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KEVENT                                event;<o:p></o:p></p>
<p class="MsoNormal">+             int                                           done;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void init_completion( struct completion * compl )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: ASSERT is temporary outcommented, because using of fast mutexes in CompLib<o:p></o:p></p>
<p class="MsoNormal">+             // cause working on APC_LEVEL<o:p></o:p></p>
<p class="MsoNormal">+             //ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);          
<o:p></o:p></p>
<p class="MsoNormal">+             KeInitializeEvent( &compl->event, NotificationEvent , FALSE );<o:p></o:p></p>
<p class="MsoNormal">+             compl->done = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int wait_for_completion_timeout( struct completion * compl, unsigned long timeout )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             LARGE_INTEGER interval;<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             interval.QuadPart = (-10)* (__int64)timeout;<o:p></o:p></p>
<p class="MsoNormal">+             return (int)KeWaitForSingleObject( &compl->event, Executive, KernelMode, FALSE,  &interval );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void wait_for_completion( struct completion * compl )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">+             int need_to_wait = 1;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             while (need_to_wait) {<o:p></o:p></p>
<p class="MsoNormal">+                             status = KeWaitForSingleObject( &compl->event, Executive, KernelMode, FALSE,  NULL );<o:p></o:p></p>
<p class="MsoNormal">+                             if (status == STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void complete( struct completion * compl )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             compl->done++;<o:p></o:p></p>
<p class="MsoNormal">+             KeSetEvent( &compl->event, 0, FALSE );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef USE_WDM_INTERRUPTS<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// IRQ wrapper<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void free_irq(struct mlx4_dev *dev);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int request_irq(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           struct mlx4_dev *            dev,                      
<o:p></o:p></p>
<p class="MsoNormal">+             IN                           PKSERVICE_ROUTINE     isr,                          /* ISR */<o:p></o:p></p>
<p class="MsoNormal">+             IN                           PVOID                                                   isr_ctx, /* ISR context */<o:p></o:p></p>
<p class="MsoNormal">+             IN                           PKMESSAGE_SERVICE_ROUTINE              misr,                      /* Message ISR */<o:p></o:p></p>
<p class="MsoNormal">+             OUT                       PKINTERRUPT                    *             int_obj                 /* interrupt object */<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// various<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// TODO: Is it enough to wait at DPC level ? <o:p></o:p></p>
<p class="MsoNormal">+// Maybe we need to use here KeSynchronizeExecution ?<o:p></o:p></p>
<p class="MsoNormal">+static inline void synchronize_irq(unsigned int irq)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(irq);<o:p></o:p></p>
<p class="MsoNormal">+             KeFlushQueuedDpcs();<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_bitmap.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_bitmap.h     (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_bitmap.h  (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,79 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DECLARE_BITMAP(name,bits) \<o:p></o:p></p>
<p class="MsoNormal">+             unsigned long name[BITS_TO_LONGS(bits)]<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned long atomic_set_bit(int nr, volatile long * addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+                             return InterlockedOr( addr, (1 << nr) );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned long atomic_clear_bit(int nr, volatile long * addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return InterlockedAnd( addr, ~(1 << nr) );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline  int set_bit(int nr,unsigned long * addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             addr += nr >> 5;<o:p></o:p></p>
<p class="MsoNormal">+             return atomic_set_bit( nr & 0x1f, (volatile long *)addr );              
<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline  int clear_bit(int nr, unsigned long * addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             addr += nr >> 5;<o:p></o:p></p>
<p class="MsoNormal">+             return atomic_clear_bit( nr & 0x1f, (volatile long *)addr ); 
<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline  int test_bit(int nr, const unsigned long * addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+       int     mask;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+       addr += nr >> 5;<o:p></o:p></p>
<p class="MsoNormal">+       mask = 1 << (nr & 0x1f);<o:p></o:p></p>
<p class="MsoNormal">+       return ((mask & *addr) != 0);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void bitmap_zero(unsigned long *dst, int nbits)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (nbits <= BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">+                             *dst = 0UL;<o:p></o:p></p>
<p class="MsoNormal">+             else {<o:p></o:p></p>
<p class="MsoNormal">+                             int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);<o:p></o:p></p>
<p class="MsoNormal">+                             RtlZeroMemory(dst, len);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BITMAP_LAST_WORD_MASK(nbits)   \<o:p></o:p></p>
<p class="MsoNormal">+             ( ((nbits) % BITS_PER_LONG) ? (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL )<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int __bitmap_full(const unsigned long *bitmap, int bits);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int bitmap_full(const unsigned long *src, int nbits)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (nbits <= BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">+                             return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             return __bitmap_full(src, nbits);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int __bitmap_empty(const unsigned long *bitmap, int bits);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int bitmap_empty(const unsigned long *src, int nbits)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             if (nbits <= BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">+                             return ! (*src & BITMAP_LAST_WORD_MASK(nbits));<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             return __bitmap_empty(src, nbits);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void bitmap_fill(unsigned long *dst, int nbits)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             size_t nlongs = BITS_TO_LONGS(nbits);<o:p></o:p></p>
<p class="MsoNormal">+             if (nlongs > 1) {<o:p></o:p></p>
<p class="MsoNormal">+             int len = (int)((nlongs - 1) * sizeof(unsigned long));<o:p></o:p></p>
<p class="MsoNormal">+             memset(dst, 0xff, len);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_atomic.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_atomic.h      (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_atomic.h   (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,60 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "complib/cl_atomic.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef volatile __int32             atomic_t;             /* as atomic32_t */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define atomic_inc      cl_atomic_inc<o:p></o:p></p>
<p class="MsoNormal">+#define atomic_dec     cl_atomic_dec<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline atomic_t atomic_read(atomic_t *pval) <o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return *pval;      <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void atomic_set(atomic_t *pval, long val)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             *pval = (__int32)val;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* atomic_inc_and_test - increment and test<o:p></o:p></p>
<p class="MsoNormal">+* pval: pointer of type atomic_t<o:p></o:p></p>
<p class="MsoNormal">+* <o:p></o:p></p>
<p class="MsoNormal">+* Atomically increments pval by 1 and<o:p></o:p></p>
<p class="MsoNormal">+* returns true if the result is 0, or false for all other<o:p></o:p></p>
<p class="MsoNormal">+* cases.<o:p></o:p></p>
<p class="MsoNormal">+*/ <o:p></o:p></p>
<p class="MsoNormal">+static inline int<o:p></o:p></p>
<p class="MsoNormal">+atomic_inc_and_test(atomic_t *pval)<o:p></o:p></p>
<p class="MsoNormal">+{ <o:p></o:p></p>
<p class="MsoNormal">+             return cl_atomic_inc(pval) == 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* atomic_dec_and_test - decrement and test<o:p></o:p></p>
<p class="MsoNormal">+* pval: pointer of type atomic_t<o:p></o:p></p>
<p class="MsoNormal">+* <o:p></o:p></p>
<p class="MsoNormal">+* Atomically decrements pval by 1 and<o:p></o:p></p>
<p class="MsoNormal">+* returns true if the result is 0, or false for all other<o:p></o:p></p>
<p class="MsoNormal">+* cases.<o:p></o:p></p>
<p class="MsoNormal">+*/ <o:p></o:p></p>
<p class="MsoNormal">+static inline int<o:p></o:p></p>
<p class="MsoNormal">+atomic_dec_and_test(atomic_t *pval)<o:p></o:p></p>
<p class="MsoNormal">+{ <o:p></o:p></p>
<p class="MsoNormal">+             return cl_atomic_dec(pval) == 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* atomic_dec_return - decrement and return the value<o:p></o:p></p>
<p class="MsoNormal">+* pval: pointer of type atomic_t<o:p></o:p></p>
<p class="MsoNormal">+* <o:p></o:p></p>
<p class="MsoNormal">+* Atomically decrements pval by 1 and retruns the new value<o:p></o:p></p>
<p class="MsoNormal">+*/ <o:p></o:p></p>
<p class="MsoNormal">+static inline int<o:p></o:p></p>
<p class="MsoNormal">+atomic_dec_return(atomic_t *pval)<o:p></o:p></p>
<p class="MsoNormal">+{ <o:p></o:p></p>
<p class="MsoNormal">+             return cl_atomic_dec(pval);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_bit.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_bit.h              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_bit.h           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,203 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Nth element of the table contains the index of the first set bit of N; 8 - for N=0<o:p></o:p></p>
<p class="MsoNormal">+extern char g_set_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">+// Nth element of the table contains the index of the first cleared bit of N; 8 - for N=0<o:p></o:p></p>
<p class="MsoNormal">+extern char g_clr_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int fls(int x)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             int r = 32;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (!x)<o:p></o:p></p>
<p class="MsoNormal">+                             return 0;<o:p></o:p></p>
<p class="MsoNormal">+             if (!(x & 0xffff0000u)) {<o:p></o:p></p>
<p class="MsoNormal">+                             x <<= 16;<o:p></o:p></p>
<p class="MsoNormal">+                             r -= 16;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             if (!(x & 0xff000000u)) {<o:p></o:p></p>
<p class="MsoNormal">+                             x <<= 8;<o:p></o:p></p>
<p class="MsoNormal">+                             r -= 8;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             if (!(x & 0xf0000000u)) {<o:p></o:p></p>
<p class="MsoNormal">+                             x <<= 4;<o:p></o:p></p>
<p class="MsoNormal">+                             r -= 4;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             if (!(x & 0xc0000000u)) {<o:p></o:p></p>
<p class="MsoNormal">+                             x <<= 2;<o:p></o:p></p>
<p class="MsoNormal">+                             r -= 2;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             if (!(x & 0x80000000u)) {<o:p></o:p></p>
<p class="MsoNormal">+                             x <<= 1;<o:p></o:p></p>
<p class="MsoNormal">+                             r -= 1;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return r;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* _ffs_raw - find the first one bit in a word<o:p></o:p></p>
<p class="MsoNormal">+* @addr: The address to start the search at<o:p></o:p></p>
<p class="MsoNormal">+* @offset: The bitnumber to start searching at<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* returns: 0 - if not found or N+1, if found Nth bit<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static __inline int _ffs_raw(const unsigned long *addr, int offset)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: not an effective code - is better in Assembler<o:p></o:p></p>
<p class="MsoNormal">+             int mask;<o:p></o:p></p>
<p class="MsoNormal">+             int rbc;<o:p></o:p></p>
<p class="MsoNormal">+             int ix;<o:p></o:p></p>
<p class="MsoNormal">+             if (!*addr) return 0;<o:p></o:p></p>
<p class="MsoNormal">+             mask = 1 << offset;<o:p></o:p></p>
<p class="MsoNormal">+             rbc = BITS_PER_LONG - offset;<o:p></o:p></p>
<p class="MsoNormal">+             for (ix=0; ix<rbc; ix++, mask<<=1) {<o:p></o:p></p>
<p class="MsoNormal">+                             if (*addr & mask)<o:p></o:p></p>
<p class="MsoNormal">+                                             return offset + ix + 1;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// as previous with offset = 0<o:p></o:p></p>
<p class="MsoNormal">+static __inline int _ffs(const unsigned long *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *ptr = (unsigned char *)addr;<o:p></o:p></p>
<p class="MsoNormal">+             if (!*addr) return 0;                                                                         // skip sero dword<o:p></o:p></p>
<p class="MsoNormal">+             if (!*(short*)ptr) ptr += 2;                                                            // get to the non-zero word<o:p></o:p></p>
<p class="MsoNormal">+             if (!*(char*)ptr) ptr++;                                                                                  // get to the non-zero byte<o:p></o:p></p>
<p class="MsoNormal">+             return (int)(((ptr - (unsigned char *)addr ) << 3) + g_set_bit_tbl[*ptr] + 1);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ffs(val)              _ffs((const unsigned long *)&(val))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* _ffz_raw - find the first zero bit in a word<o:p></o:p></p>
<p class="MsoNormal">+* @addr: The address to start the search at<o:p></o:p></p>
<p class="MsoNormal">+* @offset: The bitnumber to start searching at<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* returns: 0 - if not found or N+1, if found Nth bit<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static __inline int _ffz_raw(const unsigned long *addr, int offset)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             //TODO: not an effective code - is better in Assembler<o:p></o:p></p>
<p class="MsoNormal">+             int mask;<o:p></o:p></p>
<p class="MsoNormal">+             int rbc;<o:p></o:p></p>
<p class="MsoNormal">+             int ix;<o:p></o:p></p>
<p class="MsoNormal">+             if (!~*addr) return 0;<o:p></o:p></p>
<p class="MsoNormal">+             mask = 1 << offset;<o:p></o:p></p>
<p class="MsoNormal">+             rbc = BITS_PER_LONG - offset;<o:p></o:p></p>
<p class="MsoNormal">+             for (ix=0; ix<rbc; ix++, mask<<=1) {<o:p></o:p></p>
<p class="MsoNormal">+                             if (!(*addr & mask))<o:p></o:p></p>
<p class="MsoNormal">+                                             return offset + ix + 1;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// as previous with offset = 0<o:p></o:p></p>
<p class="MsoNormal">+static __inline int _ffz(const unsigned long *addr)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *ptr = (unsigned char *)addr;<o:p></o:p></p>
<p class="MsoNormal">+             if (!~*addr) return 0;                                                                      // skip sero dword<o:p></o:p></p>
<p class="MsoNormal">+             if (!~*(short*)ptr) ptr += 2;                                                         // get to the non-zero word<o:p></o:p></p>
<p class="MsoNormal">+             if (!~*(char*)ptr) ptr++;                                                                                                // get to the non-zero byte<o:p></o:p></p>
<p class="MsoNormal">+             return (int)(((ptr - (unsigned char *)addr ) << 3) + g_clr_bit_tbl[*ptr] + 1);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ffz(val)              _ffz((const unsigned long *)&val)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Function: <o:p></o:p></p>
<p class="MsoNormal">+//         finds the first bit, set in the bitmap<o:p></o:p></p>
<p class="MsoNormal">+// Parameters:<o:p></o:p></p>
<p class="MsoNormal">+//         ptr          - address of the bitmap<o:p></o:p></p>
<p class="MsoNormal">+//         bits_size              - the size in bits<o:p></o:p></p>
<p class="MsoNormal">+// Returns:<o:p></o:p></p>
<p class="MsoNormal">+//         the index of the first bit set; 'bits_size' - when there is noone<o:p></o:p></p>
<p class="MsoNormal">+// Notes:<o:p></o:p></p>
<p class="MsoNormal">+//         presumes, that ptr is aligned on dword<o:p></o:p></p>
<p class="MsoNormal">+//         presumes, that the map contains an integer number of dwords<o:p></o:p></p>
<p class="MsoNormal">+//         on bits_size=0 will return 0, but its an illegal case<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+static __inline int find_first_bit(const unsigned long *addr, unsigned bits_size)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *ptr = (unsigned char *)addr;                       // bitmap start<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *end_ptr = (unsigned char *)(addr + BITS_TO_LONGS(bits_size));              // bitmap end<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             while (ptr<end_ptr) {<o:p></o:p></p>
<p class="MsoNormal">+                             if (!*(int*)ptr) { ptr += 4; continue; }        // skip zero dword<o:p></o:p></p>
<p class="MsoNormal">+                             if (!*(short*)ptr) ptr += 2;                                                            // get to the non-zero word<o:p></o:p></p>
<p class="MsoNormal">+                             if (!*(char*)ptr) ptr++;                                                                                  // get to the non-zero byte<o:p></o:p></p>
<p class="MsoNormal">+                             return (int)(((ptr - (unsigned char *)addr ) << 3) + g_set_bit_tbl[*ptr]);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return bits_size;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static __inline int find_first_zero_bit(const unsigned long *addr, unsigned bits_size)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *ptr = (unsigned char *)addr;                       // bitmap start<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *end_ptr = (unsigned char *)(addr + BITS_TO_LONGS(bits_size));              // bitmap end<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             while (ptr<end_ptr) {<o:p></o:p></p>
<p class="MsoNormal">+                             if (!~*(int*)ptr) { ptr += 4; continue; }     // skip dword w/o zero bits<o:p></o:p></p>
<p class="MsoNormal">+                             if (!~*(short*)ptr) ptr += 2;                                                         // get to the word with zero bits<o:p></o:p></p>
<p class="MsoNormal">+                             if (!~*(char*)ptr) ptr++;                                                                                                // get to the byte with zero bits<o:p></o:p></p>
<p class="MsoNormal">+                             return (int)(((ptr - (unsigned char *)addr ) << 3) + g_clr_bit_tbl[*ptr]);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return bits_size;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/**<o:p></o:p></p>
<p class="MsoNormal">+* find_next_zero_bit - find the first zero bit in a memory region<o:p></o:p></p>
<p class="MsoNormal">+* @addr: The address to base the search on<o:p></o:p></p>
<p class="MsoNormal">+* @offset: The bitnumber to start searching at<o:p></o:p></p>
<p class="MsoNormal">+* @bits_size: The maximum size to search<o:p></o:p></p>
<p class="MsoNormal">+*<o:p></o:p></p>
<p class="MsoNormal">+* Returns the bit-number of the first zero bit, not the number of the byte<o:p></o:p></p>
<p class="MsoNormal">+* containing a bit. If not found - returns 'size'<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static __inline int find_next_zero_bit(const unsigned long *addr, int bits_size, int offset)<o:p></o:p></p>
<p class="MsoNormal">+{            <o:p></o:p></p>
<p class="MsoNormal">+             int res;<o:p></o:p></p>
<p class="MsoNormal">+             int ix = offset & 31;<o:p></o:p></p>
<p class="MsoNormal">+             int set = offset & ~31;<o:p></o:p></p>
<p class="MsoNormal">+             const unsigned long *p = addr + (set >> 5);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // search in the first word while we are in the middle<o:p></o:p></p>
<p class="MsoNormal">+             if (ix) {<o:p></o:p></p>
<p class="MsoNormal">+                             res = _ffz_raw(p, ix);<o:p></o:p></p>
<p class="MsoNormal">+                             if (res)<o:p></o:p></p>
<p class="MsoNormal">+                                             return set + res - 1;<o:p></o:p></p>
<p class="MsoNormal">+                             ++p;<o:p></o:p></p>
<p class="MsoNormal">+                             set += BITS_PER_LONG;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             // search the rest of the bitmap<o:p></o:p></p>
<p class="MsoNormal">+             res = find_first_zero_bit(p, bits_size - (unsigned)(32 * (p - addr)));<o:p></o:p></p>
<p class="MsoNormal">+             return res + set;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* The functions works only for 32-bit values (not as in Linux ) */<o:p></o:p></p>
<p class="MsoNormal">+/* on val=0 will return '-1' */<o:p></o:p></p>
<p class="MsoNormal">+static inline int ilog2(u32 val)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(val);<o:p></o:p></p>
<p class="MsoNormal">+             return fls(val) - 1;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline BOOLEAN is_power_of_2(unsigned long n)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return (!!n & !(n & (n-1))) ? TRUE : FALSE;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned long roundup_pow_of_two(unsigned long x)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return (1UL << fls(x - 1));<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DECLARE_BITMAP(name,bits) \<o:p></o:p></p>
<p class="MsoNormal">+             unsigned long name[BITS_TO_LONGS(bits)]<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BITMAP_LAST_WORD_MASK(nbits)   \<o:p></o:p></p>
<p class="MsoNormal">+             ( ((nbits) % BITS_PER_LONG) ? (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL )<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_sk_buff.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_sk_buff.h    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_sk_buff.h (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,107 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_network_headers.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct sk_buff <o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    unsigned char *head;<o:p></o:p></p>
<p class="MsoNormal">+    unsigned char *data;<o:p></o:p></p>
<p class="MsoNormal">+    unsigned char *tail;<o:p></o:p></p>
<p class="MsoNormal">+    unsigned char *end;<o:p></o:p></p>
<p class="MsoNormal">+    struct ethhdr *mac;<o:p></o:p></p>
<p class="MsoNormal">+    u32 len;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define eth_hdr(skb)    (skb)->mac<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline struct sk_buff *dev_alloc_skb(u32 length)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct sk_buff *skb = NULL;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    skb = (struct sk_buff *) kmalloc(sizeof(struct sk_buff), GFP_KERNEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(skb != NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        skb->head = skb->data = skb->tail = (unsigned char *) kmalloc(length, GFP_KERNEL);<o:p></o:p></p>
<p class="MsoNormal">+        skb->end = skb->head + length;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return skb;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void skb_reserve(struct sk_buff *skb, u32 length)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    skb->data += length;<o:p></o:p></p>
<p class="MsoNormal">+    skb->tail += length;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void kfree_skb(struct sk_buff *skb)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    kfree(skb->head);<o:p></o:p></p>
<p class="MsoNormal">+    kfree(skb);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+* Function: skb_put<o:p></o:p></p>
<p class="MsoNormal">+* Description: This function extends the used data area of the buffer.
<o:p></o:p></p>
<p class="MsoNormal">+* If this would exceed the total buffer size the kernel will panic. A pointer to the first byte of the extra data is returned.
<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned char* skb_put(struct sk_buff *skb, u32 length)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    unsigned char *prev_tail = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    if(skb->tail + length > skb->end)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    prev_tail = skb->tail;<o:p></o:p></p>
<p class="MsoNormal">+    skb->tail += length;<o:p></o:p></p>
<p class="MsoNormal">+    skb->len += length;<o:p></o:p></p>
<p class="MsoNormal">+    return prev_tail;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void skb_set_mac_header(struct sk_buff *skb, u32 offset)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             skb->mac = (struct ethhdr *) (skb->data + offset);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+* Function: skb_pull<o:p></o:p></p>
<p class="MsoNormal">+* Description: This function removes data from the start of a buffer, returning the memory to the headroom.
<o:p></o:p></p>
<p class="MsoNormal">+* A pointer to the next data in the buffer is returned. Once the data has been pulled future pushes will overwrite the old data<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned char * skb_pull (struct sk_buff * skb, u32 length)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(skb->data + length >= skb->tail)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    skb->data += length;<o:p></o:p></p>
<p class="MsoNormal">+    skb->len -= length;<o:p></o:p></p>
<p class="MsoNormal">+    return skb->data;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+* Function: skb_push<o:p></o:p></p>
<p class="MsoNormal">+* Description: This function extends the used data area of the buffer at the buffer start.
<o:p></o:p></p>
<p class="MsoNormal">+* If this would exceed the total buffer headroom the kernel will panic. A pointer to the first byte of the extra data is returned.
<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned char * skb_push (struct sk_buff * skb, unsigned int length)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(skb->data - length < skb->head)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    skb->data -= length;<o:p></o:p></p>
<p class="MsoNormal">+    skb->len += length;<o:p></o:p></p>
<p class="MsoNormal">+    return skb->data;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+* Function: skb_reset_mac_header<o:p></o:p></p>
<p class="MsoNormal">+* Description: Set MAC to be in the beginning of data. <o:p>
</o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+static inline void skb_reset_mac_header(struct sk_buff * skb)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    skb->mac = (struct ethhdr *) skb->data;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w.h      (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w.h   (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,422 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef L2W_H<o:p></o:p></p>
<p class="MsoNormal">+#define L2W_H<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// GENERAL INCLUDES<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// OS<o:p></o:p></p>
<p class="MsoNormal">+#include <ntddk.h><o:p></o:p></p>
<p class="MsoNormal">+//#include <iointex.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdarg.h><o:p></o:p></p>
<p class="MsoNormal">+#include <stdlib.h><o:p></o:p></p>
<p class="MsoNormal">+#include <errno.h><o:p></o:p></p>
<p class="MsoNormal">+#define NTSTRSAFE_LIB<o:p></o:p></p>
<p class="MsoNormal">+#include <ntstrsafe.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef __cplusplus<o:p></o:p></p>
<p class="MsoNormal">+extern "C"<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// complib<o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_timer.h><o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_qlist.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// mlx4<o:p></o:p></p>
<p class="MsoNormal">+#include "vc.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// LITERALS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BITS_PER_LONG                                           32<o:p></o:p></p>
<p class="MsoNormal">+#define N_BARS                                                                            3<o:p></o:p></p>
<p class="MsoNormal">+#define HZ                                                                                       1000000 /* 1 sec in usecs */<o:p></o:p></p>
<p class="MsoNormal">+#define EOPNOTSUPP                                                                95<o:p></o:p></p>
<p class="MsoNormal">+#define ETH_LENGTH_OF_ADDRESS    6<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// SUBSTITUTIONS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BUG_ON(exp)                               ASSERT(!(exp)) /* in Linux follows here panic() !*/
<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable : 4995)                            // warning C4995: name was marked as #pragma deprecated (_snprintf)<o:p></o:p></p>
<p class="MsoNormal">+#define snprintf                            _snprintf<o:p></o:p></p>
<p class="MsoNormal">+#define printk                                                cl_dbg_out<o:p></o:p></p>
<p class="MsoNormal">+#define KERN_ERR                       "err:"<o:p></o:p></p>
<p class="MsoNormal">+#define KERN_WARNING         "warn:"<o:p></o:p></p>
<p class="MsoNormal">+#define KERN_DEBUG                                "dbg:"<o:p></o:p></p>
<p class="MsoNormal">+#define BUG()<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// memory barriers<o:p></o:p></p>
<p class="MsoNormal">+#define wmb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">+#define rmb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">+#define mb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">+// TODO: can we make it empty ?  I saw in Linux, it is an empty macro for x86 & x64<o:p></o:p></p>
<p class="MsoNormal">+#define mmiowb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// gcc compiler attributes<o:p></o:p></p>
<p class="MsoNormal">+#define __devinit<o:p></o:p></p>
<p class="MsoNormal">+#define __devinitdata<o:p></o:p></p>
<p class="MsoNormal">+#define __init<o:p></o:p></p>
<p class="MsoNormal">+#define __exit<o:p></o:p></p>
<p class="MsoNormal">+#define __force<o:p></o:p></p>
<p class="MsoNormal">+#define __iomem<o:p></o:p></p>
<p class="MsoNormal">+#define __attribute_const__<o:p></o:p></p>
<p class="MsoNormal">+#define likely(x)                                            (x)<o:p></o:p></p>
<p class="MsoNormal">+#define unlikely(x)                                       (x)<o:p></o:p></p>
<p class="MsoNormal">+#define __attribute__(a)<o:p></o:p></p>
<p class="MsoNormal">+#define __bitwise<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// container_of<o:p></o:p></p>
<p class="MsoNormal">+#define container_of                  CONTAINING_RECORD<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// inline <o:p></o:p></p>
<p class="MsoNormal">+#define inline __inline<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// new Linux event mechanism<o:p></o:p></p>
<p class="MsoNormal">+#define complete(a)                                                                   wake_up(a)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// convert<o:p></o:p></p>
<p class="MsoNormal">+#define __constant_htons                       CL_HTON16<o:p></o:p></p>
<p class="MsoNormal">+#define __constant_cpu_to_be32        CL_HTON32<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// various<o:p></o:p></p>
<p class="MsoNormal">+#define __always_inline                                                            inline<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if (WINVER < _WIN32_WINNT_WIN6)<o:p></o:p></p>
<p class="MsoNormal">+#define num_possible_cpus() KeNumberProcessors<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+#define num_possible_cpus()                KeQueryMaximumProcessorCount()<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// TYPES<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define true (u8)1<o:p></o:p></p>
<p class="MsoNormal">+#define false (u8)0<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// basic types<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned char                                                u8, __u8;<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned short int       u16, __u16;<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned int                                                   u32, __u32;<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned __int64                         u64, __u64;<o:p></o:p></p>
<p class="MsoNormal">+typedef char                                   s8, __s8;<o:p></o:p></p>
<p class="MsoNormal">+typedef short int           s16, __s16;<o:p></o:p></p>
<p class="MsoNormal">+typedef int                                                       s32, __s32;<o:p></o:p></p>
<p class="MsoNormal">+typedef __int64                             s64, __s64;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef __cplusplus<o:p></o:p></p>
<p class="MsoNormal">+typedef u8 bool;<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// inherited<o:p></o:p></p>
<p class="MsoNormal">+typedef u16  __le16;<o:p></o:p></p>
<p class="MsoNormal">+typedef u16  __be16;<o:p></o:p></p>
<p class="MsoNormal">+typedef u32  __le32;<o:p></o:p></p>
<p class="MsoNormal">+typedef u32  __be32;<o:p></o:p></p>
<p class="MsoNormal">+typedef u64  __le64;<o:p></o:p></p>
<p class="MsoNormal">+typedef u64  __be64;<o:p></o:p></p>
<p class="MsoNormal">+typedef u16  be16;<o:p></o:p></p>
<p class="MsoNormal">+typedef u32  le32;<o:p></o:p></p>
<p class="MsoNormal">+typedef u32  be32;<o:p></o:p></p>
<p class="MsoNormal">+typedef u64  le64;<o:p></o:p></p>
<p class="MsoNormal">+typedef u64  be64;<o:p></o:p></p>
<p class="MsoNormal">+typedef u64 io_addr_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// dummy function<o:p></o:p></p>
<p class="MsoNormal">+typedef void (*MT_EMPTY_FUNC)();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// PCI BAR descriptor<o:p></o:p></p>
<p class="MsoNormal">+typedef enum _hca_bar_type<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             HCA_BAR_TYPE_HCR,<o:p></o:p></p>
<p class="MsoNormal">+             HCA_BAR_TYPE_UAR,<o:p></o:p></p>
<p class="MsoNormal">+             HCA_BAR_TYPE_DDR,<o:p></o:p></p>
<p class="MsoNormal">+             HCA_BAR_TYPE_MAX<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}            hca_bar_type_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef struct _hca_bar<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             uint64_t                                               phys;<o:p></o:p></p>
<p class="MsoNormal">+             void                                                       *virt;<o:p></o:p></p>
<p class="MsoNormal">+             SIZE_T                                                   size;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}            hca_bar_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct msix_saved_info {<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   vca;                        /* MSI-X Vector Table card address */<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   mca;                      /* MSI-X Mask Table card address */<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   vsa;                        /* MSI-X Vector Table saved address */<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   msa;                      /* MSI-X Mask Table saved address */<o:p></o:p></p>
<p class="MsoNormal">+             ULONG vsz;                        /* MSI-X Vector Table size */<o:p></o:p></p>
<p class="MsoNormal">+             ULONG msz;                       /* MSI-X Mask Table size */<o:p></o:p></p>
<p class="MsoNormal">+             int                           num;                     /* number of supported MSI-X vectors */<o:p></o:p></p>
<p class="MsoNormal">+             int                           valid;                     /* the structure is valid */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct msix_map {<o:p></o:p></p>
<p class="MsoNormal">+             KAFFINITY           cpu;                       /* affinity of this MSI-X vector */<o:p></o:p></p>
<p class="MsoNormal">+             int                                           eq_ix;                   /* EQ index in the array of EQs */<o:p></o:p></p>
<p class="MsoNormal">+             int                                           ref_cnt;                /* number of users */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef struct _MLX4_ST_DEVICE *PMLX4_ST_DEVICE;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// interface structure between Upper and Low Layers of the driver<o:p></o:p></p>
<p class="MsoNormal">+struct pci_dev<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             // driver: OS/platform resources<o:p></o:p></p>
<p class="MsoNormal">+             BUS_INTERFACE_STANDARD                                     bus_pci_ifc;<o:p></o:p></p>
<p class="MsoNormal">+             PCI_COMMON_CONFIG                                                              pci_cfg_space;<o:p></o:p></p>
<p class="MsoNormal">+             struct msix_saved_info                                 msix_info;<o:p></o:p></p>
<p class="MsoNormal">+             struct msix_map*                                                            p_msix_map;<o:p></o:p></p>
<p class="MsoNormal">+             uplink_info_t                                                                     uplink_info;<o:p></o:p></p>
<p class="MsoNormal">+             // driver: card resources<o:p></o:p></p>
<p class="MsoNormal">+             hca_bar_t                                                                                           bar[N_BARS];<o:p></o:p></p>
<p class="MsoNormal">+             CM_PARTIAL_RESOURCE_DESCRIPTOR int_info;               /* HCA interrupt resources */<o:p></o:p></p>
<p class="MsoNormal">+             // driver: various objects and info<o:p></o:p></p>
<p class="MsoNormal">+             USHORT                                                                                                               ven_id;<o:p></o:p></p>
<p class="MsoNormal">+             USHORT                                                                                                               dev_id;<o:p></o:p></p>
<p class="MsoNormal">+             USHORT                                                                                                               sub_vendor_id;<o:p></o:p></p>
<p class="MsoNormal">+             USHORT                                                                                                               sub_system_id;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                                                                                                 revision_id;<o:p></o:p></p>
<p class="MsoNormal">+             UCHAR                                                                                                 partition_status;<o:p></o:p></p>
<p class="MsoNormal">+             DMA_ADAPTER                                *                                                             p_dma_adapter;              /* HCA adapter object */<o:p></o:p></p>
<p class="MsoNormal">+             DEVICE_OBJECT                *                                                             p_self_do;                          /* mlx4_bus's FDO */<o:p></o:p></p>
<p class="MsoNormal">+             DEVICE_OBJECT                *                                                             pdo;                                       /* mlx4_bus's PDO */<o:p></o:p></p>
<p class="MsoNormal">+             PVOID                                                                                                   p_wdf_device;   /* wdf_device */<o:p></o:p></p>
<p class="MsoNormal">+             LONG                                                                                                    ib_hca_created;<o:p></o:p></p>
<p class="MsoNormal">+             // mlx4_ib: various objects and info        <o:p>
</o:p></p>
<p class="MsoNormal">+             struct ib_device *                                                            ib_dev;<o:p></o:p></p>
<p class="MsoNormal">+             // mlx4_net: various objects and info     <o:p>
</o:p></p>
<p class="MsoNormal">+             struct mlx4_dev *                                                            dev;<o:p></o:p></p>
<p class="MsoNormal">+             volatile long                                                                        dpc_lock;<o:p></o:p></p>
<p class="MsoNormal">+             PUCHAR                                                                                                               vpd;<o:p></o:p></p>
<p class="MsoNormal">+             int                                                                                                                           vpd_size;<o:p></o:p></p>
<p class="MsoNormal">+             WCHAR                                                                                                                location[36];                       /* bus+func+dev */<o:p></o:p></p>
<p class="MsoNormal">+             int                                                                                                                           pci_bus;<o:p></o:p></p>
<p class="MsoNormal">+             int                                                                                                                           pci_device;<o:p></o:p></p>
<p class="MsoNormal">+             int                                                                                                                           pci_func;<o:p></o:p></p>
<p class="MsoNormal">+             USHORT                                                                                                               devfn;<o:p></o:p></p>
<p class="MsoNormal">+             char                                                                                                       name[24];                           /* mlx4_role_bus_func_dev */<o:p></o:p></p>
<p class="MsoNormal">+             // statistics<o:p></o:p></p>
<p class="MsoNormal">+             PMLX4_ST_DEVICE                                                         p_stat;<o:p></o:p></p>
<p class="MsoNormal">+             struct mlx4_priv                                                               *priv;<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// WDM interrupts<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+             // legacy<o:p></o:p></p>
<p class="MsoNormal">+             PKINTERRUPT                                                                                    int_obj;                                /* HCA interrupt object */<o:p></o:p></p>
<p class="MsoNormal">+             KSPIN_LOCK                                                                                      isr_lock;                               /* lock for the ISR */<o:p></o:p></p>
<p class="MsoNormal">+             // MSI-X interrupts<o:p></o:p></p>
<p class="MsoNormal">+             u8                                                                                                                           n_msi_vectors_alloc;/* number of allocated MSI vectors */<o:p></o:p></p>
<p class="MsoNormal">+             u8                                                                                                                           n_msi_vectors;                 /* number of MSI vectors; 0 - no MSI */<o:p></o:p></p>
<p class="MsoNormal">+             ULONG                                                                                                 version;<o:p></o:p></p>
<p class="MsoNormal">+             int                                                                                                           legacy_connect;<o:p></o:p></p>
<p class="MsoNormal">+             // others<o:p></o:p></p>
<p class="MsoNormal">+             int                                                                                                           is_reset_prohibited;<o:p></o:p></p>
<p class="MsoNormal">+             boolean_t                                                                                           start_event_taken;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             USHORT                                                                                                               clp_ver;<o:p></o:p></p>
<p class="MsoNormal">+    KEVENT                                                                                                         remove_dev_lock;      /* lock remove_one process */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* DPC */<o:p></o:p></p>
<p class="MsoNormal">+typedef void (*dpc_t)( struct _KDPC *, PVOID, PVOID, PVOID );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef SUPPORTED_ONLY_IN_LINUX<o:p></o:p></p>
<p class="MsoNormal">+struct attribute {<o:p></o:p></p>
<p class="MsoNormal">+             const char                                                                                           *name;<o:p></o:p></p>
<p class="MsoNormal">+             void                                                                                                       *owner;<o:p></o:p></p>
<p class="MsoNormal">+             u32                                                                                                                         mode;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct device_attribute {<o:p></o:p></p>
<p class="MsoNormal">+             struct attribute        attr;<o:p></o:p></p>
<p class="MsoNormal">+             ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);<o:p></o:p></p>
<p class="MsoNormal">+             ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// MACROS<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// conversions<o:p></o:p></p>
<p class="MsoNormal">+#define swab32(a)                                       _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define cpu_to_be16(a)                            _byteswap_ushort((USHORT)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define be16_to_cpu(a)                            _byteswap_ushort((USHORT)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define cpu_to_be32(a)                            _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define be32_to_cpu(a)                            _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define cpu_to_be64(a)                            _byteswap_uint64((UINT64)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define cpu_to_be24(dst, src) {(dst)[0] = (u8) (((src) >> 16) & 0xff); (dst)[1] = (u8) (((src) >> 8) & 0xff); (dst)[2] = (u8) ((src) & 0xff);}<o:p></o:p></p>
<p class="MsoNormal">+#define be24_to_cpu(a)                            (u32)((a)[0] << 16 | (a)[1] << 8 | (a)[2])<o:p></o:p></p>
<p class="MsoNormal">+#define be64_to_cpu(a)                            _byteswap_uint64((UINT64)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define be64_to_cpup(p)                         _byteswap_uint64(*(PUINT64)(p))<o:p></o:p></p>
<p class="MsoNormal">+#define be32_to_cpup(p)                         _byteswap_ulong(*(PULONG)(p))<o:p></o:p></p>
<p class="MsoNormal">+#define be16_to_cpup(p)                         _byteswap_ushort(*(PUSHORT)(p))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// ARRAY_SIZE<o:p></o:p></p>
<p class="MsoNormal">+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// ALIGN<o:p></o:p></p>
<p class="MsoNormal">+#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))<o:p></o:p></p>
<p class="MsoNormal">+#define PTR_ALIGN(size)          (((size) + sizeof(void*) - 1) & ~(sizeof(void*) - 1))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// there is a bug in Microsoft compiler, that when _byteswap_uint64() gets an expression<o:p></o:p></p>
<p class="MsoNormal">+// it executes the expression but doesn't swap tte dwords<o:p></o:p></p>
<p class="MsoNormal">+// So, there's a workaround<o:p></o:p></p>
<p class="MsoNormal">+#ifdef BYTESWAP_UINT64_BUG_FIXED<o:p></o:p></p>
<p class="MsoNormal">+#define CPU_2_BE64_PREP                     <o:p></o:p></p>
<p class="MsoNormal">+#define CPU_2_BE64(x)                                             cl_hton64(x)<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+#define CPU_2_BE64_PREP     unsigned __int64 __tmp__        
<o:p></o:p></p>
<p class="MsoNormal">+#define CPU_2_BE64(x)                                             ( __tmp__ = x, cl_hton64(__tmp__) )<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ERR_PTR(error)                             ((void*)(LONG_PTR)(error))<o:p></o:p></p>
<p class="MsoNormal">+#define PTR_ERR(ptr)                                 ((long)(LONG_PTR)(void*)(ptr))<o:p></o:p></p>
<p class="MsoNormal">+#define ETH_ALEN    6<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//TODO: there are 2 assumptions here:<o:p></o:p></p>
<p class="MsoNormal">+// - pointer can't be too big (around -1)<o:p></o:p></p>
<p class="MsoNormal">+// - error can't be bigger than 1000<o:p></o:p></p>
<p class="MsoNormal">+#define IS_ERR(ptr)                                                     ((ULONG_PTR)ptr > (ULONG_PTR)-1000L)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BITS_TO_LONGS(bits) \<o:p></o:p></p>
<p class="MsoNormal">+             (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef ETIMEDOUT<o:p></o:p></p>
<p class="MsoNormal">+#define ETIMEDOUT                    (110)<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef PAGE_ALIGN<o:p></o:p></p>
<p class="MsoNormal">+#undef PAGE_ALIGN<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+#define PAGE_ALIGN(Va) ((u64)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))<o:p></o:p></span></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define NEXT_PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* typed minimum */<o:p></o:p></p>
<p class="MsoNormal">+#define min_t(type,x,y)                            ((type)(x) < (type)(y) ? (type)(x) : (type)(y))<o:p></o:p></p>
<p class="MsoNormal">+#define max_t(type,x,y)                           ((type)(x) > (type)(y) ? (type)(x) : (type)(y))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define EXPORT_SYMBOL(name)<o:p></o:p></p>
<p class="MsoNormal">+#ifndef USE_WDM_INTERRUPTS<o:p></o:p></p>
<p class="MsoNormal">+#define free_irq(pdev)<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline NTSTATUS errno_to_ntstatus(int err)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#define MAP_ERR(err,ntstatus)             case err: status = ntstatus; break<o:p></o:p></p>
<p class="MsoNormal">+             NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (!err) <o:p></o:p></p>
<p class="MsoNormal">+                             return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (err < 0)<o:p></o:p></p>
<p class="MsoNormal">+                             err = -err;<o:p></o:p></p>
<p class="MsoNormal">+             switch (err) {<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( ENOENT, STATUS_NOT_FOUND );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( EAGAIN, STATUS_DEVICE_BUSY );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( ENOMEM, STATUS_NO_MEMORY );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( EACCES, STATUS_ACCESS_DENIED );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( EFAULT, STATUS_DRIVER_INTERNAL_ERROR );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( EBUSY, STATUS_INSUFFICIENT_RESOURCES );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( ENODEV, STATUS_NOT_SUPPORTED );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( EINVAL, STATUS_INVALID_PARAMETER );<o:p></o:p></p>
<p class="MsoNormal">+                             MAP_ERR( ENOSYS, STATUS_NOT_SUPPORTED );<o:p></o:p></p>
<p class="MsoNormal">+                             default:<o:p></o:p></p>
<p class="MsoNormal">+                                             status = STATUS_UNSUCCESSFUL;<o:p></o:p></p>
<p class="MsoNormal">+                                             break;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             return status;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// PROTOTYPES<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+SIZE_T strlcpy(char *dest, const void *src, SIZE_T size);<o:p></o:p></p>
<p class="MsoNormal">+int core_init();<o:p></o:p></p>
<p class="MsoNormal">+void core_cleanup();<o:p></o:p></p>
<p class="MsoNormal">+int l2w_init();<o:p></o:p></p>
<p class="MsoNormal">+void l2w_cleanup();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+// SPECIFIC INCLUDES<o:p></o:p></p>
<p class="MsoNormal">+//<o:p></o:p></p>
<p class="MsoNormal">+////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct mlx4_dev;<o:p></o:p></p>
<p class="MsoNormal">+struct mlx4_priv;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_atomic.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_bit.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_bitmap.h><o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_debug.h"<o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_memory.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_umem.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_list.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_pci.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_pcipool.h><o:p></o:p></p>
<p class="MsoNormal">+#include "l2w_radix.h"<o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_spinlock.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_sync.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_time.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_network_headers.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_workqueue.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_sk_buff.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_debug.h><o:p></o:p></p>
<p class="MsoNormal">+#include <l2w_scsi.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "device.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef __cplusplus<o:p></o:p></p>
<p class="MsoNormal">+}            // extern "C"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+static inline int mlx4_is_barred(struct mlx4_dev *dev)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return dev->flags &  MLX4_FLAG_RESET_DRIVER;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int mlx4_is_in_reset(struct mlx4_dev *dev)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return dev->flags & MLX4_FLAG_RESET_STARTED;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int parse_dev_location(<o:p></o:p></p>
<p class="MsoNormal">+             const char *buffer,<o:p></o:p></p>
<p class="MsoNormal">+             const char *format,<o:p></o:p></p>
<p class="MsoNormal">+             int *bus, int *dev, int *func<o:p></o:p></p>
<p class="MsoNormal">+);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_spinlock.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_spinlock.h   (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_spinlock.h                (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,148 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_spinlock.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if 1<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef cl_spinlock_t  spinlock_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void spin_lock_init(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_init( p_spinlock );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define spin_lock                                                                                                                         cl_spinlock_acquire<o:p></o:p></p>
<p class="MsoNormal">+#define spin_unlock                                                                                                                    cl_spinlock_release<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CL_INLINE void<o:p></o:p></p>
<p class="MsoNormal">+spin_lock_dpc( <o:p></o:p></p>
<p class="MsoNormal">+             IN           cl_spinlock_t* const       p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             KeAcquireSpinLockAtDpcLevel( &p_spinlock->lock );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+CL_INLINE void<o:p></o:p></p>
<p class="MsoNormal">+spin_unlock_dpc(<o:p></o:p></p>
<p class="MsoNormal">+             IN           cl_spinlock_t* const       p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             KeReleaseSpinLockFromDpcLevel( &p_spinlock->lock );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+typedef struct spinlock {<o:p></o:p></p>
<p class="MsoNormal">+             KSPIN_LOCK                                      lock;<o:p></o:p></p>
<p class="MsoNormal">+             KLOCK_QUEUE_HANDLE              lockh;<o:p></o:p></p>
<p class="MsoNormal">+             KIRQL                                                    irql;<o:p></o:p></p>
<p class="MsoNormal">+} spinlock_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void spin_lock_init(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">+{ <o:p></o:p></p>
<p class="MsoNormal">+             KeInitializeSpinLock( &p_spinlock->lock ); <o:p>
</o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_lock( <o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KIRQL irql = KeGetCurrentIrql();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( l && irql <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (irql == DISPATCH_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">+                             KeAcquireInStackQueuedSpinLockAtDpcLevel( &l->lock, &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             KeAcquireInStackQueuedSpinLock( &l->lock, &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">+             l->irql = irql;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_unlock(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( l && KeGetCurrentIrql() == DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             if (l->irql == DISPATCH_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">+                             KeReleaseInStackQueuedSpinLockFromDpcLevel( &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             KeReleaseInStackQueuedSpinLock( &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* to be used only at DPC level */<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_lock_dpc( <o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( l && KeGetCurrentIrql() == DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             KeAcquireInStackQueuedSpinLockAtDpcLevel( &l->lock, &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* to be used only at DPC level */<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_unlock_dpc(<o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             KeReleaseInStackQueuedSpinLockFromDpcLevel( &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_lock_sync( <o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KLOCK_QUEUE_HANDLE lockh;<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( l && KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             KeAcquireInStackQueuedSpinLock ( &l->lock, &lockh );<o:p></o:p></p>
<p class="MsoNormal">+             KeReleaseInStackQueuedSpinLock( &lockh );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DEFINE_SPINLOCK(lock)                           spinlock_t lock<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_lock_irqsave( <o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l,<o:p></o:p></p>
<p class="MsoNormal">+             IN                           unsigned long    *             flags)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(flags);<o:p></o:p></p>
<p class="MsoNormal">+             spin_lock(l);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_unlock_irqrestore( <o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l,<o:p></o:p></p>
<p class="MsoNormal">+             IN                           unsigned long                    flags)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             UNUSED_PARAM(flags);<o:p></o:p></p>
<p class="MsoNormal">+             spin_unlock(l);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void<o:p></o:p></p>
<p class="MsoNormal">+spin_lock_sync( <o:p></o:p></p>
<p class="MsoNormal">+             IN                           spinlock_t* const             l )<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             KLOCK_QUEUE_HANDLE lockh;<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( l && KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">+             KeAcquireInStackQueuedSpinLock ( &l->lock, &lockh );<o:p></o:p></p>
<p class="MsoNormal">+             KeReleaseInStackQueuedSpinLock( &lockh );<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* we are working from DPC level, so we can use usual spinlocks */<o:p></o:p></p>
<p class="MsoNormal">+#define spin_lock_irq                                                                                 spin_lock<o:p></o:p></p>
<p class="MsoNormal">+#define spin_unlock_irq                                                                            spin_unlock<o:p></o:p></p>
<p class="MsoNormal">+#define spin_lock_nested(a,b)                                                               spin_lock(a)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* Windows doesn't support such kind of spinlocks so far, but may be tomorrow ... */<o:p></o:p></p>
<p class="MsoNormal">+#define rwlock_init                                                                                                      spin_lock_init<o:p></o:p></p>
<p class="MsoNormal">+#define read_lock_irqsave                                                                       spin_lock_irqsave<o:p></o:p></p>
<p class="MsoNormal">+#define read_unlock_irqrestore                                                            spin_unlock_irqrestore<o:p></o:p></p>
<p class="MsoNormal">+#define write_lock_irq                                                                                               spin_lock_irq<o:p></o:p></p>
<p class="MsoNormal">+#define write_unlock_irq                                                                          spin_unlock_irq<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// rw_lock<o:p></o:p></p>
<p class="MsoNormal">+typedef spinlock_t                       rwlock_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_network_headers.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_network_headers.h               (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_network_headers.h            (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,16 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ETH_ALEN        6   /* MAC address length in bytes */<o:p></o:p></p>
<p class="MsoNormal">+#define ETH_HLEN        14  /* MAC header length in bytes */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma pack(push, 1)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ethhdr <o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+         unsigned char   h_dest[ETH_ALEN];       /* destination MAC */<o:p></o:p></p>
<p class="MsoNormal">+         unsigned char   h_source[ETH_ALEN];     /* source MAC    */<o:p></o:p></p>
<p class="MsoNormal">+         unsigned short  h_proto;                /* next protocol type */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma pack(pop)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_debug.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_debug.h       (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_debug.h    (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,63 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+WriteEventLogEntryStr(<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">+             PWCHAR              pi_InsertionStr,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+WriteEventLogEntryData(<o:p></o:p></p>
<p class="MsoNormal">+             PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct mlx4_dev;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void<o:p></o:p></p>
<p class="MsoNormal">+mlx4_err(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev *      mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+void<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+mlx4_warn(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev *      mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void<o:p></o:p></p>
<p class="MsoNormal">+mlx4_dbg(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev *      mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+dev_err(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev **   mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+dev_info(<o:p></o:p></p>
<p class="MsoNormal">+             IN struct mlx4_dev **   p_mdev,<o:p></o:p></p>
<p class="MsoNormal">+             IN char*                                                               format,<o:p></o:p></p>
<p class="MsoNormal">+             ...<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define mlx4_info        mlx4_dbg<o:p></o:p></p>
<p class="MsoNormal">+#define dev_warn        dev_err<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_workqueue.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_workqueue.h            (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_workqueue.h         (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,153 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_thread.h><o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_event.h><o:p></o:p></p>
<p class="MsoNormal">+#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef __cplusplus<o:p></o:p></p>
<p class="MsoNormal">+extern "C"<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define NAME_LENGTH 255<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct workqueue_struct<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    char name[NAME_LENGTH];<o:p></o:p></p>
<p class="MsoNormal">+    cl_thread_t thread;<o:p></o:p></p>
<p class="MsoNormal">+    struct list_head works;<o:p></o:p></p>
<p class="MsoNormal">+    spinlock_t lock;<o:p></o:p></p>
<p class="MsoNormal">+    cl_event_t work_event;<o:p></o:p></p>
<p class="MsoNormal">+    int terminate_flag;<o:p></o:p></p>
<p class="MsoNormal">+    struct work_struct *current_work;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct work_struct;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef void (*work_func_t)(struct work_struct *work);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct work_struct<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct list_head list;<o:p></o:p></p>
<p class="MsoNormal">+    work_func_t func;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    struct workqueue_struct *wq;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct delayed_work<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct work_struct work;<o:p></o:p></p>
<p class="MsoNormal">+    struct timer_list timer;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* init_work_queues - init provider (must for delayed work) */<o:p></o:p></p>
<p class="MsoNormal">+int init_workqueues();<o:p></o:p></p>
<p class="MsoNormal">+void shutdown_workqueues();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static void workqueue_do_work(struct workqueue_struct *queue)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct work_struct *work = NULL;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    spin_lock(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+    while(! list_empty(&queue->works))<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        work = container_of(queue->works.Flink, struct work_struct, list);<o:p></o:p></p>
<p class="MsoNormal">+        list_del(&work->list);<o:p></o:p></p>
<p class="MsoNormal">+        queue->current_work = work;<o:p></o:p></p>
<p class="MsoNormal">+        work->wq = NULL;<o:p></o:p></p>
<p class="MsoNormal">+        spin_unlock(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+        work->func(work);<o:p></o:p></p>
<p class="MsoNormal">+        spin_lock(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+        queue->current_work = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    spin_unlock(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static void workqueue_func(void *context)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct workqueue_struct *queue = (struct workqueue_struct *) context;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    while(! queue->terminate_flag)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        cl_event_wait_on(&queue->work_event, EVENT_NO_TIMEOUT, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+        workqueue_do_work(queue);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline struct workqueue_struct *create_singlethread_workqueue(const char *name)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             struct workqueue_struct *queue = NULL;<o:p></o:p></p>
<p class="MsoNormal">+    cl_status_t status;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    queue = (struct workqueue_struct *) kmalloc(sizeof(struct workqueue_struct), GFP_KERNEL);<o:p></o:p></p>
<p class="MsoNormal">+    if(queue == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    memset(queue, 0, sizeof(struct workqueue_struct));<o:p></o:p></p>
<p class="MsoNormal">+    strncpy(queue->name, name, NAME_LENGTH);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    INIT_LIST_HEAD(&queue->works);<o:p></o:p></p>
<p class="MsoNormal">+    spin_lock_init(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+    cl_event_init(&queue->work_event, FALSE);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    status = cl_thread_init(&queue->thread, workqueue_func, queue, name);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    if(status != CL_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        kfree(queue);<o:p></o:p></p>
<p class="MsoNormal">+        return NULL;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    return queue;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void flush_workqueue(struct workqueue_struct *queue)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    workqueue_do_work(queue);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void destroy_workqueue(struct workqueue_struct *queue)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    // set the exit flag<o:p></o:p></p>
<p class="MsoNormal">+             queue->terminate_flag = TRUE;<o:p></o:p></p>
<p class="MsoNormal">+    cl_event_signal(&queue->work_event);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    // wait for thread to exit<o:p></o:p></p>
<p class="MsoNormal">+    cl_thread_destroy(&queue->thread);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    cl_event_destroy(&queue->work_event);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    kfree(queue);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define INIT_WORK(_work, _func) { (_work)->func = (_func); INIT_LIST_HEAD(&(_work)->list); }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline int queue_work(struct workqueue_struct *queue,
<o:p></o:p></p>
<p class="MsoNormal">+               struct work_struct *work)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(queue == NULL || work == NULL)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        return -1;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    spin_lock(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+    list_add_tail(&work->list, &queue->works);<o:p></o:p></p>
<p class="MsoNormal">+    work->wq = queue;<o:p></o:p></p>
<p class="MsoNormal">+    spin_unlock(&queue->lock);<o:p></o:p></p>
<p class="MsoNormal">+    cl_event_signal(&queue->work_event);<o:p></o:p></p>
<p class="MsoNormal">+    return 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int cancel_work_sync(struct work_struct *work);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define INIT_DELAYED_WORK(_delayed_work, func)  { INIT_WORK(&(_delayed_work)->work, func); }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int schedule_delayed_work(struct delayed_work *work, unsigned long delay);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* Reliably kill delayed work */<o:p></o:p></p>
<p class="MsoNormal">+void cancel_delayed_work_sync(struct delayed_work *work);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef __cplusplus<o:p></o:p></p>
<p class="MsoNormal">+}            // extern "C"<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_time.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_time.h          (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_time.h       (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,58 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include <complib/cl_timer.h><o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// returns current time in msecs (u64)<o:p></o:p></p>
<p class="MsoNormal">+#define jiffies                                                                                 get_tickcount_in_ms()<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// jiffies is measured in msecs <o:p></o:p></p>
<p class="MsoNormal">+#define jiffies_to_usecs(msecs)                            ((msecs)*1000)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define time_after(a,b)                                             ((__int64)(b) - (__int64)(a) < 0)<o:p></o:p></p>
<p class="MsoNormal">+#define time_before(a,b)                                         time_after(b,a)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define time_after_eq(a,b)                                     ((__int64)(a) - (__int64)(b) >= 0)<o:p></o:p></p>
<p class="MsoNormal">+#define time_before_eq(a,b)                                 time_after_eq(b,a)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+extern u32 g_time_increment;<o:p></o:p></p>
<p class="MsoNormal">+extern LARGE_INTEGER g_cmd_interval;<o:p></o:p></p>
<p class="MsoNormal">+#define cond_resched()            KeDelayExecutionThread( KernelMode, FALSE, &g_cmd_interval )<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+uint64_t get_tickcount_in_ms(void);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+*   Timer<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define timer_list _cl_timer<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void setup_timer(struct timer_list *timer, void (*function)(void*), void* context)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    cl_timer_init(timer, function, context);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void del_timer_sync(struct timer_list *timer)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(timer->pfn_callback)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        cl_timer_destroy(timer);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void del_timer(struct timer_list * timer)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    if(timer->pfn_callback)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        cl_timer_stop(timer);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline void msleep(unsigned int msecs)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    LARGE_INTEGER interval = {0};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    interval.QuadPart = 10000 * msecs; /* msecs -> 100 nsecs */<o:p></o:p></p>
<p class="MsoNormal">+    KeDelayExecutionThread(KernelMode, FALSE, &interval);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_scsi.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_scsi.h             (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/l2w_scsi.h          (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,98 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct scsi_data_buffer {<o:p></o:p></p>
<p class="MsoNormal">+             struct sg_table table;<o:p></o:p></p>
<p class="MsoNormal">+             unsigned length;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct scsi_device {<o:p></o:p></p>
<p class="MsoNormal">+             unsigned int lun;<o:p></o:p></p>
<p class="MsoNormal">+    void *host; /* local port */<o:p></o:p></p>
<p class="MsoNormal">+    void *target; /* remote port */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/* SCSI command scratchpad */<o:p></o:p></p>
<p class="MsoNormal">+struct scsi_pointer {<o:p></o:p></p>
<p class="MsoNormal">+             char *ptr;                            /* data pointer */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * ScsiLun: 8 byte LUN.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+struct scsi_lun {<o:p></o:p></p>
<p class="MsoNormal">+             __u8 scsilun[8];<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct scsi_cmnd<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             struct scsi_device *device;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             enum dma_data_direction sc_data_direction;<o:p></o:p></p>
<p class="MsoNormal">+             unsigned short cmd_len;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    void (*scsi_done) (struct scsi_cmnd *); /* Completion function used by low-level driver */<o:p></o:p></p>
<p class="MsoNormal">+    int result;     /* Status code from lower level driver */<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *cmnd;<o:p></o:p></p>
<p class="MsoNormal">+             struct scsi_data_buffer sdb;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define SCSI_SENSE_BUFFERSIZE          96<o:p></o:p></p>
<p class="MsoNormal">+             unsigned char *sense_buffer;<o:p></o:p></p>
<p class="MsoNormal">+                                                             /* obtained by REQUEST SENSE when<o:p></o:p></p>
<p class="MsoNormal">+                                                             * CHECK CONDITION is received on original<o:p></o:p></p>
<p class="MsoNormal">+                                                             * command (auto-sense) */<o:p></o:p></p>
<p class="MsoNormal">+                                                            
<o:p></o:p></p>
<p class="MsoNormal">+             struct scsi_pointer SCp; /* Scratchpad used by some host adapters */<o:p></o:p></p>
<p class="MsoNormal">+    void *srb; /* windows SRB */<o:p></o:p></p>
<p class="MsoNormal">+    void *win_dev; /* windows device extension */<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned scsi_bufflen(struct scsi_cmnd *cmd)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return cmd->sdb.length;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return cmd->sdb.table.nents;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static inline struct scatterlist *scsi_sglist(struct scsi_cmnd *cmd)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return cmd->sdb.table.sgl;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Midlevel queue return values.<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+#define SCSI_MLQUEUE_HOST_BUSY   0x1055<o:p></o:p></p>
<p class="MsoNormal">+#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056<o:p></o:p></p>
<p class="MsoNormal">+#define SCSI_MLQUEUE_EH_RETRY    0x1057<o:p></o:p></p>
<p class="MsoNormal">+#define SCSI_MLQUEUE_TARGET_BUSY 0x1058<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Host byte codes<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define DID_OK          0x00         /* NO error                                */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_NO_CONNECT  0x01          /* Couldn't connect before timeout period  */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_BUS_BUSY    0x02               /* BUS stayed busy through time out period */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_TIME_OUT    0x03               /* TIMED OUT for other reason              */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_BAD_TARGET  0x04            /* BAD target.                             */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_ABORT       0x05    /* Told to abort for some other reason     */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_PARITY      0x06     /* Parity error                            */<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+#define DID_ERROR       0x07    /* Internal error                          */<o:p></o:p></span></p>
<p class="MsoNormal">+#define DID_RESET       0x08      /* Reset by somebody.                      */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_BAD_INTR    0x09                /* Got an interrupt we weren't expecting.  */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_PASSTHROUGH 0x0a         /* Force command past mid-layer            */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_SOFT_ERROR  0x0b            /* The low level driver just wish a retry  */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_IMM_RETRY   0x0c             /* Retry without decrementing retry count  */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_REQUEUE               0x0d      /* Requeue command (no immediate retry) also<o:p></o:p></p>
<p class="MsoNormal">+                                                             * without decrementing the retry count                 */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_TRANSPORT_DISRUPTED 0x0e /* Transport error disrupted execution<o:p></o:p></p>
<p class="MsoNormal">+                                                                   * and the driver blocked the port to<o:p></o:p></p>
<p class="MsoNormal">+                                                                   * recover the link. Transport class will<o:p></o:p></p>
<p class="MsoNormal">+                                                                   * retry or fail IO */<o:p></o:p></p>
<p class="MsoNormal">+#define DID_TRANSPORT_FAILFAST    0x0f /* Transport class fastfailed the io */<o:p></o:p></p>
<p class="MsoNormal">+#define DRIVER_OK       0x00    /* Driver status                           */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/l2w/ib_pack.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/l2w/ib_pack.h              (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/l2w/ib_pack.h           (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,286 @@<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">+ * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">+ * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">+ * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">+ * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">+ *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">+ *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">+ *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">+ *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">+ *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">+ * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * $Id: ib_pack.h 1349 2004-12-16 21:09:43Z roland $<o:p></o:p></p>
<p class="MsoNormal">+ */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef IB_PACK_H<o:p></o:p></p>
<p class="MsoNormal">+#define IB_PACK_H<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//#include "ib_verbs.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+enum {<o:p></o:p></p>
<p class="MsoNormal">+             IB_LRH_BYTES  = 8,<o:p></o:p></p>
<p class="MsoNormal">+             IB_ETH_BYTES  = 14,<o:p></o:p></p>
<p class="MsoNormal">+             IB_GRH_BYTES  = 40,<o:p></o:p></p>
<p class="MsoNormal">+             IB_BTH_BYTES  = 12,<o:p></o:p></p>
<p class="MsoNormal">+             IB_DETH_BYTES = 8<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_field {<o:p></o:p></p>
<p class="MsoNormal">+             size_t struct_offset_bytes;<o:p></o:p></p>
<p class="MsoNormal">+             size_t struct_size_bytes;<o:p></o:p></p>
<p class="MsoNormal">+             int    offset_words;<o:p></o:p></p>
<p class="MsoNormal">+             int    offset_bits;<o:p></o:p></p>
<p class="MsoNormal">+             int    size_bits;<o:p></o:p></p>
<p class="MsoNormal">+             char  *field_name;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define RESERVED \<o:p></o:p></p>
<p class="MsoNormal">+             .field_name          = "reserved"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ * This macro cleans up the definitions of constants for BTH opcodes.<o:p></o:p></p>
<p class="MsoNormal">+ * It is used to define constants such as IB_OPCODE_UD_SEND_ONLY,<o:p></o:p></p>
<p class="MsoNormal">+ * which becomes IB_OPCODE_UD + IB_OPCODE_SEND_ONLY, and this gives<o:p></o:p></p>
<p class="MsoNormal">+ * the correct value.<o:p></o:p></p>
<p class="MsoNormal">+ *<o:p></o:p></p>
<p class="MsoNormal">+ * In short, user code should use the constants defined using the<o:p></o:p></p>
<p class="MsoNormal">+ * macro rather than worrying about adding together other constants.<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+#define IB_OPCODE(transport, op) \<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_ ## transport ## _ ## op = \<o:p></o:p></p>
<p class="MsoNormal">+                             IB_OPCODE_ ## transport + IB_OPCODE_ ## op<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+enum {<o:p></o:p></p>
<p class="MsoNormal">+             /* transport types -- just used to define real constants */<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+             IB_OPCODE_RC                                = 0x00,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             IB_OPCODE_UC                                = 0x20,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             IB_OPCODE_RD                                = 0x40,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             IB_OPCODE_UD                                = 0x60,<o:p></o:p></span></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* operations -- just used to define real constants */<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_SEND_FIRST                        = 0x00,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_SEND_MIDDLE                       = 0x01,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_SEND_LAST                         = 0x02,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_SEND_LAST_WITH_IMMEDIATE          = 0x03,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_SEND_ONLY                         = 0x04,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_SEND_ONLY_WITH_IMMEDIATE          = 0x05,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_WRITE_FIRST                  = 0x06,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_WRITE_MIDDLE                 = 0x07,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_WRITE_LAST                   = 0x08,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE    = 0x09,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_WRITE_ONLY                   = 0x0a,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE    = 0x0b,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_READ_REQUEST                 = 0x0c,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_READ_RESPONSE_FIRST          = 0x0d,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_READ_RESPONSE_MIDDLE         = 0x0e,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_READ_RESPONSE_LAST           = 0x0f,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_RDMA_READ_RESPONSE_ONLY           = 0x10,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_ACKNOWLEDGE                       = 0x11,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_ATOMIC_ACKNOWLEDGE                = 0x12,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_COMPARE_SWAP                      = 0x13,<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE_FETCH_ADD                         = 0x14,<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* real constants follow -- see comment about above IB_OPCODE()<o:p></o:p></p>
<p class="MsoNormal">+                macro for more details */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* RC */<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, SEND_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, SEND_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, SEND_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, SEND_LAST_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, SEND_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, SEND_ONLY_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_WRITE_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_WRITE_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_WRITE_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_WRITE_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_READ_REQUEST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_READ_RESPONSE_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_READ_RESPONSE_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_READ_RESPONSE_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, RDMA_READ_RESPONSE_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, ACKNOWLEDGE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, ATOMIC_ACKNOWLEDGE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, COMPARE_SWAP),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RC, FETCH_ADD),<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* UC */<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, SEND_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, SEND_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, SEND_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, SEND_LAST_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, SEND_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, SEND_ONLY_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, RDMA_WRITE_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, RDMA_WRITE_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, RDMA_WRITE_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, RDMA_WRITE_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* RD */<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, SEND_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, SEND_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, SEND_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, SEND_LAST_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, SEND_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, SEND_ONLY_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_WRITE_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_WRITE_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_WRITE_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_WRITE_LAST_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_WRITE_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_WRITE_ONLY_WITH_IMMEDIATE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_READ_REQUEST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_READ_RESPONSE_FIRST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_READ_RESPONSE_MIDDLE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_READ_RESPONSE_LAST),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, RDMA_READ_RESPONSE_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, ACKNOWLEDGE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, ATOMIC_ACKNOWLEDGE),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, COMPARE_SWAP),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(RD, FETCH_ADD),<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* UD */<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UD, SEND_ONLY),<o:p></o:p></p>
<p class="MsoNormal">+             IB_OPCODE(UD, SEND_ONLY_WITH_IMMEDIATE)<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+enum {<o:p></o:p></p>
<p class="MsoNormal">+             IB_LNH_RAW        = 0,<o:p></o:p></p>
<p class="MsoNormal">+             IB_LNH_IP         = 1,<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+             IB_LNH_IBA_LOCAL  = 2,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             IB_LNH_IBA_GLOBAL = 3<o:p></o:p></span></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+union ib_gid {<o:p></o:p></p>
<p class="MsoNormal">+             u8           raw[16];<o:p></o:p></p>
<p class="MsoNormal">+             struct {<o:p></o:p></p>
<p class="MsoNormal">+                             __be64 subnet_prefix;<o:p></o:p></p>
<p class="MsoNormal">+                             __be64 interface_id;<o:p></o:p></p>
<p class="MsoNormal">+             } global;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_unpacked_lrh {<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+             u8        virtual_lane;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             u8        link_version;<o:p></o:p></span></p>
<p class="MsoNormal">+             u8        service_level;<o:p></o:p></p>
<p class="MsoNormal">+             u8        link_next_header;<o:p></o:p></p>
<p class="MsoNormal">+             __be16    destination_lid;<o:p></o:p></p>
<p class="MsoNormal">+             __be16    packet_length;<o:p></o:p></p>
<p class="MsoNormal">+             __be16    source_lid;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_unpacked_grh {<o:p></o:p></p>
<p class="MsoNormal">+             u8                ip_version;<o:p></o:p></p>
<p class="MsoNormal">+             u8                traffic_class;<o:p></o:p></p>
<p class="MsoNormal">+             __be32                      flow_label;<o:p></o:p></p>
<p class="MsoNormal">+             __be16       payload_length;<o:p></o:p></p>
<p class="MsoNormal">+             u8                next_header;<o:p></o:p></p>
<p class="MsoNormal">+             u8                hop_limit;<o:p></o:p></p>
<p class="MsoNormal">+             union ib_gid source_gid;<o:p></o:p></p>
<p class="MsoNormal">+             union ib_gid destination_gid;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_unpacked_bth {<o:p></o:p></p>
<p class="MsoNormal">+             u8           opcode;<o:p></o:p></p>
<p class="MsoNormal">+             u8           solicited_event;<o:p></o:p></p>
<p class="MsoNormal">+             u8           mig_req;<o:p></o:p></p>
<p class="MsoNormal">+             u8           pad_count;<o:p></o:p></p>
<p class="MsoNormal">+             u8           transport_header_version;<o:p></o:p></p>
<p class="MsoNormal">+             __be16       pkey;<o:p></o:p></p>
<p class="MsoNormal">+             __be32       destination_qpn;<o:p></o:p></p>
<p class="MsoNormal">+             u8           ack_req;<o:p></o:p></p>
<p class="MsoNormal">+             __be32       psn;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_unpacked_deth {<o:p></o:p></p>
<p class="MsoNormal">+             __be32       qkey;<o:p></o:p></p>
<p class="MsoNormal">+             __be32       source_qpn;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_unpacked_eth {<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+             u8           dmac_h[4];<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             u8           dmac_l[2];<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             u8           smac_h[2];<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+             u8           smac_l[4];<o:p></o:p></span></p>
<p class="MsoNormal">+             __be16 type;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct ib_ud_header {<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_lrh  lrh;<o:p></o:p></p>
<p class="MsoNormal">+             int                     grh_present;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_grh  grh;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_bth  bth;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_deth deth;<o:p></o:p></p>
<p class="MsoNormal">+             int                                           immediate_present;<o:p></o:p></p>
<p class="MsoNormal">+             __be32                                 immediate_data;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct eth_ud_header {<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_eth  eth;<o:p></o:p></p>
<p class="MsoNormal">+             int                     grh_present;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_grh  grh;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_bth  bth;<o:p></o:p></p>
<p class="MsoNormal">+             struct ib_unpacked_deth deth;<o:p></o:p></p>
<p class="MsoNormal">+             int                                           immediate_present;<o:p></o:p></p>
<p class="MsoNormal">+             __be32                                 immediate_data;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void ib_pack(const struct ib_field        *desc,<o:p></o:p></p>
<p class="MsoNormal">+                  int                           desc_len,<o:p></o:p></p>
<p class="MsoNormal">+                  void                         *structure,<o:p></o:p></p>
<p class="MsoNormal">+                  u8                           *buf);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void ib_unpack(const struct ib_field        *desc,<o:p></o:p></p>
<p class="MsoNormal">+                    int                           desc_len,<o:p></o:p></p>
<p class="MsoNormal">+                    void                         *buf,<o:p></o:p></p>
<p class="MsoNormal">+                    void                         *structure);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void ib_ud_header_init(int                          payload_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                    int                                       grh_present,<o:p></o:p></p>
<p class="MsoNormal">+                                    struct ib_ud_header *header);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void ib_rdmaoe_ud_header_init(int                                       payload_bytes,<o:p></o:p></p>
<p class="MsoNormal">+                                                int                           grh_present,<o:p></o:p></p>
<p class="MsoNormal">+                                                struct eth_ud_header   *header);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int ib_ud_header_pack(struct ib_ud_header *header,<o:p></o:p></p>
<p class="MsoNormal">+                                   void                *buf);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int ib_ud_header_unpack(void                *buf,<o:p></o:p></p>
<p class="MsoNormal">+                                             struct ib_ud_header *header);<o:p></o:p></p>
<p class="MsoNormal">+int ib_lrh_header_pack(struct ib_unpacked_lrh *lrh, void *buf);<o:p></o:p></p>
<p class="MsoNormal">+int ib_lrh_header_unpack(void *buf, struct ib_unpacked_lrh *lrh);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+int rdmaoe_ud_header_pack(struct eth_ud_header *header,<o:p></o:p></p>
<p class="MsoNormal">+                                    void                 *buf);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif /* IB_PACK_H */<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_timer.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_timer.h  (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_timer.h               (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,111 @@<o:p></o:p></p>
<p class="MsoNormal">+#pragma once <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class CGUWorkerThread;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct IGUWorkItem<o:p></o:p></p>
<p class="MsoNormal">+{  <o:p></o:p></p>
<p class="MsoNormal">+    virtual void Execute() = 0;<o:p></o:p></p>
<p class="MsoNormal">+    virtual ~IGUWorkItem();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LONG AddRef(LPCSTR str);<o:p></o:p></p>
<p class="MsoNormal">+    LONG Release(LPCSTR str);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY                                  m_Link;<o:p></o:p></p>
<p class="MsoNormal">+    CGUWorkerThread*                m_pWorkerThread;<o:p></o:p></p>
<p class="MsoNormal">+    LONG                                                             RefCount;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class CGUWorkerThread<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    public:<o:p></o:p></p>
<p class="MsoNormal">+        CGUWorkerThread();<o:p></o:p></p>
<p class="MsoNormal">+        ~CGUWorkerThread();<o:p></o:p></p>
<p class="MsoNormal">+        NDIS_STATUS Start();<o:p></o:p></p>
<p class="MsoNormal">+        void Stop();<o:p></o:p></p>
<p class="MsoNormal">+        void Run();<o:p></o:p></p>
<p class="MsoNormal">+        NDIS_STATUS EnqueueWorkItem(IGUWorkItem *pWorkItem);<o:p></o:p></p>
<p class="MsoNormal">+        NDIS_STATUS DequeueWorkItem(IGUWorkItem *pWorkItem);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    private:<o:p></o:p></p>
<p class="MsoNormal">+        LIST_ENTRY                  m_WorkItems;        <o:p>
</o:p></p>
<p class="MsoNormal">+        KSPIN_LOCK                                            m_Lock;<o:p></o:p></p>
<p class="MsoNormal">+        KEVENT                      m_Event;<o:p></o:p></p>
<p class="MsoNormal">+        bool                        m_bExit;<o:p></o:p></p>
<p class="MsoNormal">+        PVOID                       m_ThreadObject;<o:p></o:p></p>
<p class="MsoNormal">+        bool                        m_bIsStarted;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class CGUTimer;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+  GUTimerFunc(<o:p></o:p></p>
<p class="MsoNormal">+    IN struct _KDPC  *Dpc,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  DeferredContext,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  SystemArgument1,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  SystemArgument2<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class CTimerWorkItem : public IGUWorkItem<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+    void Init(CGUTimer* pTimer)<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+        m_pTimer = pTimer;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    ~CTimerWorkItem()<o:p></o:p></p>
<p class="MsoNormal">+    {<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    void Execute();   <o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+public:    <o:p></o:p></p>
<p class="MsoNormal">+    CGUTimer* m_pTimer;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class CGUTimer<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    CGUTimer();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ~CGUTimer();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             void Initialize(<o:p></o:p></p>
<p class="MsoNormal">+                             CGUWorkerThread *pThread, <o:p>
</o:p></p>
<p class="MsoNormal">+                             IGUWorkItem *pWorkItem, <o:p></o:p></p>
<p class="MsoNormal">+                             ULONG TimerIntervalMillis = 0,<o:p></o:p></p>
<p class="MsoNormal">+        bool  IsPeriodic = true);<o:p></o:p></p>
<p class="MsoNormal">+    void Run();<o:p></o:p></p>
<p class="MsoNormal">+    bool Cancel();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    bool Start();<o:p></o:p></p>
<p class="MsoNormal">+    bool Start(ULONG dwInterval);<o:p></o:p></p>
<p class="MsoNormal">+    void Stop();<o:p></o:p></p>
<p class="MsoNormal">+             void PassiveRun();<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    LONG AddRef(LPCSTR str);<o:p></o:p></p>
<p class="MsoNormal">+    LONG Release(LPCSTR str);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    KTIMER                                                          m_Timer;<o:p></o:p></p>
<p class="MsoNormal">+    KDPC                                                              m_Dpc;   
<o:p></o:p></p>
<p class="MsoNormal">+    KEVENT                                                         m_Event;<o:p></o:p></p>
<p class="MsoNormal">+    LONG                                                             m_RefCount;<o:p></o:p></p>
<p class="MsoNormal">+    ULONG                                                          m_TimerIntervalMillis;<o:p></o:p></p>
<p class="MsoNormal">+    CGUWorkerThread*                m_pThread;<o:p></o:p></p>
<p class="MsoNormal">+    IGUWorkItem*                          m_pWorkItem;<o:p></o:p></p>
<p class="MsoNormal">+    bool                                                                m_bExit;<o:p></o:p></p>
<p class="MsoNormal">+    bool                                                                m_IsPeriodic;<o:p></o:p></p>
<p class="MsoNormal">+             LARGE_INTEGER                              m_LastRunTime;<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             shutter_t                                             m_cancel;<o:p></o:p></p>
<p class="MsoNormal">+    CTimerWorkItem      m_TimerWorkItem;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_utils.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_utils.h    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_utils.h (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,629 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    GenUtils.h<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+#include "gu_precomp.h"<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define GU_SET_FLAG(_M, _F)         ((_M)->Flags |= (_F))  
<o:p></o:p></p>
<p class="MsoNormal">+#define GU_CLEAR_FLAG(_M, _F)       ((_M)->Flags &= ~(_F))<o:p></o:p></p>
<p class="MsoNormal">+#define GU_CLEAR_FLAGS(_M)          ((_M)->Flags = 0)<o:p></o:p></p>
<p class="MsoNormal">+#define GU_TEST_FLAG(_M, _F)        (((_M)->Flags & (_F)) != 0)<o:p></o:p></p>
<p class="MsoNormal">+#define GU_TEST_FLAGS(_M, _F)       (((_M)->Flags & (_F)) == (_F))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// max. length of full pathname<o:p></o:p></p>
<p class="MsoNormal">+#define MAX_PATH   260<o:p></o:p></p>
<p class="MsoNormal">+#define MAX_LONG_VALUE 0x7FFFFFFF<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BITS_PER_LONG                           32<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define GLOBAL_ALLOCATION_TAG 'XtoC'<o:p></o:p></p>
<p class="MsoNormal">+#define SIZE_OF(A) (sizeof(A)/sizeof(A[0]))<o:p></o:p></p>
<p class="MsoNormal">+#define FLOOR_4_MASK 0xFFFFFFFC<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define BUFFER_SIZE   100<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// In units of ms<o:p></o:p></p>
<p class="MsoNormal">+uint64_t  GetTickCountInMsec();<o:p></o:p></p>
<p class="MsoNormal">+unsigned __int64 GetTickCountInNsec();<o:p></o:p></p>
<p class="MsoNormal">+uint64_t GetTimeStamp(void);<o:p></o:p></p>
<p class="MsoNormal">+LARGE_INTEGER TimeFromLong(ULONG HandredNanos);<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS Sleep(ULONG HandredNanos);<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS GenUtilsInit();<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+u32 ROUNDUP_LOG2(u32 arg);<o:p></o:p></span></p>
<p class="MsoNormal">+void guid_to_str(u64 guid, WCHAR* pstr, DWORD BufLen);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+FORCEINLINE const u32 H_TO_BE(const u32 src)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return src << 24 | <o:p></o:p></p>
<p class="MsoNormal">+           ((src << 8 ) & 0xff0000) | <o:p></o:p></p>
<p class="MsoNormal">+           ((src >> 8 ) & 0xff00) |<o:p></o:p></p>
<p class="MsoNormal">+           (src >> 24);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+inline UINT Floor_4(UINT value)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return value&FLOOR_4_MASK;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS GenUtilsInit();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct AllocateSharedMemoryDeleteInfo {<o:p></o:p></p>
<p class="MsoNormal">+    ULONG  Length;<o:p></o:p></p>
<p class="MsoNormal">+    BOOLEAN  Cached;<o:p></o:p></p>
<p class="MsoNormal">+    PVOID  VirtualAddress;<o:p></o:p></p>
<p class="MsoNormal">+    NDIS_PHYSICAL_ADDRESS  PhysicalAddress;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef NDIS620_MINIPORT<o:p></o:p></p>
<p class="MsoNormal">+             BOOLEAN                            fVMQ;<o:p></o:p></p>
<p class="MsoNormal">+             NDIS_HANDLE AllocationHandle;<o:p></o:p></p>
<p class="MsoNormal">+             NDIS_HANDLE SharedMemoryHandle;<o:p></o:p></p>
<p class="MsoNormal">+             ULONG                 SharedMemoryOffset;<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+DbgPrintIpAddress(<o:p></o:p></p>
<p class="MsoNormal">+    LPCSTR str_description,<o:p></o:p></p>
<p class="MsoNormal">+    u8 ipAddress[],<o:p></o:p></p>
<p class="MsoNormal">+    unsigned int traceLevel<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+DbgPrintMacAddress(<o:p></o:p></p>
<p class="MsoNormal">+    LPCSTR str_description,<o:p></o:p></p>
<p class="MsoNormal">+    u8 macAddress[],<o:p></o:p></p>
<p class="MsoNormal">+    unsigned int traceLevel<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS <o:p></o:p></p>
<p class="MsoNormal">+ReadRegistryDword(<o:p></o:p></p>
<p class="MsoNormal">+    LPCWSTR pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+    LPCWSTR pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+    LPCWSTR pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+    ULONG DefaultVal,<o:p></o:p></p>
<p class="MsoNormal">+    LONG *pVal<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS <o:p></o:p></p>
<p class="MsoNormal">+ReadRegStrRegistryValueInNonPagedMemory(<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+    IN UINT flags,<o:p></o:p></p>
<p class="MsoNormal">+    OUT LPWSTR* pWstr<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS ReadRegistryValue(<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszRegistryPath,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszSuffix,<o:p></o:p></p>
<p class="MsoNormal">+    IN LPCWSTR pszValueName,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG DefaultValueType,<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID DefaultVal,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG DefaultValLength,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG Flags,<o:p></o:p></p>
<p class="MsoNormal">+    OUT PVOID pVal<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// This is simply a wrapper to the LIST_ENTRY class that allows
<o:p></o:p></p>
<p class="MsoNormal">+// easier work with this list<o:p></o:p></p>
<p class="MsoNormal">+class LinkedList {<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+    LinkedList() {<o:p></o:p></p>
<p class="MsoNormal">+       size = 0;<o:p></o:p></p>
<p class="MsoNormal">+       InitializeListHead(&m_Data);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    // Only used when the constructor can not be used.<o:p></o:p></p>
<p class="MsoNormal">+    VOID Init() {<o:p></o:p></p>
<p class="MsoNormal">+       size = 0;<o:p></o:p></p>
<p class="MsoNormal">+       InitializeListHead(&m_Data);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    DWORD Size() {return size;}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY *RemoveHeadList() {<o:p></o:p></p>
<p class="MsoNormal">+        LIST_ENTRY *pTemp;<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(size > 0);<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(!IsListEmpty(&m_Data));<o:p></o:p></p>
<p class="MsoNormal">+        pTemp = ::RemoveHeadList(&m_Data);<o:p></o:p></p>
<p class="MsoNormal">+        size--;<o:p></o:p></p>
<p class="MsoNormal">+        return pTemp;        <o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY *RemoveTailList() {<o:p></o:p></p>
<p class="MsoNormal">+        LIST_ENTRY *pTemp;<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(size > 0);<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(!IsListEmpty(&m_Data));<o:p></o:p></p>
<p class="MsoNormal">+        pTemp = ::RemoveTailList(&m_Data);<o:p></o:p></p>
<p class="MsoNormal">+        size--;<o:p></o:p></p>
<p class="MsoNormal">+        return pTemp;        <o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    VOID InsertTailList (LIST_ENTRY *Item) {<o:p></o:p></p>
<p class="MsoNormal">+#if DBG        <o:p></o:p></p>
<p class="MsoNormal">+        // Before we insert, we have to verify that the object is not in the list<o:p></o:p></p>
<p class="MsoNormal">+        LIST_ENTRY *current = m_Data.Flink;<o:p></o:p></p>
<p class="MsoNormal">+        while (current != & m_Data) {<o:p></o:p></p>
<p class="MsoNormal">+            ASSERT(current != Item);<o:p></o:p></p>
<p class="MsoNormal">+            current = current->Flink;<o:p></o:p></p>
<p class="MsoNormal">+        }        <o:p></o:p></p>
<p class="MsoNormal">+#endif        <o:p></o:p></p>
<p class="MsoNormal">+        ::InsertTailList(&m_Data, Item);<o:p></o:p></p>
<p class="MsoNormal">+        size++;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    VOID InsertHeadList (LIST_ENTRY *Item) {<o:p></o:p></p>
<p class="MsoNormal">+#if DBG        <o:p></o:p></p>
<p class="MsoNormal">+        // Before we insert, we have to verify that the object is not in the list<o:p></o:p></p>
<p class="MsoNormal">+        LIST_ENTRY *current = m_Data.Flink;<o:p></o:p></p>
<p class="MsoNormal">+        while (current != & m_Data) {<o:p></o:p></p>
<p class="MsoNormal">+            ASSERT(current != Item);<o:p></o:p></p>
<p class="MsoNormal">+            current = current->Flink;<o:p></o:p></p>
<p class="MsoNormal">+        }        <o:p></o:p></p>
<p class="MsoNormal">+#endif        <o:p></o:p></p>
<p class="MsoNormal">+        ::InsertHeadList(&m_Data, Item);<o:p></o:p></p>
<p class="MsoNormal">+        size++;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY *Head() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(size > 0);<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(!IsListEmpty(&m_Data));<o:p></o:p></p>
<p class="MsoNormal">+        return m_Data.Flink;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY *Tail() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(size > 0);<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(!IsListEmpty(&m_Data));<o:p></o:p></p>
<p class="MsoNormal">+        return m_Data.Blink;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY *RawHead() {<o:p></o:p></p>
<p class="MsoNormal">+        // Return the head of the list without any checks, <o:p>
</o:p></p>
<p class="MsoNormal">+        // needed in order to use it as in iterator<o:p></o:p></p>
<p class="MsoNormal">+        return m_Data.Flink;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    bool IsAfterTheLast(LIST_ENTRY *pEntry) {<o:p></o:p></p>
<p class="MsoNormal">+        if (size == 0) {<o:p></o:p></p>
<p class="MsoNormal">+            return true;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        return &m_Data == pEntry;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    VOID RemoveEntryList(LIST_ENTRY *Item) {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(size > 0);<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(!IsListEmpty(&m_Data));        <o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+        // Verify that this item is indeed in the list<o:p></o:p></p>
<p class="MsoNormal">+        LIST_ENTRY *current = m_Data.Flink;<o:p></o:p></p>
<p class="MsoNormal">+    while (current != Item) {<o:p></o:p></p>
<p class="MsoNormal">+        if (current == & m_Data) {<o:p></o:p></p>
<p class="MsoNormal">+            ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+            //SDP_PRINT(TRACE_LEVEL_ERROR ,SDP_BUFFER_POOL ,("Object is not in the list\n"));<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        current = current->Flink;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+        ::RemoveEntryList(Item);<o:p></o:p></p>
<p class="MsoNormal">+        size--;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    DWORD size;<o:p></o:p></p>
<p class="MsoNormal">+    LIST_ENTRY m_Data;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//--------------------------------------<o:p></o:p></p>
<p class="MsoNormal">+// Queue structure and macros<o:p></o:p></p>
<p class="MsoNormal">+//--------------------------------------<o:p></o:p></p>
<p class="MsoNormal">+typedef struct _QUEUE_ENTRY<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct _QUEUE_ENTRY *Next;<o:p></o:p></p>
<p class="MsoNormal">+} QUEUE_ENTRY, *PQUEUE_ENTRY;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef struct _QUEUE_HEADER<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    PQUEUE_ENTRY Head;<o:p></o:p></p>
<p class="MsoNormal">+    PQUEUE_ENTRY Tail;<o:p></o:p></p>
<p class="MsoNormal">+} QUEUE_HEADER, *PQUEUE_HEADER;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define InitializeQueueHeader(QueueHeader)                 \<o:p></o:p></p>
<p class="MsoNormal">+    {                                                      \<o:p></o:p></p>
<p class="MsoNormal">+        (QueueHeader)->Head = (QueueHeader)->Tail = NULL;  \<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define IsQueueEmpty(QueueHeader) ((QueueHeader)->Head == NULL)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define RemoveHeadQueue(QueueHeader)                  \<o:p></o:p></p>
<p class="MsoNormal">+    (QueueHeader)->Head;                              \<o:p></o:p></p>
<p class="MsoNormal">+    {                                                 \<o:p></o:p></p>
<p class="MsoNormal">+        PQUEUE_ENTRY pNext;                           \<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT((QueueHeader)->Head);                  \<o:p></o:p></p>
<p class="MsoNormal">+        pNext = (QueueHeader)->Head->Next;            \<o:p></o:p></p>
<p class="MsoNormal">+        (QueueHeader)->Head = pNext;                  \<o:p></o:p></p>
<p class="MsoNormal">+        if (pNext == NULL)                            \<o:p></o:p></p>
<p class="MsoNormal">+            (QueueHeader)->Tail = NULL;               \<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define InsertHeadQueue(QueueHeader, QueueEntry)                \<o:p></o:p></p>
<p class="MsoNormal">+    {                                                           \<o:p></o:p></p>
<p class="MsoNormal">+        ((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \<o:p></o:p></p>
<p class="MsoNormal">+        (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \<o:p></o:p></p>
<p class="MsoNormal">+        if ((QueueHeader)->Tail == NULL)                        \<o:p></o:p></p>
<p class="MsoNormal">+            (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);   \<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define InsertTailQueue(QueueHeader, QueueEntry)                     \<o:p></o:p></p>
<p class="MsoNormal">+    {                                                                \<o:p></o:p></p>
<p class="MsoNormal">+        ((PQUEUE_ENTRY)QueueEntry)->Next = NULL;                     \<o:p></o:p></p>
<p class="MsoNormal">+        if ((QueueHeader)->Tail)                                     \<o:p></o:p></p>
<p class="MsoNormal">+            (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry);  \<o:p></o:p></p>
<p class="MsoNormal">+        else                                                         \<o:p></o:p></p>
<p class="MsoNormal">+            (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);        \<o:p></o:p></p>
<p class="MsoNormal">+        (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);            \<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ETH_IS_LOCALLY_ADMINISTERED(Address) \<o:p></o:p></p>
<p class="MsoNormal">+    (BOOLEAN)(((PUCHAR)(Address))[0] & ((UCHAR)0x02))<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// A simpale static array (for now)<o:p></o:p></p>
<p class="MsoNormal">+class Array {<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Init(int MaxNumberofPackets);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    VOID Shutdown() {<o:p></o:p></p>
<p class="MsoNormal">+        delete[]m_pData;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    Array() {<o:p></o:p></p>
<p class="MsoNormal">+        m_Count = 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    void Add(void *ptr) {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_Count < (int)m_Size);<o:p></o:p></p>
<p class="MsoNormal">+        m_pData[m_Count++] = ptr;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    int GetCount() {return m_Count;}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    void *GetPtr(int Place) {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(Place < m_Count);<o:p></o:p></p>
<p class="MsoNormal">+        return m_pData[Place];<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    void Reset() {<o:p></o:p></p>
<p class="MsoNormal">+        m_Count = 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    int m_Count;<o:p></o:p></p>
<p class="MsoNormal">+    void **m_pData;<o:p></o:p></p>
<p class="MsoNormal">+    UINT m_Size; // For Debug only<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if 0<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+/*<o:p></o:p></p>
<p class="MsoNormal">+ This class is used for freeing the sent packets.<o:p></o:p></p>
<p class="MsoNormal">+ It is based on the assumpation that this happens at raised irql and therefore,<o:p></o:p></p>
<p class="MsoNormal">+ if we allocate a data structure fro each processor we should be fine<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+*/<o:p></o:p></p>
<p class="MsoNormal">+class ProcessorArray {<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ProcessorArray() {<o:p></o:p></p>
<p class="MsoNormal">+        m_Arrays = NULL;<o:p></o:p></p>
<p class="MsoNormal">+        m_NumberOfProcessors = 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Init(int MaxNumberofPackets);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    VOID Shutdown() {<o:p></o:p></p>
<p class="MsoNormal">+        if (m_Arrays) {<o:p></o:p></p>
<p class="MsoNormal">+            u32 j;<o:p></o:p></p>
<p class="MsoNormal">+            for (j=0; j< m_NumberOfProcessors; j++) {<o:p></o:p></p>
<p class="MsoNormal">+                m_Arrays[j].Shutdown();<o:p></o:p></p>
<p class="MsoNormal">+            }<o:p></o:p></p>
<p class="MsoNormal">+            delete []m_Arrays;<o:p></o:p></p>
<p class="MsoNormal">+            m_Arrays = NULL;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        m_NumberOfProcessors = 0;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    Array *GetArray() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT( KeGetCurrentIrql()== DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+        ULONG pn = KeGetCurrentProcessorNumber();<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(pn < m_NumberOfProcessors);<o:p></o:p></p>
<p class="MsoNormal">+        m_Arrays[pn].Reset();<o:p></o:p></p>
<p class="MsoNormal">+        return &m_Arrays[pn];<o:p></o:p></p>
<p class="MsoNormal">+            <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    Array *m_Arrays;<o:p></o:p></p>
<p class="MsoNormal">+    ULONG m_NumberOfProcessors;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if DBG        <o:p></o:p></p>
<p class="MsoNormal">+class VERIFY_DISPATCH_LEVEL {<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(KIRQL irql = -1) {<o:p></o:p></p>
<p class="MsoNormal">+        if (irql != (KIRQL)-1) {<o:p></o:p></p>
<p class="MsoNormal">+            ASSERT(KeGetCurrentIrql() ==  irql);<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+        StartLevel = KeGetCurrentIrql();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ~VERIFY_DISPATCH_LEVEL() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(KeGetCurrentIrql() ==  StartLevel);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    KIRQL StartLevel;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+class VERIFY_DISPATCH_LEVEL {<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+    VERIFY_DISPATCH_LEVEL(KIRQL irql = -1) {}<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+#endif // DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+template <class T><o:p></o:p></p>
<p class="MsoNormal">+class FIFO {<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    NTSTATUS Init(int MaxSize);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    FIFO() {<o:p></o:p></p>
<p class="MsoNormal">+        m_pData = NULL;<o:p></o:p></p>
<p class="MsoNormal">+        m_Head = 0;<o:p></o:p></p>
<p class="MsoNormal">+        m_Tail = 0;<o:p></o:p></p>
<p class="MsoNormal">+        m_Size = 0;<o:p></o:p></p>
<p class="MsoNormal">+        m_Count = 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ~FIFO() {<o:p></o:p></p>
<p class="MsoNormal">+        Shutdown();<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    VOID Shutdown() {<o:p></o:p></p>
<p class="MsoNormal">+        if(m_pData != <span lang="ES-AR">NULL) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+            delete []m_pData;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+            m_pData = NULL;<o:p></o:p></span></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    VOID Push(T pNewItem) {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_Count < m_Size);<o:p></o:p></p>
<p class="MsoNormal">+        m_pData[m_Head++] = pNewItem;<o:p></o:p></p>
<p class="MsoNormal">+        if(m_Head == m_Size) {<o:p></o:p></p>
<p class="MsoNormal">+            m_Head = 0;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        m_Count++;<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_Count <= m_Size);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    T Pop() {<o:p></o:p></p>
<p class="MsoNormal">+        VOID *pRet = m_pData[m_Tail++];<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_Count > 0);<o:p></o:p></p>
<p class="MsoNormal">+        if(m_Tail == m_Size) {<o:p></o:p></p>
<p class="MsoNormal">+            m_Tail = 0;<o:p></o:p></p>
<p class="MsoNormal">+        }<o:p></o:p></p>
<p class="MsoNormal">+        m_Count--;<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_Count >= 0);<o:p></o:p></p>
<p class="MsoNormal">+        return pRet;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    int Count() {<o:p></o:p></p>
<p class="MsoNormal">+        return m_Count;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    bool IsFull() {<o:p></o:p></p>
<p class="MsoNormal">+        return m_Size == m_Count;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    bool IsEmpty() {<o:p></o:p></p>
<p class="MsoNormal">+        return m_Count == 0;<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+    T     *m_pData;<o:p></o:p></p>
<p class="MsoNormal">+    int    m_Head;<o:p></o:p></p>
<p class="MsoNormal">+    int    m_Tail;<o:p></o:p></p>
<p class="MsoNormal">+    int    m_Size;<o:p></o:p></p>
<p class="MsoNormal">+    int    m_Count;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define SIZEOF_IN_BITS(_type) (8 * sizeof(_type))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class Bitmap<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             static bool Set(ULONG* pData, ULONG BitIndex)<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             if(pData == NULL)<o:p></o:p></p>
<p class="MsoNormal">+                             {<o:p></o:p></p>
<p class="MsoNormal">+                                             return false;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             ULONG Offset = BitIndex / SIZEOF_IN_BITS(ULONG);<o:p></o:p></p>
<p class="MsoNormal">+                             ULONG Bit = (BitIndex % SIZEOF_IN_BITS(ULONG));<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if(pData[Offset] & (1 << Bit))<o:p></o:p></p>
<p class="MsoNormal">+                             {// already set<o:p></o:p></p>
<p class="MsoNormal">+                                             return false;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             pData[Offset] |= 1 << Bit;<o:p></o:p></p>
<p class="MsoNormal">+                             return true;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             static bool Clear(ULONG* pData, ULONG BitIndex)<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             if(pData == NULL)<o:p></o:p></p>
<p class="MsoNormal">+                             {<o:p></o:p></p>
<p class="MsoNormal">+                                             return false;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             ULONG Offset = BitIndex / SIZEOF_IN_BITS(ULONG);<o:p></o:p></p>
<p class="MsoNormal">+                             ULONG Bit = (BitIndex % SIZEOF_IN_BITS(ULONG));<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if((pData[Offset] & (1 << Bit)) == 0)<o:p></o:p></p>
<p class="MsoNormal">+                             {// already clear<o:p></o:p></p>
<p class="MsoNormal">+                                             return false;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             pData[Offset] &= ~(1 << Bit);<o:p></o:p></p>
<p class="MsoNormal">+                             return true;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             static bool Test(ULONG* pData, ULONG BitIndex)<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             if(pData == NULL)<o:p></o:p></p>
<p class="MsoNormal">+                             {// out of range<o:p></o:p></p>
<p class="MsoNormal">+                                             return false;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             ULONG Offset = BitIndex / SIZEOF_IN_BITS(ULONG);<o:p></o:p></p>
<p class="MsoNormal">+                             ULONG Bit = (BitIndex % SIZEOF_IN_BITS(ULONG));<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             return (pData[Offset] & (1 << Bit)) != 0;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+///////////////////////////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+// Tracer Class                                                              //<o:p></o:p></p>
<p class="MsoNormal">+///////////////////////////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+enum EventType {<o:p></o:p></p>
<p class="MsoNormal">+    PROCESS_RX_START,<o:p></o:p></p>
<p class="MsoNormal">+    PROCESS_RX_END,<o:p></o:p></p>
<p class="MsoNormal">+    PROCESS_RX_INTERNAL_START,<o:p></o:p></p>
<p class="MsoNormal">+    PROCESS_RX_INTERNAL_START_SKIPING,<o:p></o:p></p>
<p class="MsoNormal">+    COMPLEATD_INDICATING,<o:p></o:p></p>
<p class="MsoNormal">+    MP_PORT_SEND_PACKETS<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+const int MAX_EVENTS = 10000;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class Tracer {<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    VOID Init();<o:p></o:p></p>
<p class="MsoNormal">+    VOID AddEvent(EventType Event, int ExtraData);<o:p></o:p></p>
<p class="MsoNormal">+    void Printxx() ;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct data {<o:p></o:p></p>
<p class="MsoNormal">+    uint64_t  TimeStamp;<o:p></o:p></p>
<p class="MsoNormal">+    EventType Event;<o:p></o:p></p>
<p class="MsoNormal">+    int       ExtraData;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    data m_data[MAX_EVENTS];<o:p></o:p></p>
<p class="MsoNormal">+    int m_CurrentLocation;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+class CSpinLockWrapper {<o:p></o:p></p>
<p class="MsoNormal">+    KSPIN_LOCK m_SpinLock;<o:p></o:p></p>
<p class="MsoNormal">+    KIRQL  m_OldIrql;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+public:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    CSpinLockWrapper (KSPIN_LOCK &SpinLock) : m_SpinLock(SpinLock){<o:p></o:p></p>
<p class="MsoNormal">+        // Spinlock must already be initialized<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+        m_OldIrql = 0xff;<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    void Lock() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_OldIrql == 0xff);<o:p></o:p></p>
<p class="MsoNormal">+        KeAcquireSpinLock(&m_SpinLock, &m_OldIrql);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    void Unlock() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_OldIrql != 0xff);<o:p></o:p></p>
<p class="MsoNormal">+        KeReleaseSpinLock(&m_SpinLock, m_OldIrql);<o:p></o:p></p>
<p class="MsoNormal">+#if DBG        <o:p></o:p></p>
<p class="MsoNormal">+        m_OldIrql = 0xff;<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    ~CSpinLockWrapper() {<o:p></o:p></p>
<p class="MsoNormal">+        ASSERT(m_OldIrql == 0xff);<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+USHORT nthos(USHORT in);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS <o:p></o:p></p>
<p class="MsoNormal">+  MyKeWaitForSingleObject(<o:p></o:p></p>
<p class="MsoNormal">+    IN PVOID  Object,<o:p></o:p></p>
<p class="MsoNormal">+    IN KWAIT_REASON  WaitReason,<o:p></o:p></p>
<p class="MsoNormal">+    IN KPROCESSOR_MODE  WaitMode,<o:p></o:p></p>
<p class="MsoNormal">+    IN BOOLEAN  Alertable,<o:p></o:p></p>
<p class="MsoNormal">+    IN PLARGE_INTEGER  Timeout  OPTIONAL,<o:p></o:p></p>
<p class="MsoNormal">+    IN BOOLEAN ExceptApc = FALSE<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS<o:p></o:p></p>
<p class="MsoNormal">+CopyFromUser(<o:p></o:p></p>
<p class="MsoNormal">+    IN  void* const         p_dest,<o:p></o:p></p>
<p class="MsoNormal">+    IN  const void* const   p_src,<o:p></o:p></p>
<p class="MsoNormal">+    IN  const size_t        count <o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NTSTATUS<o:p></o:p></p>
<p class="MsoNormal">+CopyToUser(<o:p></o:p></p>
<p class="MsoNormal">+             IN           void* const                                         p_dest,<o:p></o:p></p>
<p class="MsoNormal">+             IN           const void* const             p_src,<o:p></o:p></p>
<p class="MsoNormal">+             IN           const size_t                        count
<o:p></o:p></p>
<p class="MsoNormal">+             );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID * MapUserMemory(<o:p></o:p></p>
<p class="MsoNormal">+    IN     PVOID Address, <o:p></o:p></p>
<p class="MsoNormal">+    IN     ULONG size,<o:p></o:p></p>
<p class="MsoNormal">+    OUT PMDL *ppMdl<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID UnMapMemory(<o:p></o:p></p>
<p class="MsoNormal">+    IN  VOID *pKernelAddress,<o:p></o:p></p>
<p class="MsoNormal">+    IN PMDL pMdl<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+VOID UpdateRc(NTSTATUS *rc, NTSTATUS rc1);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_defs.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_defs.h    (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_defs.h (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,107 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_defs.h<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// basic types<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned char                                                u8, __u8;<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned short int       u16, __u16;<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned int                                                   u32, __u32;<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned __int64                         u64, __u64;<o:p></o:p></p>
<p class="MsoNormal">+typedef char                                   s8, __s8;<o:p></o:p></p>
<p class="MsoNormal">+typedef short int           s16, __s16;<o:p></o:p></p>
<p class="MsoNormal">+typedef int                                                       s32, __s32;<o:p></o:p></p>
<p class="MsoNormal">+typedef __int64                             s64, __s64;<o:p></o:p></p>
<p class="MsoNormal">+typedef u16 __be16 ;<o:p></o:p></p>
<p class="MsoNormal">+typedef u32 __be32 ;<o:p></o:p></p>
<p class="MsoNormal">+typedef u64 __be64 ;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef _WIN64<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned __int64 uintn_t;<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned int uintn_t;<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+typedef unsigned __int64        uint64_t;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define be16_to_cpu(a)                            _byteswap_ushort((USHORT)(a))<o:p></o:p></p>
<p class="MsoNormal">+#define be32_to_cpu(a)                            _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define __be16_to_cpu       be16_to_cpu<o:p></o:p></p>
<p class="MsoNormal">+#define __be32_to_cpu       be32_to_cpu<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+u32 inline CL_NTOH32( u32 x ) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+    return (u32)(          <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+        (((u32)(x) & 0x000000FF) << 24) |<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+        (((u32)(x) & 0x0000FF00) << 8) |<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+        (((u32)(x) & 0x00FF0000) >> 8) |<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+        (((u32)(x) & 0xFF000000) >> 24) );<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+#define CL_HTON32                                                    CL_NTOH32<o:p></o:p></span></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef _WIN64<o:p></o:p></p>
<p class="MsoNormal">+#define __cpu_to_be32(x) ((((x) >> 24)&0x000000ff) | (((x) >> 8)&0x0000ff00) | (((x) << 8)&0x00ff0000) | (((x) << 24)&0xff000000))<o:p></o:p></p>
<p class="MsoNormal">+#elif defined(_WIN32)<o:p></o:p></p>
<p class="MsoNormal">+__inline __int32 __cpu_to_be32( __int32 dwX ) <o:p></o:p></p>
<p class="MsoNormal">+{ <o:p></o:p></p>
<p class="MsoNormal">+    _asm    mov     eax, dwX     <o:p></o:p></p>
<p class="MsoNormal">+    _asm    bswap   eax     <o:p></o:p></p>
<p class="MsoNormal">+    _asm    mov     dwX, eax   <o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+    return dwX; <o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+#error unsupported platform<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//#define __cpu_to_be32(x) cpu_to_be32(x)<o:p></o:p></p>
<p class="MsoNormal">+#define __cpu_to_be16(x) cpu_to_be16(x)<o:p></o:p></p>
<p class="MsoNormal">+u16 inline cpu_to_be16(u16 in) {<o:p></o:p></p>
<p class="MsoNormal">+    return in >> 8 | in << 8;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+inline u64 ALIGN64(u64 pAddr, u64 a) {return ((pAddr)+(a)-1)&~((a)-1);}<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+#define XOR(x,y)                          (!(x) != !(y))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+#define XNOR(x,y)                       (!(x) == !(y))<o:p></o:p></span></p>
<p class="MsoNormal">+#define MIN(a, b)                         ((a) < (b) ? (a) : (b))<o:p></o:p></p>
<p class="MsoNormal">+#define MAX(a, b)                        ((a) > (b) ? (a) : (b))<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Convert the mac from the way that windows gives it to the way we want it.<o:p></o:p></p>
<p class="MsoNormal">+inline void mac_to_be64(u64 *dst, u64 *src)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    char *csrc = (char *)src;<o:p></o:p></p>
<p class="MsoNormal">+    char *cdst = (char *)dst;<o:p></o:p></p>
<p class="MsoNormal">+    cdst[0] = csrc[5];<o:p></o:p></p>
<p class="MsoNormal">+    cdst[1] = csrc[4];<o:p></o:p></p>
<p class="MsoNormal">+    cdst[2] = csrc[3];<o:p></o:p></p>
<p class="MsoNormal">+    cdst[3] = csrc[2];<o:p></o:p></p>
<p class="MsoNormal">+    cdst[4] = csrc[1];<o:p></o:p></p>
<p class="MsoNormal">+    cdst[5] = csrc[0];<o:p></o:p></p>
<p class="MsoNormal">+    cdst[6] = 0;<o:p></o:p></p>
<p class="MsoNormal">+    cdst[7] = 0;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+inline u64 be64_to_mac( UCHAR *src)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    u64 dst;<o:p></o:p></p>
<p class="MsoNormal">+    mac_to_be64(&dst,(u64 *)src);<o:p></o:p></p>
<p class="MsoNormal">+    return dst;<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define IS_BIT_SET(val, mask) \<o:p></o:p></p>
<p class="MsoNormal">+    (((val) & (mask)) ? 1 : 0)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_wpptrace.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_wpptrace.h         (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_wpptrace.h      (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,83 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2008 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_wpptrace.h<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This module contains all debug-related code.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Revision History:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_CONTROL_GUIDS \<o:p></o:p></p>
<p class="MsoNormal">+        WPP_DEFINE_CONTROL_GUID(EthrnetGuid,(684E068C, 3FDC, 4bce, 89C3, CDB77A8B75A4),  \<o:p></o:p></p>
<p class="MsoNormal">+        WPP_DEFINE_BIT(GU)                    \<o:p></o:p></p>
<p class="MsoNormal">+        WPP_DEFINE_BIT(GU_INIT))               \<o:p></o:p></p>
<p class="MsoNormal">+        <o:p></o:p></p>
<p class="MsoNormal">+#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level  >= lvl)<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_FLAG_ENABLED(flags)(WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level  >= TRACE_LEVEL_VERBOSE)<o:p></o:p></p>
<p class="MsoNormal">+#define WPP_FLAG_LOGGER(flags) WPP_LEVEL_LOGGER(flags)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// begin_wpp config<o:p></o:p></p>
<p class="MsoNormal">+// GU_ENTER();<o:p></o:p></p>
<p class="MsoNormal">+// GU_EXIT();<o:p></o:p></p>
<p class="MsoNormal">+// USESUFFIX(GU_PRINT, "%!STDPREFIX! %!FUNC!");<o:p></o:p></p>
<p class="MsoNormal">+// GU_PRINT(LEVEL,FLAGS,MSG,...)<o:p></o:p></p>
<p class="MsoNormal">+// USESUFFIX(GU_ENTER, "====>>> %!FUNC! ");<o:p></o:p></p>
<p class="MsoNormal">+// USESUFFIX(GU_EXIT, "<<<====== %!FUNC!]");<o:p></o:p></p>
<p class="MsoNormal">+// end_wpp<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else //defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Debug toppics<o:p></o:p></p>
<p class="MsoNormal">+#define GU            0x000001<o:p></o:p></p>
<p class="MsoNormal">+#define GU_INIT       0x000020<o:p></o:p></p>
<p class="MsoNormal">+// Each change to this flags requires additional change at Mp_dbg.cpp  g_DbgFlags[] variabl<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_CRITICAL    DPFLTR_ERROR_LEVEL        <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_FATAL       DPFLTR_ERROR_LEVEL        <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_ERROR       DPFLTR_ERROR_LEVEL       <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_WARNING     DPFLTR_WARNING_LEVEL      <o:p>
</o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_INFORMATION DPFLTR_TRACE_LEVEL   <o:p></o:p></p>
<p class="MsoNormal">+#define TRACE_LEVEL_VERBOSE     DPFLTR_INFO_LEVEL   <o:p></o:p></p>
<p class="MsoNormal">+   <o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+TraceGUMessage(<o:p></o:p></p>
<p class="MsoNormal">+    IN PCCHAR  func,<o:p></o:p></p>
<p class="MsoNormal">+    IN PCCHAR  file,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG   line,<o:p></o:p></p>
<p class="MsoNormal">+    IN ULONG   level,<o:p></o:p></p>
<p class="MsoNormal">+    IN PCCHAR  format,<o:p></o:p></p>
<p class="MsoNormal">+    ...<o:p></o:p></p>
<p class="MsoNormal">+    );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma warning(disable:4296)  // expression is always true/false    
<o:p></o:p></p>
<p class="MsoNormal">+#define GU_PRINT(_level_,_flag_, _format_, ...)                               \<o:p></o:p></p>
<p class="MsoNormal">+    if ((g_GUDbgFlags & (_flag_)) &&                                          \<o:p></o:p></p>
<p class="MsoNormal">+        (g_GUDbgFlagsDef[ROUNDUP_LOG2(_flag_)].dbgLevel  >= (_level_)))               \<o:p></o:p></p>
<p class="MsoNormal">+    {                                                                          \<o:p></o:p></p>
<p class="MsoNormal">+        TraceGUMessage(__FUNCTION__, __FILE__, __LINE__, _level_, _format_, __VA_ARGS__);  \<o:p></o:p></p>
<p class="MsoNormal">+    }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+#define GU_ENTER()\<o:p></o:p></p>
<p class="MsoNormal">+             GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "===>\n");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define GU_EXIT()\<o:p></o:p></p>
<p class="MsoNormal">+             GU_PRINT(TRACE_LEVEL_VERBOSE, GU, "<===\n");<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif //defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_dbg.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_dbg.h     (revision 0)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/inc/kernel/genutils/gu_dbg.h  (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -0,0 +1,51 @@<o:p></o:p></p>
<p class="MsoNormal">+/*++<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Copyright (c) 2005-2010 Mellanox Technologies. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Module Name:<o:p></o:p></p>
<p class="MsoNormal">+    gu_dbg.h<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+Abstract:<o:p></o:p></p>
<p class="MsoNormal">+    This modulde contains all related dubug code<o:p></o:p></p>
<p class="MsoNormal">+Notes:<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+--*/<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#pragma once<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef _PREFAST_<o:p></o:p></p>
<p class="MsoNormal">+#define CONDITION_ASSUMED(X) __analysis_assume((X))<o:p></o:p></p>
<p class="MsoNormal">+#else<o:p></o:p></p>
<p class="MsoNormal">+#define CONDITION_ASSUMED(X) <o:p></o:p></p>
<p class="MsoNormal">+#endif // _PREFAST_<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#if DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+struct CGUDebugFlags{<o:p></o:p></p>
<p class="MsoNormal">+    LPCWSTR pszName;<o:p></o:p></p>
<p class="MsoNormal">+    DWORD dbgLevel;<o:p></o:p></p>
<p class="MsoNormal">+    };<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+extern CGUDebugFlags          g_GUDbgFlagsDef[];<o:p></o:p></p>
<p class="MsoNormal">+const unsigned int g_GUDbgFlags= 0xffff;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#undef ASSERT<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT(x) if(!(x)) { \<o:p></o:p></p>
<p class="MsoNormal">+             DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_ERROR_LEVEL, "Assertion failed: %s:%d %s\n", __FILE__, __LINE__, #x);\<o:p></o:p></p>
<p class="MsoNormal">+    DbgBreakPoint(); }\<o:p></o:p></p>
<p class="MsoNormal">+    CONDITION_ASSUMED(x);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT_ALWAYS(x) ASSERT(x)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+void DebugGUPrintInit(IN LPCWSTR pszRegistryPath);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#else   // !DBG<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#undef ASSERT<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT(x)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define ASSERT_ALWAYS(x) if(!(x)) { \<o:p></o:p></p>
<p class="MsoNormal">+    DbgBreakPoint(); }<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#endif  // DBG<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/eth/eth5x/sources<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/eth/eth5x/sources        (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/eth/eth5x/sources     (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -36,6 +36,7 @@<o:p></o:p></p>
<p class="MsoNormal">          ..\..\bus\core\$O;             \<o:p></o:p></p>
<p class="MsoNormal">          ..\..\..\..\..\inc;            \<o:p></o:p></p>
<p class="MsoNormal">          ..\..\..\..\..\inc\kernel;     \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\..\..\inc\kernel\l2w; \<o:p></o:p></p>
<p class="MsoNormal">          ..\..\bus\net;                 \<o:p></o:p></p>
<p class="MsoNormal">          ..\..\bus\ib;                  \<o:p></o:p></p>
<p class="MsoNormal">          $(O);                                                            \<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/eth/eth6x/sources<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/eth/eth6x/sources        (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/eth/eth6x/sources     (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -37,6 +37,7 @@<o:p></o:p></p>
<p class="MsoNormal">          ..\..\bus\net;                 \<o:p></o:p></p>
<p class="MsoNormal">          ..\..\bus\ib;                  \<o:p></o:p></p>
<p class="MsoNormal">                  $(O);                                                    \<o:p></o:p></p>
<p class="MsoNormal">+             ..\..\..\..\..\inc\kernel\l2w; \<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DBINARY_COMPATIBLE=0 -DNDIS_WDM=1 -DBUS_DRIVER -DMTNIC_PERF_STAT -DMTNIC -DNTDDI_VERSION=NTDDI_VISTA<o:p></o:p></p>
<p class="MsoNormal">@@ -54,7 +55,7 @@<o:p></o:p></p>
<p class="MsoNormal"> #<o:p></o:p></p>
<p class="MsoNormal"> # The driver is for windows7 Build with NDIS 6.2 and KMDF 1.9<o:p></o:p></p>
<p class="MsoNormal"> <span lang="ES-AR">#<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">-C_DEFINES=$(C_DEFINES) -DNDIS61_MINIPORT=1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">+C_DEFINES=$(C_DEFINES) -DNDIS620_MINIPORT=1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR"> </span>KMDF_VERSION_MAJOR=1<o:p></o:p></p>
<p class="MsoNormal"> KMDF_VERSION_MINOR=9<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/net/SOURCES<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/net/SOURCES         (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/net/SOURCES      (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -33,7 +33,7 @@<o:p></o:p></p>
<p class="MsoNormal">                sense.c                                 \<o:p></o:p></p>
<p class="MsoNormal">                srq.c                                      \<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-INCLUDES=..;..\inc;..\..\inc;..\..\..\inc;..\core\$O;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;..\..\eth\inc;..\drv<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..;..\inc;..\..\inc;..\..\..\inc;..\core\$O;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;..\..\eth\inc;..\drv;..\..\..\..\..\inc\kernel\l2w;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> #PRECOMPILED_INCLUDE=precomp.h<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -47,6 +47,7 @@<o:p></o:p></p>
<p class="MsoNormal">     $(DDK_LIB_PATH)\ntstrsafe.lib \<o:p></o:p></p>
<p class="MsoNormal">                $(TARGETPATH)\*\complib.lib \<o:p></o:p></p>
<p class="MsoNormal">                $(TARGETPATH)\*\mlx4_core.lib \<o:p></o:p></p>
<p class="MsoNormal">+             $(TARGETPATH)\*\l2w.lib \<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal"> !IFDEF ENABLE_EVENT_TRACING<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w.c               (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w.c            (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,512 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "core.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "pa_cash.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "mlx4.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "mlx4_debug.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if defined (EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">-#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.tmh"<o:p></o:p></p>
<p class="MsoNormal">-#endif <o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* Nth element of the table contains the index of the first set bit of N; 8 - for N=0 */<o:p></o:p></p>
<p class="MsoNormal">-char g_set_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* Nth element of the table contains the index of the first 0 bit of N; 8 - for N=255 */<o:p></o:p></p>
<p class="MsoNormal">-char g_clr_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* interval for a cmd go-bit waiting */<o:p></o:p></p>
<p class="MsoNormal">-// TODO: not clear what is to be this value:<o:p></o:p></p>
<p class="MsoNormal">-// 1. it has to be enough great, so as the tread will go waiting;<o:p></o:p></p>
<p class="MsoNormal">-// 2. it has to be enough small, so as there is no too large waiting after first command try;<o:p></o:p></p>
<p class="MsoNormal">-// 3. it has to be enough great, so as not to cause to intensive rescheduling;<o:p></o:p></p>
<p class="MsoNormal">-#define CMD_WAIT_USECS                                      2<o:p></o:p></p>
<p class="MsoNormal">-#define CMD_WAIT_INTERVAL                               ((-10) * CMD_WAIT_USECS)<o:p></o:p></p>
<p class="MsoNormal">-LARGE_INTEGER g_cmd_interval = { (ULONG)CMD_WAIT_INTERVAL, 0 };<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// PCI POOL <o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-pci_pool_t *<o:p></o:p></p>
<p class="MsoNormal">-pci_pool_create (const char *name, struct pci_dev *pdev,<o:p></o:p></p>
<p class="MsoNormal">-              size_t size, size_t align, size_t allocation)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              pci_pool_t *pool;<o:p></o:p></p>
<p class="MsoNormal">-              UNREFERENCED_PARAMETER(align);<o:p></o:p></p>
<p class="MsoNormal">-              UNREFERENCED_PARAMETER(allocation);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              // allocation parameter is not handled yet<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(allocation == 0);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: not absolutely correct: Linux's pci_pool_alloc provides contiguous physical memory,<o:p></o:p></p>
<p class="MsoNormal">-              // while default alloc function  - ExAllocatePoolWithTag -doesn't.<o:p></o:p></p>
<p class="MsoNormal">-              // But for now it is used for elements of size <= PAGE_SIZE<o:p></o:p></p>
<p class="MsoNormal">-              // Anyway - a sanity check:<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(size <= PAGE_SIZE);<o:p></o:p></p>
<p class="MsoNormal">-              if (size > PAGE_SIZE)<o:p></o:p></p>
<p class="MsoNormal">-                              return NULL;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              // allocate object<o:p></o:p></p>
<p class="MsoNormal">-              pool = (pci_pool_t *)ExAllocatePoolWithTag( NonPagedPool, sizeof(pci_pool_t), MT_TAG_PCIPOOL );<o:p></o:p></p>
<p class="MsoNormal">-              if (pool == NULL) <o:p></o:p></p>
<p class="MsoNormal">-                              return NULL;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: not too effective: one can read its own alloc/free functions<o:p></o:p></p>
<p class="MsoNormal">-              ExInitializeNPagedLookasideList( &pool->pool_hdr, NULL, NULL, 0, size, MT_TAG_PCIPOOL, 0 );<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              // fill the object<o:p></o:p></p>
<p class="MsoNormal">-              pool->mdev = pdev->dev;<o:p></o:p></p>
<p class="MsoNormal">-              pool->size = size;<o:p></o:p></p>
<p class="MsoNormal">-              strncpy( pool->name, name, sizeof pool->name );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return pool;                        <o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// BIT TECHNIQUES <o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void fill_bit_tbls()<o:p></o:p></p>
<p class="MsoNormal">-{             <o:p></o:p></p>
<p class="MsoNormal">-              unsigned long i;<o:p></o:p></p>
<p class="MsoNormal">-              for (i=0; i<256; ++i) {<o:p></o:p></p>
<p class="MsoNormal">-                              g_set_bit_tbl[i] = (char)(_ffs_raw(&i,0) - 1);<o:p></o:p></p>
<p class="MsoNormal">-                              g_clr_bit_tbl[i] = (char)(_ffz_raw(&i,0) - 1);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              g_set_bit_tbl[0] = g_clr_bit_tbl[255] = 8;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// BIT MAPS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int __bitmap_full(const unsigned long *bitmap, int bits)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int k, lim = bits/BITS_PER_LONG;<o:p></o:p></p>
<p class="MsoNormal">-              for (k = 0; k < lim; ++k)<o:p></o:p></p>
<p class="MsoNormal">-                              if (~bitmap[k])<o:p></o:p></p>
<p class="MsoNormal">-                              return 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (bits % BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">-                              if (~bitmap[k] & BITMAP_LAST_WORD_MASK(bits))<o:p></o:p></p>
<p class="MsoNormal">-                              return 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return 1;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int __bitmap_empty(const unsigned long *bitmap, int bits)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int k, lim = bits/BITS_PER_LONG;<o:p></o:p></p>
<p class="MsoNormal">-              for (k = 0; k < lim; ++k)<o:p></o:p></p>
<p class="MsoNormal">-                              if (bitmap[k])<o:p></o:p></p>
<p class="MsoNormal">-                                              return 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (bits % BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">-                              if (bitmap[k] & BITMAP_LAST_WORD_MASK(bits))<o:p></o:p></p>
<p class="MsoNormal">-                                              return 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return 1;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// DEBUG PRINT<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-VOID<o:p></o:p></p>
<p class="MsoNormal">-WriteEventLogEntry(<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">-              ...<o:p></o:p></p>
<p class="MsoNormal">-              )<o:p></o:p></p>
<p class="MsoNormal">-/*++<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Routine Description:<o:p></o:p></p>
<p class="MsoNormal">-    Writes an event log entry to the event log.<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Arguments:<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              pi_pIoObject......... The IO object ( driver object or device object ).<o:p></o:p></p>
<p class="MsoNormal">-              pi_ErrorCode......... The error code.<o:p></o:p></p>
<p class="MsoNormal">-              pi_UniqueErrorCode... A specific error code.<o:p></o:p></p>
<p class="MsoNormal">-              pi_FinalStatus....... The final status.<o:p></o:p></p>
<p class="MsoNormal">-              pi_nDataItems........ Number of data items.<o:p></o:p></p>
<p class="MsoNormal">-              .<o:p></o:p></p>
<p class="MsoNormal">-              . data items values<o:p></o:p></p>
<p class="MsoNormal">-              .<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Return Value:<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              None .<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">---*/<o:p></o:p></p>
<p class="MsoNormal">-{ /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Variable argument list */    <o:p></o:p></p>
<p class="MsoNormal">-              va_list                                                                   l_Argptr;<o:p></o:p></p>
<p class="MsoNormal">-              /* Pointer to an error log entry */<o:p></o:p></p>
<p class="MsoNormal">-              PIO_ERROR_LOG_PACKET           l_pErrorLogEntry;
<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Init the variable argument list */   <o:p>
</o:p></p>
<p class="MsoNormal">-              va_start(l_Argptr, pi_nDataItems);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Allocate an error log entry */ <o:p></o:p></p>
<p class="MsoNormal">-              l_pErrorLogEntry = <o:p></o:p></p>
<p class="MsoNormal">-              (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                              pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                              (UCHAR)(sizeof(IO_ERROR_LOG_PACKET)+pi_nDataItems*sizeof(ULONG))<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                              );
<o:p></o:p></p>
<p class="MsoNormal">-              /* Check allocation */<o:p></o:p></p>
<p class="MsoNormal">-              if ( l_pErrorLogEntry != NULL) <o:p></o:p></p>
<p class="MsoNormal">-              { /* OK */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Data item index */<o:p></o:p></p>
<p class="MsoNormal">-                              USHORT l_nDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Set the error log entry header */<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->ErrorCode                                     = pi_ErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->DumpDataSize                            = (USHORT) (pi_nDataItems*sizeof(ULONG));
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->SequenceNumber    = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->MajorFunctionCode = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->IoControlCode                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->RetryCount                  = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->UniqueErrorValue     = pi_UniqueErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->FinalStatus                    = pi_FinalStatus;
<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Insert the data items */<o:p></o:p></p>
<p class="MsoNormal">-                              for (l_nDataItem = 0; l_nDataItem < pi_nDataItems; l_nDataItem++)
<o:p></o:p></p>
<p class="MsoNormal">-                              { /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              /* Current data item */<o:p></o:p></p>
<p class="MsoNormal">-                                              int l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-                                                             
<o:p></o:p></p>
<p class="MsoNormal">-                                              /* Get next data item */<o:p></o:p></p>
<p class="MsoNormal">-                                              l_CurDataItem = va_arg( l_Argptr, int);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              /* Put it into the data array */<o:p></o:p></p>
<p class="MsoNormal">-                                              l_pErrorLogEntry->DumpData[l_nDataItem] = l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              } /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Write the packet */<o:p></o:p></p>
<p class="MsoNormal">-                              IoWriteErrorLogEntry(l_pErrorLogEntry);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              } /* OK */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Term the variable argument list */   <o:p>
</o:p></p>
<p class="MsoNormal">-              va_end(l_Argptr);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-} /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// GENERAL <o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// from lib/string.c<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* strlcpy - Copy a %NUL terminated string into a sized buffer<o:p></o:p></p>
<p class="MsoNormal">-* @dest: Where to copy the string to<o:p></o:p></p>
<p class="MsoNormal">-* @src: Where to copy the string from<o:p></o:p></p>
<p class="MsoNormal">-* @size: size of destination buffer<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* Compatible with *BSD: the result is always a valid<o:p></o:p></p>
<p class="MsoNormal">-* NUL-terminated string that fits in the buffer (unless,<o:p></o:p></p>
<p class="MsoNormal">-* of course, the buffer size is zero). It does not pad<o:p></o:p></p>
<p class="MsoNormal">-* out the result like strncpy() does.<o:p></o:p></p>
<p class="MsoNormal">-*/<o:p></o:p></p>
<p class="MsoNormal">-SIZE_T strlcpy(char *dest, const void *src, SIZE_T size)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              SIZE_T ret = strlen(src);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (size) {<o:p></o:p></p>
<p class="MsoNormal">-                              SIZE_T len = (ret >= size) ? size-1 : ret;<o:p></o:p></p>
<p class="MsoNormal">-                              memcpy(dest, src, len);<o:p></o:p></p>
<p class="MsoNormal">-                              dest[len] = '\0';<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return ret;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int parse_dev_location(<o:p></o:p></p>
<p class="MsoNormal">-              const char *buffer,<o:p></o:p></p>
<p class="MsoNormal">-              const char *format,<o:p></o:p></p>
<p class="MsoNormal">-              int *bus, int *dev, int *func<o:p></o:p></p>
<p class="MsoNormal">-)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return sscanf( buffer, format, bus, dev, func );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int core_init()<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int err;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              fill_bit_tbls();<o:p></o:p></p>
<p class="MsoNormal">-              init_qp_state_tbl();<o:p></o:p></p>
<p class="MsoNormal">-              err =  ib_core_init();<o:p></o:p></p>
<p class="MsoNormal">-              if (err)<o:p></o:p></p>
<p class="MsoNormal">-                              return err;<o:p></o:p></p>
<p class="MsoNormal">-              return pa_cash_init();<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void core_cleanup()<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ib_core_cleanup();<o:p></o:p></p>
<p class="MsoNormal">-              pa_cash_release();<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifdef USE_WDM_INTERRUPTS<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void free_irq(struct mlx4_dev *dev)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (!dev->pdev->int_obj)<o:p></o:p></p>
<p class="MsoNormal">-                              return;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-#if (NTDDI_VERSION >= NTDDI_LONGHORN)<o:p></o:p></p>
<p class="MsoNormal">-              // Vista build environment<o:p></o:p></p>
<p class="MsoNormal">-              if (dev->pdev->legacy_connect)<o:p></o:p></p>
<p class="MsoNormal">-                              IoDisconnectInterrupt( dev->pdev->int_obj );<o:p></o:p></p>
<p class="MsoNormal">-              else {<o:p></o:p></p>
<p class="MsoNormal">-                              IO_DISCONNECT_INTERRUPT_PARAMETERS ctx;<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("%s: IoDisconnectInterrupt: Version %d\n", dev->pdev->name, dev->pdev->version));
<o:p></o:p></p>
<p class="MsoNormal">-                              ctx.Version = dev->pdev->version;<o:p></o:p></p>
<p class="MsoNormal">-                              ctx.ConnectionContext.InterruptObject = dev->pdev->int_obj;<o:p></o:p></p>
<p class="MsoNormal">-                              IoDisconnectInterruptEx( &ctx );<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-              // legacy build environment<o:p></o:p></p>
<p class="MsoNormal">-              IoDisconnectInterrupt( dev->pdev->int_obj );<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-              dev->pdev->int_obj = NULL;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int request_irq(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           struct mlx4_dev *            dev,                      
<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PKSERVICE_ROUTINE     isr,                                          /* Line ISR */<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PVOID                                                   isr_ctx,                 /* ISR context */<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PKMESSAGE_SERVICE_ROUTINE              misr,      /* Message ISR */<o:p></o:p></p>
<p class="MsoNormal">-              OUT                       PKINTERRUPT                    *             int_obj<o:p></o:p></p>
<p class="MsoNormal">-              )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">-              struct pci_dev *pdev = dev->pdev;                         /* interrupt resources */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if (NTDDI_VERSION >= NTDDI_LONGHORN)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              IO_CONNECT_INTERRUPT_PARAMETERS params;<o:p></o:p></p>
<p class="MsoNormal">-              PIO_INTERRUPT_MESSAGE_INFO p_msi_info;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              KeInitializeSpinLock( &pdev->isr_lock );<o:p></o:p></p>
<p class="MsoNormal">-              pdev->n_msi_vectors = 0;  // not using MSI/MSI-X<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-              // Vista and later platforms build environment<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );<o:p></o:p></p>
<p class="MsoNormal">-              if ( !mlx4_is_msi(dev) ) {<o:p></o:p></p>
<p class="MsoNormal">-                              params.Version = CONNECT_FULLY_SPECIFIED;<o:p></o:p></p>
<p class="MsoNormal">-                              goto get_legacy_int;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-              // try to connect our Interrupt Message Service Rotuine to<o:p></o:p></p>
<p class="MsoNormal">-              // all Message-Signaled Interrupts our device has been granted,<o:p></o:p></p>
<p class="MsoNormal">-              // with automatic fallback to a single line-based interrupt.<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              params.Version = CONNECT_MESSAGE_BASED;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.PhysicalDeviceObject = pdev->pdo;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.ConnectionContext.Generic = &p_msi_info;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.MessageServiceRoutine = misr;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.ServiceContext = isr_ctx;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.SpinLock = NULL;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.SynchronizeIrql = 0;<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.FloatingSave = FALSE;<o:p></o:p></p>
<p class="MsoNormal">-              // fallback to line-based ISR if there is no MSI support<o:p></o:p></p>
<p class="MsoNormal">-              params.MessageBased.FallBackServiceRoutine = isr;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              status = IoConnectInterruptEx(&params);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              pdev->version = params.Version;<o:p></o:p></p>
<p class="MsoNormal">-              *int_obj = (PVOID)p_msi_info;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              if ( NT_SUCCESS(status) ) {<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-                              //<o:p></o:p></p>
<p class="MsoNormal">-                              // It worked, so we're running on Vista or later.<o:p></o:p></p>
<p class="MsoNormal">-                              //<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-                              if(params.Version == CONNECT_MESSAGE_BASED) {<o:p></o:p></p>
<p class="MsoNormal">-                                              ULONG i;<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-                                              //<o:p></o:p></p>
<p class="MsoNormal">-                                              // Because we succeeded in connecting to one or more Message-Signaled<o:p></o:p></p>
<p class="MsoNormal">-                                              // Interrupts, the connection context that was returned was<o:p></o:p></p>
<p class="MsoNormal">-                                              // a pointer to an IO_INTERRUPT_MESSAGE_INFO structure.<o:p></o:p></p>
<p class="MsoNormal">-                                              //<o:p></o:p></p>
<p class="MsoNormal">-                                              pdev->n_msi_vectors = (u8)p_msi_info->MessageCount;  // not using MSI/MSI-X<o:p></o:p></p>
<p class="MsoNormal">-                                              // print it <o:p>
</o:p></p>
<p class="MsoNormal">-                                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,<o:p></o:p></p>
<p class="MsoNormal">-                                                              ("%s: request_irq: Granted %d MSI vectors ( UnifiedIrql %#x)\n",
<o:p></o:p></p>
<p class="MsoNormal">-                                                              dev->pdev->name, p_msi_info->MessageCount, p_msi_info->UnifiedIrql ));<o:p></o:p></p>
<p class="MsoNormal">-                                              for (i=0; i < p_msi_info->MessageCount; ++i) {<o:p></o:p></p>
<p class="MsoNormal">-                                                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              ("%s: *** Vector %#x, Affinity %#x, Irql %#x, MsgAddr %I64x, MsgData %#x, Mode %d\n",
<o:p></o:p></p>
<p class="MsoNormal">-                                                                              dev->pdev->name,
<o:p></o:p></p>
<p class="MsoNormal">-                                                                              p_msi_info->MessageInfo[i].Vector,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              (ULONG)p_msi_info->MessageInfo[i].TargetProcessorSet,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              p_msi_info->MessageInfo[i].Irql,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              p_msi_info->MessageInfo[i].MessageAddress.QuadPart,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              p_msi_info->MessageInfo[i].MessageData,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              p_msi_info->MessageInfo[i].Mode ));<o:p></o:p></p>
<p class="MsoNormal">-                                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              // sanity check<o:p></o:p></p>
<p class="MsoNormal">-                                              if (pdev->n_msi_vectors_alloc != pdev->n_msi_vectors) {<o:p></o:p></p>
<p class="MsoNormal">-                                                              MLX4_PRINT(TRACE_LEVEL_ERROR ,MLX4_DBG_INIT ,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              ("%s: Connected to %d interrupts from %d allocated to us !!!\n",<o:p></o:p></p>
<p class="MsoNormal">-                                                                              dev->pdev->name, pdev->n_msi_vectors, pdev->n_msi_vectors_alloc ));<o:p></o:p></p>
<p class="MsoNormal">-                                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              // fill MSI-X map table<o:p></o:p></p>
<p class="MsoNormal">-                                              for (i=0; i < p_msi_info->MessageCount; ++i) {<o:p></o:p></p>
<p class="MsoNormal">-                                                              pdev->p_msix_map[i].cpu = p_msi_info->MessageInfo[i].TargetProcessorSet;<o:p></o:p></p>
<p class="MsoNormal">-                                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              } else {<o:p></o:p></p>
<p class="MsoNormal">-                                              //<o:p></o:p></p>
<p class="MsoNormal">-                                              // We are on Vista, but there is no HW MSI support<o:p></o:p></p>
<p class="MsoNormal">-                                              // So we are connected to line interrupt<o:p></o:p></p>
<p class="MsoNormal">-                                              ASSERT(params.Version == CONNECT_LINE_BASED);<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              } else {<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-                              //<o:p></o:p></p>
<p class="MsoNormal">-                              // We are on a legacy system and maybe can proceed<o:p></o:p></p>
<p class="MsoNormal">-                              //<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              if (params.Version == CONNECT_FULLY_SPECIFIED) {<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-                                              //<o:p></o:p></p>
<p class="MsoNormal">-                                              // use IoConnectInterruptEx to connect our ISR to a<o:p></o:p></p>
<p class="MsoNormal">-                                              // line-based interrupt.<o:p></o:p></p>
<p class="MsoNormal">-                                              //<o:p></o:p></p>
<p class="MsoNormal">-get_legacy_int:<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.PhysicalDeviceObject = pdev->pdo;<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.InterruptObject  = int_obj;<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.ServiceRoutine  = isr;<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.ServiceContext = isr_ctx;<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.FloatingSave = FALSE;<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.SpinLock = NULL;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              if (pdev->int_info.Flags & CM_RESOURCE_INTERRUPT_MESSAGE) {<o:p></o:p></p>
<p class="MsoNormal">-                                                              // The resource is for a message-based interrupt. Use the u.MessageInterrupt.Translated member of IntResource.<o:p></o:p></p>
<p class="MsoNormal">-                                                             
<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.Vector = pdev->int_info.u.MessageInterrupt.Translated.Vector;<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.Irql = (KIRQL)pdev->int_info.u.MessageInterrupt.Translated.Level;<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.SynchronizeIrql = (KIRQL)pdev->int_info.u.MessageInterrupt.Translated.Level;<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.ProcessorEnableMask = g.affinity ?
<o:p></o:p></p>
<p class="MsoNormal">-                                                                              g.affinity : pdev->int_info.u.MessageInterrupt.Translated.Affinity;<o:p></o:p></p>
<p class="MsoNormal">-                                              } else {<o:p></o:p></p>
<p class="MsoNormal">-                                                              // The resource is for a line-based interrupt. Use the u.Interrupt member of IntResource.<o:p></o:p></p>
<p class="MsoNormal">-                                                             
<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.Vector = pdev->int_info.u.Interrupt.Vector;<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.Irql = (KIRQL)pdev->int_info.u.Interrupt.Level;<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.SynchronizeIrql = (KIRQL)pdev->int_info.u.Interrupt.Level;<o:p></o:p></p>
<p class="MsoNormal">-                                                              params.FullySpecified.ProcessorEnableMask = g.affinity ?
<o:p></o:p></p>
<p class="MsoNormal">-                                                                              g.affinity : pdev->int_info.u.Interrupt.Affinity;<o:p></o:p></p>
<p class="MsoNormal">-                                              }<o:p></o:p></p>
<p class="MsoNormal">-                                              <o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.InterruptMode = (pdev->int_info.Flags & CM_RESOURCE_INTERRUPT_LATCHED ? Latched : LevelSensitive);<o:p></o:p></p>
<p class="MsoNormal">-                                              params.FullySpecified.ShareVector = (BOOLEAN)(pdev->int_info.ShareDisposition == CmResourceShareShared);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              status = IoConnectInterruptEx(&params);<o:p></o:p></p>
<p class="MsoNormal">-                                              pdev->version = params.Version;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                              else {<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              // Something wrong with IoConnectInterruptEx.<o:p></o:p></p>
<p class="MsoNormal">-                                              // Lets try the usual way<o:p></o:p></p>
<p class="MsoNormal">-                                              status = IoConnectInterrupt(<o:p></o:p></p>
<p class="MsoNormal">-                                                              int_obj,                                                                                                                                                                /* InterruptObject
 */<o:p></o:p></p>
<p class="MsoNormal">-                                                              isr,                                                                                                                                                                         
 /* ISR */ <o:p></o:p></p>
<p class="MsoNormal">-                                                              isr_ctx,                                                                                                                                                 /* ISR context */<o:p></o:p></p>
<p class="MsoNormal">-                                                              &pdev->isr_lock,                                                                                                                             /* spinlock */<o:p></o:p></p>
<p class="MsoNormal">-                                                              pdev->int_info.u.Interrupt.Vector,                                                         /* interrupt vector */<o:p></o:p></p>
<p class="MsoNormal">-                                                              (KIRQL)pdev->int_info.u.Interrupt.Level,                             /* IRQL */<o:p></o:p></p>
<p class="MsoNormal">-                                                              (KIRQL)pdev->int_info.u.Interrupt.Level,                             /* Synchronize IRQL */<o:p></o:p></p>
<p class="MsoNormal">-                                                              (BOOLEAN)((pdev->int_info.Flags == CM_RESOURCE_INTERRUPT_LATCHED) ?
<o:p></o:p></p>
<p class="MsoNormal">-                                                                              Latched : LevelSensitive),                                                                             /* interrupt type: LATCHED or LEVEL */<o:p></o:p></p>
<p class="MsoNormal">-                                                              (BOOLEAN)(pdev->int_info.ShareDisposition == CmResourceShareShared),       /* vector shared or not */<o:p></o:p></p>
<p class="MsoNormal">-                                                              g.affinity ? g.affinity : (KAFFINITY)pdev->int_info.u.Interrupt.Affinity,    /* interrupt affinity */<o:p></o:p></p>
<p class="MsoNormal">-                                                              FALSE                                                                                                                                                                                                                                   
 /* whether to save Float registers */<o:p></o:p></p>
<p class="MsoNormal">-                                                              );<o:p></o:p></p>
<p class="MsoNormal">-                                              pdev->legacy_connect = TRUE;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-              // Legacy (before Vista) platform build environment<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(misr);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              KeInitializeSpinLock( &pdev->isr_lock );<o:p></o:p></p>
<p class="MsoNormal">-              pdev->n_msi_vectors = 0;  // not using MSI/MSI-X<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              status = IoConnectInterrupt(<o:p></o:p></p>
<p class="MsoNormal">-                              int_obj,                                                                                                                                                                /* InterruptObject */<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-                              isr,                                                                                                                                                                          /* ISR */
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">-                              isr_ctx,                                                                                                                                                 /* ISR context */<o:p></o:p></span></p>
<p class="MsoNormal">-                              &pdev->isr_lock,                                                                                                                             /* spinlock */<o:p></o:p></p>
<p class="MsoNormal">-                              pdev->int_info.u.Interrupt.Vector,                                                         /* interrupt vector */<o:p></o:p></p>
<p class="MsoNormal">-                              (KIRQL)pdev->int_info.u.Interrupt.Level,                             /* IRQL */<o:p></o:p></p>
<p class="MsoNormal">-                              (KIRQL)pdev->int_info.u.Interrupt.Level,                             /* Synchronize IRQL */<o:p></o:p></p>
<p class="MsoNormal">-                              (BOOLEAN)((pdev->int_info.Flags == CM_RESOURCE_INTERRUPT_LATCHED) ?
<o:p></o:p></p>
<p class="MsoNormal">-                                              Latched : LevelSensitive),                                                                             /* interrupt type: LATCHED or LEVEL */<o:p></o:p></p>
<p class="MsoNormal">-                              (BOOLEAN)(pdev->int_info.ShareDisposition == CmResourceShareShared),       /* vector shared or not */<o:p></o:p></p>
<p class="MsoNormal">-                              g.affinity ? g.affinity : (KAFFINITY)pdev->int_info.u.Interrupt.Affinity,    /* interrupt affinity */<o:p></o:p></p>
<p class="MsoNormal">-                              FALSE                                                                                                                                                                                                                                   
 /* whether to save Float registers */<o:p></o:p></p>
<p class="MsoNormal">-                              );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (!NT_SUCCESS(status)) {<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_ERROR ,MLX4_DBG_INIT ,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("%s: Connect interrupt failed with status %#x, affinity %#x )\n",<o:p></o:p></p>
<p class="MsoNormal">-                                              dev->pdev->name, status, g.affinity ? g.affinity : (unsigned int)pdev->int_info.u.Interrupt.Affinity));<o:p></o:p></p>
<p class="MsoNormal">-                              *int_obj = NULL;<o:p></o:p></p>
<p class="MsoNormal">-                              return -EFAULT;                                /* failed to connect interrupt */<o:p></o:p></p>
<p class="MsoNormal">-              } <o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/packer.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/packer.c         (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/packer.c      (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,212 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-/*<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">- * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">- * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">- * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">- * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">- *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">- *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">- *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">- * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * $Id: packer.c 1349 2004-12-16 21:09:43Z roland $<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "ib_pack.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "mlx4_debug.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">-#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-#include "packer.tmh"<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static u64 value_read(int offset, int size, u8 *structure)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              switch (size) {<o:p></o:p></p>
<p class="MsoNormal">-              case 1: return                *(u8  *) (structure + offset);<o:p></o:p></p>
<p class="MsoNormal">-              case 2: return be16_to_cpup((__be16 *) (structure + offset));<o:p></o:p></p>
<p class="MsoNormal">-              case 4: return be32_to_cpup((__be32 *) (structure + offset));<o:p></o:p></p>
<p class="MsoNormal">-              case 8: return be64_to_cpup((__be64 *) (structure + offset));<o:p></o:p></p>
<p class="MsoNormal">-              default:<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Field size %d bits not handled\n", size * 8));<o:p></o:p></p>
<p class="MsoNormal">-                              return 0;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_pack - Pack a structure into a buffer<o:p></o:p></p>
<p class="MsoNormal">- * @desc:Array of structure field descriptions<o:p></o:p></p>
<p class="MsoNormal">- * @desc_len:Number of entries in @desc<o:p></o:p></p>
<p class="MsoNormal">- * @structure:Structure to pack from<o:p></o:p></p>
<p class="MsoNormal">- * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_pack() packs a list of structure fields into a buffer,<o:p></o:p></p>
<p class="MsoNormal">- * controlled by the array of fields in @desc.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-void ib_pack(const struct ib_field        *desc,<o:p></o:p></p>
<p class="MsoNormal">-                   int                           desc_len,<o:p></o:p></p>
<p class="MsoNormal">-                   void                         *structure,<o:p></o:p></p>
<p class="MsoNormal">-                   u8                         *buf)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int i;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              for (i = 0; i < desc_len; ++i) {<o:p></o:p></p>
<p class="MsoNormal">-                              if (desc[i].size_bits <= 32) {<o:p></o:p></p>
<p class="MsoNormal">-                                              int shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              u32 val;<o:p></o:p></p>
<p class="MsoNormal">-                                              __be32 mask;<o:p></o:p></p>
<p class="MsoNormal">-                                              __be32 *addr;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              shift = 32 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">-                                              if (desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">-                                                              val = (u32)(value_read((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              structure) << shift);<o:p></o:p></p>
<p class="MsoNormal">-                                              else<o:p></o:p></p>
<p class="MsoNormal">-                                                              val = 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              mask = cpu_to_be32(((1ull << desc[i].size_bits) - 1) << shift);<o:p></o:p></p>
<p class="MsoNormal">-                                              addr = (__be32 *) buf + desc[i].offset_words;<o:p></o:p></p>
<p class="MsoNormal">-                                              *addr = (*addr & ~mask) | (cpu_to_be32(val) & mask);<o:p></o:p></p>
<p class="MsoNormal">-                              } else if (desc[i].size_bits <= 64) {<o:p></o:p></p>
<p class="MsoNormal">-                                              int shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              u64 val;<o:p></o:p></p>
<p class="MsoNormal">-                                              __be64 mask;<o:p></o:p></p>
<p class="MsoNormal">-                                              __be64 *addr;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              shift = 64 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">-                                              if (desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">-                                                              val = value_read((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              structure) << shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              else<o:p></o:p></p>
<p class="MsoNormal">-                                                              val = 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              mask = cpu_to_be64((~0ull >> (64 - desc[i].size_bits)) << shift);<o:p></o:p></p>
<p class="MsoNormal">-                                              addr = (__be64 *) ((__be32 *) buf + desc[i].offset_words);<o:p></o:p></p>
<p class="MsoNormal">-                                              *addr = (*addr & ~mask) | (cpu_to_be64(val) & mask);<o:p></o:p></p>
<p class="MsoNormal">-                              } else {<o:p></o:p></p>
<p class="MsoNormal">-                                              if (desc[i].offset_bits % 8 ||<o:p></o:p></p>
<p class="MsoNormal">-                                                  desc[i].size_bits   % 8) {<o:p></o:p></p>
<p class="MsoNormal">-                                                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Structure field %s of size %d "<o:p></o:p></p>
<p class="MsoNormal">-                                                                     "bits is not byte-aligned\n",<o:p></o:p></p>
<p class="MsoNormal">-                                                                     desc[i].field_name, desc[i].size_bits));<o:p></o:p></p>
<p class="MsoNormal">-                                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              if (desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">-                                                              memcpy(buf + desc[i].offset_words * 4 +<o:p></o:p></p>
<p class="MsoNormal">-                                                                     desc[i].offset_bits / 8,<o:p></o:p></p>
<p class="MsoNormal">-                                                                     (u8*)structure + desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                     desc[i].size_bits / 8);<o:p></o:p></p>
<p class="MsoNormal">-                                              else<o:p></o:p></p>
<p class="MsoNormal">-                                                              memset(buf + desc[i].offset_words * 4 +<o:p></o:p></p>
<p class="MsoNormal">-                                                                     desc[i].offset_bits / 8,<o:p></o:p></p>
<p class="MsoNormal">-                                                                     0,<o:p></o:p></p>
<p class="MsoNormal">-                                                                     desc[i].size_bits / 8);<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-EXPORT_SYMBOL(ib_pack);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static void value_write(int offset, int size, u64 val, u8 *structure)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              switch (size * 8) {<o:p></o:p></p>
<p class="MsoNormal">-              case 8:  *(    u8 *) (structure + offset) = (u8)val; break;<o:p></o:p></p>
<p class="MsoNormal">-              case 16: *(__be16 *) (structure + offset) = cpu_to_be16(val); break;<o:p></o:p></p>
<p class="MsoNormal">-              case 32: *(__be32 *) (structure + offset) = cpu_to_be32(val); break;<o:p></o:p></p>
<p class="MsoNormal">-              case 64: *(__be64 *) (structure + offset) = cpu_to_be64(val); break;<o:p></o:p></p>
<p class="MsoNormal">-              default:<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Field size %d bits not handled\n", size * 8));<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_unpack - Unpack a buffer into a structure<o:p></o:p></p>
<p class="MsoNormal">- * @desc:Array of structure field descriptions<o:p></o:p></p>
<p class="MsoNormal">- * @desc_len:Number of entries in @desc<o:p></o:p></p>
<p class="MsoNormal">- * @buf:Buffer to unpack from<o:p></o:p></p>
<p class="MsoNormal">- * @structure:Structure to unpack into<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_pack() unpacks a list of structure fields from a buffer,<o:p></o:p></p>
<p class="MsoNormal">- * controlled by the array of fields in @desc.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-void ib_unpack(const struct ib_field        *desc,<o:p></o:p></p>
<p class="MsoNormal">-                     int                           desc_len,<o:p></o:p></p>
<p class="MsoNormal">-                     void                         *buf,<o:p></o:p></p>
<p class="MsoNormal">-                     void                         *structure)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int i;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              for (i = 0; i < desc_len; ++i) {<o:p></o:p></p>
<p class="MsoNormal">-                              if (!desc[i].struct_size_bytes)<o:p></o:p></p>
<p class="MsoNormal">-                                              continue;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              if (desc[i].size_bits <= 32) {<o:p></o:p></p>
<p class="MsoNormal">-                                              int shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              u32  val;<o:p></o:p></p>
<p class="MsoNormal">-                                              u32  mask;<o:p></o:p></p>
<p class="MsoNormal">-                                              __be32 *addr;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              shift = 32 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">-                                              mask = ((1ull << desc[i].size_bits) - 1) << shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              addr = (__be32 *) buf + desc[i].offset_words;<o:p></o:p></p>
<p class="MsoNormal">-                                              val = (be32_to_cpup(addr) & mask) >> shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              value_write((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                  (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                  val,<o:p></o:p></p>
<p class="MsoNormal">-                                                                  structure);<o:p></o:p></p>
<p class="MsoNormal">-                              } else if (desc[i].size_bits <= 64) {<o:p></o:p></p>
<p class="MsoNormal">-                                              int shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              u64  val;<o:p></o:p></p>
<p class="MsoNormal">-                                              u64  mask;<o:p></o:p></p>
<p class="MsoNormal">-                                              __be64 *addr;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              shift = 64 - desc[i].offset_bits - desc[i].size_bits;<o:p></o:p></p>
<p class="MsoNormal">-                                              mask = (~0ull >> (64 - desc[i].size_bits)) << shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              addr = (__be64 *) buf + desc[i].offset_words;<o:p></o:p></p>
<p class="MsoNormal">-                                              val = (be64_to_cpup(addr) & mask) >> shift;<o:p></o:p></p>
<p class="MsoNormal">-                                              value_write((int)desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                  (int)desc[i].struct_size_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                                  val,<o:p></o:p></p>
<p class="MsoNormal">-                                                                  structure);<o:p></o:p></p>
<p class="MsoNormal">-                              } else {<o:p></o:p></p>
<p class="MsoNormal">-                                              if (desc[i].offset_bits % 8 ||<o:p></o:p></p>
<p class="MsoNormal">-                                                  desc[i].size_bits   % 8) {<o:p></o:p></p>
<p class="MsoNormal">-                                                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Structure field %s of size %d "<o:p></o:p></p>
<p class="MsoNormal">-                                                                     "bits is not byte-aligned\n",<o:p></o:p></p>
<p class="MsoNormal">-                                                                     desc[i].field_name, desc[i].size_bits));<o:p></o:p></p>
<p class="MsoNormal">-                                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              memcpy((u8*)structure + desc[i].struct_offset_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                     (u8*)buf + desc[i].offset_words * 4 +<o:p></o:p></p>
<p class="MsoNormal">-                                                     desc[i].offset_bits / 8,<o:p></o:p></p>
<p class="MsoNormal">-                                                     desc[i].size_bits / 8);<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-EXPORT_SYMBOL(ib_unpack);<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_debug.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_debug.c                (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_debug.c             (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,298 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "ev_log.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define MAX_BUFFER_SIZE                      256<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* <o:p></o:p></p>
<p class="MsoNormal">- * This function sends to Event Log messages with one WCHAR string and several binary parameters.<o:p></o:p></p>
<p class="MsoNormal">- * The string will be inserted instead of %2 parameter of the message.<o:p></o:p></p>
<p class="MsoNormal">- * Binary parameters will be shown in Dump Area of the message.<o:p></o:p></p>
<p class="MsoNormal">- * Binary parameters should be of type LONG.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-VOID<o:p></o:p></p>
<p class="MsoNormal">-WriteEventLogEntryStr(<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">-              PWCHAR              pi_InsertionStr,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">-              ...<o:p></o:p></p>
<p class="MsoNormal">-              )<o:p></o:p></p>
<p class="MsoNormal">-/*++<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Routine Description:<o:p></o:p></p>
<p class="MsoNormal">-    Writes an event log entry to the event log.<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Arguments:<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              pi_pIoObject......... The IO object ( driver object or device object ).<o:p></o:p></p>
<p class="MsoNormal">-              pi_ErrorCode......... The error code.<o:p></o:p></p>
<p class="MsoNormal">-              pi_UniqueErrorCode... A specific error code.<o:p></o:p></p>
<p class="MsoNormal">-              pi_FinalStatus....... The final status.<o:p></o:p></p>
<p class="MsoNormal">-              pi_nDataItems........ Number of data items.<o:p></o:p></p>
<p class="MsoNormal">-              .<o:p></o:p></p>
<p class="MsoNormal">-              . data items values<o:p></o:p></p>
<p class="MsoNormal">-              .<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Return Value:<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              None .<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">---*/<o:p></o:p></p>
<p class="MsoNormal">-{ /* WriteEventLogEntryStr */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Variable argument list */    <o:p></o:p></p>
<p class="MsoNormal">-              va_list                                                                   l_Argptr;<o:p></o:p></p>
<p class="MsoNormal">-              /* Pointer to an error log entry */<o:p></o:p></p>
<p class="MsoNormal">-              PIO_ERROR_LOG_PACKET           l_pErrorLogEntry;
<o:p></o:p></p>
<p class="MsoNormal">-              /* sizeof insertion string */<o:p></o:p></p>
<p class="MsoNormal">-              int           l_Size = (int)((pi_InsertionStr) ? ((wcslen(pi_InsertionStr) + 1) * sizeof( WCHAR )) : 0);<o:p></o:p></p>
<p class="MsoNormal">-              int l_PktSize =sizeof(IO_ERROR_LOG_PACKET)+pi_nDataItems*sizeof(ULONG);<o:p></o:p></p>
<p class="MsoNormal">-              int l_TotalSize =l_PktSize +l_Size;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (pi_pIoObject == NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(pi_pIoObject != NULL);<o:p></o:p></p>
<p class="MsoNormal">-                              return;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Init the variable argument list */   <o:p>
</o:p></p>
<p class="MsoNormal">-              va_start(l_Argptr, pi_nDataItems);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Allocate an error log entry */ <o:p></o:p></p>
<p class="MsoNormal">-              if (l_TotalSize >= ERROR_LOG_MAXIMUM_SIZE - 2)
<o:p></o:p></p>
<p class="MsoNormal">-                              l_TotalSize = ERROR_LOG_MAXIMUM_SIZE - 2;<o:p></o:p></p>
<p class="MsoNormal">-              l_pErrorLogEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(<o:p></o:p></p>
<p class="MsoNormal">-                              pi_pIoObject,  (UCHAR)l_TotalSize );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Check allocation */<o:p></o:p></p>
<p class="MsoNormal">-              if ( l_pErrorLogEntry != NULL) <o:p></o:p></p>
<p class="MsoNormal">-              { /* OK */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Data item index */<o:p></o:p></p>
<p class="MsoNormal">-                              USHORT l_nDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Set the error log entry header */<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->ErrorCode                                     = pi_ErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->DumpDataSize                            = (USHORT) (pi_nDataItems*sizeof(ULONG));
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->SequenceNumber    = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->MajorFunctionCode = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->IoControlCode                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->RetryCount                  = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->UniqueErrorValue     = pi_UniqueErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->FinalStatus                    = pi_FinalStatus;
<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Insert the data items */<o:p></o:p></p>
<p class="MsoNormal">-                              for (l_nDataItem = 0; l_nDataItem < pi_nDataItems; l_nDataItem++)
<o:p></o:p></p>
<p class="MsoNormal">-                              { /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              /* Current data item */<o:p></o:p></p>
<p class="MsoNormal">-                                              int l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-                                                             
<o:p></o:p></p>
<p class="MsoNormal">-                                              /* Get next data item */<o:p></o:p></p>
<p class="MsoNormal">-                                              l_CurDataItem = va_arg( l_Argptr, int);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              /* Put it into the data array */<o:p></o:p></p>
<p class="MsoNormal">-                                              l_pErrorLogEntry->DumpData[l_nDataItem] = l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              } /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* add insertion string */<o:p></o:p></p>
<p class="MsoNormal">-                              if (pi_InsertionStr) {<o:p></o:p></p>
<p class="MsoNormal">-                                              char *ptr; <o:p>
</o:p></p>
<p class="MsoNormal">-                                              int sz = min( l_TotalSize - l_PktSize, l_Size );<o:p></o:p></p>
<p class="MsoNormal">-                                              l_pErrorLogEntry->NumberOfStrings = 1;<o:p></o:p></p>
<p class="MsoNormal">-                                              l_pErrorLogEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET) + l_pErrorLogEntry->DumpDataSize;<o:p></o:p></p>
<p class="MsoNormal">-                                              ptr = (char*)l_pErrorLogEntry + l_pErrorLogEntry->StringOffset;<o:p></o:p></p>
<p class="MsoNormal">-                                              memcpy( ptr, pi_InsertionStr, sz );<o:p></o:p></p>
<p class="MsoNormal">-                                              *(WCHAR*)&ptr[sz - 2] = (WCHAR)0;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-                              /* Write the packet */<o:p></o:p></p>
<p class="MsoNormal">-                              IoWriteErrorLogEntry(l_pErrorLogEntry);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              } /* OK */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Term the variable argument list */   <o:p>
</o:p></p>
<p class="MsoNormal">-              va_end(l_Argptr);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-} /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* <o:p></o:p></p>
<p class="MsoNormal">- * This function sends to Event Log messages with various parameters.<o:p></o:p></p>
<p class="MsoNormal">- * Every parameter should be coded as a pair: a format specifier and the value.<o:p></o:p></p>
<p class="MsoNormal">- * 'pi_nDataItems' presents the number of the pairs.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * Here is an example:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * To print a message (from MC file) like:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *                           MessageId=0x0006 Facility=MLX4 Severity=Informational SymbolicName=EVENT_MLX4_INFO_TEST<o:p></o:p></p>
<p class="MsoNormal">- *                           Language=English<o:p></o:p></p>
<p class="MsoNormal">- *                           some_long %2, some_short %3, some_byte %4, some_wide_char_str %5, some_ansii_str %6<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * you have to code:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *                           WriteEventLogEntryData( pdev->p_self_do, (ULONG)EVENT_MLX4_INFO_TEST, 0, 0, 5,<o:p></o:p></p>
<p class="MsoNormal">- *                                           L"%d", long_int,                                                                                                               // LONG<o:p></o:p></p>
<p class="MsoNormal">- *                                           L"%04x", (ULONG)short_int,                                                                      // SHORT<o:p></o:p></p>
<p class="MsoNormal">- *                                           L"%02x", (ULONG)byte_int,                                                                        // CHAR<o:p></o:p></p>
<p class="MsoNormal">- *                                           L"%s", wide_char_str,                                                                                   // PWCHAR<o:p></o:p></p>
<p class="MsoNormal">- *                                           L"%S", ansii_str                                                                                                 // PCHAR<o:p></o:p></p>
<p class="MsoNormal">- *                           );<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-VOID<o:p></o:p></p>
<p class="MsoNormal">-WriteEventLogEntryData(<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">-              ...<o:p></o:p></p>
<p class="MsoNormal">-              )<o:p></o:p></p>
<p class="MsoNormal">-/*++<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Routine Description:<o:p></o:p></p>
<p class="MsoNormal">-    Writes an event log entry to the event log.<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Arguments:<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              pi_pIoObject......... The IO object ( driver object or device object ).<o:p></o:p></p>
<p class="MsoNormal">-              pi_ErrorCode......... The error code.<o:p></o:p></p>
<p class="MsoNormal">-              pi_UniqueErrorCode... A specific error code.<o:p></o:p></p>
<p class="MsoNormal">-              pi_FinalStatus....... The final status.<o:p></o:p></p>
<p class="MsoNormal">-              pi_nDataItems........ Number of data items (i.e. pairs of data parameters).<o:p></o:p></p>
<p class="MsoNormal">-              .<o:p></o:p></p>
<p class="MsoNormal">-              . data items values<o:p></o:p></p>
<p class="MsoNormal">-              .<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-Return Value:<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              None .<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">---*/<o:p></o:p></p>
<p class="MsoNormal">-{ /* WriteEventLogEntryData */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Variable argument list */    <o:p></o:p></p>
<p class="MsoNormal">-              va_list                                                                   l_Argptr;<o:p></o:p></p>
<p class="MsoNormal">-              /* Pointer to an error log entry */<o:p></o:p></p>
<p class="MsoNormal">-              PIO_ERROR_LOG_PACKET           l_pErrorLogEntry;
<o:p></o:p></p>
<p class="MsoNormal">-              /* sizeof insertion string */<o:p></o:p></p>
<p class="MsoNormal">-              int           l_Size = 0;            <o:p></o:p></p>
<p class="MsoNormal">-              /* temp buffer */<o:p></o:p></p>
<p class="MsoNormal">-              UCHAR l_Buf[ERROR_LOG_MAXIMUM_SIZE - 2];<o:p></o:p></p>
<p class="MsoNormal">-              /* position in buffer */<o:p></o:p></p>
<p class="MsoNormal">-              UCHAR * l_Ptr = l_Buf;<o:p></o:p></p>
<p class="MsoNormal">-              /* Data item index */<o:p></o:p></p>
<p class="MsoNormal">-              USHORT l_nDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-              /* total packet size */<o:p></o:p></p>
<p class="MsoNormal">-              int l_TotalSize;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (pi_pIoObject == NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(pi_pIoObject != NULL);<o:p></o:p></p>
<p class="MsoNormal">-                              return;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Init the variable argument list */   <o:p>
</o:p></p>
<p class="MsoNormal">-              va_start(l_Argptr, pi_nDataItems);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Create the insertion strings Insert the data items */<o:p></o:p></p>
<p class="MsoNormal">-              memset( l_Buf, 0, sizeof(l_Buf) );<o:p></o:p></p>
<p class="MsoNormal">-              for (l_nDataItem = 0; l_nDataItem < pi_nDataItems; l_nDataItem++)
<o:p></o:p></p>
<p class="MsoNormal">-              { <o:p></o:p></p>
<p class="MsoNormal">-                              NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">-                              /* Current binary data item */<o:p></o:p></p>
<p class="MsoNormal">-                              int l_CurDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-                              /* Current pointer data item */<o:p></o:p></p>
<p class="MsoNormal">-                              void* l_CurPtrDataItem ;<o:p></o:p></p>
<p class="MsoNormal">-                              /* format specifier */<o:p></o:p></p>
<p class="MsoNormal">-                              WCHAR* l_FormatStr;<o:p></o:p></p>
<p class="MsoNormal">-                              /* the rest of the buffer */<o:p></o:p></p>
<p class="MsoNormal">-                              int l_BufSize = (int)(l_Buf + sizeof(l_Buf)- l_Ptr);<o:p></o:p></p>
<p class="MsoNormal">-                              /* size of insertion string */<o:p></o:p></p>
<p class="MsoNormal">-                              size_t l_StrSize;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* print as much as we can */<o:p></o:p></p>
<p class="MsoNormal">-                              if ( l_BufSize < 4 )<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-                              /* Get format specifier */<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-                              l_FormatStr = va_arg( l_Argptr, PWCHAR);<o:p></o:p></span></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-                              /* Get next data item */<o:p></o:p></p>
<p class="MsoNormal">-                              if ( !wcscmp( l_FormatStr, L"%s" ) || !wcscmp( l_FormatStr, L"%S" ) ) {<o:p></o:p></p>
<p class="MsoNormal">-                                              l_CurPtrDataItem = va_arg( l_Argptr, PWCHAR);<o:p></o:p></p>
<p class="MsoNormal">-                                              /* convert to string */
<o:p></o:p></p>
<p class="MsoNormal">-                                              status = RtlStringCchPrintfW( (NTSTRSAFE_PWSTR)l_Ptr, l_BufSize>>1, l_FormatStr , l_CurPtrDataItem );<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                              else {<o:p></o:p></p>
<p class="MsoNormal">-                                              l_CurDataItem = va_arg( l_Argptr, int);<o:p></o:p></p>
<p class="MsoNormal">-                                              /* convert to string */
<o:p></o:p></p>
<p class="MsoNormal">-                                              status = RtlStringCchPrintfW( (NTSTRSAFE_PWSTR)l_Ptr, l_BufSize>>1, l_FormatStr , l_CurDataItem );<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              if (!NT_SUCCESS(status))<o:p></o:p></p>
<p class="MsoNormal">-                                              return;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* prepare the next loop */<o:p></o:p></p>
<p class="MsoNormal">-                              status = RtlStringCbLengthW( (NTSTRSAFE_PWSTR)l_Ptr, l_BufSize, &l_StrSize );<o:p></o:p></p>
<p class="MsoNormal">-                              if (!NT_SUCCESS(status))<o:p></o:p></p>
<p class="MsoNormal">-                                              return;<o:p></o:p></p>
<p class="MsoNormal">-                              *(WCHAR*)&l_Ptr[l_StrSize] = (WCHAR)0;<o:p></o:p></p>
<p class="MsoNormal">-                              l_StrSize += 2;<o:p></o:p></p>
<p class="MsoNormal">-                              l_Size = l_Size + (int)l_StrSize;<o:p></o:p></p>
<p class="MsoNormal">-                              l_Ptr = l_Buf + l_Size;<o:p></o:p></p>
<p class="MsoNormal">-                              l_BufSize = (int)(l_Buf + sizeof(l_Buf)- l_Ptr);<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              } /* Inset a data item */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Term the variable argument list */   <o:p>
</o:p></p>
<p class="MsoNormal">-              va_end(l_Argptr);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Allocate an error log entry */ <o:p></o:p></p>
<p class="MsoNormal">-              l_TotalSize =sizeof(IO_ERROR_LOG_PACKET) +l_Size;<o:p></o:p></p>
<p class="MsoNormal">-              if (l_TotalSize >= ERROR_LOG_MAXIMUM_SIZE - 2) {<o:p></o:p></p>
<p class="MsoNormal">-                              l_TotalSize = ERROR_LOG_MAXIMUM_SIZE - 2;<o:p></o:p></p>
<p class="MsoNormal">-                              l_Size = l_TotalSize - sizeof(IO_ERROR_LOG_PACKET);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              l_pErrorLogEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(<o:p></o:p></p>
<p class="MsoNormal">-                              pi_pIoObject,  (UCHAR)l_TotalSize );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Check allocation */<o:p></o:p></p>
<p class="MsoNormal">-              if ( l_pErrorLogEntry != NULL) <o:p></o:p></p>
<p class="MsoNormal">-              { /* OK */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Set the error log entry header */<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->ErrorCode                                     = pi_ErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->DumpDataSize                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->SequenceNumber    = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->MajorFunctionCode = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->IoControlCode                            = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->RetryCount                  = 0;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->UniqueErrorValue     = pi_UniqueErrorCode;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->FinalStatus                    = pi_FinalStatus;
<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->NumberOfStrings = l_nDataItem;<o:p></o:p></p>
<p class="MsoNormal">-                              l_pErrorLogEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET) + l_pErrorLogEntry->DumpDataSize;<o:p></o:p></p>
<p class="MsoNormal">-                              l_Ptr = (UCHAR*)l_pErrorLogEntry + l_pErrorLogEntry->StringOffset;<o:p></o:p></p>
<p class="MsoNormal">-                              if ( l_Size )<o:p></o:p></p>
<p class="MsoNormal">-                                              memcpy( l_Ptr, l_Buf, l_Size );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              /* Write the packet */<o:p></o:p></p>
<p class="MsoNormal">-                              IoWriteErrorLogEntry(l_pErrorLogEntry);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              } /* OK */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-} /* WriteEventLogEntry */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// bsize is to be a strlen(src)<o:p></o:p></p>
<p class="MsoNormal">-// dest has to have enough place, i.e at least (2*strlen(src) + 2)<o:p></o:p></p>
<p class="MsoNormal">-void __ansi_to_wchar( USHORT *dest, UCHAR *src, int bsize)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int i;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              for (i=0; i<bsize; ++i)<o:p></o:p></p>
<p class="MsoNormal">-                              *dest++ = *src++;<o:p></o:p></p>
<p class="MsoNormal">-              *dest = 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/ud_header.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/ud_header.c                (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/ud_header.c             (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,388 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-/*<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">- * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">- * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">- * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">- * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">- *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">- *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">- *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">- * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * $Id: ud_header.c 1349 2004-12-16 21:09:43Z roland $<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "ib_pack.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "mlx4_debug.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if defined(EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">-#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-#include "ud_header.tmh"<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define STRUCT_FIELD(header, field) \<o:p></o:p></p>
<p class="MsoNormal">-              .struct_offset_bytes = offsetof(struct ib_unpacked_ ## header, field),      \<o:p></o:p></p>
<p class="MsoNormal">-              .struct_size_bytes   = sizeof ((struct ib_unpacked_ ## header *) 0)->field, \<o:p></o:p></p>
<p class="MsoNormal">-              .field_name          = #header ":" #field<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define STRUCT_FIELD_INIT(header, field,ow,ob,sb) \<o:p></o:p></p>
<p class="MsoNormal">-              offsetof(struct ib_unpacked_ ## header, field),      \<o:p></o:p></p>
<p class="MsoNormal">-              sizeof ((struct ib_unpacked_ ## header *) 0)->field, \<o:p></o:p></p>
<p class="MsoNormal">-              ow,ob,sb, \<o:p></o:p></p>
<p class="MsoNormal">-              #header ":" #field<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define STRUCT_FIELD_INITR(ow,ob,sb) \<o:p></o:p></p>
<p class="MsoNormal">-                              0, 0, ow, ob, sb, "reserved"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static const struct ib_field lrh_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, virtual_lane, 0, 0, 4) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, link_version, 0, 4, 4) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, service_level, 0, 8, 4) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INITR(0,12,2) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, link_next_header, 0, 14, 2) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, destination_lid, 0, 16, 16) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INITR(1,0,5) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, packet_length, 1, 5, 11) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(lrh, source_lid, 1, 16, 16) }<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static const struct ib_field eth_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(eth, dmac_h, 0, 0, 32) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(eth, dmac_l, 1, 0, 16) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(eth, smac_h, 1, 16,16) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(eth, smac_l, 2, 0 ,32) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(eth, type, 3, 0, 16)}<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static const struct ib_field grh_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, ip_version, 0, 0, 4) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, traffic_class, 0, 4, 8) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, flow_label, 0, 12, 20) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, payload_length, 1, 0, 16) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, next_header, 1, 16, 8) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, hop_limit, 1, 24, 8) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, source_gid, 2, 0, 128) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(grh, destination_gid, 6, 0, 128) }<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static const struct ib_field bth_table[]  = {<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, opcode, 0, 0, 8) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, solicited_event, 0, 8, 1) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, mig_req, 0, 9, 1) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, pad_count, 0, 10, 2) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, transport_header_version, 0, 12, 4) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, pkey, 0, 16, 16) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INITR(1,0,8) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, destination_qpn, 1, 8, 24) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, ack_req, 2, 0, 1) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INITR(2,1,7) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(bth, psn, 2, 8, 24) }<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static const struct ib_field deth_table[] = {<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(deth, qkey, 0, 0, 32) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INITR(1,0,8) },<o:p></o:p></p>
<p class="MsoNormal">-              { STRUCT_FIELD_INIT(deth, source_qpn, 1, 8, 24) }<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_init - Initialize UD header structure<o:p></o:p></p>
<p class="MsoNormal">- * @payload_bytes:Length of packet payload<o:p></o:p></p>
<p class="MsoNormal">- * @grh_present:GRH flag (if non-zero, GRH will be included)<o:p></o:p></p>
<p class="MsoNormal">- * @header:Structure to initialize<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header,<o:p></o:p></p>
<p class="MsoNormal">- * lrh.packet_length, grh.ip_version, grh.payload_length,<o:p></o:p></p>
<p class="MsoNormal">- * grh.next_header, bth.opcode, bth.pad_count and<o:p></o:p></p>
<p class="MsoNormal">- * bth.transport_header_version fields of a &struct ib_ud_header given<o:p></o:p></p>
<p class="MsoNormal">- * the payload length and whether a GRH will be included.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-void ib_ud_header_init(int                            payload_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                     int                                        grh_present,<o:p></o:p></p>
<p class="MsoNormal">-                                     struct ib_ud_header *header)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int header_len;<o:p></o:p></p>
<p class="MsoNormal">-              u16 packet_length;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              memset(header, 0, sizeof *header);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              header_len =<o:p></o:p></p>
<p class="MsoNormal">-                              IB_LRH_BYTES  +<o:p></o:p></p>
<p class="MsoNormal">-                              IB_BTH_BYTES  +<o:p></o:p></p>
<p class="MsoNormal">-                              IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-              if (grh_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              header_len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              header->lrh.link_version     = 0;<o:p></o:p></p>
<p class="MsoNormal">-              header->lrh.link_next_header =<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-                              grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL;<o:p></o:p></span></p>
<p class="MsoNormal">-              packet_length                        = (u16)((IB_LRH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">-                                                                              IB_BTH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">-                                                                              IB_DETH_BYTES    +<o:p></o:p></p>
<p class="MsoNormal">-                                                                              payload_bytes    +<o:p></o:p></p>
<p class="MsoNormal">-                                                                              4                + /* ICRC     */<o:p></o:p></p>
<p class="MsoNormal">-                                                                              3) / 4);            /* round up */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              header->grh_present          = grh_present;<o:p></o:p></p>
<p class="MsoNormal">-              if (grh_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              packet_length                      += IB_GRH_BYTES / 4;<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh.ip_version      = 6;<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh.payload_length  =<o:p></o:p></p>
<p class="MsoNormal">-                                              cpu_to_be16((IB_BTH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">-                                                                   IB_DETH_BYTES    +<o:p></o:p></p>
<p class="MsoNormal">-                                                                   payload_bytes    +<o:p></o:p></p>
<p class="MsoNormal">-                                                                   4                + /* ICRC     */<o:p></o:p></p>
<p class="MsoNormal">-                                                                   3) & ~3);          /* round up */<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh.next_header     = 0x1b;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              header->lrh.packet_length = cpu_to_be16(packet_length);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->immediate_present)<o:p></o:p></p>
<p class="MsoNormal">-                              header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;<o:p></o:p></p>
<p class="MsoNormal">-              else<o:p></o:p></p>
<p class="MsoNormal">-                              header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;<o:p></o:p></p>
<p class="MsoNormal">-              header->bth.pad_count                = (u8)((4 - payload_bytes) & 3);<o:p></o:p></p>
<p class="MsoNormal">-              header->bth.transport_header_version = 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-EXPORT_SYMBOL(ib_ud_header_init);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_pack - Pack UD header struct into wire format<o:p></o:p></p>
<p class="MsoNormal">- * @header:UD header struct<o:p></o:p></p>
<p class="MsoNormal">- * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_pack() packs the UD header structure @header into wire<o:p></o:p></p>
<p class="MsoNormal">- * format in the buffer @buf.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-int ib_ud_header_pack(struct ib_ud_header *header,<o:p></o:p></p>
<p class="MsoNormal">-                                    u8                *buf)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int len = 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_pack(lrh_table, ARRAY_SIZE(lrh_table),<o:p></o:p></p>
<p class="MsoNormal">-                              &header->lrh, buf);<o:p></o:p></p>
<p class="MsoNormal">-              len += IB_LRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->grh_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              ib_pack(grh_table, ARRAY_SIZE(grh_table),<o:p></o:p></p>
<p class="MsoNormal">-                                              &header->grh, buf + len);<o:p></o:p></p>
<p class="MsoNormal">-                              len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_pack(bth_table, ARRAY_SIZE(bth_table),<o:p></o:p></p>
<p class="MsoNormal">-                              &header->bth, buf + len);<o:p></o:p></p>
<p class="MsoNormal">-              len += IB_BTH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_pack(deth_table, ARRAY_SIZE(deth_table),<o:p></o:p></p>
<p class="MsoNormal">-                              &header->deth, buf + len);<o:p></o:p></p>
<p class="MsoNormal">-              len += IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->immediate_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              memcpy(buf + len, &header->immediate_data, sizeof header->immediate_data);<o:p></o:p></p>
<p class="MsoNormal">-                              len += sizeof header->immediate_data;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return len;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-EXPORT_SYMBOL(ib_ud_header_pack);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_unpack - Unpack UD header struct from wire format<o:p></o:p></p>
<p class="MsoNormal">- * @header:UD header struct<o:p></o:p></p>
<p class="MsoNormal">- * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_pack() unpacks the UD header structure @header from wire<o:p></o:p></p>
<p class="MsoNormal">- * format in the buffer @buf.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-int ib_ud_header_unpack(u8                *buf,<o:p></o:p></p>
<p class="MsoNormal">-                                              struct ib_ud_header *header)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ib_unpack(lrh_table, ARRAY_SIZE(lrh_table),<o:p></o:p></p>
<p class="MsoNormal">-                                buf, &header->lrh);<o:p></o:p></p>
<p class="MsoNormal">-              buf += IB_LRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->lrh.link_version != 0) {<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Invalid LRH.link_version %d\n",<o:p></o:p></p>
<p class="MsoNormal">-                                     header->lrh.link_version));<o:p></o:p></p>
<p class="MsoNormal">-                              return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              switch (header->lrh.link_next_header) {<o:p></o:p></p>
<p class="MsoNormal">-              case IB_LNH_IBA_LOCAL:<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh_present = 0;<o:p></o:p></p>
<p class="MsoNormal">-                              break;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              case IB_LNH_IBA_GLOBAL:<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh_present = 1;<o:p></o:p></p>
<p class="MsoNormal">-                              ib_unpack(grh_table, ARRAY_SIZE(grh_table),<o:p></o:p></p>
<p class="MsoNormal">-                                                buf, &header->grh);<o:p></o:p></p>
<p class="MsoNormal">-                              buf += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              if (header->grh.ip_version != 6) {<o:p></o:p></p>
<p class="MsoNormal">-                                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Invalid GRH.ip_version %d\n",<o:p></o:p></p>
<p class="MsoNormal">-                                                     header->grh.ip_version));<o:p></o:p></p>
<p class="MsoNormal">-                                              return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                              if (header->grh.next_header != 0x1b) {<o:p></o:p></p>
<p class="MsoNormal">-                                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Invalid GRH.next_header 0x%02x\n",<o:p></o:p></p>
<p class="MsoNormal">-                                                     header->grh.next_header));<o:p></o:p></p>
<p class="MsoNormal">-                                              return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                              break;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              default:<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Invalid LRH.link_next_header %d\n",<o:p></o:p></p>
<p class="MsoNormal">-                                     header->lrh.link_next_header));<o:p></o:p></p>
<p class="MsoNormal">-                              return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_unpack(bth_table, ARRAY_SIZE(bth_table),<o:p></o:p></p>
<p class="MsoNormal">-                                buf, &header->bth);<o:p></o:p></p>
<p class="MsoNormal">-              buf += IB_BTH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              switch (header->bth.opcode) {<o:p></o:p></p>
<p class="MsoNormal">-              case IB_OPCODE_UD_SEND_ONLY:<o:p></o:p></p>
<p class="MsoNormal">-                              header->immediate_present = 0;<o:p></o:p></p>
<p class="MsoNormal">-                              break;<o:p></o:p></p>
<p class="MsoNormal">-              case IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE:<o:p></o:p></p>
<p class="MsoNormal">-                              header->immediate_present = 1;<o:p></o:p></p>
<p class="MsoNormal">-                              break;<o:p></o:p></p>
<p class="MsoNormal">-              default:<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Invalid BTH.opcode 0x%02x\n",<o:p></o:p></p>
<p class="MsoNormal">-                                     header->bth.opcode));<o:p></o:p></p>
<p class="MsoNormal">-                              return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->bth.transport_header_version != 0) {<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_WARNING, MLX4_DBG_DRV,( "Invalid BTH.transport_header_version %d\n",<o:p></o:p></p>
<p class="MsoNormal">-                                     header->bth.transport_header_version));<o:p></o:p></p>
<p class="MsoNormal">-                              return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_unpack(deth_table, ARRAY_SIZE(deth_table),<o:p></o:p></p>
<p class="MsoNormal">-                                buf, &header->deth);<o:p></o:p></p>
<p class="MsoNormal">-              buf += IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->immediate_present)<o:p></o:p></p>
<p class="MsoNormal">-                              memcpy(&header->immediate_data, buf, sizeof header->immediate_data);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-EXPORT_SYMBOL(ib_ud_header_unpack);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_rdmaoe_ud_header_init - Initialize UD header structure<o:p></o:p></p>
<p class="MsoNormal">- * @payload_bytes:Length of packet payload<o:p></o:p></p>
<p class="MsoNormal">- * @grh_present:GRH flag (if non-zero, GRH will be included)<o:p></o:p></p>
<p class="MsoNormal">- * @header:Structure to initialize<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_rdmaoe_ud_header_init() initializes the grh.ip_version, grh.payload_length,<o:p></o:p></p>
<p class="MsoNormal">- * grh.next_header, bth.opcode, bth.pad_count and<o:p></o:p></p>
<p class="MsoNormal">- * bth.transport_header_version fields of a &struct eth_ud_header given<o:p></o:p></p>
<p class="MsoNormal">- * the payload length and whether a GRH will be included.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-void ib_rdmaoe_ud_header_init(int                                         payload_bytes,<o:p></o:p></p>
<p class="MsoNormal">-                                                 int                            grh_present,<o:p></o:p></p>
<p class="MsoNormal">-                                                 struct eth_ud_header    *header)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int header_len;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              memset(header, 0, sizeof *header);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              header_len =<o:p></o:p></p>
<p class="MsoNormal">-                              sizeof header->eth  +<o:p></o:p></p>
<p class="MsoNormal">-                              IB_BTH_BYTES  +<o:p></o:p></p>
<p class="MsoNormal">-                              IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-              if (grh_present)<o:p></o:p></p>
<p class="MsoNormal">-                              header_len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              header->grh_present          = grh_present;<o:p></o:p></p>
<p class="MsoNormal">-              if (grh_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh.ip_version      = 6;<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh.payload_length  =<o:p></o:p></p>
<p class="MsoNormal">-                                              cpu_to_be16((IB_BTH_BYTES     +<o:p></o:p></p>
<p class="MsoNormal">-                                                                   IB_DETH_BYTES    +<o:p></o:p></p>
<p class="MsoNormal">-                                                                   payload_bytes    +<o:p></o:p></p>
<p class="MsoNormal">-                                                                   4                + /* ICRC     */<o:p></o:p></p>
<p class="MsoNormal">-                                                                   3) & ~3);          /* round up */<o:p></o:p></p>
<p class="MsoNormal">-                              header->grh.next_header     = 0x1b;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->immediate_present)<o:p></o:p></p>
<p class="MsoNormal">-                              header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;<o:p></o:p></p>
<p class="MsoNormal">-              else<o:p></o:p></p>
<p class="MsoNormal">-                              header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;<o:p></o:p></p>
<p class="MsoNormal">-              header->bth.pad_count                =(u8) ((4 - payload_bytes) & 3);<o:p></o:p></p>
<p class="MsoNormal">-              header->bth.transport_header_version = 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * rdmaoe_ud_header_pack - Pack UD header struct into eth wire format<o:p></o:p></p>
<p class="MsoNormal">- * @header:UD header struct<o:p></o:p></p>
<p class="MsoNormal">- * @buf:Buffer to pack into<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * ib_ud_header_pack() packs the UD header structure @header into wire<o:p></o:p></p>
<p class="MsoNormal">- * format in the buffer @buf.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-int rdmaoe_ud_header_pack(struct eth_ud_header *header,<o:p></o:p></p>
<p class="MsoNormal">-                                     void                 *buf)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int len = 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_pack(eth_table, ARRAY_SIZE(eth_table),<o:p></o:p></p>
<p class="MsoNormal">-                              &header->eth, buf);<o:p></o:p></p>
<p class="MsoNormal">-              len += IB_ETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->grh_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              ib_pack(grh_table, ARRAY_SIZE(grh_table),<o:p></o:p></p>
<p class="MsoNormal">-                                              &header->grh, (u8*)buf + len);<o:p></o:p></p>
<p class="MsoNormal">-                              len += IB_GRH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_pack(bth_table, ARRAY_SIZE(bth_table),<o:p></o:p></p>
<p class="MsoNormal">-                              &header->bth, (u8*)buf + len);<o:p></o:p></p>
<p class="MsoNormal">-              len += IB_BTH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ib_pack(deth_table, ARRAY_SIZE(deth_table),<o:p></o:p></p>
<p class="MsoNormal">-                              &header->deth, (u8*)buf + len);<o:p></o:p></p>
<p class="MsoNormal">-              len += IB_DETH_BYTES;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (header->immediate_present) {<o:p></o:p></p>
<p class="MsoNormal">-                              memcpy((u8*)buf + len, &header->immediate_data,<o:p></o:p></p>
<p class="MsoNormal">-                                     sizeof header->immediate_data);<o:p></o:p></p>
<p class="MsoNormal">-                              len += sizeof header->immediate_data;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return len;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_umem.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_umem.c               (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_umem.c            (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,186 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#include <mlx4_debug.h><o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "ib_verbs.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if defined (EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">-#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w_umem.tmh"<o:p></o:p></p>
<p class="MsoNormal">-#endif <o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_umem_release - release memory pinned with ib_umem_get<o:p></o:p></p>
<p class="MsoNormal">- * @umem: umem struct to release<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-void ib_umem_release(struct ib_umem *p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              MLX4_ENTER(MLX4_DBG_MEMORY);<o:p></o:p></p>
<p class="MsoNormal">-              if (p_ib_umem->secure_handle) {<o:p></o:p></p>
<p class="MsoNormal">-                              __try {<o:p></o:p></p>
<p class="MsoNormal">-                                              MmUnsecureVirtualMemory( p_ib_umem->secure_handle );<o:p></o:p></p>
<p class="MsoNormal">-                                              p_ib_umem->secure_handle = NULL;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                              __except (EXCEPTION_EXECUTE_HANDLER) {<o:p></o:p></p>
<p class="MsoNormal">-                                              NTSTATUS Status = GetExceptionCode();<o:p></o:p></p>
<p class="MsoNormal">-                                              UNUSED_PARAM_WOWPP(Status);<o:p></o:p></p>
<p class="MsoNormal">-                                              MLX4_PRINT(TRACE_LEVEL_ERROR ,MLX4_DBG_MEMORY ,<o:p></o:p></p>
<p class="MsoNormal">-                                                              ("Exception 0x%x on MmUnsecureVirtualMemory(), addr %I64x, size %I64x, seg_num %d, nr_pages %d\n",
<o:p></o:p></p>
<p class="MsoNormal">-                                                              Status, p_ib_umem->iobuf.va, (u64)p_ib_umem->iobuf.size,
<o:p></o:p></p>
<p class="MsoNormal">-                                                              p_ib_umem->iobuf.seg_num, p_ib_umem->iobuf.nr_pages ));<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              if (p_ib_umem->iobuf_used)<o:p></o:p></p>
<p class="MsoNormal">-                              iobuf_deregister_with_cash(&p_ib_umem->iobuf);<o:p></o:p></p>
<p class="MsoNormal">-              kfree(p_ib_umem);<o:p></o:p></p>
<p class="MsoNormal">-              MLX4_EXIT(MLX4_DBG_MEMORY);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * ib_umem_get - Pin and DMA map userspace memory.<o:p></o:p></p>
<p class="MsoNormal">- * @context: userspace context to pin memory for<o:p></o:p></p>
<p class="MsoNormal">- * @addr: userspace virtual address to start at<o:p></o:p></p>
<p class="MsoNormal">- * @size: length of region to pin<o:p></o:p></p>
<p class="MsoNormal">- * @access: IB_ACCESS_xxx flags for memory being pinned<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-struct ib_umem *ib_umem_get(struct ib_ucontext *context, u64 addr,<o:p></o:p></p>
<p class="MsoNormal">-                                                  size_t size, enum ib_access_flags access, boolean_t secure)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int err;<o:p></o:p></p>
<p class="MsoNormal">-              struct ib_umem *p_ib_umem;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              MLX4_ENTER(MLX4_DBG_MEMORY);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              // create the object<o:p></o:p></p>
<p class="MsoNormal">-              p_ib_umem = kzalloc(sizeof *p_ib_umem, GFP_KERNEL);<o:p></o:p></p>
<p class="MsoNormal">-              if (!p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">-                              goto err_nomem;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              p_ib_umem->p_uctx = context;<o:p></o:p></p>
<p class="MsoNormal">-              p_ib_umem->page_size = PAGE_SIZE;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              // register the memory <o:p></o:p></p>
<p class="MsoNormal">-              iobuf_init( addr, (u64)size, !!context, &p_ib_umem->iobuf);<o:p></o:p></p>
<p class="MsoNormal">-              err =  iobuf_register_with_cash( addr, (u64)size, !!context,
<o:p></o:p></p>
<p class="MsoNormal">-                              &access, &p_ib_umem->iobuf );<o:p></o:p></p>
<p class="MsoNormal">-              if (err)<o:p></o:p></p>
<p class="MsoNormal">-                              goto err_reg_mem;<o:p></o:p></p>
<p class="MsoNormal">-              p_ib_umem->iobuf_used = TRUE;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              // TODO: map the memory for DMA<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              // secure memory<o:p></o:p></p>
<p class="MsoNormal">-              if (!context || !secure)<o:p></o:p></p>
<p class="MsoNormal">-                              goto done;<o:p></o:p></p>
<p class="MsoNormal">-              __try {<o:p></o:p></p>
<p class="MsoNormal">-                              p_ib_umem->secure_handle = MmSecureVirtualMemory (
<o:p></o:p></p>
<p class="MsoNormal">-                                              (PVOID)(ULONG_PTR)addr, size,<o:p></o:p></p>
<p class="MsoNormal">-                                              (access & IB_ACCESS_LOCAL_WRITE) ? PAGE_READWRITE : PAGE_READONLY );<o:p></o:p></p>
<p class="MsoNormal">-                              if (p_ib_umem->secure_handle == NULL)
<o:p></o:p></p>
<p class="MsoNormal">-                                              goto err_secure;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              __except (EXCEPTION_EXECUTE_HANDLER) {<o:p></o:p></p>
<p class="MsoNormal">-                              NTSTATUS Status = GetExceptionCode();<o:p></o:p></p>
<p class="MsoNormal">-                              UNUSED_PARAM_WOWPP(Status);<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_ERROR ,MLX4_DBG_MEMORY ,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("Exception 0x%x on MmSecureVirtualMemory(), addr %I64x, size %I64x, access %#x\n",
<o:p></o:p></p>
<p class="MsoNormal">-                                              Status, addr, (u64)size, access ));<o:p></o:p></p>
<p class="MsoNormal">-                              goto err_secure;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              goto done;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-err_secure:<o:p></o:p></p>
<p class="MsoNormal">-              iobuf_deregister(&p_ib_umem->iobuf);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-err_reg_mem:                <o:p></o:p></p>
<p class="MsoNormal">-              kfree(p_ib_umem);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-err_nomem:    <o:p></o:p></p>
<p class="MsoNormal">-              p_ib_umem = ERR_PTR(-ENOMEM);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-done:  <o:p></o:p></p>
<p class="MsoNormal">-              MLX4_EXIT(MLX4_DBG_MEMORY);<o:p></o:p></p>
<p class="MsoNormal">-              return p_ib_umem;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int ib_umem_page_count(struct ib_umem *p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return (int)p_ib_umem->iobuf.nr_pages;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-dma_addr_t ib_umem_get_dma(struct ib_umem *p_ib_umem)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              u64 pages[1] = { 0 };<o:p></o:p></p>
<p class="MsoNormal">-              iobuf_iter_t iobuf_iter;<o:p></o:p></p>
<p class="MsoNormal">-              dma_addr_t dma_addr = { 0, 0 , 0 };<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              iobuf_iter_init( &p_ib_umem->iobuf, &iobuf_iter );<o:p></o:p></p>
<p class="MsoNormal">-              iobuf_get_tpt_seg( &p_ib_umem->iobuf, &iobuf_iter, 1, pages );<o:p></o:p></p>
<p class="MsoNormal">-              // TODO: convert phys address to DMA one<o:p></o:p></p>
<p class="MsoNormal">-              dma_addr.da = pages[0];<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return dma_addr;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Returns: 0 on success, -ENOMEM or -EACCESS or -EFAULT on error<o:p></o:p></p>
<p class="MsoNormal">-int ib_umem_map(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           u64 va,<o:p></o:p></p>
<p class="MsoNormal">-              IN                           u64 size,<o:p></o:p></p>
<p class="MsoNormal">-              IN                           ib_access_t acc,<o:p></o:p></p>
<p class="MsoNormal">-              OUT                       PMDL *mdl,<o:p></o:p></p>
<p class="MsoNormal">-              OUT                       void **kva)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              PMDL p_mdl;<o:p></o:p></p>
<p class="MsoNormal">-              int rc = 0;<o:p></o:p></p>
<p class="MsoNormal">-              LOCK_OPERATION lock_op = (acc & IB_AC_LOCAL_WRITE) ? IoModifyAccess : IoReadAccess;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              p_mdl = IoAllocateMdl( (PVOID)(ULONG_PTR)va, (ULONG)size, FALSE,FALSE,NULL);<o:p></o:p></p>
<p class="MsoNormal">-              if (p_mdl == NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                              rc = -ENOMEM;<o:p></o:p></p>
<p class="MsoNormal">-                              goto err_alloc_mdl;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              __try { <o:p></o:p></p>
<p class="MsoNormal">-                              MmProbeAndLockPages( p_mdl, UserMode, lock_op );   /* lock memory */<o:p></o:p></p>
<p class="MsoNormal">-              } <o:p></o:p></p>
<p class="MsoNormal">-              __except (EXCEPTION_EXECUTE_HANDLER)       {<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_MEMORY,
<o:p></o:p></p>
<p class="MsoNormal">-                                              ("MOSAL_iobuf_register: Exception 0x%x on MmProbeAndLockPages(), va %I64d, sz %I64d\n",
<o:p></o:p></p>
<p class="MsoNormal">-                                              GetExceptionCode(), va, size));<o:p></o:p></p>
<p class="MsoNormal">-                              rc = -EACCES;<o:p></o:p></p>
<p class="MsoNormal">-                              goto err_probe;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              *kva = MmMapLockedPagesSpecifyCache( p_mdl, <o:p>
</o:p></p>
<p class="MsoNormal">-                              KernelMode, MmNonCached, NULL, FALSE, NormalPagePriority );<o:p></o:p></p>
<p class="MsoNormal">-              if (*kva == NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                              MLX4_PRINT(TRACE_LEVEL_ERROR ,MLX4_DBG_MEMORY ,("MmMapLockedPagesSpecifyCache failed\n"));<o:p></o:p></p>
<p class="MsoNormal">-                              rc = -EFAULT;<o:p></o:p></p>
<p class="MsoNormal">-                              goto err_map;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              *mdl = p_mdl;<o:p></o:p></p>
<p class="MsoNormal">-              return 0;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-err_map:<o:p></o:p></p>
<p class="MsoNormal">-              MmUnlockPages(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">-err_probe:<o:p></o:p></p>
<p class="MsoNormal">-              IoFreeMdl(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">-err_alloc_mdl:  <o:p></o:p></p>
<p class="MsoNormal">-              return rc;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void ib_umem_unmap(<o:p></o:p></p>
<p class="MsoNormal">-              IN PMDL p_mdl,<o:p></o:p></p>
<p class="MsoNormal">-              IN void *kva)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (kva) {<o:p></o:p></p>
<p class="MsoNormal">-                              MmUnmapLockedPages( kva, p_mdl );<o:p></o:p></p>
<p class="MsoNormal">-                              MmUnlockPages(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">-                              IoFreeMdl(p_mdl);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_radix.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_radix.c   (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_radix.c                (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,74 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-/*<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * This software is available to you under the OpenIB.org BSD license<o:p></o:p></p>
<p class="MsoNormal">- * below:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">- *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">- *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">- *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">- * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * $Id: radix.c 1611 2006-08-20 14:48:55Z sleybo $<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "errno.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int radix_tree_insert(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">-              unsigned long index, void *item)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if ( NULL == cl_map_insert( &root->map, (const uint64_t)index, item ) )<o:p></o:p></p>
<p class="MsoNormal">-                              return -EFAULT;<o:p></o:p></p>
<p class="MsoNormal">-              return 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *radix_tree_lookup(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">-              unsigned long index)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              void* item = cl_map_get( &root->map, (const uint64_t)index );<o:p></o:p></p>
<p class="MsoNormal">-              return item;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *radix_tree_delete(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">-              unsigned long index)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              void* item = cl_map_remove( &root->map, (const uint64_t)index );<o:p></o:p></p>
<p class="MsoNormal">-              return item;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-cl_status_t radix_tree_create(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">-              gfp_t gfp_mask)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-#define MIN_ITEMS                     32<o:p></o:p></p>
<p class="MsoNormal">-              cl_status_t cl_status;<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              cl_map_construct( &root->map );<o:p></o:p></p>
<p class="MsoNormal">-              cl_status = cl_map_init( &root->map, MIN_ITEMS );<o:p></o:p></p>
<p class="MsoNormal">-              return cl_status;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void radix_tree_destroy(struct radix_tree_root *root )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              cl_map_destroy( &root->map );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_memory.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_memory.c           (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/l2w_memory.c        (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,173 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-/*<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2004 Topspin Corporation.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- * Copyright (c) 2005 Mellanox Technologies.  All rights reserved.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * This software is available to you under a choice of one of two<o:p></o:p></p>
<p class="MsoNormal">- * licenses.  You may choose to be licensed under the terms of the GNU<o:p></o:p></p>
<p class="MsoNormal">- * General Public License (GPL) Version 2, available from the file<o:p></o:p></p>
<p class="MsoNormal">- * COPYING in the main directory of this source tree, or the<o:p></o:p></p>
<p class="MsoNormal">- * OpenIB.org BSD license below:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *     Redistribution and use in source and binary forms, with or<o:p></o:p></p>
<p class="MsoNormal">- *     without modification, are permitted provided that the following<o:p></o:p></p>
<p class="MsoNormal">- *     conditions are met:<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions of source code must retain the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- *      - Redistributions in binary form must reproduce the above<o:p></o:p></p>
<p class="MsoNormal">- *        copyright notice, this list of conditions and the following<o:p></o:p></p>
<p class="MsoNormal">- *        disclaimer in the documentation and/or other materials<o:p></o:p></p>
<p class="MsoNormal">- *        provided with the distribution.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<o:p></o:p></p>
<p class="MsoNormal">- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<o:p></o:p></p>
<p class="MsoNormal">- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<o:p></o:p></p>
<p class="MsoNormal">- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<o:p></o:p></p>
<p class="MsoNormal">- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<o:p></o:p></p>
<p class="MsoNormal">- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<o:p></o:p></p>
<p class="MsoNormal">- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<o:p></o:p></p>
<p class="MsoNormal">- * SOFTWARE.<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * $Id: mt_memory.c 2020 2007-05-01 09:29:10Z leonid $<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w.h"<o:p></o:p></p>
<p class="MsoNormal">-#include <mlx4_debug.h><o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if defined (EVENT_TRACING)<o:p></o:p></p>
<p class="MsoNormal">-#ifdef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#undef offsetof<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-#include "l2w_memory.tmh"<o:p></o:p></p>
<p class="MsoNormal">-#endif <o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void st_dev_add_cont_mem_stat( PMLX4_ST_DEVICE p_stat, ULONG size );<o:p></o:p></p>
<p class="MsoNormal">-void st_dev_rmv_cont_mem_stat( PMLX4_ST_DEVICE p_stat, ULONG size );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *alloc_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">-              IN                           unsigned long size,<o:p></o:p></p>
<p class="MsoNormal">-              OUT                       dma_addr_t*p_dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              void *va = NULL;<o:p></o:p></p>
<p class="MsoNormal">-              PHYSICAL_ADDRESS  pa = {0};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              memset( p_dma_addr, 0, sizeof(dma_addr_t) );<o:p></o:p></p>
<p class="MsoNormal">-              if (!size)<o:p></o:p></p>
<p class="MsoNormal">-                              goto end;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// DmaOperations->AllocateCommonBuffer can get stuck for a long time
<o:p></o:p></p>
<p class="MsoNormal">-// when there is no enough contiguous memory<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifdef SUPPORT_DMA_MEMORY<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              {<o:p></o:p></p>
<p class="MsoNormal">-                              DMA_ADAPTER *p_adapter = pdev->p_dma_adapter;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              va           = p_adapter->DmaOperations->AllocateCommonBuffer(<o:p></o:p></p>
<p class="MsoNormal">-                                              p_adapter, size, &pa, FALSE );<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-                              if (va) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">-                                              p_dma_addr->da = pa.QuadPart;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">-                                              p_dma_addr->va = va;<o:p></o:p></span></p>
<p class="MsoNormal">-                                              p_dma_addr->sz             = (ULONG)size;<o:p></o:p></p>
<p class="MsoNormal">-                                              st_dev_add_cont_mem_stat( pdev->p_stat, size );<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              {<o:p></o:p></p>
<p class="MsoNormal">-                              PHYSICAL_ADDRESS la = {0}, ha = {(u64)(-1I64)};<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-                              va = MmAllocateContiguousMemorySpecifyCache( (SIZE_T)size, la, ha, pa, MmCached );<o:p></o:p></p>
<p class="MsoNormal">-                              if (va) {<o:p></o:p></p>
<p class="MsoNormal">-                                              pa = MmGetPhysicalAddress( va );<o:p></o:p></p>
<p class="MsoNormal">-                                              // TODO: convert physical adress to dma one
<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-                                              p_dma_addr->da = pa.QuadPart;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-AR">-                                              p_dma_addr->va = va;<o:p></o:p></span></p>
<p class="MsoNormal">-                                              p_dma_addr->sz             = (ULONG)size;<o:p></o:p></p>
<p class="MsoNormal">-                                              st_dev_add_cont_mem_stat( pdev->p_stat, size );<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-end:<o:p></o:p></p>
<p class="MsoNormal">-              if (!va)<o:p></o:p></p>
<p class="MsoNormal">-        MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_MEMORY,<o:p></o:p></p>
<p class="MsoNormal">-            ("%s: AllocateCommonBuffer: failed to allocate contiguous %#x bytes\n",pdev->name, size));<o:p></o:p></p>
<p class="MsoNormal">-              return va;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void free_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">-              IN                           dma_addr_t*p_dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-#ifdef SUPPORT_DMA_MEMORY<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              {<o:p></o:p></p>
<p class="MsoNormal">-                              DMA_ADAPTER *p_adapter = pdev->p_dma_adapter;<o:p></o:p></p>
<p class="MsoNormal">-                              PHYSICAL_ADDRESS  pa;<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-                              pa.QuadPart = p_dma_addr->da;<o:p></o:p></p>
<p class="MsoNormal">-                              p_adapter->DmaOperations->FreeCommonBuffer(
<o:p></o:p></p>
<p class="MsoNormal">-                                              p_adapter, p_dma_addr->sz, pa, p_dma_addr->va, FALSE );<o:p></o:p></p>
<p class="MsoNormal">-                              st_dev_rmv_cont_mem_stat( pdev->p_stat, p_dma_addr->sz );<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              {<o:p></o:p></p>
<p class="MsoNormal">-                              KIRQL old_irql = 0, cur_irql = KeGetCurrentIrql();<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-                              if (cur_irql < APC_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">-                                              KeRaiseIrql( APC_LEVEL, &old_irql );<o:p></o:p></p>
<p class="MsoNormal">-                              MmFreeContiguousMemory( p_dma_addr->va );<o:p></o:p></p>
<p class="MsoNormal">-                              st_dev_rmv_cont_mem_stat( pdev->p_stat, p_dma_addr->sz );<o:p></o:p></p>
<p class="MsoNormal">-                              if (cur_irql < APC_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">-                                              KeLowerIrql( old_irql );<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *<o:p></o:p></p>
<p class="MsoNormal">-dma_alloc_coherent( struct mlx4_dev **dev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">-              dma_addr_t *p_dma_addr, gfp_t gfp )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(gfp);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (!size)<o:p></o:p></p>
<p class="MsoNormal">-                              return NULL;<o:p></o:p></p>
<p class="MsoNormal">-              return alloc_cont_mem( (*dev)->pdev, (unsigned long)size, p_dma_addr );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void <o:p></o:p></p>
<p class="MsoNormal">-dma_free_coherent( struct mlx4_dev **dev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">-              void *vaddr, dma_addr_t dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(vaddr);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(size == dma_addr.sz);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(vaddr == dma_addr.va);<o:p></o:p></p>
<p class="MsoNormal">-              free_cont_mem( (*dev)->pdev, &dma_addr );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void <o:p></o:p></p>
<p class="MsoNormal">-pci_free_consistent( struct pci_dev *pdev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">-              void *vaddr, dma_addr_t dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              dma_free_coherent( &pdev->dev, size, vaddr, dma_addr );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/SOURCES<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/SOURCES       (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/core/SOURCES    (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -19,17 +19,10 @@<o:p></o:p></p>
<p class="MsoNormal">                cache.c                                 \<o:p></o:p></p>
<p class="MsoNormal">                device.c                               \<o:p></o:p></p>
<p class="MsoNormal">                iobuf.c                                  \<o:p></o:p></p>
<p class="MsoNormal">-              l2w.c                                      \<o:p></o:p></p>
<p class="MsoNormal">-              l2w_radix.c                         \<o:p></o:p></p>
<p class="MsoNormal">-              l2w_debug.c                      \<o:p></o:p></p>
<p class="MsoNormal">-              l2w_memory.c  \<o:p></o:p></p>
<p class="MsoNormal">-              l2w_umem.c                      \<o:p></o:p></p>
<p class="MsoNormal">                pa_cash.c                            \<o:p></o:p></p>
<p class="MsoNormal">-              packer.c                               \<o:p></o:p></p>
<p class="MsoNormal">-              ud_header.c                      \<o:p></o:p></p>
<p class="MsoNormal">                verbs.c                                 \<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-INCLUDES=..;..\inc;..\..\inc;..\net;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..;..\inc;..\..\inc;..\net;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;..\..\..\..\..\inc\kernel\l2w;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -D__LITTLE_ENDIAN -DUSE_WDM_INTERRUPTS
<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/ib/SOURCES<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/ib/SOURCES            (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/ib/SOURCES         (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -23,7 +23,7 @@<o:p></o:p></p>
<p class="MsoNormal">                qp.c                                       \<o:p></o:p></p>
<p class="MsoNormal">                srq.c                                      <o:p>
</o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-INCLUDES=..;..\inc;..\..\inc;..\core\$O;..\..\..\inc;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..;..\inc;..\..\inc;..\core\$O;..\..\..\inc;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;..\..\..\..\..\inc\kernel\l2w;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -D__LITTLE_ENDIAN<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/drv/sources<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/drv/sources            (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/drv/sources         (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -43,7 +43,7 @@<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -D__LITTLE_ENDIAN -DUSE_WDM_INTERRUPTS<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-INCLUDES=..;..\inc;..\..\inc;..\core;..\..\..\inc;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;..\core;..\core\$O<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..;..\inc;..\..\inc;..\core;..\..\..\inc;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;..\core;..\core\$O;..\..\..\..\..\inc\kernel\l2w;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> TARGETLIBS= $(TARGETLIBS) \<o:p></o:p></p>
<p class="MsoNormal">@@ -51,7 +51,8 @@<o:p></o:p></p>
<p class="MsoNormal">                $(LIBPATH)\*\complib.lib \<o:p></o:p></p>
<p class="MsoNormal">                $(LIBPATH)\*\mlx4_core.lib \<o:p></o:p></p>
<p class="MsoNormal">                $(LIBPATH)\*\mlx4_ib.lib \<o:p></o:p></p>
<p class="MsoNormal">-              $(LIBPATH)\*\mlx4_net.lib <o:p></o:p></p>
<p class="MsoNormal">+             $(LIBPATH)\*\mlx4_net.lib \<o:p></o:p></p>
<p class="MsoNormal">+             $(LIBPATH)\*\l2w.lib<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/drv/drv.c<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/drv/drv.c  (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/bus/drv/drv.c               (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1341,6 +1341,9 @@<o:p></o:p></p>
<p class="MsoNormal">                KeInitializeEvent(&pVipBusIfc->NicData.ConfigChangeEvent, SynchronizationEvent, TRUE);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+//#define DONT_START_ON_BOOT<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> NTSTATUS<o:p></o:p></p>
<p class="MsoNormal"> EvtDriverDeviceAdd(<o:p></o:p></p>
<p class="MsoNormal">                IN WDFDRIVER                  Driver,<o:p></o:p></p>
<p class="MsoNormal">@@ -1380,11 +1383,24 @@<o:p></o:p></p>
<p class="MsoNormal">                int bus = 0, dev = 0, function= 0;<o:p></o:p></p>
<p class="MsoNormal">                UCHAR *ptr;<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                UNREFERENCED_PARAMETER(Driver);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                PAGED_CODE ();<o:p></o:p></p>
<p class="MsoNormal">                MLX4_ENTER(MLX4_DBG_DRV);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+#ifdef DONT_START_ON_BOOT<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             int    QueryTimeIncrement = KeQueryTimeIncrement();<o:p></o:p></p>
<p class="MsoNormal">+                             LARGE_INTEGER              Ticks;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             KeQueryTickCount(&Ticks);<o:p></o:p></p>
<p class="MsoNormal">+                             if (Ticks.QuadPart * QueryTimeIncrement / 10000 < 30000) // 10,000 moves from 100ns to ms<o:p></o:p></p>
<p class="MsoNormal">+                             {<o:p></o:p></p>
<p class="MsoNormal">+                                             return STATUS_NO_MEMORY;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">                //<o:p></o:p></p>
<p class="MsoNormal">                // register PnP & Power stuff<o:p></o:p></p>
<p class="MsoNormal">                //<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_pcipool.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_pcipool.h          (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_pcipool.h       (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,102 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-typedef struct pci_pool {<o:p></o:p></p>
<p class="MsoNormal">-              size_t                                                                    size;<o:p></o:p></p>
<p class="MsoNormal">-              struct mlx4_dev               *                             mdev;<o:p></o:p></p>
<p class="MsoNormal">-              char                                                                       name [32];<o:p></o:p></p>
<p class="MsoNormal">-              NPAGED_LOOKASIDE_LIST          pool_hdr;<o:p></o:p></p>
<p class="MsoNormal">-} pci_pool_t;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-// taken from dmapool.c<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* pci_pool_create - Creates a pool of consistent memory blocks, for dma.<o:p></o:p></p>
<p class="MsoNormal">-* @name: name of pool, for diagnostics<o:p></o:p></p>
<p class="MsoNormal">-* @mdev: device that will be doing the DMA<o:p></o:p></p>
<p class="MsoNormal">-* @size: size of the blocks in this pool.<o:p></o:p></p>
<p class="MsoNormal">-* @align: alignment requirement for blocks; must be a power of two<o:p></o:p></p>
<p class="MsoNormal">-* @allocation: returned blocks won't cross this boundary (or zero)<o:p></o:p></p>
<p class="MsoNormal">-* Context: !in_interrupt()<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* Returns a dma allocation pool with the requested characteristics, or<o:p></o:p></p>
<p class="MsoNormal">-* null if one can't be created.  Given one of these pools, dma_pool_alloc()<o:p></o:p></p>
<p class="MsoNormal">-* may be used to allocate memory.  Such memory will all have "consistent"<o:p></o:p></p>
<p class="MsoNormal">-* DMA mappings, accessible by the device and its driver without using<o:p></o:p></p>
<p class="MsoNormal">-* cache flushing primitives.  The actual size of blocks allocated may be<o:p></o:p></p>
<p class="MsoNormal">-* larger than requested because of alignment.<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* If allocation is nonzero, objects returned from dma_pool_alloc() won't<o:p></o:p></p>
<p class="MsoNormal">- * cross that size boundary.  This is useful for devices which have<o:p></o:p></p>
<p class="MsoNormal">- * addressing restrictions on individual DMA transfers, such as not crossing<o:p></o:p></p>
<p class="MsoNormal">- * boundaries of 4KBytes.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">- <o:p></o:p></p>
<p class="MsoNormal">-pci_pool_t *<o:p></o:p></p>
<p class="MsoNormal">-pci_pool_create (const char *name, struct pci_dev *pdev,<o:p></o:p></p>
<p class="MsoNormal">-        size_t size, size_t align, size_t allocation);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * dma_pool_alloc - get a block of consistent memory<o:p></o:p></p>
<p class="MsoNormal">- * @pool: dma pool that will produce the block<o:p></o:p></p>
<p class="MsoNormal">- * @mem_flags: GFP_* bitmask<o:p></o:p></p>
<p class="MsoNormal">- * @handle: pointer to dma address of block<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * This returns the kernel virtual address of a currently unused block,<o:p></o:p></p>
<p class="MsoNormal">- * and reports its dma address through the handle.<o:p></o:p></p>
<p class="MsoNormal">- * If such a memory block can't be allocated, null is returned.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-static inline void * <o:p></o:p></p>
<p class="MsoNormal">-pci_pool_alloc (pci_pool_t *pool, int mem_flags, dma_addr_t *handle)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              PHYSICAL_ADDRESS pa;<o:p></o:p></p>
<p class="MsoNormal">-              void * ptr;<o:p></o:p></p>
<p class="MsoNormal">-              UNREFERENCED_PARAMETER(mem_flags);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ptr = ExAllocateFromNPagedLookasideList( &pool->pool_hdr );<o:p></o:p></p>
<p class="MsoNormal">-              if (ptr != NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                              pa = MmGetPhysicalAddress( ptr );<o:p></o:p></p>
<p class="MsoNormal">-                              // TODO: convert physical adress to dma one
<o:p></o:p></p>
<p class="MsoNormal">-                              handle->da = pa.QuadPart;<o:p></o:p></p>
<p class="MsoNormal">-                              handle->va = ptr;<o:p></o:p></p>
<p class="MsoNormal">-                              handle->sz = 0; /* not known here */<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return ptr; <o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* dma_pool_free - put block back into dma pool<o:p></o:p></p>
<p class="MsoNormal">-* @pool: the dma pool holding the block<o:p></o:p></p>
<p class="MsoNormal">-* @vaddr: virtual address of block<o:p></o:p></p>
<p class="MsoNormal">-* @dma: dma address of block<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* Caller promises neither device nor driver will again touch this block<o:p></o:p></p>
<p class="MsoNormal">-* unless it is first re-allocated.<o:p></o:p></p>
<p class="MsoNormal">-*/<o:p></o:p></p>
<p class="MsoNormal">-static inline        void<o:p></o:p></p>
<p class="MsoNormal">-pci_pool_free (pci_pool_t *pool, void *vaddr, dma_addr_t dma)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNREFERENCED_PARAMETER(dma);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              ExFreeToNPagedLookasideList( &pool->pool_hdr, vaddr );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">- * pci_pool_destroy - destroys a pool of dma memory blocks.<o:p></o:p></p>
<p class="MsoNormal">- * @pool: dma pool that will be destroyed<o:p></o:p></p>
<p class="MsoNormal">- * Context: !in_interrupt()<o:p></o:p></p>
<p class="MsoNormal">- *<o:p></o:p></p>
<p class="MsoNormal">- * Caller guarantees that no more memory from the pool is in use,<o:p></o:p></p>
<p class="MsoNormal">- * and that nothing will try to use the pool after this call.<o:p></o:p></p>
<p class="MsoNormal">- */<o:p></o:p></p>
<p class="MsoNormal">-static inline        void<o:p></o:p></p>
<p class="MsoNormal">-pci_pool_destroy (pci_pool_t *pool)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ExDeleteNPagedLookasideList( &pool->pool_hdr );<o:p></o:p></p>
<p class="MsoNormal">-              ExFreePool( pool);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_radix.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_radix.h               (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_radix.h            (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,26 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include <complib/cl_map.h><o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct radix_tree_root {<o:p></o:p></p>
<p class="MsoNormal">-              cl_map_t             map;<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int radix_tree_insert(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">-              unsigned long index, void *item);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *radix_tree_lookup(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">-              unsigned long index);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *radix_tree_delete(struct radix_tree_root *root, <o:p>
</o:p></p>
<p class="MsoNormal">-              unsigned long index);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-cl_status_t radix_tree_create(struct radix_tree_root *root,<o:p></o:p></p>
<p class="MsoNormal">-              gfp_t gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void radix_tree_destroy(struct radix_tree_root *root );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define INIT_RADIX_TREE(root, mask)                radix_tree_create(root, mask)<o:p></o:p></p>
<p class="MsoNormal">-#define RMV_RADIX_TREE(root)                            radix_tree_destroy(root)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_memory.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_memory.h       (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_memory.h    (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,334 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include "iobuf.h"<o:p></o:p></p>
<p class="MsoNormal">-#include "complib\cl_debug.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// CONSTANTS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define MT_TAG_ATOMIC                        'MOTA'<o:p></o:p></p>
<p class="MsoNormal">-#define MT_TAG_KERNEL                         'LNRK'<o:p></o:p></p>
<p class="MsoNormal">-#define MT_TAG_HIGH                                              'HGIH'<o:p></o:p></p>
<p class="MsoNormal">-#define MT_TAG_PCIPOOL                       'PICP'<o:p></o:p></p>
<p class="MsoNormal">-#define MT_TAG_IOMAP                          'PAMI'<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// SUBSTITUTIONS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// MACROS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define PAGE_MASK                                                                                   (~(PAGE_SIZE-1))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">- ////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">- //<o:p></o:p></p>
<p class="MsoNormal">- // Helper functions<o:p></o:p></p>
<p class="MsoNormal">- //<o:p></o:p></p>
<p class="MsoNormal">- ////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// returns log of number of pages, i.e<o:p></o:p></p>
<p class="MsoNormal">-// for size <= 4096 ==> 0<o:p></o:p></p>
<p class="MsoNormal">-// for size <= 8192 ==> 1<o:p></o:p></p>
<p class="MsoNormal">-static inline int get_order(unsigned long size)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int order;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              size = (size-1) >> (PAGE_SHIFT-1);<o:p></o:p></p>
<p class="MsoNormal">-              order = -1;<o:p></o:p></p>
<p class="MsoNormal">-              do {<o:p></o:p></p>
<p class="MsoNormal">-                              size >>= 1;<o:p></o:p></p>
<p class="MsoNormal">-                              order++;<o:p></o:p></p>
<p class="MsoNormal">-              } while (size);<o:p></o:p></p>
<p class="MsoNormal">-              return order;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline unsigned long roundup_pow_of_two(unsigned long x)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return (1UL << fls(x - 1));<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// SYSTEM MEMORY<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-typedef enum _gfp {<o:p></o:p></p>
<p class="MsoNormal">-              __GFP_NOWARN                            = 0,         /* Suppress page allocation failure warning */<o:p></o:p></p>
<p class="MsoNormal">-              __GFP_HIGHMEM                          = 0,         /* high memory */<o:p></o:p></p>
<p class="MsoNormal">-              GFP_ATOMIC                                    = 1,         /* can't wait (i.e. DPC or higher) */<o:p></o:p></p>
<p class="MsoNormal">-              GFP_KERNEL                                      = 2,         /* can wait (npaged) */<o:p></o:p></p>
<p class="MsoNormal">-              GFP_HIGHUSER                                = 4          /* GFP_KERNEL, that can be in HIGH memory */<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-gfp_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct vm_area_struct {<o:p></o:p></p>
<p class="MsoNormal">-              void *    ptr;<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void * kmalloc( SIZE_T bsize, gfp_t gfp_mask)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              void *ptr;<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(bsize);<o:p></o:p></p>
<p class="MsoNormal">-              switch (gfp_mask) {<o:p></o:p></p>
<p class="MsoNormal">-                              case GFP_ATOMIC:<o:p></o:p></p>
<p class="MsoNormal">-                                              ptr = ExAllocatePoolWithTag( NonPagedPool, bsize, MT_TAG_ATOMIC );<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-                              case GFP_KERNEL:<o:p></o:p></p>
<p class="MsoNormal">-                                              ptr = ExAllocatePoolWithTag( NonPagedPool, bsize, MT_TAG_KERNEL );<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-                              case GFP_HIGHUSER:<o:p></o:p></p>
<p class="MsoNormal">-                                              ptr = ExAllocatePoolWithTag( NonPagedPool, bsize, MT_TAG_HIGH );<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-                              default:<o:p></o:p></p>
<p class="MsoNormal">-                                              cl_dbg_out("kmalloc: unsupported flag %d\n", gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">-                                              ptr = NULL;<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return ptr;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void * kzalloc( SIZE_T bsize, gfp_t gfp_mask)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              void* va = kmalloc(bsize, gfp_mask);<o:p></o:p></p>
<p class="MsoNormal">-              if (va)<o:p></o:p></p>
<p class="MsoNormal">-                              RtlZeroMemory(va, bsize);<o:p></o:p></p>
<p class="MsoNormal">-              return va;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void *kcalloc(size_t n, size_t size, gfp_t flags)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (n != 0 && size > ULONG_MAX / n)<o:p></o:p></p>
<p class="MsoNormal">-                              return NULL;<o:p></o:p></p>
<p class="MsoNormal">-              return kzalloc(n * size, flags);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void kfree (const void *pobj)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              if (pobj)<o:p></o:p></p>
<p class="MsoNormal">-                              ExFreePool((void *)pobj);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define get_zeroed_page(mask)                                           kzalloc(PAGE_SIZE, mask)<o:p></o:p></p>
<p class="MsoNormal">-#define free_page(ptr)                                                                               kfree(ptr)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// IO SPACE <==> SYSTEM MEMORY<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* ioremap     -   map bus memory into CPU space<o:p></o:p></p>
<p class="MsoNormal">-* @addr:      bus address of the memory<o:p></o:p></p>
<p class="MsoNormal">-* @size:      size of the resource to map<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* ioremap performs a platform specific sequence of operations to<o:p></o:p></p>
<p class="MsoNormal">-* make bus memory CPU accessible via the readb/readw/readl/writeb/<o:p></o:p></p>
<p class="MsoNormal">-* writew/writel functions and the other mmio helpers. The returned<o:p></o:p></p>
<p class="MsoNormal">-* address is not guaranteed to be usable directly as a virtual<o:p></o:p></p>
<p class="MsoNormal">-* address. <o:p></o:p></p>
<p class="MsoNormal">-*/<o:p></o:p></p>
<p class="MsoNormal">-static inline        void *ioremap(io_addr_t addr, SIZE_T size, MEMORY_CACHING_TYPE cache_type)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              PHYSICAL_ADDRESS pa;<o:p></o:p></p>
<p class="MsoNormal">-              void *va;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              pa.QuadPart = addr;<o:p></o:p></p>
<p class="MsoNormal">-              va = MmMapIoSpace( pa, size, cache_type ); <o:p>
</o:p></p>
<p class="MsoNormal">-              return va;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void iounmap(void *va, SIZE_T size)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              MmUnmapIoSpace( va, size );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// DMA SUPPORT<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-enum dma_data_direction {<o:p></o:p></p>
<p class="MsoNormal">-              PCI_DMA_BIDIRECTIONAL,<o:p></o:p></p>
<p class="MsoNormal">-              PCI_DMA_TODEVICE,<o:p></o:p></p>
<p class="MsoNormal">-              DMA_TO_DEVICE = PCI_DMA_TODEVICE<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define dma_get_cache_alignment                      (int)KeGetRecommendedSharedDataAlignment<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// wrapper to DMA address<o:p></o:p></p>
<p class="MsoNormal">-typedef struct _dma_addr<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              // TODO: in some cases it is still physical address today<o:p></o:p></p>
<p class="MsoNormal">-              io_addr_t                                            da;                          /* logical (device) address */<o:p></o:p></p>
<p class="MsoNormal">-              void *                                                    va;                          /* kernel virtual address */<o:p></o:p></p>
<p class="MsoNormal">-              unsigned long                    sz;           /* buffer size */<o:p></o:p></p>
<p class="MsoNormal">-} dma_addr_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define lowmem_page_address(dma_addr)    ((dma_addr).va)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct mlx4_dev;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *alloc_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">-              IN                           unsigned long size,<o:p></o:p></p>
<p class="MsoNormal">-              OUT                       dma_addr_t*p_dma_addr);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void free_cont_mem(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">-              IN                           dma_addr_t*p_dma_addr);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// TODO: translate to DMA space - for now is not done anything<o:p></o:p></p>
<p class="MsoNormal">-static inline dma_addr_t pci_map_page(struct pci_dev *pdev,
<o:p></o:p></p>
<p class="MsoNormal">-              dma_addr_t dma_addr, unsigned long offset, SIZE_T size, int direction)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(offset);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              return dma_addr; <o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline dma_addr_t <o:p></o:p></p>
<p class="MsoNormal">-alloc_pages( struct pci_dev *pdev, gfp_t gfp, int order )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              dma_addr_t dma_addr;<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(gfp);<o:p></o:p></p>
<p class="MsoNormal">-              alloc_cont_mem( pdev, PAGE_SIZE << order, &dma_addr );<o:p></o:p></p>
<p class="MsoNormal">-              return dma_addr;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define alloc_page(pdev, mask)                             alloc_pages(pdev, (mask), 0)<o:p></o:p></p>
<p class="MsoNormal">-#define __get_free_page(mask)                           kzalloc(PAGE_SIZE, mask)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void <o:p></o:p></p>
<p class="MsoNormal">-__free_pages( struct pci_dev *pdev, dma_addr_t dma_addr, int order )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(order);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT((PAGE_SIZE << order) == (int)dma_addr.sz);<o:p></o:p></p>
<p class="MsoNormal">-              free_cont_mem( pdev, &dma_addr );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define __free_page(pdev, dma_addr)              __free_pages(pdev, (dma_addr), 0)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int pci_dma_mapping_error(dma_addr_t dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return !dma_addr.sz;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void pci_unmap_page(struct pci_dev *pdev, <o:p>
</o:p></p>
<p class="MsoNormal">-              dma_addr_t dma_addr, SIZE_T size, int direction)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(dma_addr);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-dma_sync_single( struct mlx4_dev **dev, dma_addr_t dma_addr,<o:p></o:p></p>
<p class="MsoNormal">-              size_t size, int direction)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(dev);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(dma_addr);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(size);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">-              // TODO: here is to be used FlushAdapterBuffers()<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void *<o:p></o:p></p>
<p class="MsoNormal">-dma_alloc_coherent( struct mlx4_dev **dev, size_t size, <o:p>
</o:p></p>
<p class="MsoNormal">-              dma_addr_t *p_dma, gfp_t gfp );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void dma_free_coherent( struct mlx4_dev **dev, size_t size,
<o:p></o:p></p>
<p class="MsoNormal">-              void *vaddr, dma_addr_t dma_handle);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">- void pci_free_consistent( struct pci_dev *pdev, size_t size,
<o:p></o:p></p>
<p class="MsoNormal">-              void *vaddr, dma_addr_t dma_handle);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// SG lists<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define sg_dma_addr(sg)                                                                          ((sg)->dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-#define sg_dma_address(sg)                                                   ((sg)->dma_addr.da)<o:p></o:p></p>
<p class="MsoNormal">-#define sg_dma_len(sg)                                                                             ((sg)->dma_addr.sz)<o:p></o:p></p>
<p class="MsoNormal">-#define sg_dma_address_inc(p_dma,val)          (p_dma)->da += val<o:p></o:p></p>
<p class="MsoNormal">-#define sg_page(sg)                                                                                     ((sg)->dma_addr)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct scatterlist {<o:p></o:p></p>
<p class="MsoNormal">-              dma_addr_t                                       dma_addr;          /* logical (device) address */<o:p></o:p></p>
<p class="MsoNormal">-              unsigned int                       offset;                  /* offset in the first page */<o:p></o:p></p>
<p class="MsoNormal">-              PMDL                                                    p_mdl;                  /* MDL, if any (used for user space buffers) */<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define offset_in_page(va)      ((ULONG)((ULONG_PTR)(va) & ~PAGE_MASK))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              memset(sgl, 0, sizeof(*sgl) * nents);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void sg_set_buf(struct scatterlist *sg, const void *buf,<o:p></o:p></p>
<p class="MsoNormal">-              unsigned int buflen)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(buflen);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(sg->dma_addr.sz == buflen);<o:p></o:p></p>
<p class="MsoNormal">-              sg->offset = offset_in_page(buf);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void sg_set_page(struct scatterlist *sg, <o:p>
</o:p></p>
<p class="MsoNormal">-              dma_addr_t dma_addr, unsigned int len, unsigned int offset)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(len);<o:p></o:p></p>
<p class="MsoNormal">-              sg->offset = offset;<o:p></o:p></p>
<p class="MsoNormal">-              sg->dma_addr = dma_addr;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* Returns: the number of unmapped sg elements */<o:p></o:p></p>
<p class="MsoNormal">-static inline int pci_map_sg(struct pci_dev *pdev, <o:p></o:p></p>
<p class="MsoNormal">-              struct scatterlist *sg, int nents, int direction)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(sg);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">-              return nents;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* Returns: the number of unmapped sg elements */<o:p></o:p></p>
<p class="MsoNormal">-static inline int pci_unmap_sg(struct pci_dev *pdev, <o:p></o:p></p>
<p class="MsoNormal">-              struct scatterlist *sg,      int nents, int direction)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(pdev);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(sg);<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(direction);<o:p></o:p></p>
<p class="MsoNormal">-              return nents;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_pci.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_pci.h   (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_pci.h                (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,86 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// ===========================================<o:p></o:p></p>
<p class="MsoNormal">-// LITERALS<o:p></o:p></p>
<p class="MsoNormal">-// ===========================================<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// ===========================================<o:p></o:p></p>
<p class="MsoNormal">-// TYPES<o:p></o:p></p>
<p class="MsoNormal">-// ===========================================<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// ===========================================<o:p></o:p></p>
<p class="MsoNormal">-// MACROS/FUNCTIONS<o:p></o:p></p>
<p class="MsoNormal">-// ===========================================<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define PCI_DEVFN(slot, func)                                ((((slot) & 0x1f) << 3) | ((func) & 0x07))<o:p></o:p></p>
<p class="MsoNormal">-#define PCI_SLOT(devfn)                                                           (((devfn) >> 3) & 0x1f)<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-#define PCI_FUNC(devfn)                                                         ((devfn) & 0x07)<o:p></o:p></span></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-NTSTATUS pci_hca_reset( struct pci_dev *pdev);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* use shim to implement that */<o:p></o:p></p>
<p class="MsoNormal">-#define mlx4_reset(dev)                           pci_hca_reset(dev->pdev)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// get bar boundaries<o:p></o:p></p>
<p class="MsoNormal">-#define pci_resource_start(dev,bar_num)        ((dev)->bar[bar_num >> 1].phys)<o:p></o:p></p>
<p class="MsoNormal">-#define pci_resource_len(dev,bar_num)           ((dev)->bar[bar_num >> 1].size)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// i/o to registers<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline u64 readq(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: write atomic implementation of _IO_READ_QWORD and change mthca_doorbell.h<o:p></o:p></p>
<p class="MsoNormal">-              u64 val;<o:p></o:p></p>
<p class="MsoNormal">-              READ_REGISTER_BUFFER_ULONG((PULONG)(addr), (PULONG)&val, 2 );<o:p></o:p></p>
<p class="MsoNormal">-              return val;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline u32 readl(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return READ_REGISTER_ULONG((PULONG)(addr));<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline u16 reads(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return READ_REGISTER_USHORT((PUSHORT)(addr));<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline u8 readb(const volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return READ_REGISTER_UCHAR((PUCHAR)(addr));<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_readq                  readq<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_readl                   readl<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_reads                  reads<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_readb                  readb<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void writeq(unsigned __int64 val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: write atomic implementation of _IO_WRITE_QWORD and change mthca_doorbell.h<o:p></o:p></p>
<p class="MsoNormal">-              WRITE_REGISTER_BUFFER_ULONG( (PULONG)(addr), (PULONG)&val, 2 );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void writel(unsigned int val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              WRITE_REGISTER_ULONG((PULONG)(addr),val);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void writes(unsigned short val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              WRITE_REGISTER_USHORT((PUSHORT)(addr),val);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void writeb(unsigned char val, volatile void __iomem *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              WRITE_REGISTER_UCHAR((PUCHAR)(addr),val);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_writeq                                writeq<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_writel                  writel<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_writes                 writes<o:p></o:p></p>
<p class="MsoNormal">-#define __raw_writeb                                writeb<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_list.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_list.h   (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_list.h                (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,99 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// TYPES<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Use the type, defined in wdm.h<o:p></o:p></p>
<p class="MsoNormal">-#define list_head           _LIST_ENTRY<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// MACROS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Define and initialize a list header<o:p></o:p></p>
<p class="MsoNormal">-#define LIST_HEAD(name) \<o:p></o:p></p>
<p class="MsoNormal">-              struct list_head name = { &(name), &(name) }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Initialize a list header<o:p></o:p></p>
<p class="MsoNormal">-#define INIT_LIST_HEAD(ptr)                   InitializeListHead(ptr)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Get to the beginning of the struct for this list entry<o:p></o:p></p>
<p class="MsoNormal">-#define list_entry(ptr, type, member) CONTAINING_RECORD(ptr, type, member)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Iterate over list of 'list_els' of given 'type'<o:p></o:p></p>
<p class="MsoNormal">-#define list_for_each_entry(list_el, head, member, type)                                         \<o:p></o:p></p>
<p class="MsoNormal">-              for ( list_el = list_entry((head)->Flink, type, member);                   \<o:p></o:p></p>
<p class="MsoNormal">-                              &list_el->member != (head);                                                                                                                                     \<o:p></o:p></p>
<p class="MsoNormal">-                              list_el = list_entry(list_el->member.Flink, type, member))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Iterate backwards over list of 'list_els' of given 'type'<o:p></o:p></p>
<p class="MsoNormal">-#define list_for_each_entry_reverse(list_el, head, member, type)       \<o:p></o:p></p>
<p class="MsoNormal">-              for (list_el = list_entry((head)->Blink, type, member);                                   \<o:p></o:p></p>
<p class="MsoNormal">-                              &list_el->member != (head);                                                                                                                                     \<o:p></o:p></p>
<p class="MsoNormal">-                              list_el = list_entry(list_el->member.Blink, type, member))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Iterate over list of given type safe against removal of list entry<o:p></o:p></p>
<p class="MsoNormal">-#define list_for_each_entry_safe(list_el, tmp_list_el, head, member,type, tmp_type)               \<o:p></o:p></p>
<p class="MsoNormal">-              for (list_el = list_entry((head)->Flink, type, member),                                                                                                    \<o:p></o:p></p>
<p class="MsoNormal">-                              tmp_list_el = list_entry(list_el->member.Flink, type, member);                                                                \<o:p></o:p></p>
<p class="MsoNormal">-                              &list_el->member != (head);                                                                                                                                                                                                    
 \<o:p></o:p></p>
<p class="MsoNormal">-                              list_el = tmp_list_el,                                                                                                                                                                                                                      
 \<o:p></o:p></p>
<p class="MsoNormal">-                              tmp_list_el = list_entry(tmp_list_el->member.Flink, tmp_type, member))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// FUNCTIONS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Insert a new entry after the specified head.<o:p></o:p></p>
<p class="MsoNormal">-static inline void list_add(struct list_head *new_entry, struct list_head *head)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              InsertHeadList( head, new_entry );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Insert a new entry before the specified head.<o:p></o:p></p>
<p class="MsoNormal">-static inline void list_add_tail(struct list_head *new_entry, struct list_head *head)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              InsertTailList( head, new_entry );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Deletes entry from list.<o:p></o:p></p>
<p class="MsoNormal">-static inline void list_del(struct list_head *entry)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              RemoveEntryList( entry );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Tests whether a list is empty<o:p></o:p></p>
<p class="MsoNormal">-static inline int list_empty(const struct list_head *head)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return IsListEmpty( head );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Insert src_list into dst_list and reinitialise the emptied src_list.<o:p></o:p></p>
<p class="MsoNormal">-static inline void list_splice_init(struct list_head *src_list,<o:p></o:p></p>
<p class="MsoNormal">-              struct list_head *dst_list)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (!list_empty(src_list)) {<o:p></o:p></p>
<p class="MsoNormal">-                              struct list_head *first = src_list->Flink;<o:p></o:p></p>
<p class="MsoNormal">-                              struct list_head *last = src_list->Blink;<o:p></o:p></p>
<p class="MsoNormal">-                              struct list_head *at = dst_list->Flink;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              first->Blink = dst_list;<o:p></o:p></p>
<p class="MsoNormal">-                              dst_list->Flink = first;<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">-                              last->Flink = at;<o:p></o:p></p>
<p class="MsoNormal">-                              at->Blink = last;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              INIT_LIST_HEAD(src_list);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_sync.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_sync.h                (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_sync.h             (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,165 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// literals<o:p></o:p></p>
<p class="MsoNormal">-#ifndef LONG_MAX<o:p></o:p></p>
<p class="MsoNormal">-#define LONG_MAX      2147483647L   /* maximum (signed) long value */<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifndef ULONG_MAX<o:p></o:p></p>
<p class="MsoNormal">-#define ULONG_MAX 4294967295UL<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// mutex wrapper<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct mutex<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KMUTEX m;<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define DEFINE_MUTEX(a)                       struct mutex a<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void mutex_init( struct mutex * mutex )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KeInitializeMutex( &mutex->m, 0 );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void mutex_lock( struct mutex * mutex )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              NTSTATUS           status;<o:p></o:p></p>
<p class="MsoNormal">-              int                                           need_to_wait = 1;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              while (need_to_wait) {<o:p></o:p></p>
<p class="MsoNormal">-                              status = KeWaitForSingleObject( &mutex->m, Executive, KernelMode, FALSE,   NULL );<o:p></o:p></p>
<p class="MsoNormal">-                              if (status == STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void mutex_unlock( struct mutex * mutex )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              KeReleaseMutex( &mutex->m, FALSE );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// semaphore wrapper<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct semaphore<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KSEMAPHORE s;<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void sema_init(<o:p></o:p></p>
<p class="MsoNormal">-              IN struct semaphore *sem,<o:p></o:p></p>
<p class="MsoNormal">-              IN LONG  cnt)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              KeInitializeSemaphore( &sem->s, cnt, cnt );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void up( struct semaphore *sem )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              KeReleaseSemaphore( &sem->s, 0, 1, FALSE );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-static inline void down( struct semaphore *sem )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              NTSTATUS                           status;<o:p></o:p></p>
<p class="MsoNormal">-              int need_to_wait = 1;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              while (need_to_wait) {<o:p></o:p></p>
<p class="MsoNormal">-                              status = KeWaitForSingleObject( &sem->s, Executive, KernelMode, FALSE,  NULL );<o:p></o:p></p>
<p class="MsoNormal">-                              if (status == STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// completion wrapper<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct completion<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KEVENT                                event;<o:p></o:p></p>
<p class="MsoNormal">-              int                                           done;<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void init_completion( struct completion * compl )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: ASSERT is temporary outcommented, because using of fast mutexes in CompLib<o:p></o:p></p>
<p class="MsoNormal">-              // cause working on APC_LEVEL<o:p></o:p></p>
<p class="MsoNormal">-              //ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);          
<o:p></o:p></p>
<p class="MsoNormal">-              KeInitializeEvent( &compl->event, NotificationEvent , FALSE );<o:p></o:p></p>
<p class="MsoNormal">-              compl->done = 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int wait_for_completion_timeout( struct completion * compl, unsigned long timeout )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              LARGE_INTEGER interval;<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              interval.QuadPart = (-10)* (__int64)timeout;<o:p></o:p></p>
<p class="MsoNormal">-              return (int)KeWaitForSingleObject( &compl->event, Executive, KernelMode, FALSE,  &interval );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void wait_for_completion( struct completion * compl )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">-              int need_to_wait = 1;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              while (need_to_wait) {<o:p></o:p></p>
<p class="MsoNormal">-                              status = KeWaitForSingleObject( &compl->event, Executive, KernelMode, FALSE,  NULL );<o:p></o:p></p>
<p class="MsoNormal">-                              if (status == STATUS_SUCCESS)<o:p></o:p></p>
<p class="MsoNormal">-                              break;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void complete( struct completion * compl )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              compl->done++;<o:p></o:p></p>
<p class="MsoNormal">-              KeSetEvent( &compl->event, 0, FALSE );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifdef USE_WDM_INTERRUPTS<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// IRQ wrapper<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-void free_irq(struct mlx4_dev *dev);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int request_irq(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           struct mlx4_dev *            dev,                      
<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PKSERVICE_ROUTINE     isr,                          /* ISR */<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PVOID                                                   isr_ctx, /* ISR context */<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PKMESSAGE_SERVICE_ROUTINE              misr,                      /* Message ISR */<o:p></o:p></p>
<p class="MsoNormal">-              OUT                       PKINTERRUPT                    *             int_obj                 /* interrupt object */<o:p></o:p></p>
<p class="MsoNormal">-              );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// various<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// TODO: Is it enough to wait at DPC level ? <o:p></o:p></p>
<p class="MsoNormal">-// Maybe we need to use here KeSynchronizeExecution ?<o:p></o:p></p>
<p class="MsoNormal">-static inline void synchronize_irq(unsigned int irq)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(irq);<o:p></o:p></p>
<p class="MsoNormal">-              KeFlushQueuedDpcs();<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_bitmap.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_bitmap.h          (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_bitmap.h       (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,79 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define DECLARE_BITMAP(name,bits) \<o:p></o:p></p>
<p class="MsoNormal">-              unsigned long name[BITS_TO_LONGS(bits)]<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline unsigned long atomic_set_bit(int nr, volatile long * addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-                              return InterlockedOr( addr, (1 << nr) );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline unsigned long atomic_clear_bit(int nr, volatile long * addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return InterlockedAnd( addr, ~(1 << nr) );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline  int set_bit(int nr,unsigned long * addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              addr += nr >> 5;<o:p></o:p></p>
<p class="MsoNormal">-              return atomic_set_bit( nr & 0x1f, (volatile long *)addr );              
<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline  int clear_bit(int nr, unsigned long * addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              addr += nr >> 5;<o:p></o:p></p>
<p class="MsoNormal">-              return atomic_clear_bit( nr & 0x1f, (volatile long *)addr ); 
<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline  int test_bit(int nr, const unsigned long * addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-       int     mask;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-       addr += nr >> 5;<o:p></o:p></p>
<p class="MsoNormal">-       mask = 1 << (nr & 0x1f);<o:p></o:p></p>
<p class="MsoNormal">-       return ((mask & *addr) != 0);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void bitmap_zero(unsigned long *dst, int nbits)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (nbits <= BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">-                              *dst = 0UL;<o:p></o:p></p>
<p class="MsoNormal">-              else {<o:p></o:p></p>
<p class="MsoNormal">-                              int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);<o:p></o:p></p>
<p class="MsoNormal">-                              RtlZeroMemory(dst, len);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define BITMAP_LAST_WORD_MASK(nbits)    \<o:p></o:p></p>
<p class="MsoNormal">-              ( ((nbits) % BITS_PER_LONG) ? (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL )<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int __bitmap_full(const unsigned long *bitmap, int bits);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int bitmap_full(const unsigned long *src, int nbits)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (nbits <= BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">-                              return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));<o:p></o:p></p>
<p class="MsoNormal">-              else<o:p></o:p></p>
<p class="MsoNormal">-                              return __bitmap_full(src, nbits);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int __bitmap_empty(const unsigned long *bitmap, int bits);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int bitmap_empty(const unsigned long *src, int nbits)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              if (nbits <= BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">-                              return ! (*src & BITMAP_LAST_WORD_MASK(nbits));<o:p></o:p></p>
<p class="MsoNormal">-              else<o:p></o:p></p>
<p class="MsoNormal">-                              return __bitmap_empty(src, nbits);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void bitmap_fill(unsigned long *dst, int nbits)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              size_t nlongs = BITS_TO_LONGS(nbits);<o:p></o:p></p>
<p class="MsoNormal">-              if (nlongs > 1) {<o:p></o:p></p>
<p class="MsoNormal">-              int len = (int)((nlongs - 1) * sizeof(unsigned long));<o:p></o:p></p>
<p class="MsoNormal">-              memset(dst, 0xff, len);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_atomic.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_atomic.h           (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_atomic.h        (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,60 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include "complib/cl_atomic.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-typedef volatile __int32              atomic_t;             /* as atomic32_t */<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define atomic_inc       cl_atomic_inc<o:p></o:p></p>
<p class="MsoNormal">-#define atomic_dec      cl_atomic_dec<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline atomic_t atomic_read(atomic_t *pval) <o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return *pval;      <o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void atomic_set(atomic_t *pval, long val)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              *pval = (__int32)val;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* atomic_inc_and_test - decrement and test<o:p></o:p></p>
<p class="MsoNormal">-* pval: pointer of type atomic_t<o:p></o:p></p>
<p class="MsoNormal">-* <o:p></o:p></p>
<p class="MsoNormal">-* Atomically increments pval by 1 and<o:p></o:p></p>
<p class="MsoNormal">-* returns true if the result is 0, or false for all other<o:p></o:p></p>
<p class="MsoNormal">-* cases.<o:p></o:p></p>
<p class="MsoNormal">-*/ <o:p></o:p></p>
<p class="MsoNormal">-static inline int<o:p></o:p></p>
<p class="MsoNormal">-atomic_inc_and_test(atomic_t *pval)<o:p></o:p></p>
<p class="MsoNormal">-{ <o:p></o:p></p>
<p class="MsoNormal">-              return cl_atomic_inc(pval) == 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* atomic_dec_and_test - decrement and test<o:p></o:p></p>
<p class="MsoNormal">-* pval: pointer of type atomic_t<o:p></o:p></p>
<p class="MsoNormal">-* <o:p></o:p></p>
<p class="MsoNormal">-* Atomically decrements pval by 1 and<o:p></o:p></p>
<p class="MsoNormal">-* returns true if the result is 0, or false for all other<o:p></o:p></p>
<p class="MsoNormal">-* cases.<o:p></o:p></p>
<p class="MsoNormal">-*/ <o:p></o:p></p>
<p class="MsoNormal">-static inline int<o:p></o:p></p>
<p class="MsoNormal">-atomic_dec_and_test(atomic_t *pval)<o:p></o:p></p>
<p class="MsoNormal">-{ <o:p></o:p></p>
<p class="MsoNormal">-              return cl_atomic_dec(pval) == 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* atomic_dec_return - decrement and return the value<o:p></o:p></p>
<p class="MsoNormal">-* pval: pointer of type atomic_t<o:p></o:p></p>
<p class="MsoNormal">-* <o:p></o:p></p>
<p class="MsoNormal">-* Atomically decrements pval by 1 and retruns the new value<o:p></o:p></p>
<p class="MsoNormal">-*/ <o:p></o:p></p>
<p class="MsoNormal">-static inline int<o:p></o:p></p>
<p class="MsoNormal">-atomic_dec_return(atomic_t *pval)<o:p></o:p></p>
<p class="MsoNormal">-{ <o:p></o:p></p>
<p class="MsoNormal">-              return cl_atomic_dec(pval);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_bit.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_bit.h   (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_bit.h                (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,192 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Nth element of the table contains the index of the first set bit of N; 8 - for N=0<o:p></o:p></p>
<p class="MsoNormal">-extern char g_set_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">-// Nth element of the table contains the index of the first cleared bit of N; 8 - for N=0<o:p></o:p></p>
<p class="MsoNormal">-extern char g_clr_bit_tbl[256];<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int fls(int x)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              int r = 32;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (!x)<o:p></o:p></p>
<p class="MsoNormal">-                              return 0;<o:p></o:p></p>
<p class="MsoNormal">-              if (!(x & 0xffff0000u)) {<o:p></o:p></p>
<p class="MsoNormal">-                              x <<= 16;<o:p></o:p></p>
<p class="MsoNormal">-                              r -= 16;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              if (!(x & 0xff000000u)) {<o:p></o:p></p>
<p class="MsoNormal">-                              x <<= 8;<o:p></o:p></p>
<p class="MsoNormal">-                              r -= 8;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              if (!(x & 0xf0000000u)) {<o:p></o:p></p>
<p class="MsoNormal">-                              x <<= 4;<o:p></o:p></p>
<p class="MsoNormal">-                              r -= 4;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              if (!(x & 0xc0000000u)) {<o:p></o:p></p>
<p class="MsoNormal">-                              x <<= 2;<o:p></o:p></p>
<p class="MsoNormal">-                              r -= 2;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              if (!(x & 0x80000000u)) {<o:p></o:p></p>
<p class="MsoNormal">-                              x <<= 1;<o:p></o:p></p>
<p class="MsoNormal">-                              r -= 1;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return r;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* _ffs_raw - find the first one bit in a word<o:p></o:p></p>
<p class="MsoNormal">-* @addr: The address to start the search at<o:p></o:p></p>
<p class="MsoNormal">-* @offset: The bitnumber to start searching at<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* returns: 0 - if not found or N+1, if found Nth bit<o:p></o:p></p>
<p class="MsoNormal">-*/<o:p></o:p></p>
<p class="MsoNormal">-static __inline int _ffs_raw(const unsigned long *addr, int offset)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: not an effective code - is better in Assembler<o:p></o:p></p>
<p class="MsoNormal">-              int mask;<o:p></o:p></p>
<p class="MsoNormal">-              int rbc;<o:p></o:p></p>
<p class="MsoNormal">-              int ix;<o:p></o:p></p>
<p class="MsoNormal">-              if (!*addr) return 0;<o:p></o:p></p>
<p class="MsoNormal">-              mask = 1 << offset;<o:p></o:p></p>
<p class="MsoNormal">-              rbc = BITS_PER_LONG - offset;<o:p></o:p></p>
<p class="MsoNormal">-              for (ix=0; ix<rbc; ix++, mask<<=1) {<o:p></o:p></p>
<p class="MsoNormal">-                              if (*addr & mask)<o:p></o:p></p>
<p class="MsoNormal">-                                              return offset + ix + 1;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// as previous with offset = 0<o:p></o:p></p>
<p class="MsoNormal">-static __inline int _ffs(const unsigned long *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              unsigned char *ptr = (unsigned char *)addr;<o:p></o:p></p>
<p class="MsoNormal">-              if (!*addr) return 0;                                                                         // skip sero dword<o:p></o:p></p>
<p class="MsoNormal">-              if (!*(short*)ptr) ptr += 2;                                                            // get to the non-zero word<o:p></o:p></p>
<p class="MsoNormal">-              if (!*(char*)ptr) ptr++;                                                                                  // get to the non-zero byte<o:p></o:p></p>
<p class="MsoNormal">-              return (int)(((ptr - (unsigned char *)addr ) << 3) + g_set_bit_tbl[*ptr] + 1);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define ffs(val)               _ffs((const unsigned long *)&(val))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* _ffz_raw - find the first zero bit in a word<o:p></o:p></p>
<p class="MsoNormal">-* @addr: The address to start the search at<o:p></o:p></p>
<p class="MsoNormal">-* @offset: The bitnumber to start searching at<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* returns: 0 - if not found or N+1, if found Nth bit<o:p></o:p></p>
<p class="MsoNormal">-*/<o:p></o:p></p>
<p class="MsoNormal">-static __inline int _ffz_raw(const unsigned long *addr, int offset)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              //TODO: not an effective code - is better in Assembler<o:p></o:p></p>
<p class="MsoNormal">-              int mask;<o:p></o:p></p>
<p class="MsoNormal">-              int rbc;<o:p></o:p></p>
<p class="MsoNormal">-              int ix;<o:p></o:p></p>
<p class="MsoNormal">-              if (!~*addr) return 0;<o:p></o:p></p>
<p class="MsoNormal">-              mask = 1 << offset;<o:p></o:p></p>
<p class="MsoNormal">-              rbc = BITS_PER_LONG - offset;<o:p></o:p></p>
<p class="MsoNormal">-              for (ix=0; ix<rbc; ix++, mask<<=1) {<o:p></o:p></p>
<p class="MsoNormal">-                              if (!(*addr & mask))<o:p></o:p></p>
<p class="MsoNormal">-                                              return offset + ix + 1;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return 0;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// as previous with offset = 0<o:p></o:p></p>
<p class="MsoNormal">-static __inline int _ffz(const unsigned long *addr)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              unsigned char *ptr = (unsigned char *)addr;<o:p></o:p></p>
<p class="MsoNormal">-              if (!~*addr) return 0;                                                                      // skip sero dword<o:p></o:p></p>
<p class="MsoNormal">-              if (!~*(short*)ptr) ptr += 2;                                                         // get to the non-zero word<o:p></o:p></p>
<p class="MsoNormal">-              if (!~*(char*)ptr) ptr++;                                                                                                // get to the non-zero byte<o:p></o:p></p>
<p class="MsoNormal">-              return (int)(((ptr - (unsigned char *)addr ) << 3) + g_clr_bit_tbl[*ptr] + 1);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define ffz(val)               _ffz((const unsigned long *)&val)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// Function: <o:p></o:p></p>
<p class="MsoNormal">-//          finds the first bit, set in the bitmap<o:p></o:p></p>
<p class="MsoNormal">-// Parameters:<o:p></o:p></p>
<p class="MsoNormal">-//          ptr          - address of the bitmap<o:p></o:p></p>
<p class="MsoNormal">-//          bits_size              - the size in bits<o:p></o:p></p>
<p class="MsoNormal">-// Returns:<o:p></o:p></p>
<p class="MsoNormal">-//          the index of the first bit set; 'bits_size' - when there is noone<o:p></o:p></p>
<p class="MsoNormal">-// Notes:<o:p></o:p></p>
<p class="MsoNormal">-//          presumes, that ptr is aligned on dword<o:p></o:p></p>
<p class="MsoNormal">-//          presumes, that the map contains an integer number of dwords<o:p></o:p></p>
<p class="MsoNormal">-//          on bits_size=0 will return 0, but its an illegal case<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-static __inline int find_first_bit(const unsigned long *addr, unsigned bits_size)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              unsigned char *ptr = (unsigned char *)addr;                       // bitmap start<o:p></o:p></p>
<p class="MsoNormal">-              unsigned char *end_ptr = (unsigned char *)(addr + BITS_TO_LONGS(bits_size));              // bitmap end<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              while (ptr<end_ptr) {<o:p></o:p></p>
<p class="MsoNormal">-                              if (!*(int*)ptr) { ptr += 4; continue; }        // skip zero dword<o:p></o:p></p>
<p class="MsoNormal">-                              if (!*(short*)ptr) ptr += 2;                                                            // get to the non-zero word<o:p></o:p></p>
<p class="MsoNormal">-                              if (!*(char*)ptr) ptr++;                                                                                  // get to the non-zero byte<o:p></o:p></p>
<p class="MsoNormal">-                              return (int)(((ptr - (unsigned char *)addr ) << 3) + g_set_bit_tbl[*ptr]);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return bits_size;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static __inline int find_first_zero_bit(const unsigned long *addr, unsigned bits_size)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              unsigned char *ptr = (unsigned char *)addr;                       // bitmap start<o:p></o:p></p>
<p class="MsoNormal">-              unsigned char *end_ptr = (unsigned char *)(addr + BITS_TO_LONGS(bits_size));              // bitmap end<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              while (ptr<end_ptr) {<o:p></o:p></p>
<p class="MsoNormal">-                              if (!~*(int*)ptr) { ptr += 4; continue; }     // skip dword w/o zero bits<o:p></o:p></p>
<p class="MsoNormal">-                              if (!~*(short*)ptr) ptr += 2;                                                         // get to the word with zero bits<o:p></o:p></p>
<p class="MsoNormal">-                              if (!~*(char*)ptr) ptr++;                                                                                                // get to the byte with zero bits<o:p></o:p></p>
<p class="MsoNormal">-                              return (int)(((ptr - (unsigned char *)addr ) << 3) + g_clr_bit_tbl[*ptr]);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return bits_size;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/**<o:p></o:p></p>
<p class="MsoNormal">-* find_next_zero_bit - find the first zero bit in a memory region<o:p></o:p></p>
<p class="MsoNormal">-* @addr: The address to base the search on<o:p></o:p></p>
<p class="MsoNormal">-* @offset: The bitnumber to start searching at<o:p></o:p></p>
<p class="MsoNormal">-* @bits_size: The maximum size to search<o:p></o:p></p>
<p class="MsoNormal">-*<o:p></o:p></p>
<p class="MsoNormal">-* Returns the bit-number of the first zero bit, not the number of the byte<o:p></o:p></p>
<p class="MsoNormal">-* containing a bit. If not found - returns 'size'<o:p></o:p></p>
<p class="MsoNormal">-*/<o:p></o:p></p>
<p class="MsoNormal">-static __inline int find_next_zero_bit(const unsigned long *addr, int bits_size, int offset)<o:p></o:p></p>
<p class="MsoNormal">-{             <o:p></o:p></p>
<p class="MsoNormal">-              int res;<o:p></o:p></p>
<p class="MsoNormal">-              int ix = offset & 31;<o:p></o:p></p>
<p class="MsoNormal">-              int set = offset & ~31;<o:p></o:p></p>
<p class="MsoNormal">-              const unsigned long *p = addr + (set >> 5);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              // search in the first word while we are in the middle<o:p></o:p></p>
<p class="MsoNormal">-              if (ix) {<o:p></o:p></p>
<p class="MsoNormal">-                              res = _ffz_raw(p, ix);<o:p></o:p></p>
<p class="MsoNormal">-                              if (res)<o:p></o:p></p>
<p class="MsoNormal">-                                              return set + res - 1;<o:p></o:p></p>
<p class="MsoNormal">-                              ++p;<o:p></o:p></p>
<p class="MsoNormal">-                              set += BITS_PER_LONG;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              // search the rest of the bitmap<o:p></o:p></p>
<p class="MsoNormal">-              res = find_first_zero_bit(p, bits_size - (unsigned)(32 * (p - addr)));<o:p></o:p></p>
<p class="MsoNormal">-              return res + set;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* The functions works only for 32-bit values (not as in Linux ) */<o:p></o:p></p>
<p class="MsoNormal">-/* on val=0 will return '-1' */<o:p></o:p></p>
<p class="MsoNormal">-static inline int ilog2(u32 val)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(val);<o:p></o:p></p>
<p class="MsoNormal">-              return fls(val) - 1;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline BOOLEAN is_power_of_2(unsigned long n)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return (!!n & !(n & (n-1))) ? TRUE : FALSE;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w.h           (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w.h        (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,396 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifndef L2W_H<o:p></o:p></p>
<p class="MsoNormal">-#define L2W_H<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// GENERAL INCLUDES<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// OS<o:p></o:p></p>
<p class="MsoNormal">-#include <ntddk.h><o:p></o:p></p>
<p class="MsoNormal">-//#include <iointex.h><o:p></o:p></p>
<p class="MsoNormal">-#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">-#include <stdarg.h><o:p></o:p></p>
<p class="MsoNormal">-#include <stdlib.h><o:p></o:p></p>
<p class="MsoNormal">-#include <errno.h><o:p></o:p></p>
<p class="MsoNormal">-#define NTSTRSAFE_LIB<o:p></o:p></p>
<p class="MsoNormal">-#include <ntstrsafe.h><o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// complib<o:p></o:p></p>
<p class="MsoNormal">-#include <complib/cl_timer.h><o:p></o:p></p>
<p class="MsoNormal">-#include <complib/cl_qlist.h><o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// mlx4<o:p></o:p></p>
<p class="MsoNormal">-#include "vc.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// LITERALS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define BITS_PER_LONG                            32<o:p></o:p></p>
<p class="MsoNormal">-#define N_BARS                                                             3<o:p></o:p></p>
<p class="MsoNormal">-#define HZ                                                                        1000000 /* 1 sec in usecs */<o:p></o:p></p>
<p class="MsoNormal">-#define EOPNOTSUPP                                 95<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// SUBSTITUTIONS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define BUG_ON(exp)                                ASSERT(!(exp)) /* in Linux follows here panic() !*/
<o:p></o:p></p>
<p class="MsoNormal">-#define snprintf                             _snprintf<o:p></o:p></p>
<p class="MsoNormal">-#define KERN_ERR                        "err:"<o:p></o:p></p>
<p class="MsoNormal">-#define KERN_WARNING          "warn:"<o:p></o:p></p>
<p class="MsoNormal">-#define KERN_DEBUG                 "dbg:"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// memory barriers<o:p></o:p></p>
<p class="MsoNormal">-#define wmb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">-#define rmb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">-#define mb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">-// TODO: can we make it empty ?  I saw in Linux, it is an empty macro for x86 & x64<o:p></o:p></p>
<p class="MsoNormal">-#define mmiowb KeMemoryBarrier<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// gcc compiler attributes<o:p></o:p></p>
<p class="MsoNormal">-#define __devinit<o:p></o:p></p>
<p class="MsoNormal">-#define __devinitdata<o:p></o:p></p>
<p class="MsoNormal">-#define __init<o:p></o:p></p>
<p class="MsoNormal">-#define __exit<o:p></o:p></p>
<p class="MsoNormal">-#define __force<o:p></o:p></p>
<p class="MsoNormal">-#define __iomem<o:p></o:p></p>
<p class="MsoNormal">-#define __attribute_const__<o:p></o:p></p>
<p class="MsoNormal">-#define likely(x)                                             (x)<o:p></o:p></p>
<p class="MsoNormal">-#define unlikely(x)                                        (x)<o:p></o:p></p>
<p class="MsoNormal">-#define __attribute__(a)<o:p></o:p></p>
<p class="MsoNormal">-#define __bitwise<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// container_of<o:p></o:p></p>
<p class="MsoNormal">-#define container_of                   CONTAINING_RECORD<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// inline <o:p></o:p></p>
<p class="MsoNormal">-#define inline  __inline<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// new Linux event mechanism<o:p></o:p></p>
<p class="MsoNormal">-#define complete(a)                                                                    wake_up(a)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// convert<o:p></o:p></p>
<p class="MsoNormal">-#define __constant_htons                        CL_HTON16<o:p></o:p></p>
<p class="MsoNormal">-#define __constant_cpu_to_be32         CL_HTON32<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// various<o:p></o:p></p>
<p class="MsoNormal">-#define __always_inline                                                             inline<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if (WINVER < _WIN32_WINNT_WIN6)<o:p></o:p></p>
<p class="MsoNormal">-#define num_possible_cpus() KeNumberProcessors<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-#define num_possible_cpus() KeQueryMaximumProcessorCount()<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// TYPES<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define true (u8)1<o:p></o:p></p>
<p class="MsoNormal">-#define false (u8)0<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// basic types<o:p></o:p></p>
<p class="MsoNormal">-typedef unsigned char                                 u8, __u8;<o:p></o:p></p>
<p class="MsoNormal">-typedef unsigned short int        u16, __u16;<o:p></o:p></p>
<p class="MsoNormal">-typedef unsigned int                                                    u32, __u32;<o:p></o:p></p>
<p class="MsoNormal">-typedef unsigned __int64                          u64, __u64;<o:p></o:p></p>
<p class="MsoNormal">-typedef char                                    s8, __s8;<o:p></o:p></p>
<p class="MsoNormal">-typedef short int            s16, __s16;<o:p></o:p></p>
<p class="MsoNormal">-typedef int                                                        s32, __s32;<o:p></o:p></p>
<p class="MsoNormal">-typedef __int64                              s64, __s64;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifndef __cplusplus<o:p></o:p></p>
<p class="MsoNormal">-typedef u8 bool;<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// inherited<o:p></o:p></p>
<p class="MsoNormal">-typedef u16  __le16;<o:p></o:p></p>
<p class="MsoNormal">-typedef u16  __be16;<o:p></o:p></p>
<p class="MsoNormal">-typedef u32  __le32;<o:p></o:p></p>
<p class="MsoNormal">-typedef u32  __be32;<o:p></o:p></p>
<p class="MsoNormal">-typedef u64  __le64;<o:p></o:p></p>
<p class="MsoNormal">-typedef u64  __be64;<o:p></o:p></p>
<p class="MsoNormal">-typedef u64 io_addr_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// dummy function<o:p></o:p></p>
<p class="MsoNormal">-typedef void (*MT_EMPTY_FUNC)();<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// PCI BAR descriptor<o:p></o:p></p>
<p class="MsoNormal">-typedef enum _hca_bar_type<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              HCA_BAR_TYPE_HCR,<o:p></o:p></p>
<p class="MsoNormal">-              HCA_BAR_TYPE_UAR,<o:p></o:p></p>
<p class="MsoNormal">-              HCA_BAR_TYPE_DDR,<o:p></o:p></p>
<p class="MsoNormal">-              HCA_BAR_TYPE_MAX<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-}             hca_bar_type_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-typedef struct _hca_bar<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              uint64_t                                               phys;<o:p></o:p></p>
<p class="MsoNormal">-              void                                                       *virt;<o:p></o:p></p>
<p class="MsoNormal">-              SIZE_T                                                   size;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-}             hca_bar_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct msix_saved_info {<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   vca;                        /* MSI-X Vector Table card address */<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   mca;                      /* MSI-X Mask Table card address */<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   vsa;                        /* MSI-X Vector Table saved address */<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   msa;                      /* MSI-X Mask Table saved address */<o:p></o:p></p>
<p class="MsoNormal">-              ULONG vsz;                        /* MSI-X Vector Table size */<o:p></o:p></p>
<p class="MsoNormal">-              ULONG msz;                       /* MSI-X Mask Table size */<o:p></o:p></p>
<p class="MsoNormal">-              int                           num;                     /* number of supported MSI-X vectors */<o:p></o:p></p>
<p class="MsoNormal">-              int                           valid;                     /* the structure is valid */<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct msix_map {<o:p></o:p></p>
<p class="MsoNormal">-              KAFFINITY           cpu;                       /* affinity of this MSI-X vector */<o:p></o:p></p>
<p class="MsoNormal">-              int                                           eq_ix;                   /* EQ index in the array of EQs */<o:p></o:p></p>
<p class="MsoNormal">-              int                                           ref_cnt;                /* number of users */<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-typedef struct _MLX4_ST_DEVICE *PMLX4_ST_DEVICE;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// interface structure between Upper and Low Layers of the driver<o:p></o:p></p>
<p class="MsoNormal">-struct pci_dev<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              // driver: OS/platform resources<o:p></o:p></p>
<p class="MsoNormal">-              BUS_INTERFACE_STANDARD                                     bus_pci_ifc;<o:p></o:p></p>
<p class="MsoNormal">-              PCI_COMMON_CONFIG                                                              pci_cfg_space;<o:p></o:p></p>
<p class="MsoNormal">-              struct msix_saved_info                                 msix_info;<o:p></o:p></p>
<p class="MsoNormal">-              struct msix_map*                                                            p_msix_map;<o:p></o:p></p>
<p class="MsoNormal">-              uplink_info_t                                                                     uplink_info;<o:p></o:p></p>
<p class="MsoNormal">-              // driver: card resources<o:p></o:p></p>
<p class="MsoNormal">-              hca_bar_t                                                                                           bar[N_BARS];<o:p></o:p></p>
<p class="MsoNormal">-              CM_PARTIAL_RESOURCE_DESCRIPTOR int_info;               /* HCA interrupt resources */<o:p></o:p></p>
<p class="MsoNormal">-              // driver: various objects and info<o:p></o:p></p>
<p class="MsoNormal">-              USHORT                                                                                                               ven_id;<o:p></o:p></p>
<p class="MsoNormal">-              USHORT                                                                                                               dev_id;<o:p></o:p></p>
<p class="MsoNormal">-              USHORT                                                                                                               sub_vendor_id;<o:p></o:p></p>
<p class="MsoNormal">-              USHORT                                                                                                               sub_system_id;<o:p></o:p></p>
<p class="MsoNormal">-              UCHAR                                                                                                 revision_id;<o:p></o:p></p>
<p class="MsoNormal">-              UCHAR                                                                                                 partition_status;<o:p></o:p></p>
<p class="MsoNormal">-              DMA_ADAPTER                                *                                                             p_dma_adapter;              /* HCA adapter object */<o:p></o:p></p>
<p class="MsoNormal">-              DEVICE_OBJECT                *                                                             p_self_do;                          /* mlx4_bus's FDO */<o:p></o:p></p>
<p class="MsoNormal">-              DEVICE_OBJECT                *                                                             pdo;                                       /* mlx4_bus's PDO */<o:p></o:p></p>
<p class="MsoNormal">-              PVOID                                                                                                   p_wdf_device;   /* wdf_device */<o:p></o:p></p>
<p class="MsoNormal">-              LONG                                                                                                    ib_hca_created;<o:p></o:p></p>
<p class="MsoNormal">-              // mlx4_ib: various objects and info        <o:p>
</o:p></p>
<p class="MsoNormal">-              struct ib_device *                                                            ib_dev;<o:p></o:p></p>
<p class="MsoNormal">-              // mlx4_net: various objects and info     <o:p>
</o:p></p>
<p class="MsoNormal">-              struct mlx4_dev *                                                            dev;<o:p></o:p></p>
<p class="MsoNormal">-              volatile long                                                                        dpc_lock;<o:p></o:p></p>
<p class="MsoNormal">-              PUCHAR                                                                                                               vpd;<o:p></o:p></p>
<p class="MsoNormal">-              int                                                                                                                           vpd_size;<o:p></o:p></p>
<p class="MsoNormal">-              WCHAR                                                                                                                location[36];                       /* bus+func+dev */<o:p></o:p></p>
<p class="MsoNormal">-              int                                                                                                                           pci_bus;<o:p></o:p></p>
<p class="MsoNormal">-              int                                                                                                                           pci_device;<o:p></o:p></p>
<p class="MsoNormal">-              int                                                                                                                           pci_func;<o:p></o:p></p>
<p class="MsoNormal">-              USHORT                                                                                                               devfn;<o:p></o:p></p>
<p class="MsoNormal">-              char                                                                                                       name[24];                           /* mlx4_role_bus_func_dev */<o:p></o:p></p>
<p class="MsoNormal">-              // statistics<o:p></o:p></p>
<p class="MsoNormal">-              PMLX4_ST_DEVICE                                                         p_stat;<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// WDM interrupts<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-              // legacy<o:p></o:p></p>
<p class="MsoNormal">-              PKINTERRUPT                                                                                    int_obj;                                /* HCA interrupt object */<o:p></o:p></p>
<p class="MsoNormal">-              KSPIN_LOCK                                                                                      isr_lock;                               /* lock for the ISR */<o:p></o:p></p>
<p class="MsoNormal">-              // MSI-X interrupts<o:p></o:p></p>
<p class="MsoNormal">-              u8                                                                                                                           n_msi_vectors_alloc;/* number of allocated MSI vectors */<o:p></o:p></p>
<p class="MsoNormal">-              u8                                                                                                                           n_msi_vectors;                 /* number of MSI vectors; 0 - no MSI */<o:p></o:p></p>
<p class="MsoNormal">-              ULONG                                                                                                 version;<o:p></o:p></p>
<p class="MsoNormal">-              int                                                                                                           legacy_connect;<o:p></o:p></p>
<p class="MsoNormal">-              // others<o:p></o:p></p>
<p class="MsoNormal">-              int                                                                                                           is_reset_prohibited;<o:p></o:p></p>
<p class="MsoNormal">-              boolean_t                                                                                           start_event_taken;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              USHORT                                                                                                               clp_ver;<o:p></o:p></p>
<p class="MsoNormal">-    KEVENT                                                                                                          remove_dev_lock;      /* lock remove_one process */<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* DPC */<o:p></o:p></p>
<p class="MsoNormal">-typedef void (*dpc_t)( struct _KDPC *, PVOID, PVOID, PVOID );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifdef SUPPORTED_ONLY_IN_LINUX<o:p></o:p></p>
<p class="MsoNormal">-struct attribute {<o:p></o:p></p>
<p class="MsoNormal">-              const char                                                                                           *name;<o:p></o:p></p>
<p class="MsoNormal">-              void                                                                                                       *owner;<o:p></o:p></p>
<p class="MsoNormal">-              u32                                                                                                                         mode;<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct device_attribute {<o:p></o:p></p>
<p class="MsoNormal">-              struct attribute        attr;<o:p></o:p></p>
<p class="MsoNormal">-              ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);<o:p></o:p></p>
<p class="MsoNormal">-              ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);<o:p></o:p></p>
<p class="MsoNormal">-};<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// MACROS<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// conversions<o:p></o:p></p>
<p class="MsoNormal">-#define swab32(a)                                        _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define cpu_to_be16(a)                             _byteswap_ushort((USHORT)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define be16_to_cpu(a)                             _byteswap_ushort((USHORT)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define cpu_to_be32(a)                             _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define be32_to_cpu(a)                             _byteswap_ulong((ULONG)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define cpu_to_be64(a)                             _byteswap_uint64((UINT64)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define be64_to_cpu(a)                             _byteswap_uint64((UINT64)(a))<o:p></o:p></p>
<p class="MsoNormal">-#define be64_to_cpup(p)                          _byteswap_uint64(*(PUINT64)(p))<o:p></o:p></p>
<p class="MsoNormal">-#define be32_to_cpup(p)                          _byteswap_ulong(*(PULONG)(p))<o:p></o:p></p>
<p class="MsoNormal">-#define be16_to_cpup(p)                          _byteswap_ushort(*(PUSHORT)(p))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// ARRAY_SIZE<o:p></o:p></p>
<p class="MsoNormal">-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// ALIGN<o:p></o:p></p>
<p class="MsoNormal">-#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))<o:p></o:p></p>
<p class="MsoNormal">-#define PTR_ALIGN(size)           (((size) + sizeof(void*) - 1) & ~(sizeof(void*) - 1))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// there is a bug in Microsoft compiler, that when _byteswap_uint64() gets an expression<o:p></o:p></p>
<p class="MsoNormal">-// it executes the expression but doesn't swap tte dwords<o:p></o:p></p>
<p class="MsoNormal">-// So, there's a workaround<o:p></o:p></p>
<p class="MsoNormal">-#ifdef BYTESWAP_UINT64_BUG_FIXED<o:p></o:p></p>
<p class="MsoNormal">-#define CPU_2_BE64_PREP                      <o:p></o:p></p>
<p class="MsoNormal">-#define CPU_2_BE64(x)                                              cl_hton64(x)<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-#define CPU_2_BE64_PREP      unsigned __int64 __tmp__        
<o:p></o:p></p>
<p class="MsoNormal">-#define CPU_2_BE64(x)                                              ( __tmp__ = x, cl_hton64(__tmp__) )<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define ERR_PTR(error)                              ((void*)(LONG_PTR)(error))<o:p></o:p></p>
<p class="MsoNormal">-#define PTR_ERR(ptr)                                  ((long)(LONG_PTR)(void*)(ptr))<o:p></o:p></p>
<p class="MsoNormal">-#define ETH_ALEN    6<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-//TODO: there are 2 assumptions here:<o:p></o:p></p>
<p class="MsoNormal">-// - pointer can't be too big (around -1)<o:p></o:p></p>
<p class="MsoNormal">-// - error can't be bigger than 1000<o:p></o:p></p>
<p class="MsoNormal">-#define IS_ERR(ptr)                                                      ((ULONG_PTR)ptr > (ULONG_PTR)-1000L)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define BITS_TO_LONGS(bits) \<o:p></o:p></p>
<p class="MsoNormal">-              (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifndef ETIMEDOUT<o:p></o:p></p>
<p class="MsoNormal">-#define ETIMEDOUT                     (110)<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#ifdef PAGE_ALIGN<o:p></o:p></p>
<p class="MsoNormal">-#undef PAGE_ALIGN<o:p></o:p></p>
<p class="MsoNormal"><span lang="ES-AR">-#define PAGE_ALIGN(Va) ((u64)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))<o:p></o:p></span></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define NEXT_PAGE_ALIGN(addr)        (((addr)+PAGE_SIZE-1)&PAGE_MASK)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* typed minimum */<o:p></o:p></p>
<p class="MsoNormal">-#define min_t(type,x,y)                             ((type)(x) < (type)(y) ? (type)(x) : (type)(y))<o:p></o:p></p>
<p class="MsoNormal">-#define max_t(type,x,y)                            ((type)(x) > (type)(y) ? (type)(x) : (type)(y))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define EXPORT_SYMBOL(name)<o:p></o:p></p>
<p class="MsoNormal">-#ifndef USE_WDM_INTERRUPTS<o:p></o:p></p>
<p class="MsoNormal">-#define free_irq(pdev)<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline NTSTATUS errno_to_ntstatus(int err)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-#define MAP_ERR(err,ntstatus)              case err: status = ntstatus; break<o:p></o:p></p>
<p class="MsoNormal">-              NTSTATUS status;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (!err) <o:p></o:p></p>
<p class="MsoNormal">-                              return STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (err < 0)<o:p></o:p></p>
<p class="MsoNormal">-                              err = -err;<o:p></o:p></p>
<p class="MsoNormal">-              switch (err) {<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( ENOENT, STATUS_NOT_FOUND );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( EAGAIN, STATUS_DEVICE_BUSY );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( ENOMEM, STATUS_NO_MEMORY );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( EACCES, STATUS_ACCESS_DENIED );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( EFAULT, STATUS_DRIVER_INTERNAL_ERROR );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( EBUSY, STATUS_INSUFFICIENT_RESOURCES );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( ENODEV, STATUS_NOT_SUPPORTED );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( EINVAL, STATUS_INVALID_PARAMETER );<o:p></o:p></p>
<p class="MsoNormal">-                              MAP_ERR( ENOSYS, STATUS_NOT_SUPPORTED );<o:p></o:p></p>
<p class="MsoNormal">-                              default:<o:p></o:p></p>
<p class="MsoNormal">-                                              status = STATUS_UNSUCCESSFUL;<o:p></o:p></p>
<p class="MsoNormal">-                                              break;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              return status;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// PROTOTYPES<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-SIZE_T strlcpy(char *dest, const void *src, SIZE_T size);<o:p></o:p></p>
<p class="MsoNormal">-int core_init();<o:p></o:p></p>
<p class="MsoNormal">-void core_cleanup();<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-// SPECIFIC INCLUDES<o:p></o:p></p>
<p class="MsoNormal">-//<o:p></o:p></p>
<p class="MsoNormal">-////////////////////////////////////////////////////////<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-struct mlx4_dev;<o:p></o:p></p>
<p class="MsoNormal">-struct mlx4_priv;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_atomic.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_bit.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_bitmap.h><o:p></o:p></p>
<p class="MsoNormal">-#include "l2w_debug.h"<o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_memory.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_umem.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_list.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_pci.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_pcipool.h><o:p></o:p></p>
<p class="MsoNormal">-#include "l2w_radix.h"<o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_spinlock.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_sync.h><o:p></o:p></p>
<p class="MsoNormal">-#include <l2w_time.h><o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include "device.h"<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int mlx4_is_barred(struct mlx4_dev *dev)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return dev->flags &  MLX4_FLAG_RESET_DRIVER;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline int mlx4_is_in_reset(struct mlx4_dev *dev)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              return dev->flags & MLX4_FLAG_RESET_STARTED;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-int parse_dev_location(<o:p></o:p></p>
<p class="MsoNormal">-              const char *buffer,<o:p></o:p></p>
<p class="MsoNormal">-              const char *format,<o:p></o:p></p>
<p class="MsoNormal">-              int *bus, int *dev, int *func<o:p></o:p></p>
<p class="MsoNormal">-);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_spinlock.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_spinlock.h        (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_spinlock.h     (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,148 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#include <complib/cl_spinlock.h><o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#if 1<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-typedef cl_spinlock_t   spinlock_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void spin_lock_init(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              cl_spinlock_init( p_spinlock );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define spin_lock                                                                                                                          cl_spinlock_acquire<o:p></o:p></p>
<p class="MsoNormal">-#define spin_unlock                                                                                                                     cl_spinlock_release<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-CL_INLINE void<o:p></o:p></p>
<p class="MsoNormal">-spin_lock_dpc( <o:p></o:p></p>
<p class="MsoNormal">-              IN           cl_spinlock_t* const       p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              KeAcquireSpinLockAtDpcLevel( &p_spinlock->lock );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-CL_INLINE void<o:p></o:p></p>
<p class="MsoNormal">-spin_unlock_dpc(<o:p></o:p></p>
<p class="MsoNormal">-              IN           cl_spinlock_t* const       p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              KeReleaseSpinLockFromDpcLevel( &p_spinlock->lock );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#else<o:p></o:p></p>
<p class="MsoNormal">-typedef struct spinlock {<o:p></o:p></p>
<p class="MsoNormal">-              KSPIN_LOCK                                      lock;<o:p></o:p></p>
<p class="MsoNormal">-              KLOCK_QUEUE_HANDLE              lockh;<o:p></o:p></p>
<p class="MsoNormal">-              KIRQL                                                    irql;<o:p></o:p></p>
<p class="MsoNormal">-} spinlock_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void spin_lock_init(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const p_spinlock )<o:p></o:p></p>
<p class="MsoNormal">-{ <o:p></o:p></p>
<p class="MsoNormal">-              KeInitializeSpinLock( &p_spinlock->lock ); <o:p>
</o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_lock( <o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KIRQL irql = KeGetCurrentIrql();<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( l && irql <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              if (irql == DISPATCH_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">-                              KeAcquireInStackQueuedSpinLockAtDpcLevel( &l->lock, &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">-              else<o:p></o:p></p>
<p class="MsoNormal">-                              KeAcquireInStackQueuedSpinLock( &l->lock, &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">-              l->irql = irql;<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_unlock(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( l && KeGetCurrentIrql() == DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              if (l->irql == DISPATCH_LEVEL)<o:p></o:p></p>
<p class="MsoNormal">-                              KeReleaseInStackQueuedSpinLockFromDpcLevel( &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">-              else<o:p></o:p></p>
<p class="MsoNormal">-                              KeReleaseInStackQueuedSpinLock( &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* to be used only at DPC level */<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_lock_dpc( <o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( l && KeGetCurrentIrql() == DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              KeAcquireInStackQueuedSpinLockAtDpcLevel( &l->lock, &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* to be used only at DPC level */<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_unlock_dpc(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">-              KeReleaseInStackQueuedSpinLockFromDpcLevel( &l->lockh );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_lock_sync( <o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KLOCK_QUEUE_HANDLE lockh;<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( l && KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              KeAcquireInStackQueuedSpinLock ( &l->lock, &lockh );<o:p></o:p></p>
<p class="MsoNormal">-              KeReleaseInStackQueuedSpinLock( &lockh );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#endif<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define DEFINE_SPINLOCK(lock)                            spinlock_t lock<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_lock_irqsave( <o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l,<o:p></o:p></p>
<p class="MsoNormal">-              IN                           unsigned long    *             flags)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(flags);<o:p></o:p></p>
<p class="MsoNormal">-              spin_lock(l);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_unlock_irqrestore( <o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l,<o:p></o:p></p>
<p class="MsoNormal">-              IN                           unsigned long                    flags)<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              UNUSED_PARAM(flags);<o:p></o:p></p>
<p class="MsoNormal">-              spin_unlock(l);<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-static inline void<o:p></o:p></p>
<p class="MsoNormal">-spin_lock_sync( <o:p></o:p></p>
<p class="MsoNormal">-              IN                           spinlock_t* const             l )<o:p></o:p></p>
<p class="MsoNormal">-{<o:p></o:p></p>
<p class="MsoNormal">-              KLOCK_QUEUE_HANDLE lockh;<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT( l && KeGetCurrentIrql() <= DISPATCH_LEVEL );<o:p></o:p></p>
<p class="MsoNormal">-              KeAcquireInStackQueuedSpinLock ( &l->lock, &lockh );<o:p></o:p></p>
<p class="MsoNormal">-              KeReleaseInStackQueuedSpinLock( &lockh );<o:p></o:p></p>
<p class="MsoNormal">-}<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* we are working from DPC level, so we can use usual spinlocks */<o:p></o:p></p>
<p class="MsoNormal">-#define spin_lock_irq                                                                                  spin_lock<o:p></o:p></p>
<p class="MsoNormal">-#define spin_unlock_irq                                                                             spin_unlock<o:p></o:p></p>
<p class="MsoNormal">-#define spin_lock_nested(a,b)                                                                spin_lock(a)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-/* Windows doesn't support such kind of spinlocks so far, but may be tomorrow ... */<o:p></o:p></p>
<p class="MsoNormal">-#define rwlock_init                                                                                                       spin_lock_init<o:p></o:p></p>
<p class="MsoNormal">-#define read_lock_irqsave                                                                        spin_lock_irqsave<o:p></o:p></p>
<p class="MsoNormal">-#define read_unlock_irqrestore                                                             spin_unlock_irqrestore<o:p></o:p></p>
<p class="MsoNormal">-#define write_lock_irq                                                                                                spin_lock_irq<o:p></o:p></p>
<p class="MsoNormal">-#define write_unlock_irq                                                                           spin_unlock_irq<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// rw_lock<o:p></o:p></p>
<p class="MsoNormal">-typedef spinlock_t                        rwlock_t;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_debug.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_debug.h            (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_debug.h         (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,23 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-VOID<o:p></o:p></p>
<p class="MsoNormal">-WriteEventLogEntryStr(<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">-              PWCHAR              pi_InsertionStr,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">-              ...<o:p></o:p></p>
<p class="MsoNormal">-              );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-VOID<o:p></o:p></p>
<p class="MsoNormal">-WriteEventLogEntryData(<o:p></o:p></p>
<p class="MsoNormal">-              PVOID   pi_pIoObject,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_ErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_UniqueErrorCode,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_FinalStatus,<o:p></o:p></p>
<p class="MsoNormal">-              ULONG pi_nDataItems,<o:p></o:p></p>
<p class="MsoNormal">-              ...<o:p></o:p></p>
<p class="MsoNormal">-              );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_time.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_time.h               (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/inc/l2w_time.h            (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -1,20 +0,0 @@<o:p></o:p></p>
<p class="MsoNormal">-#pragma once<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// returns current time in msecs (u64)<o:p></o:p></p>
<p class="MsoNormal">-#define jiffies                                                                                  get_tickcount_in_ms()<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-// jiffies is measured in msecs <o:p></o:p></p>
<p class="MsoNormal">-#define jiffies_to_usecs(msecs)                             ((msecs)*1000)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define time_after(a,b)                                              ((__int64)(b) - (__int64)(a) < 0)<o:p></o:p></p>
<p class="MsoNormal">-#define time_before(a,b)                                          time_after(b,a)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-#define time_after_eq(a,b)                                      ((__int64)(a) - (__int64)(b) >= 0)<o:p></o:p></p>
<p class="MsoNormal">-#define time_before_eq(a,b)                                  time_after_eq(b,a)<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-extern u32 g_time_increment;<o:p></o:p></p>
<p class="MsoNormal">-extern LARGE_INTEGER g_cmd_interval;<o:p></o:p></p>
<p class="MsoNormal">-#define cond_resched()             KeDelayExecutionThread( KernelMode, FALSE, &g_cmd_interval )<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-uint64_t get_tickcount_in_ms(void);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">Index: B:/users/irena/proj1/trunk/hw/mlx4/kernel/hca/SOURCES<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- B:/users/irena/proj1/trunk/hw/mlx4/kernel/hca/SOURCES  (revision 6771)<o:p></o:p></p>
<p class="MsoNormal">+++ B:/users/irena/proj1/trunk/hw/mlx4/kernel/hca/SOURCES               (revision 6862)<o:p></o:p></p>
<p class="MsoNormal">@@ -32,8 +32,11 @@<o:p></o:p></p>
<p class="MsoNormal">                vp.c                                        \<o:p></o:p></p>
<p class="MsoNormal">                wmi.c                                    \<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-INCLUDES=..;..\inc;..\..\inc;..\bus\inc;..\bus\ib;..\bus\core\$O;..\..\..\..\inc;..\..\..\..\inc\kernel;<o:p></o:p></p>
<p class="MsoNormal">+INCLUDES=..;..\inc;..\..\inc;..\bus\inc;..\bus\ib;..\bus\core\$O;..\..\..\..\inc;..\..\..\..\inc\kernel;..\..\..\..\inc\kernel\l2w;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+TARGETLIBS= \<o:p></o:p></p>
<p class="MsoNormal">+             $(TARGETPATH)\*\l2w.lib \<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> PRECOMPILED_INCLUDE=precomp.h<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> NTTARGETFILE0=mofcomp<o:p></o:p></p>
</div>
</body>
</html>