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