/* 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_HW_H_ #define _EMAC_HW_H_ #include #include "emac.h" #include "emac_regs.h" #include "emac_defines.h" /* function prototype */ /* REG */ u32 emac_reg_r32(struct emac_hw *hw, u8 base, u32 reg); void emac_reg_w32(struct emac_hw *hw, u8 base, u32 reg, u32 val); void emac_reg_update32(struct emac_hw *hw, u8 base, u32 reg, u32 mask, u32 val); u32 emac_reg_field_r32(struct emac_hw *hw, u8 base, u32 reg, u32 mask, u32 shift); void emac_hw_config_pow_save(struct emac_hw *hw, u32 speed, bool wol_en, bool rx_en); /* MAC */ void emac_hw_enable_intr(struct emac_hw *hw); void emac_hw_disable_intr(struct emac_hw *hw); void emac_hw_set_mc_addr(struct emac_hw *hw, u8 *addr); void emac_hw_clear_mc_addr(struct emac_hw *hw); void emac_hw_config_mac_ctrl(struct emac_hw *hw); void emac_hw_config_rss(struct emac_hw *hw); void emac_hw_config_wol(struct emac_hw *hw, u32 wufc); int emac_hw_config_fc(struct emac_hw *hw); void emac_hw_reset_mac(struct emac_hw *hw); void emac_hw_config_mac(struct emac_hw *hw); void emac_hw_start_mac(struct emac_hw *hw); void emac_hw_stop_mac(struct emac_hw *hw); void emac_hw_set_mac_addr(struct emac_hw *hw, u8 *addr); /* TX Timestamp */ bool emac_hw_read_tx_tstamp(struct emac_hw *hw, struct emac_hwtxtstamp *ts); #define IMR_NORMAL_MASK (\ ISR_ERROR |\ ISR_GPHY_LINK |\ ISR_TX_PKT |\ GPHY_WAKEUP_INT) #define IMR_EXTENDED_MASK (\ SW_MAN_INT |\ ISR_OVER |\ ISR_ERROR |\ ISR_GPHY_LINK |\ ISR_TX_PKT |\ GPHY_WAKEUP_INT) #define ISR_RX_PKT (\ RX_PKT_INT0 |\ RX_PKT_INT1 |\ RX_PKT_INT2 |\ RX_PKT_INT3) #define ISR_TX_PKT (\ TX_PKT_INT |\ TX_PKT_INT1 |\ TX_PKT_INT2 |\ TX_PKT_INT3) #define ISR_GPHY_LINK (\ GPHY_LINK_UP_INT |\ GPHY_LINK_DOWN_INT) #define ISR_OVER (\ RFD0_UR_INT |\ RFD1_UR_INT |\ RFD2_UR_INT |\ RFD3_UR_INT |\ RFD4_UR_INT |\ RXF_OF_INT |\ TXF_UR_INT) #define ISR_ERROR (\ DMAR_TO_INT |\ DMAW_TO_INT |\ TXQ_TO_INT) #define REG_MAC_RX_STATUS_BIN EMAC_RXMAC_STATC_REG0 #define REG_MAC_RX_STATUS_END EMAC_RXMAC_STATC_REG22 #define REG_MAC_TX_STATUS_BIN EMAC_TXMAC_STATC_REG0 #define REG_MAC_TX_STATUS_END EMAC_TXMAC_STATC_REG24 #define RXQ0_NUM_RFD_PREF_DEF 8 #define TXQ0_NUM_TPD_PREF_DEF 5 #define EMAC_PREAMBLE_DEF 7 #define DMAR_DLY_CNT_DEF 15 #define DMAW_DLY_CNT_DEF 4 #define MDIO_CLK_25_4 0 #define MDIO_CLK_25_28 7 #define RXQ0_RSS_HSTYP_IPV6_TCP_EN 0x20 #define RXQ0_RSS_HSTYP_IPV6_EN 0x10 #define RXQ0_RSS_HSTYP_IPV4_TCP_EN 0x8 #define RXQ0_RSS_HSTYP_IPV4_EN 0x4 #define MASTER_CTRL_CLK_SEL_DIS 0x1000 #define MDIO_WAIT_TIMES 1000 /* PHY */ #define MII_PSSR 0x11 /* PHY Specific Status Reg */ #define MII_DBG_ADDR 0x1D /* PHY Debug Address Reg */ #define MII_DBG_DATA 0x1E /* PHY Debug Data Reg */ #define MII_INT_ENABLE 0x12 /* PHY Interrupt Enable Reg */ #define MII_INT_STATUS 0x13 /* PHY Interrupt Status Reg */ /* MII_BMCR (0x00) */ #define BMCR_SPEED10 0x0000 /* MII_PSSR (0x11) */ #define PSSR_FC_RXEN 0x0004 #define PSSR_FC_TXEN 0x0008 #define PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */ #define PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */ #define PSSR_SPEED 0xC000 /* Speed, bits 14:15 */ #define PSSR_10MBS 0x0000 /* 00=10Mbs */ #define PSSR_100MBS 0x4000 /* 01=100Mbs */ #define PSSR_1000MBS 0x8000 /* 10=1000Mbs */ /* MII DBG registers */ #define HIBERNATE_CTRL_REG 0xB /* HIBERNATE_CTRL_REG */ #define HIBERNATE_EN 0x8000 /* MII_INT_ENABLE/MII_INT_STATUS */ #define LINK_SUCCESS_INTERRUPT 0x400 #define LINK_SUCCESS_BX 0x80 #endif /*_EMAC_HW_H_*/