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