Skip to content

Commit bb62f79

Browse files
committed
Merge branch 'mlx5-next'
Or Gerlitz says: ==================== mlx5: Add Interface Step Sequence ID support ISSI (Interface Step Sequence ID) defines the step sequence ID of the interface between the driver to the firmware and is incremented by steps of one. ISSI is used to enable deprecating/modifying features, command interfaces and such, while maintaining compatibility. As the driver serves both ConnectIB (CIB) and ConnectX4, we carefully made sure that the IB functionality keeps running also on older CIB firmware releases that don't support ISSI. The Ethernet functionailty is available only on ConnectX4 where all firmware releases support the feature since the very basic ISSI level. So at this point no need for compatility code there. As done prior to this series, when the Ethernet functionlity is enabled, during the initialization flow, the core driver performs a query of the supported ISSIs using the QUERY_ISSI command, and then, if ISSI is supported, sets the actual issi value informing the firmware on which ISSI level to run, using SET_ISSI command. Previously, the IB driver wasn't ready to work on that mode, and hence building both the IB driver and the Ethernet functionality in the core driver were disallowed by Kconfigs, with this series, we allow users to enable them both. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 6a0d7a0 + 4aa17b2 commit bb62f79

File tree

24 files changed

+1800
-337
lines changed

24 files changed

+1800
-337
lines changed

drivers/infiniband/hw/mlx5/mad.c

Lines changed: 297 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,300 @@ int mlx5_query_ext_port_caps(struct mlx5_ib_dev *dev, u8 port)
137137
kfree(out_mad);
138138
return err;
139139
}
140+
141+
int mlx5_query_mad_ifc_smp_attr_node_info(struct ib_device *ibdev,
142+
struct ib_smp *out_mad)
143+
{
144+
struct ib_smp *in_mad = NULL;
145+
int err = -ENOMEM;
146+
147+
in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL);
148+
if (!in_mad)
149+
return -ENOMEM;
150+
151+
init_query_mad(in_mad);
152+
in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
153+
154+
err = mlx5_MAD_IFC(to_mdev(ibdev), 1, 1, 1, NULL, NULL, in_mad,
155+
out_mad);
156+
157+
kfree(in_mad);
158+
return err;
159+
}
160+
161+
int mlx5_query_mad_ifc_system_image_guid(struct ib_device *ibdev,
162+
__be64 *sys_image_guid)
163+
{
164+
struct ib_smp *out_mad = NULL;
165+
int err = -ENOMEM;
166+
167+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
168+
if (!out_mad)
169+
return -ENOMEM;
170+
171+
err = mlx5_query_mad_ifc_smp_attr_node_info(ibdev, out_mad);
172+
if (err)
173+
goto out;
174+
175+
memcpy(sys_image_guid, out_mad->data + 4, 8);
176+
177+
out:
178+
kfree(out_mad);
179+
180+
return err;
181+
}
182+
183+
int mlx5_query_mad_ifc_max_pkeys(struct ib_device *ibdev,
184+
u16 *max_pkeys)
185+
{
186+
struct ib_smp *out_mad = NULL;
187+
int err = -ENOMEM;
188+
189+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
190+
if (!out_mad)
191+
return -ENOMEM;
192+
193+
err = mlx5_query_mad_ifc_smp_attr_node_info(ibdev, out_mad);
194+
if (err)
195+
goto out;
196+
197+
*max_pkeys = be16_to_cpup((__be16 *)(out_mad->data + 28));
198+
199+
out:
200+
kfree(out_mad);
201+
202+
return err;
203+
}
204+
205+
int mlx5_query_mad_ifc_vendor_id(struct ib_device *ibdev,
206+
u32 *vendor_id)
207+
{
208+
struct ib_smp *out_mad = NULL;
209+
int err = -ENOMEM;
210+
211+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
212+
if (!out_mad)
213+
return -ENOMEM;
214+
215+
err = mlx5_query_mad_ifc_smp_attr_node_info(ibdev, out_mad);
216+
if (err)
217+
goto out;
218+
219+
*vendor_id = be32_to_cpup((__be32 *)(out_mad->data + 36)) & 0xffff;
220+
221+
out:
222+
kfree(out_mad);
223+
224+
return err;
225+
}
226+
227+
int mlx5_query_mad_ifc_node_desc(struct mlx5_ib_dev *dev, char *node_desc)
228+
{
229+
struct ib_smp *in_mad = NULL;
230+
struct ib_smp *out_mad = NULL;
231+
int err = -ENOMEM;
232+
233+
in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL);
234+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
235+
if (!in_mad || !out_mad)
236+
goto out;
237+
238+
init_query_mad(in_mad);
239+
in_mad->attr_id = IB_SMP_ATTR_NODE_DESC;
240+
241+
err = mlx5_MAD_IFC(dev, 1, 1, 1, NULL, NULL, in_mad, out_mad);
242+
if (err)
243+
goto out;
244+
245+
memcpy(node_desc, out_mad->data, 64);
246+
out:
247+
kfree(in_mad);
248+
kfree(out_mad);
249+
return err;
250+
}
251+
252+
int mlx5_query_mad_ifc_node_guid(struct mlx5_ib_dev *dev, __be64 *node_guid)
253+
{
254+
struct ib_smp *in_mad = NULL;
255+
struct ib_smp *out_mad = NULL;
256+
int err = -ENOMEM;
257+
258+
in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL);
259+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
260+
if (!in_mad || !out_mad)
261+
goto out;
262+
263+
init_query_mad(in_mad);
264+
in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
265+
266+
err = mlx5_MAD_IFC(dev, 1, 1, 1, NULL, NULL, in_mad, out_mad);
267+
if (err)
268+
goto out;
269+
270+
memcpy(node_guid, out_mad->data + 12, 8);
271+
out:
272+
kfree(in_mad);
273+
kfree(out_mad);
274+
return err;
275+
}
276+
277+
int mlx5_query_mad_ifc_pkey(struct ib_device *ibdev, u8 port, u16 index,
278+
u16 *pkey)
279+
{
280+
struct ib_smp *in_mad = NULL;
281+
struct ib_smp *out_mad = NULL;
282+
int err = -ENOMEM;
283+
284+
in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL);
285+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
286+
if (!in_mad || !out_mad)
287+
goto out;
288+
289+
init_query_mad(in_mad);
290+
in_mad->attr_id = IB_SMP_ATTR_PKEY_TABLE;
291+
in_mad->attr_mod = cpu_to_be32(index / 32);
292+
293+
err = mlx5_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad,
294+
out_mad);
295+
if (err)
296+
goto out;
297+
298+
*pkey = be16_to_cpu(((__be16 *)out_mad->data)[index % 32]);
299+
300+
out:
301+
kfree(in_mad);
302+
kfree(out_mad);
303+
return err;
304+
}
305+
306+
int mlx5_query_mad_ifc_gids(struct ib_device *ibdev, u8 port, int index,
307+
union ib_gid *gid)
308+
{
309+
struct ib_smp *in_mad = NULL;
310+
struct ib_smp *out_mad = NULL;
311+
int err = -ENOMEM;
312+
313+
in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL);
314+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
315+
if (!in_mad || !out_mad)
316+
goto out;
317+
318+
init_query_mad(in_mad);
319+
in_mad->attr_id = IB_SMP_ATTR_PORT_INFO;
320+
in_mad->attr_mod = cpu_to_be32(port);
321+
322+
err = mlx5_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad,
323+
out_mad);
324+
if (err)
325+
goto out;
326+
327+
memcpy(gid->raw, out_mad->data + 8, 8);
328+
329+
init_query_mad(in_mad);
330+
in_mad->attr_id = IB_SMP_ATTR_GUID_INFO;
331+
in_mad->attr_mod = cpu_to_be32(index / 8);
332+
333+
err = mlx5_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad,
334+
out_mad);
335+
if (err)
336+
goto out;
337+
338+
memcpy(gid->raw + 8, out_mad->data + (index % 8) * 8, 8);
339+
340+
out:
341+
kfree(in_mad);
342+
kfree(out_mad);
343+
return err;
344+
}
345+
346+
int mlx5_query_mad_ifc_port(struct ib_device *ibdev, u8 port,
347+
struct ib_port_attr *props)
348+
{
349+
struct mlx5_ib_dev *dev = to_mdev(ibdev);
350+
struct mlx5_core_dev *mdev = dev->mdev;
351+
struct ib_smp *in_mad = NULL;
352+
struct ib_smp *out_mad = NULL;
353+
int ext_active_speed;
354+
int err = -ENOMEM;
355+
356+
if (port < 1 || port > MLX5_CAP_GEN(mdev, num_ports)) {
357+
mlx5_ib_warn(dev, "invalid port number %d\n", port);
358+
return -EINVAL;
359+
}
360+
361+
in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL);
362+
out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL);
363+
if (!in_mad || !out_mad)
364+
goto out;
365+
366+
memset(props, 0, sizeof(*props));
367+
368+
init_query_mad(in_mad);
369+
in_mad->attr_id = IB_SMP_ATTR_PORT_INFO;
370+
in_mad->attr_mod = cpu_to_be32(port);
371+
372+
err = mlx5_MAD_IFC(dev, 1, 1, port, NULL, NULL, in_mad, out_mad);
373+
if (err) {
374+
mlx5_ib_warn(dev, "err %d\n", err);
375+
goto out;
376+
}
377+
378+
props->lid = be16_to_cpup((__be16 *)(out_mad->data + 16));
379+
props->lmc = out_mad->data[34] & 0x7;
380+
props->sm_lid = be16_to_cpup((__be16 *)(out_mad->data + 18));
381+
props->sm_sl = out_mad->data[36] & 0xf;
382+
props->state = out_mad->data[32] & 0xf;
383+
props->phys_state = out_mad->data[33] >> 4;
384+
props->port_cap_flags = be32_to_cpup((__be32 *)(out_mad->data + 20));
385+
props->gid_tbl_len = out_mad->data[50];
386+
props->max_msg_sz = 1 << MLX5_CAP_GEN(mdev, log_max_msg);
387+
props->pkey_tbl_len = mdev->port_caps[port - 1].pkey_table_len;
388+
props->bad_pkey_cntr = be16_to_cpup((__be16 *)(out_mad->data + 46));
389+
props->qkey_viol_cntr = be16_to_cpup((__be16 *)(out_mad->data + 48));
390+
props->active_width = out_mad->data[31] & 0xf;
391+
props->active_speed = out_mad->data[35] >> 4;
392+
props->max_mtu = out_mad->data[41] & 0xf;
393+
props->active_mtu = out_mad->data[36] >> 4;
394+
props->subnet_timeout = out_mad->data[51] & 0x1f;
395+
props->max_vl_num = out_mad->data[37] >> 4;
396+
props->init_type_reply = out_mad->data[41] >> 4;
397+
398+
/* Check if extended speeds (EDR/FDR/...) are supported */
399+
if (props->port_cap_flags & IB_PORT_EXTENDED_SPEEDS_SUP) {
400+
ext_active_speed = out_mad->data[62] >> 4;
401+
402+
switch (ext_active_speed) {
403+
case 1:
404+
props->active_speed = 16; /* FDR */
405+
break;
406+
case 2:
407+
props->active_speed = 32; /* EDR */
408+
break;
409+
}
410+
}
411+
412+
/* If reported active speed is QDR, check if is FDR-10 */
413+
if (props->active_speed == 4) {
414+
if (mdev->port_caps[port - 1].ext_port_cap &
415+
MLX_EXT_PORT_CAP_FLAG_EXTENDED_PORT_INFO) {
416+
init_query_mad(in_mad);
417+
in_mad->attr_id = MLX5_ATTR_EXTENDED_PORT_INFO;
418+
in_mad->attr_mod = cpu_to_be32(port);
419+
420+
err = mlx5_MAD_IFC(dev, 1, 1, port,
421+
NULL, NULL, in_mad, out_mad);
422+
if (err)
423+
goto out;
424+
425+
/* Checking LinkSpeedActive for FDR-10 */
426+
if (out_mad->data[15] & 0x1)
427+
props->active_speed = 8;
428+
}
429+
}
430+
431+
out:
432+
kfree(in_mad);
433+
kfree(out_mad);
434+
435+
return err;
436+
}

0 commit comments

Comments
 (0)