162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/* 10G controller driver for Samsung SoCs
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2013 Samsung Electronics Co., Ltd.
562306a36Sopenharmony_ci *		http://www.samsung.com
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __SXGBE_COMMON_H__
1162306a36Sopenharmony_ci#define __SXGBE_COMMON_H__
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* forward references */
1462306a36Sopenharmony_cistruct sxgbe_desc_ops;
1562306a36Sopenharmony_cistruct sxgbe_dma_ops;
1662306a36Sopenharmony_cistruct sxgbe_mtl_ops;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define SXGBE_RESOURCE_NAME	"sam_sxgbeeth"
1962306a36Sopenharmony_ci#define DRV_MODULE_VERSION	"November_2013"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* MAX HW feature words */
2262306a36Sopenharmony_ci#define SXGBE_HW_WORDS 3
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define SXGBE_RX_COE_NONE	0
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* CSR Frequency Access Defines*/
2762306a36Sopenharmony_ci#define SXGBE_CSR_F_150M	150000000
2862306a36Sopenharmony_ci#define SXGBE_CSR_F_250M	250000000
2962306a36Sopenharmony_ci#define SXGBE_CSR_F_300M	300000000
3062306a36Sopenharmony_ci#define SXGBE_CSR_F_350M	350000000
3162306a36Sopenharmony_ci#define SXGBE_CSR_F_400M	400000000
3262306a36Sopenharmony_ci#define SXGBE_CSR_F_500M	500000000
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* pause time */
3562306a36Sopenharmony_ci#define SXGBE_PAUSE_TIME 0x200
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* tx queues */
3862306a36Sopenharmony_ci#define SXGBE_TX_QUEUES   8
3962306a36Sopenharmony_ci#define SXGBE_RX_QUEUES   16
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/* Calculated based how much time does it take to fill 256KB Rx memory
4262306a36Sopenharmony_ci * at 10Gb speed at 156MHz clock rate and considered little less then
4362306a36Sopenharmony_ci * the actual value.
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_ci#define SXGBE_MAX_DMA_RIWT	0x70
4662306a36Sopenharmony_ci#define SXGBE_MIN_DMA_RIWT	0x01
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* Tx coalesce parameters */
4962306a36Sopenharmony_ci#define SXGBE_COAL_TX_TIMER	40000
5062306a36Sopenharmony_ci#define SXGBE_MAX_COAL_TX_TICK	100000
5162306a36Sopenharmony_ci#define SXGBE_TX_MAX_FRAMES	512
5262306a36Sopenharmony_ci#define SXGBE_TX_FRAMES	128
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/* SXGBE TX FIFO is 8K, Rx FIFO is 16K */
5562306a36Sopenharmony_ci#define BUF_SIZE_16KiB 16384
5662306a36Sopenharmony_ci#define BUF_SIZE_8KiB 8192
5762306a36Sopenharmony_ci#define BUF_SIZE_4KiB 4096
5862306a36Sopenharmony_ci#define BUF_SIZE_2KiB 2048
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define SXGBE_DEFAULT_LIT_LS	0x3E8
6162306a36Sopenharmony_ci#define SXGBE_DEFAULT_TWT_LS	0x0
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* Flow Control defines */
6462306a36Sopenharmony_ci#define SXGBE_FLOW_OFF		0
6562306a36Sopenharmony_ci#define SXGBE_FLOW_RX		1
6662306a36Sopenharmony_ci#define SXGBE_FLOW_TX		2
6762306a36Sopenharmony_ci#define SXGBE_FLOW_AUTO		(SXGBE_FLOW_TX | SXGBE_FLOW_RX)
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define SF_DMA_MODE 1		/* DMA STORE-AND-FORWARD Operation Mode */
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* errors */
7262306a36Sopenharmony_ci#define RX_GMII_ERR		0x01
7362306a36Sopenharmony_ci#define RX_WATCHDOG_ERR		0x02
7462306a36Sopenharmony_ci#define RX_CRC_ERR		0x03
7562306a36Sopenharmony_ci#define RX_GAINT_ERR		0x04
7662306a36Sopenharmony_ci#define RX_IP_HDR_ERR		0x05
7762306a36Sopenharmony_ci#define RX_PAYLOAD_ERR		0x06
7862306a36Sopenharmony_ci#define RX_OVERFLOW_ERR		0x07
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* pkt type */
8162306a36Sopenharmony_ci#define RX_LEN_PKT		0x00
8262306a36Sopenharmony_ci#define RX_MACCTL_PKT		0x01
8362306a36Sopenharmony_ci#define RX_DCBCTL_PKT		0x02
8462306a36Sopenharmony_ci#define RX_ARP_PKT		0x03
8562306a36Sopenharmony_ci#define RX_OAM_PKT		0x04
8662306a36Sopenharmony_ci#define RX_UNTAG_PKT		0x05
8762306a36Sopenharmony_ci#define RX_OTHER_PKT		0x07
8862306a36Sopenharmony_ci#define RX_SVLAN_PKT		0x08
8962306a36Sopenharmony_ci#define RX_CVLAN_PKT		0x09
9062306a36Sopenharmony_ci#define RX_DVLAN_OCVLAN_ICVLAN_PKT		0x0A
9162306a36Sopenharmony_ci#define RX_DVLAN_OSVLAN_ISVLAN_PKT		0x0B
9262306a36Sopenharmony_ci#define RX_DVLAN_OSVLAN_ICVLAN_PKT		0x0C
9362306a36Sopenharmony_ci#define RX_DVLAN_OCVLAN_ISVLAN_PKT		0x0D
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#define RX_NOT_IP_PKT		0x00
9662306a36Sopenharmony_ci#define RX_IPV4_TCP_PKT		0x01
9762306a36Sopenharmony_ci#define RX_IPV4_UDP_PKT		0x02
9862306a36Sopenharmony_ci#define RX_IPV4_ICMP_PKT	0x03
9962306a36Sopenharmony_ci#define RX_IPV4_UNKNOWN_PKT	0x07
10062306a36Sopenharmony_ci#define RX_IPV6_TCP_PKT		0x09
10162306a36Sopenharmony_ci#define RX_IPV6_UDP_PKT		0x0A
10262306a36Sopenharmony_ci#define RX_IPV6_ICMP_PKT	0x0B
10362306a36Sopenharmony_ci#define RX_IPV6_UNKNOWN_PKT	0x0F
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define RX_NO_PTP		0x00
10662306a36Sopenharmony_ci#define RX_PTP_SYNC		0x01
10762306a36Sopenharmony_ci#define RX_PTP_FOLLOW_UP	0x02
10862306a36Sopenharmony_ci#define RX_PTP_DELAY_REQ	0x03
10962306a36Sopenharmony_ci#define RX_PTP_DELAY_RESP	0x04
11062306a36Sopenharmony_ci#define RX_PTP_PDELAY_REQ	0x05
11162306a36Sopenharmony_ci#define RX_PTP_PDELAY_RESP	0x06
11262306a36Sopenharmony_ci#define RX_PTP_PDELAY_FOLLOW_UP	0x07
11362306a36Sopenharmony_ci#define RX_PTP_ANNOUNCE		0x08
11462306a36Sopenharmony_ci#define RX_PTP_MGMT		0x09
11562306a36Sopenharmony_ci#define RX_PTP_SIGNAL		0x0A
11662306a36Sopenharmony_ci#define RX_PTP_RESV_MSG		0x0F
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/* EEE-LPI mode  flags*/
11962306a36Sopenharmony_ci#define TX_ENTRY_LPI_MODE	0x10
12062306a36Sopenharmony_ci#define TX_EXIT_LPI_MODE	0x20
12162306a36Sopenharmony_ci#define RX_ENTRY_LPI_MODE	0x40
12262306a36Sopenharmony_ci#define RX_EXIT_LPI_MODE	0x80
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/* EEE-LPI Interrupt status flag */
12562306a36Sopenharmony_ci#define LPI_INT_STATUS		BIT(5)
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci/* EEE-LPI Default timer values */
12862306a36Sopenharmony_ci#define LPI_LINK_STATUS_TIMER	0x3E8
12962306a36Sopenharmony_ci#define LPI_MAC_WAIT_TIMER	0x00
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci/* EEE-LPI Control and status definitions */
13262306a36Sopenharmony_ci#define LPI_CTRL_STATUS_TXA	BIT(19)
13362306a36Sopenharmony_ci#define LPI_CTRL_STATUS_PLSDIS	BIT(18)
13462306a36Sopenharmony_ci#define LPI_CTRL_STATUS_PLS	BIT(17)
13562306a36Sopenharmony_ci#define LPI_CTRL_STATUS_LPIEN	BIT(16)
13662306a36Sopenharmony_ci#define LPI_CTRL_STATUS_TXRSTP	BIT(11)
13762306a36Sopenharmony_ci#define LPI_CTRL_STATUS_RXRSTP	BIT(10)
13862306a36Sopenharmony_ci#define LPI_CTRL_STATUS_RLPIST	BIT(9)
13962306a36Sopenharmony_ci#define LPI_CTRL_STATUS_TLPIST	BIT(8)
14062306a36Sopenharmony_ci#define LPI_CTRL_STATUS_RLPIEX	BIT(3)
14162306a36Sopenharmony_ci#define LPI_CTRL_STATUS_RLPIEN	BIT(2)
14262306a36Sopenharmony_ci#define LPI_CTRL_STATUS_TLPIEX	BIT(1)
14362306a36Sopenharmony_ci#define LPI_CTRL_STATUS_TLPIEN	BIT(0)
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cienum dma_irq_status {
14662306a36Sopenharmony_ci	tx_hard_error	= BIT(0),
14762306a36Sopenharmony_ci	tx_bump_tc	= BIT(1),
14862306a36Sopenharmony_ci	handle_tx	= BIT(2),
14962306a36Sopenharmony_ci	rx_hard_error	= BIT(3),
15062306a36Sopenharmony_ci	rx_bump_tc	= BIT(4),
15162306a36Sopenharmony_ci	handle_rx	= BIT(5),
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci#define NETIF_F_HW_VLAN_ALL     (NETIF_F_HW_VLAN_CTAG_RX |	\
15562306a36Sopenharmony_ci				 NETIF_F_HW_VLAN_STAG_RX |	\
15662306a36Sopenharmony_ci				 NETIF_F_HW_VLAN_CTAG_TX |	\
15762306a36Sopenharmony_ci				 NETIF_F_HW_VLAN_STAG_TX |	\
15862306a36Sopenharmony_ci				 NETIF_F_HW_VLAN_CTAG_FILTER |	\
15962306a36Sopenharmony_ci				 NETIF_F_HW_VLAN_STAG_FILTER)
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci/* MMC control defines */
16262306a36Sopenharmony_ci#define SXGBE_MMC_CTRL_CNT_FRZ  0x00000008
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci/* SXGBE HW ADDR regs */
16562306a36Sopenharmony_ci#define SXGBE_ADDR_HIGH(reg)    (((reg > 15) ? 0x00000800 : 0x00000040) + \
16662306a36Sopenharmony_ci				 (reg * 8))
16762306a36Sopenharmony_ci#define SXGBE_ADDR_LOW(reg)     (((reg > 15) ? 0x00000804 : 0x00000044) + \
16862306a36Sopenharmony_ci				 (reg * 8))
16962306a36Sopenharmony_ci#define SXGBE_MAX_PERFECT_ADDRESSES 32 /* Maximum unicast perfect filtering */
17062306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER       0x00000004      /* Frame Filter */
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/* SXGBE Frame Filter defines */
17362306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_PR    0x00000001      /* Promiscuous Mode */
17462306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_HUC   0x00000002      /* Hash Unicast */
17562306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_HMC   0x00000004      /* Hash Multicast */
17662306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_DAIF  0x00000008      /* DA Inverse Filtering */
17762306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_PM    0x00000010      /* Pass all multicast */
17862306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_DBF   0x00000020      /* Disable Broadcast frames */
17962306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_SAIF  0x00000100      /* Inverse Filtering */
18062306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_SAF   0x00000200      /* Source Address Filter */
18162306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_HPF   0x00000400      /* Hash or perfect Filter */
18262306a36Sopenharmony_ci#define SXGBE_FRAME_FILTER_RA    0x80000000      /* Receive all mode */
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci#define SXGBE_HASH_TABLE_SIZE    64
18562306a36Sopenharmony_ci#define SXGBE_HASH_HIGH          0x00000008      /* Multicast Hash Table High */
18662306a36Sopenharmony_ci#define SXGBE_HASH_LOW           0x0000000c      /* Multicast Hash Table Low */
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci#define SXGBE_HI_REG_AE          0x80000000
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci/* Minimum and maximum MTU */
19162306a36Sopenharmony_ci#define MIN_MTU         68
19262306a36Sopenharmony_ci#define MAX_MTU         9000
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci#define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)			\
19562306a36Sopenharmony_ci	for (queue_num = 0; queue_num < max_queues; queue_num++)
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci#define DRV_VERSION "1.0.0"
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci#define SXGBE_MAX_RX_CHANNELS	16
20062306a36Sopenharmony_ci#define SXGBE_MAX_TX_CHANNELS	16
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci#define START_MAC_REG_OFFSET	0x0000
20362306a36Sopenharmony_ci#define MAX_MAC_REG_OFFSET	0x0DFC
20462306a36Sopenharmony_ci#define START_MTL_REG_OFFSET	0x1000
20562306a36Sopenharmony_ci#define MAX_MTL_REG_OFFSET	0x18FC
20662306a36Sopenharmony_ci#define START_DMA_REG_OFFSET	0x3000
20762306a36Sopenharmony_ci#define MAX_DMA_REG_OFFSET	0x38FC
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci#define REG_SPACE_SIZE		0x2000
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci/* sxgbe statistics counters */
21262306a36Sopenharmony_cistruct sxgbe_extra_stats {
21362306a36Sopenharmony_ci	/* TX/RX IRQ events */
21462306a36Sopenharmony_ci	unsigned long tx_underflow_irq;
21562306a36Sopenharmony_ci	unsigned long tx_process_stopped_irq;
21662306a36Sopenharmony_ci	unsigned long tx_ctxt_desc_err;
21762306a36Sopenharmony_ci	unsigned long tx_threshold;
21862306a36Sopenharmony_ci	unsigned long rx_threshold;
21962306a36Sopenharmony_ci	unsigned long tx_pkt_n;
22062306a36Sopenharmony_ci	unsigned long rx_pkt_n;
22162306a36Sopenharmony_ci	unsigned long normal_irq_n;
22262306a36Sopenharmony_ci	unsigned long tx_normal_irq_n;
22362306a36Sopenharmony_ci	unsigned long rx_normal_irq_n;
22462306a36Sopenharmony_ci	unsigned long napi_poll;
22562306a36Sopenharmony_ci	unsigned long tx_clean;
22662306a36Sopenharmony_ci	unsigned long tx_reset_ic_bit;
22762306a36Sopenharmony_ci	unsigned long rx_process_stopped_irq;
22862306a36Sopenharmony_ci	unsigned long rx_underflow_irq;
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	/* Bus access errors */
23162306a36Sopenharmony_ci	unsigned long fatal_bus_error_irq;
23262306a36Sopenharmony_ci	unsigned long tx_read_transfer_err;
23362306a36Sopenharmony_ci	unsigned long tx_write_transfer_err;
23462306a36Sopenharmony_ci	unsigned long tx_desc_access_err;
23562306a36Sopenharmony_ci	unsigned long tx_buffer_access_err;
23662306a36Sopenharmony_ci	unsigned long tx_data_transfer_err;
23762306a36Sopenharmony_ci	unsigned long rx_read_transfer_err;
23862306a36Sopenharmony_ci	unsigned long rx_write_transfer_err;
23962306a36Sopenharmony_ci	unsigned long rx_desc_access_err;
24062306a36Sopenharmony_ci	unsigned long rx_buffer_access_err;
24162306a36Sopenharmony_ci	unsigned long rx_data_transfer_err;
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	/* EEE-LPI stats */
24462306a36Sopenharmony_ci	unsigned long tx_lpi_entry_n;
24562306a36Sopenharmony_ci	unsigned long tx_lpi_exit_n;
24662306a36Sopenharmony_ci	unsigned long rx_lpi_entry_n;
24762306a36Sopenharmony_ci	unsigned long rx_lpi_exit_n;
24862306a36Sopenharmony_ci	unsigned long eee_wakeup_error_n;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	/* RX specific */
25162306a36Sopenharmony_ci	/* L2 error */
25262306a36Sopenharmony_ci	unsigned long rx_code_gmii_err;
25362306a36Sopenharmony_ci	unsigned long rx_watchdog_err;
25462306a36Sopenharmony_ci	unsigned long rx_crc_err;
25562306a36Sopenharmony_ci	unsigned long rx_gaint_pkt_err;
25662306a36Sopenharmony_ci	unsigned long ip_hdr_err;
25762306a36Sopenharmony_ci	unsigned long ip_payload_err;
25862306a36Sopenharmony_ci	unsigned long overflow_error;
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci	/* L2 Pkt type */
26162306a36Sopenharmony_ci	unsigned long len_pkt;
26262306a36Sopenharmony_ci	unsigned long mac_ctl_pkt;
26362306a36Sopenharmony_ci	unsigned long dcb_ctl_pkt;
26462306a36Sopenharmony_ci	unsigned long arp_pkt;
26562306a36Sopenharmony_ci	unsigned long oam_pkt;
26662306a36Sopenharmony_ci	unsigned long untag_okt;
26762306a36Sopenharmony_ci	unsigned long other_pkt;
26862306a36Sopenharmony_ci	unsigned long svlan_tag_pkt;
26962306a36Sopenharmony_ci	unsigned long cvlan_tag_pkt;
27062306a36Sopenharmony_ci	unsigned long dvlan_ocvlan_icvlan_pkt;
27162306a36Sopenharmony_ci	unsigned long dvlan_osvlan_isvlan_pkt;
27262306a36Sopenharmony_ci	unsigned long dvlan_osvlan_icvlan_pkt;
27362306a36Sopenharmony_ci	unsigned long dvan_ocvlan_icvlan_pkt;
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	/* L3/L4 Pkt type */
27662306a36Sopenharmony_ci	unsigned long not_ip_pkt;
27762306a36Sopenharmony_ci	unsigned long ip4_tcp_pkt;
27862306a36Sopenharmony_ci	unsigned long ip4_udp_pkt;
27962306a36Sopenharmony_ci	unsigned long ip4_icmp_pkt;
28062306a36Sopenharmony_ci	unsigned long ip4_unknown_pkt;
28162306a36Sopenharmony_ci	unsigned long ip6_tcp_pkt;
28262306a36Sopenharmony_ci	unsigned long ip6_udp_pkt;
28362306a36Sopenharmony_ci	unsigned long ip6_icmp_pkt;
28462306a36Sopenharmony_ci	unsigned long ip6_unknown_pkt;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	/* Filter specific */
28762306a36Sopenharmony_ci	unsigned long vlan_filter_match;
28862306a36Sopenharmony_ci	unsigned long sa_filter_fail;
28962306a36Sopenharmony_ci	unsigned long da_filter_fail;
29062306a36Sopenharmony_ci	unsigned long hash_filter_pass;
29162306a36Sopenharmony_ci	unsigned long l3_filter_match;
29262306a36Sopenharmony_ci	unsigned long l4_filter_match;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	/* RX context specific */
29562306a36Sopenharmony_ci	unsigned long timestamp_dropped;
29662306a36Sopenharmony_ci	unsigned long rx_msg_type_no_ptp;
29762306a36Sopenharmony_ci	unsigned long rx_ptp_type_sync;
29862306a36Sopenharmony_ci	unsigned long rx_ptp_type_follow_up;
29962306a36Sopenharmony_ci	unsigned long rx_ptp_type_delay_req;
30062306a36Sopenharmony_ci	unsigned long rx_ptp_type_delay_resp;
30162306a36Sopenharmony_ci	unsigned long rx_ptp_type_pdelay_req;
30262306a36Sopenharmony_ci	unsigned long rx_ptp_type_pdelay_resp;
30362306a36Sopenharmony_ci	unsigned long rx_ptp_type_pdelay_follow_up;
30462306a36Sopenharmony_ci	unsigned long rx_ptp_announce;
30562306a36Sopenharmony_ci	unsigned long rx_ptp_mgmt;
30662306a36Sopenharmony_ci	unsigned long rx_ptp_signal;
30762306a36Sopenharmony_ci	unsigned long rx_ptp_resv_msg_type;
30862306a36Sopenharmony_ci};
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_cistruct mac_link {
31162306a36Sopenharmony_ci	int port;
31262306a36Sopenharmony_ci	int duplex;
31362306a36Sopenharmony_ci	int speed;
31462306a36Sopenharmony_ci};
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct mii_regs {
31762306a36Sopenharmony_ci	unsigned int addr;	/* MII Address */
31862306a36Sopenharmony_ci	unsigned int data;	/* MII Data */
31962306a36Sopenharmony_ci};
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistruct sxgbe_core_ops {
32262306a36Sopenharmony_ci	/* MAC core initialization */
32362306a36Sopenharmony_ci	void (*core_init)(void __iomem *ioaddr);
32462306a36Sopenharmony_ci	/* Dump MAC registers */
32562306a36Sopenharmony_ci	void (*dump_regs)(void __iomem *ioaddr);
32662306a36Sopenharmony_ci	/* Handle extra events on specific interrupts hw dependent */
32762306a36Sopenharmony_ci	int (*host_irq_status)(void __iomem *ioaddr,
32862306a36Sopenharmony_ci			       struct sxgbe_extra_stats *x);
32962306a36Sopenharmony_ci	/* Set power management mode (e.g. magic frame) */
33062306a36Sopenharmony_ci	void (*pmt)(void __iomem *ioaddr, unsigned long mode);
33162306a36Sopenharmony_ci	/* Set/Get Unicast MAC addresses */
33262306a36Sopenharmony_ci	void (*set_umac_addr)(void __iomem *ioaddr, const unsigned char *addr,
33362306a36Sopenharmony_ci			      unsigned int reg_n);
33462306a36Sopenharmony_ci	void (*get_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
33562306a36Sopenharmony_ci			      unsigned int reg_n);
33662306a36Sopenharmony_ci	void (*enable_rx)(void __iomem *ioaddr, bool enable);
33762306a36Sopenharmony_ci	void (*enable_tx)(void __iomem *ioaddr, bool enable);
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	/* controller version specific operations */
34062306a36Sopenharmony_ci	int (*get_controller_version)(void __iomem *ioaddr);
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	/* If supported then get the optional core features */
34362306a36Sopenharmony_ci	unsigned int (*get_hw_feature)(void __iomem *ioaddr,
34462306a36Sopenharmony_ci				       unsigned char feature_index);
34562306a36Sopenharmony_ci	/* adjust SXGBE speed */
34662306a36Sopenharmony_ci	void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci	/* EEE-LPI specific operations */
34962306a36Sopenharmony_ci	void (*set_eee_mode)(void __iomem *ioaddr);
35062306a36Sopenharmony_ci	void (*reset_eee_mode)(void __iomem *ioaddr);
35162306a36Sopenharmony_ci	void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
35262306a36Sopenharmony_ci			      const int tw);
35362306a36Sopenharmony_ci	void (*set_eee_pls)(void __iomem *ioaddr, const int link);
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci	/* Enable disable checksum offload operations */
35662306a36Sopenharmony_ci	void (*enable_rx_csum)(void __iomem *ioaddr);
35762306a36Sopenharmony_ci	void (*disable_rx_csum)(void __iomem *ioaddr);
35862306a36Sopenharmony_ci	void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num);
35962306a36Sopenharmony_ci	void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num);
36062306a36Sopenharmony_ci};
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ciconst struct sxgbe_core_ops *sxgbe_get_core_ops(void);
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_cistruct sxgbe_ops {
36562306a36Sopenharmony_ci	const struct sxgbe_core_ops *mac;
36662306a36Sopenharmony_ci	const struct sxgbe_desc_ops *desc;
36762306a36Sopenharmony_ci	const struct sxgbe_dma_ops *dma;
36862306a36Sopenharmony_ci	const struct sxgbe_mtl_ops *mtl;
36962306a36Sopenharmony_ci	struct mii_regs mii;	/* MII register Addresses */
37062306a36Sopenharmony_ci	struct mac_link link;
37162306a36Sopenharmony_ci	unsigned int ctrl_uid;
37262306a36Sopenharmony_ci	unsigned int ctrl_id;
37362306a36Sopenharmony_ci};
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci/* SXGBE private data structures */
37662306a36Sopenharmony_cistruct sxgbe_tx_queue {
37762306a36Sopenharmony_ci	unsigned int irq_no;
37862306a36Sopenharmony_ci	struct sxgbe_priv_data *priv_ptr;
37962306a36Sopenharmony_ci	struct sxgbe_tx_norm_desc *dma_tx;
38062306a36Sopenharmony_ci	dma_addr_t dma_tx_phy;
38162306a36Sopenharmony_ci	dma_addr_t *tx_skbuff_dma;
38262306a36Sopenharmony_ci	struct sk_buff **tx_skbuff;
38362306a36Sopenharmony_ci	struct timer_list txtimer;
38462306a36Sopenharmony_ci	unsigned int cur_tx;
38562306a36Sopenharmony_ci	unsigned int dirty_tx;
38662306a36Sopenharmony_ci	u32 tx_count_frames;
38762306a36Sopenharmony_ci	u32 tx_coal_frames;
38862306a36Sopenharmony_ci	u32 tx_coal_timer;
38962306a36Sopenharmony_ci	int hwts_tx_en;
39062306a36Sopenharmony_ci	u16 prev_mss;
39162306a36Sopenharmony_ci	u8 queue_no;
39262306a36Sopenharmony_ci};
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_cistruct sxgbe_rx_queue {
39562306a36Sopenharmony_ci	struct sxgbe_priv_data *priv_ptr;
39662306a36Sopenharmony_ci	struct sxgbe_rx_norm_desc *dma_rx;
39762306a36Sopenharmony_ci	struct sk_buff **rx_skbuff;
39862306a36Sopenharmony_ci	unsigned int cur_rx;
39962306a36Sopenharmony_ci	unsigned int dirty_rx;
40062306a36Sopenharmony_ci	unsigned int irq_no;
40162306a36Sopenharmony_ci	u32 rx_riwt;
40262306a36Sopenharmony_ci	dma_addr_t *rx_skbuff_dma;
40362306a36Sopenharmony_ci	dma_addr_t dma_rx_phy;
40462306a36Sopenharmony_ci	u8 queue_no;
40562306a36Sopenharmony_ci};
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci/* SXGBE HW capabilities */
40862306a36Sopenharmony_cistruct sxgbe_hw_features {
40962306a36Sopenharmony_ci	/****** CAP [0] *******/
41062306a36Sopenharmony_ci	unsigned int pmt_remote_wake_up;
41162306a36Sopenharmony_ci	unsigned int pmt_magic_frame;
41262306a36Sopenharmony_ci	/* IEEE 1588-2008 */
41362306a36Sopenharmony_ci	unsigned int atime_stamp;
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci	unsigned int eee;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci	unsigned int tx_csum_offload;
41862306a36Sopenharmony_ci	unsigned int rx_csum_offload;
41962306a36Sopenharmony_ci	unsigned int multi_macaddr;
42062306a36Sopenharmony_ci	unsigned int tstamp_srcselect;
42162306a36Sopenharmony_ci	unsigned int sa_vlan_insert;
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci	/****** CAP [1] *******/
42462306a36Sopenharmony_ci	unsigned int rxfifo_size;
42562306a36Sopenharmony_ci	unsigned int txfifo_size;
42662306a36Sopenharmony_ci	unsigned int atstmap_hword;
42762306a36Sopenharmony_ci	unsigned int dcb_enable;
42862306a36Sopenharmony_ci	unsigned int splithead_enable;
42962306a36Sopenharmony_ci	unsigned int tcpseg_offload;
43062306a36Sopenharmony_ci	unsigned int debug_mem;
43162306a36Sopenharmony_ci	unsigned int rss_enable;
43262306a36Sopenharmony_ci	unsigned int hash_tsize;
43362306a36Sopenharmony_ci	unsigned int l3l4_filer_size;
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	/* This value is in bytes and
43662306a36Sopenharmony_ci	 * as mentioned in HW features
43762306a36Sopenharmony_ci	 * of SXGBE data book
43862306a36Sopenharmony_ci	 */
43962306a36Sopenharmony_ci	unsigned int rx_mtl_qsize;
44062306a36Sopenharmony_ci	unsigned int tx_mtl_qsize;
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci	/****** CAP [2] *******/
44362306a36Sopenharmony_ci	/* TX and RX number of channels */
44462306a36Sopenharmony_ci	unsigned int rx_mtl_queues;
44562306a36Sopenharmony_ci	unsigned int tx_mtl_queues;
44662306a36Sopenharmony_ci	unsigned int rx_dma_channels;
44762306a36Sopenharmony_ci	unsigned int tx_dma_channels;
44862306a36Sopenharmony_ci	unsigned int pps_output_count;
44962306a36Sopenharmony_ci	unsigned int aux_input_count;
45062306a36Sopenharmony_ci};
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_cistruct sxgbe_priv_data {
45362306a36Sopenharmony_ci	/* DMA descriptos */
45462306a36Sopenharmony_ci	struct sxgbe_tx_queue *txq[SXGBE_TX_QUEUES];
45562306a36Sopenharmony_ci	struct sxgbe_rx_queue *rxq[SXGBE_RX_QUEUES];
45662306a36Sopenharmony_ci	u8 cur_rx_qnum;
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	unsigned int dma_tx_size;
45962306a36Sopenharmony_ci	unsigned int dma_rx_size;
46062306a36Sopenharmony_ci	unsigned int dma_buf_sz;
46162306a36Sopenharmony_ci	u32 rx_riwt;
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci	struct napi_struct napi;
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	void __iomem *ioaddr;
46662306a36Sopenharmony_ci	struct net_device *dev;
46762306a36Sopenharmony_ci	struct device *device;
46862306a36Sopenharmony_ci	struct sxgbe_ops *hw;	/* sxgbe specific ops */
46962306a36Sopenharmony_ci	int no_csum_insertion;
47062306a36Sopenharmony_ci	int irq;
47162306a36Sopenharmony_ci	int rxcsum_insertion;
47262306a36Sopenharmony_ci	spinlock_t stats_lock;	/* lock for tx/rx statatics */
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci	int oldlink;
47562306a36Sopenharmony_ci	int speed;
47662306a36Sopenharmony_ci	int oldduplex;
47762306a36Sopenharmony_ci	struct mii_bus *mii;
47862306a36Sopenharmony_ci	int mii_irq[PHY_MAX_ADDR];
47962306a36Sopenharmony_ci	u8 rx_pause;
48062306a36Sopenharmony_ci	u8 tx_pause;
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci	struct sxgbe_extra_stats xstats;
48362306a36Sopenharmony_ci	struct sxgbe_plat_data *plat;
48462306a36Sopenharmony_ci	struct sxgbe_hw_features hw_cap;
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	u32 msg_enable;
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	struct clk *sxgbe_clk;
48962306a36Sopenharmony_ci	int clk_csr;
49062306a36Sopenharmony_ci	unsigned int mode;
49162306a36Sopenharmony_ci	unsigned int default_addend;
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci	/* advanced time stamp support */
49462306a36Sopenharmony_ci	u32 adv_ts;
49562306a36Sopenharmony_ci	int use_riwt;
49662306a36Sopenharmony_ci	struct ptp_clock *ptp_clock;
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci	/* tc control */
49962306a36Sopenharmony_ci	int tx_tc;
50062306a36Sopenharmony_ci	int rx_tc;
50162306a36Sopenharmony_ci	/* EEE-LPI specific members */
50262306a36Sopenharmony_ci	struct timer_list eee_ctrl_timer;
50362306a36Sopenharmony_ci	bool tx_path_in_lpi_mode;
50462306a36Sopenharmony_ci	int lpi_irq;
50562306a36Sopenharmony_ci	int eee_enabled;
50662306a36Sopenharmony_ci	int eee_active;
50762306a36Sopenharmony_ci	int tx_lpi_timer;
50862306a36Sopenharmony_ci};
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci/* Function prototypes */
51162306a36Sopenharmony_cistruct sxgbe_priv_data *sxgbe_drv_probe(struct device *device,
51262306a36Sopenharmony_ci					struct sxgbe_plat_data *plat_dat,
51362306a36Sopenharmony_ci					void __iomem *addr);
51462306a36Sopenharmony_civoid sxgbe_drv_remove(struct net_device *ndev);
51562306a36Sopenharmony_civoid sxgbe_set_ethtool_ops(struct net_device *netdev);
51662306a36Sopenharmony_ciint sxgbe_mdio_unregister(struct net_device *ndev);
51762306a36Sopenharmony_ciint sxgbe_mdio_register(struct net_device *ndev);
51862306a36Sopenharmony_ciint sxgbe_register_platform(void);
51962306a36Sopenharmony_civoid sxgbe_unregister_platform(void);
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci#ifdef CONFIG_PM
52262306a36Sopenharmony_ciint sxgbe_suspend(struct net_device *ndev);
52362306a36Sopenharmony_ciint sxgbe_resume(struct net_device *ndev);
52462306a36Sopenharmony_ciint sxgbe_freeze(struct net_device *ndev);
52562306a36Sopenharmony_ciint sxgbe_restore(struct net_device *ndev);
52662306a36Sopenharmony_ci#endif /* CONFIG_PM */
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ciconst struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_civoid sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
53162306a36Sopenharmony_cibool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
53262306a36Sopenharmony_ci#endif /* __SXGBE_COMMON_H__ */
533