nfp: ethtool: add extended ack report messages
authorRyno Swart <ryno.swart@corigine.com>
Wed, 6 Dec 2023 15:12:08 +0000 (17:12 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 8 Dec 2023 02:35:41 +0000 (18:35 -0800)
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: Ryno Swart <ryno.swart@corigine.com>
Signed-off-by: Louis Peens <louis.peens@corigine.com>
Link: https://lore.kernel.org/r/20231206151209.20296-2-louis.peens@corigine.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/netronome/nfp/nfp_net.h
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c

index bd0e26524417bb9816f1518eddc459d86d49e527..46764aeccb37dece53fce21d123bf6762d523f9e 100644 (file)
@@ -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;
index ac1f4514b1d060da6955909df1c0bbe8750ffeea..dcd27ba2a74c8f5346c2a940b1a48e1c44575ffb 100644 (file)
@@ -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 */
index 200b3588363ce645fb1b4e4d19f09bbdef4fd9fd..f4f6153cae0f11539410ffd7227203e1755cbbed 100644 (file)
@@ -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;