<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( ¶ms, 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(¶ms);<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(¶ms);<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>