<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2900.5512" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=384060415-17112009><FONT face=Arial color=#0000ff 
size=2>Applied in 2585.</FONT></SPAN></DIV><BR>
<BLOCKQUOTE dir=ltr 
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
  <DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
  <HR tabIndex=-1>
  <FONT face=Tahoma size=2><B>From:</B> ofw-bounces@lists.openfabrics.org 
  [mailto:ofw-bounces@lists.openfabrics.org] <B>On Behalf Of </B>Leonid 
  Keller<BR><B>Sent:</B> Monday, November 16, 2009 10:49 AM<BR><B>To:</B> 
  ofw_list<BR><B>Subject:</B> [ofw][patch][MLX4] added support for g_stat 
  structure for MLX4_BUSdriver + MAD tracing mechanism.<BR></FONT><BR></DIV>
  <DIV></DIV>
  <DIV><FONT size=2><FONT size=1>
  <P><FONT face=Arial size=2>MAD tracing mechanism works under the control of 
  flags, set in new Registry mlx4_bus parameter StatFlags.</FONT></P>
  <P><FONT face=Arial size=2>The mechanism prints to debugger the IB headers of 
  packets sent over MLX transport, i.e. on QP0 and QP1.</FONT></P>
  <P><FONT face=Arial size=2>The flags are:</FONT></P>
  <P><FONT face=Arial size=2>0x0001 - print LRH</FONT></P>
  <P><FONT face=Arial size=2>0x0002 - print BTH</FONT></P>
  <P><FONT face=Arial size=2>0x0004 - print DETH</FONT></P>
  <P><FONT face=Arial size=2>0x0008 - print GRH (it won't print i<SPAN 
  class=157434708-16112009>f</SPAN> the GRH is absent)</FONT></P>
  <P><FONT face=Arial size=2>0x0010 - print some WQE info</FONT></P>
  <P><FONT face=Arial size=2>0x0020 - print some more UD header info</FONT></P>
  <P><FONT face=Arial size=2>0x0040 - print some send WR 
  info</FONT></P></FONT></FONT></DIV>
  <DIV><FONT face=Arial size=2></FONT> </DIV>
  <DIV><FONT face=Arial size=2></FONT> </DIV>
  <DIV><FONT face=Arial size=2>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/net/mlx4.h<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision 5099)<BR>@@ 
  -93,6 +93,7 @@<BR>  int 
  mod_interrupt_from_first;<BR> <BR>  int 
  mod_affinity;<BR>+ int mod_stat_flags;<BR>  PFDO_DEVICE_DATA 
  p_fdo[MAX_HCA_CARDS]; // for debug purposes<BR> } 
  GLOBALS;<BR> #pragma warning(default:4201) // nameless 
  struct/union<BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/inc/qp.h<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/inc/qp.h (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/inc/qp.h (revision 5099)<BR>@@ 
  -34,6 +34,8 @@<BR> #define MLX4_QP_H<BR> <BR> #include 
  "device.h"<BR>+#include "ib\mlx4_ib.h"<BR>+#include 
  "ib_pack.h"<BR> <BR> #define 
  MLX4_INVALID_LKEY 0x100<BR> <BR>@@ -288,7 +290,22 
  @@<BR>  __be32   byte_count;<BR> };<BR> <BR>+enum 
  {<BR>+ /*<BR>+  * Largest possible UD header: send with GRH and 
  immediate data.<BR>+  */<BR>+ MLX4_IB_UD_HEADER_SIZE  = 
  72<BR>+};<BR> <BR>+struct mlx4_ib_sqp {<BR>+ struct 
  mlx4_ib_qp qp;<BR>+ int   pkey_index;<BR>+ u32   qkey;<BR>+ u32   send_psn;<BR>+ struct 
  ib_ud_header ud_header;<BR>+ u8   header_buf[MLX4_IB_UD_HEADER_SIZE];<BR>+};<BR>+<BR> int 
  mlx4_qp_query(struct mlx4_dev *dev, struct mlx4_qp 
  *qp,<BR>     struct mlx4_qp_context 
  *context);<BR> <BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/ib/qp.c<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/ib/qp.c (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/ib/qp.c (revision 5099)<BR>@@ -36,6 
  +36,9 @@<BR> #include "qp.h"<BR> #include 
  "user.h"<BR> <BR>+void st_print_mlx_header( struct mlx4_dev *mdev, struct 
  mlx4_ib_sqp *sqp, struct mlx4_wqe_mlx_seg *mlx );<BR>+void 
  st_print_mlx_send(struct mlx4_dev *mdev, struct ib_qp *ibqp, ib_send_wr_t 
  *wr);<BR>+<BR> enum {<BR>  MLX4_IB_ACK_REQ_FREQ = 
  8,<BR> };<BR>@@ -46,22 +49,6 @@<BR> };<BR> <BR> enum 
  {<BR>- /*<BR>-  * Largest possible UD header: send with GRH and 
  immediate data.<BR>-  */<BR>- MLX4_IB_UD_HEADER_SIZE  = 
  72<BR>-};<BR>-<BR>-struct mlx4_ib_sqp {<BR>- struct 
  mlx4_ib_qp qp;<BR>- int   pkey_index;<BR>- u32   qkey;<BR>- u32   send_psn;<BR>- struct 
  ib_ud_header ud_header;<BR>- u8   header_buf[MLX4_IB_UD_HEADER_SIZE];<BR>-};<BR>-<BR>-enum 
  {<BR>  MLX4_IB_MIN_SQ_STRIDE = 6<BR> };<BR> <BR>@@ -1541,6 
  +1528,10 @@<BR>     if 
  (bad_wr)<BR>      *bad_wr = 
  wr;<BR>     goto 
  out;<BR>+    <BR>+    /* statistics 
  */<BR>+    st_print_mlx_send( dev, ibqp, 
  wr);<BR>+    st_print_mlx_header( dev, to_msqp(qp), 
  (void*)ctrl 
  );<BR>    }<BR>    wqe  += 
  err;<BR>    size += err / 16;<BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/ib/SOURCES<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/ib/SOURCES (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/ib/SOURCES (revision 5099)<BR>@@ 
  -21,7 +21,7 
  @@<BR>  main.c   \<BR>  mr.c   \<BR>  qp.c   \<BR>- srq.c   \<BR>+ srq.c   <BR> <BR> INCLUDES=..;..\inc;..\..\inc;..\core\$O;..\..\..\inc;..\..\..\..\..\inc;..\..\..\..\..\inc\kernel;<BR> <BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/sources<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/sources (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/sources (revision 5099)<BR>@@ 
  -30,6 +30,7 @@<BR>  pci.c \<BR>  pdo.c 
  \<BR>  wmi.c 
  \<BR>+ stat.c<BR> <BR> PRECOMPILED_INCLUDE=precomp.h<BR> <BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/precomp.h<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/precomp.h (revision 
  5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/precomp.h (revision 5099)<BR>@@ 
  -11,5 +11,6 @@<BR> #include "driver.h"<BR> #include 
  "cmd.h"<BR> #include <mlx4_debug.h><BR>+#include 
  "stat.h"<BR> <BR> <BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/stat.c<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/stat.c (revision 0)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/stat.c (revision 5099)<BR>@@ 
  -0,0 +1,159 @@<BR>+/*++<BR>+<BR>+Copyright (c) 2005-2009 Mellanox 
  Technologies. All rights reserved.<BR>+<BR>+Module 
  Name:<BR>+ bus_stat.h<BR>+<BR>+Abstract:<BR>+ Statistics Collector 
  header file<BR>+<BR>+Revision 
  History:<BR>+<BR>+Notes:<BR>+<BR>+--*/<BR>+<BR>+#include 
  "precomp.h"<BR>+<BR>+MLX4_ST_STAT g_stat;<BR>+<BR>+static void __print_grh( 
  struct mlx4_dev *mdev, struct ib_unpacked_grh 
  *p)<BR>+{<BR>+ mlx4_dbg(mdev, "\n\t ========== GRH 
  ==========\n");<BR>+ mlx4_dbg(mdev, "\t 
  ip_version        %02x", 
  p->ip_version);<BR>+ mlx4_dbg(mdev, "\t 
  traffic_class     %02x", 
  p->traffic_class);<BR>+ mlx4_dbg(mdev, "\t 
  flow_label        %08x", 
  <BR>+  be32_to_cpu(p->flow_label));<BR>+ mlx4_dbg(mdev, "\t 
  payload_length    %04x", 
  <BR>+  be16_to_cpu(p->payload_length));<BR>+ mlx4_dbg(mdev, 
  "\t next_header       %02x", 
  p->next_header);<BR>+ mlx4_dbg(mdev, "\t 
  hop_limit         %02x", 
  p->hop_limit);<BR>+ mlx4_dbg(mdev, "\t 
  source_gid        %08I64x:%08I64", 
  <BR>+  be64_to_cpu(p->source_gid.global.subnet_prefix),<BR>+  be64_to_cpu(p->source_gid.global.interface_id));<BR>+ mlx4_dbg(mdev, 
  "\t source_gid        %08I64x:%08I64", 
  <BR>+  be64_to_cpu(p->destination_gid.global.subnet_prefix),<BR>+  be64_to_cpu(p->destination_gid.global.interface_id));<BR>+}<BR>+<BR>+static 
  void __print_deth( struct mlx4_dev *mdev, struct ib_unpacked_deth 
  *p)<BR>+{<BR>+ mlx4_dbg(mdev, "\n\t ========== DETH 
  ==========\n");<BR>+ mlx4_dbg(mdev, "\t 
  qkey              
  %08x", <BR>+  be32_to_cpu(p->qkey));<BR>+ mlx4_dbg(mdev, "\t 
  source_qpn        %08x", 
  <BR>+  be32_to_cpu(p->source_qpn));<BR>+}<BR>+<BR>+static void 
  __print_bth( struct mlx4_dev *mdev, struct ib_unpacked_bth 
  *p)<BR>+{<BR>+ mlx4_dbg(mdev, "\n\t ========== BTH 
  ==========\n");<BR>+ mlx4_dbg(mdev, "\t 
  opcode            
  %02x", p->opcode);<BR>+ mlx4_dbg(mdev, "\t solicited_event   
  %02x", p->solicited_event);<BR>+ mlx4_dbg(mdev, "\t 
  mig_req           %02x", 
  p->mig_req);<BR>+ mlx4_dbg(mdev, "\t header_version    
  %02x", p->transport_header_version);<BR>+ mlx4_dbg(mdev, "\t 
  pkey              
  %04x", <BR>+  be16_to_cpu(p->pkey));<BR>+ mlx4_dbg(mdev, "\t 
  destination_qpn   %08x", 
  <BR>+  be32_to_cpu(p->destination_qpn));<BR>+ mlx4_dbg(mdev, 
  "\t ack_req           %02x", 
  p->ack_req);<BR>+ mlx4_dbg(mdev, "\t 
  psn               
  %08x", <BR>+  be32_to_cpu(p->psn));<BR>+}<BR>+<BR>+static void 
  __print_lrh( struct mlx4_dev *mdev, struct ib_unpacked_lrh 
  *p)<BR>+{<BR>+ mlx4_dbg(mdev, "\n\t ========== LRH 
  ==========\n");<BR>+ mlx4_dbg(mdev, "\t 
  virtual_lane      %02x", 
  p->virtual_lane);<BR>+ mlx4_dbg(mdev, "\t 
  link_version      %02x", 
  p->link_version);<BR>+ mlx4_dbg(mdev, "\t 
  service_level     %02x", 
  p->service_level);<BR>+ mlx4_dbg(mdev, "\t link_next_header  
  %02x", p->link_next_header);<BR>+ mlx4_dbg(mdev, "\t 
  destination_lid   %04x", 
  <BR>+  be16_to_cpu(p->destination_lid));<BR>+ mlx4_dbg(mdev, 
  "\t packet_length     %04x", 
  <BR>+  be16_to_cpu(p->packet_length));<BR>+ mlx4_dbg(mdev, 
  "\t source_lid        %04x", 
  <BR>+  be16_to_cpu(p->source_lid));<BR>+}<BR>+<BR>+static void 
  __print_ud_header( struct mlx4_dev *mdev, struct ib_ud_header 
  *p)<BR>+{<BR>+ mlx4_dbg(mdev, "\n\t ========== UD HEADER 
  ==========\n");<BR>+<BR>+ mlx4_dbg(mdev, "\t grh_present %d, imm_present 
  %d, imm %08x",<BR>+  p->grh_present, p->immediate_present, 
  be32_to_cpu(p->immediate_data) );<BR>+<BR>+ if ( 
  mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_LRH 
  )<BR>+  __print_lrh( mdev, &p->lrh );<BR>+<BR>+ if ( 
  mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_BTH 
  )<BR>+  __print_bth( mdev, &p->bth );<BR>+ <BR>+ if 
  ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_DETH 
  )<BR>+  __print_deth( mdev, &p->deth 
  );<BR>+ <BR>+ if ( p->grh_present && 
  (mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_GRH) 
  )<BR>+  __print_grh( mdev, &p->grh 
  );<BR>+ <BR>+}<BR>+<BR>+static void __print_mlx( struct mlx4_dev *mdev, 
  struct mlx4_wqe_mlx_seg *p)<BR>+{<BR>+ mlx4_dbg(mdev, "\n\t ========== 
  MLX WQE ==========\n");<BR>+ mlx4_dbg(mdev, "\t 
  owner             
  %02x", p->owner);<BR>+ mlx4_dbg(mdev, "\t 
  opcode            
  %02x", p->opcode);<BR>+ mlx4_dbg(mdev, "\t 
  size              
  %02x", p->size);<BR>+ mlx4_dbg(mdev, "\t 
  flags             
  %08x", <BR>+  be32_to_cpu(p->flags));<BR>+ mlx4_dbg(mdev, 
  "\t 
  rlid              
  %04x", <BR>+  be16_to_cpu(p->rlid));<BR>+}<BR>+<BR>+void 
  st_print_mlx_header( struct mlx4_dev *mdev, struct mlx4_ib_sqp *sqp, struct 
  mlx4_wqe_mlx_seg *mlx )<BR>+{<BR>+ if ( 
  mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_UDH 
  )<BR>+ __print_ud_header( mdev, &sqp->ud_header );<BR>+ if ( 
  mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_WQE 
  )<BR>+  __print_mlx( mdev, mlx );<BR>+}<BR>+<BR>+void 
  st_print_mlx_send(struct mlx4_dev *mdev, struct ib_qp *ibqp, ib_send_wr_t 
  *wr)<BR>+{<BR>+ struct mlx4_ib_qp *qp = to_mqp(ibqp);<BR>+<BR>+ if ( 
  mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_WR ) 
  {<BR>+  mlx4_dbg(mdev, "\n\t ========== SEND WR on QP %#x (%#x) 
  ==========\n",<BR>+   ibqp->qp_num, qp->mqp.qpn 
  );<BR>+  mlx4_dbg(mdev, "\t 
  wr_type           %d", 
  wr->wr_type);<BR>+  mlx4_dbg(mdev, "\t 
  wr_id             
  %08I64x", wr->wr_id);<BR>+  mlx4_dbg(mdev, "\t 
  send_opt          %x", 
  wr->send_opt);<BR>+  mlx4_dbg(mdev, "\t 
  immediate_data    %x", 
  be32_to_cpu(wr->immediate_data));<BR>+  mlx4_dbg(mdev, "\t 
  num_ds            %d", 
  wr->num_ds);<BR>+  mlx4_dbg(mdev, "\t 
  ds[0].va          %08x", 
  wr->ds_array[0].vaddr);<BR>+  mlx4_dbg(mdev, "\t 
  ds[0].length      %x", 
  wr->ds_array[0].length);<BR>+  mlx4_dbg(mdev, "\t 
  ds[0].lkey        %x", 
  wr->ds_array[0].lkey);<BR>+ }<BR>+}<BR>+<BR>+void st_dev_rmv( 
  PMLX4_ST_DEVICE p_stat )<BR>+{<BR>+ if ( p_stat 
  )<BR>+  p_stat->valid = FALSE;<BR>+}<BR>+<BR>+PMLX4_ST_DEVICE 
  st_dev_add()<BR>+{<BR>+ int i;<BR>+<BR>+ for ( i = 0; i < 
  MLX4_ST_MAX_DEVICES; ++i ) {<BR>+  if ( g_stat.dev[i].valid == FALSE 
  ) {<BR>+   g_stat.dev[i].valid = 
  TRUE;<BR>+   return 
  &g_stat.dev[i];<BR>+  }<BR>+ }<BR>+<BR>+ return 
  NULL;<BR>+}<BR>+<BR>+<BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/stat.h<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/stat.h (revision 0)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/stat.h (revision 5099)<BR>@@ 
  -0,0 +1,85 @@<BR>+/*++<BR>+<BR>+Copyright (c) 2005-2009 Mellanox Technologies. 
  All rights reserved.<BR>+<BR>+Module 
  Name:<BR>+ bus_stat.h<BR>+<BR>+Abstract:<BR>+ Statistics Collector 
  header file<BR>+<BR>+Revision 
  History:<BR>+<BR>+Notes:<BR>+<BR>+--*/<BR>+<BR>+#include 
  <wdf.h><BR>+#include "l2w.h"<BR>+#include "ib_pack.h"<BR>+#include 
  "qp.h"<BR>+#include "device.h"<BR>+<BR>+//<BR>+// 
  restrictions<BR>+//<BR>+<BR>+#define 
  MLX4_ST_MAX_DEVICES   8<BR>+<BR>+//<BR>+// enums<BR>+// 
  <BR>+<BR>+#define MLX4_MAD_TRACE_LRH   (1 << 
  0)<BR>+#define MLX4_MAD_TRACE_BTH   (1 << 1)<BR>+#define 
  MLX4_MAD_TRACE_DETH   (1 << 2)<BR>+#define 
  MLX4_MAD_TRACE_GRH   (1 << 3)<BR>+#define 
  MLX4_MAD_TRACE_WQE   (1 << 4)<BR>+#define 
  MLX4_MAD_TRACE_UDH   (1 << 5)<BR>+#define 
  MLX4_MAD_TRACE_WR   (1 << 6)<BR>+<BR>+<BR>+<BR>+//<BR>+// 
  structures<BR>+//<BR>+<BR>+// device<BR>+<BR>+typedef struct 
  _MLX4_ST_DEVICE<BR>+{<BR>+ boolean_t   valid;<BR>+ PFDO_DEVICE_DATA p_fdo;<BR>+ WDFDEVICE   h_wdf_device;<BR>+ ULONG    flags;<BR>+ <BR>+} 
  MLX4_ST_DEVICE, *PMLX4_ST_DEVICE;<BR>+<BR>+// driver<BR>+typedef struct 
  _MLX4_ST_DRIVER<BR>+{<BR>+ GLOBALS    *p_globals;<BR>+ WDFDRIVER   h_wdf_driver; <BR>+ <BR>+} 
  MLX4_ST_DRIVER, *PMLX4_ST_DRIVER;<BR>+<BR>+// driver stack<BR>+<BR>+typedef 
  struct 
  _MLX4_ST_STAT<BR>+{<BR>+ MLX4_ST_DRIVER  drv;<BR>+ MLX4_ST_DEVICE  dev[MLX4_ST_MAX_DEVICES];<BR>+ <BR>+} 
  MLX4_ST_STAT, *PMLX4_ST_STAT;<BR>+<BR>+extern MLX4_ST_STAT 
  g_stat;<BR>+<BR>+void st_print_mlx_header( struct mlx4_dev *mdev, struct 
  mlx4_ib_sqp *sqp, struct mlx4_wqe_mlx_seg *mlx );<BR>+<BR>+void 
  st_print_mlx_send(struct mlx4_dev *mdev, struct ib_qp *ibqp, ib_send_wr_t 
  *wr);<BR>+<BR>+void st_dev_rmv( PMLX4_ST_DEVICE p_stat 
  );<BR>+<BR>+PMLX4_ST_DEVICE st_dev_add();<BR>+<BR>+#pragma once<BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/drv.c<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision 5099)<BR>@@ 
  -582,6 +582,8 @@<BR>  if (TargetState > 
  WdfPowerDeviceD0)<BR>   __stop_card( p_fdo 
  );<BR> <BR>+ st_dev_rmv( p_fdo->pci_dev.p_stat_dev 
  );<BR>+<BR>  MLX4_EXIT( MLX4_DBG_DRV );<BR>  return 
  STATUS_SUCCESS;<BR> }<BR>@@ -1154,6 +1156,14 
  @@<BR> <BR> #endif<BR> <BR>+ // 
  statistics<BR>+ p_fdo->pci_dev.p_stat_dev = st_dev_add();<BR>+ if 
  ( p_fdo->pci_dev.p_stat_dev ) 
  {<BR>+  p_fdo->pci_dev.p_stat_dev->p_fdo = 
  p_fdo;<BR>+  p_fdo->pci_dev.p_stat_dev->h_wdf_device = 
  device;<BR>+  p_fdo->pci_dev.p_stat_dev->flags = 
  g.mod_stat_flags;<BR>+ }<BR>+<BR>  status = 
  STATUS_SUCCESS;<BR> <BR> end: <BR>@@ -1234,6 +1244,9 
  @@<BR>  // 
  "ProcessorAffinity"<BR>  DECLARE_CONST_UNICODE_STRING(ProcessorAffinity, 
  L"ProcessorAffinity");<BR> <BR>+ // "Stat 
  Flags"<BR>+ DECLARE_CONST_UNICODE_STRING(StatFlags, 
  L"StatFlags");<BR>+<BR>  ULONG value;<BR>  WDFKEY hKey = 
  NULL;<BR>  NTSTATUS status = STATUS_SUCCESS;<BR>@@ -1332,6 +1345,12 
  @@<BR>   else<BR>    g.mod_affinity = 
  0;<BR>   <BR>+  status = WdfRegistryQueryULong(hKey, 
  &StatFlags, &value);<BR>+  if (NT_SUCCESS (status)) 
  <BR>+   g.mod_stat_flags = 
  value;<BR>+  else<BR>+   g.mod_stat_flags = 
  0;<BR>+  <BR> <BR>   WdfRegistryClose(hKey);<BR>   status 
  = STATUS_SUCCESS;<BR>@@ -1424,6 +1443,11 
  @@<BR>  //<BR>  status = 
  __read_registry(&hDriver);<BR> <BR>+ // 
  statistics<BR>+ RtlZeroMemory( &g_stat, sizeof(g_stat) 
  );<BR>+ g_stat.drv.p_globals = &g;<BR>+ g_stat.drv.h_wdf_driver 
  = hDriver;<BR>+ <BR>  // we don't matter the failure in the 
  work with Registry<BR>  status = 
  STATUS_SUCCESS;<BR>  <BR>Index: 
  V:/svn/winib/trunk/hw/mlx4/kernel/inc/l2w.h<BR>===================================================================<BR>--- 
  V:/svn/winib/trunk/hw/mlx4/kernel/inc/l2w.h (revision 5098)<BR>+++ 
  V:/svn/winib/trunk/hw/mlx4/kernel/inc/l2w.h (revision 5099)<BR>@@ -162,6 
  +162,8 @@<BR>  int   ref_cnt; /* number of users 
  */<BR> };<BR> <BR>+typedef struct _MLX4_ST_DEVICE 
  *PMLX4_ST_DEVICE;<BR>+<BR> // interface structure between Upper and Low 
  Layers of the driver<BR> struct pci_dev<BR> {<BR>@@ -200,6 +202,8 
  @@<BR>  ULONG       version;<BR>  int 
         legacy_connect;<BR> #endif <BR>+ // 
  statistics<BR>+ PMLX4_ST_DEVICE 
      p_stat_dev;<BR> };<BR> <BR> /* DPC 
  */<BR></DIV></BLOCKQUOTE></FONT></BODY></HTML>