aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Wise <swise@opengridcomputing.com>2008-07-15 02:48:48 -0400
committerRoland Dreier <rolandd@cisco.com>2008-07-15 02:48:48 -0400
commit14cc180f7b032f8484c1a3d0533b1129ffe307fd (patch)
tree0f544f596e00955f56cb38051c5e2ce3c40c0b40
parent7f624d023b5fb150831e02c1e4c0f2619ade72c2 (diff)
RDMA/cxgb3: Add support for protocol statistics
- Add a new rdma ctl command called RDMA_GET_MIB to the cxgb3 low level driver to obtain the protocol mib from the rnic hardware. - Add new iw_cxgb3 provider method to get the MIB from the low level driver. Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_provider.c62
-rw-r--r--drivers/net/cxgb3/cxgb3_ctl_defs.h1
-rw-r--r--drivers/net/cxgb3/cxgb3_offload.c7
3 files changed, 66 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index 5f4380657392..18a6609f5e01 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -56,6 +56,7 @@
56#include "iwch_provider.h" 56#include "iwch_provider.h"
57#include "iwch_cm.h" 57#include "iwch_cm.h"
58#include "iwch_user.h" 58#include "iwch_user.h"
59#include "common.h"
59 60
60static int iwch_modify_port(struct ib_device *ibdev, 61static int iwch_modify_port(struct ib_device *ibdev,
61 u8 port, int port_modify_mask, 62 u8 port, int port_modify_mask,
@@ -1245,6 +1246,61 @@ static ssize_t show_board(struct device *dev, struct device_attribute *attr,
1245 iwch_dev->rdev.rnic_info.pdev->device); 1246 iwch_dev->rdev.rnic_info.pdev->device);
1246} 1247}
1247 1248
1249static int iwch_get_mib(struct ib_device *ibdev,
1250 union rdma_protocol_stats *stats)
1251{
1252 struct iwch_dev *dev;
1253 struct tp_mib_stats m;
1254 int ret;
1255
1256 PDBG("%s ibdev %p\n", __func__, ibdev);
1257 dev = to_iwch_dev(ibdev);
1258 ret = dev->rdev.t3cdev_p->ctl(dev->rdev.t3cdev_p, RDMA_GET_MIB, &m);
1259 if (ret)
1260 return -ENOSYS;
1261
1262 memset(stats, 0, sizeof *stats);
1263 stats->iw.ipInReceives = ((u64) m.ipInReceive_hi << 32) +
1264 m.ipInReceive_lo;
1265 stats->iw.ipInHdrErrors = ((u64) m.ipInHdrErrors_hi << 32) +
1266 m.ipInHdrErrors_lo;
1267 stats->iw.ipInAddrErrors = ((u64) m.ipInAddrErrors_hi << 32) +
1268 m.ipInAddrErrors_lo;
1269 stats->iw.ipInUnknownProtos = ((u64) m.ipInUnknownProtos_hi << 32) +
1270 m.ipInUnknownProtos_lo;
1271 stats->iw.ipInDiscards = ((u64) m.ipInDiscards_hi << 32) +
1272 m.ipInDiscards_lo;
1273 stats->iw.ipInDelivers = ((u64) m.ipInDelivers_hi << 32) +
1274 m.ipInDelivers_lo;
1275 stats->iw.ipOutRequests = ((u64) m.ipOutRequests_hi << 32) +
1276 m.ipOutRequests_lo;
1277 stats->iw.ipOutDiscards = ((u64) m.ipOutDiscards_hi << 32) +
1278 m.ipOutDiscards_lo;
1279 stats->iw.ipOutNoRoutes = ((u64) m.ipOutNoRoutes_hi << 32) +
1280 m.ipOutNoRoutes_lo;
1281 stats->iw.ipReasmTimeout = (u64) m.ipReasmTimeout;
1282 stats->iw.ipReasmReqds = (u64) m.ipReasmReqds;
1283 stats->iw.ipReasmOKs = (u64) m.ipReasmOKs;
1284 stats->iw.ipReasmFails = (u64) m.ipReasmFails;
1285 stats->iw.tcpActiveOpens = (u64) m.tcpActiveOpens;
1286 stats->iw.tcpPassiveOpens = (u64) m.tcpPassiveOpens;
1287 stats->iw.tcpAttemptFails = (u64) m.tcpAttemptFails;
1288 stats->iw.tcpEstabResets = (u64) m.tcpEstabResets;
1289 stats->iw.tcpOutRsts = (u64) m.tcpOutRsts;
1290 stats->iw.tcpCurrEstab = (u64) m.tcpCurrEstab;
1291 stats->iw.tcpInSegs = ((u64) m.tcpInSegs_hi << 32) +
1292 m.tcpInSegs_lo;
1293 stats->iw.tcpOutSegs = ((u64) m.tcpOutSegs_hi << 32) +
1294 m.tcpOutSegs_lo;
1295 stats->iw.tcpRetransSegs = ((u64) m.tcpRetransSeg_hi << 32) +
1296 m.tcpRetransSeg_lo;
1297 stats->iw.tcpInErrs = ((u64) m.tcpInErrs_hi << 32) +
1298 m.tcpInErrs_lo;
1299 stats->iw.tcpRtoMin = (u64) m.tcpRtoMin;
1300 stats->iw.tcpRtoMax = (u64) m.tcpRtoMax;
1301 return 0;
1302}
1303
1248static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL); 1304static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
1249static DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL); 1305static DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
1250static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL); 1306static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
@@ -1254,7 +1310,7 @@ static struct device_attribute *iwch_class_attributes[] = {
1254 &dev_attr_hw_rev, 1310 &dev_attr_hw_rev,
1255 &dev_attr_fw_ver, 1311 &dev_attr_fw_ver,
1256 &dev_attr_hca_type, 1312 &dev_attr_hca_type,
1257 &dev_attr_board_id 1313 &dev_attr_board_id,
1258}; 1314};
1259 1315
1260int iwch_register_device(struct iwch_dev *dev) 1316int iwch_register_device(struct iwch_dev *dev)
@@ -1325,15 +1381,13 @@ int iwch_register_device(struct iwch_dev *dev)
1325 dev->ibdev.alloc_fast_reg_mr = iwch_alloc_fast_reg_mr; 1381 dev->ibdev.alloc_fast_reg_mr = iwch_alloc_fast_reg_mr;
1326 dev->ibdev.alloc_fast_reg_page_list = iwch_alloc_fastreg_pbl; 1382 dev->ibdev.alloc_fast_reg_page_list = iwch_alloc_fastreg_pbl;
1327 dev->ibdev.free_fast_reg_page_list = iwch_free_fastreg_pbl; 1383 dev->ibdev.free_fast_reg_page_list = iwch_free_fastreg_pbl;
1328
1329 dev->ibdev.attach_mcast = iwch_multicast_attach; 1384 dev->ibdev.attach_mcast = iwch_multicast_attach;
1330 dev->ibdev.detach_mcast = iwch_multicast_detach; 1385 dev->ibdev.detach_mcast = iwch_multicast_detach;
1331 dev->ibdev.process_mad = iwch_process_mad; 1386 dev->ibdev.process_mad = iwch_process_mad;
1332
1333 dev->ibdev.req_notify_cq = iwch_arm_cq; 1387 dev->ibdev.req_notify_cq = iwch_arm_cq;
1334 dev->ibdev.post_send = iwch_post_send; 1388 dev->ibdev.post_send = iwch_post_send;
1335 dev->ibdev.post_recv = iwch_post_receive; 1389 dev->ibdev.post_recv = iwch_post_receive;
1336 1390 dev->ibdev.get_protocol_stats = iwch_get_mib;
1337 1391
1338 dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL); 1392 dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL);
1339 if (!dev->ibdev.iwcm) 1393 if (!dev->ibdev.iwcm)
diff --git a/drivers/net/cxgb3/cxgb3_ctl_defs.h b/drivers/net/cxgb3/cxgb3_ctl_defs.h
index 6c4f32066919..ed0ecd9679cb 100644
--- a/drivers/net/cxgb3/cxgb3_ctl_defs.h
+++ b/drivers/net/cxgb3/cxgb3_ctl_defs.h
@@ -54,6 +54,7 @@ enum {
54 RDMA_CQ_DISABLE = 16, 54 RDMA_CQ_DISABLE = 16,
55 RDMA_CTRL_QP_SETUP = 17, 55 RDMA_CTRL_QP_SETUP = 17,
56 RDMA_GET_MEM = 18, 56 RDMA_GET_MEM = 18,
57 RDMA_GET_MIB = 19,
57 58
58 GET_RX_PAGE_INFO = 50, 59 GET_RX_PAGE_INFO = 50,
59}; 60};
diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c
index ff9c013ce535..cf2696873796 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)
303 spin_unlock_irq(&adapter->sge.reg_lock); 303 spin_unlock_irq(&adapter->sge.reg_lock);
304 break; 304 break;
305 } 305 }
306 case RDMA_GET_MIB: {
307 spin_lock(&adapter->stats_lock);
308 t3_tp_get_mib_stats(adapter, (struct tp_mib_stats *)data);
309 spin_unlock(&adapter->stats_lock);
310 break;
311 }
306 default: 312 default:
307 ret = -EOPNOTSUPP; 313 ret = -EOPNOTSUPP;
308 } 314 }
@@ -381,6 +387,7 @@ static int cxgb_offload_ctl(struct t3cdev *tdev, unsigned int req, void *data)
381 case RDMA_CQ_DISABLE: 387 case RDMA_CQ_DISABLE:
382 case RDMA_CTRL_QP_SETUP: 388 case RDMA_CTRL_QP_SETUP:
383 case RDMA_GET_MEM: 389 case RDMA_GET_MEM:
390 case RDMA_GET_MIB:
384 if (!offload_running(adapter)) 391 if (!offload_running(adapter))
385 return -EAGAIN; 392 return -EAGAIN;
386 return cxgb_rdma_ctl(adapter, req, data); 393 return cxgb_rdma_ctl(adapter, req, data);