--- /dev/null
+/*++
+
+Copyright (c) 2005-2009 Mellanox Technologies. All rights reserved.
+
+Module Name:
+ bus_stat.h
+
+Abstract:
+ Statistics Collector header file
+
+Revision History:
+
+Notes:
+
+--*/
+
+#include "precomp.h"
+
+MLX4_ST_STAT g_stat;
+
+static void __print_grh( struct mlx4_dev *mdev, struct ib_unpacked_grh *p)
+{
+ mlx4_dbg(mdev, "\n\t ========== GRH ==========\n");
+ mlx4_dbg(mdev, "\t ip_version %02x", p->ip_version);
+ mlx4_dbg(mdev, "\t traffic_class %02x", p->traffic_class);
+ mlx4_dbg(mdev, "\t flow_label %08x",
+ be32_to_cpu(p->flow_label));
+ mlx4_dbg(mdev, "\t payload_length %04x",
+ be16_to_cpu(p->payload_length));
+ mlx4_dbg(mdev, "\t next_header %02x", p->next_header);
+ mlx4_dbg(mdev, "\t hop_limit %02x", p->hop_limit);
+ mlx4_dbg(mdev, "\t source_gid %08I64x:%08I64",
+ be64_to_cpu(p->source_gid.global.subnet_prefix),
+ be64_to_cpu(p->source_gid.global.interface_id));
+ mlx4_dbg(mdev, "\t source_gid %08I64x:%08I64",
+ be64_to_cpu(p->destination_gid.global.subnet_prefix),
+ be64_to_cpu(p->destination_gid.global.interface_id));
+}
+
+static void __print_deth( struct mlx4_dev *mdev, struct ib_unpacked_deth *p)
+{
+ mlx4_dbg(mdev, "\n\t ========== DETH ==========\n");
+ mlx4_dbg(mdev, "\t qkey %08x",
+ be32_to_cpu(p->qkey));
+ mlx4_dbg(mdev, "\t source_qpn %08x",
+ be32_to_cpu(p->source_qpn));
+}
+
+static void __print_bth( struct mlx4_dev *mdev, struct ib_unpacked_bth *p)
+{
+ mlx4_dbg(mdev, "\n\t ========== BTH ==========\n");
+ mlx4_dbg(mdev, "\t opcode %02x", p->opcode);
+ mlx4_dbg(mdev, "\t solicited_event %02x", p->solicited_event);
+ mlx4_dbg(mdev, "\t mig_req %02x", p->mig_req);
+ mlx4_dbg(mdev, "\t header_version %02x", p->transport_header_version);
+ mlx4_dbg(mdev, "\t pkey %04x",
+ be16_to_cpu(p->pkey));
+ mlx4_dbg(mdev, "\t destination_qpn %08x",
+ be32_to_cpu(p->destination_qpn));
+ mlx4_dbg(mdev, "\t ack_req %02x", p->ack_req);
+ mlx4_dbg(mdev, "\t psn %08x",
+ be32_to_cpu(p->psn));
+}
+
+static void __print_lrh( struct mlx4_dev *mdev, struct ib_unpacked_lrh *p)
+{
+ mlx4_dbg(mdev, "\n\t ========== LRH ==========\n");
+ mlx4_dbg(mdev, "\t virtual_lane %02x", p->virtual_lane);
+ mlx4_dbg(mdev, "\t link_version %02x", p->link_version);
+ mlx4_dbg(mdev, "\t service_level %02x", p->service_level);
+ mlx4_dbg(mdev, "\t link_next_header %02x", p->link_next_header);
+ mlx4_dbg(mdev, "\t destination_lid %04x",
+ be16_to_cpu(p->destination_lid));
+ mlx4_dbg(mdev, "\t packet_length %04x",
+ be16_to_cpu(p->packet_length));
+ mlx4_dbg(mdev, "\t source_lid %04x",
+ be16_to_cpu(p->source_lid));
+}
+
+static void __print_ud_header( struct mlx4_dev *mdev, struct ib_ud_header *p)
+{
+ mlx4_dbg(mdev, "\n\t ========== UD HEADER ==========\n");
+
+ mlx4_dbg(mdev, "\t grh_present %d, imm_present %d, imm %08x",
+ p->grh_present, p->immediate_present, be32_to_cpu(p->immediate_data) );
+
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_LRH )
+ __print_lrh( mdev, &p->lrh );
+
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_BTH )
+ __print_bth( mdev, &p->bth );
+
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_DETH )
+ __print_deth( mdev, &p->deth );
+
+ if ( p->grh_present && (mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_GRH) )
+ __print_grh( mdev, &p->grh );
+
+}
+
+static void __print_mlx( struct mlx4_dev *mdev, struct mlx4_wqe_mlx_seg *p)
+{
+ mlx4_dbg(mdev, "\n\t ========== MLX WQE ==========\n");
+ mlx4_dbg(mdev, "\t owner %02x", p->owner);
+ mlx4_dbg(mdev, "\t opcode %02x", p->opcode);
+ mlx4_dbg(mdev, "\t size %02x", p->size);
+ mlx4_dbg(mdev, "\t flags %08x",
+ be32_to_cpu(p->flags));
+ mlx4_dbg(mdev, "\t rlid %04x",
+ be16_to_cpu(p->rlid));
+}
+
+void st_print_mlx_header( struct mlx4_dev *mdev, struct mlx4_ib_sqp *sqp, struct mlx4_wqe_mlx_seg *mlx )
+{
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_UDH )
+ __print_ud_header( mdev, &sqp->ud_header );
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_WQE )
+ __print_mlx( mdev, mlx );
+}
+
+void st_print_mlx_send(struct mlx4_dev *mdev, struct ib_qp *ibqp, ib_send_wr_t *wr)
+{
+ struct mlx4_ib_qp *qp = to_mqp(ibqp);
+
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_WR ) {
+ mlx4_dbg(mdev, "\n\t ========== SEND WR on QP %#x (%#x) ==========\n",
+ ibqp->qp_num, qp->mqp.qpn );
+ mlx4_dbg(mdev, "\t wr_type %d", wr->wr_type);
+ mlx4_dbg(mdev, "\t wr_id %08I64x", wr->wr_id);
+ mlx4_dbg(mdev, "\t send_opt %x", wr->send_opt);
+ mlx4_dbg(mdev, "\t immediate_data %x", be32_to_cpu(wr->immediate_data));
+ mlx4_dbg(mdev, "\t num_ds %d", wr->num_ds);
+ mlx4_dbg(mdev, "\t ds[0].pa %I64x", wr->ds_array[0].vaddr);
+ mlx4_dbg(mdev, "\t ds[0].length %x", wr->ds_array[0].length);
+ mlx4_dbg(mdev, "\t ds[0].lkey %x", wr->ds_array[0].lkey);
+ }
+}
+
+void st_dump_mlx_wqe(struct mlx4_dev *mdev, void *wqe, int size_in_dwords, ib_send_wr_t *wr)
+{
+ int j;
+ u32 *ptr = wqe;
+#if 0
+ int i, size;
+#else
+ UNUSED_PARAM(wr);
+#endif
+
+ mlx4_dbg(mdev, "\n\t ========== MLX WQE at %p, size %#x ==========\n",
+ wqe, size_in_dwords*4 );
+
+ if ( mdev->pdev->p_stat_dev->flags & MLX4_MAD_TRACE_MLX_WQE_DUMP ) {
+ for ( j = 0; j < size_in_dwords; ++j ) {
+ mlx4_warn( mdev, "\t %04x: %08x %08x %08x %08x \n", 16*j,
+ be32_to_cpu(ptr[4*j]), be32_to_cpu(ptr[4*j + 1]),
+ be32_to_cpu(ptr[4*j + 2]),be32_to_cpu(ptr[4*j + 3]) );
+ }
+ }
+
+#if 0
+ for ( j = 0; j < (int)wr->num_ds; ++j ) {
+ mlx4_dbg(mdev, "\n\t ========== SMP %d at pa %I64x, size %#x, lkey %#x ==========\n",
+ j, wr->ds_array[0].vaddr, wr->ds_array[0].length, wr->ds_array[0].lkey );
+
+ //TODO: vaddr should be converted to virtual address
+ ptr = (PVOID)(ULONG_PTR)wr->ds_array[0].vaddr;
+ size = (wr->ds_array[0].length + 3) >> 2;
+ for ( i = 0; i < size; ++i ) {
+ mlx4_warn( mdev, "%04x: %08x %08x %08x %08x \n", 16*i,
+ be32_to_cpu(ptr[4*i]), be32_to_cpu(ptr[4*i + 1]),
+ be32_to_cpu(ptr[4*i + 2]),be32_to_cpu(ptr[4*i + 3]) );
+ }
+ }
+#endif
+
+}
+
+
+void st_dev_rmv( PMLX4_ST_DEVICE p_stat )
+{
+ if ( p_stat )
+ p_stat->valid = FALSE;
+}
+
+PMLX4_ST_DEVICE st_dev_add()
+{
+ int i;
+
+ for ( i = 0; i < MLX4_ST_MAX_DEVICES; ++i ) {
+ if ( g_stat.dev[i].valid == FALSE ) {
+ g_stat.dev[i].valid = TRUE;
+ return &g_stat.dev[i];
+ }
+ }
+
+ return NULL;
+}
+
+