162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* Altera Triple-Speed Ethernet MAC driver 362306a36Sopenharmony_ci * Copyright (C) 2008-2014 Altera Corporation. All rights reserved 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Contributors: 662306a36Sopenharmony_ci * Dalon Westergreen 762306a36Sopenharmony_ci * Thomas Chou 862306a36Sopenharmony_ci * Ian Abbott 962306a36Sopenharmony_ci * Yuriy Kozlov 1062306a36Sopenharmony_ci * Tobias Klauser 1162306a36Sopenharmony_ci * Andriy Smolskyy 1262306a36Sopenharmony_ci * Roman Bulgakov 1362306a36Sopenharmony_ci * Dmytro Mytarchuk 1462306a36Sopenharmony_ci * Matthew Gerlach 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * Original driver contributed by SLS. 1762306a36Sopenharmony_ci * Major updates contributed by GlobalLogic 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#ifndef __ALTERA_TSE_H__ 2162306a36Sopenharmony_ci#define __ALTERA_TSE_H__ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define ALTERA_TSE_RESOURCE_NAME "altera_tse" 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include <linux/bitops.h> 2662306a36Sopenharmony_ci#include <linux/if_vlan.h> 2762306a36Sopenharmony_ci#include <linux/list.h> 2862306a36Sopenharmony_ci#include <linux/netdevice.h> 2962306a36Sopenharmony_ci#include <linux/phy.h> 3062306a36Sopenharmony_ci#include <linux/phylink.h> 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define ALTERA_TSE_SW_RESET_WATCHDOG_CNTR 10000 3362306a36Sopenharmony_ci#define ALTERA_TSE_MAC_FIFO_WIDTH 4 /* TX/RX FIFO width in 3462306a36Sopenharmony_ci * bytes 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci/* Rx FIFO default settings */ 3762306a36Sopenharmony_ci#define ALTERA_TSE_RX_SECTION_EMPTY 16 3862306a36Sopenharmony_ci#define ALTERA_TSE_RX_SECTION_FULL 0 3962306a36Sopenharmony_ci#define ALTERA_TSE_RX_ALMOST_EMPTY 8 4062306a36Sopenharmony_ci#define ALTERA_TSE_RX_ALMOST_FULL 8 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/* Tx FIFO default settings */ 4362306a36Sopenharmony_ci#define ALTERA_TSE_TX_SECTION_EMPTY 16 4462306a36Sopenharmony_ci#define ALTERA_TSE_TX_SECTION_FULL 0 4562306a36Sopenharmony_ci#define ALTERA_TSE_TX_ALMOST_EMPTY 8 4662306a36Sopenharmony_ci#define ALTERA_TSE_TX_ALMOST_FULL 3 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* MAC function configuration default settings */ 4962306a36Sopenharmony_ci#define ALTERA_TSE_TX_IPG_LENGTH 12 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define ALTERA_TSE_PAUSE_QUANTA 0xffff 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define GET_BIT_VALUE(v, bit) (((v) >> (bit)) & 0x1) 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* MAC Command_Config Register Bit Definitions 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci#define MAC_CMDCFG_TX_ENA BIT(0) 5862306a36Sopenharmony_ci#define MAC_CMDCFG_RX_ENA BIT(1) 5962306a36Sopenharmony_ci#define MAC_CMDCFG_XON_GEN BIT(2) 6062306a36Sopenharmony_ci#define MAC_CMDCFG_ETH_SPEED BIT(3) 6162306a36Sopenharmony_ci#define MAC_CMDCFG_PROMIS_EN BIT(4) 6262306a36Sopenharmony_ci#define MAC_CMDCFG_PAD_EN BIT(5) 6362306a36Sopenharmony_ci#define MAC_CMDCFG_CRC_FWD BIT(6) 6462306a36Sopenharmony_ci#define MAC_CMDCFG_PAUSE_FWD BIT(7) 6562306a36Sopenharmony_ci#define MAC_CMDCFG_PAUSE_IGNORE BIT(8) 6662306a36Sopenharmony_ci#define MAC_CMDCFG_TX_ADDR_INS BIT(9) 6762306a36Sopenharmony_ci#define MAC_CMDCFG_HD_ENA BIT(10) 6862306a36Sopenharmony_ci#define MAC_CMDCFG_EXCESS_COL BIT(11) 6962306a36Sopenharmony_ci#define MAC_CMDCFG_LATE_COL BIT(12) 7062306a36Sopenharmony_ci#define MAC_CMDCFG_SW_RESET BIT(13) 7162306a36Sopenharmony_ci#define MAC_CMDCFG_MHASH_SEL BIT(14) 7262306a36Sopenharmony_ci#define MAC_CMDCFG_LOOP_ENA BIT(15) 7362306a36Sopenharmony_ci#define MAC_CMDCFG_TX_ADDR_SEL(v) (((v) & 0x7) << 16) 7462306a36Sopenharmony_ci#define MAC_CMDCFG_MAGIC_ENA BIT(19) 7562306a36Sopenharmony_ci#define MAC_CMDCFG_SLEEP BIT(20) 7662306a36Sopenharmony_ci#define MAC_CMDCFG_WAKEUP BIT(21) 7762306a36Sopenharmony_ci#define MAC_CMDCFG_XOFF_GEN BIT(22) 7862306a36Sopenharmony_ci#define MAC_CMDCFG_CNTL_FRM_ENA BIT(23) 7962306a36Sopenharmony_ci#define MAC_CMDCFG_NO_LGTH_CHECK BIT(24) 8062306a36Sopenharmony_ci#define MAC_CMDCFG_ENA_10 BIT(25) 8162306a36Sopenharmony_ci#define MAC_CMDCFG_RX_ERR_DISC BIT(26) 8262306a36Sopenharmony_ci#define MAC_CMDCFG_DISABLE_READ_TIMEOUT BIT(27) 8362306a36Sopenharmony_ci#define MAC_CMDCFG_CNT_RESET BIT(31) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define MAC_CMDCFG_TX_ENA_GET(v) GET_BIT_VALUE(v, 0) 8662306a36Sopenharmony_ci#define MAC_CMDCFG_RX_ENA_GET(v) GET_BIT_VALUE(v, 1) 8762306a36Sopenharmony_ci#define MAC_CMDCFG_XON_GEN_GET(v) GET_BIT_VALUE(v, 2) 8862306a36Sopenharmony_ci#define MAC_CMDCFG_ETH_SPEED_GET(v) GET_BIT_VALUE(v, 3) 8962306a36Sopenharmony_ci#define MAC_CMDCFG_PROMIS_EN_GET(v) GET_BIT_VALUE(v, 4) 9062306a36Sopenharmony_ci#define MAC_CMDCFG_PAD_EN_GET(v) GET_BIT_VALUE(v, 5) 9162306a36Sopenharmony_ci#define MAC_CMDCFG_CRC_FWD_GET(v) GET_BIT_VALUE(v, 6) 9262306a36Sopenharmony_ci#define MAC_CMDCFG_PAUSE_FWD_GET(v) GET_BIT_VALUE(v, 7) 9362306a36Sopenharmony_ci#define MAC_CMDCFG_PAUSE_IGNORE_GET(v) GET_BIT_VALUE(v, 8) 9462306a36Sopenharmony_ci#define MAC_CMDCFG_TX_ADDR_INS_GET(v) GET_BIT_VALUE(v, 9) 9562306a36Sopenharmony_ci#define MAC_CMDCFG_HD_ENA_GET(v) GET_BIT_VALUE(v, 10) 9662306a36Sopenharmony_ci#define MAC_CMDCFG_EXCESS_COL_GET(v) GET_BIT_VALUE(v, 11) 9762306a36Sopenharmony_ci#define MAC_CMDCFG_LATE_COL_GET(v) GET_BIT_VALUE(v, 12) 9862306a36Sopenharmony_ci#define MAC_CMDCFG_SW_RESET_GET(v) GET_BIT_VALUE(v, 13) 9962306a36Sopenharmony_ci#define MAC_CMDCFG_MHASH_SEL_GET(v) GET_BIT_VALUE(v, 14) 10062306a36Sopenharmony_ci#define MAC_CMDCFG_LOOP_ENA_GET(v) GET_BIT_VALUE(v, 15) 10162306a36Sopenharmony_ci#define MAC_CMDCFG_TX_ADDR_SEL_GET(v) (((v) >> 16) & 0x7) 10262306a36Sopenharmony_ci#define MAC_CMDCFG_MAGIC_ENA_GET(v) GET_BIT_VALUE(v, 19) 10362306a36Sopenharmony_ci#define MAC_CMDCFG_SLEEP_GET(v) GET_BIT_VALUE(v, 20) 10462306a36Sopenharmony_ci#define MAC_CMDCFG_WAKEUP_GET(v) GET_BIT_VALUE(v, 21) 10562306a36Sopenharmony_ci#define MAC_CMDCFG_XOFF_GEN_GET(v) GET_BIT_VALUE(v, 22) 10662306a36Sopenharmony_ci#define MAC_CMDCFG_CNTL_FRM_ENA_GET(v) GET_BIT_VALUE(v, 23) 10762306a36Sopenharmony_ci#define MAC_CMDCFG_NO_LGTH_CHECK_GET(v) GET_BIT_VALUE(v, 24) 10862306a36Sopenharmony_ci#define MAC_CMDCFG_ENA_10_GET(v) GET_BIT_VALUE(v, 25) 10962306a36Sopenharmony_ci#define MAC_CMDCFG_RX_ERR_DISC_GET(v) GET_BIT_VALUE(v, 26) 11062306a36Sopenharmony_ci#define MAC_CMDCFG_DISABLE_READ_TIMEOUT_GET(v) GET_BIT_VALUE(v, 27) 11162306a36Sopenharmony_ci#define MAC_CMDCFG_CNT_RESET_GET(v) GET_BIT_VALUE(v, 31) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* MDIO registers within MAC register Space 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_cistruct altera_tse_mdio { 11662306a36Sopenharmony_ci u32 control; /* PHY device operation control register */ 11762306a36Sopenharmony_ci u32 status; /* PHY device operation status register */ 11862306a36Sopenharmony_ci u32 phy_id1; /* Bits 31:16 of PHY identifier */ 11962306a36Sopenharmony_ci u32 phy_id2; /* Bits 15:0 of PHY identifier */ 12062306a36Sopenharmony_ci u32 auto_negotiation_advertisement; /* Auto-negotiation 12162306a36Sopenharmony_ci * advertisement 12262306a36Sopenharmony_ci * register 12362306a36Sopenharmony_ci */ 12462306a36Sopenharmony_ci u32 remote_partner_base_page_ability; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci u32 reg6; 12762306a36Sopenharmony_ci u32 reg7; 12862306a36Sopenharmony_ci u32 reg8; 12962306a36Sopenharmony_ci u32 reg9; 13062306a36Sopenharmony_ci u32 rega; 13162306a36Sopenharmony_ci u32 regb; 13262306a36Sopenharmony_ci u32 regc; 13362306a36Sopenharmony_ci u32 regd; 13462306a36Sopenharmony_ci u32 rege; 13562306a36Sopenharmony_ci u32 regf; 13662306a36Sopenharmony_ci u32 reg10; 13762306a36Sopenharmony_ci u32 reg11; 13862306a36Sopenharmony_ci u32 reg12; 13962306a36Sopenharmony_ci u32 reg13; 14062306a36Sopenharmony_ci u32 reg14; 14162306a36Sopenharmony_ci u32 reg15; 14262306a36Sopenharmony_ci u32 reg16; 14362306a36Sopenharmony_ci u32 reg17; 14462306a36Sopenharmony_ci u32 reg18; 14562306a36Sopenharmony_ci u32 reg19; 14662306a36Sopenharmony_ci u32 reg1a; 14762306a36Sopenharmony_ci u32 reg1b; 14862306a36Sopenharmony_ci u32 reg1c; 14962306a36Sopenharmony_ci u32 reg1d; 15062306a36Sopenharmony_ci u32 reg1e; 15162306a36Sopenharmony_ci u32 reg1f; 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* MAC register Space. Note that some of these registers may or may not be 15562306a36Sopenharmony_ci * present depending upon options chosen by the user when the core was 15662306a36Sopenharmony_ci * configured and built. Please consult the Altera Triple Speed Ethernet User 15762306a36Sopenharmony_ci * Guide for details. 15862306a36Sopenharmony_ci */ 15962306a36Sopenharmony_cistruct altera_tse_mac { 16062306a36Sopenharmony_ci /* Bits 15:0: MegaCore function revision (0x0800). Bit 31:16: Customer 16162306a36Sopenharmony_ci * specific revision 16262306a36Sopenharmony_ci */ 16362306a36Sopenharmony_ci u32 megacore_revision; 16462306a36Sopenharmony_ci /* Provides a memory location for user applications to test the device 16562306a36Sopenharmony_ci * memory operation. 16662306a36Sopenharmony_ci */ 16762306a36Sopenharmony_ci u32 scratch_pad; 16862306a36Sopenharmony_ci /* The host processor uses this register to control and configure the 16962306a36Sopenharmony_ci * MAC block 17062306a36Sopenharmony_ci */ 17162306a36Sopenharmony_ci u32 command_config; 17262306a36Sopenharmony_ci /* 32-bit primary MAC address word 0 bits 0 to 31 of the primary 17362306a36Sopenharmony_ci * MAC address 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ci u32 mac_addr_0; 17662306a36Sopenharmony_ci /* 32-bit primary MAC address word 1 bits 32 to 47 of the primary 17762306a36Sopenharmony_ci * MAC address 17862306a36Sopenharmony_ci */ 17962306a36Sopenharmony_ci u32 mac_addr_1; 18062306a36Sopenharmony_ci /* 14-bit maximum frame length. The MAC receive logic */ 18162306a36Sopenharmony_ci u32 frm_length; 18262306a36Sopenharmony_ci /* The pause quanta is used in each pause frame sent to a remote 18362306a36Sopenharmony_ci * Ethernet device, in increments of 512 Ethernet bit times 18462306a36Sopenharmony_ci */ 18562306a36Sopenharmony_ci u32 pause_quanta; 18662306a36Sopenharmony_ci /* 12-bit receive FIFO section-empty threshold */ 18762306a36Sopenharmony_ci u32 rx_section_empty; 18862306a36Sopenharmony_ci /* 12-bit receive FIFO section-full threshold */ 18962306a36Sopenharmony_ci u32 rx_section_full; 19062306a36Sopenharmony_ci /* 12-bit transmit FIFO section-empty threshold */ 19162306a36Sopenharmony_ci u32 tx_section_empty; 19262306a36Sopenharmony_ci /* 12-bit transmit FIFO section-full threshold */ 19362306a36Sopenharmony_ci u32 tx_section_full; 19462306a36Sopenharmony_ci /* 12-bit receive FIFO almost-empty threshold */ 19562306a36Sopenharmony_ci u32 rx_almost_empty; 19662306a36Sopenharmony_ci /* 12-bit receive FIFO almost-full threshold */ 19762306a36Sopenharmony_ci u32 rx_almost_full; 19862306a36Sopenharmony_ci /* 12-bit transmit FIFO almost-empty threshold */ 19962306a36Sopenharmony_ci u32 tx_almost_empty; 20062306a36Sopenharmony_ci /* 12-bit transmit FIFO almost-full threshold */ 20162306a36Sopenharmony_ci u32 tx_almost_full; 20262306a36Sopenharmony_ci /* MDIO address of PHY Device 0. Bits 0 to 4 hold a 5-bit PHY address */ 20362306a36Sopenharmony_ci u32 mdio_phy0_addr; 20462306a36Sopenharmony_ci /* MDIO address of PHY Device 1. Bits 0 to 4 hold a 5-bit PHY address */ 20562306a36Sopenharmony_ci u32 mdio_phy1_addr; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci /* Bit[15:0]—16-bit holdoff quanta */ 20862306a36Sopenharmony_ci u32 holdoff_quant; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci /* only if 100/1000 BaseX PCS, reserved otherwise */ 21162306a36Sopenharmony_ci u32 reserved1[5]; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci /* Minimum IPG between consecutive transmit frame in terms of bytes */ 21462306a36Sopenharmony_ci u32 tx_ipg_length; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci /* IEEE 802.3 oEntity Managed Object Support */ 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* The MAC addresses */ 21962306a36Sopenharmony_ci u32 mac_id_1; 22062306a36Sopenharmony_ci u32 mac_id_2; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* Number of frames transmitted without error including pause frames */ 22362306a36Sopenharmony_ci u32 frames_transmitted_ok; 22462306a36Sopenharmony_ci /* Number of frames received without error including pause frames */ 22562306a36Sopenharmony_ci u32 frames_received_ok; 22662306a36Sopenharmony_ci /* Number of frames received with a CRC error */ 22762306a36Sopenharmony_ci u32 frames_check_sequence_errors; 22862306a36Sopenharmony_ci /* Frame received with an alignment error */ 22962306a36Sopenharmony_ci u32 alignment_errors; 23062306a36Sopenharmony_ci /* Sum of payload and padding octets of frames transmitted without 23162306a36Sopenharmony_ci * error 23262306a36Sopenharmony_ci */ 23362306a36Sopenharmony_ci u32 octets_transmitted_ok; 23462306a36Sopenharmony_ci /* Sum of payload and padding octets of frames received without error */ 23562306a36Sopenharmony_ci u32 octets_received_ok; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /* IEEE 802.3 oPausedEntity Managed Object Support */ 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci /* Number of transmitted pause frames */ 24062306a36Sopenharmony_ci u32 tx_pause_mac_ctrl_frames; 24162306a36Sopenharmony_ci /* Number of Received pause frames */ 24262306a36Sopenharmony_ci u32 rx_pause_mac_ctrl_frames; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci /* IETF MIB (MIB-II) Object Support */ 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci /* Number of frames received with error */ 24762306a36Sopenharmony_ci u32 if_in_errors; 24862306a36Sopenharmony_ci /* Number of frames transmitted with error */ 24962306a36Sopenharmony_ci u32 if_out_errors; 25062306a36Sopenharmony_ci /* Number of valid received unicast frames */ 25162306a36Sopenharmony_ci u32 if_in_ucast_pkts; 25262306a36Sopenharmony_ci /* Number of valid received multicasts frames (without pause) */ 25362306a36Sopenharmony_ci u32 if_in_multicast_pkts; 25462306a36Sopenharmony_ci /* Number of valid received broadcast frames */ 25562306a36Sopenharmony_ci u32 if_in_broadcast_pkts; 25662306a36Sopenharmony_ci u32 if_out_discards; 25762306a36Sopenharmony_ci /* The number of valid unicast frames transmitted */ 25862306a36Sopenharmony_ci u32 if_out_ucast_pkts; 25962306a36Sopenharmony_ci /* The number of valid multicast frames transmitted, 26062306a36Sopenharmony_ci * excluding pause frames 26162306a36Sopenharmony_ci */ 26262306a36Sopenharmony_ci u32 if_out_multicast_pkts; 26362306a36Sopenharmony_ci u32 if_out_broadcast_pkts; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci /* IETF RMON MIB Object Support */ 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci /* Counts the number of dropped packets due to internal errors 26862306a36Sopenharmony_ci * of the MAC client. 26962306a36Sopenharmony_ci */ 27062306a36Sopenharmony_ci u32 ether_stats_drop_events; 27162306a36Sopenharmony_ci /* Total number of bytes received. Good and bad frames. */ 27262306a36Sopenharmony_ci u32 ether_stats_octets; 27362306a36Sopenharmony_ci /* Total number of packets received. Counts good and bad packets. */ 27462306a36Sopenharmony_ci u32 ether_stats_pkts; 27562306a36Sopenharmony_ci /* Number of packets received with less than 64 bytes. */ 27662306a36Sopenharmony_ci u32 ether_stats_undersize_pkts; 27762306a36Sopenharmony_ci /* The number of frames received that are longer than the 27862306a36Sopenharmony_ci * value configured in the frm_length register 27962306a36Sopenharmony_ci */ 28062306a36Sopenharmony_ci u32 ether_stats_oversize_pkts; 28162306a36Sopenharmony_ci /* Number of received packet with 64 bytes */ 28262306a36Sopenharmony_ci u32 ether_stats_pkts_64_octets; 28362306a36Sopenharmony_ci /* Frames (good and bad) with 65 to 127 bytes */ 28462306a36Sopenharmony_ci u32 ether_stats_pkts_65to127_octets; 28562306a36Sopenharmony_ci /* Frames (good and bad) with 128 to 255 bytes */ 28662306a36Sopenharmony_ci u32 ether_stats_pkts_128to255_octets; 28762306a36Sopenharmony_ci /* Frames (good and bad) with 256 to 511 bytes */ 28862306a36Sopenharmony_ci u32 ether_stats_pkts_256to511_octets; 28962306a36Sopenharmony_ci /* Frames (good and bad) with 512 to 1023 bytes */ 29062306a36Sopenharmony_ci u32 ether_stats_pkts_512to1023_octets; 29162306a36Sopenharmony_ci /* Frames (good and bad) with 1024 to 1518 bytes */ 29262306a36Sopenharmony_ci u32 ether_stats_pkts_1024to1518_octets; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci /* Any frame length from 1519 to the maximum length configured in the 29562306a36Sopenharmony_ci * frm_length register, if it is greater than 1518 29662306a36Sopenharmony_ci */ 29762306a36Sopenharmony_ci u32 ether_stats_pkts_1519tox_octets; 29862306a36Sopenharmony_ci /* Too long frames with CRC error */ 29962306a36Sopenharmony_ci u32 ether_stats_jabbers; 30062306a36Sopenharmony_ci /* Too short frames with CRC error */ 30162306a36Sopenharmony_ci u32 ether_stats_fragments; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci u32 reserved2; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci /* FIFO control register */ 30662306a36Sopenharmony_ci u32 tx_cmd_stat; 30762306a36Sopenharmony_ci u32 rx_cmd_stat; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci /* Extended Statistics Counters */ 31062306a36Sopenharmony_ci u32 msb_octets_transmitted_ok; 31162306a36Sopenharmony_ci u32 msb_octets_received_ok; 31262306a36Sopenharmony_ci u32 msb_ether_stats_octets; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci u32 reserved3; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci /* Multicast address resolution table, mapped in the controller address 31762306a36Sopenharmony_ci * space 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_ci u32 hash_table[64]; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci /* Registers 0 to 31 within PHY device 0/1 connected to the MDIO PHY 32262306a36Sopenharmony_ci * management interface 32362306a36Sopenharmony_ci */ 32462306a36Sopenharmony_ci struct altera_tse_mdio mdio_phy0; 32562306a36Sopenharmony_ci struct altera_tse_mdio mdio_phy1; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci /* 4 Supplemental MAC Addresses */ 32862306a36Sopenharmony_ci u32 supp_mac_addr_0_0; 32962306a36Sopenharmony_ci u32 supp_mac_addr_0_1; 33062306a36Sopenharmony_ci u32 supp_mac_addr_1_0; 33162306a36Sopenharmony_ci u32 supp_mac_addr_1_1; 33262306a36Sopenharmony_ci u32 supp_mac_addr_2_0; 33362306a36Sopenharmony_ci u32 supp_mac_addr_2_1; 33462306a36Sopenharmony_ci u32 supp_mac_addr_3_0; 33562306a36Sopenharmony_ci u32 supp_mac_addr_3_1; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci u32 reserved4[8]; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci /* IEEE 1588v2 Feature */ 34062306a36Sopenharmony_ci u32 tx_period; 34162306a36Sopenharmony_ci u32 tx_adjust_fns; 34262306a36Sopenharmony_ci u32 tx_adjust_ns; 34362306a36Sopenharmony_ci u32 rx_period; 34462306a36Sopenharmony_ci u32 rx_adjust_fns; 34562306a36Sopenharmony_ci u32 rx_adjust_ns; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci u32 reserved5[42]; 34862306a36Sopenharmony_ci}; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci#define tse_csroffs(a) (offsetof(struct altera_tse_mac, a)) 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci/* Transmit and Receive Command Registers Bit Definitions 35362306a36Sopenharmony_ci */ 35462306a36Sopenharmony_ci#define ALTERA_TSE_TX_CMD_STAT_OMIT_CRC BIT(17) 35562306a36Sopenharmony_ci#define ALTERA_TSE_TX_CMD_STAT_TX_SHIFT16 BIT(18) 35662306a36Sopenharmony_ci#define ALTERA_TSE_RX_CMD_STAT_RX_SHIFT16 BIT(25) 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci/* Wrapper around a pointer to a socket buffer, 35962306a36Sopenharmony_ci * so a DMA handle can be stored along with the buffer 36062306a36Sopenharmony_ci */ 36162306a36Sopenharmony_cistruct tse_buffer { 36262306a36Sopenharmony_ci struct list_head lh; 36362306a36Sopenharmony_ci struct sk_buff *skb; 36462306a36Sopenharmony_ci dma_addr_t dma_addr; 36562306a36Sopenharmony_ci u32 len; 36662306a36Sopenharmony_ci int mapped_as_page; 36762306a36Sopenharmony_ci}; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistruct altera_tse_private; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci#define ALTERA_DTYPE_SGDMA 1 37262306a36Sopenharmony_ci#define ALTERA_DTYPE_MSGDMA 2 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci/* standard DMA interface for SGDMA and MSGDMA */ 37562306a36Sopenharmony_cistruct altera_dmaops { 37662306a36Sopenharmony_ci int altera_dtype; 37762306a36Sopenharmony_ci int dmamask; 37862306a36Sopenharmony_ci void (*reset_dma)(struct altera_tse_private *); 37962306a36Sopenharmony_ci void (*enable_txirq)(struct altera_tse_private *); 38062306a36Sopenharmony_ci void (*enable_rxirq)(struct altera_tse_private *); 38162306a36Sopenharmony_ci void (*disable_txirq)(struct altera_tse_private *); 38262306a36Sopenharmony_ci void (*disable_rxirq)(struct altera_tse_private *); 38362306a36Sopenharmony_ci void (*clear_txirq)(struct altera_tse_private *); 38462306a36Sopenharmony_ci void (*clear_rxirq)(struct altera_tse_private *); 38562306a36Sopenharmony_ci int (*tx_buffer)(struct altera_tse_private *, struct tse_buffer *); 38662306a36Sopenharmony_ci u32 (*tx_completions)(struct altera_tse_private *); 38762306a36Sopenharmony_ci void (*add_rx_desc)(struct altera_tse_private *, struct tse_buffer *); 38862306a36Sopenharmony_ci u32 (*get_rx_status)(struct altera_tse_private *); 38962306a36Sopenharmony_ci int (*init_dma)(struct altera_tse_private *); 39062306a36Sopenharmony_ci void (*uninit_dma)(struct altera_tse_private *); 39162306a36Sopenharmony_ci void (*start_rxdma)(struct altera_tse_private *); 39262306a36Sopenharmony_ci}; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/* This structure is private to each device. 39562306a36Sopenharmony_ci */ 39662306a36Sopenharmony_cistruct altera_tse_private { 39762306a36Sopenharmony_ci struct net_device *dev; 39862306a36Sopenharmony_ci struct device *device; 39962306a36Sopenharmony_ci struct napi_struct napi; 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci /* MAC address space */ 40262306a36Sopenharmony_ci struct altera_tse_mac __iomem *mac_dev; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci /* TSE Revision */ 40562306a36Sopenharmony_ci u32 revision; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci /* mSGDMA Rx Dispatcher address space */ 40862306a36Sopenharmony_ci void __iomem *rx_dma_csr; 40962306a36Sopenharmony_ci void __iomem *rx_dma_desc; 41062306a36Sopenharmony_ci void __iomem *rx_dma_resp; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci /* mSGDMA Tx Dispatcher address space */ 41362306a36Sopenharmony_ci void __iomem *tx_dma_csr; 41462306a36Sopenharmony_ci void __iomem *tx_dma_desc; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci /* SGMII PCS address space */ 41762306a36Sopenharmony_ci void __iomem *pcs_base; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci /* Rx buffers queue */ 42062306a36Sopenharmony_ci struct tse_buffer *rx_ring; 42162306a36Sopenharmony_ci u32 rx_cons; 42262306a36Sopenharmony_ci u32 rx_prod; 42362306a36Sopenharmony_ci u32 rx_ring_size; 42462306a36Sopenharmony_ci u32 rx_dma_buf_sz; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci /* Tx ring buffer */ 42762306a36Sopenharmony_ci struct tse_buffer *tx_ring; 42862306a36Sopenharmony_ci u32 tx_prod; 42962306a36Sopenharmony_ci u32 tx_cons; 43062306a36Sopenharmony_ci u32 tx_ring_size; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci /* Interrupts */ 43362306a36Sopenharmony_ci u32 tx_irq; 43462306a36Sopenharmony_ci u32 rx_irq; 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci /* RX/TX MAC FIFO configs */ 43762306a36Sopenharmony_ci u32 tx_fifo_depth; 43862306a36Sopenharmony_ci u32 rx_fifo_depth; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci /* Hash filter settings */ 44162306a36Sopenharmony_ci u32 hash_filter; 44262306a36Sopenharmony_ci u32 added_unicast; 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci /* Descriptor memory info for managing SGDMA */ 44562306a36Sopenharmony_ci u32 txdescmem; 44662306a36Sopenharmony_ci u32 rxdescmem; 44762306a36Sopenharmony_ci dma_addr_t rxdescmem_busaddr; 44862306a36Sopenharmony_ci dma_addr_t txdescmem_busaddr; 44962306a36Sopenharmony_ci u32 txctrlreg; 45062306a36Sopenharmony_ci u32 rxctrlreg; 45162306a36Sopenharmony_ci dma_addr_t rxdescphys; 45262306a36Sopenharmony_ci dma_addr_t txdescphys; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci struct list_head txlisthd; 45562306a36Sopenharmony_ci struct list_head rxlisthd; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci /* MAC command_config register protection */ 45862306a36Sopenharmony_ci spinlock_t mac_cfg_lock; 45962306a36Sopenharmony_ci /* Tx path protection */ 46062306a36Sopenharmony_ci spinlock_t tx_lock; 46162306a36Sopenharmony_ci /* Rx DMA & interrupt control protection */ 46262306a36Sopenharmony_ci spinlock_t rxdma_irq_lock; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci /* PHY */ 46562306a36Sopenharmony_ci int phy_addr; /* PHY's MDIO address, -1 for autodetection */ 46662306a36Sopenharmony_ci phy_interface_t phy_iface; 46762306a36Sopenharmony_ci struct mii_bus *mdio; 46862306a36Sopenharmony_ci int oldspeed; 46962306a36Sopenharmony_ci int oldduplex; 47062306a36Sopenharmony_ci int oldlink; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci /* ethtool msglvl option */ 47362306a36Sopenharmony_ci u32 msg_enable; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci struct altera_dmaops *dmaops; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci struct phylink *phylink; 47862306a36Sopenharmony_ci struct phylink_config phylink_config; 47962306a36Sopenharmony_ci struct phylink_pcs *pcs; 48062306a36Sopenharmony_ci}; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci/* Function prototypes 48362306a36Sopenharmony_ci */ 48462306a36Sopenharmony_civoid altera_tse_set_ethtool_ops(struct net_device *); 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic inline 48762306a36Sopenharmony_ciu32 csrrd32(void __iomem *mac, size_t offs) 48862306a36Sopenharmony_ci{ 48962306a36Sopenharmony_ci void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs); 49062306a36Sopenharmony_ci return readl(paddr); 49162306a36Sopenharmony_ci} 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_cistatic inline 49462306a36Sopenharmony_ciu16 csrrd16(void __iomem *mac, size_t offs) 49562306a36Sopenharmony_ci{ 49662306a36Sopenharmony_ci void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs); 49762306a36Sopenharmony_ci return readw(paddr); 49862306a36Sopenharmony_ci} 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_cistatic inline 50162306a36Sopenharmony_ciu8 csrrd8(void __iomem *mac, size_t offs) 50262306a36Sopenharmony_ci{ 50362306a36Sopenharmony_ci void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs); 50462306a36Sopenharmony_ci return readb(paddr); 50562306a36Sopenharmony_ci} 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cistatic inline 50862306a36Sopenharmony_civoid csrwr32(u32 val, void __iomem *mac, size_t offs) 50962306a36Sopenharmony_ci{ 51062306a36Sopenharmony_ci void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs); 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci writel(val, paddr); 51362306a36Sopenharmony_ci} 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_cistatic inline 51662306a36Sopenharmony_civoid csrwr16(u16 val, void __iomem *mac, size_t offs) 51762306a36Sopenharmony_ci{ 51862306a36Sopenharmony_ci void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs); 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci writew(val, paddr); 52162306a36Sopenharmony_ci} 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_cistatic inline 52462306a36Sopenharmony_civoid csrwr8(u8 val, void __iomem *mac, size_t offs) 52562306a36Sopenharmony_ci{ 52662306a36Sopenharmony_ci void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci writeb(val, paddr); 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci#endif /* __ALTERA_TSE_H__ */ 532