Commit de90573e authored by David S. Miller's avatar David S. Miller

Merge branch 'net-stmmac-Some-improvements-and-a-fix'

Jose Abreu says:

====================
net: stmmac: Some improvements and a fix

Some performace improvements (01/03 and 03/03) and a fix (02/03), all for -next.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 12479f62 2af6106a
...@@ -3,6 +3,7 @@ config STMMAC_ETH ...@@ -3,6 +3,7 @@ config STMMAC_ETH
tristate "STMicroelectronics Multi-Gigabit Ethernet driver" tristate "STMicroelectronics Multi-Gigabit Ethernet driver"
depends on HAS_IOMEM && HAS_DMA depends on HAS_IOMEM && HAS_DMA
select MII select MII
select PAGE_POOL
select PHYLINK select PHYLINK
select CRC32 select CRC32
imply PTP_1588_CLOCK imply PTP_1588_CLOCK
......
...@@ -252,6 +252,7 @@ struct stmmac_safety_stats { ...@@ -252,6 +252,7 @@ struct stmmac_safety_stats {
#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 1 #define STMMAC_TX_FRAMES 1
#define STMMAC_RX_FRAMES 25
/* Packets types */ /* Packets types */
enum packets_types { enum packets_types {
......
...@@ -289,18 +289,18 @@ static void sun8i_dwmac_dma_init(void __iomem *ioaddr, ...@@ -289,18 +289,18 @@ static void sun8i_dwmac_dma_init(void __iomem *ioaddr,
static void sun8i_dwmac_dma_init_rx(void __iomem *ioaddr, static void sun8i_dwmac_dma_init_rx(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan) dma_addr_t dma_rx_phy, u32 chan)
{ {
/* Write RX descriptors address */ /* Write RX descriptors address */
writel(dma_rx_phy, ioaddr + EMAC_RX_DESC_LIST); writel(lower_32_bits(dma_rx_phy), ioaddr + EMAC_RX_DESC_LIST);
} }
static void sun8i_dwmac_dma_init_tx(void __iomem *ioaddr, static void sun8i_dwmac_dma_init_tx(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan) dma_addr_t dma_tx_phy, u32 chan)
{ {
/* Write TX descriptors address */ /* Write TX descriptors address */
writel(dma_tx_phy, ioaddr + EMAC_TX_DESC_LIST); writel(lower_32_bits(dma_tx_phy), ioaddr + EMAC_TX_DESC_LIST);
} }
/* sun8i_dwmac_dump_regs() - Dump EMAC address space /* sun8i_dwmac_dump_regs() - Dump EMAC address space
......
...@@ -112,18 +112,18 @@ static void dwmac1000_dma_init(void __iomem *ioaddr, ...@@ -112,18 +112,18 @@ static void dwmac1000_dma_init(void __iomem *ioaddr,
static void dwmac1000_dma_init_rx(void __iomem *ioaddr, static void dwmac1000_dma_init_rx(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan) dma_addr_t dma_rx_phy, u32 chan)
{ {
/* RX descriptor base address list must be written into DMA CSR3 */ /* RX descriptor base address list must be written into DMA CSR3 */
writel(dma_rx_phy, ioaddr + DMA_RCV_BASE_ADDR); writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_RCV_BASE_ADDR);
} }
static void dwmac1000_dma_init_tx(void __iomem *ioaddr, static void dwmac1000_dma_init_tx(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan) dma_addr_t dma_tx_phy, u32 chan)
{ {
/* TX descriptor base address list must be written into DMA CSR4 */ /* TX descriptor base address list must be written into DMA CSR4 */
writel(dma_tx_phy, ioaddr + DMA_TX_BASE_ADDR); writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_TX_BASE_ADDR);
} }
static u32 dwmac1000_configure_fc(u32 csr6, int rxfifosz) static u32 dwmac1000_configure_fc(u32 csr6, int rxfifosz)
......
...@@ -31,18 +31,18 @@ static void dwmac100_dma_init(void __iomem *ioaddr, ...@@ -31,18 +31,18 @@ static void dwmac100_dma_init(void __iomem *ioaddr,
static void dwmac100_dma_init_rx(void __iomem *ioaddr, static void dwmac100_dma_init_rx(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan) dma_addr_t dma_rx_phy, u32 chan)
{ {
/* RX descriptor base addr lists must be written into DMA CSR3 */ /* RX descriptor base addr lists must be written into DMA CSR3 */
writel(dma_rx_phy, ioaddr + DMA_RCV_BASE_ADDR); writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_RCV_BASE_ADDR);
} }
static void dwmac100_dma_init_tx(void __iomem *ioaddr, static void dwmac100_dma_init_tx(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan) dma_addr_t dma_tx_phy, u32 chan)
{ {
/* TX descriptor base addr lists must be written into DMA CSR4 */ /* TX descriptor base addr lists must be written into DMA CSR4 */
writel(dma_tx_phy, ioaddr + DMA_TX_BASE_ADDR); writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_TX_BASE_ADDR);
} }
/* Store and Forward capability is not used at all. /* Store and Forward capability is not used at all.
......
...@@ -70,7 +70,7 @@ static void dwmac4_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi) ...@@ -70,7 +70,7 @@ static void dwmac4_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
static void dwmac4_dma_init_rx_chan(void __iomem *ioaddr, static void dwmac4_dma_init_rx_chan(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan) dma_addr_t dma_rx_phy, u32 chan)
{ {
u32 value; u32 value;
u32 rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl; u32 rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
...@@ -79,12 +79,12 @@ static void dwmac4_dma_init_rx_chan(void __iomem *ioaddr, ...@@ -79,12 +79,12 @@ static void dwmac4_dma_init_rx_chan(void __iomem *ioaddr,
value = value | (rxpbl << DMA_BUS_MODE_RPBL_SHIFT); value = value | (rxpbl << DMA_BUS_MODE_RPBL_SHIFT);
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan)); writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan));
writel(dma_rx_phy, ioaddr + DMA_CHAN_RX_BASE_ADDR(chan)); writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_CHAN_RX_BASE_ADDR(chan));
} }
static void dwmac4_dma_init_tx_chan(void __iomem *ioaddr, static void dwmac4_dma_init_tx_chan(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan) dma_addr_t dma_tx_phy, u32 chan)
{ {
u32 value; u32 value;
u32 txpbl = dma_cfg->txpbl ?: dma_cfg->pbl; u32 txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
...@@ -97,7 +97,7 @@ static void dwmac4_dma_init_tx_chan(void __iomem *ioaddr, ...@@ -97,7 +97,7 @@ static void dwmac4_dma_init_tx_chan(void __iomem *ioaddr,
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan)); writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan));
writel(dma_tx_phy, ioaddr + DMA_CHAN_TX_BASE_ADDR(chan)); writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_CHAN_TX_BASE_ADDR(chan));
} }
static void dwmac4_dma_init_channel(void __iomem *ioaddr, static void dwmac4_dma_init_channel(void __iomem *ioaddr,
......
...@@ -199,7 +199,9 @@ ...@@ -199,7 +199,9 @@
#define XGMAC_RxPBL GENMASK(21, 16) #define XGMAC_RxPBL GENMASK(21, 16)
#define XGMAC_RxPBL_SHIFT 16 #define XGMAC_RxPBL_SHIFT 16
#define XGMAC_RXST BIT(0) #define XGMAC_RXST BIT(0)
#define XGMAC_DMA_CH_TxDESC_HADDR(x) (0x00003110 + (0x80 * (x)))
#define XGMAC_DMA_CH_TxDESC_LADDR(x) (0x00003114 + (0x80 * (x))) #define XGMAC_DMA_CH_TxDESC_LADDR(x) (0x00003114 + (0x80 * (x)))
#define XGMAC_DMA_CH_RxDESC_HADDR(x) (0x00003118 + (0x80 * (x)))
#define XGMAC_DMA_CH_RxDESC_LADDR(x) (0x0000311c + (0x80 * (x))) #define XGMAC_DMA_CH_RxDESC_LADDR(x) (0x0000311c + (0x80 * (x)))
#define XGMAC_DMA_CH_TxDESC_TAIL_LPTR(x) (0x00003124 + (0x80 * (x))) #define XGMAC_DMA_CH_TxDESC_TAIL_LPTR(x) (0x00003124 + (0x80 * (x)))
#define XGMAC_DMA_CH_RxDESC_TAIL_LPTR(x) (0x0000312c + (0x80 * (x))) #define XGMAC_DMA_CH_RxDESC_TAIL_LPTR(x) (0x0000312c + (0x80 * (x)))
......
...@@ -44,7 +44,7 @@ static void dwxgmac2_dma_init_chan(void __iomem *ioaddr, ...@@ -44,7 +44,7 @@ static void dwxgmac2_dma_init_chan(void __iomem *ioaddr,
static void dwxgmac2_dma_init_rx_chan(void __iomem *ioaddr, static void dwxgmac2_dma_init_rx_chan(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan) dma_addr_t phy, u32 chan)
{ {
u32 rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl; u32 rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
u32 value; u32 value;
...@@ -54,12 +54,13 @@ static void dwxgmac2_dma_init_rx_chan(void __iomem *ioaddr, ...@@ -54,12 +54,13 @@ static void dwxgmac2_dma_init_rx_chan(void __iomem *ioaddr,
value |= (rxpbl << XGMAC_RxPBL_SHIFT) & XGMAC_RxPBL; value |= (rxpbl << XGMAC_RxPBL_SHIFT) & XGMAC_RxPBL;
writel(value, ioaddr + XGMAC_DMA_CH_RX_CONTROL(chan)); writel(value, ioaddr + XGMAC_DMA_CH_RX_CONTROL(chan));
writel(dma_rx_phy, ioaddr + XGMAC_DMA_CH_RxDESC_LADDR(chan)); writel(upper_32_bits(phy), ioaddr + XGMAC_DMA_CH_RxDESC_HADDR(chan));
writel(lower_32_bits(phy), ioaddr + XGMAC_DMA_CH_RxDESC_LADDR(chan));
} }
static void dwxgmac2_dma_init_tx_chan(void __iomem *ioaddr, static void dwxgmac2_dma_init_tx_chan(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan) dma_addr_t phy, u32 chan)
{ {
u32 txpbl = dma_cfg->txpbl ?: dma_cfg->pbl; u32 txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
u32 value; u32 value;
...@@ -70,7 +71,8 @@ static void dwxgmac2_dma_init_tx_chan(void __iomem *ioaddr, ...@@ -70,7 +71,8 @@ static void dwxgmac2_dma_init_tx_chan(void __iomem *ioaddr,
value |= XGMAC_OSP; value |= XGMAC_OSP;
writel(value, ioaddr + XGMAC_DMA_CH_TX_CONTROL(chan)); writel(value, ioaddr + XGMAC_DMA_CH_TX_CONTROL(chan));
writel(dma_tx_phy, ioaddr + XGMAC_DMA_CH_TxDESC_LADDR(chan)); writel(upper_32_bits(phy), ioaddr + XGMAC_DMA_CH_TxDESC_HADDR(chan));
writel(lower_32_bits(phy), ioaddr + XGMAC_DMA_CH_TxDESC_LADDR(chan));
} }
static void dwxgmac2_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi) static void dwxgmac2_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
......
...@@ -150,10 +150,10 @@ struct stmmac_dma_ops { ...@@ -150,10 +150,10 @@ struct stmmac_dma_ops {
struct stmmac_dma_cfg *dma_cfg, u32 chan); struct stmmac_dma_cfg *dma_cfg, u32 chan);
void (*init_rx_chan)(void __iomem *ioaddr, void (*init_rx_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_rx_phy, u32 chan); dma_addr_t phy, u32 chan);
void (*init_tx_chan)(void __iomem *ioaddr, void (*init_tx_chan)(void __iomem *ioaddr,
struct stmmac_dma_cfg *dma_cfg, struct stmmac_dma_cfg *dma_cfg,
u32 dma_tx_phy, u32 chan); dma_addr_t phy, u32 chan);
/* Configure the AXI Bus Mode Register */ /* Configure the AXI Bus Mode Register */
void (*axi)(void __iomem *ioaddr, struct stmmac_axi *axi); void (*axi)(void __iomem *ioaddr, struct stmmac_axi *axi);
/* Dump DMA registers */ /* Dump DMA registers */
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/ptp_clock_kernel.h> #include <linux/ptp_clock_kernel.h>
#include <linux/net_tstamp.h> #include <linux/net_tstamp.h>
#include <linux/reset.h> #include <linux/reset.h>
#include <net/page_pool.h>
struct stmmac_resources { struct stmmac_resources {
void __iomem *addr; void __iomem *addr;
...@@ -54,13 +55,19 @@ struct stmmac_tx_queue { ...@@ -54,13 +55,19 @@ struct stmmac_tx_queue {
u32 mss; u32 mss;
}; };
struct stmmac_rx_buffer {
struct page *page;
dma_addr_t addr;
};
struct stmmac_rx_queue { struct stmmac_rx_queue {
u32 rx_count_frames;
u32 queue_index; u32 queue_index;
struct page_pool *page_pool;
struct stmmac_rx_buffer *buf_pool;
struct stmmac_priv *priv_data; struct stmmac_priv *priv_data;
struct dma_extended_desc *dma_erx; struct dma_extended_desc *dma_erx;
struct dma_desc *dma_rx ____cacheline_aligned_in_smp; struct dma_desc *dma_rx ____cacheline_aligned_in_smp;
struct sk_buff **rx_skbuff;
dma_addr_t *rx_skbuff_dma;
unsigned int cur_rx; unsigned int cur_rx;
unsigned int dirty_rx; unsigned int dirty_rx;
u32 rx_zeroc_thresh; u32 rx_zeroc_thresh;
...@@ -110,6 +117,7 @@ struct stmmac_priv { ...@@ -110,6 +117,7 @@ struct stmmac_priv {
/* Frequently used values are kept adjacent for cache effect */ /* Frequently used values are kept adjacent for cache effect */
u32 tx_coal_frames; u32 tx_coal_frames;
u32 tx_coal_timer; u32 tx_coal_timer;
u32 rx_coal_frames;
int tx_coalesce; int tx_coalesce;
int hwts_tx_en; int hwts_tx_en;
......
...@@ -701,8 +701,10 @@ static int stmmac_get_coalesce(struct net_device *dev, ...@@ -701,8 +701,10 @@ static int stmmac_get_coalesce(struct net_device *dev,
ec->tx_coalesce_usecs = priv->tx_coal_timer; ec->tx_coalesce_usecs = priv->tx_coal_timer;
ec->tx_max_coalesced_frames = priv->tx_coal_frames; ec->tx_max_coalesced_frames = priv->tx_coal_frames;
if (priv->use_riwt) if (priv->use_riwt) {
ec->rx_max_coalesced_frames = priv->rx_coal_frames;
ec->rx_coalesce_usecs = stmmac_riwt2usec(priv->rx_riwt, priv); ec->rx_coalesce_usecs = stmmac_riwt2usec(priv->rx_riwt, priv);
}
return 0; return 0;
} }
...@@ -715,7 +717,7 @@ static int stmmac_set_coalesce(struct net_device *dev, ...@@ -715,7 +717,7 @@ static int stmmac_set_coalesce(struct net_device *dev,
unsigned int rx_riwt; unsigned int rx_riwt;
/* Check not supported parameters */ /* Check not supported parameters */
if ((ec->rx_max_coalesced_frames) || (ec->rx_coalesce_usecs_irq) || if ((ec->rx_coalesce_usecs_irq) ||
(ec->rx_max_coalesced_frames_irq) || (ec->tx_coalesce_usecs_irq) || (ec->rx_max_coalesced_frames_irq) || (ec->tx_coalesce_usecs_irq) ||
(ec->use_adaptive_rx_coalesce) || (ec->use_adaptive_tx_coalesce) || (ec->use_adaptive_rx_coalesce) || (ec->use_adaptive_tx_coalesce) ||
(ec->pkt_rate_low) || (ec->rx_coalesce_usecs_low) || (ec->pkt_rate_low) || (ec->rx_coalesce_usecs_low) ||
...@@ -749,6 +751,7 @@ static int stmmac_set_coalesce(struct net_device *dev, ...@@ -749,6 +751,7 @@ static int stmmac_set_coalesce(struct net_device *dev,
/* Only copy relevant parameters, ignore all others. */ /* Only copy relevant parameters, ignore all others. */
priv->tx_coal_frames = ec->tx_max_coalesced_frames; priv->tx_coal_frames = ec->tx_max_coalesced_frames;
priv->tx_coal_timer = ec->tx_coalesce_usecs; priv->tx_coal_timer = ec->tx_coalesce_usecs;
priv->rx_coal_frames = ec->rx_max_coalesced_frames;
priv->rx_riwt = rx_riwt; priv->rx_riwt = rx_riwt;
stmmac_rx_watchdog(priv, priv->ioaddr, priv->rx_riwt, rx_cnt); stmmac_rx_watchdog(priv, priv->ioaddr, priv->rx_riwt, rx_cnt);
......
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