Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5e12dff authored by Marcel Apfelbaum's avatar Marcel Apfelbaum Committed by Roland Dreier
Browse files

IB/mlx4: Configure extended active speeds




Set the extended active speeds based on the hardware configuration.

Signed-off-by: default avatarMarcel Apfelbaum <marcela@dev.mellanox.co.il>
Reviewed-by: default avatarHal Rosenstock <hal@mellanox.com>

[ Move FDR-10 handling into ib_link_query_port().  - Roland ]

Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 97285b78
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -181,8 +181,12 @@ mlx4_ib_port_link_layer(struct ib_device *device, u8 port_num)

static int ib_link_query_port(struct ib_device *ibdev, u8 port,
			      struct ib_port_attr *props,
			      struct ib_smp *in_mad,
			      struct ib_smp *out_mad)
{
	int ext_active_speed;
	int err;

	props->lid		= be16_to_cpup((__be16 *) (out_mad->data + 16));
	props->lmc		= out_mad->data[34] & 0x7;
	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,
	props->max_vl_num	= out_mad->data[37] >> 4;
	props->init_type_reply	= out_mad->data[41] >> 4;

	/* Check if extended speeds (EDR/FDR/...) are supported */
	if (props->port_cap_flags & IB_PORT_EXTENDED_SPEEDS_SUP) {
		ext_active_speed = out_mad->data[62] >> 4;

		switch (ext_active_speed) {
		case 1:
			props->active_speed = 16; /* FDR */
			break;
		case 2:
			props->active_speed = 32; /* EDR */
			break;
		}
	}

	/* If reported active speed is QDR, check if is FDR-10 */
	if (props->active_speed == 4) {
		if (to_mdev(ibdev)->dev->caps.ext_port_cap[port] &
		    MLX_EXT_PORT_CAP_FLAG_EXTENDED_PORT_INFO) {
			init_query_mad(in_mad);
			in_mad->attr_id = MLX4_ATTR_EXTENDED_PORT_INFO;
			in_mad->attr_mod = cpu_to_be32(port);

			err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port,
					   NULL, NULL, in_mad, out_mad);
			if (err)
				return err;

			/* Checking LinkSpeedActive for FDR-10 */
			if (out_mad->data[15] & 0x1)
				props->active_speed = 8;
		}
	}

	return 0;
}

@@ -274,7 +311,7 @@ static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
		goto out;

	err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ?
		ib_link_query_port(ibdev, port, props, out_mad) :
		ib_link_query_port(ibdev, port, props, in_mad, out_mad) :
		eth_link_query_port(ibdev, port, props, out_mad);

out: