aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Apfelbaum <marcela@dev.mellanox.co.il>2011-10-03 12:04:20 -0400
committerRoland Dreier <roland@purestorage.com>2011-10-28 14:36:16 -0400
commita5e12dff757b562bbecd6a2359fdc4c43d4d97de (patch)
tree1a0a922fec52b6169a449949cd0483e46e138271
parent97285b78174423e5576b2e06aa45f64df009da5b (diff)
IB/mlx4: Configure extended active speeds
Set the extended active speeds based on the hardware configuration. Signed-off-by: Marcel Apfelbaum <marcela@dev.mellanox.co.il> Reviewed-by: Hal Rosenstock <hal@mellanox.com> [ Move FDR-10 handling into ib_link_query_port(). - Roland ] Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/mlx4/main.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index fa643f4f4e28..4e5b654e6375 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -181,8 +181,12 @@ mlx4_ib_port_link_layer(struct ib_device *device, u8 port_num)
181 181
182static int ib_link_query_port(struct ib_device *ibdev, u8 port, 182static int ib_link_query_port(struct ib_device *ibdev, u8 port,
183 struct ib_port_attr *props, 183 struct ib_port_attr *props,
184 struct ib_smp *in_mad,
184 struct ib_smp *out_mad) 185 struct ib_smp *out_mad)
185{ 186{
187 int ext_active_speed;
188 int err;
189
186 props->lid = be16_to_cpup((__be16 *) (out_mad->data + 16)); 190 props->lid = be16_to_cpup((__be16 *) (out_mad->data + 16));
187 props->lmc = out_mad->data[34] & 0x7; 191 props->lmc = out_mad->data[34] & 0x7;
188 props->sm_lid = be16_to_cpup((__be16 *) (out_mad->data + 18)); 192 props->sm_lid = be16_to_cpup((__be16 *) (out_mad->data + 18));
@@ -203,6 +207,39 @@ static int ib_link_query_port(struct ib_device *ibdev, u8 port,
203 props->max_vl_num = out_mad->data[37] >> 4; 207 props->max_vl_num = out_mad->data[37] >> 4;
204 props->init_type_reply = out_mad->data[41] >> 4; 208 props->init_type_reply = out_mad->data[41] >> 4;
205 209
210 /* Check if extended speeds (EDR/FDR/...) are supported */
211 if (props->port_cap_flags & IB_PORT_EXTENDED_SPEEDS_SUP) {
212 ext_active_speed = out_mad->data[62] >> 4;
213
214 switch (ext_active_speed) {
215 case 1:
216 props->active_speed = 16; /* FDR */
217 break;
218 case 2:
219 props->active_speed = 32; /* EDR */
220 break;
221 }
222 }
223
224 /* If reported active speed is QDR, check if is FDR-10 */
225 if (props->active_speed == 4) {
226 if (to_mdev(ibdev)->dev->caps.ext_port_cap[port] &
227 MLX_EXT_PORT_CAP_FLAG_EXTENDED_PORT_INFO) {
228 init_query_mad(in_mad);
229 in_mad->attr_id = MLX4_ATTR_EXTENDED_PORT_INFO;
230 in_mad->attr_mod = cpu_to_be32(port);
231
232 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port,
233 NULL, NULL, in_mad, out_mad);
234 if (err)
235 return err;
236
237 /* Checking LinkSpeedActive for FDR-10 */
238 if (out_mad->data[15] & 0x1)
239 props->active_speed = 8;
240 }
241 }
242
206 return 0; 243 return 0;
207} 244}
208 245
@@ -274,7 +311,7 @@ static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
274 goto out; 311 goto out;
275 312
276 err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ? 313 err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ?
277 ib_link_query_port(ibdev, port, props, out_mad) : 314 ib_link_query_port(ibdev, port, props, in_mad, out_mad) :
278 eth_link_query_port(ibdev, port, props, out_mad); 315 eth_link_query_port(ibdev, port, props, out_mad);
279 316
280out: 317out: