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