M7350/kernel/drivers/net/ethernet/qualcomm/emac/emac_hw.h
2024-09-09 08:57:42 +00:00

153 lines
4.6 KiB
C

/* 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 <linux/mii.h>
#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_*/