net: stmmac: Add ethtool register dump for XGMAC cores
Add the ethtool interface to dump the register map in XGMAC cores. Changes from v2: - Remove uneeded memset (Jakub) Signed-off-by: Jose Abreu <joabreu@synopsys.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
95eaf3cd0a
commit
bfc5653069
|
@ -244,6 +244,7 @@
|
||||||
#define XGMAC_RXOVFIS BIT(16)
|
#define XGMAC_RXOVFIS BIT(16)
|
||||||
#define XGMAC_ABPSIS BIT(1)
|
#define XGMAC_ABPSIS BIT(1)
|
||||||
#define XGMAC_TXUNFIS BIT(0)
|
#define XGMAC_TXUNFIS BIT(0)
|
||||||
|
#define XGMAC_MAC_REGSIZE (XGMAC_MTL_QINT_STATUS(15) / 4)
|
||||||
|
|
||||||
/* DMA Registers */
|
/* DMA Registers */
|
||||||
#define XGMAC_DMA_MODE 0x00003000
|
#define XGMAC_DMA_MODE 0x00003000
|
||||||
|
@ -321,6 +322,7 @@
|
||||||
#define XGMAC_TBU BIT(2)
|
#define XGMAC_TBU BIT(2)
|
||||||
#define XGMAC_TPS BIT(1)
|
#define XGMAC_TPS BIT(1)
|
||||||
#define XGMAC_TI BIT(0)
|
#define XGMAC_TI BIT(0)
|
||||||
|
#define XGMAC_REGSIZE ((0x0000317c + (0x80 * 15)) / 4)
|
||||||
|
|
||||||
/* Descriptors */
|
/* Descriptors */
|
||||||
#define XGMAC_TDES2_IOC BIT(31)
|
#define XGMAC_TDES2_IOC BIT(31)
|
||||||
|
|
|
@ -239,6 +239,15 @@ static void dwxgmac2_config_cbs(struct mac_device_info *hw,
|
||||||
writel(value, ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(queue));
|
writel(value, ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(queue));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dwxgmac2_dump_regs(struct mac_device_info *hw, u32 *reg_space)
|
||||||
|
{
|
||||||
|
void __iomem *ioaddr = hw->pcsr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < XGMAC_MAC_REGSIZE; i++)
|
||||||
|
reg_space[i] = readl(ioaddr + i * 4);
|
||||||
|
}
|
||||||
|
|
||||||
static int dwxgmac2_host_irq_status(struct mac_device_info *hw,
|
static int dwxgmac2_host_irq_status(struct mac_device_info *hw,
|
||||||
struct stmmac_extra_stats *x)
|
struct stmmac_extra_stats *x)
|
||||||
{
|
{
|
||||||
|
@ -1079,7 +1088,7 @@ const struct stmmac_ops dwxgmac210_ops = {
|
||||||
.set_mtl_tx_queue_weight = dwxgmac2_set_mtl_tx_queue_weight,
|
.set_mtl_tx_queue_weight = dwxgmac2_set_mtl_tx_queue_weight,
|
||||||
.map_mtl_to_dma = dwxgmac2_map_mtl_to_dma,
|
.map_mtl_to_dma = dwxgmac2_map_mtl_to_dma,
|
||||||
.config_cbs = dwxgmac2_config_cbs,
|
.config_cbs = dwxgmac2_config_cbs,
|
||||||
.dump_regs = NULL,
|
.dump_regs = dwxgmac2_dump_regs,
|
||||||
.host_irq_status = dwxgmac2_host_irq_status,
|
.host_irq_status = dwxgmac2_host_irq_status,
|
||||||
.host_mtl_irq_status = dwxgmac2_host_mtl_irq_status,
|
.host_mtl_irq_status = dwxgmac2_host_mtl_irq_status,
|
||||||
.flow_ctrl = dwxgmac2_flow_ctrl,
|
.flow_ctrl = dwxgmac2_flow_ctrl,
|
||||||
|
|
|
@ -128,6 +128,14 @@ static void dwxgmac2_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
|
||||||
writel(XGMAC_RDPS, ioaddr + XGMAC_RX_EDMA_CTRL);
|
writel(XGMAC_RDPS, ioaddr + XGMAC_RX_EDMA_CTRL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dwxgmac2_dma_dump_regs(void __iomem *ioaddr, u32 *reg_space)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = (XGMAC_DMA_MODE / 4); i < XGMAC_REGSIZE; i++)
|
||||||
|
reg_space[i] = readl(ioaddr + i * 4);
|
||||||
|
}
|
||||||
|
|
||||||
static void dwxgmac2_dma_rx_mode(void __iomem *ioaddr, int mode,
|
static void dwxgmac2_dma_rx_mode(void __iomem *ioaddr, int mode,
|
||||||
u32 channel, int fifosz, u8 qmode)
|
u32 channel, int fifosz, u8 qmode)
|
||||||
{
|
{
|
||||||
|
@ -496,7 +504,7 @@ const struct stmmac_dma_ops dwxgmac210_dma_ops = {
|
||||||
.init_rx_chan = dwxgmac2_dma_init_rx_chan,
|
.init_rx_chan = dwxgmac2_dma_init_rx_chan,
|
||||||
.init_tx_chan = dwxgmac2_dma_init_tx_chan,
|
.init_tx_chan = dwxgmac2_dma_init_tx_chan,
|
||||||
.axi = dwxgmac2_dma_axi,
|
.axi = dwxgmac2_dma_axi,
|
||||||
.dump_regs = NULL,
|
.dump_regs = dwxgmac2_dma_dump_regs,
|
||||||
.dma_rx_mode = dwxgmac2_dma_rx_mode,
|
.dma_rx_mode = dwxgmac2_dma_rx_mode,
|
||||||
.dma_tx_mode = dwxgmac2_dma_tx_mode,
|
.dma_tx_mode = dwxgmac2_dma_tx_mode,
|
||||||
.enable_dma_irq = dwxgmac2_enable_dma_irq,
|
.enable_dma_irq = dwxgmac2_enable_dma_irq,
|
||||||
|
|
|
@ -18,10 +18,12 @@
|
||||||
|
|
||||||
#include "stmmac.h"
|
#include "stmmac.h"
|
||||||
#include "dwmac_dma.h"
|
#include "dwmac_dma.h"
|
||||||
|
#include "dwxgmac2.h"
|
||||||
|
|
||||||
#define REG_SPACE_SIZE 0x1060
|
#define REG_SPACE_SIZE 0x1060
|
||||||
#define MAC100_ETHTOOL_NAME "st_mac100"
|
#define MAC100_ETHTOOL_NAME "st_mac100"
|
||||||
#define GMAC_ETHTOOL_NAME "st_gmac"
|
#define GMAC_ETHTOOL_NAME "st_gmac"
|
||||||
|
#define XGMAC_ETHTOOL_NAME "st_xgmac"
|
||||||
|
|
||||||
#define ETHTOOL_DMA_OFFSET 55
|
#define ETHTOOL_DMA_OFFSET 55
|
||||||
|
|
||||||
|
@ -260,6 +262,8 @@ static void stmmac_ethtool_getdrvinfo(struct net_device *dev,
|
||||||
|
|
||||||
if (priv->plat->has_gmac || priv->plat->has_gmac4)
|
if (priv->plat->has_gmac || priv->plat->has_gmac4)
|
||||||
strlcpy(info->driver, GMAC_ETHTOOL_NAME, sizeof(info->driver));
|
strlcpy(info->driver, GMAC_ETHTOOL_NAME, sizeof(info->driver));
|
||||||
|
else if (priv->plat->has_xgmac)
|
||||||
|
strlcpy(info->driver, XGMAC_ETHTOOL_NAME, sizeof(info->driver));
|
||||||
else
|
else
|
||||||
strlcpy(info->driver, MAC100_ETHTOOL_NAME,
|
strlcpy(info->driver, MAC100_ETHTOOL_NAME,
|
||||||
sizeof(info->driver));
|
sizeof(info->driver));
|
||||||
|
@ -405,23 +409,28 @@ static int stmmac_check_if_running(struct net_device *dev)
|
||||||
|
|
||||||
static int stmmac_ethtool_get_regs_len(struct net_device *dev)
|
static int stmmac_ethtool_get_regs_len(struct net_device *dev)
|
||||||
{
|
{
|
||||||
|
struct stmmac_priv *priv = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (priv->plat->has_xgmac)
|
||||||
|
return XGMAC_REGSIZE * 4;
|
||||||
return REG_SPACE_SIZE;
|
return REG_SPACE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stmmac_ethtool_gregs(struct net_device *dev,
|
static void stmmac_ethtool_gregs(struct net_device *dev,
|
||||||
struct ethtool_regs *regs, void *space)
|
struct ethtool_regs *regs, void *space)
|
||||||
{
|
{
|
||||||
u32 *reg_space = (u32 *) space;
|
|
||||||
|
|
||||||
struct stmmac_priv *priv = netdev_priv(dev);
|
struct stmmac_priv *priv = netdev_priv(dev);
|
||||||
|
u32 *reg_space = (u32 *) space;
|
||||||
memset(reg_space, 0x0, REG_SPACE_SIZE);
|
|
||||||
|
|
||||||
stmmac_dump_mac_regs(priv, priv->hw, reg_space);
|
stmmac_dump_mac_regs(priv, priv->hw, reg_space);
|
||||||
stmmac_dump_dma_regs(priv, priv->ioaddr, reg_space);
|
stmmac_dump_dma_regs(priv, priv->ioaddr, reg_space);
|
||||||
/* Copy DMA registers to where ethtool expects them */
|
|
||||||
memcpy(®_space[ETHTOOL_DMA_OFFSET], ®_space[DMA_BUS_MODE / 4],
|
if (!priv->plat->has_xgmac) {
|
||||||
NUM_DWMAC1000_DMA_REGS * 4);
|
/* Copy DMA registers to where ethtool expects them */
|
||||||
|
memcpy(®_space[ETHTOOL_DMA_OFFSET],
|
||||||
|
®_space[DMA_BUS_MODE / 4],
|
||||||
|
NUM_DWMAC1000_DMA_REGS * 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stmmac_nway_reset(struct net_device *dev)
|
static int stmmac_nway_reset(struct net_device *dev)
|
||||||
|
|
Loading…
Reference in New Issue