net: stmmac: Improvements for -next
Subsystems (5)
v3 cover net: stmmac: Improvements for -next
Misc improvements for stmmac.
1) Adds more information regarding HW Caps in the DebugFS file.
2) Allows interrupts to be independently enabled or disabled so that we don't have to schedule both TX and RX NAPIs.
3) Stops using a magic number in coalesce timer re-arm.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Ripard <[email protected]>
Cc: Chen-Yu Tsai <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
Jose Abreu (3):
net: stmmac: Print more information in DebugFS DMA Capabilities file
net: stmmac: Let TX and RX interrupts be independently
enabled/disabled
net: stmmac: Always use TX coalesce timer value when rescheduling
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 24 +++++- drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h | 11 ++- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 47 ++++++++++-- drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h | 6 +- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 22 +++++- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 24 +++++- drivers/net/ethernet/stmicro/stmmac/hwif.h | 6 +- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 88 ++++++++++++++++------ 10 files changed, 180 insertions(+), 51 deletions(-)
Signature · 1 line
2.7.4
PATCH v3 1/3 net: stmmac: Print more information in DebugFS DMA Capabilities file
DMA Capabilites have grown but the DebugFS that shows this info has not been updated. Lets add the missing information.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 31 ++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +30 -1
@@ -4238,9 +4238,38 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v) priv->dma_cap.number_rx_channel);seq_printf (seq,"\tNumber of Additional TX channel: %d\n" , priv->dma_cap.number_tx_channel); +seq_printf (seq,"\tNumber of Additional RX queues: %d\n" , + priv->dma_cap.number_rx_queues); +seq_printf (seq,"\tNumber of Additional TX queues: %d\n" , + priv->dma_cap.number_tx_queues);seq_printf (seq,"\tEnhanced descriptors: %s\n" , (priv->dma_cap.enh_desc) ?"Y" :"N" ); - +seq_printf (seq,"\tTX Fifo Size: %d\n" , priv->dma_cap.tx_fifo_size); +seq_printf (seq,"\tRX Fifo Size: %d\n" , priv->dma_cap.rx_fifo_size); +seq_printf (seq,"\tHash Table Size: %d\n" , priv->dma_cap.hash_tb_sz); +seq_printf (seq,"\tTSO: %s\n" , priv->dma_cap.tsoen ?"Y" :"N" ); +seq_printf (seq,"\tNumber of PPS Outputs: %d\n" , + priv->dma_cap.pps_out_num); +seq_printf (seq,"\tSafety Features: %s\n" , + priv->dma_cap.asp ?"Y" :"N" ); +seq_printf (seq,"\tFlexible RX Parser: %s\n" , + priv->dma_cap.frpsel ?"Y" :"N" ); +seq_printf (seq,"\tEnhanced Addressing: %d\n" , + priv->dma_cap.addr64); +seq_printf (seq,"\tReceive Side Scaling: %s\n" , + priv->dma_cap.rssen ?"Y" :"N" ); +seq_printf (seq,"\tVLAN Hash Filtering: %s\n" , + priv->dma_cap.vlhash ?"Y" :"N" ); +seq_printf (seq,"\tSplit Header: %s\n" , + priv->dma_cap.sphen ?"Y" :"N" ); +seq_printf (seq,"\tVLAN TX Insertion: %s\n" , + priv->dma_cap.vlins ?"Y" :"N" ); +seq_printf (seq,"\tDouble VLAN: %s\n" , + priv->dma_cap.dvlan ?"Y" :"N" ); +seq_printf (seq,"\tNumber of L3/L4 Filters: %d\n" , + priv->dma_cap.l3l4fnum); +seq_printf (seq,"\tARP Offloading: %s\n" , + priv->dma_cap.arpoffsel ?"Y" :"N" );return 0 ; }DEFINE_SHOW_ATTRIBUTE (stmmac_dma_cap);
Signature · 1 line
2.7.4
PATCH v3 2/3 net: stmmac: Let TX and RX interrupts be independently enabled/disabled
In reply to Jose AbreuBy using this mechanism we can get rid of the not so nice method of scheduling TX NAPI when the RX was scheduled. No bandwidth reduction was seen with this change.
Changes from v1:
- Remove useless comment (Jakub)
- Do not bind the TX clean to NAPI budget (Jakub)
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Ripard <[email protected]>
Cc: Chen-Yu Tsai <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 24 ++++++++-- drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h | 11 +++-- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 47 ++++++++++++++---- drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h | 6 ++- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 22 +++++++-- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 24 ++++++++-- drivers/net/ethernet/stmicro/stmmac/hwif.h | 6 ++- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 55 +++++++++++++--------- 10 files changed, 149 insertions(+), 49 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +20 -4
@@ -335,14 +335,30 @@ static void sun8i_dwmac_dump_mac_regs(struct mac_device_info *hw, } } -static void sun8i_dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan) +static void sun8i_dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (EMAC_RX_INT |EMAC_TX_INT , ioaddr +EMAC_INT_EN ); +u32 value =readl (ioaddr +EMAC_INT_EN ); + +if (rx) + value |=EMAC_RX_INT ; +if (tx) + value |=EMAC_TX_INT ; + +writel (value, ioaddr +EMAC_INT_EN ); } -static void sun8i_dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan) +static void sun8i_dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (0 , ioaddr +EMAC_INT_EN ); +u32 value =readl (ioaddr +EMAC_INT_EN ); + +if (rx) + value &= ~EMAC_RX_INT ; +if (tx) + value &= ~EMAC_TX_INT ; + +writel (value, ioaddr +EMAC_INT_EN ); }static void sun8i_dwmac_dma_start_tx (void __iomem *ioaddr,u32 chan)
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h +8 -3
@@ -168,6 +168,8 @@/* DMA default interrupt mask for 4.00 */ #define DMA_CHAN_INTR_DEFAULT_MASK (DMA_CHAN_INTR_NORMAL | \ DMA_CHAN_INTR_ABNORMAL) +#define DMA_CHAN_INTR_DEFAULT_RX (DMA_CHAN_INTR_ENA_RIE) +#define DMA_CHAN_INTR_DEFAULT_TX (DMA_CHAN_INTR_ENA_TIE)#define DMA_CHAN_INTR_NORMAL_4_10 (DMA_CHAN_INTR_ENA_NIE_4_10 | \ DMA_CHAN_INTR_ENA_RIE | \
@@ -178,6 +180,8 @@/* DMA default interrupt mask for 4.10a */ #define DMA_CHAN_INTR_DEFAULT_MASK_4_10 (DMA_CHAN_INTR_NORMAL_4_10 | \ DMA_CHAN_INTR_ABNORMAL_4_10) +#define DMA_CHAN_INTR_DEFAULT_RX_4_10 (DMA_CHAN_INTR_ENA_RIE) +#define DMA_CHAN_INTR_DEFAULT_TX_4_10 (DMA_CHAN_INTR_ENA_TIE)/* channel 0 specific fields */ #define DMA_CHAN0_DBG_STAT_TPS GENMASK(15, 12)
@@ -186,9 +190,10 @@#define DMA_CHAN0_DBG_STAT_RPS_SHIFT 8int dwmac4_dma_reset (void __iomem *ioaddr); -void dwmac4_enable_dma_irq (void __iomem *ioaddr,u32 chan); -void dwmac410_enable_dma_irq (void __iomem *ioaddr,u32 chan); -void dwmac4_disable_dma_irq (void __iomem *ioaddr,u32 chan); +void dwmac4_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac410_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac4_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac410_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx);void dwmac4_dma_start_tx (void __iomem *ioaddr,u32 chan);void dwmac4_dma_stop_tx (void __iomem *ioaddr,u32 chan);void dwmac4_dma_start_rx (void __iomem *ioaddr,u32 chan);
drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +39 -8
60 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h +4 -2
@@ -96,6 +96,8 @@/* DMA default interrupt mask */ #define DMA_INTR_DEFAULT_MASK (DMA_INTR_NORMAL | DMA_INTR_ABNORMAL) +#define DMA_INTR_DEFAULT_RX (DMA_INTR_ENA_RIE) +#define DMA_INTR_DEFAULT_TX (DMA_INTR_ENA_TIE)/* DMA Status register defines */ #define DMA_STATUS_GLPII 0x40000000/* GMAC LPI interrupt */
@@ -130,8 +132,8 @@#define NUM_DWMAC1000_DMA_REGS 23void dwmac_enable_dma_transmission (void __iomem *ioaddr); -void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan); -void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan); +void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx);void dwmac_dma_start_tx (void __iomem *ioaddr,u32 chan);void dwmac_dma_stop_tx (void __iomem *ioaddr,u32 chan);void dwmac_dma_start_rx (void __iomem *ioaddr,u32 chan);
drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c +18 -4
@@ -37,14 +37,28 @@ void dwmac_enable_dma_transmission(void __iomem *ioaddr)writel (1 , ioaddr +DMA_XMT_POLL_DEMAND ); } -void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan) +void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx) { -writel (DMA_INTR_DEFAULT_MASK , ioaddr +DMA_INTR_ENA ); +u32 value =readl (ioaddr +DMA_INTR_ENA ); + +if (rx) + value |=DMA_INTR_DEFAULT_RX ; +if (tx) + value |=DMA_INTR_DEFAULT_TX ; + +writel (value, ioaddr +DMA_INTR_ENA ); } -void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan) +void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx) { -writel (0 , ioaddr +DMA_INTR_ENA ); +u32 value =readl (ioaddr +DMA_INTR_ENA ); + +if (rx) + value &= ~DMA_INTR_DEFAULT_RX ; +if (tx) + value &= ~DMA_INTR_DEFAULT_TX ; + +writel (value, ioaddr +DMA_INTR_ENA ); }void dwmac_dma_start_tx (void __iomem *ioaddr,u32 chan)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +2 -0
@@ -361,6 +361,8 @@#define XGMAC_TIE BIT(0)#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | XGMAC_RBUE | \ XGMAC_RIE | XGMAC_TIE) +#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RBUE | XGMAC_RIE) +#define XGMAC_DMA_INT_DEFAULT_TX (XGMAC_TIE)#define XGMAC_DMA_CH_Rx_WATCHDOG (x) (0x0000313c + (0x80 * (x)))#define XGMAC_RWT GENMASK(7, 0)#define XGMAC_DMA_CH_STATUS (x) (0x00003160 + (0x80 * (x)))
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +20 -4
@@ -248,14 +248,30 @@ static void dwxgmac2_dma_tx_mode(void __iomem *ioaddr, int mode,writel (value, ioaddr +XGMAC_MTL_TXQ_OPMODE (channel)); } -static void dwxgmac2_enable_dma_irq (void __iomem *ioaddr,u32 chan) +static void dwxgmac2_enable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (XGMAC_DMA_INT_DEFAULT_EN , ioaddr +XGMAC_DMA_CH_INT_EN (chan)); +u32 value =readl (ioaddr +XGMAC_DMA_CH_INT_EN (chan)); + +if (rx) + value |=XGMAC_DMA_INT_DEFAULT_RX ; +if (tx) + value |=XGMAC_DMA_INT_DEFAULT_TX ; + +writel (value, ioaddr +XGMAC_DMA_CH_INT_EN (chan)); } -static void dwxgmac2_disable_dma_irq (void __iomem *ioaddr,u32 chan) +static void dwxgmac2_disable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (0 , ioaddr +XGMAC_DMA_CH_INT_EN (chan)); +u32 value =readl (ioaddr +XGMAC_DMA_CH_INT_EN (chan)); + +if (rx) + value &= ~XGMAC_DMA_INT_DEFAULT_RX ; +if (tx) + value &= ~XGMAC_DMA_INT_DEFAULT_TX ; + +writel (value, ioaddr +XGMAC_DMA_CH_INT_EN (chan)); }static void dwxgmac2_dma_start_tx (void __iomem *ioaddr,u32 chan)
drivers/net/ethernet/stmicro/stmmac/hwif.h +4 -2
@@ -187,8 +187,10 @@ struct stmmac_dma_ops {void (*dma_diagnostic_fr) (void *data,struct stmmac_extra_stats *x,void __iomem *ioaddr);void (*enable_dma_transmission) (void __iomem *ioaddr); -void (*enable_dma_irq)(void __iomem *ioaddr,u32 chan); -void (*disable_dma_irq)(void __iomem *ioaddr,u32 chan); +void (*enable_dma_irq)(void __iomem *ioaddr,u32 chan, +bool rx,bool tx); +void (*disable_dma_irq)(void __iomem *ioaddr,u32 chan, +bool rx,bool tx);void (*start_tx)(void __iomem *ioaddr,u32 chan);void (*stop_tx)(void __iomem *ioaddr,u32 chan);void (*start_rx)(void __iomem *ioaddr,u32 chan);
drivers/net/ethernet/stmicro/stmmac/stmmac.h +1 -0
@@ -88,6 +88,7 @@ struct stmmac_channel {struct napi_struct rx_napi____cacheline_aligned_in_smp ;struct napi_struct tx_napi____cacheline_aligned_in_smp ;struct stmmac_priv *priv_data; +spinlock_t lock;u32 index; };
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +33 -22
100 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 3/3 net: stmmac: Always use TX coalesce timer value when rescheduling
In reply to Jose AbreuWhen we have pending packets we re-arm the TX timer with a magic value.
This changes the re-arm of the timer from 10us to the user-defined coalesce value. As we support different speeds, having a magic value of 10us can be either too short or to large depending on the speed so we let user configure it. The default value of the timer is 1ms but it can be reconfigured by ethtool.
Changes from v1:
- Reword commit message (Jakub)
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -1975,7 +1975,7 @@ static int stmmac_tx_clean(struct stmmac_priv *priv, int budget, u32 queue)/* We still have pending packets, let's call for a new scheduling */ if (tx_q->dirty_tx != tx_q->cur_tx) -mod_timer (&tx_q->txtimer,STMMAC_COAL_TIMER (10 )); +mod_timer (&tx_q->txtimer,STMMAC_COAL_TIMER (priv->tx_coal_timer));__netif_tx_unlock_bh (netdev_get_tx_queue (priv->dev, queue));
Signature · 1 line
2.7.4
David Miller
maintainerFrom: Jose Abreu <[email protected]>
Date: Wed, 18 Dec 2019 11:24:42 +0100
Quoted 8 lines
Misc improvements for stmmac.
1) Adds more information regarding HW Caps in the DebugFS file.
2) Allows interrupts to be independently enabled or disabled so that we don't have to schedule both TX and RX NAPIs.
3) Stops using a magic number in coalesce timer re-arm.
Series applied, thanks.