Commit 36ff7c1e authored by Alexandre TORGUE's avatar Alexandre TORGUE Committed by David S. Miller

stmmac: enhance mmc counter management

For gmac3, the MMC addr map is: 0x100 - 0x2fc
For gmac4, the MMC addr map is: 0x700 - 0x8fc

So instead of adding 0x600 to the IO address when setup the mmc,
the RMON base address is saved inside the private structure and
then used to manage the counters.
Signed-off-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarAlexandre TORGUE <alexandre.torgue@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 477286b5
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
* current value.*/ * current value.*/
#define MMC_CNTRL_PRESET 0x10 #define MMC_CNTRL_PRESET 0x10
#define MMC_CNTRL_FULL_HALF_PRESET 0x20 #define MMC_CNTRL_FULL_HALF_PRESET 0x20
#define MMC_GMAC4_OFFSET 0x700
#define MMC_GMAC3_X_OFFSET 0x100
struct stmmac_counters { struct stmmac_counters {
unsigned int mmc_tx_octetcount_gb; unsigned int mmc_tx_octetcount_gb;
unsigned int mmc_tx_framecount_gb; unsigned int mmc_tx_framecount_gb;
......
...@@ -128,6 +128,7 @@ struct stmmac_priv { ...@@ -128,6 +128,7 @@ struct stmmac_priv {
int use_riwt; int use_riwt;
int irq_wake; int irq_wake;
spinlock_t ptp_lock; spinlock_t ptp_lock;
void __iomem *mmcaddr;
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
struct dentry *dbgfs_dir; struct dentry *dbgfs_dir;
......
...@@ -506,7 +506,7 @@ static void stmmac_get_ethtool_stats(struct net_device *dev, ...@@ -506,7 +506,7 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
else { else {
/* If supported, for new GMAC chips expose the MMC counters */ /* If supported, for new GMAC chips expose the MMC counters */
if (priv->dma_cap.rmon) { if (priv->dma_cap.rmon) {
dwmac_mmc_read(priv->ioaddr, &priv->mmc); dwmac_mmc_read(priv->mmcaddr, &priv->mmc);
for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) { for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
char *p; char *p;
......
...@@ -1450,12 +1450,14 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv) ...@@ -1450,12 +1450,14 @@ static void stmmac_dma_interrupt(struct stmmac_priv *priv)
static void stmmac_mmc_setup(struct stmmac_priv *priv) static void stmmac_mmc_setup(struct stmmac_priv *priv)
{ {
unsigned int mode = MMC_CNTRL_RESET_ON_READ | MMC_CNTRL_COUNTER_RESET | unsigned int mode = MMC_CNTRL_RESET_ON_READ | MMC_CNTRL_COUNTER_RESET |
MMC_CNTRL_PRESET | MMC_CNTRL_FULL_HALF_PRESET; MMC_CNTRL_PRESET | MMC_CNTRL_FULL_HALF_PRESET;
dwmac_mmc_intr_all_mask(priv->ioaddr); priv->mmcaddr = priv->ioaddr + MMC_GMAC3_X_OFFSET;
dwmac_mmc_intr_all_mask(priv->mmcaddr);
if (priv->dma_cap.rmon) { if (priv->dma_cap.rmon) {
dwmac_mmc_ctrl(priv->ioaddr, mode); dwmac_mmc_ctrl(priv->mmcaddr, mode);
memset(&priv->mmc, 0, sizeof(struct stmmac_counters)); memset(&priv->mmc, 0, sizeof(struct stmmac_counters));
} else } else
pr_info(" No MAC Management Counters available\n"); pr_info(" No MAC Management Counters available\n");
......
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