OSDN Git Service

lan743x: Fix TX Stall Issue
authorBryan Whitehead <Bryan.Whitehead@microchip.com>
Wed, 13 Mar 2019 19:55:48 +0000 (15:55 -0400)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Mar 2019 20:41:46 +0000 (13:41 -0700)
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>
drivers/net/ethernet/microchip/lan743x_main.c

index 2876bab..13e6bf1 100644 (file)
@@ -585,8 +585,7 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 
                if (adapter->csr.flags &
                   LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR) {
-                       flags = LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_CLEAR |
-                               LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET |
+                       flags = LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET |
                                LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET |
                                LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR |
                                LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR;
@@ -599,12 +598,6 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
                        /* map TX interrupt to vector */
                        int_vec_map1 |= INT_VEC_MAP1_TX_VEC_(index, vector);
                        lan743x_csr_write(adapter, INT_VEC_MAP1, int_vec_map1);
-                       if (flags &
-                           LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_CLEAR) {
-                               int_vec_en_auto_clr |= INT_VEC_EN_(vector);
-                               lan743x_csr_write(adapter, INT_VEC_EN_AUTO_CLR,
-                                                 int_vec_en_auto_clr);
-                       }
 
                        /* Remove TX interrupt from shared mask */
                        intr->vector_list[0].int_mask &= ~int_bit;