The user's request for an interrupt coalescing value gets
translated into a hardware value to be used with the NIC,
but we should still report back to the user what they
requested.

Signed-off-by: Shannon Nelson <snel...@pensando.io>
---
 .../ethernet/pensando/ionic/ionic_ethtool.c   | 22 +++++++++----------
 .../net/ethernet/pensando/ionic/ionic_lif.c   | 11 +++++-----
 .../net/ethernet/pensando/ionic/ionic_lif.h   |  4 +++-
 3 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c 
b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index 7760fcd709b4..63cc14c060d6 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -372,7 +372,6 @@ static int ionic_set_coalesce(struct net_device *netdev,
        struct ionic_identity *ident;
        struct ionic_qcq *qcq;
        unsigned int i;
-       u32 usecs;
        u32 coal;
 
        if (coalesce->rx_max_coalesced_frames ||
@@ -410,26 +409,27 @@ static int ionic_set_coalesce(struct net_device *netdev,
                return -EINVAL;
        }
 
+       /* Convert the usec request to a HW useable value.  If they asked
+        * for non-zero and it resolved to zero, bump it up
+        */
        coal = ionic_coal_usec_to_hw(lif->ionic, coalesce->rx_coalesce_usecs);
-
-       if (coal > IONIC_INTR_CTRL_COAL_MAX)
-               return -ERANGE;
-
-       /* If they asked for non-zero and it resolved to zero, bump it up */
        if (!coal && coalesce->rx_coalesce_usecs)
                coal = 1;
 
-       /* Convert it back to get device resolution */
-       usecs = ionic_coal_hw_to_usec(lif->ionic, coal);
+       if (coal > IONIC_INTR_CTRL_COAL_MAX)
+               return -ERANGE;
 
-       if (usecs != lif->rx_coalesce_usecs) {
-               lif->rx_coalesce_usecs = usecs;
+       /* Save the new value */
+       lif->rx_coalesce_usecs = coalesce->rx_coalesce_usecs;
+       if (coal != lif->rx_coalesce_hw) {
+               lif->rx_coalesce_hw = coal;
 
                if (test_bit(IONIC_LIF_UP, lif->state)) {
                        for (i = 0; i < lif->nxqs; i++) {
                                qcq = lif->rxqcqs[i].qcq;
                                ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
-                                                    qcq->intr.index, coal);
+                                                    qcq->intr.index,
+                                                    lif->rx_coalesce_hw);
                        }
                }
        }
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c 
b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
index 4d5883a7e586..372329389c84 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
@@ -1430,7 +1430,6 @@ static int ionic_txrx_alloc(struct ionic_lif *lif)
        unsigned int flags;
        unsigned int i;
        int err = 0;
-       u32 coal;
 
        flags = IONIC_QCQ_F_TX_STATS | IONIC_QCQ_F_SG;
        for (i = 0; i < lif->nxqs; i++) {
@@ -1447,7 +1446,6 @@ static int ionic_txrx_alloc(struct ionic_lif *lif)
        }
 
        flags = IONIC_QCQ_F_RX_STATS | IONIC_QCQ_F_INTR;
-       coal = ionic_coal_usec_to_hw(lif->ionic, lif->rx_coalesce_usecs);
        for (i = 0; i < lif->nxqs; i++) {
                err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, i, "rx", flags,
                                      lif->nrxq_descs,
@@ -1460,7 +1458,8 @@ static int ionic_txrx_alloc(struct ionic_lif *lif)
                lif->rxqcqs[i].qcq->stats = lif->rxqcqs[i].stats;
 
                ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
-                                    lif->rxqcqs[i].qcq->intr.index, coal);
+                                    lif->rxqcqs[i].qcq->intr.index,
+                                    lif->rx_coalesce_hw);
                ionic_link_qcq_interrupts(lif->rxqcqs[i].qcq,
                                          lif->txqcqs[i].qcq);
        }
@@ -1640,7 +1639,6 @@ static struct ionic_lif *ionic_lif_alloc(struct ionic 
*ionic, unsigned int index
        struct net_device *netdev;
        struct ionic_lif *lif;
        int tbl_sz;
-       u32 coal;
        int err;
 
        netdev = alloc_etherdev_mqs(sizeof(*lif),
@@ -1671,8 +1669,9 @@ static struct ionic_lif *ionic_lif_alloc(struct ionic 
*ionic, unsigned int index
        lif->nrxq_descs = IONIC_DEF_TXRX_DESC;
 
        /* Convert the default coalesce value to actual hw resolution */
-       coal = ionic_coal_usec_to_hw(lif->ionic, IONIC_ITR_COAL_USEC_DEFAULT);
-       lif->rx_coalesce_usecs = ionic_coal_hw_to_usec(lif->ionic, coal);
+       lif->rx_coalesce_usecs = IONIC_ITR_COAL_USEC_DEFAULT;
+       lif->rx_coalesce_hw = ionic_coal_hw_to_usec(lif->ionic,
+                                                   lif->rx_coalesce_usecs);
 
        snprintf(lif->name, sizeof(lif->name), "lif%u", index);
 
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h 
b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
index b74f7e9ee82d..cf243a9d0168 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
@@ -175,7 +175,9 @@ struct ionic_lif {
        unsigned long *dbid_inuse;
        unsigned int dbid_count;
        struct dentry *dentry;
-       u32 rx_coalesce_usecs;
+       u32 rx_coalesce_usecs;          /* what the user asked for */
+       u32 rx_coalesce_hw;             /* what the hw is using */
+
        u32 flags;
        struct work_struct tx_timeout_work;
 };
-- 
2.17.1

Reply via email to