1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. 3*4882a593Smuzhiyun */ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef _EMAC_H_ 6*4882a593Smuzhiyun #define _EMAC_H_ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/irqreturn.h> 9*4882a593Smuzhiyun #include <linux/netdevice.h> 10*4882a593Smuzhiyun #include <linux/clk.h> 11*4882a593Smuzhiyun #include <linux/platform_device.h> 12*4882a593Smuzhiyun #include "emac-mac.h" 13*4882a593Smuzhiyun #include "emac-phy.h" 14*4882a593Smuzhiyun #include "emac-sgmii.h" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* EMAC base register offsets */ 17*4882a593Smuzhiyun #define EMAC_DMA_MAS_CTRL 0x1400 18*4882a593Smuzhiyun #define EMAC_IRQ_MOD_TIM_INIT 0x1408 19*4882a593Smuzhiyun #define EMAC_BLK_IDLE_STS 0x140c 20*4882a593Smuzhiyun #define EMAC_PHY_LINK_DELAY 0x141c 21*4882a593Smuzhiyun #define EMAC_SYS_ALIV_CTRL 0x1434 22*4882a593Smuzhiyun #define EMAC_MAC_CTRL 0x1480 23*4882a593Smuzhiyun #define EMAC_MAC_IPGIFG_CTRL 0x1484 24*4882a593Smuzhiyun #define EMAC_MAC_STA_ADDR0 0x1488 25*4882a593Smuzhiyun #define EMAC_MAC_STA_ADDR1 0x148c 26*4882a593Smuzhiyun #define EMAC_HASH_TAB_REG0 0x1490 27*4882a593Smuzhiyun #define EMAC_HASH_TAB_REG1 0x1494 28*4882a593Smuzhiyun #define EMAC_MAC_HALF_DPLX_CTRL 0x1498 29*4882a593Smuzhiyun #define EMAC_MAX_FRAM_LEN_CTRL 0x149c 30*4882a593Smuzhiyun #define EMAC_WOL_CTRL0 0x14a0 31*4882a593Smuzhiyun #define EMAC_RSS_KEY0 0x14b0 32*4882a593Smuzhiyun #define EMAC_H1TPD_BASE_ADDR_LO 0x14e0 33*4882a593Smuzhiyun #define EMAC_H2TPD_BASE_ADDR_LO 0x14e4 34*4882a593Smuzhiyun #define EMAC_H3TPD_BASE_ADDR_LO 0x14e8 35*4882a593Smuzhiyun #define EMAC_INTER_SRAM_PART9 0x1534 36*4882a593Smuzhiyun #define EMAC_DESC_CTRL_0 0x1540 37*4882a593Smuzhiyun #define EMAC_DESC_CTRL_1 0x1544 38*4882a593Smuzhiyun #define EMAC_DESC_CTRL_2 0x1550 39*4882a593Smuzhiyun #define EMAC_DESC_CTRL_10 0x1554 40*4882a593Smuzhiyun #define EMAC_DESC_CTRL_12 0x1558 41*4882a593Smuzhiyun #define EMAC_DESC_CTRL_13 0x155c 42*4882a593Smuzhiyun #define EMAC_DESC_CTRL_3 0x1560 43*4882a593Smuzhiyun #define EMAC_DESC_CTRL_4 0x1564 44*4882a593Smuzhiyun #define EMAC_DESC_CTRL_5 0x1568 45*4882a593Smuzhiyun #define EMAC_DESC_CTRL_14 0x156c 46*4882a593Smuzhiyun #define EMAC_DESC_CTRL_15 0x1570 47*4882a593Smuzhiyun #define EMAC_DESC_CTRL_16 0x1574 48*4882a593Smuzhiyun #define EMAC_DESC_CTRL_6 0x1578 49*4882a593Smuzhiyun #define EMAC_DESC_CTRL_8 0x1580 50*4882a593Smuzhiyun #define EMAC_DESC_CTRL_9 0x1584 51*4882a593Smuzhiyun #define EMAC_DESC_CTRL_11 0x1588 52*4882a593Smuzhiyun #define EMAC_TXQ_CTRL_0 0x1590 53*4882a593Smuzhiyun #define EMAC_TXQ_CTRL_1 0x1594 54*4882a593Smuzhiyun #define EMAC_TXQ_CTRL_2 0x1598 55*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_0 0x15a0 56*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_1 0x15a4 57*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_2 0x15a8 58*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_3 0x15ac 59*4882a593Smuzhiyun #define EMAC_BASE_CPU_NUMBER 0x15b8 60*4882a593Smuzhiyun #define EMAC_DMA_CTRL 0x15c0 61*4882a593Smuzhiyun #define EMAC_MAILBOX_0 0x15e0 62*4882a593Smuzhiyun #define EMAC_MAILBOX_5 0x15e4 63*4882a593Smuzhiyun #define EMAC_MAILBOX_6 0x15e8 64*4882a593Smuzhiyun #define EMAC_MAILBOX_13 0x15ec 65*4882a593Smuzhiyun #define EMAC_MAILBOX_2 0x15f4 66*4882a593Smuzhiyun #define EMAC_MAILBOX_3 0x15f8 67*4882a593Smuzhiyun #define EMAC_INT_STATUS 0x1600 68*4882a593Smuzhiyun #define EMAC_INT_MASK 0x1604 69*4882a593Smuzhiyun #define EMAC_MAILBOX_11 0x160c 70*4882a593Smuzhiyun #define EMAC_AXI_MAST_CTRL 0x1610 71*4882a593Smuzhiyun #define EMAC_MAILBOX_12 0x1614 72*4882a593Smuzhiyun #define EMAC_MAILBOX_9 0x1618 73*4882a593Smuzhiyun #define EMAC_MAILBOX_10 0x161c 74*4882a593Smuzhiyun #define EMAC_ATHR_HEADER_CTRL 0x1620 75*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG0 0x1700 76*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG22 0x1758 77*4882a593Smuzhiyun #define EMAC_TXMAC_STATC_REG0 0x1760 78*4882a593Smuzhiyun #define EMAC_TXMAC_STATC_REG24 0x17c0 79*4882a593Smuzhiyun #define EMAC_CLK_GATE_CTRL 0x1814 80*4882a593Smuzhiyun #define EMAC_CORE_HW_VERSION 0x1974 81*4882a593Smuzhiyun #define EMAC_MISC_CTRL 0x1990 82*4882a593Smuzhiyun #define EMAC_MAILBOX_7 0x19e0 83*4882a593Smuzhiyun #define EMAC_MAILBOX_8 0x19e4 84*4882a593Smuzhiyun #define EMAC_IDT_TABLE0 0x1b00 85*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG23 0x1bc8 86*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG24 0x1bcc 87*4882a593Smuzhiyun #define EMAC_TXMAC_STATC_REG25 0x1bd0 88*4882a593Smuzhiyun #define EMAC_MAILBOX_15 0x1bd4 89*4882a593Smuzhiyun #define EMAC_MAILBOX_16 0x1bd8 90*4882a593Smuzhiyun #define EMAC_INT1_MASK 0x1bf0 91*4882a593Smuzhiyun #define EMAC_INT1_STATUS 0x1bf4 92*4882a593Smuzhiyun #define EMAC_INT2_MASK 0x1bf8 93*4882a593Smuzhiyun #define EMAC_INT2_STATUS 0x1bfc 94*4882a593Smuzhiyun #define EMAC_INT3_MASK 0x1c00 95*4882a593Smuzhiyun #define EMAC_INT3_STATUS 0x1c04 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* EMAC_DMA_MAS_CTRL */ 98*4882a593Smuzhiyun #define DEV_ID_NUM_BMSK 0x7f000000 99*4882a593Smuzhiyun #define DEV_ID_NUM_SHFT 24 100*4882a593Smuzhiyun #define DEV_REV_NUM_BMSK 0xff0000 101*4882a593Smuzhiyun #define DEV_REV_NUM_SHFT 16 102*4882a593Smuzhiyun #define INT_RD_CLR_EN 0x4000 103*4882a593Smuzhiyun #define IRQ_MODERATOR2_EN 0x800 104*4882a593Smuzhiyun #define IRQ_MODERATOR_EN 0x400 105*4882a593Smuzhiyun #define LPW_CLK_SEL 0x80 106*4882a593Smuzhiyun #define LPW_STATE 0x20 107*4882a593Smuzhiyun #define LPW_MODE 0x10 108*4882a593Smuzhiyun #define SOFT_RST 0x1 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* EMAC_IRQ_MOD_TIM_INIT */ 111*4882a593Smuzhiyun #define IRQ_MODERATOR2_INIT_BMSK 0xffff0000 112*4882a593Smuzhiyun #define IRQ_MODERATOR2_INIT_SHFT 16 113*4882a593Smuzhiyun #define IRQ_MODERATOR_INIT_BMSK 0xffff 114*4882a593Smuzhiyun #define IRQ_MODERATOR_INIT_SHFT 0 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* EMAC_INT_STATUS */ 117*4882a593Smuzhiyun #define DIS_INT BIT(31) 118*4882a593Smuzhiyun #define PTP_INT BIT(30) 119*4882a593Smuzhiyun #define RFD4_UR_INT BIT(29) 120*4882a593Smuzhiyun #define TX_PKT_INT3 BIT(26) 121*4882a593Smuzhiyun #define TX_PKT_INT2 BIT(25) 122*4882a593Smuzhiyun #define TX_PKT_INT1 BIT(24) 123*4882a593Smuzhiyun #define RX_PKT_INT3 BIT(19) 124*4882a593Smuzhiyun #define RX_PKT_INT2 BIT(18) 125*4882a593Smuzhiyun #define RX_PKT_INT1 BIT(17) 126*4882a593Smuzhiyun #define RX_PKT_INT0 BIT(16) 127*4882a593Smuzhiyun #define TX_PKT_INT BIT(15) 128*4882a593Smuzhiyun #define TXQ_TO_INT BIT(14) 129*4882a593Smuzhiyun #define GPHY_WAKEUP_INT BIT(13) 130*4882a593Smuzhiyun #define GPHY_LINK_DOWN_INT BIT(12) 131*4882a593Smuzhiyun #define GPHY_LINK_UP_INT BIT(11) 132*4882a593Smuzhiyun #define DMAW_TO_INT BIT(10) 133*4882a593Smuzhiyun #define DMAR_TO_INT BIT(9) 134*4882a593Smuzhiyun #define TXF_UR_INT BIT(8) 135*4882a593Smuzhiyun #define RFD3_UR_INT BIT(7) 136*4882a593Smuzhiyun #define RFD2_UR_INT BIT(6) 137*4882a593Smuzhiyun #define RFD1_UR_INT BIT(5) 138*4882a593Smuzhiyun #define RFD0_UR_INT BIT(4) 139*4882a593Smuzhiyun #define RXF_OF_INT BIT(3) 140*4882a593Smuzhiyun #define SW_MAN_INT BIT(2) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* EMAC_MAILBOX_6 */ 143*4882a593Smuzhiyun #define RFD2_PROC_IDX_BMSK 0xfff0000 144*4882a593Smuzhiyun #define RFD2_PROC_IDX_SHFT 16 145*4882a593Smuzhiyun #define RFD2_PROD_IDX_BMSK 0xfff 146*4882a593Smuzhiyun #define RFD2_PROD_IDX_SHFT 0 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* EMAC_CORE_HW_VERSION */ 149*4882a593Smuzhiyun #define MAJOR_BMSK 0xf0000000 150*4882a593Smuzhiyun #define MAJOR_SHFT 28 151*4882a593Smuzhiyun #define MINOR_BMSK 0xfff0000 152*4882a593Smuzhiyun #define MINOR_SHFT 16 153*4882a593Smuzhiyun #define STEP_BMSK 0xffff 154*4882a593Smuzhiyun #define STEP_SHFT 0 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* EMAC_EMAC_WRAPPER_CSR1 */ 157*4882a593Smuzhiyun #define TX_INDX_FIFO_SYNC_RST BIT(23) 158*4882a593Smuzhiyun #define TX_TS_FIFO_SYNC_RST BIT(22) 159*4882a593Smuzhiyun #define RX_TS_FIFO2_SYNC_RST BIT(21) 160*4882a593Smuzhiyun #define RX_TS_FIFO1_SYNC_RST BIT(20) 161*4882a593Smuzhiyun #define TX_TS_ENABLE BIT(16) 162*4882a593Smuzhiyun #define DIS_1588_CLKS BIT(11) 163*4882a593Smuzhiyun #define FREQ_MODE BIT(9) 164*4882a593Smuzhiyun #define ENABLE_RRD_TIMESTAMP BIT(3) 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* EMAC_EMAC_WRAPPER_CSR2 */ 167*4882a593Smuzhiyun #define HDRIVE_BMSK 0x3000 168*4882a593Smuzhiyun #define HDRIVE_SHFT 12 169*4882a593Smuzhiyun #define SLB_EN BIT(9) 170*4882a593Smuzhiyun #define PLB_EN BIT(8) 171*4882a593Smuzhiyun #define WOL_EN BIT(3) 172*4882a593Smuzhiyun #define PHY_RESET BIT(0) 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define EMAC_DEV_ID 0x0040 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* SGMII v2 per lane registers */ 177*4882a593Smuzhiyun #define SGMII_LN_RSM_START 0x029C 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* SGMII v2 PHY common registers */ 180*4882a593Smuzhiyun #define SGMII_PHY_CMN_CTRL 0x0408 181*4882a593Smuzhiyun #define SGMII_PHY_CMN_RESET_CTRL 0x0410 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* SGMII v2 PHY registers per lane */ 184*4882a593Smuzhiyun #define SGMII_PHY_LN_OFFSET 0x0400 185*4882a593Smuzhiyun #define SGMII_PHY_LN_LANE_STATUS 0x00DC 186*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN0 0x008C 187*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN1 0x0090 188*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN2 0x0094 189*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN3 0x0098 190*4882a593Smuzhiyun #define SGMII_PHY_LN_CDR_CTRL1 0x005C 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun enum emac_clk_id { 193*4882a593Smuzhiyun EMAC_CLK_AXI, 194*4882a593Smuzhiyun EMAC_CLK_CFG_AHB, 195*4882a593Smuzhiyun EMAC_CLK_HIGH_SPEED, 196*4882a593Smuzhiyun EMAC_CLK_MDIO, 197*4882a593Smuzhiyun EMAC_CLK_TX, 198*4882a593Smuzhiyun EMAC_CLK_RX, 199*4882a593Smuzhiyun EMAC_CLK_SYS, 200*4882a593Smuzhiyun EMAC_CLK_CNT 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun #define EMAC_LINK_SPEED_UNKNOWN 0x0 204*4882a593Smuzhiyun #define EMAC_LINK_SPEED_10_HALF BIT(0) 205*4882a593Smuzhiyun #define EMAC_LINK_SPEED_10_FULL BIT(1) 206*4882a593Smuzhiyun #define EMAC_LINK_SPEED_100_HALF BIT(2) 207*4882a593Smuzhiyun #define EMAC_LINK_SPEED_100_FULL BIT(3) 208*4882a593Smuzhiyun #define EMAC_LINK_SPEED_1GB_FULL BIT(5) 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #define EMAC_MAX_SETUP_LNK_CYCLE 100 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun struct emac_stats { 213*4882a593Smuzhiyun /* rx */ 214*4882a593Smuzhiyun u64 rx_ok; /* good packets */ 215*4882a593Smuzhiyun u64 rx_bcast; /* good broadcast packets */ 216*4882a593Smuzhiyun u64 rx_mcast; /* good multicast packets */ 217*4882a593Smuzhiyun u64 rx_pause; /* pause packet */ 218*4882a593Smuzhiyun u64 rx_ctrl; /* control packets other than pause frame. */ 219*4882a593Smuzhiyun u64 rx_fcs_err; /* packets with bad FCS. */ 220*4882a593Smuzhiyun u64 rx_len_err; /* packets with length mismatch */ 221*4882a593Smuzhiyun u64 rx_byte_cnt; /* good bytes count (without FCS) */ 222*4882a593Smuzhiyun u64 rx_runt; /* runt packets */ 223*4882a593Smuzhiyun u64 rx_frag; /* fragment count */ 224*4882a593Smuzhiyun u64 rx_sz_64; /* packets that are 64 bytes */ 225*4882a593Smuzhiyun u64 rx_sz_65_127; /* packets that are 65-127 bytes */ 226*4882a593Smuzhiyun u64 rx_sz_128_255; /* packets that are 128-255 bytes */ 227*4882a593Smuzhiyun u64 rx_sz_256_511; /* packets that are 256-511 bytes */ 228*4882a593Smuzhiyun u64 rx_sz_512_1023; /* packets that are 512-1023 bytes */ 229*4882a593Smuzhiyun u64 rx_sz_1024_1518; /* packets that are 1024-1518 bytes */ 230*4882a593Smuzhiyun u64 rx_sz_1519_max; /* packets that are 1519-MTU bytes*/ 231*4882a593Smuzhiyun u64 rx_sz_ov; /* packets that are >MTU bytes (truncated) */ 232*4882a593Smuzhiyun u64 rx_rxf_ov; /* packets dropped due to RX FIFO overflow */ 233*4882a593Smuzhiyun u64 rx_align_err; /* alignment errors */ 234*4882a593Smuzhiyun u64 rx_bcast_byte_cnt; /* broadcast packets byte count (without FCS) */ 235*4882a593Smuzhiyun u64 rx_mcast_byte_cnt; /* multicast packets byte count (without FCS) */ 236*4882a593Smuzhiyun u64 rx_err_addr; /* packets dropped due to address filtering */ 237*4882a593Smuzhiyun u64 rx_crc_align; /* CRC align errors */ 238*4882a593Smuzhiyun u64 rx_jabbers; /* jabbers */ 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /* tx */ 241*4882a593Smuzhiyun u64 tx_ok; /* good packets */ 242*4882a593Smuzhiyun u64 tx_bcast; /* good broadcast packets */ 243*4882a593Smuzhiyun u64 tx_mcast; /* good multicast packets */ 244*4882a593Smuzhiyun u64 tx_pause; /* pause packets */ 245*4882a593Smuzhiyun u64 tx_exc_defer; /* packets with excessive deferral */ 246*4882a593Smuzhiyun u64 tx_ctrl; /* control packets other than pause frame */ 247*4882a593Smuzhiyun u64 tx_defer; /* packets that are deferred. */ 248*4882a593Smuzhiyun u64 tx_byte_cnt; /* good bytes count (without FCS) */ 249*4882a593Smuzhiyun u64 tx_sz_64; /* packets that are 64 bytes */ 250*4882a593Smuzhiyun u64 tx_sz_65_127; /* packets that are 65-127 bytes */ 251*4882a593Smuzhiyun u64 tx_sz_128_255; /* packets that are 128-255 bytes */ 252*4882a593Smuzhiyun u64 tx_sz_256_511; /* packets that are 256-511 bytes */ 253*4882a593Smuzhiyun u64 tx_sz_512_1023; /* packets that are 512-1023 bytes */ 254*4882a593Smuzhiyun u64 tx_sz_1024_1518; /* packets that are 1024-1518 bytes */ 255*4882a593Smuzhiyun u64 tx_sz_1519_max; /* packets that are 1519-MTU bytes */ 256*4882a593Smuzhiyun u64 tx_1_col; /* packets single prior collision */ 257*4882a593Smuzhiyun u64 tx_2_col; /* packets with multiple prior collisions */ 258*4882a593Smuzhiyun u64 tx_late_col; /* packets with late collisions */ 259*4882a593Smuzhiyun u64 tx_abort_col; /* packets aborted due to excess collisions */ 260*4882a593Smuzhiyun u64 tx_underrun; /* packets aborted due to FIFO underrun */ 261*4882a593Smuzhiyun u64 tx_rd_eop; /* count of reads beyond EOP */ 262*4882a593Smuzhiyun u64 tx_len_err; /* packets with length mismatch */ 263*4882a593Smuzhiyun u64 tx_trunc; /* packets truncated due to size >MTU */ 264*4882a593Smuzhiyun u64 tx_bcast_byte; /* broadcast packets byte count (without FCS) */ 265*4882a593Smuzhiyun u64 tx_mcast_byte; /* multicast packets byte count (without FCS) */ 266*4882a593Smuzhiyun u64 tx_col; /* collisions */ 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun spinlock_t lock; /* prevent multiple simultaneous readers */ 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* RSS hstype Definitions */ 272*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_IPV4_EN 0x00000001 273*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_TCP4_EN 0x00000002 274*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_IPV6_EN 0x00000004 275*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_TCP6_EN 0x00000008 276*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_ALL_EN (\ 277*4882a593Smuzhiyun EMAC_RSS_HSTYP_IPV4_EN |\ 278*4882a593Smuzhiyun EMAC_RSS_HSTYP_TCP4_EN |\ 279*4882a593Smuzhiyun EMAC_RSS_HSTYP_IPV6_EN |\ 280*4882a593Smuzhiyun EMAC_RSS_HSTYP_TCP6_EN) 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define EMAC_VLAN_TO_TAG(_vlan, _tag) \ 283*4882a593Smuzhiyun (_tag = ((((_vlan) >> 8) & 0xFF) | (((_vlan) & 0xFF) << 8))) 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun #define EMAC_TAG_TO_VLAN(_tag, _vlan) \ 286*4882a593Smuzhiyun (_vlan = ((((_tag) >> 8) & 0xFF) | (((_tag) & 0xFF) << 8))) 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun #define EMAC_DEF_RX_BUF_SIZE 1536 289*4882a593Smuzhiyun #define EMAC_MAX_JUMBO_PKT_SIZE (9 * 1024) 290*4882a593Smuzhiyun #define EMAC_MAX_TX_OFFLOAD_THRESH (9 * 1024) 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun #define EMAC_MAX_ETH_FRAME_SIZE EMAC_MAX_JUMBO_PKT_SIZE 293*4882a593Smuzhiyun #define EMAC_MIN_ETH_FRAME_SIZE 68 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define EMAC_DEF_TX_QUEUES 1 296*4882a593Smuzhiyun #define EMAC_DEF_RX_QUEUES 1 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun #define EMAC_MIN_TX_DESCS 128 299*4882a593Smuzhiyun #define EMAC_MIN_RX_DESCS 128 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun #define EMAC_MAX_TX_DESCS 16383 302*4882a593Smuzhiyun #define EMAC_MAX_RX_DESCS 2047 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun #define EMAC_DEF_TX_DESCS 512 305*4882a593Smuzhiyun #define EMAC_DEF_RX_DESCS 256 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun #define EMAC_DEF_RX_IRQ_MOD 250 308*4882a593Smuzhiyun #define EMAC_DEF_TX_IRQ_MOD 250 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun #define EMAC_WATCHDOG_TIME (5 * HZ) 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun /* by default check link every 4 seconds */ 313*4882a593Smuzhiyun #define EMAC_TRY_LINK_TIMEOUT (4 * HZ) 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun /* emac_irq per-device (per-adapter) irq properties. 316*4882a593Smuzhiyun * @irq: irq number. 317*4882a593Smuzhiyun * @mask mask to use over status register. 318*4882a593Smuzhiyun */ 319*4882a593Smuzhiyun struct emac_irq { 320*4882a593Smuzhiyun unsigned int irq; 321*4882a593Smuzhiyun u32 mask; 322*4882a593Smuzhiyun }; 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun /* The device's main data structure */ 325*4882a593Smuzhiyun struct emac_adapter { 326*4882a593Smuzhiyun struct net_device *netdev; 327*4882a593Smuzhiyun struct mii_bus *mii_bus; 328*4882a593Smuzhiyun struct phy_device *phydev; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun void __iomem *base; 331*4882a593Smuzhiyun void __iomem *csr; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun struct emac_sgmii phy; 334*4882a593Smuzhiyun struct emac_stats stats; 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun struct emac_irq irq; 337*4882a593Smuzhiyun struct clk *clk[EMAC_CLK_CNT]; 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun /* All Descriptor memory */ 340*4882a593Smuzhiyun struct emac_ring_header ring_header; 341*4882a593Smuzhiyun struct emac_tx_queue tx_q; 342*4882a593Smuzhiyun struct emac_rx_queue rx_q; 343*4882a593Smuzhiyun unsigned int tx_desc_cnt; 344*4882a593Smuzhiyun unsigned int rx_desc_cnt; 345*4882a593Smuzhiyun unsigned int rrd_size; /* in quad words */ 346*4882a593Smuzhiyun unsigned int rfd_size; /* in quad words */ 347*4882a593Smuzhiyun unsigned int tpd_size; /* in quad words */ 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun unsigned int rxbuf_size; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /* Flow control / pause frames support. If automatic=True, do whatever 352*4882a593Smuzhiyun * the PHY does. Otherwise, use tx_flow_control and rx_flow_control. 353*4882a593Smuzhiyun */ 354*4882a593Smuzhiyun bool automatic; 355*4882a593Smuzhiyun bool tx_flow_control; 356*4882a593Smuzhiyun bool rx_flow_control; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /* True == use single-pause-frame mode. */ 359*4882a593Smuzhiyun bool single_pause_mode; 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun /* Ring parameter */ 362*4882a593Smuzhiyun u8 tpd_burst; 363*4882a593Smuzhiyun u8 rfd_burst; 364*4882a593Smuzhiyun unsigned int dmaw_dly_cnt; 365*4882a593Smuzhiyun unsigned int dmar_dly_cnt; 366*4882a593Smuzhiyun enum emac_dma_req_block dmar_block; 367*4882a593Smuzhiyun enum emac_dma_req_block dmaw_block; 368*4882a593Smuzhiyun enum emac_dma_order dma_order; 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun u32 irq_mod; 371*4882a593Smuzhiyun u32 preamble; 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun struct work_struct work_thread; 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun u16 msg_enable; 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun struct mutex reset_lock; 378*4882a593Smuzhiyun }; 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun int emac_reinit_locked(struct emac_adapter *adpt); 381*4882a593Smuzhiyun void emac_reg_update32(void __iomem *addr, u32 mask, u32 val); 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun void emac_set_ethtool_ops(struct net_device *netdev); 384*4882a593Smuzhiyun void emac_update_hw_stats(struct emac_adapter *adpt); 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun #endif /* _EMAC_H_ */ 387