Commit b0318e28 authored by Ryno Swart's avatar Ryno Swart Committed by Jakub Kicinski

nfp: ethtool: add extended ack report messages

Add descriptive error messages to common ethtool failures to be more
user friendly.

Update `nfp_net_coalesce_para_check` to only check one argument, which
facilitates unique error messages.

Additionally, three error codes are updated to `EOPNOTSUPP` to reflect
that these operations are not supported.
Signed-off-by: default avatarRyno Swart <ryno.swart@corigine.com>
Signed-off-by: default avatarLouis Peens <louis.peens@corigine.com>
Link: https://lore.kernel.org/r/20231206151209.20296-2-louis.peens@corigine.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 2483e7f0
...@@ -966,9 +966,9 @@ static inline bool nfp_netdev_is_nfp_net(struct net_device *netdev) ...@@ -966,9 +966,9 @@ static inline bool nfp_netdev_is_nfp_net(struct net_device *netdev)
netdev->netdev_ops == &nfp_nfdk_netdev_ops; 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 -EINVAL;
return 0; return 0;
......
...@@ -1176,7 +1176,8 @@ static void nfp_net_rx_dim_work(struct work_struct *work) ...@@ -1176,7 +1176,8 @@ static void nfp_net_rx_dim_work(struct work_struct *work)
* count. * count.
*/ */
factor = nn->tlv_caps.me_freq_mhz / 16; 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; return;
/* copy RX interrupt coalesce parameters */ /* copy RX interrupt coalesce parameters */
...@@ -1205,7 +1206,8 @@ static void nfp_net_tx_dim_work(struct work_struct *work) ...@@ -1205,7 +1206,8 @@ static void nfp_net_tx_dim_work(struct work_struct *work)
* count. * count.
*/ */
factor = nn->tlv_caps.me_freq_mhz / 16; 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; return;
/* copy TX interrupt coalesce parameters */ /* copy TX interrupt coalesce parameters */
......
...@@ -633,7 +633,8 @@ static void nfp_net_get_ringparam(struct net_device *netdev, ...@@ -633,7 +633,8 @@ static void nfp_net_get_ringparam(struct net_device *netdev,
ring->tx_pending = nn->dp.txd_cnt; 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; 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) ...@@ -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->rxd_cnt = rxd_cnt;
dp->txd_cnt = txd_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, static int nfp_net_set_ringparam(struct net_device *netdev,
...@@ -657,7 +658,7 @@ 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. */ /* We don't have separate queues/rings for small/large frames. */
if (ring->rx_mini_pending || ring->rx_jumbo_pending) if (ring->rx_mini_pending || ring->rx_jumbo_pending)
return -EINVAL; return -EOPNOTSUPP;
qc_min = nn->dev_info->min_qc_size; qc_min = nn->dev_info->min_qc_size;
qc_max = nn->dev_info->max_qc_size; qc_max = nn->dev_info->max_qc_size;
...@@ -666,9 +667,15 @@ static int nfp_net_set_ringparam(struct net_device *netdev, ...@@ -666,9 +667,15 @@ static int nfp_net_set_ringparam(struct net_device *netdev,
rxd_cnt = roundup_pow_of_two(ring->rx_pending); rxd_cnt = roundup_pow_of_two(ring->rx_pending);
txd_cnt = roundup_pow_of_two(ring->tx_pending); txd_cnt = roundup_pow_of_two(ring->tx_pending);
if (rxd_cnt < qc_min || rxd_cnt > qc_max || if (rxd_cnt < qc_min || rxd_cnt > qc_max) {
txd_cnt < qc_min / tx_dpp || txd_cnt > qc_max / tx_dpp) NL_SET_ERR_MSG_MOD(extack, "rx parameter out of bounds");
return -EINVAL; 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) if (nn->dp.rxd_cnt == rxd_cnt && nn->dp.txd_cnt == txd_cnt)
return 0; return 0;
...@@ -676,7 +683,7 @@ static int nfp_net_set_ringparam(struct net_device *netdev, ...@@ -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_dbg(nn, "Change ring size: RxQ %u->%u, TxQ %u->%u\n",
nn->dp.rxd_cnt, rxd_cnt, nn->dp.txd_cnt, txd_cnt); 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) static int nfp_test_link(struct net_device *netdev)
...@@ -1866,7 +1873,7 @@ static int nfp_net_get_coalesce(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); struct nfp_net *nn = netdev_priv(netdev);
if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD)) 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_rx_coalesce = nn->rx_coalesce_adapt_on;
ec->use_adaptive_tx_coalesce = nn->tx_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, ...@@ -2145,22 +2152,40 @@ static int nfp_net_set_coalesce(struct net_device *netdev,
*/ */
if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD)) if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD))
return -EINVAL; return -EOPNOTSUPP;
/* ensure valid configuration */ /* 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; 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; return -EINVAL;
}
if (nfp_net_coalesce_para_check(ec->rx_coalesce_usecs * factor, if (nfp_net_coalesce_para_check(ec->rx_coalesce_usecs * factor)) {
ec->rx_max_coalesced_frames)) NL_SET_ERR_MSG_MOD(extack, "rx-usecs too large");
return -EINVAL; return -EINVAL;
}
if (nfp_net_coalesce_para_check(ec->tx_coalesce_usecs * factor, if (nfp_net_coalesce_para_check(ec->rx_max_coalesced_frames)) {
ec->tx_max_coalesced_frames)) NL_SET_ERR_MSG_MOD(extack, "rx-frames too large");
return -EINVAL; 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 */ /* configuration is valid */
nn->rx_coalesce_adapt_on = !!ec->use_adaptive_rx_coalesce; nn->rx_coalesce_adapt_on = !!ec->use_adaptive_rx_coalesce;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment