/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _EMAC_H_ #define _EMAC_H_ #include #include #include #include #include "emac-mac.h" #include "emac-phy.h" /* EMAC base register offsets */ #define EMAC_DMA_MAS_CTRL 0x001400 #define EMAC_IRQ_MOD_TIM_INIT 0x001408 #define EMAC_BLK_IDLE_STS 0x00140c #define EMAC_PHY_LINK_DELAY 0x00141c #define EMAC_SYS_ALIV_CTRL 0x001434 #define EMAC_MAC_IPGIFG_CTRL 0x001484 #define EMAC_MAC_STA_ADDR0 0x001488 #define EMAC_MAC_STA_ADDR1 0x00148c #define EMAC_HASH_TAB_REG0 0x001490 #define EMAC_HASH_TAB_REG1 0x001494 #define EMAC_MAC_HALF_DPLX_CTRL 0x001498 #define EMAC_MAX_FRAM_LEN_CTRL 0x00149c #define EMAC_INT_STATUS 0x001600 #define EMAC_INT_MASK 0x001604 #define EMAC_RXMAC_STATC_REG0 0x001700 #define EMAC_RXMAC_STATC_REG22 0x001758 #define EMAC_TXMAC_STATC_REG0 0x001760 #define EMAC_TXMAC_STATC_REG24 0x0017c0 #define EMAC_CORE_HW_VERSION 0x001974 #define EMAC_IDT_TABLE0 0x001b00 #define EMAC_RXMAC_STATC_REG23 0x001bc8 #define EMAC_RXMAC_STATC_REG24 0x001bcc #define EMAC_TXMAC_STATC_REG25 0x001bd0 #define EMAC_INT1_MASK 0x001bf0 #define EMAC_INT1_STATUS 0x001bf4 #define EMAC_INT2_MASK 0x001bf8 #define EMAC_INT2_STATUS 0x001bfc #define EMAC_INT3_MASK 0x001c00 #define EMAC_INT3_STATUS 0x001c04 /* EMAC_DMA_MAS_CTRL */ #define DEV_ID_NUM_BMSK 0x7f000000 #define DEV_ID_NUM_SHFT 24 #define DEV_REV_NUM_BMSK 0xff0000 #define DEV_REV_NUM_SHFT 16 #define INT_RD_CLR_EN 0x4000 #define IRQ_MODERATOR2_EN 0x800 #define IRQ_MODERATOR_EN 0x400 #define LPW_CLK_SEL 0x80 #define LPW_STATE 0x20 #define LPW_MODE 0x10 #define SOFT_RST 0x1 /* EMAC_IRQ_MOD_TIM_INIT */ #define IRQ_MODERATOR2_INIT_BMSK 0xffff0000 #define IRQ_MODERATOR2_INIT_SHFT 16 #define IRQ_MODERATOR_INIT_BMSK 0xffff #define IRQ_MODERATOR_INIT_SHFT 0 /* EMAC_INT_STATUS */ #define DIS_INT BIT(31) #define PTP_INT BIT(30) #define RFD4_UR_INT BIT(29) #define TX_PKT_INT3 BIT(26) #define TX_PKT_INT2 BIT(25) #define TX_PKT_INT1 BIT(24) #define RX_PKT_INT3 BIT(19) #define RX_PKT_INT2 BIT(18) #define RX_PKT_INT1 BIT(17) #define RX_PKT_INT0 BIT(16) #define TX_PKT_INT BIT(15) #define TXQ_TO_INT BIT(14) #define GPHY_WAKEUP_INT BIT(13) #define GPHY_LINK_DOWN_INT BIT(12) #define GPHY_LINK_UP_INT BIT(11) #define DMAW_TO_INT BIT(10) #define DMAR_TO_INT BIT(9) #define TXF_UR_INT BIT(8) #define RFD3_UR_INT BIT(7) #define RFD2_UR_INT BIT(6) #define RFD1_UR_INT BIT(5) #define RFD0_UR_INT BIT(4) #define RXF_OF_INT BIT(3) #define SW_MAN_INT BIT(2) /* EMAC_MAILBOX_6 */ #define RFD2_PROC_IDX_BMSK 0xfff0000 #define RFD2_PROC_IDX_SHFT 16 #define RFD2_PROD_IDX_BMSK 0xfff #define RFD2_PROD_IDX_SHFT 0 /* EMAC_CORE_HW_VERSION */ #define MAJOR_BMSK 0xf0000000 #define MAJOR_SHFT 28 #define MINOR_BMSK 0xfff0000 #define MINOR_SHFT 16 #define STEP_BMSK 0xffff #define STEP_SHFT 0 /* EMAC_EMAC_WRAPPER_CSR1 */ #define TX_INDX_FIFO_SYNC_RST BIT(23) #define TX_TS_FIFO_SYNC_RST BIT(22) #define RX_TS_FIFO2_SYNC_RST BIT(21) #define RX_TS_FIFO1_SYNC_RST BIT(20) #define TX_TS_ENABLE BIT(16) #define DIS_1588_CLKS BIT(11) #define FREQ_MODE BIT(9) #define ENABLE_RRD_TIMESTAMP BIT(3) /* EMAC_EMAC_WRAPPER_CSR2 */ #define HDRIVE_BMSK 0x3000 #define HDRIVE_SHFT 12 #define SLB_EN BIT(9) #define PLB_EN BIT(8) #define WOL_EN BIT(3) #define PHY_RESET BIT(0) #define EMAC_DEV_ID 0x0040 /* SGMII v2 per lane registers */ #define SGMII_LN_RSM_START 0x029C /* SGMII v2 PHY common registers */ #define SGMII_PHY_CMN_CTRL 0x0408 #define SGMII_PHY_CMN_RESET_CTRL 0x0410 /* SGMII v2 PHY registers per lane */ #define SGMII_PHY_LN_OFFSET 0x0400 #define SGMII_PHY_LN_LANE_STATUS 0x00DC #define SGMII_PHY_LN_BIST_GEN0 0x008C #define SGMII_PHY_LN_BIST_GEN1 0x0090 #define SGMII_PHY_LN_BIST_GEN2 0x0094 #define SGMII_PHY_LN_BIST_GEN3 0x0098 #define SGMII_PHY_LN_CDR_CTRL1 0x005C enum emac_clk_id { EMAC_CLK_AXI, EMAC_CLK_CFG_AHB, EMAC_CLK_HIGH_SPEED, EMAC_CLK_MDIO, EMAC_CLK_TX, EMAC_CLK_RX, EMAC_CLK_SYS, EMAC_CLK_CNT }; #define EMAC_LINK_SPEED_UNKNOWN 0x0 #define EMAC_LINK_SPEED_10_HALF BIT(0) #define EMAC_LINK_SPEED_10_FULL BIT(1) #define EMAC_LINK_SPEED_100_HALF BIT(2) #define EMAC_LINK_SPEED_100_FULL BIT(3) #define EMAC_LINK_SPEED_1GB_FULL BIT(5) #define EMAC_MAX_SETUP_LNK_CYCLE 100 /* Wake On Lan */ #define EMAC_WOL_PHY 0x00000001 /* PHY Status Change */ #define EMAC_WOL_MAGIC 0x00000002 /* Magic Packet */ struct emac_stats { /* rx */ u64 rx_ok; /* good packets */ u64 rx_bcast; /* good broadcast packets */ u64 rx_mcast; /* good multicast packets */ u64 rx_pause; /* pause packet */ u64 rx_ctrl; /* control packets other than pause frame. */ u64 rx_fcs_err; /* packets with bad FCS. */ u64 rx_len_err; /* packets with length mismatch */ u64 rx_byte_cnt; /* good bytes count (without FCS) */ u64 rx_runt; /* runt packets */ u64 rx_frag; /* fragment count */ u64 rx_sz_64; /* packets that are 64 bytes */ u64 rx_sz_65_127; /* packets that are 65-127 bytes */ u64 rx_sz_128_255; /* packets that are 128-255 bytes */ u64 rx_sz_256_511; /* packets that are 256-511 bytes */ u64 rx_sz_512_1023; /* packets that are 512-1023 bytes */ u64 rx_sz_1024_1518; /* packets that are 1024-1518 bytes */ u64 rx_sz_1519_max; /* packets that are 1519-MTU bytes*/ u64 rx_sz_ov; /* packets that are >MTU bytes (truncated) */ u64 rx_rxf_ov; /* packets dropped due to RX FIFO overflow */ u64 rx_align_err; /* alignment errors */ u64 rx_bcast_byte_cnt; /* broadcast packets byte count (without FCS) */ u64 rx_mcast_byte_cnt; /* multicast packets byte count (without FCS) */ u64 rx_err_addr; /* packets dropped due to address filtering */ u64 rx_crc_align; /* CRC align errors */ u64 rx_jabbers; /* jabbers */ /* tx */ u64 tx_ok; /* good packets */ u64 tx_bcast; /* good broadcast packets */ u64 tx_mcast; /* good multicast packets */ u64 tx_pause; /* pause packets */ u64 tx_exc_defer; /* packets with excessive deferral */ u64 tx_ctrl; /* control packets other than pause frame */ u64 tx_defer; /* packets that are deferred. */ u64 tx_byte_cnt; /* good bytes count (without FCS) */ u64 tx_sz_64; /* packets that are 64 bytes */ u64 tx_sz_65_127; /* packets that are 65-127 bytes */ u64 tx_sz_128_255; /* packets that are 128-255 bytes */ u64 tx_sz_256_511; /* packets that are 256-511 bytes */ u64 tx_sz_512_1023; /* packets that are 512-1023 bytes */ u64 tx_sz_1024_1518; /* packets that are 1024-1518 bytes */ u64 tx_sz_1519_max; /* packets that are 1519-MTU bytes */ u64 tx_1_col; /* packets single prior collision */ u64 tx_2_col; /* packets with multiple prior collisions */ u64 tx_late_col; /* packets with late collisions */ u64 tx_abort_col; /* packets aborted due to excess collisions */ u64 tx_underrun; /* packets aborted due to FIFO underrun */ u64 tx_rd_eop; /* count of reads beyond EOP */ u64 tx_len_err; /* packets with length mismatch */ u64 tx_trunc; /* packets truncated due to size >MTU */ u64 tx_bcast_byte; /* broadcast packets byte count (without FCS) */ u64 tx_mcast_byte; /* multicast packets byte count (without FCS) */ u64 tx_col; /* collisions */ spinlock_t lock; /* prevent multiple simultaneous readers */ }; /* RSS hstype Definitions */ #define EMAC_RSS_HSTYP_IPV4_EN 0x00000001 #define EMAC_RSS_HSTYP_TCP4_EN 0x00000002 #define EMAC_RSS_HSTYP_IPV6_EN 0x00000004 #define EMAC_RSS_HSTYP_TCP6_EN 0x00000008 #define EMAC_RSS_HSTYP_ALL_EN (\ EMAC_RSS_HSTYP_IPV4_EN |\ EMAC_RSS_HSTYP_TCP4_EN |\ EMAC_RSS_HSTYP_IPV6_EN |\ EMAC_RSS_HSTYP_TCP6_EN) #define EMAC_VLAN_TO_TAG(_vlan, _tag) \ (_tag = ((((_vlan) >> 8) & 0xFF) | (((_vlan) & 0xFF) << 8))) #define EMAC_TAG_TO_VLAN(_tag, _vlan) \ (_vlan = ((((_tag) >> 8) & 0xFF) | (((_tag) & 0xFF) << 8))) #define EMAC_DEF_RX_BUF_SIZE 1536 #define EMAC_MAX_JUMBO_PKT_SIZE (9 * 1024) #define EMAC_MAX_TX_OFFLOAD_THRESH (9 * 1024) #define EMAC_MAX_ETH_FRAME_SIZE EMAC_MAX_JUMBO_PKT_SIZE #define EMAC_MIN_ETH_FRAME_SIZE 68 #define EMAC_DEF_TX_QUEUES 1 #define EMAC_DEF_RX_QUEUES 1 #define EMAC_MIN_TX_DESCS 128 #define EMAC_MIN_RX_DESCS 128 #define EMAC_MAX_TX_DESCS 16383 #define EMAC_MAX_RX_DESCS 2047 #define EMAC_DEF_TX_DESCS 512 #define EMAC_DEF_RX_DESCS 256 #define EMAC_DEF_RX_IRQ_MOD 250 #define EMAC_DEF_TX_IRQ_MOD 250 #define EMAC_WATCHDOG_TIME (5 * HZ) /* by default check link every 4 seconds */ #define EMAC_TRY_LINK_TIMEOUT (4 * HZ) /* emac_irq per-device (per-adapter) irq properties. * @irq: irq number. * @mask mask to use over status register. */ struct emac_irq { unsigned int irq; u32 mask; }; /* The device's main data structure */ struct emac_adapter { struct net_device *netdev; struct mii_bus *mii_bus; struct phy_device *phydev; void __iomem *base; void __iomem *csr; struct emac_phy phy; struct emac_stats stats; struct emac_irq irq; struct clk *clk[EMAC_CLK_CNT]; /* All Descriptor memory */ struct emac_ring_header ring_header; struct emac_tx_queue tx_q; struct emac_rx_queue rx_q; unsigned int tx_desc_cnt; unsigned int rx_desc_cnt; unsigned int rrd_size; /* in quad words */ unsigned int rfd_size; /* in quad words */ unsigned int tpd_size; /* in quad words */ unsigned int rxbuf_size; /* Ring parameter */ u8 tpd_burst; u8 rfd_burst; unsigned int dmaw_dly_cnt; unsigned int dmar_dly_cnt; enum emac_dma_req_block dmar_block; enum emac_dma_req_block dmaw_block; enum emac_dma_order dma_order; u32 irq_mod; u32 preamble; struct work_struct work_thread; u16 msg_enable; struct mutex reset_lock; }; int emac_reinit_locked(struct emac_adapter *adpt); void emac_reg_update32(void __iomem *addr, u32 mask, u32 val); irqreturn_t emac_isr(int irq, void *data); #endif /* _EMAC_H_ */