aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/ipath/ipath_iba6110.c
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 /drivers/infiniband/hw/ipath/ipath_iba6110.c
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>
Diffstat (limited to 'drivers/infiniband/hw/ipath/ipath_iba6110.c')
-rw-r--r--drivers/infiniband/hw/ipath/ipath_iba6110.c159
1 files changed, 156 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6110.c b/drivers/infiniband/hw/ipath/ipath_iba6110.c
index c272a7392e22..ce858797e299 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