diff options
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r-- | drivers/infiniband/hw/qib/qib.h | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_iba6120.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_iba7220.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_iba7322.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_init.c | 22 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_mad.c | 44 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_rc.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_ruc.c | 1 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_ud.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_verbs.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_verbs.h | 16 |
11 files changed, 83 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/qib/qib.h b/drivers/infiniband/hw/qib/qib.h index f044430ed98e..c00ae093b6f8 100644 --- a/drivers/infiniband/hw/qib/qib.h +++ b/drivers/infiniband/hw/qib/qib.h | |||
@@ -1186,7 +1186,7 @@ int qib_setup_eagerbufs(struct qib_ctxtdata *); | |||
1186 | void qib_set_ctxtcnt(struct qib_devdata *); | 1186 | void qib_set_ctxtcnt(struct qib_devdata *); |
1187 | int qib_create_ctxts(struct qib_devdata *dd); | 1187 | int qib_create_ctxts(struct qib_devdata *dd); |
1188 | struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *, u32, int); | 1188 | struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *, u32, int); |
1189 | void qib_init_pportdata(struct qib_pportdata *, struct qib_devdata *, u8, u8); | 1189 | int qib_init_pportdata(struct qib_pportdata *, struct qib_devdata *, u8, u8); |
1190 | void qib_free_ctxtdata(struct qib_devdata *, struct qib_ctxtdata *); | 1190 | void qib_free_ctxtdata(struct qib_devdata *, struct qib_ctxtdata *); |
1191 | 1191 | ||
1192 | u32 qib_kreceive(struct qib_ctxtdata *, u32 *, u32 *); | 1192 | u32 qib_kreceive(struct qib_ctxtdata *, u32 *, u32 *); |
diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c index b9bea2ebfd4a..d68266ac7619 100644 --- a/drivers/infiniband/hw/qib/qib_iba6120.c +++ b/drivers/infiniband/hw/qib/qib_iba6120.c | |||
@@ -3265,7 +3265,9 @@ static int init_6120_variables(struct qib_devdata *dd) | |||
3265 | 3265 | ||
3266 | dd->eep_st_masks[2].errs_to_log = ERR_MASK(ResetNegated); | 3266 | dd->eep_st_masks[2].errs_to_log = ERR_MASK(ResetNegated); |
3267 | 3267 | ||
3268 | qib_init_pportdata(ppd, dd, 0, 1); | 3268 | ret = qib_init_pportdata(ppd, dd, 0, 1); |
3269 | if (ret) | ||
3270 | goto bail; | ||
3269 | ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; | 3271 | ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; |
3270 | ppd->link_speed_supported = QIB_IB_SDR; | 3272 | ppd->link_speed_supported = QIB_IB_SDR; |
3271 | ppd->link_width_enabled = IB_WIDTH_4X; | 3273 | ppd->link_width_enabled = IB_WIDTH_4X; |
diff --git a/drivers/infiniband/hw/qib/qib_iba7220.c b/drivers/infiniband/hw/qib/qib_iba7220.c index 28063d4c225b..7dec89fdc124 100644 --- a/drivers/infiniband/hw/qib/qib_iba7220.c +++ b/drivers/infiniband/hw/qib/qib_iba7220.c | |||
@@ -4059,7 +4059,9 @@ static int qib_init_7220_variables(struct qib_devdata *dd) | |||
4059 | init_waitqueue_head(&cpspec->autoneg_wait); | 4059 | init_waitqueue_head(&cpspec->autoneg_wait); |
4060 | INIT_DELAYED_WORK(&cpspec->autoneg_work, autoneg_7220_work); | 4060 | INIT_DELAYED_WORK(&cpspec->autoneg_work, autoneg_7220_work); |
4061 | 4061 | ||
4062 | qib_init_pportdata(ppd, dd, 0, 1); | 4062 | ret = qib_init_pportdata(ppd, dd, 0, 1); |
4063 | if (ret) | ||
4064 | goto bail; | ||
4063 | ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; | 4065 | ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; |
4064 | ppd->link_speed_supported = QIB_IB_SDR | QIB_IB_DDR; | 4066 | ppd->link_speed_supported = QIB_IB_SDR | QIB_IB_DDR; |
4065 | 4067 | ||
diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c index 8441579decd9..a7eb32517a04 100644 --- a/drivers/infiniband/hw/qib/qib_iba7322.c +++ b/drivers/infiniband/hw/qib/qib_iba7322.c | |||
@@ -6544,7 +6544,11 @@ static int qib_init_7322_variables(struct qib_devdata *dd) | |||
6544 | } | 6544 | } |
6545 | 6545 | ||
6546 | dd->num_pports++; | 6546 | dd->num_pports++; |
6547 | qib_init_pportdata(ppd, dd, pidx, dd->num_pports); | 6547 | ret = qib_init_pportdata(ppd, dd, pidx, dd->num_pports); |
6548 | if (ret) { | ||
6549 | dd->num_pports--; | ||
6550 | goto bail; | ||
6551 | } | ||
6548 | 6552 | ||
6549 | ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; | 6553 | ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; |
6550 | ppd->link_width_enabled = IB_WIDTH_4X; | 6554 | ppd->link_width_enabled = IB_WIDTH_4X; |
diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c index 6d2629990cb3..7fbf466704ab 100644 --- a/drivers/infiniband/hw/qib/qib_init.c +++ b/drivers/infiniband/hw/qib/qib_init.c | |||
@@ -233,7 +233,7 @@ struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt, | |||
233 | /* | 233 | /* |
234 | * Common code for initializing the physical port structure. | 234 | * Common code for initializing the physical port structure. |
235 | */ | 235 | */ |
236 | void qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd, | 236 | int qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd, |
237 | u8 hw_pidx, u8 port) | 237 | u8 hw_pidx, u8 port) |
238 | { | 238 | { |
239 | int size; | 239 | int size; |
@@ -243,6 +243,7 @@ void qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd, | |||
243 | 243 | ||
244 | spin_lock_init(&ppd->sdma_lock); | 244 | spin_lock_init(&ppd->sdma_lock); |
245 | spin_lock_init(&ppd->lflags_lock); | 245 | spin_lock_init(&ppd->lflags_lock); |
246 | spin_lock_init(&ppd->cc_shadow_lock); | ||
246 | init_waitqueue_head(&ppd->state_wait); | 247 | init_waitqueue_head(&ppd->state_wait); |
247 | 248 | ||
248 | init_timer(&ppd->symerr_clear_timer); | 249 | init_timer(&ppd->symerr_clear_timer); |
@@ -250,8 +251,10 @@ void qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd, | |||
250 | ppd->symerr_clear_timer.data = (unsigned long)ppd; | 251 | ppd->symerr_clear_timer.data = (unsigned long)ppd; |
251 | 252 | ||
252 | ppd->qib_wq = NULL; | 253 | ppd->qib_wq = NULL; |
253 | 254 | ppd->ibport_data.pmastats = | |
254 | spin_lock_init(&ppd->cc_shadow_lock); | 255 | alloc_percpu(struct qib_pma_counters); |
256 | if (!ppd->ibport_data.pmastats) | ||
257 | return -ENOMEM; | ||
255 | 258 | ||
256 | if (qib_cc_table_size < IB_CCT_MIN_ENTRIES) | 259 | if (qib_cc_table_size < IB_CCT_MIN_ENTRIES) |
257 | goto bail; | 260 | goto bail; |
@@ -299,7 +302,7 @@ void qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd, | |||
299 | goto bail_3; | 302 | goto bail_3; |
300 | } | 303 | } |
301 | 304 | ||
302 | return; | 305 | return 0; |
303 | 306 | ||
304 | bail_3: | 307 | bail_3: |
305 | kfree(ppd->ccti_entries_shadow); | 308 | kfree(ppd->ccti_entries_shadow); |
@@ -313,7 +316,7 @@ bail_1: | |||
313 | bail: | 316 | bail: |
314 | /* User is intentionally disabling the congestion control agent */ | 317 | /* User is intentionally disabling the congestion control agent */ |
315 | if (!qib_cc_table_size) | 318 | if (!qib_cc_table_size) |
316 | return; | 319 | return 0; |
317 | 320 | ||
318 | if (qib_cc_table_size < IB_CCT_MIN_ENTRIES) { | 321 | if (qib_cc_table_size < IB_CCT_MIN_ENTRIES) { |
319 | qib_cc_table_size = 0; | 322 | qib_cc_table_size = 0; |
@@ -324,7 +327,7 @@ bail: | |||
324 | 327 | ||
325 | qib_dev_err(dd, "Congestion Control Agent disabled for port %d\n", | 328 | qib_dev_err(dd, "Congestion Control Agent disabled for port %d\n", |
326 | port); | 329 | port); |
327 | return; | 330 | return 0; |
328 | } | 331 | } |
329 | 332 | ||
330 | static int init_pioavailregs(struct qib_devdata *dd) | 333 | static int init_pioavailregs(struct qib_devdata *dd) |
@@ -635,6 +638,12 @@ wq_error: | |||
635 | return -ENOMEM; | 638 | return -ENOMEM; |
636 | } | 639 | } |
637 | 640 | ||
641 | static void qib_free_pportdata(struct qib_pportdata *ppd) | ||
642 | { | ||
643 | free_percpu(ppd->ibport_data.pmastats); | ||
644 | ppd->ibport_data.pmastats = NULL; | ||
645 | } | ||
646 | |||
638 | /** | 647 | /** |
639 | * qib_init - do the actual initialization sequence on the chip | 648 | * qib_init - do the actual initialization sequence on the chip |
640 | * @dd: the qlogic_ib device | 649 | * @dd: the qlogic_ib device |
@@ -922,6 +931,7 @@ static void qib_shutdown_device(struct qib_devdata *dd) | |||
922 | destroy_workqueue(ppd->qib_wq); | 931 | destroy_workqueue(ppd->qib_wq); |
923 | ppd->qib_wq = NULL; | 932 | ppd->qib_wq = NULL; |
924 | } | 933 | } |
934 | qib_free_pportdata(ppd); | ||
925 | } | 935 | } |
926 | 936 | ||
927 | qib_update_eeprom_log(dd); | 937 | qib_update_eeprom_log(dd); |
diff --git a/drivers/infiniband/hw/qib/qib_mad.c b/drivers/infiniband/hw/qib/qib_mad.c index ccb119143d20..edad991d60ed 100644 --- a/drivers/infiniband/hw/qib/qib_mad.c +++ b/drivers/infiniband/hw/qib/qib_mad.c | |||
@@ -1634,6 +1634,23 @@ static int pma_get_portcounters_cong(struct ib_pma_mad *pmp, | |||
1634 | return reply((struct ib_smp *)pmp); | 1634 | return reply((struct ib_smp *)pmp); |
1635 | } | 1635 | } |
1636 | 1636 | ||
1637 | static void qib_snapshot_pmacounters( | ||
1638 | struct qib_ibport *ibp, | ||
1639 | struct qib_pma_counters *pmacounters) | ||
1640 | { | ||
1641 | struct qib_pma_counters *p; | ||
1642 | int cpu; | ||
1643 | |||
1644 | memset(pmacounters, 0, sizeof(*pmacounters)); | ||
1645 | for_each_possible_cpu(cpu) { | ||
1646 | p = per_cpu_ptr(ibp->pmastats, cpu); | ||
1647 | pmacounters->n_unicast_xmit += p->n_unicast_xmit; | ||
1648 | pmacounters->n_unicast_rcv += p->n_unicast_rcv; | ||
1649 | pmacounters->n_multicast_xmit += p->n_multicast_xmit; | ||
1650 | pmacounters->n_multicast_rcv += p->n_multicast_rcv; | ||
1651 | } | ||
1652 | } | ||
1653 | |||
1637 | static int pma_get_portcounters_ext(struct ib_pma_mad *pmp, | 1654 | static int pma_get_portcounters_ext(struct ib_pma_mad *pmp, |
1638 | struct ib_device *ibdev, u8 port) | 1655 | struct ib_device *ibdev, u8 port) |
1639 | { | 1656 | { |
@@ -1642,6 +1659,7 @@ static int pma_get_portcounters_ext(struct ib_pma_mad *pmp, | |||
1642 | struct qib_ibport *ibp = to_iport(ibdev, port); | 1659 | struct qib_ibport *ibp = to_iport(ibdev, port); |
1643 | struct qib_pportdata *ppd = ppd_from_ibp(ibp); | 1660 | struct qib_pportdata *ppd = ppd_from_ibp(ibp); |
1644 | u64 swords, rwords, spkts, rpkts, xwait; | 1661 | u64 swords, rwords, spkts, rpkts, xwait; |
1662 | struct qib_pma_counters pma; | ||
1645 | u8 port_select = p->port_select; | 1663 | u8 port_select = p->port_select; |
1646 | 1664 | ||
1647 | memset(pmp->data, 0, sizeof(pmp->data)); | 1665 | memset(pmp->data, 0, sizeof(pmp->data)); |
@@ -1664,10 +1682,17 @@ static int pma_get_portcounters_ext(struct ib_pma_mad *pmp, | |||
1664 | p->port_rcv_data = cpu_to_be64(rwords); | 1682 | p->port_rcv_data = cpu_to_be64(rwords); |
1665 | p->port_xmit_packets = cpu_to_be64(spkts); | 1683 | p->port_xmit_packets = cpu_to_be64(spkts); |
1666 | p->port_rcv_packets = cpu_to_be64(rpkts); | 1684 | p->port_rcv_packets = cpu_to_be64(rpkts); |
1667 | p->port_unicast_xmit_packets = cpu_to_be64(ibp->n_unicast_xmit); | 1685 | |
1668 | p->port_unicast_rcv_packets = cpu_to_be64(ibp->n_unicast_rcv); | 1686 | qib_snapshot_pmacounters(ibp, &pma); |
1669 | p->port_multicast_xmit_packets = cpu_to_be64(ibp->n_multicast_xmit); | 1687 | |
1670 | p->port_multicast_rcv_packets = cpu_to_be64(ibp->n_multicast_rcv); | 1688 | p->port_unicast_xmit_packets = cpu_to_be64(pma.n_unicast_xmit |
1689 | - ibp->z_unicast_xmit); | ||
1690 | p->port_unicast_rcv_packets = cpu_to_be64(pma.n_unicast_rcv | ||
1691 | - ibp->z_unicast_rcv); | ||
1692 | p->port_multicast_xmit_packets = cpu_to_be64(pma.n_multicast_xmit | ||
1693 | - ibp->z_multicast_xmit); | ||
1694 | p->port_multicast_rcv_packets = cpu_to_be64(pma.n_multicast_rcv | ||
1695 | - ibp->z_multicast_rcv); | ||
1671 | 1696 | ||
1672 | bail: | 1697 | bail: |
1673 | return reply((struct ib_smp *) pmp); | 1698 | return reply((struct ib_smp *) pmp); |
@@ -1795,6 +1820,7 @@ static int pma_set_portcounters_ext(struct ib_pma_mad *pmp, | |||
1795 | struct qib_ibport *ibp = to_iport(ibdev, port); | 1820 | struct qib_ibport *ibp = to_iport(ibdev, port); |
1796 | struct qib_pportdata *ppd = ppd_from_ibp(ibp); | 1821 | struct qib_pportdata *ppd = ppd_from_ibp(ibp); |
1797 | u64 swords, rwords, spkts, rpkts, xwait; | 1822 | u64 swords, rwords, spkts, rpkts, xwait; |
1823 | struct qib_pma_counters pma; | ||
1798 | 1824 | ||
1799 | qib_snapshot_counters(ppd, &swords, &rwords, &spkts, &rpkts, &xwait); | 1825 | qib_snapshot_counters(ppd, &swords, &rwords, &spkts, &rpkts, &xwait); |
1800 | 1826 | ||
@@ -1810,17 +1836,19 @@ static int pma_set_portcounters_ext(struct ib_pma_mad *pmp, | |||
1810 | if (p->counter_select & IB_PMA_SELX_PORT_RCV_PACKETS) | 1836 | if (p->counter_select & IB_PMA_SELX_PORT_RCV_PACKETS) |
1811 | ibp->z_port_rcv_packets = rpkts; | 1837 | ibp->z_port_rcv_packets = rpkts; |
1812 | 1838 | ||
1839 | qib_snapshot_pmacounters(ibp, &pma); | ||
1840 | |||
1813 | if (p->counter_select & IB_PMA_SELX_PORT_UNI_XMIT_PACKETS) | 1841 | if (p->counter_select & IB_PMA_SELX_PORT_UNI_XMIT_PACKETS) |
1814 | ibp->n_unicast_xmit = 0; | 1842 | ibp->z_unicast_xmit = pma.n_unicast_xmit; |
1815 | 1843 | ||
1816 | if (p->counter_select & IB_PMA_SELX_PORT_UNI_RCV_PACKETS) | 1844 | if (p->counter_select & IB_PMA_SELX_PORT_UNI_RCV_PACKETS) |
1817 | ibp->n_unicast_rcv = 0; | 1845 | ibp->z_unicast_rcv = pma.n_unicast_rcv; |
1818 | 1846 | ||
1819 | if (p->counter_select & IB_PMA_SELX_PORT_MULTI_XMIT_PACKETS) | 1847 | if (p->counter_select & IB_PMA_SELX_PORT_MULTI_XMIT_PACKETS) |
1820 | ibp->n_multicast_xmit = 0; | 1848 | ibp->z_multicast_xmit = pma.n_multicast_xmit; |
1821 | 1849 | ||
1822 | if (p->counter_select & IB_PMA_SELX_PORT_MULTI_RCV_PACKETS) | 1850 | if (p->counter_select & IB_PMA_SELX_PORT_MULTI_RCV_PACKETS) |
1823 | ibp->n_multicast_rcv = 0; | 1851 | ibp->z_multicast_rcv = pma.n_multicast_rcv; |
1824 | 1852 | ||
1825 | return pma_get_portcounters_ext(pmp, ibdev, port); | 1853 | return pma_get_portcounters_ext(pmp, ibdev, port); |
1826 | } | 1854 | } |
diff --git a/drivers/infiniband/hw/qib/qib_rc.c b/drivers/infiniband/hw/qib/qib_rc.c index 3ab341320ead..2f2501890c4e 100644 --- a/drivers/infiniband/hw/qib/qib_rc.c +++ b/drivers/infiniband/hw/qib/qib_rc.c | |||
@@ -752,7 +752,7 @@ void qib_send_rc_ack(struct qib_qp *qp) | |||
752 | qib_flush_wc(); | 752 | qib_flush_wc(); |
753 | qib_sendbuf_done(dd, pbufn); | 753 | qib_sendbuf_done(dd, pbufn); |
754 | 754 | ||
755 | ibp->n_unicast_xmit++; | 755 | this_cpu_inc(ibp->pmastats->n_unicast_xmit); |
756 | goto done; | 756 | goto done; |
757 | 757 | ||
758 | queue_ack: | 758 | queue_ack: |
diff --git a/drivers/infiniband/hw/qib/qib_ruc.c b/drivers/infiniband/hw/qib/qib_ruc.c index 357b6cfcd46c..4c07a8b34ffe 100644 --- a/drivers/infiniband/hw/qib/qib_ruc.c +++ b/drivers/infiniband/hw/qib/qib_ruc.c | |||
@@ -703,6 +703,7 @@ void qib_make_ruc_header(struct qib_qp *qp, struct qib_other_headers *ohdr, | |||
703 | ohdr->bth[0] = cpu_to_be32(bth0); | 703 | ohdr->bth[0] = cpu_to_be32(bth0); |
704 | ohdr->bth[1] = cpu_to_be32(qp->remote_qpn); | 704 | ohdr->bth[1] = cpu_to_be32(qp->remote_qpn); |
705 | ohdr->bth[2] = cpu_to_be32(bth2); | 705 | ohdr->bth[2] = cpu_to_be32(bth2); |
706 | this_cpu_inc(ibp->pmastats->n_unicast_xmit); | ||
706 | } | 707 | } |
707 | 708 | ||
708 | /** | 709 | /** |
diff --git a/drivers/infiniband/hw/qib/qib_ud.c b/drivers/infiniband/hw/qib/qib_ud.c index 3ad651c3356c..aaf7039f8ed2 100644 --- a/drivers/infiniband/hw/qib/qib_ud.c +++ b/drivers/infiniband/hw/qib/qib_ud.c | |||
@@ -280,11 +280,11 @@ int qib_make_ud_req(struct qib_qp *qp) | |||
280 | ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; | 280 | ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; |
281 | if (ah_attr->dlid >= QIB_MULTICAST_LID_BASE) { | 281 | if (ah_attr->dlid >= QIB_MULTICAST_LID_BASE) { |
282 | if (ah_attr->dlid != QIB_PERMISSIVE_LID) | 282 | if (ah_attr->dlid != QIB_PERMISSIVE_LID) |
283 | ibp->n_multicast_xmit++; | 283 | this_cpu_inc(ibp->pmastats->n_multicast_xmit); |
284 | else | 284 | else |
285 | ibp->n_unicast_xmit++; | 285 | this_cpu_inc(ibp->pmastats->n_unicast_xmit); |
286 | } else { | 286 | } else { |
287 | ibp->n_unicast_xmit++; | 287 | this_cpu_inc(ibp->pmastats->n_unicast_xmit); |
288 | lid = ah_attr->dlid & ~((1 << ppd->lmc) - 1); | 288 | lid = ah_attr->dlid & ~((1 << ppd->lmc) - 1); |
289 | if (unlikely(lid == ppd->lid)) { | 289 | if (unlikely(lid == ppd->lid)) { |
290 | /* | 290 | /* |
diff --git a/drivers/infiniband/hw/qib/qib_verbs.c b/drivers/infiniband/hw/qib/qib_verbs.c index 092b0bb1bb78..1b00734fb80d 100644 --- a/drivers/infiniband/hw/qib/qib_verbs.c +++ b/drivers/infiniband/hw/qib/qib_verbs.c | |||
@@ -662,7 +662,7 @@ void qib_ib_rcv(struct qib_ctxtdata *rcd, void *rhdr, void *data, u32 tlen) | |||
662 | mcast = qib_mcast_find(ibp, &hdr->u.l.grh.dgid); | 662 | mcast = qib_mcast_find(ibp, &hdr->u.l.grh.dgid); |
663 | if (mcast == NULL) | 663 | if (mcast == NULL) |
664 | goto drop; | 664 | goto drop; |
665 | ibp->n_multicast_rcv++; | 665 | this_cpu_inc(ibp->pmastats->n_multicast_rcv); |
666 | list_for_each_entry_rcu(p, &mcast->qp_list, list) | 666 | list_for_each_entry_rcu(p, &mcast->qp_list, list) |
667 | qib_qp_rcv(rcd, hdr, 1, data, tlen, p->qp); | 667 | qib_qp_rcv(rcd, hdr, 1, data, tlen, p->qp); |
668 | /* | 668 | /* |
@@ -689,7 +689,7 @@ void qib_ib_rcv(struct qib_ctxtdata *rcd, void *rhdr, void *data, u32 tlen) | |||
689 | rcd->lookaside_qpn = qp_num; | 689 | rcd->lookaside_qpn = qp_num; |
690 | } else | 690 | } else |
691 | qp = rcd->lookaside_qp; | 691 | qp = rcd->lookaside_qp; |
692 | ibp->n_unicast_rcv++; | 692 | this_cpu_inc(ibp->pmastats->n_unicast_rcv); |
693 | qib_qp_rcv(rcd, hdr, lnh == QIB_LRH_GRH, data, tlen, qp); | 693 | qib_qp_rcv(rcd, hdr, lnh == QIB_LRH_GRH, data, tlen, qp); |
694 | } | 694 | } |
695 | return; | 695 | return; |
diff --git a/drivers/infiniband/hw/qib/qib_verbs.h b/drivers/infiniband/hw/qib/qib_verbs.h index a01c7d2cf541..bfc8948fdd35 100644 --- a/drivers/infiniband/hw/qib/qib_verbs.h +++ b/drivers/infiniband/hw/qib/qib_verbs.h | |||
@@ -664,6 +664,13 @@ struct qib_opcode_stats_perctx { | |||
664 | struct qib_opcode_stats stats[128]; | 664 | struct qib_opcode_stats stats[128]; |
665 | }; | 665 | }; |
666 | 666 | ||
667 | struct qib_pma_counters { | ||
668 | u64 n_unicast_xmit; /* total unicast packets sent */ | ||
669 | u64 n_unicast_rcv; /* total unicast packets received */ | ||
670 | u64 n_multicast_xmit; /* total multicast packets sent */ | ||
671 | u64 n_multicast_rcv; /* total multicast packets received */ | ||
672 | }; | ||
673 | |||
667 | struct qib_ibport { | 674 | struct qib_ibport { |
668 | struct qib_qp __rcu *qp0; | 675 | struct qib_qp __rcu *qp0; |
669 | struct qib_qp __rcu *qp1; | 676 | struct qib_qp __rcu *qp1; |
@@ -680,10 +687,11 @@ struct qib_ibport { | |||
680 | __be64 mkey; | 687 | __be64 mkey; |
681 | __be64 guids[QIB_GUIDS_PER_PORT - 1]; /* writable GUIDs */ | 688 | __be64 guids[QIB_GUIDS_PER_PORT - 1]; /* writable GUIDs */ |
682 | u64 tid; /* TID for traps */ | 689 | u64 tid; /* TID for traps */ |
683 | u64 n_unicast_xmit; /* total unicast packets sent */ | 690 | struct qib_pma_counters __percpu *pmastats; |
684 | u64 n_unicast_rcv; /* total unicast packets received */ | 691 | u64 z_unicast_xmit; /* starting count for PMA */ |
685 | u64 n_multicast_xmit; /* total multicast packets sent */ | 692 | u64 z_unicast_rcv; /* starting count for PMA */ |
686 | u64 n_multicast_rcv; /* total multicast packets received */ | 693 | u64 z_multicast_xmit; /* starting count for PMA */ |
694 | u64 z_multicast_rcv; /* starting count for PMA */ | ||
687 | u64 z_symbol_error_counter; /* starting count for PMA */ | 695 | u64 z_symbol_error_counter; /* starting count for PMA */ |
688 | u64 z_link_error_recovery_counter; /* starting count for PMA */ | 696 | u64 z_link_error_recovery_counter; /* starting count for PMA */ |
689 | u64 z_link_downed_counter; /* starting count for PMA */ | 697 | u64 z_link_downed_counter; /* starting count for PMA */ |