aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Whitehead <Bryan.Whitehead@microchip.com>2019-03-13 15:55:48 -0400
committerDavid S. Miller <davem@davemloft.net>2019-03-13 16:41:46 -0400
commitdeb6bfabdbb634e91f36a4e9cb00a7137d72d886 (patch)
treeac1156d07998e977c97cbe6477f21666271def3e
parent4d09d8d8f91db575cf0f34f35d712fc66655fbe5 (diff)
lan743x: Fix TX Stall Issue
It has been observed that tx queue may stall while downloading from certain web sites (example www.speedtest.net) The cause has been tracked down to a corner case where the tx interrupt vector was disabled automatically, but was not re enabled later. The lan743x has two mechanisms to enable/disable individual interrupts. Interrupts can be enabled/disabled by individual source, and they can also be enabled/disabled by individual vector which has been mapped to the source. Both must be enabled for interrupts to work properly. The TX code path, primarily uses the interrupt enable/disable of the TX source bit, while leaving the vector enabled all the time. However, while investigating this issue it was noticed that the driver requested the use of the vector auto clear feature. The test above revealed a case where the vector enable was cleared unintentionally. This patch fixes the issue by deleting the lines that request the vector auto clear feature to be used. Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver") Signed-off-by: Bryan Whitehead <Bryan.Whitehead@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/microchip/lan743x_main.c9
1 files changed, 1 insertions, 8 deletions
diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 2876bab642e2..13e6bf13ac4d 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -585,8 +585,7 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
585 585
586 if (adapter->csr.flags & 586 if (adapter->csr.flags &
587 LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR) { 587 LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR) {
588 flags = LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_CLEAR | 588 flags = LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET |
589 LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET |
590 LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET | 589 LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET |
591 LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR | 590 LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR |
592 LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR; 591 LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR;
@@ -599,12 +598,6 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
599 /* map TX interrupt to vector */ 598 /* map TX interrupt to vector */
600 int_vec_map1 |= INT_VEC_MAP1_TX_VEC_(index, vector); 599 int_vec_map1 |= INT_VEC_MAP1_TX_VEC_(index, vector);
601 lan743x_csr_write(adapter, INT_VEC_MAP1, int_vec_map1); 600 lan743x_csr_write(adapter, INT_VEC_MAP1, int_vec_map1);
602 if (flags &
603 LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_CLEAR) {
604 int_vec_en_auto_clr |= INT_VEC_EN_(vector);
605 lan743x_csr_write(adapter, INT_VEC_EN_AUTO_CLR,
606 int_vec_en_auto_clr);
607 }
608 601
609 /* Remove TX interrupt from shared mask */ 602 /* Remove TX interrupt from shared mask */
610 intr->vector_list[0].int_mask &= ~int_bit; 603 intr->vector_list[0].int_mask &= ~int_bit;