Commit 09b48947 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'nfp-add-ext_ack-messages-to-supported-callbacks'

Louis Peens says:

====================
nfp: add ext_ack messages to supported callbacks

This is a mostly cosmetic series to add error messages to devlink and
ethtool callbacks which supports them but did not have them added in the
nfp driver yet.
====================

Link: https://lore.kernel.org/r/20231206151209.20296-1-louis.peens@corigine.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 2483e7f0 2f076ea8
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -75,8 +75,10 @@ nfp_devlink_port_split(struct devlink *devlink, struct devlink_port *port,
	if (ret)
		return ret;

	if (eth_port.port_lanes % count)
	if (eth_port.port_lanes % count) {
		NL_SET_ERR_MSG_MOD(extack, "invalid count");
		return -EINVAL;
	}

	/* Special case the 100G CXP -> 2x40G split */
	lanes = eth_port.port_lanes / count;
@@ -101,8 +103,10 @@ nfp_devlink_port_unsplit(struct devlink *devlink, struct devlink_port *port,
	if (ret)
		return ret;

	if (!eth_port.is_split)
	if (!eth_port.is_split) {
		NL_SET_ERR_MSG_MOD(extack, "port is not split");
		return -EINVAL;
	}

	/* Special case the 100G CXP -> 2x40G unsplit */
	lanes = eth_port.port_lanes;
+2 −2
Original line number Diff line number Diff line
@@ -966,9 +966,9 @@ static inline bool nfp_netdev_is_nfp_net(struct net_device *netdev)
	       netdev->netdev_ops == &nfp_nfdk_netdev_ops;
}

static inline int nfp_net_coalesce_para_check(u32 usecs, u32 pkts)
static inline int nfp_net_coalesce_para_check(u32 param)
{
	if ((usecs >= ((1 << 16) - 1)) || (pkts >= ((1 << 16) - 1)))
	if (param >= ((1 << 16) - 1))
		return -EINVAL;

	return 0;
+4 −2
Original line number Diff line number Diff line
@@ -1176,7 +1176,8 @@ static void nfp_net_rx_dim_work(struct work_struct *work)
	 * count.
	 */
	factor = nn->tlv_caps.me_freq_mhz / 16;
	if (nfp_net_coalesce_para_check(factor * moder.usec, moder.pkts))
	if (nfp_net_coalesce_para_check(factor * moder.usec) ||
	    nfp_net_coalesce_para_check(moder.pkts))
		return;

	/* copy RX interrupt coalesce parameters */
@@ -1205,7 +1206,8 @@ static void nfp_net_tx_dim_work(struct work_struct *work)
	 * count.
	 */
	factor = nn->tlv_caps.me_freq_mhz / 16;
	if (nfp_net_coalesce_para_check(factor * moder.usec, moder.pkts))
	if (nfp_net_coalesce_para_check(factor * moder.usec) ||
	    nfp_net_coalesce_para_check(moder.pkts))
		return;

	/* copy TX interrupt coalesce parameters */
+39 −14
Original line number Diff line number Diff line
@@ -633,7 +633,8 @@ static void nfp_net_get_ringparam(struct net_device *netdev,
	ring->tx_pending = nn->dp.txd_cnt;
}

static int nfp_net_set_ring_size(struct nfp_net *nn, u32 rxd_cnt, u32 txd_cnt)
static int nfp_net_set_ring_size(struct nfp_net *nn, u32 rxd_cnt, u32 txd_cnt,
				 struct netlink_ext_ack *extack)
{
	struct nfp_net_dp *dp;

@@ -644,7 +645,7 @@ static int nfp_net_set_ring_size(struct nfp_net *nn, u32 rxd_cnt, u32 txd_cnt)
	dp->rxd_cnt = rxd_cnt;
	dp->txd_cnt = txd_cnt;

	return nfp_net_ring_reconfig(nn, dp, NULL);
	return nfp_net_ring_reconfig(nn, dp, extack);
}

static int nfp_net_set_ringparam(struct net_device *netdev,
@@ -657,7 +658,7 @@ static int nfp_net_set_ringparam(struct net_device *netdev,

	/* We don't have separate queues/rings for small/large frames. */
	if (ring->rx_mini_pending || ring->rx_jumbo_pending)
		return -EINVAL;
		return -EOPNOTSUPP;

	qc_min = nn->dev_info->min_qc_size;
	qc_max = nn->dev_info->max_qc_size;
@@ -666,9 +667,15 @@ static int nfp_net_set_ringparam(struct net_device *netdev,
	rxd_cnt = roundup_pow_of_two(ring->rx_pending);
	txd_cnt = roundup_pow_of_two(ring->tx_pending);

	if (rxd_cnt < qc_min || rxd_cnt > qc_max ||
	    txd_cnt < qc_min / tx_dpp || txd_cnt > qc_max / tx_dpp)
	if (rxd_cnt < qc_min || rxd_cnt > qc_max) {
		NL_SET_ERR_MSG_MOD(extack, "rx parameter out of bounds");
		return -EINVAL;
	}

	if (txd_cnt < qc_min / tx_dpp || txd_cnt > qc_max / tx_dpp) {
		NL_SET_ERR_MSG_MOD(extack, "tx parameter out of bounds");
		return -EINVAL;
	}

	if (nn->dp.rxd_cnt == rxd_cnt && nn->dp.txd_cnt == txd_cnt)
		return 0;
@@ -676,7 +683,7 @@ static int nfp_net_set_ringparam(struct net_device *netdev,
	nn_dbg(nn, "Change ring size: RxQ %u->%u, TxQ %u->%u\n",
	       nn->dp.rxd_cnt, rxd_cnt, nn->dp.txd_cnt, txd_cnt);

	return nfp_net_set_ring_size(nn, rxd_cnt, txd_cnt);
	return nfp_net_set_ring_size(nn, rxd_cnt, txd_cnt, extack);
}

static int nfp_test_link(struct net_device *netdev)
@@ -1866,7 +1873,7 @@ static int nfp_net_get_coalesce(struct net_device *netdev,
	struct nfp_net *nn = netdev_priv(netdev);

	if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD))
		return -EINVAL;
		return -EOPNOTSUPP;

	ec->use_adaptive_rx_coalesce = nn->rx_coalesce_adapt_on;
	ec->use_adaptive_tx_coalesce = nn->tx_coalesce_adapt_on;
@@ -2145,22 +2152,40 @@ static int nfp_net_set_coalesce(struct net_device *netdev,
	 */

	if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD))
		return -EINVAL;
		return -EOPNOTSUPP;

	/* ensure valid configuration */
	if (!ec->rx_coalesce_usecs && !ec->rx_max_coalesced_frames)
	if (!ec->rx_coalesce_usecs && !ec->rx_max_coalesced_frames) {
		NL_SET_ERR_MSG_MOD(extack,
				   "rx-usecs and rx-frames cannot both be zero");
		return -EINVAL;
	}

	if (!ec->tx_coalesce_usecs && !ec->tx_max_coalesced_frames)
	if (!ec->tx_coalesce_usecs && !ec->tx_max_coalesced_frames) {
		NL_SET_ERR_MSG_MOD(extack,
				   "tx-usecs and tx-frames cannot both be zero");
		return -EINVAL;
	}

	if (nfp_net_coalesce_para_check(ec->rx_coalesce_usecs * factor,
					ec->rx_max_coalesced_frames))
	if (nfp_net_coalesce_para_check(ec->rx_coalesce_usecs * factor)) {
		NL_SET_ERR_MSG_MOD(extack, "rx-usecs too large");
		return -EINVAL;
	}

	if (nfp_net_coalesce_para_check(ec->tx_coalesce_usecs * factor,
					ec->tx_max_coalesced_frames))
	if (nfp_net_coalesce_para_check(ec->rx_max_coalesced_frames)) {
		NL_SET_ERR_MSG_MOD(extack, "rx-frames too large");
		return -EINVAL;
	}

	if (nfp_net_coalesce_para_check(ec->tx_coalesce_usecs * factor)) {
		NL_SET_ERR_MSG_MOD(extack, "tx-usecs too large");
		return -EINVAL;
	}

	if (nfp_net_coalesce_para_check(ec->tx_max_coalesced_frames)) {
		NL_SET_ERR_MSG_MOD(extack, "tx-frames too large");
		return -EINVAL;
	}

	/* configuration is valid */
	nn->rx_coalesce_adapt_on = !!ec->use_adaptive_rx_coalesce;