diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_common.h | 20 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_fs.c | 11 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6110.c | 159 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6120.c | 153 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 2 |
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 { | |||
579 | struct infinipath_counters { | 579 | struct 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 | |||
113 | static ssize_t atomic_counters_read(struct file *file, char __user *buf, | 111 | static 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 \ | 151 | struct _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 | ||
156 | static const struct ipath_kregs ipath_ht_kregs = { | 203 | static 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 | ||
1664 | static 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 \ | 148 | struct _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 | ||
153 | static const struct ipath_kregs ipath_pe_kregs = { | 200 | static 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 | ||
1418 | static 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) */ |