aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRalph Campbell <ralph.campbell@qlogic.com>2008-01-07 00:02:34 -0500
committerRoland Dreier <rolandd@cisco.com>2008-01-25 17:15:38 -0500
commit3029fcc3d44530601f19fd8f551ac195d3a918d7 (patch)
treedf486443f140a8d47fab8bda9552744c3201b865
parent6c719cae0b91f577738dfb4007baee28f03e48a5 (diff)
IB/ipath: Export hardware counters more consistently
Various hardware counters are exported via the ipath file system (since it is binary data). The old file format was very dependent on the HW offsets for these registers. Newer HCA chips can have different counters at different offsets. This patch adds a level of indirection to make the file format consistent across HCAs. Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/hw/ipath/ipath_common.h20
-rw-r--r--drivers/infiniband/hw/ipath/ipath_fs.c11
-rw-r--r--drivers/infiniband/hw/ipath/ipath_iba6110.c159
-rw-r--r--drivers/infiniband/hw/ipath/ipath_iba6120.c153
-rw-r--r--drivers/infiniband/hw/ipath/ipath_kernel.h2
5 files changed, 328 insertions, 17 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h
index 851df8a75e7..aa780e7f241 100644
--- a/drivers/infiniband/hw/ipath/ipath_common.h
+++ b/drivers/infiniband/hw/ipath/ipath_common.h
@@ -579,7 +579,7 @@ struct ipath_flash {
579struct infinipath_counters { 579struct infinipath_counters {
580 __u64 LBIntCnt; 580 __u64 LBIntCnt;
581 __u64 LBFlowStallCnt; 581 __u64 LBFlowStallCnt;
582 __u64 Reserved1; 582 __u64 TxSDmaDescCnt; /* was Reserved1 */
583 __u64 TxUnsupVLErrCnt; 583 __u64 TxUnsupVLErrCnt;
584 __u64 TxDataPktCnt; 584 __u64 TxDataPktCnt;
585 __u64 TxFlowPktCnt; 585 __u64 TxFlowPktCnt;
@@ -615,12 +615,26 @@ struct infinipath_counters {
615 __u64 RxP6HdrEgrOvflCnt; 615 __u64 RxP6HdrEgrOvflCnt;
616 __u64 RxP7HdrEgrOvflCnt; 616 __u64 RxP7HdrEgrOvflCnt;
617 __u64 RxP8HdrEgrOvflCnt; 617 __u64 RxP8HdrEgrOvflCnt;
618 __u64 Reserved6; 618 __u64 RxP9HdrEgrOvflCnt; /* was Reserved6 */
619 __u64 Reserved7; 619 __u64 RxP10HdrEgrOvflCnt; /* was Reserved7 */
620 __u64 RxP11HdrEgrOvflCnt; /* new for IBA7220 */
621 __u64 RxP12HdrEgrOvflCnt; /* new for IBA7220 */
622 __u64 RxP13HdrEgrOvflCnt; /* new for IBA7220 */
623 __u64 RxP14HdrEgrOvflCnt; /* new for IBA7220 */
624 __u64 RxP15HdrEgrOvflCnt; /* new for IBA7220 */
625 __u64 RxP16HdrEgrOvflCnt; /* new for IBA7220 */
620 __u64 IBStatusChangeCnt; 626 __u64 IBStatusChangeCnt;
621 __u64 IBLinkErrRecoveryCnt; 627 __u64 IBLinkErrRecoveryCnt;
622 __u64 IBLinkDownedCnt; 628 __u64 IBLinkDownedCnt;
623 __u64 IBSymbolErrCnt; 629 __u64 IBSymbolErrCnt;
630 /* The following are new for IBA7220 */
631 __u64 RxVL15DroppedPktCnt;
632 __u64 RxOtherLocalPhyErrCnt;
633 __u64 PcieRetryBufDiagQwordCnt;
634 __u64 ExcessBufferOvflCnt;
635 __u64 LocalLinkIntegrityErrCnt;
636 __u64 RxVlErrCnt;
637 __u64 RxDlidFltrCnt;
624}; 638};
625 639
626/* 640/*
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c
index 262c25db05c..52325e009a1 100644
--- a/drivers/infiniband/hw/ipath/ipath_fs.c
+++ b/drivers/infiniband/hw/ipath/ipath_fs.c
@@ -108,21 +108,16 @@ static const struct file_operations atomic_stats_ops = {
108 .read = atomic_stats_read, 108 .read = atomic_stats_read,
109}; 109};
110 110
111#define NUM_COUNTERS sizeof(struct infinipath_counters) / sizeof(u64)
112
113static ssize_t atomic_counters_read(struct file *file, char __user *buf, 111static ssize_t atomic_counters_read(struct file *file, char __user *buf,
114 size_t count, loff_t *ppos) 112 size_t count, loff_t *ppos)
115{ 113{
116 u64 counters[NUM_COUNTERS]; 114 struct infinipath_counters counters;
117 u16 i;
118 struct ipath_devdata *dd; 115 struct ipath_devdata *dd;
119 116
120 dd = file->f_path.dentry->d_inode->i_private; 117 dd = file->f_path.dentry->d_inode->i_private;
118 dd->ipath_f_read_counters(dd, &counters);
121 119
122 for (i = 0; i < NUM_COUNTERS; i++) 120 return simple_read_from_buffer(buf, count, ppos, &counters,
123 counters[i] = ipath_snap_cntr(dd, i);
124
125 return simple_read_from_buffer(buf, count, ppos, counters,
126 sizeof counters); 121 sizeof counters);
127} 122}
128 123
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6110.c b/drivers/infiniband/hw/ipath/ipath_iba6110.c
index c272a7392e2..ce858797e29 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba6110.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba6110.c
@@ -148,10 +148,57 @@ struct _infinipath_do_not_use_kernel_regs {
148 unsigned long long ReservedSW2[4]; 148 unsigned long long ReservedSW2[4];
149}; 149};
150 150
151#define IPATH_KREG_OFFSET(field) (offsetof(struct \ 151struct _infinipath_do_not_use_counters {
152 _infinipath_do_not_use_kernel_regs, field) / sizeof(u64)) 152 __u64 LBIntCnt;
153 __u64 LBFlowStallCnt;
154 __u64 Reserved1;
155 __u64 TxUnsupVLErrCnt;
156 __u64 TxDataPktCnt;
157 __u64 TxFlowPktCnt;
158 __u64 TxDwordCnt;
159 __u64 TxLenErrCnt;
160 __u64 TxMaxMinLenErrCnt;
161 __u64 TxUnderrunCnt;
162 __u64 TxFlowStallCnt;
163 __u64 TxDroppedPktCnt;
164 __u64 RxDroppedPktCnt;
165 __u64 RxDataPktCnt;
166 __u64 RxFlowPktCnt;
167 __u64 RxDwordCnt;
168 __u64 RxLenErrCnt;
169 __u64 RxMaxMinLenErrCnt;
170 __u64 RxICRCErrCnt;
171 __u64 RxVCRCErrCnt;
172 __u64 RxFlowCtrlErrCnt;
173 __u64 RxBadFormatCnt;
174 __u64 RxLinkProblemCnt;
175 __u64 RxEBPCnt;
176 __u64 RxLPCRCErrCnt;
177 __u64 RxBufOvflCnt;
178 __u64 RxTIDFullErrCnt;
179 __u64 RxTIDValidErrCnt;
180 __u64 RxPKeyMismatchCnt;
181 __u64 RxP0HdrEgrOvflCnt;
182 __u64 RxP1HdrEgrOvflCnt;
183 __u64 RxP2HdrEgrOvflCnt;
184 __u64 RxP3HdrEgrOvflCnt;
185 __u64 RxP4HdrEgrOvflCnt;
186 __u64 RxP5HdrEgrOvflCnt;
187 __u64 RxP6HdrEgrOvflCnt;
188 __u64 RxP7HdrEgrOvflCnt;
189 __u64 RxP8HdrEgrOvflCnt;
190 __u64 Reserved6;
191 __u64 Reserved7;
192 __u64 IBStatusChangeCnt;
193 __u64 IBLinkErrRecoveryCnt;
194 __u64 IBLinkDownedCnt;
195 __u64 IBSymbolErrCnt;
196};
197
198#define IPATH_KREG_OFFSET(field) (offsetof( \
199 struct _infinipath_do_not_use_kernel_regs, field) / sizeof(u64))
153#define IPATH_CREG_OFFSET(field) (offsetof( \ 200#define IPATH_CREG_OFFSET(field) (offsetof( \
154 struct infinipath_counters, field) / sizeof(u64)) 201 struct _infinipath_do_not_use_counters, field) / sizeof(u64))
155 202
156static const struct ipath_kregs ipath_ht_kregs = { 203static const struct ipath_kregs ipath_ht_kregs = {
157 .kr_control = IPATH_KREG_OFFSET(Control), 204 .kr_control = IPATH_KREG_OFFSET(Control),
@@ -1614,6 +1661,111 @@ static void ipath_ht_free_irq(struct ipath_devdata *dd)
1614 dd->ipath_intconfig = 0; 1661 dd->ipath_intconfig = 0;
1615} 1662}
1616 1663
1664static void ipath_ht_read_counters(struct ipath_devdata *dd,
1665 struct infinipath_counters *cntrs)
1666{
1667 cntrs->LBIntCnt =
1668 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(LBIntCnt));
1669 cntrs->LBFlowStallCnt =
1670 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(LBFlowStallCnt));
1671 cntrs->TxSDmaDescCnt = 0;
1672 cntrs->TxUnsupVLErrCnt =
1673 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxUnsupVLErrCnt));
1674 cntrs->TxDataPktCnt =
1675 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxDataPktCnt));
1676 cntrs->TxFlowPktCnt =
1677 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxFlowPktCnt));
1678 cntrs->TxDwordCnt =
1679 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxDwordCnt));
1680 cntrs->TxLenErrCnt =
1681 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxLenErrCnt));
1682 cntrs->TxMaxMinLenErrCnt =
1683 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxMaxMinLenErrCnt));
1684 cntrs->TxUnderrunCnt =
1685 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxUnderrunCnt));
1686 cntrs->TxFlowStallCnt =
1687 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxFlowStallCnt));
1688 cntrs->TxDroppedPktCnt =
1689 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxDroppedPktCnt));
1690 cntrs->RxDroppedPktCnt =
1691 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxDroppedPktCnt));
1692 cntrs->RxDataPktCnt =
1693 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxDataPktCnt));
1694 cntrs->RxFlowPktCnt =
1695 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxFlowPktCnt));
1696 cntrs->RxDwordCnt =
1697 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxDwordCnt));
1698 cntrs->RxLenErrCnt =
1699 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxLenErrCnt));
1700 cntrs->RxMaxMinLenErrCnt =
1701 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxMaxMinLenErrCnt));
1702 cntrs->RxICRCErrCnt =
1703 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxICRCErrCnt));
1704 cntrs->RxVCRCErrCnt =
1705 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxVCRCErrCnt));
1706 cntrs->RxFlowCtrlErrCnt =
1707 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxFlowCtrlErrCnt));
1708 cntrs->RxBadFormatCnt =
1709 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxBadFormatCnt));
1710 cntrs->RxLinkProblemCnt =
1711 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxLinkProblemCnt));
1712 cntrs->RxEBPCnt =
1713 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxEBPCnt));
1714 cntrs->RxLPCRCErrCnt =
1715 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxLPCRCErrCnt));
1716 cntrs->RxBufOvflCnt =
1717 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxBufOvflCnt));
1718 cntrs->RxTIDFullErrCnt =
1719 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxTIDFullErrCnt));
1720 cntrs->RxTIDValidErrCnt =
1721 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxTIDValidErrCnt));
1722 cntrs->RxPKeyMismatchCnt =
1723 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxPKeyMismatchCnt));
1724 cntrs->RxP0HdrEgrOvflCnt =
1725 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP0HdrEgrOvflCnt));
1726 cntrs->RxP1HdrEgrOvflCnt =
1727 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP1HdrEgrOvflCnt));
1728 cntrs->RxP2HdrEgrOvflCnt =
1729 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP2HdrEgrOvflCnt));
1730 cntrs->RxP3HdrEgrOvflCnt =
1731 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP3HdrEgrOvflCnt));
1732 cntrs->RxP4HdrEgrOvflCnt =
1733 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP4HdrEgrOvflCnt));
1734 cntrs->RxP5HdrEgrOvflCnt =
1735 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP5HdrEgrOvflCnt));
1736 cntrs->RxP6HdrEgrOvflCnt =
1737 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP6HdrEgrOvflCnt));
1738 cntrs->RxP7HdrEgrOvflCnt =
1739 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP7HdrEgrOvflCnt));
1740 cntrs->RxP8HdrEgrOvflCnt =
1741 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP8HdrEgrOvflCnt));
1742 cntrs->RxP9HdrEgrOvflCnt = 0;
1743 cntrs->RxP10HdrEgrOvflCnt = 0;
1744 cntrs->RxP11HdrEgrOvflCnt = 0;
1745 cntrs->RxP12HdrEgrOvflCnt = 0;
1746 cntrs->RxP13HdrEgrOvflCnt = 0;
1747 cntrs->RxP14HdrEgrOvflCnt = 0;
1748 cntrs->RxP15HdrEgrOvflCnt = 0;
1749 cntrs->RxP16HdrEgrOvflCnt = 0;
1750 cntrs->IBStatusChangeCnt =
1751 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBStatusChangeCnt));
1752 cntrs->IBLinkErrRecoveryCnt =
1753 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBLinkErrRecoveryCnt));
1754 cntrs->IBLinkDownedCnt =
1755 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBLinkDownedCnt));
1756 cntrs->IBSymbolErrCnt =
1757 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBSymbolErrCnt));
1758 cntrs->RxVL15DroppedPktCnt = 0;
1759 cntrs->RxOtherLocalPhyErrCnt = 0;
1760 cntrs->PcieRetryBufDiagQwordCnt = 0;
1761 cntrs->ExcessBufferOvflCnt = dd->ipath_overrun_thresh_errs;
1762 cntrs->LocalLinkIntegrityErrCnt =
1763 (dd->ipath_flags & IPATH_GPIO_ERRINTRS) ?
1764 dd->ipath_lli_errs : dd->ipath_lli_errors;
1765 cntrs->RxVlErrCnt = 0;
1766 cntrs->RxDlidFltrCnt = 0;
1767}
1768
1617/** 1769/**
1618 * ipath_init_iba6110_funcs - set up the chip-specific function pointers 1770 * ipath_init_iba6110_funcs - set up the chip-specific function pointers
1619 * @dd: the infinipath device 1771 * @dd: the infinipath device
@@ -1638,6 +1790,7 @@ void ipath_init_iba6110_funcs(struct ipath_devdata *dd)
1638 dd->ipath_f_setextled = ipath_setup_ht_setextled; 1790 dd->ipath_f_setextled = ipath_setup_ht_setextled;
1639 dd->ipath_f_get_base_info = ipath_ht_get_base_info; 1791 dd->ipath_f_get_base_info = ipath_ht_get_base_info;
1640 dd->ipath_f_free_irq = ipath_ht_free_irq; 1792 dd->ipath_f_free_irq = ipath_ht_free_irq;
1793 dd->ipath_f_read_counters = ipath_ht_read_counters;
1641 1794
1642 /* 1795 /*
1643 * initialize chip-specific variables 1796 * initialize chip-specific variables
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c
index e6893ebc59d..97ae1179397 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba6120.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c
@@ -145,10 +145,57 @@ struct _infinipath_do_not_use_kernel_regs {
145 unsigned long long Reserved12; 145 unsigned long long Reserved12;
146}; 146};
147 147
148#define IPATH_KREG_OFFSET(field) (offsetof(struct \ 148struct _infinipath_do_not_use_counters {
149 _infinipath_do_not_use_kernel_regs, field) / sizeof(u64)) 149 __u64 LBIntCnt;
150 __u64 LBFlowStallCnt;
151 __u64 Reserved1;
152 __u64 TxUnsupVLErrCnt;
153 __u64 TxDataPktCnt;
154 __u64 TxFlowPktCnt;
155 __u64 TxDwordCnt;
156 __u64 TxLenErrCnt;
157 __u64 TxMaxMinLenErrCnt;
158 __u64 TxUnderrunCnt;
159 __u64 TxFlowStallCnt;
160 __u64 TxDroppedPktCnt;
161 __u64 RxDroppedPktCnt;
162 __u64 RxDataPktCnt;
163 __u64 RxFlowPktCnt;
164 __u64 RxDwordCnt;
165 __u64 RxLenErrCnt;
166 __u64 RxMaxMinLenErrCnt;
167 __u64 RxICRCErrCnt;
168 __u64 RxVCRCErrCnt;
169 __u64 RxFlowCtrlErrCnt;
170 __u64 RxBadFormatCnt;
171 __u64 RxLinkProblemCnt;
172 __u64 RxEBPCnt;
173 __u64 RxLPCRCErrCnt;
174 __u64 RxBufOvflCnt;
175 __u64 RxTIDFullErrCnt;
176 __u64 RxTIDValidErrCnt;
177 __u64 RxPKeyMismatchCnt;
178 __u64 RxP0HdrEgrOvflCnt;
179 __u64 RxP1HdrEgrOvflCnt;
180 __u64 RxP2HdrEgrOvflCnt;
181 __u64 RxP3HdrEgrOvflCnt;
182 __u64 RxP4HdrEgrOvflCnt;
183 __u64 RxP5HdrEgrOvflCnt;
184 __u64 RxP6HdrEgrOvflCnt;
185 __u64 RxP7HdrEgrOvflCnt;
186 __u64 RxP8HdrEgrOvflCnt;
187 __u64 Reserved6;
188 __u64 Reserved7;
189 __u64 IBStatusChangeCnt;
190 __u64 IBLinkErrRecoveryCnt;
191 __u64 IBLinkDownedCnt;
192 __u64 IBSymbolErrCnt;
193};
194
195#define IPATH_KREG_OFFSET(field) (offsetof( \
196 struct _infinipath_do_not_use_kernel_regs, field) / sizeof(u64))
150#define IPATH_CREG_OFFSET(field) (offsetof( \ 197#define IPATH_CREG_OFFSET(field) (offsetof( \
151 struct infinipath_counters, field) / sizeof(u64)) 198 struct _infinipath_do_not_use_counters, field) / sizeof(u64))
152 199
153static const struct ipath_kregs ipath_pe_kregs = { 200static const struct ipath_kregs ipath_pe_kregs = {
154 .kr_control = IPATH_KREG_OFFSET(Control), 201 .kr_control = IPATH_KREG_OFFSET(Control),
@@ -1368,6 +1415,105 @@ static void ipath_pe_free_irq(struct ipath_devdata *dd)
1368 dd->ipath_irq = 0; 1415 dd->ipath_irq = 0;
1369} 1416}
1370 1417
1418static void ipath_pe_read_counters(struct ipath_devdata *dd,
1419 struct infinipath_counters *cntrs)
1420{
1421 cntrs->LBIntCnt =
1422 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(LBIntCnt));
1423 cntrs->LBFlowStallCnt =
1424 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(LBFlowStallCnt));
1425 cntrs->TxSDmaDescCnt = 0;
1426 cntrs->TxUnsupVLErrCnt =
1427 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxUnsupVLErrCnt));
1428 cntrs->TxDataPktCnt =
1429 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxDataPktCnt));
1430 cntrs->TxFlowPktCnt =
1431 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxFlowPktCnt));
1432 cntrs->TxDwordCnt =
1433 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxDwordCnt));
1434 cntrs->TxLenErrCnt =
1435 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxLenErrCnt));
1436 cntrs->TxMaxMinLenErrCnt =
1437 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxMaxMinLenErrCnt));
1438 cntrs->TxUnderrunCnt =
1439 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxUnderrunCnt));
1440 cntrs->TxFlowStallCnt =
1441 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxFlowStallCnt));
1442 cntrs->TxDroppedPktCnt =
1443 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(TxDroppedPktCnt));
1444 cntrs->RxDroppedPktCnt =
1445 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxDroppedPktCnt));
1446 cntrs->RxDataPktCnt =
1447 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxDataPktCnt));
1448 cntrs->RxFlowPktCnt =
1449 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxFlowPktCnt));
1450 cntrs->RxDwordCnt =
1451 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxDwordCnt));
1452 cntrs->RxLenErrCnt =
1453 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxLenErrCnt));
1454 cntrs->RxMaxMinLenErrCnt =
1455 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxMaxMinLenErrCnt));
1456 cntrs->RxICRCErrCnt =
1457 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxICRCErrCnt));
1458 cntrs->RxVCRCErrCnt =
1459 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxVCRCErrCnt));
1460 cntrs->RxFlowCtrlErrCnt =
1461 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxFlowCtrlErrCnt));
1462 cntrs->RxBadFormatCnt =
1463 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxBadFormatCnt));
1464 cntrs->RxLinkProblemCnt =
1465 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxLinkProblemCnt));
1466 cntrs->RxEBPCnt =
1467 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxEBPCnt));
1468 cntrs->RxLPCRCErrCnt =
1469 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxLPCRCErrCnt));
1470 cntrs->RxBufOvflCnt =
1471 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxBufOvflCnt));
1472 cntrs->RxTIDFullErrCnt =
1473 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxTIDFullErrCnt));
1474 cntrs->RxTIDValidErrCnt =
1475 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxTIDValidErrCnt));
1476 cntrs->RxPKeyMismatchCnt =
1477 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxPKeyMismatchCnt));
1478 cntrs->RxP0HdrEgrOvflCnt =
1479 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP0HdrEgrOvflCnt));
1480 cntrs->RxP1HdrEgrOvflCnt =
1481 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP1HdrEgrOvflCnt));
1482 cntrs->RxP2HdrEgrOvflCnt =
1483 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP2HdrEgrOvflCnt));
1484 cntrs->RxP3HdrEgrOvflCnt =
1485 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP3HdrEgrOvflCnt));
1486 cntrs->RxP4HdrEgrOvflCnt =
1487 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(RxP4HdrEgrOvflCnt));
1488 cntrs->RxP5HdrEgrOvflCnt = 0;
1489 cntrs->RxP6HdrEgrOvflCnt = 0;
1490 cntrs->RxP7HdrEgrOvflCnt = 0;
1491 cntrs->RxP8HdrEgrOvflCnt = 0;
1492 cntrs->RxP9HdrEgrOvflCnt = 0;
1493 cntrs->RxP10HdrEgrOvflCnt = 0;
1494 cntrs->RxP11HdrEgrOvflCnt = 0;
1495 cntrs->RxP12HdrEgrOvflCnt = 0;
1496 cntrs->RxP13HdrEgrOvflCnt = 0;
1497 cntrs->RxP14HdrEgrOvflCnt = 0;
1498 cntrs->RxP15HdrEgrOvflCnt = 0;
1499 cntrs->RxP16HdrEgrOvflCnt = 0;
1500 cntrs->IBStatusChangeCnt =
1501 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBStatusChangeCnt));
1502 cntrs->IBLinkErrRecoveryCnt =
1503 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBLinkErrRecoveryCnt));
1504 cntrs->IBLinkDownedCnt =
1505 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBLinkDownedCnt));
1506 cntrs->IBSymbolErrCnt =
1507 ipath_snap_cntr(dd, IPATH_CREG_OFFSET(IBSymbolErrCnt));
1508 cntrs->RxVL15DroppedPktCnt = 0;
1509 cntrs->RxOtherLocalPhyErrCnt = 0;
1510 cntrs->PcieRetryBufDiagQwordCnt = 0;
1511 cntrs->ExcessBufferOvflCnt = dd->ipath_overrun_thresh_errs;
1512 cntrs->LocalLinkIntegrityErrCnt = dd->ipath_lli_errs;
1513 cntrs->RxVlErrCnt = 0;
1514 cntrs->RxDlidFltrCnt = 0;
1515}
1516
1371/* 1517/*
1372 * On platforms using this chip, and not having ordered WC stores, we 1518 * On platforms using this chip, and not having ordered WC stores, we
1373 * can get TXE parity errors due to speculative reads to the PIO buffers, 1519 * can get TXE parity errors due to speculative reads to the PIO buffers,
@@ -1427,6 +1573,7 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd)
1427 1573
1428 /* initialize chip-specific variables */ 1574 /* initialize chip-specific variables */
1429 dd->ipath_f_tidtemplate = ipath_pe_tidtemplate; 1575 dd->ipath_f_tidtemplate = ipath_pe_tidtemplate;
1576 dd->ipath_f_read_counters = ipath_pe_read_counters;
1430 1577
1431 /* 1578 /*
1432 * setup the register offsets, since they are different for each 1579 * setup the register offsets, since they are different for each
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index a59c06943de..4f7bc08796b 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -253,6 +253,8 @@ struct ipath_devdata {
253 int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); 253 int (*ipath_f_get_base_info)(struct ipath_portdata *, void *);
254 /* free irq */ 254 /* free irq */
255 void (*ipath_f_free_irq)(struct ipath_devdata *); 255 void (*ipath_f_free_irq)(struct ipath_devdata *);
256 void (*ipath_f_read_counters)(struct ipath_devdata *,
257 struct infinipath_counters *);
256 struct ipath_ibdev *verbs_dev; 258 struct ipath_ibdev *verbs_dev;
257 struct timer_list verbs_timer; 259 struct timer_list verbs_timer;
258 /* total dwords sent (summed from counter) */ 260 /* total dwords sent (summed from counter) */