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