11c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/*******************************************************************************
21c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  DWMAC Management Counters
31c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
41c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  Copyright (C) 2011  STMicroelectronics Ltd
51c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
61c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  This program is free software; you can redistribute it and/or modify it
71c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  under the terms and conditions of the GNU General Public License,
81c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  version 2, as published by the Free Software Foundation.
91c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
101c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  This program is distributed in the hope it will be useful, but WITHOUT
111c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
121c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
131c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  more details.
141c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
151c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  You should have received a copy of the GNU General Public License along with
161c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  this program; if not, write to the Free Software Foundation, Inc.,
171c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
181c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
191c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  The full GNU General Public License is included in this distribution in
201c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  the file called "COPYING".
211c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
221c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO  Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
231c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO*******************************************************************************/
241c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
251dd8117e3320fb42ec40ef2ace982871572d34edStefan Roese#include <linux/kernel.h>
261c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#include <linux/io.h>
271c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#include "mmc.h"
281c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
291c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* MAC Management Counters register offset */
301c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
311c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_CNTRL		0x00000100	/* MMC Control */
321c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_INTR		0x00000104	/* MMC RX Interrupt */
331c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_INTR		0x00000108	/* MMC TX Interrupt */
341c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_INTR_MASK	0x0000010c	/* MMC Interrupt Mask */
351c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_INTR_MASK	0x00000110	/* MMC Interrupt Mask */
361c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_DEFAUL_MASK		0xffffffff
371c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
381c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* MMC TX counter registers */
391c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
401c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* Note:
411c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO * _GB register stands for good and bad frames
421c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO * _G is for good only.
431c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO */
441c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_OCTETCOUNT_GB		0x00000114
451c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_FRAMECOUNT_GB		0x00000118
461c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_BROADCASTFRAME_G		0x0000011c
471c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_MULTICASTFRAME_G		0x00000120
481c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_64_OCTETS_GB		0x00000124
491c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_65_TO_127_OCTETS_GB	0x00000128
501c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_128_TO_255_OCTETS_GB	0x0000012c
511c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_256_TO_511_OCTETS_GB	0x00000130
521c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_512_TO_1023_OCTETS_GB	0x00000134
531c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_1024_TO_MAX_OCTETS_GB	0x00000138
541c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_UNICAST_GB		0x0000013c
551c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_MULTICAST_GB		0x00000140
561c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_BROADCAST_GB		0x00000144
571c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_UNDERFLOW_ERROR		0x00000148
581c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_SINGLECOL_G		0x0000014c
591c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_MULTICOL_G		0x00000150
601c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_DEFERRED			0x00000154
611c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_LATECOL			0x00000158
621c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_EXESSCOL			0x0000015c
631c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_CARRIER_ERROR		0x00000160
641c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_OCTETCOUNT_G		0x00000164
651c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_FRAMECOUNT_G		0x00000168
661c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_EXCESSDEF		0x0000016c
671c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_PAUSE_FRAME		0x00000170
681c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_TX_VLAN_FRAME_G		0x00000174
691c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
701c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* MMC RX counter registers */
711c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_FRAMECOUNT_GB		0x00000180
721c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_OCTETCOUNT_GB		0x00000184
731c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_OCTETCOUNT_G		0x00000188
741c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_BROADCASTFRAME_G		0x0000018c
751c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_MULTICASTFRAME_G		0x00000190
761c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_CRC_ERRROR		0x00000194
771c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_ALIGN_ERROR		0x00000198
781c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_RUN_ERROR		0x0000019C
791c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_JABBER_ERROR		0x000001A0
801c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_UNDERSIZE_G		0x000001A4
811c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_OVERSIZE_G		0x000001A8
821c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_64_OCTETS_GB		0x000001AC
831c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_65_TO_127_OCTETS_GB	0x000001b0
841c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_128_TO_255_OCTETS_GB	0x000001b4
851c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_256_TO_511_OCTETS_GB	0x000001b8
861c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_512_TO_1023_OCTETS_GB	0x000001bc
871c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_1024_TO_MAX_OCTETS_GB	0x000001c0
881c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_UNICAST_G		0x000001c4
891c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_LENGTH_ERROR		0x000001c8
901c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_AUTOFRANGETYPE		0x000001cc
911c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_PAUSE_FRAMES		0x000001d0
921c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_FIFO_OVERFLOW		0x000001d4
931c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_VLAN_FRAMES_GB		0x000001d8
941c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_WATCHDOG_ERROR		0x000001dc
951c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* IPC*/
961c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPC_INTR_MASK		0x00000200
971c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPC_INTR			0x00000208
981c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* IPv4*/
991c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_GD			0x00000210
1001c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_HDERR		0x00000214
1011c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_NOPAY		0x00000218
1021c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_FRAG		0x0000021C
1031c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_UDSBL		0x00000220
1041c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1051c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_GD_OCTETS		0x00000250
1061c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_HDERR_OCTETS	0x00000254
1071c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_NOPAY_OCTETS	0x00000258
1081c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_FRAG_OCTETS		0x0000025c
1091c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV4_UDSBL_OCTETS	0x00000260
1101c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1111c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* IPV6*/
1121c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV6_GD_OCTETS		0x00000264
1131c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV6_HDERR_OCTETS	0x00000268
1141c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV6_NOPAY_OCTETS	0x0000026c
1151c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1161c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV6_GD			0x00000224
1171c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV6_HDERR		0x00000228
1181c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_IPV6_NOPAY		0x0000022c
1191c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1201c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* Protocols*/
1211c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_UDP_GD			0x00000230
1221c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_UDP_ERR			0x00000234
1231c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_TCP_GD			0x00000238
1241c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_TCP_ERR			0x0000023c
1251c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_ICMP_GD			0x00000240
1261c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_ICMP_ERR			0x00000244
1271c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1281c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_UDP_GD_OCTETS		0x00000270
1291c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_UDP_ERR_OCTETS		0x00000274
1301c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_TCP_GD_OCTETS		0x00000278
1311c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_TCP_ERR_OCTETS		0x0000027c
1321c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_ICMP_GD_OCTETS		0x00000280
1331c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define MMC_RX_ICMP_ERR_OCTETS		0x00000284
1341c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1351c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLAROvoid dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode)
1361c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO{
1371c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	u32 value = readl(ioaddr + MMC_CNTRL);
1381c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1391c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	value |= (mode & 0x3F);
1401c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1411c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	writel(value, ioaddr + MMC_CNTRL);
1421c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1431c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	pr_debug("stmmac: MMC ctrl register (offset 0x%x): 0x%08x\n",
1441c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		 MMC_CNTRL, value);
1451c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO}
1461c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1471c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* To mask all all interrupts.*/
1481c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLAROvoid dwmac_mmc_intr_all_mask(void __iomem *ioaddr)
1491c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO{
1501c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	writel(MMC_DEFAUL_MASK, ioaddr + MMC_RX_INTR_MASK);
1511c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	writel(MMC_DEFAUL_MASK, ioaddr + MMC_TX_INTR_MASK);
1521c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO}
1531c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1541c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* This reads the MAC core counters (if actaully supported).
1551c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO * by default the MMC core is programmed to reset each
1561c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO * counter after a read. So all the field of the mmc struct
1571c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO * have to be incremented.
1581c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO */
1591c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLAROvoid dwmac_mmc_read(void __iomem *ioaddr, struct stmmac_counters *mmc)
1601c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO{
1611c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_octetcount_gb += readl(ioaddr + MMC_TX_OCTETCOUNT_GB);
1621c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_framecount_gb += readl(ioaddr + MMC_TX_FRAMECOUNT_GB);
1631c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_broadcastframe_g += readl(ioaddr + MMC_TX_BROADCASTFRAME_G);
1641c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_multicastframe_g += readl(ioaddr + MMC_TX_MULTICASTFRAME_G);
1651c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_64_octets_gb += readl(ioaddr + MMC_TX_64_OCTETS_GB);
1661c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_65_to_127_octets_gb +=
1671c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_TX_65_TO_127_OCTETS_GB);
1681c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_128_to_255_octets_gb +=
1691c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_TX_128_TO_255_OCTETS_GB);
1701c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_256_to_511_octets_gb +=
1711c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_TX_256_TO_511_OCTETS_GB);
1721c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_512_to_1023_octets_gb +=
1731c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_TX_512_TO_1023_OCTETS_GB);
1741c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_1024_to_max_octets_gb +=
1751c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_TX_1024_TO_MAX_OCTETS_GB);
1761c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_unicast_gb += readl(ioaddr + MMC_TX_UNICAST_GB);
1771c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_multicast_gb += readl(ioaddr + MMC_TX_MULTICAST_GB);
1781c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_broadcast_gb += readl(ioaddr + MMC_TX_BROADCAST_GB);
1791c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_underflow_error += readl(ioaddr + MMC_TX_UNDERFLOW_ERROR);
1801c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_singlecol_g += readl(ioaddr + MMC_TX_SINGLECOL_G);
1811c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_multicol_g += readl(ioaddr + MMC_TX_MULTICOL_G);
1821c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_deferred += readl(ioaddr + MMC_TX_DEFERRED);
1831c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_latecol += readl(ioaddr + MMC_TX_LATECOL);
1841c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_exesscol += readl(ioaddr + MMC_TX_EXESSCOL);
1851c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_carrier_error += readl(ioaddr + MMC_TX_CARRIER_ERROR);
1861c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_octetcount_g += readl(ioaddr + MMC_TX_OCTETCOUNT_G);
1871c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_framecount_g += readl(ioaddr + MMC_TX_FRAMECOUNT_G);
1881c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_excessdef += readl(ioaddr + MMC_TX_EXCESSDEF);
1891c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_pause_frame += readl(ioaddr + MMC_TX_PAUSE_FRAME);
1901c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_tx_vlan_frame_g += readl(ioaddr + MMC_TX_VLAN_FRAME_G);
1911c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1921c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	/* MMC RX counter registers */
1931c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_framecount_gb += readl(ioaddr + MMC_RX_FRAMECOUNT_GB);
1941c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_octetcount_gb += readl(ioaddr + MMC_RX_OCTETCOUNT_GB);
1951c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_octetcount_g += readl(ioaddr + MMC_RX_OCTETCOUNT_G);
1961c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_broadcastframe_g += readl(ioaddr + MMC_RX_BROADCASTFRAME_G);
1971c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_multicastframe_g += readl(ioaddr + MMC_RX_MULTICASTFRAME_G);
1981c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_crc_errror += readl(ioaddr + MMC_RX_CRC_ERRROR);
1991c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_align_error += readl(ioaddr + MMC_RX_ALIGN_ERROR);
2001c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_run_error += readl(ioaddr + MMC_RX_RUN_ERROR);
2011c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_jabber_error += readl(ioaddr + MMC_RX_JABBER_ERROR);
2021c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_undersize_g += readl(ioaddr + MMC_RX_UNDERSIZE_G);
2031c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_oversize_g += readl(ioaddr + MMC_RX_OVERSIZE_G);
2041c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_64_octets_gb += readl(ioaddr + MMC_RX_64_OCTETS_GB);
2051c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_65_to_127_octets_gb +=
2061c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_65_TO_127_OCTETS_GB);
2071c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_128_to_255_octets_gb +=
2081c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_128_TO_255_OCTETS_GB);
2091c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_256_to_511_octets_gb +=
2101c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_256_TO_511_OCTETS_GB);
2111c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_512_to_1023_octets_gb +=
2121c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_512_TO_1023_OCTETS_GB);
2131c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_1024_to_max_octets_gb +=
2141c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_1024_TO_MAX_OCTETS_GB);
2151c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_unicast_g += readl(ioaddr + MMC_RX_UNICAST_G);
2161c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_length_error += readl(ioaddr + MMC_RX_LENGTH_ERROR);
2171c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_autofrangetype += readl(ioaddr + MMC_RX_AUTOFRANGETYPE);
2181c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_pause_frames += readl(ioaddr + MMC_RX_PAUSE_FRAMES);
2191c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_fifo_overflow += readl(ioaddr + MMC_RX_FIFO_OVERFLOW);
2201c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_vlan_frames_gb += readl(ioaddr + MMC_RX_VLAN_FRAMES_GB);
2211c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_watchdog_error += readl(ioaddr + MMC_RX_WATCHDOG_ERROR);
2221c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	/* IPC */
2231c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipc_intr_mask += readl(ioaddr + MMC_RX_IPC_INTR_MASK);
2241c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipc_intr += readl(ioaddr + MMC_RX_IPC_INTR);
2251c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	/* IPv4 */
2261c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_gd += readl(ioaddr + MMC_RX_IPV4_GD);
2271c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_hderr += readl(ioaddr + MMC_RX_IPV4_HDERR);
2281c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_nopay += readl(ioaddr + MMC_RX_IPV4_NOPAY);
2291c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_frag += readl(ioaddr + MMC_RX_IPV4_FRAG);
2301c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_udsbl += readl(ioaddr + MMC_RX_IPV4_UDSBL);
2311c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
2321c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_gd_octets += readl(ioaddr + MMC_RX_IPV4_GD_OCTETS);
2331c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_hderr_octets +=
2341c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_IPV4_HDERR_OCTETS);
2351c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_nopay_octets +=
2361c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_IPV4_NOPAY_OCTETS);
2371c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_frag_octets += readl(ioaddr + MMC_RX_IPV4_FRAG_OCTETS);
2381c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv4_udsbl_octets +=
2391c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_IPV4_UDSBL_OCTETS);
2401c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
2411c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	/* IPV6 */
2421c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv6_gd_octets += readl(ioaddr + MMC_RX_IPV6_GD_OCTETS);
2431c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv6_hderr_octets +=
2441c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_IPV6_HDERR_OCTETS);
2451c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv6_nopay_octets +=
2461c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	    readl(ioaddr + MMC_RX_IPV6_NOPAY_OCTETS);
2471c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
2481c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv6_gd += readl(ioaddr + MMC_RX_IPV6_GD);
2491c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv6_hderr += readl(ioaddr + MMC_RX_IPV6_HDERR);
2501c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_ipv6_nopay += readl(ioaddr + MMC_RX_IPV6_NOPAY);
2511c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
2521c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	/* Protocols */
2531c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_udp_gd += readl(ioaddr + MMC_RX_UDP_GD);
2541c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_udp_err += readl(ioaddr + MMC_RX_UDP_ERR);
2551c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_tcp_gd += readl(ioaddr + MMC_RX_TCP_GD);
2561c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_tcp_err += readl(ioaddr + MMC_RX_TCP_ERR);
2571c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_icmp_gd += readl(ioaddr + MMC_RX_ICMP_GD);
2581c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_icmp_err += readl(ioaddr + MMC_RX_ICMP_ERR);
2591c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
2601c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_udp_gd_octets += readl(ioaddr + MMC_RX_UDP_GD_OCTETS);
2611c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_udp_err_octets += readl(ioaddr + MMC_RX_UDP_ERR_OCTETS);
2621c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_tcp_gd_octets += readl(ioaddr + MMC_RX_TCP_GD_OCTETS);
2631c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_tcp_err_octets += readl(ioaddr + MMC_RX_TCP_ERR_OCTETS);
2641c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_icmp_gd_octets += readl(ioaddr + MMC_RX_ICMP_GD_OCTETS);
2651c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	mmc->mmc_rx_icmp_err_octets += readl(ioaddr + MMC_RX_ICMP_ERR_OCTETS);
2661c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO}
267