<!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>