diff options
author | Naresh Gottumukkala <bgottumukkala@emulex.com> | 2013-08-26 05:57:47 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-09-03 00:18:43 -0400 |
commit | f24ceba6b6454f68f456981be2a337b6390d9aa0 (patch) | |
tree | 407cde51972f472b02dc819da930ee7785c381a3 /drivers/infiniband | |
parent | c43e9ab84d853f499a2fd531362973c8e505b342 (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.c | 28 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.h | 1 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 27 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 43 |
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 | ||
1104 | int 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 | |||
1127 | mbx_err: | ||
1128 | kfree(cmd); | ||
1129 | return status; | ||
1130 | } | ||
1131 | |||
1104 | int ocrdma_mbx_alloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd) | 1132 | int 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 */ |
94 | int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed); | ||
94 | int ocrdma_query_config(struct ocrdma_dev *, | 95 | int ocrdma_query_config(struct ocrdma_dev *, |
95 | struct ocrdma_mbx_query_config *config); | 96 | struct ocrdma_mbx_query_config *config); |
96 | int ocrdma_resolve_dgid(struct ocrdma_dev *, union ib_gid *dgid, u8 *mac_addr); | 97 | int 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 |
72 | enum { | 72 | enum { |
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 | ||
549 | struct 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 | |||
563 | enum { | ||
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 | |||
548 | enum { | 575 | enum { |
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 | ||
109 | static 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 | |||
109 | int ocrdma_query_port(struct ib_device *ibdev, | 148 | int 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; |