- Add a new rdma ctl command called RDMA_GET_MIB to the low level driver
to obtain the protocol mib from the hardware.

- Add a sysfs entry to allow dumping these stats.

Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
---

 drivers/infiniband/hw/cxgb3/iwch_provider.c |   56 +++++++++++++++++++++++++++
 drivers/net/cxgb3/cxgb3_ctl_defs.h          |   48 +++++++++++++++++++++++
 drivers/net/cxgb3/cxgb3_offload.c           |    7 +++
 3 files changed, 110 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c 
b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index 480a2da..f71a103 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -1192,17 +1192,71 @@ static ssize_t show_board(struct device *dev, struct 
device_attribute *attr,
        return sprintf(buf, "%x.%x\n", iwch_dev->rdev.rnic_info.pdev->vendor,
                       iwch_dev->rdev.rnic_info.pdev->device);
 }
+static ssize_t show_stats(struct device *dev, struct device_attribute *attr,
+                         char *buf)
+{
+       struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev,
+                                                ibdev.dev);
+       struct rdma_mib_stats m;
+       int ret;
+       ssize_t len = 0;
+
+       PDBG("%s dev 0x%p\n", __func__, dev);
+       ret = iwch_dev->rdev.t3cdev_p->ctl(iwch_dev->rdev.t3cdev_p, 
+                                          RDMA_GET_MIB, &m);
+       if (ret)
+               return sprintf(buf, "Not Available\n");
+
+#define MIB32(s, field) len += sprintf(buf + len, "%-18s %u\n", s, m.field)
+#define MIB64(s, hi, lo) \
+       len += sprintf(buf + len, "%-18s %llu\n", s, \
+                      (unsigned long long)m.hi + m.lo)
+
+       MIB64("IPInReceives:", ipInReceive_hi, ipInReceive_lo);
+       MIB64("IPInHdrErrors:", ipInHdrErrors_hi, ipInHdrErrors_lo);
+       MIB64("IPInAddrErrors:", ipInAddrErrors_hi, ipInAddrErrors_lo);
+       MIB64("IPInUnknownProtos:", ipInUnknownProtos_hi,
+             ipInUnknownProtos_lo);
+       MIB64("IPInDiscards:", ipInDiscards_hi, ipInDiscards_lo);
+       MIB64("IPInDelivers:", ipInDelivers_hi, ipInDelivers_lo);
+       MIB64("IPOutRequests:", ipOutRequests_hi, ipOutRequests_lo);
+       MIB64("IPOutDiscards:", ipOutDiscards_hi, ipOutDiscards_lo);
+       MIB64("IPOutNoRoutes:", ipOutNoRoutes_hi, ipOutNoRoutes_lo);
+       MIB32("IPReasmTimeout:", ipReasmTimeout);
+       MIB32("IPReasmReqds:", ipReasmReqds);
+       MIB32("IPReasmOKs:", ipReasmOKs);
+       MIB32("IPReasmFails:", ipReasmFails);
+       MIB32("TCPActiveOpens:", tcpActiveOpens);
+       MIB32("TCPPassiveOpens:", tcpPassiveOpens);
+       MIB32("TCPAttemptFails:", tcpAttemptFails);
+       MIB32("TCPEstabResets:", tcpEstabResets);
+       MIB32("TCPOutRsts:", tcpOutRsts);
+       MIB32("TCPCurrEstab:", tcpCurrEstab);
+       MIB64("TCPInSegs:", tcpInSegs_hi, tcpInSegs_lo);
+       MIB64("TCPOutSegs:", tcpOutSegs_hi, tcpOutSegs_lo);
+       MIB64("TCPRetransSeg:", tcpRetransSeg_hi, tcpRetransSeg_lo);
+       MIB64("TCPInErrs:", tcpInErrs_hi, tcpInErrs_lo);
+       MIB32("TCPRtoMin:", tcpRtoMin);
+       MIB32("TCPRtoMax:", tcpRtoMax);
+
+#undef MIB32
+#undef MIB64
+
+       return len;
+}
 
 static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
 static DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
 static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
 static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
+static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
 
 static struct device_attribute *iwch_class_attributes[] = {
        &dev_attr_hw_rev,
        &dev_attr_fw_ver,
        &dev_attr_hca_type,
-       &dev_attr_board_id
+       &dev_attr_board_id,
+       &dev_attr_stats
 };
 
 int iwch_register_device(struct iwch_dev *dev)
diff --git a/drivers/net/cxgb3/cxgb3_ctl_defs.h 
b/drivers/net/cxgb3/cxgb3_ctl_defs.h
index 6c4f320..2dffc2e 100644
--- a/drivers/net/cxgb3/cxgb3_ctl_defs.h
+++ b/drivers/net/cxgb3/cxgb3_ctl_defs.h
@@ -54,6 +54,7 @@ enum {
        RDMA_CQ_DISABLE         = 16,
        RDMA_CTRL_QP_SETUP      = 17,
        RDMA_GET_MEM            = 18,
+       RDMA_GET_MIB            = 19,
 
        GET_RX_PAGE_INFO        = 50,
 };
@@ -171,4 +172,51 @@ struct ofld_page_info {
        unsigned int page_size;  /* Page size, should be a power of 2 */
        unsigned int num;        /* Number of pages */
 };
+
+/*
+ * Offload RDMA protocol stats.
+ */
+struct rdma_mib_stats {
+       u32 ipInReceive_hi;
+       u32 ipInReceive_lo;
+       u32 ipInHdrErrors_hi;
+       u32 ipInHdrErrors_lo;
+       u32 ipInAddrErrors_hi;
+       u32 ipInAddrErrors_lo;
+       u32 ipInUnknownProtos_hi;
+       u32 ipInUnknownProtos_lo;
+       u32 ipInDiscards_hi;
+       u32 ipInDiscards_lo;
+       u32 ipInDelivers_hi;
+       u32 ipInDelivers_lo;
+       u32 ipOutRequests_hi;
+       u32 ipOutRequests_lo;
+       u32 ipOutDiscards_hi;
+       u32 ipOutDiscards_lo;
+       u32 ipOutNoRoutes_hi;
+       u32 ipOutNoRoutes_lo;
+       u32 ipReasmTimeout;
+       u32 ipReasmReqds;
+       u32 ipReasmOKs;
+       u32 ipReasmFails;
+
+       u32 reserved[8];
+
+       u32 tcpActiveOpens;
+       u32 tcpPassiveOpens;
+       u32 tcpAttemptFails;
+       u32 tcpEstabResets;
+       u32 tcpOutRsts;
+       u32 tcpCurrEstab;
+       u32 tcpInSegs_hi;
+       u32 tcpInSegs_lo;
+       u32 tcpOutSegs_hi;
+       u32 tcpOutSegs_lo;
+       u32 tcpRetransSeg_hi;
+       u32 tcpRetransSeg_lo;
+       u32 tcpInErrs_hi;
+       u32 tcpInErrs_lo;
+       u32 tcpRtoMin;
+       u32 tcpRtoMax;
+};
 #endif                         /* _CXGB3_OFFLOAD_CTL_DEFS_H */
diff --git a/drivers/net/cxgb3/cxgb3_offload.c 
b/drivers/net/cxgb3/cxgb3_offload.c
index ff9c013..1884238 100644
--- a/drivers/net/cxgb3/cxgb3_offload.c
+++ b/drivers/net/cxgb3/cxgb3_offload.c
@@ -303,6 +303,12 @@ static int cxgb_rdma_ctl(struct adapter *adapter, unsigned 
int req, void *data)
                spin_unlock_irq(&adapter->sge.reg_lock);
                break;
        }
+       case RDMA_GET_MIB: {
+               spin_lock(&adapter->stats_lock);
+               t3_tp_get_mib_stats(adapter, (struct rdma_mib_stats *)data);
+               spin_unlock(&adapter->stats_lock);
+               break;
+       }
        default:
                ret = -EOPNOTSUPP;
        }
@@ -381,6 +387,7 @@ static int cxgb_offload_ctl(struct t3cdev *tdev, unsigned 
int req, void *data)
        case RDMA_CQ_DISABLE:
        case RDMA_CTRL_QP_SETUP:
        case RDMA_GET_MEM:
+       case RDMA_GET_MIB:
                if (!offload_running(adapter))
                        return -EAGAIN;
                return cxgb_rdma_ctl(adapter, req, data);
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to