]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ionic: report users coalesce request
authorShannon Nelson <snelson@pensando.io>
Tue, 1 Oct 2019 03:03:24 +0000 (20:03 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Oct 2019 15:55:12 +0000 (11:55 -0400)
The user's request for an interrupt coalescing value gets
translated into a hardware value to be used with the NIC,
and was getting reported back based on the hw value, which,
due to hw tic resolution, could be reported as a different
number than what the user originally asked for.  This code
now tracks both the user request and what was put into the
hardware so we can report back to the user what they
requested.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_lif.h

index 7760fcd709b474d5dd16e4a714c2a2b6b303c395..63cc14c060d699be2c4ee4673fb22135fda8686c 100644 (file)
@@ -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);
                        }
                }
        }
index 4d5883a7e5863cf84614089353c9f5743b2f4890..372329389c84e0f15367ef4d0047f6c325c33c0c 100644 (file)
@@ -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);
 
index b74f7e9ee82dfdffd4fda6e8beda25671d809047..cf243a9d01685c1dd6ed2e74dc19037471e4ddf1 100644 (file)
@@ -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;
 };