summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrett Creeley <brett.creeley@intel.com>2022-09-01 16:34:40 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-09-28 11:02:56 +0200
commitdd5f57c4148d3ee9eec1edc9bcd655c560d98a81 (patch)
tree6d16193fade99977e1305f3c1aacbf7f9dad8795
parent468adf7aab7a30ffe4467e2c981a65568ba84f0b (diff)
downloadlinux-dd5f57c4148d3ee9eec1edc9bcd655c560d98a81.tar.gz
linux-dd5f57c4148d3ee9eec1edc9bcd655c560d98a81.tar.bz2
linux-dd5f57c4148d3ee9eec1edc9bcd655c560d98a81.zip
iavf: Fix cached head and tail value for iavf_get_tx_pending
[ Upstream commit 809f23c0423a43266e47a7dc67e95b5cb4d1cbfc ] The underlying hardware may or may not allow reading of the head or tail registers and it really makes no difference if we use the software cached values. So, always used the software cached values. Fixes: 9c6c12595b73 ("i40e: Detection and recovery of TX queue hung logic moved to service_task from tx_timeout") Signed-off-by: Brett Creeley <brett.creeley@intel.com> Co-developed-by: Norbert Zulinski <norbertx.zulinski@intel.com> Signed-off-by: Norbert Zulinski <norbertx.zulinski@intel.com> Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com> Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_txrx.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
index b56d22b530a7..1bf9734ae9cf 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
@@ -115,8 +115,11 @@ u32 i40evf_get_tx_pending(struct i40e_ring *ring, bool in_sw)
{
u32 head, tail;
+ /* underlying hardware might not allow access and/or always return
+ * 0 for the head/tail registers so just use the cached values
+ */
head = ring->next_to_clean;
- tail = readl(ring->tail);
+ tail = ring->next_to_use;
if (head != tail)
return (head < tail) ?