11edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* 10G controller driver for Samsung SoCs
21edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy *
31edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * Copyright (C) 2013 Samsung Electronics Co., Ltd.
41edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy *		http://www.samsung.com
51edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy *
61edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
71edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy *
81edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * This program is free software; you can redistribute it and/or modify
91edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * it under the terms of the GNU General Public License version 2 as
101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * published by the Free Software Foundation.
111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy */
121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#ifndef __SXGBE_COMMON_H__
141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define __SXGBE_COMMON_H__
151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* forward references */
171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_desc_ops;
181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_dma_ops;
191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_mtl_ops;
201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_RESOURCE_NAME	"sam_sxgbeeth"
221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define DRV_MODULE_VERSION	"November_2013"
231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* MAX HW feature words */
251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HW_WORDS 3
261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_RX_COE_NONE	0
281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* CSR Frequency Access Defines*/
301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_150M	150000000
311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_250M	250000000
321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_300M	300000000
331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_350M	350000000
341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_400M	400000000
351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_500M	500000000
361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* pause time */
381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_PAUSE_TIME 0x200
391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* tx queues */
411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_TX_QUEUES   8
421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_RX_QUEUES   16
431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Calculated based how much time does it take to fill 256KB Rx memory
451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * at 10Gb speed at 156MHz clock rate and considered little less then
461edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * the actual value.
471edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy */
481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MAX_DMA_RIWT	0x70
491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MIN_DMA_RIWT	0x01
501edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
511edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Tx coalesce parameters */
521edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_COAL_TX_TIMER	40000
531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MAX_COAL_TX_TICK	100000
541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_TX_MAX_FRAMES	512
551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_TX_FRAMES	128
561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE TX FIFO is 8K, Rx FIFO is 16K */
581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_16KiB 16384
591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_8KiB 8192
601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_4KiB 4096
611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_2KiB 2048
621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_DEFAULT_LIT_LS	0x3E8
641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_DEFAULT_TWT_LS	0x0
651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Flow Control defines */
671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_OFF		0
681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_RX		1
691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_TX		2
701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_AUTO		(SXGBE_FLOW_TX | SXGBE_FLOW_RX)
711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SF_DMA_MODE 1		/* DMA STORE-AND-FORWARD Operation Mode */
731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* errors */
751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_GMII_ERR		0x01
761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_WATCHDOG_ERR		0x02
771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_CRC_ERR		0x03
781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_GAINT_ERR		0x04
791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IP_HDR_ERR		0x05
801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PAYLOAD_ERR		0x06
811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_OVERFLOW_ERR		0x07
821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* pkt type */
841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_LEN_PKT		0x00
851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_MACCTL_PKT		0x01
861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DCBCTL_PKT		0x02
871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_ARP_PKT		0x03
881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_OAM_PKT		0x04
891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_UNTAG_PKT		0x05
901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_OTHER_PKT		0x07
911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_SVLAN_PKT		0x08
921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_CVLAN_PKT		0x09
931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OCVLAN_ICVLAN_PKT		0x0A
941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OSVLAN_ISVLAN_PKT		0x0B
951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OSVLAN_ICVLAN_PKT		0x0C
961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OCVLAN_ISVLAN_PKT		0x0D
971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_NOT_IP_PKT		0x00
991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_TCP_PKT		0x01
1001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_UDP_PKT		0x02
1011edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_ICMP_PKT	0x03
1021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_UNKNOWN_PKT	0x07
1031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_TCP_PKT		0x09
1041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_UDP_PKT		0x0A
1051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_ICMP_PKT	0x0B
1061edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_UNKNOWN_PKT	0x0F
1071edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1081edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_NO_PTP		0x00
1091edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_SYNC		0x01
1101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_FOLLOW_UP	0x02
1111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_DELAY_REQ	0x03
1121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_DELAY_RESP	0x04
1131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_PDELAY_REQ	0x05
1141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_PDELAY_RESP	0x06
1151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_PDELAY_FOLLOW_UP	0x07
1161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_ANNOUNCE		0x08
1171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_MGMT		0x09
1181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_SIGNAL		0x0A
1191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_RESV_MSG		0x0F
1201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
121acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI mode  flags*/
122acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define TX_ENTRY_LPI_MODE	0x10
123acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define TX_EXIT_LPI_MODE	0x20
124acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define RX_ENTRY_LPI_MODE	0x40
125acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define RX_EXIT_LPI_MODE	0x80
126acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
127acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI Interrupt status flag */
128acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_INT_STATUS		BIT(5)
129acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
130acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI Default timer values */
131acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_LINK_STATUS_TIMER	0x3E8
132acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_MAC_WAIT_TIMER	0x00
133acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
134acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI Control and status definitions */
135acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TXA	BIT(19)
136acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_PLSDIS	BIT(18)
137acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_PLS	BIT(17)
138acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_LPIEN	BIT(16)
139acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TXRSTP	BIT(11)
140acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RXRSTP	BIT(10)
141acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RLPIST	BIT(9)
142acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TLPIST	BIT(8)
143acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RLPIEX	BIT(3)
144acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RLPIEN	BIT(2)
145acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TLPIEX	BIT(1)
146acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TLPIEN	BIT(0)
147acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
1481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyenum dma_irq_status {
1491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	tx_hard_error	= BIT(0),
1501edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	tx_bump_tc	= BIT(1),
1511edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	handle_tx	= BIT(2),
1521edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	rx_hard_error	= BIT(3),
1531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	rx_bump_tc	= BIT(4),
1541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	handle_rx	= BIT(5),
1551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
1561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define NETIF_F_HW_VLAN_ALL     (NETIF_F_HW_VLAN_CTAG_RX |	\
1581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 NETIF_F_HW_VLAN_STAG_RX |	\
1591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 NETIF_F_HW_VLAN_CTAG_TX |	\
1601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 NETIF_F_HW_VLAN_STAG_TX |	\
1611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 NETIF_F_HW_VLAN_CTAG_FILTER |	\
1621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 NETIF_F_HW_VLAN_STAG_FILTER)
1631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* MMC control defines */
1651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MMC_CTRL_CNT_FRZ  0x00000008
1661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE HW ADDR regs */
1681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_ADDR_HIGH(reg)    (((reg > 15) ? 0x00000800 : 0x00000040) + \
1691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 (reg * 8))
1701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_ADDR_LOW(reg)     (((reg > 15) ? 0x00000804 : 0x00000044) + \
1711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				 (reg * 8))
1721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MAX_PERFECT_ADDRESSES 32 /* Maximum unicast perfect filtering */
1731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER       0x00000004      /* Frame Filter */
1741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE Frame Filter defines */
1761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_PR    0x00000001      /* Promiscuous Mode */
1771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_HUC   0x00000002      /* Hash Unicast */
1781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_HMC   0x00000004      /* Hash Multicast */
1791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_DAIF  0x00000008      /* DA Inverse Filtering */
1801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_PM    0x00000010      /* Pass all multicast */
1811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_DBF   0x00000020      /* Disable Broadcast frames */
1821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_SAIF  0x00000100      /* Inverse Filtering */
1831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_SAF   0x00000200      /* Source Address Filter */
1841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_HPF   0x00000400      /* Hash or perfect Filter */
1851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_RA    0x80000000      /* Receive all mode */
1861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HASH_TABLE_SIZE    64
1881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HASH_HIGH          0x00000008      /* Multicast Hash Table High */
1891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HASH_LOW           0x0000000c      /* Multicast Hash Table Low */
1901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HI_REG_AE          0x80000000
1921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Minimum and maximum MTU */
1941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define MIN_MTU         68
1951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define MAX_MTU         9000
1961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
1971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)			\
1981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	for (queue_num = 0; queue_num < max_queues; queue_num++)
1991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
20025f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define DRV_VERSION "1.0.0"
20125f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya
20225f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define SXGBE_MAX_RX_CHANNELS	16
20325f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define SXGBE_MAX_TX_CHANNELS	16
20425f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya
20525f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define START_MAC_REG_OFFSET	0x0000
20625f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define MAX_MAC_REG_OFFSET	0x0DFC
20725f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define START_MTL_REG_OFFSET	0x1000
20825f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define MAX_MTL_REG_OFFSET	0x18FC
20925f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define START_DMA_REG_OFFSET	0x3000
21025f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define MAX_DMA_REG_OFFSET	0x38FC
21125f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya
21225f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define REG_SPACE_SIZE		0x2000
21325f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya
2141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* sxgbe statistics counters */
2151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_extra_stats {
2161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* TX/RX IRQ events */
2171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_underflow_irq;
2181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_process_stopped_irq;
2191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_ctxt_desc_err;
2201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_threshold;
2211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_threshold;
2221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_pkt_n;
2231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_pkt_n;
2241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long normal_irq_n;
2251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_normal_irq_n;
2261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_normal_irq_n;
2271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long napi_poll;
2281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_clean;
2291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_reset_ic_bit;
2301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_process_stopped_irq;
2311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_underflow_irq;
2321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
2331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* Bus access errors */
2341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long fatal_bus_error_irq;
2351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_read_transfer_err;
2361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_write_transfer_err;
2371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_desc_access_err;
2381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_buffer_access_err;
2391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long tx_data_transfer_err;
2401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_read_transfer_err;
2411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_write_transfer_err;
2421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_desc_access_err;
2431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_buffer_access_err;
2441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_data_transfer_err;
2451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
246acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	/* EEE-LPI stats */
247acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	unsigned long tx_lpi_entry_n;
248acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	unsigned long tx_lpi_exit_n;
249acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	unsigned long rx_lpi_entry_n;
250acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	unsigned long rx_lpi_exit_n;
251acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	unsigned long eee_wakeup_error_n;
252acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
2531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* RX specific */
2541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* L2 error */
2551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_code_gmii_err;
2561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_watchdog_err;
2571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_crc_err;
2581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_gaint_pkt_err;
2591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip_hdr_err;
2601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip_payload_err;
2611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long overflow_error;
2621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
2631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* L2 Pkt type */
2641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long len_pkt;
2651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long mac_ctl_pkt;
2661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long dcb_ctl_pkt;
2671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long arp_pkt;
2681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long oam_pkt;
2691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long untag_okt;
2701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long other_pkt;
2711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long svlan_tag_pkt;
2721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long cvlan_tag_pkt;
2731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long dvlan_ocvlan_icvlan_pkt;
2741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long dvlan_osvlan_isvlan_pkt;
2751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long dvlan_osvlan_icvlan_pkt;
2761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long dvan_ocvlan_icvlan_pkt;
2771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
2781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* L3/L4 Pkt type */
2791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long not_ip_pkt;
2801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip4_tcp_pkt;
2811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip4_udp_pkt;
2821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip4_icmp_pkt;
2831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip4_unknown_pkt;
2841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip6_tcp_pkt;
2851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip6_udp_pkt;
2861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip6_icmp_pkt;
2871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long ip6_unknown_pkt;
2881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
2891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* Filter specific */
2901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long vlan_filter_match;
2911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long sa_filter_fail;
2921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long da_filter_fail;
2931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long hash_filter_pass;
2941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long l3_filter_match;
2951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long l4_filter_match;
2961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
2971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* RX context specific */
2981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long timestamp_dropped;
2991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_msg_type_no_ptp;
3001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_sync;
3011edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_follow_up;
3021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_delay_req;
3031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_delay_resp;
3041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_pdelay_req;
3051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_pdelay_resp;
3061edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_type_pdelay_follow_up;
3071edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_announce;
3081edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_mgmt;
3091edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_signal;
3101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned long rx_ptp_resv_msg_type;
3111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
3121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct mac_link {
3141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int port;
3151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int duplex;
3161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int speed;
3171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
3181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct mii_regs {
3201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int addr;	/* MII Address */
3211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int data;	/* MII Data */
3221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
3231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_core_ops {
3251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* MAC core initialization */
3261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*core_init)(void __iomem *ioaddr);
3271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* Dump MAC registers */
3281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*dump_regs)(void __iomem *ioaddr);
3291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* Handle extra events on specific interrupts hw dependent */
3301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int (*host_irq_status)(void __iomem *ioaddr,
3311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy			       struct sxgbe_extra_stats *x);
3321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* Set power management mode (e.g. magic frame) */
3331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*pmt)(void __iomem *ioaddr, unsigned long mode);
3341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* Set/Get Unicast MAC addresses */
3351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*set_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
3361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy			      unsigned int reg_n);
3371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*get_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
3381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy			      unsigned int reg_n);
3391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*enable_rx)(void __iomem *ioaddr, bool enable);
3401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*enable_tx)(void __iomem *ioaddr, bool enable);
3411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* controller version specific operations */
3431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int (*get_controller_version)(void __iomem *ioaddr);
3441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* If supported then get the optional core features */
3461edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int (*get_hw_feature)(void __iomem *ioaddr,
3471edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy				       unsigned char feature_index);
3481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* adjust SXGBE speed */
3491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
350acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
351acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	/* EEE-LPI specific operations */
352acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	void (*set_eee_mode)(void __iomem *ioaddr);
353acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	void (*reset_eee_mode)(void __iomem *ioaddr);
354acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
355acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S			      const int tw);
356acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	void (*set_eee_pls)(void __iomem *ioaddr, const int link);
3578f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya
3588f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya	/* Enable disable checksum offload operations */
3598f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya	void (*enable_rx_csum)(void __iomem *ioaddr);
3608f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya	void (*disable_rx_csum)(void __iomem *ioaddr);
361325b94f7e63080f3e371e35f063a8be138c1873bByungho An	void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num);
362325b94f7e63080f3e371e35f063a8be138c1873bByungho An	void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num);
3631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
3641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyconst struct sxgbe_core_ops *sxgbe_get_core_ops(void);
3661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_ops {
3681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	const struct sxgbe_core_ops *mac;
3691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	const struct sxgbe_desc_ops *desc;
3701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	const struct sxgbe_dma_ops *dma;
3711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	const struct sxgbe_mtl_ops *mtl;
3721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct mii_regs mii;	/* MII register Addresses */
3731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct mac_link link;
3741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int ctrl_uid;
3751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int ctrl_id;
3761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
3771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE private data structures */
3791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_tx_queue {
3801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int irq_no;
3811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_priv_data *priv_ptr;
3821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_tx_norm_desc *dma_tx;
3831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	dma_addr_t dma_tx_phy;
3841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	dma_addr_t *tx_skbuff_dma;
3851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sk_buff **tx_skbuff;
3861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct timer_list txtimer;
3871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	spinlock_t tx_lock;	/* lock for tx queues */
3881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int cur_tx;
3891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int dirty_tx;
3901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 tx_count_frames;
3911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 tx_coal_frames;
3921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 tx_coal_timer;
3931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int hwts_tx_en;
3941051125d8d57b6ff074d450c10ccbe0e39856456Vipul Pandya	u16 prev_mss;
3951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u8 queue_no;
3961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
3971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
3981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_rx_queue {
3991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_priv_data *priv_ptr;
4001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_rx_norm_desc *dma_rx;
4011edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sk_buff **rx_skbuff;
4021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int cur_rx;
4031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int dirty_rx;
4041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int irq_no;
4051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 rx_riwt;
4061edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	dma_addr_t *rx_skbuff_dma;
4071edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	dma_addr_t dma_rx_phy;
4081edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u8 queue_no;
4091edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
4101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE HW capabilities */
4121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_hw_features {
4131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/****** CAP [0] *******/
4141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int pmt_remote_wake_up;
4151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int pmt_magic_frame;
4161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* IEEE 1588-2008 */
4171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int atime_stamp;
4181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
419acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	unsigned int eee;
420acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S
4211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int tx_csum_offload;
4221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int rx_csum_offload;
4231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int multi_macaddr;
4241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int tstamp_srcselect;
4251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int sa_vlan_insert;
4261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/****** CAP [1] *******/
4281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int rxfifo_size;
4291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int txfifo_size;
4301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int atstmap_hword;
4311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int dcb_enable;
4321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int splithead_enable;
4331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int tcpseg_offload;
4341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int debug_mem;
4351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int rss_enable;
4361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int hash_tsize;
4371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int l3l4_filer_size;
4381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* This value is in bytes and
4401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	 * as mentioned in HW features
4411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	 * of SXGBE data book
4421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	 */
4431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int rx_mtl_qsize;
4441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int tx_mtl_qsize;
4451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4461edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/****** CAP [2] *******/
4471edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* TX and RX number of channels */
4481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int rx_mtl_queues;
4491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int tx_mtl_queues;
4501edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int rx_dma_channels;
4511edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int tx_dma_channels;
4521edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int pps_output_count;
4531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int aux_input_count;
4541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
4551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_priv_data {
4571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* DMA descriptos */
4581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_tx_queue *txq[SXGBE_TX_QUEUES];
4591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_rx_queue *rxq[SXGBE_RX_QUEUES];
4601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u8 cur_rx_qnum;
4611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int dma_tx_size;
4631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int dma_rx_size;
4641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int dma_buf_sz;
4651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 rx_riwt;
4661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct napi_struct napi;
4681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	void __iomem *ioaddr;
4701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct net_device *dev;
4711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct device *device;
4721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_ops *hw;	/* sxgbe specific ops */
4731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int no_csum_insertion;
4741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int irq;
4758f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya	int rxcsum_insertion;
4761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	spinlock_t stats_lock;	/* lock for tx/rx statatics */
4771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct phy_device *phydev;
4791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int oldlink;
4801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int speed;
4811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int oldduplex;
4821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct mii_bus *mii;
4831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int mii_irq[PHY_MAX_ADDR];
4841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u8 rx_pause;
4851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u8 tx_pause;
4861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_extra_stats xstats;
4881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_plat_data *plat;
4891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct sxgbe_hw_features hw_cap;
4901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 msg_enable;
4921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	struct clk *sxgbe_clk;
4941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int clk_csr;
4951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int mode;
4961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	unsigned int default_addend;
4971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
4981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* advanced time stamp support */
4991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	u32 adv_ts;
5001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int use_riwt;
50125f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya	struct ptp_clock *ptp_clock;
5021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
5031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	/* tc control */
5041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int tx_tc;
5051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy	int rx_tc;
506acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	/* EEE-LPI specific members */
507acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	struct timer_list eee_ctrl_timer;
508acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	bool tx_path_in_lpi_mode;
509acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	int lpi_irq;
510acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	int eee_enabled;
511acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	int eee_active;
512acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S	int tx_lpi_timer;
5131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy};
5141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
5151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Function prototypes */
5161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_priv_data *sxgbe_drv_probe(struct device *device,
5171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy					struct sxgbe_plat_data *plat_dat,
5181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy					void __iomem *addr);
5191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_drv_remove(struct net_device *ndev);
5201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyvoid sxgbe_set_ethtool_ops(struct net_device *netdev);
5211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_mdio_unregister(struct net_device *ndev);
5221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_mdio_register(struct net_device *ndev);
5231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_register_platform(void);
5241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyvoid sxgbe_unregister_platform(void);
5251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
5261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#ifdef CONFIG_PM
5271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_suspend(struct net_device *ndev);
5281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_resume(struct net_device *ndev);
5291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_freeze(struct net_device *ndev);
5301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_restore(struct net_device *ndev);
5311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#endif /* CONFIG_PM */
5321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
5331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyconst struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
5341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy
535acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K Svoid sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
536acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K Sbool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
5371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#endif /* __SXGBE_COMMON_H__ */
538