Commit 8fce3331 authored by Jose Abreu's avatar Jose Abreu Committed by David S. Miller

net: stmmac: Rework coalesce timer and fix multi-queue races

This follows David Miller advice and tries to fix coalesce timer in
multi-queue scenarios.

We are now using per-queue coalesce values and per-queue TX timer.

Coalesce timer default values was changed to 1ms and the coalesce frames
to 25.

Tested in B2B setup between XGMAC2 and GMAC5.
Signed-off-by: default avatarJose Abreu <joabreu@synopsys.com>
Fixes: 	ce736788 ("net: stmmac: adding multiple buffers for TX")
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: Neil Armstrong <narmstrong@baylibre.com>
Cc: Jerome Brunet <jbrunet@baylibre.com>
Cc: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Joao Pinto <jpinto@synopsys.com>
Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Cc: Alexandre Torgue <alexandre.torgue@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5211da9c
...@@ -258,10 +258,10 @@ struct stmmac_safety_stats { ...@@ -258,10 +258,10 @@ struct stmmac_safety_stats {
#define MAX_DMA_RIWT 0xff #define MAX_DMA_RIWT 0xff
#define MIN_DMA_RIWT 0x20 #define MIN_DMA_RIWT 0x20
/* Tx coalesce parameters */ /* Tx coalesce parameters */
#define STMMAC_COAL_TX_TIMER 40000 #define STMMAC_COAL_TX_TIMER 1000
#define STMMAC_MAX_COAL_TX_TICK 100000 #define STMMAC_MAX_COAL_TX_TICK 100000
#define STMMAC_TX_MAX_FRAMES 256 #define STMMAC_TX_MAX_FRAMES 256
#define STMMAC_TX_FRAMES 64 #define STMMAC_TX_FRAMES 25
/* Packets types */ /* Packets types */
enum packets_types { enum packets_types {
......
...@@ -48,6 +48,8 @@ struct stmmac_tx_info { ...@@ -48,6 +48,8 @@ struct stmmac_tx_info {
/* Frequently used values are kept adjacent for cache effect */ /* Frequently used values are kept adjacent for cache effect */
struct stmmac_tx_queue { struct stmmac_tx_queue {
u32 tx_count_frames;
struct timer_list txtimer;
u32 queue_index; u32 queue_index;
struct stmmac_priv *priv_data; struct stmmac_priv *priv_data;
struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp; struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp;
...@@ -73,7 +75,14 @@ struct stmmac_rx_queue { ...@@ -73,7 +75,14 @@ struct stmmac_rx_queue {
u32 rx_zeroc_thresh; u32 rx_zeroc_thresh;
dma_addr_t dma_rx_phy; dma_addr_t dma_rx_phy;
u32 rx_tail_addr; u32 rx_tail_addr;
};
struct stmmac_channel {
struct napi_struct napi ____cacheline_aligned_in_smp; struct napi_struct napi ____cacheline_aligned_in_smp;
struct stmmac_priv *priv_data;
u32 index;
int has_rx;
int has_tx;
}; };
struct stmmac_tc_entry { struct stmmac_tc_entry {
...@@ -109,14 +118,12 @@ struct stmmac_pps_cfg { ...@@ -109,14 +118,12 @@ struct stmmac_pps_cfg {
struct stmmac_priv { struct stmmac_priv {
/* Frequently used values are kept adjacent for cache effect */ /* Frequently used values are kept adjacent for cache effect */
u32 tx_count_frames;
u32 tx_coal_frames; u32 tx_coal_frames;
u32 tx_coal_timer; u32 tx_coal_timer;
int tx_coalesce; int tx_coalesce;
int hwts_tx_en; int hwts_tx_en;
bool tx_path_in_lpi_mode; bool tx_path_in_lpi_mode;
struct timer_list txtimer;
bool tso; bool tso;
unsigned int dma_buf_sz; unsigned int dma_buf_sz;
...@@ -137,6 +144,9 @@ struct stmmac_priv { ...@@ -137,6 +144,9 @@ struct stmmac_priv {
/* TX Queue */ /* TX Queue */
struct stmmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES]; struct stmmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES];
/* Generic channel for NAPI */
struct stmmac_channel channel[STMMAC_CH_MAX];
bool oldlink; bool oldlink;
int speed; int speed;
int oldduplex; int oldduplex;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#define MTL_MAX_RX_QUEUES 8 #define MTL_MAX_RX_QUEUES 8
#define MTL_MAX_TX_QUEUES 8 #define MTL_MAX_TX_QUEUES 8
#define STMMAC_CH_MAX 8
#define STMMAC_RX_COE_NONE 0 #define STMMAC_RX_COE_NONE 0
#define STMMAC_RX_COE_TYPE1 1 #define STMMAC_RX_COE_TYPE1 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment