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

Commit ccf86321 authored by Or Gerlitz's avatar Or Gerlitz Committed by Roland Dreier
Browse files

mlx4_core: Read extended capabilities into the flags field



Query another dword containing up to 32 extended device capabilities
and merge it into struct mlx4_caps.flags.  Update the code that
handles the current extended device capabilities (e.g UDP RSS, WoL,
vep steering, etc) to use the extended device cap flags field instead
of a field per extended capability.  Initial patch done by Eli Cohen
<eli@mellanox.co.il>.

Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.co.il>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 52eafc68
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ static void mlx4_en_get_wol(struct net_device *netdev,
	int err = 0;
	u64 config = 0;

	if (!priv->mdev->dev->caps.wol) {
	if (!(priv->mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_WOL)) {
		wol->supported = 0;
		wol->wolopts = 0;
		return;
@@ -134,7 +134,7 @@ static int mlx4_en_set_wol(struct net_device *netdev,
	u64 config = 0;
	int err = 0;

	if (!priv->mdev->dev->caps.wol)
	if (!(priv->mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_WOL))
		return -EOPNOTSUPP;

	if (wol->supported & ~WAKE_MAGIC)
@@ -170,7 +170,8 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
		return NUM_ALL_STATS +
			(priv->tx_ring_num + priv->rx_ring_num) * 2;
	case ETH_SS_TEST:
		return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.loopback_support) * 2;
		return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags
					& MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2;
	default:
		return -EOPNOTSUPP;
	}
@@ -220,7 +221,7 @@ static void mlx4_en_get_strings(struct net_device *dev,
	case ETH_SS_TEST:
		for (i = 0; i < MLX4_EN_NUM_SELF_TEST - 2; i++)
			strcpy(data + i * ETH_GSTRING_LEN, mlx4_en_test_names[i]);
		if (priv->mdev->dev->caps.loopback_support)
		if (priv->mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_UC_LOOPBACK)
			for (; i < MLX4_EN_NUM_SELF_TEST; i++)
				strcpy(data + i * ETH_GSTRING_LEN, mlx4_en_test_names[i]);
		break;
+2 −1
Original line number Diff line number Diff line
@@ -106,7 +106,8 @@ static int mlx4_en_get_profile(struct mlx4_en_dev *mdev)

	params->tcp_rss = tcp_rss;
	params->udp_rss = udp_rss;
	if (params->udp_rss && !mdev->dev->caps.udp_rss) {
	if (params->udp_rss && !(mdev->dev->caps.flags
					& MLX4_DEV_CAP_FLAG_UDP_RSS)) {
		mlx4_warn(mdev, "UDP RSS is not supported on this device.\n");
		params->udp_rss = 0;
	}
+3 −2
Original line number Diff line number Diff line
@@ -239,7 +239,8 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
			priv->flags |= MLX4_EN_FLAG_PROMISC;

			/* Enable promiscouos mode */
			if (!mdev->dev->caps.vep_uc_steering)
			if (!(mdev->dev->caps.flags &
						MLX4_DEV_CAP_FLAG_VEP_UC_STEER))
				err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
							     priv->base_qpn, 1);
			else
@@ -285,7 +286,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
		priv->flags &= ~MLX4_EN_FLAG_PROMISC;

		/* Disable promiscouos mode */
		if (!mdev->dev->caps.vep_uc_steering)
		if (!(mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER))
			err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
						     priv->base_qpn, 0);
		else
+4 −2
Original line number Diff line number Diff line
@@ -119,9 +119,11 @@ int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,
	struct mlx4_set_port_rqp_calc_context *context;
	int err;
	u32 in_mod;
	u32 m_promisc = (dev->caps.vep_mc_steering) ? MCAST_DIRECT : MCAST_DEFAULT;
	u32 m_promisc = (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) ?
						MCAST_DIRECT : MCAST_DEFAULT;

	if (dev->caps.vep_mc_steering && dev->caps.vep_uc_steering)
	if (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER  &&
			dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER)
		return 0;

	mailbox = mlx4_alloc_cmd_mailbox(dev);
+2 −1
Original line number Diff line number Diff line
@@ -159,7 +159,8 @@ void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf)
				goto retry_tx;
		}

		if (priv->mdev->dev->caps.loopback_support){
		if (priv->mdev->dev->caps.flags &
					MLX4_DEV_CAP_FLAG_UC_LOOPBACK) {
			buf[3] = mlx4_en_test_registers(priv);
			buf[4] = mlx4_en_test_loopback(priv);
		}
Loading