aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorNaresh Gottumukkala <bgottumukkala@emulex.com>2013-08-26 05:57:47 -0400
committerRoland Dreier <roland@purestorage.com>2013-09-03 00:18:43 -0400
commitf24ceba6b6454f68f456981be2a337b6390d9aa0 (patch)
tree407cde51972f472b02dc819da930ee7785c381a3 /drivers/infiniband
parentc43e9ab84d853f499a2fd531362973c8e505b342 (diff)
RDMA/ocrdma: Fix for displaying proper link speed
Signed-off-by: Naresh Gottumukkala <bgottumukkala@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c28
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.h1
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_sli.h27
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c43
4 files changed, 97 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index 3f027552a1a1..ea3d7237596a 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -1101,6 +1101,34 @@ mbx_err:
1101 return status; 1101 return status;
1102} 1102}
1103 1103
1104int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed)
1105{
1106 int status = -ENOMEM;
1107 struct ocrdma_get_link_speed_rsp *rsp;
1108 struct ocrdma_mqe *cmd;
1109
1110 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_NTWK_LINK_CONFIG_V1,
1111 sizeof(*cmd));
1112 if (!cmd)
1113 return status;
1114 ocrdma_init_mch((struct ocrdma_mbx_hdr *)&cmd->u.cmd[0],
1115 OCRDMA_CMD_QUERY_NTWK_LINK_CONFIG_V1,
1116 OCRDMA_SUBSYS_COMMON, sizeof(*cmd));
1117
1118 ((struct ocrdma_mbx_hdr *)cmd->u.cmd)->rsvd_version = 0x1;
1119
1120 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
1121 if (status)
1122 goto mbx_err;
1123
1124 rsp = (struct ocrdma_get_link_speed_rsp *)cmd;
1125 *lnk_speed = rsp->phys_port_speed;
1126
1127mbx_err:
1128 kfree(cmd);
1129 return status;
1130}
1131
1104int ocrdma_mbx_alloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd) 1132int ocrdma_mbx_alloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd)
1105{ 1133{
1106 int status = -ENOMEM; 1134 int status = -ENOMEM;
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.h b/drivers/infiniband/hw/ocrdma/ocrdma_hw.h
index 044db74e780a..f2a89d4cc7c4 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.h
@@ -91,6 +91,7 @@ void ocrdma_ring_cq_db(struct ocrdma_dev *, u16 cq_id, bool armed,
91 bool solicited, u16 cqe_popped); 91 bool solicited, u16 cqe_popped);
92 92
93/* verbs specific mailbox commands */ 93/* verbs specific mailbox commands */
94int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed);
94int ocrdma_query_config(struct ocrdma_dev *, 95int ocrdma_query_config(struct ocrdma_dev *,
95 struct ocrdma_mbx_query_config *config); 96 struct ocrdma_mbx_query_config *config);
96int ocrdma_resolve_dgid(struct ocrdma_dev *, union ib_gid *dgid, u8 *mac_addr); 97int ocrdma_resolve_dgid(struct ocrdma_dev *, union ib_gid *dgid, u8 *mac_addr);
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
index 35c61080ae1e..9e975d888449 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
@@ -70,6 +70,7 @@ enum {
70 70
71#define OCRDMA_SUBSYS_COMMON 1 71#define OCRDMA_SUBSYS_COMMON 1
72enum { 72enum {
73 OCRDMA_CMD_QUERY_NTWK_LINK_CONFIG_V1 = 5,
73 OCRDMA_CMD_CREATE_CQ = 12, 74 OCRDMA_CMD_CREATE_CQ = 12,
74 OCRDMA_CMD_CREATE_EQ = 13, 75 OCRDMA_CMD_CREATE_EQ = 13,
75 OCRDMA_CMD_CREATE_MQ = 21, 76 OCRDMA_CMD_CREATE_MQ = 21,
@@ -545,6 +546,32 @@ enum {
545 OCRDMA_FN_MODE_RDMA = 0x4 546 OCRDMA_FN_MODE_RDMA = 0x4
546}; 547};
547 548
549struct ocrdma_get_link_speed_rsp {
550 struct ocrdma_mqe_hdr hdr;
551 struct ocrdma_mbx_rsp rsp;
552
553 u8 pt_port_num;
554 u8 link_duplex;
555 u8 phys_port_speed;
556 u8 phys_port_fault;
557 u16 rsvd1;
558 u16 qos_lnk_speed;
559 u8 logical_lnk_status;
560 u8 rsvd2[3];
561};
562
563enum {
564 OCRDMA_PHYS_LINK_SPEED_ZERO = 0x0,
565 OCRDMA_PHYS_LINK_SPEED_10MBPS = 0x1,
566 OCRDMA_PHYS_LINK_SPEED_100MBPS = 0x2,
567 OCRDMA_PHYS_LINK_SPEED_1GBPS = 0x3,
568 OCRDMA_PHYS_LINK_SPEED_10GBPS = 0x4,
569 OCRDMA_PHYS_LINK_SPEED_20GBPS = 0x5,
570 OCRDMA_PHYS_LINK_SPEED_25GBPS = 0x6,
571 OCRDMA_PHYS_LINK_SPEED_40GBPS = 0x7,
572 OCRDMA_PHYS_LINK_SPEED_100GBPS = 0x8
573};
574
548enum { 575enum {
549 OCRDMA_CREATE_CQ_VER2 = 2, 576 OCRDMA_CREATE_CQ_VER2 = 2,
550 OCRDMA_CREATE_CQ_VER3 = 3, 577 OCRDMA_CREATE_CQ_VER3 = 3,
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index e934073e7052..f09a9403b600 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@ -106,6 +106,45 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr)
106 return 0; 106 return 0;
107} 107}
108 108
109static inline void get_link_speed_and_width(struct ocrdma_dev *dev,
110 u8 *ib_speed, u8 *ib_width)
111{
112 int status;
113 u8 speed;
114
115 status = ocrdma_mbx_get_link_speed(dev, &speed);
116 if (status)
117 speed = OCRDMA_PHYS_LINK_SPEED_ZERO;
118
119 switch (speed) {
120 case OCRDMA_PHYS_LINK_SPEED_1GBPS:
121 *ib_speed = IB_SPEED_SDR;
122 *ib_width = IB_WIDTH_1X;
123 break;
124
125 case OCRDMA_PHYS_LINK_SPEED_10GBPS:
126 *ib_speed = IB_SPEED_QDR;
127 *ib_width = IB_WIDTH_1X;
128 break;
129
130 case OCRDMA_PHYS_LINK_SPEED_20GBPS:
131 *ib_speed = IB_SPEED_DDR;
132 *ib_width = IB_WIDTH_4X;
133 break;
134
135 case OCRDMA_PHYS_LINK_SPEED_40GBPS:
136 *ib_speed = IB_SPEED_QDR;
137 *ib_width = IB_WIDTH_4X;
138 break;
139
140 default:
141 /* Unsupported */
142 *ib_speed = IB_SPEED_SDR;
143 *ib_width = IB_WIDTH_1X;
144 };
145}
146
147
109int ocrdma_query_port(struct ib_device *ibdev, 148int ocrdma_query_port(struct ib_device *ibdev,
110 u8 port, struct ib_port_attr *props) 149 u8 port, struct ib_port_attr *props)
111{ 150{
@@ -142,8 +181,8 @@ int ocrdma_query_port(struct ib_device *ibdev,
142 props->pkey_tbl_len = 1; 181 props->pkey_tbl_len = 1;
143 props->bad_pkey_cntr = 0; 182 props->bad_pkey_cntr = 0;
144 props->qkey_viol_cntr = 0; 183 props->qkey_viol_cntr = 0;
145 props->active_width = IB_WIDTH_1X; 184 get_link_speed_and_width(dev, &props->active_speed,
146 props->active_speed = 4; 185 &props->active_width);
147 props->max_msg_sz = 0x80000000; 186 props->max_msg_sz = 0x80000000;
148 props->max_vl_num = 4; 187 props->max_vl_num = 4;
149 return 0; 188 return 0;