xref: /openbmc/linux/drivers/net/ethernet/dnet.h (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
29c8571daSJeff Kirsher /*
39c8571daSJeff Kirsher  * Dave DNET Ethernet Controller driver
49c8571daSJeff Kirsher  *
59c8571daSJeff Kirsher  * Copyright (C) 2008 Dave S.r.l. <www.dave.eu>
69c8571daSJeff Kirsher  */
79c8571daSJeff Kirsher #ifndef _DNET_H
89c8571daSJeff Kirsher #define _DNET_H
99c8571daSJeff Kirsher 
109c8571daSJeff Kirsher #define DRV_NAME		"dnet"
119c8571daSJeff Kirsher #define PFX				DRV_NAME ": "
129c8571daSJeff Kirsher 
139c8571daSJeff Kirsher /* Register access macros */
149c8571daSJeff Kirsher #define dnet_writel(port, value, reg)	\
159c8571daSJeff Kirsher 	writel((value), (port)->regs + DNET_##reg)
169c8571daSJeff Kirsher #define dnet_readl(port, reg)	readl((port)->regs + DNET_##reg)
179c8571daSJeff Kirsher 
189c8571daSJeff Kirsher /* ALL DNET FIFO REGISTERS */
199c8571daSJeff Kirsher #define DNET_RX_LEN_FIFO		0x000	/* RX_LEN_FIFO */
209c8571daSJeff Kirsher #define DNET_RX_DATA_FIFO		0x004	/* RX_DATA_FIFO */
219c8571daSJeff Kirsher #define DNET_TX_LEN_FIFO		0x008	/* TX_LEN_FIFO */
229c8571daSJeff Kirsher #define DNET_TX_DATA_FIFO		0x00C	/* TX_DATA_FIFO */
239c8571daSJeff Kirsher 
249c8571daSJeff Kirsher /* ALL DNET CONTROL/STATUS REGISTERS OFFSETS */
259c8571daSJeff Kirsher #define DNET_VERCAPS			0x100	/* VERCAPS */
269c8571daSJeff Kirsher #define DNET_INTR_SRC			0x104	/* INTR_SRC */
279c8571daSJeff Kirsher #define DNET_INTR_ENB			0x108	/* INTR_ENB */
289c8571daSJeff Kirsher #define DNET_RX_STATUS			0x10C	/* RX_STATUS */
299c8571daSJeff Kirsher #define DNET_TX_STATUS			0x110	/* TX_STATUS */
309c8571daSJeff Kirsher #define DNET_RX_FRAMES_CNT		0x114	/* RX_FRAMES_CNT */
319c8571daSJeff Kirsher #define DNET_TX_FRAMES_CNT		0x118	/* TX_FRAMES_CNT */
329c8571daSJeff Kirsher #define DNET_RX_FIFO_TH			0x11C	/* RX_FIFO_TH */
339c8571daSJeff Kirsher #define DNET_TX_FIFO_TH			0x120	/* TX_FIFO_TH */
349c8571daSJeff Kirsher #define DNET_SYS_CTL			0x124	/* SYS_CTL */
359c8571daSJeff Kirsher #define DNET_PAUSE_TMR			0x128	/* PAUSE_TMR */
369c8571daSJeff Kirsher #define DNET_RX_FIFO_WCNT		0x12C	/* RX_FIFO_WCNT */
379c8571daSJeff Kirsher #define DNET_TX_FIFO_WCNT		0x130	/* TX_FIFO_WCNT */
389c8571daSJeff Kirsher 
399c8571daSJeff Kirsher /* ALL DNET MAC REGISTERS */
409c8571daSJeff Kirsher #define DNET_MACREG_DATA		0x200	/* Mac-Reg Data */
419c8571daSJeff Kirsher #define DNET_MACREG_ADDR		0x204	/* Mac-Reg Addr  */
429c8571daSJeff Kirsher 
439c8571daSJeff Kirsher /* ALL DNET RX STATISTICS COUNTERS  */
449c8571daSJeff Kirsher #define DNET_RX_PKT_IGNR_CNT		0x300
459c8571daSJeff Kirsher #define DNET_RX_LEN_CHK_ERR_CNT		0x304
469c8571daSJeff Kirsher #define DNET_RX_LNG_FRM_CNT		0x308
479c8571daSJeff Kirsher #define DNET_RX_SHRT_FRM_CNT		0x30C
489c8571daSJeff Kirsher #define DNET_RX_IPG_VIOL_CNT		0x310
499c8571daSJeff Kirsher #define DNET_RX_CRC_ERR_CNT		0x314
509c8571daSJeff Kirsher #define DNET_RX_OK_PKT_CNT		0x318
519c8571daSJeff Kirsher #define DNET_RX_CTL_FRM_CNT		0x31C
529c8571daSJeff Kirsher #define DNET_RX_PAUSE_FRM_CNT		0x320
539c8571daSJeff Kirsher #define DNET_RX_MULTICAST_CNT		0x324
549c8571daSJeff Kirsher #define DNET_RX_BROADCAST_CNT		0x328
559c8571daSJeff Kirsher #define DNET_RX_VLAN_TAG_CNT		0x32C
569c8571daSJeff Kirsher #define DNET_RX_PRE_SHRINK_CNT		0x330
579c8571daSJeff Kirsher #define DNET_RX_DRIB_NIB_CNT		0x334
589c8571daSJeff Kirsher #define DNET_RX_UNSUP_OPCD_CNT		0x338
599c8571daSJeff Kirsher #define DNET_RX_BYTE_CNT		0x33C
609c8571daSJeff Kirsher 
619c8571daSJeff Kirsher /* DNET TX STATISTICS COUNTERS */
629c8571daSJeff Kirsher #define DNET_TX_UNICAST_CNT		0x400
639c8571daSJeff Kirsher #define DNET_TX_PAUSE_FRM_CNT		0x404
649c8571daSJeff Kirsher #define DNET_TX_MULTICAST_CNT		0x408
659c8571daSJeff Kirsher #define DNET_TX_BRDCAST_CNT		0x40C
669c8571daSJeff Kirsher #define DNET_TX_VLAN_TAG_CNT		0x410
679c8571daSJeff Kirsher #define DNET_TX_BAD_FCS_CNT		0x414
689c8571daSJeff Kirsher #define DNET_TX_JUMBO_CNT		0x418
699c8571daSJeff Kirsher #define DNET_TX_BYTE_CNT		0x41C
709c8571daSJeff Kirsher 
719c8571daSJeff Kirsher /* SOME INTERNAL MAC-CORE REGISTER */
729c8571daSJeff Kirsher #define DNET_INTERNAL_MODE_REG		0x0
739c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_REG	0x2
749c8571daSJeff Kirsher #define DNET_INTERNAL_MAX_PKT_SIZE_REG	0x4
759c8571daSJeff Kirsher #define DNET_INTERNAL_IGP_REG		0x8
769c8571daSJeff Kirsher #define DNET_INTERNAL_MAC_ADDR_0_REG	0xa
779c8571daSJeff Kirsher #define DNET_INTERNAL_MAC_ADDR_1_REG	0xc
789c8571daSJeff Kirsher #define DNET_INTERNAL_MAC_ADDR_2_REG	0xe
799c8571daSJeff Kirsher #define DNET_INTERNAL_TX_RX_STS_REG	0x12
809c8571daSJeff Kirsher #define DNET_INTERNAL_GMII_MNG_CTL_REG	0x14
819c8571daSJeff Kirsher #define DNET_INTERNAL_GMII_MNG_DAT_REG	0x16
829c8571daSJeff Kirsher 
839c8571daSJeff Kirsher #define DNET_INTERNAL_GMII_MNG_CMD_FIN	(1 << 14)
849c8571daSJeff Kirsher 
859c8571daSJeff Kirsher #define DNET_INTERNAL_WRITE		(1 << 31)
869c8571daSJeff Kirsher 
879c8571daSJeff Kirsher /* MAC-CORE REGISTER FIELDS */
889c8571daSJeff Kirsher 
899c8571daSJeff Kirsher /* MAC-CORE MODE REGISTER FIELDS */
909c8571daSJeff Kirsher #define DNET_INTERNAL_MODE_GBITEN			(1 << 0)
919c8571daSJeff Kirsher #define DNET_INTERNAL_MODE_FCEN				(1 << 1)
929c8571daSJeff Kirsher #define DNET_INTERNAL_MODE_RXEN				(1 << 2)
939c8571daSJeff Kirsher #define DNET_INTERNAL_MODE_TXEN				(1 << 3)
949c8571daSJeff Kirsher 
959c8571daSJeff Kirsher /* MAC-CORE RXTX CONTROL REGISTER FIELDS */
969c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_RXSHORTFRAME		(1 << 8)
979c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST		(1 << 7)
989c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST		(1 << 4)
999c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_RXPAUSE		(1 << 3)
1009c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_DISTXFCS		(1 << 2)
1019c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS		(1 << 1)
1029c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_ENPROMISC		(1 << 0)
1039c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL		(1 << 6)
1049c8571daSJeff Kirsher #define DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP	(1 << 5)
1059c8571daSJeff Kirsher 
1069c8571daSJeff Kirsher /* SYSTEM CONTROL REGISTER FIELDS */
1079c8571daSJeff Kirsher #define DNET_SYS_CTL_IGNORENEXTPKT			(1 << 0)
1089c8571daSJeff Kirsher #define DNET_SYS_CTL_SENDPAUSE				(1 << 2)
1099c8571daSJeff Kirsher #define DNET_SYS_CTL_RXFIFOFLUSH			(1 << 3)
1109c8571daSJeff Kirsher #define DNET_SYS_CTL_TXFIFOFLUSH			(1 << 4)
1119c8571daSJeff Kirsher 
1129c8571daSJeff Kirsher /* TX STATUS REGISTER FIELDS */
1139c8571daSJeff Kirsher #define DNET_TX_STATUS_FIFO_ALMOST_EMPTY		(1 << 2)
1149c8571daSJeff Kirsher #define DNET_TX_STATUS_FIFO_ALMOST_FULL			(1 << 1)
1159c8571daSJeff Kirsher 
1169c8571daSJeff Kirsher /* INTERRUPT SOURCE REGISTER FIELDS */
1179c8571daSJeff Kirsher #define DNET_INTR_SRC_TX_PKTSENT			(1 << 0)
1189c8571daSJeff Kirsher #define DNET_INTR_SRC_TX_FIFOAF				(1 << 1)
1199c8571daSJeff Kirsher #define DNET_INTR_SRC_TX_FIFOAE				(1 << 2)
1209c8571daSJeff Kirsher #define DNET_INTR_SRC_TX_DISCFRM			(1 << 3)
1219c8571daSJeff Kirsher #define DNET_INTR_SRC_TX_FIFOFULL			(1 << 4)
1229c8571daSJeff Kirsher #define DNET_INTR_SRC_RX_CMDFIFOAF			(1 << 8)
1239c8571daSJeff Kirsher #define DNET_INTR_SRC_RX_CMDFIFOFF			(1 << 9)
1249c8571daSJeff Kirsher #define DNET_INTR_SRC_RX_DATAFIFOFF			(1 << 10)
1259c8571daSJeff Kirsher #define DNET_INTR_SRC_TX_SUMMARY			(1 << 16)
1269c8571daSJeff Kirsher #define DNET_INTR_SRC_RX_SUMMARY			(1 << 17)
1279c8571daSJeff Kirsher #define DNET_INTR_SRC_PHY				(1 << 19)
1289c8571daSJeff Kirsher 
1299c8571daSJeff Kirsher /* INTERRUPT ENABLE REGISTER FIELDS */
1309c8571daSJeff Kirsher #define DNET_INTR_ENB_TX_PKTSENT			(1 << 0)
1319c8571daSJeff Kirsher #define DNET_INTR_ENB_TX_FIFOAF				(1 << 1)
1329c8571daSJeff Kirsher #define DNET_INTR_ENB_TX_FIFOAE				(1 << 2)
1339c8571daSJeff Kirsher #define DNET_INTR_ENB_TX_DISCFRM			(1 << 3)
1349c8571daSJeff Kirsher #define DNET_INTR_ENB_TX_FIFOFULL			(1 << 4)
1359c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_PKTRDY				(1 << 8)
1369c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_FIFOAF				(1 << 9)
1379c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_FIFOERR			(1 << 10)
1389c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_ERROR				(1 << 11)
1399c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_FIFOFULL			(1 << 12)
1409c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_FIFOAE				(1 << 13)
1419c8571daSJeff Kirsher #define DNET_INTR_ENB_TX_SUMMARY			(1 << 16)
1429c8571daSJeff Kirsher #define DNET_INTR_ENB_RX_SUMMARY			(1 << 17)
1439c8571daSJeff Kirsher #define DNET_INTR_ENB_GLOBAL_ENABLE			(1 << 18)
1449c8571daSJeff Kirsher 
1459c8571daSJeff Kirsher /* default values:
1469c8571daSJeff Kirsher  * almost empty = less than one full sized ethernet frame (no jumbo) inside
1479c8571daSJeff Kirsher  * the fifo almost full = can write less than one full sized ethernet frame
1489c8571daSJeff Kirsher  * (no jumbo) inside the fifo
1499c8571daSJeff Kirsher  */
1509c8571daSJeff Kirsher #define DNET_CFG_TX_FIFO_FULL_THRES	25
1519c8571daSJeff Kirsher #define DNET_CFG_RX_FIFO_FULL_THRES	20
1529c8571daSJeff Kirsher 
1539c8571daSJeff Kirsher /*
1549c8571daSJeff Kirsher  * Capabilities. Used by the driver to know the capabilities that the ethernet
1559c8571daSJeff Kirsher  * controller inside the FPGA have.
1569c8571daSJeff Kirsher  */
1579c8571daSJeff Kirsher 
1589c8571daSJeff Kirsher #define DNET_HAS_MDIO		(1 << 0)
1599c8571daSJeff Kirsher #define DNET_HAS_IRQ		(1 << 1)
1609c8571daSJeff Kirsher #define DNET_HAS_GIGABIT	(1 << 2)
1619c8571daSJeff Kirsher #define DNET_HAS_DMA		(1 << 3)
1629c8571daSJeff Kirsher 
1639c8571daSJeff Kirsher #define DNET_HAS_MII		(1 << 4) /* or GMII */
1649c8571daSJeff Kirsher #define DNET_HAS_RMII		(1 << 5) /* or RGMII */
1659c8571daSJeff Kirsher 
1669c8571daSJeff Kirsher #define DNET_CAPS_MASK		0xFFFF
1679c8571daSJeff Kirsher 
1689c8571daSJeff Kirsher #define DNET_FIFO_SIZE		1024 /* 1K x 32 bit */
1699c8571daSJeff Kirsher #define DNET_FIFO_TX_DATA_AF_TH	(DNET_FIFO_SIZE - 384) /* 384 = 1536 / 4 */
1709c8571daSJeff Kirsher #define DNET_FIFO_TX_DATA_AE_TH	384
1719c8571daSJeff Kirsher 
1729c8571daSJeff Kirsher #define DNET_FIFO_RX_CMD_AF_TH	(1 << 16) /* just one frame inside the FIFO */
1739c8571daSJeff Kirsher 
1749c8571daSJeff Kirsher /*
1759c8571daSJeff Kirsher  * Hardware-collected statistics.
1769c8571daSJeff Kirsher  */
1779c8571daSJeff Kirsher struct dnet_stats {
1789c8571daSJeff Kirsher 	u32 rx_pkt_ignr;
1799c8571daSJeff Kirsher 	u32 rx_len_chk_err;
1809c8571daSJeff Kirsher 	u32 rx_lng_frm;
1819c8571daSJeff Kirsher 	u32 rx_shrt_frm;
1829c8571daSJeff Kirsher 	u32 rx_ipg_viol;
1839c8571daSJeff Kirsher 	u32 rx_crc_err;
1849c8571daSJeff Kirsher 	u32 rx_ok_pkt;
1859c8571daSJeff Kirsher 	u32 rx_ctl_frm;
1869c8571daSJeff Kirsher 	u32 rx_pause_frm;
1879c8571daSJeff Kirsher 	u32 rx_multicast;
1889c8571daSJeff Kirsher 	u32 rx_broadcast;
1899c8571daSJeff Kirsher 	u32 rx_vlan_tag;
1909c8571daSJeff Kirsher 	u32 rx_pre_shrink;
1919c8571daSJeff Kirsher 	u32 rx_drib_nib;
1929c8571daSJeff Kirsher 	u32 rx_unsup_opcd;
1939c8571daSJeff Kirsher 	u32 rx_byte;
1949c8571daSJeff Kirsher 	u32 tx_unicast;
1959c8571daSJeff Kirsher 	u32 tx_pause_frm;
1969c8571daSJeff Kirsher 	u32 tx_multicast;
1979c8571daSJeff Kirsher 	u32 tx_brdcast;
1989c8571daSJeff Kirsher 	u32 tx_vlan_tag;
1999c8571daSJeff Kirsher 	u32 tx_bad_fcs;
2009c8571daSJeff Kirsher 	u32 tx_jumbo;
2019c8571daSJeff Kirsher 	u32 tx_byte;
2029c8571daSJeff Kirsher };
2039c8571daSJeff Kirsher 
2049c8571daSJeff Kirsher struct dnet {
2059c8571daSJeff Kirsher 	void __iomem			*regs;
2069c8571daSJeff Kirsher 	spinlock_t			lock;
2079c8571daSJeff Kirsher 	struct platform_device		*pdev;
2089c8571daSJeff Kirsher 	struct net_device		*dev;
2099c8571daSJeff Kirsher 	struct dnet_stats		hw_stats;
2109c8571daSJeff Kirsher 	unsigned int			capabilities; /* read from FPGA */
2119c8571daSJeff Kirsher 	struct napi_struct		napi;
2129c8571daSJeff Kirsher 
2139c8571daSJeff Kirsher 	/* PHY stuff */
2149c8571daSJeff Kirsher 	struct mii_bus			*mii_bus;
2159c8571daSJeff Kirsher 	unsigned int			link;
2169c8571daSJeff Kirsher 	unsigned int			speed;
2179c8571daSJeff Kirsher 	unsigned int			duplex;
2189c8571daSJeff Kirsher };
2199c8571daSJeff Kirsher 
2209c8571daSJeff Kirsher #endif /* _DNET_H */
221