Skip to content

Commit

Permalink
ionic: report users coalesce request
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Shannon Nelson authored and David S. Miller committed Oct 2, 2019
1 parent d229be4 commit 780eded
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 18 deletions.
22 changes: 11 additions & 11 deletions drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ||
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
11 changes: 5 additions & 6 deletions drivers/net/ethernet/pensando/ionic/ionic_lif.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand All @@ -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,
Expand All @@ -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);
}
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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);

Expand Down
4 changes: 3 additions & 1 deletion drivers/net/ethernet/pensando/ionic/ionic_lif.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down

0 comments on commit 780eded

Please sign in to comment.