Merge branch 'net-xilinx-axienet-enable-adaptive-irq-coalescing-with-dim'

Sean Anderson says:

====================
net: xilinx: axienet: Report an error for bad coalesce settings
====================

Link: https://patch.msgid.link/20250116232954.2696930-1-sean.anderson@linux.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2025-01-18 17:19:04 -08:00
commit 50309d3811
2 changed files with 24 additions and 13 deletions

View File

@ -120,6 +120,9 @@
#define XAXIDMA_IRQ_ERROR_MASK 0x00004000 /* Error interrupt */
#define XAXIDMA_IRQ_ALL_MASK 0x00007000 /* All interrupts */
/* Constant to convert delay counts to microseconds */
#define XAXIDMA_DELAY_SCALE (125ULL * USEC_PER_SEC)
/* Default TX/RX Threshold and delay timer values for SGDMA mode */
#define XAXIDMA_DFT_TX_THRESHOLD 24
#define XAXIDMA_DFT_TX_USEC 50

View File

@ -238,11 +238,8 @@ static u32 axienet_usec_to_timer(struct axienet_local *lp, u32 coalesce_usec)
/* 1 Timeout Interval = 125 * (clock period of SG clock) */
result = DIV64_U64_ROUND_CLOSEST((u64)coalesce_usec * clk_rate,
(u64)125000000);
if (result > 255)
result = 255;
return result;
XAXIDMA_DELAY_SCALE);
return min(result, FIELD_MAX(XAXIDMA_DELAY_MASK));
}
/**
@ -2062,14 +2059,25 @@ axienet_ethtools_set_coalesce(struct net_device *ndev,
return -EINVAL;
}
if (ecoalesce->rx_max_coalesced_frames)
lp->coalesce_count_rx = ecoalesce->rx_max_coalesced_frames;
if (ecoalesce->rx_coalesce_usecs)
lp->coalesce_usec_rx = ecoalesce->rx_coalesce_usecs;
if (ecoalesce->tx_max_coalesced_frames)
lp->coalesce_count_tx = ecoalesce->tx_max_coalesced_frames;
if (ecoalesce->tx_coalesce_usecs)
lp->coalesce_usec_tx = ecoalesce->tx_coalesce_usecs;
if (!ecoalesce->rx_max_coalesced_frames ||
!ecoalesce->tx_max_coalesced_frames) {
NL_SET_ERR_MSG(extack, "frames must be non-zero");
return -EINVAL;
}
if ((ecoalesce->rx_max_coalesced_frames > 1 &&
!ecoalesce->rx_coalesce_usecs) ||
(ecoalesce->tx_max_coalesced_frames > 1 &&
!ecoalesce->tx_coalesce_usecs)) {
NL_SET_ERR_MSG(extack,
"usecs must be non-zero when frames is greater than one");
return -EINVAL;
}
lp->coalesce_count_rx = ecoalesce->rx_max_coalesced_frames;
lp->coalesce_usec_rx = ecoalesce->rx_coalesce_usecs;
lp->coalesce_count_tx = ecoalesce->tx_max_coalesced_frames;
lp->coalesce_usec_tx = ecoalesce->tx_coalesce_usecs;
return 0;
}