1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 10G controller driver for Samsung SoCs 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2013 Samsung Electronics Co., Ltd. 5*4882a593Smuzhiyun * http://www.samsung.com 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Siva Reddy Kallam <siva.kallam@samsung.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __SXGBE_COMMON_H__ 11*4882a593Smuzhiyun #define __SXGBE_COMMON_H__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* forward references */ 14*4882a593Smuzhiyun struct sxgbe_desc_ops; 15*4882a593Smuzhiyun struct sxgbe_dma_ops; 16*4882a593Smuzhiyun struct sxgbe_mtl_ops; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define SXGBE_RESOURCE_NAME "sam_sxgbeeth" 19*4882a593Smuzhiyun #define DRV_MODULE_VERSION "November_2013" 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* MAX HW feature words */ 22*4882a593Smuzhiyun #define SXGBE_HW_WORDS 3 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SXGBE_RX_COE_NONE 0 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* CSR Frequency Access Defines*/ 27*4882a593Smuzhiyun #define SXGBE_CSR_F_150M 150000000 28*4882a593Smuzhiyun #define SXGBE_CSR_F_250M 250000000 29*4882a593Smuzhiyun #define SXGBE_CSR_F_300M 300000000 30*4882a593Smuzhiyun #define SXGBE_CSR_F_350M 350000000 31*4882a593Smuzhiyun #define SXGBE_CSR_F_400M 400000000 32*4882a593Smuzhiyun #define SXGBE_CSR_F_500M 500000000 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* pause time */ 35*4882a593Smuzhiyun #define SXGBE_PAUSE_TIME 0x200 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* tx queues */ 38*4882a593Smuzhiyun #define SXGBE_TX_QUEUES 8 39*4882a593Smuzhiyun #define SXGBE_RX_QUEUES 16 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* Calculated based how much time does it take to fill 256KB Rx memory 42*4882a593Smuzhiyun * at 10Gb speed at 156MHz clock rate and considered little less then 43*4882a593Smuzhiyun * the actual value. 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun #define SXGBE_MAX_DMA_RIWT 0x70 46*4882a593Smuzhiyun #define SXGBE_MIN_DMA_RIWT 0x01 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* Tx coalesce parameters */ 49*4882a593Smuzhiyun #define SXGBE_COAL_TX_TIMER 40000 50*4882a593Smuzhiyun #define SXGBE_MAX_COAL_TX_TICK 100000 51*4882a593Smuzhiyun #define SXGBE_TX_MAX_FRAMES 512 52*4882a593Smuzhiyun #define SXGBE_TX_FRAMES 128 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* SXGBE TX FIFO is 8K, Rx FIFO is 16K */ 55*4882a593Smuzhiyun #define BUF_SIZE_16KiB 16384 56*4882a593Smuzhiyun #define BUF_SIZE_8KiB 8192 57*4882a593Smuzhiyun #define BUF_SIZE_4KiB 4096 58*4882a593Smuzhiyun #define BUF_SIZE_2KiB 2048 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define SXGBE_DEFAULT_LIT_LS 0x3E8 61*4882a593Smuzhiyun #define SXGBE_DEFAULT_TWT_LS 0x0 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* Flow Control defines */ 64*4882a593Smuzhiyun #define SXGBE_FLOW_OFF 0 65*4882a593Smuzhiyun #define SXGBE_FLOW_RX 1 66*4882a593Smuzhiyun #define SXGBE_FLOW_TX 2 67*4882a593Smuzhiyun #define SXGBE_FLOW_AUTO (SXGBE_FLOW_TX | SXGBE_FLOW_RX) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define SF_DMA_MODE 1 /* DMA STORE-AND-FORWARD Operation Mode */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* errors */ 72*4882a593Smuzhiyun #define RX_GMII_ERR 0x01 73*4882a593Smuzhiyun #define RX_WATCHDOG_ERR 0x02 74*4882a593Smuzhiyun #define RX_CRC_ERR 0x03 75*4882a593Smuzhiyun #define RX_GAINT_ERR 0x04 76*4882a593Smuzhiyun #define RX_IP_HDR_ERR 0x05 77*4882a593Smuzhiyun #define RX_PAYLOAD_ERR 0x06 78*4882a593Smuzhiyun #define RX_OVERFLOW_ERR 0x07 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* pkt type */ 81*4882a593Smuzhiyun #define RX_LEN_PKT 0x00 82*4882a593Smuzhiyun #define RX_MACCTL_PKT 0x01 83*4882a593Smuzhiyun #define RX_DCBCTL_PKT 0x02 84*4882a593Smuzhiyun #define RX_ARP_PKT 0x03 85*4882a593Smuzhiyun #define RX_OAM_PKT 0x04 86*4882a593Smuzhiyun #define RX_UNTAG_PKT 0x05 87*4882a593Smuzhiyun #define RX_OTHER_PKT 0x07 88*4882a593Smuzhiyun #define RX_SVLAN_PKT 0x08 89*4882a593Smuzhiyun #define RX_CVLAN_PKT 0x09 90*4882a593Smuzhiyun #define RX_DVLAN_OCVLAN_ICVLAN_PKT 0x0A 91*4882a593Smuzhiyun #define RX_DVLAN_OSVLAN_ISVLAN_PKT 0x0B 92*4882a593Smuzhiyun #define RX_DVLAN_OSVLAN_ICVLAN_PKT 0x0C 93*4882a593Smuzhiyun #define RX_DVLAN_OCVLAN_ISVLAN_PKT 0x0D 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define RX_NOT_IP_PKT 0x00 96*4882a593Smuzhiyun #define RX_IPV4_TCP_PKT 0x01 97*4882a593Smuzhiyun #define RX_IPV4_UDP_PKT 0x02 98*4882a593Smuzhiyun #define RX_IPV4_ICMP_PKT 0x03 99*4882a593Smuzhiyun #define RX_IPV4_UNKNOWN_PKT 0x07 100*4882a593Smuzhiyun #define RX_IPV6_TCP_PKT 0x09 101*4882a593Smuzhiyun #define RX_IPV6_UDP_PKT 0x0A 102*4882a593Smuzhiyun #define RX_IPV6_ICMP_PKT 0x0B 103*4882a593Smuzhiyun #define RX_IPV6_UNKNOWN_PKT 0x0F 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define RX_NO_PTP 0x00 106*4882a593Smuzhiyun #define RX_PTP_SYNC 0x01 107*4882a593Smuzhiyun #define RX_PTP_FOLLOW_UP 0x02 108*4882a593Smuzhiyun #define RX_PTP_DELAY_REQ 0x03 109*4882a593Smuzhiyun #define RX_PTP_DELAY_RESP 0x04 110*4882a593Smuzhiyun #define RX_PTP_PDELAY_REQ 0x05 111*4882a593Smuzhiyun #define RX_PTP_PDELAY_RESP 0x06 112*4882a593Smuzhiyun #define RX_PTP_PDELAY_FOLLOW_UP 0x07 113*4882a593Smuzhiyun #define RX_PTP_ANNOUNCE 0x08 114*4882a593Smuzhiyun #define RX_PTP_MGMT 0x09 115*4882a593Smuzhiyun #define RX_PTP_SIGNAL 0x0A 116*4882a593Smuzhiyun #define RX_PTP_RESV_MSG 0x0F 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* EEE-LPI mode flags*/ 119*4882a593Smuzhiyun #define TX_ENTRY_LPI_MODE 0x10 120*4882a593Smuzhiyun #define TX_EXIT_LPI_MODE 0x20 121*4882a593Smuzhiyun #define RX_ENTRY_LPI_MODE 0x40 122*4882a593Smuzhiyun #define RX_EXIT_LPI_MODE 0x80 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* EEE-LPI Interrupt status flag */ 125*4882a593Smuzhiyun #define LPI_INT_STATUS BIT(5) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* EEE-LPI Default timer values */ 128*4882a593Smuzhiyun #define LPI_LINK_STATUS_TIMER 0x3E8 129*4882a593Smuzhiyun #define LPI_MAC_WAIT_TIMER 0x00 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* EEE-LPI Control and status definitions */ 132*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TXA BIT(19) 133*4882a593Smuzhiyun #define LPI_CTRL_STATUS_PLSDIS BIT(18) 134*4882a593Smuzhiyun #define LPI_CTRL_STATUS_PLS BIT(17) 135*4882a593Smuzhiyun #define LPI_CTRL_STATUS_LPIEN BIT(16) 136*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TXRSTP BIT(11) 137*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RXRSTP BIT(10) 138*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RLPIST BIT(9) 139*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TLPIST BIT(8) 140*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RLPIEX BIT(3) 141*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RLPIEN BIT(2) 142*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TLPIEX BIT(1) 143*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TLPIEN BIT(0) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun enum dma_irq_status { 146*4882a593Smuzhiyun tx_hard_error = BIT(0), 147*4882a593Smuzhiyun tx_bump_tc = BIT(1), 148*4882a593Smuzhiyun handle_tx = BIT(2), 149*4882a593Smuzhiyun rx_hard_error = BIT(3), 150*4882a593Smuzhiyun rx_bump_tc = BIT(4), 151*4882a593Smuzhiyun handle_rx = BIT(5), 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define NETIF_F_HW_VLAN_ALL (NETIF_F_HW_VLAN_CTAG_RX | \ 155*4882a593Smuzhiyun NETIF_F_HW_VLAN_STAG_RX | \ 156*4882a593Smuzhiyun NETIF_F_HW_VLAN_CTAG_TX | \ 157*4882a593Smuzhiyun NETIF_F_HW_VLAN_STAG_TX | \ 158*4882a593Smuzhiyun NETIF_F_HW_VLAN_CTAG_FILTER | \ 159*4882a593Smuzhiyun NETIF_F_HW_VLAN_STAG_FILTER) 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* MMC control defines */ 162*4882a593Smuzhiyun #define SXGBE_MMC_CTRL_CNT_FRZ 0x00000008 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* SXGBE HW ADDR regs */ 165*4882a593Smuzhiyun #define SXGBE_ADDR_HIGH(reg) (((reg > 15) ? 0x00000800 : 0x00000040) + \ 166*4882a593Smuzhiyun (reg * 8)) 167*4882a593Smuzhiyun #define SXGBE_ADDR_LOW(reg) (((reg > 15) ? 0x00000804 : 0x00000044) + \ 168*4882a593Smuzhiyun (reg * 8)) 169*4882a593Smuzhiyun #define SXGBE_MAX_PERFECT_ADDRESSES 32 /* Maximum unicast perfect filtering */ 170*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER 0x00000004 /* Frame Filter */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* SXGBE Frame Filter defines */ 173*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_PR 0x00000001 /* Promiscuous Mode */ 174*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_HUC 0x00000002 /* Hash Unicast */ 175*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_HMC 0x00000004 /* Hash Multicast */ 176*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_DAIF 0x00000008 /* DA Inverse Filtering */ 177*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_PM 0x00000010 /* Pass all multicast */ 178*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_DBF 0x00000020 /* Disable Broadcast frames */ 179*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_SAIF 0x00000100 /* Inverse Filtering */ 180*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_SAF 0x00000200 /* Source Address Filter */ 181*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_HPF 0x00000400 /* Hash or perfect Filter */ 182*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_RA 0x80000000 /* Receive all mode */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #define SXGBE_HASH_TABLE_SIZE 64 185*4882a593Smuzhiyun #define SXGBE_HASH_HIGH 0x00000008 /* Multicast Hash Table High */ 186*4882a593Smuzhiyun #define SXGBE_HASH_LOW 0x0000000c /* Multicast Hash Table Low */ 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define SXGBE_HI_REG_AE 0x80000000 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* Minimum and maximum MTU */ 191*4882a593Smuzhiyun #define MIN_MTU 68 192*4882a593Smuzhiyun #define MAX_MTU 9000 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num) \ 195*4882a593Smuzhiyun for (queue_num = 0; queue_num < max_queues; queue_num++) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define DRV_VERSION "1.0.0" 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define SXGBE_MAX_RX_CHANNELS 16 200*4882a593Smuzhiyun #define SXGBE_MAX_TX_CHANNELS 16 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #define START_MAC_REG_OFFSET 0x0000 203*4882a593Smuzhiyun #define MAX_MAC_REG_OFFSET 0x0DFC 204*4882a593Smuzhiyun #define START_MTL_REG_OFFSET 0x1000 205*4882a593Smuzhiyun #define MAX_MTL_REG_OFFSET 0x18FC 206*4882a593Smuzhiyun #define START_DMA_REG_OFFSET 0x3000 207*4882a593Smuzhiyun #define MAX_DMA_REG_OFFSET 0x38FC 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #define REG_SPACE_SIZE 0x2000 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* sxgbe statistics counters */ 212*4882a593Smuzhiyun struct sxgbe_extra_stats { 213*4882a593Smuzhiyun /* TX/RX IRQ events */ 214*4882a593Smuzhiyun unsigned long tx_underflow_irq; 215*4882a593Smuzhiyun unsigned long tx_process_stopped_irq; 216*4882a593Smuzhiyun unsigned long tx_ctxt_desc_err; 217*4882a593Smuzhiyun unsigned long tx_threshold; 218*4882a593Smuzhiyun unsigned long rx_threshold; 219*4882a593Smuzhiyun unsigned long tx_pkt_n; 220*4882a593Smuzhiyun unsigned long rx_pkt_n; 221*4882a593Smuzhiyun unsigned long normal_irq_n; 222*4882a593Smuzhiyun unsigned long tx_normal_irq_n; 223*4882a593Smuzhiyun unsigned long rx_normal_irq_n; 224*4882a593Smuzhiyun unsigned long napi_poll; 225*4882a593Smuzhiyun unsigned long tx_clean; 226*4882a593Smuzhiyun unsigned long tx_reset_ic_bit; 227*4882a593Smuzhiyun unsigned long rx_process_stopped_irq; 228*4882a593Smuzhiyun unsigned long rx_underflow_irq; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun /* Bus access errors */ 231*4882a593Smuzhiyun unsigned long fatal_bus_error_irq; 232*4882a593Smuzhiyun unsigned long tx_read_transfer_err; 233*4882a593Smuzhiyun unsigned long tx_write_transfer_err; 234*4882a593Smuzhiyun unsigned long tx_desc_access_err; 235*4882a593Smuzhiyun unsigned long tx_buffer_access_err; 236*4882a593Smuzhiyun unsigned long tx_data_transfer_err; 237*4882a593Smuzhiyun unsigned long rx_read_transfer_err; 238*4882a593Smuzhiyun unsigned long rx_write_transfer_err; 239*4882a593Smuzhiyun unsigned long rx_desc_access_err; 240*4882a593Smuzhiyun unsigned long rx_buffer_access_err; 241*4882a593Smuzhiyun unsigned long rx_data_transfer_err; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* EEE-LPI stats */ 244*4882a593Smuzhiyun unsigned long tx_lpi_entry_n; 245*4882a593Smuzhiyun unsigned long tx_lpi_exit_n; 246*4882a593Smuzhiyun unsigned long rx_lpi_entry_n; 247*4882a593Smuzhiyun unsigned long rx_lpi_exit_n; 248*4882a593Smuzhiyun unsigned long eee_wakeup_error_n; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* RX specific */ 251*4882a593Smuzhiyun /* L2 error */ 252*4882a593Smuzhiyun unsigned long rx_code_gmii_err; 253*4882a593Smuzhiyun unsigned long rx_watchdog_err; 254*4882a593Smuzhiyun unsigned long rx_crc_err; 255*4882a593Smuzhiyun unsigned long rx_gaint_pkt_err; 256*4882a593Smuzhiyun unsigned long ip_hdr_err; 257*4882a593Smuzhiyun unsigned long ip_payload_err; 258*4882a593Smuzhiyun unsigned long overflow_error; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* L2 Pkt type */ 261*4882a593Smuzhiyun unsigned long len_pkt; 262*4882a593Smuzhiyun unsigned long mac_ctl_pkt; 263*4882a593Smuzhiyun unsigned long dcb_ctl_pkt; 264*4882a593Smuzhiyun unsigned long arp_pkt; 265*4882a593Smuzhiyun unsigned long oam_pkt; 266*4882a593Smuzhiyun unsigned long untag_okt; 267*4882a593Smuzhiyun unsigned long other_pkt; 268*4882a593Smuzhiyun unsigned long svlan_tag_pkt; 269*4882a593Smuzhiyun unsigned long cvlan_tag_pkt; 270*4882a593Smuzhiyun unsigned long dvlan_ocvlan_icvlan_pkt; 271*4882a593Smuzhiyun unsigned long dvlan_osvlan_isvlan_pkt; 272*4882a593Smuzhiyun unsigned long dvlan_osvlan_icvlan_pkt; 273*4882a593Smuzhiyun unsigned long dvan_ocvlan_icvlan_pkt; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun /* L3/L4 Pkt type */ 276*4882a593Smuzhiyun unsigned long not_ip_pkt; 277*4882a593Smuzhiyun unsigned long ip4_tcp_pkt; 278*4882a593Smuzhiyun unsigned long ip4_udp_pkt; 279*4882a593Smuzhiyun unsigned long ip4_icmp_pkt; 280*4882a593Smuzhiyun unsigned long ip4_unknown_pkt; 281*4882a593Smuzhiyun unsigned long ip6_tcp_pkt; 282*4882a593Smuzhiyun unsigned long ip6_udp_pkt; 283*4882a593Smuzhiyun unsigned long ip6_icmp_pkt; 284*4882a593Smuzhiyun unsigned long ip6_unknown_pkt; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* Filter specific */ 287*4882a593Smuzhiyun unsigned long vlan_filter_match; 288*4882a593Smuzhiyun unsigned long sa_filter_fail; 289*4882a593Smuzhiyun unsigned long da_filter_fail; 290*4882a593Smuzhiyun unsigned long hash_filter_pass; 291*4882a593Smuzhiyun unsigned long l3_filter_match; 292*4882a593Smuzhiyun unsigned long l4_filter_match; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /* RX context specific */ 295*4882a593Smuzhiyun unsigned long timestamp_dropped; 296*4882a593Smuzhiyun unsigned long rx_msg_type_no_ptp; 297*4882a593Smuzhiyun unsigned long rx_ptp_type_sync; 298*4882a593Smuzhiyun unsigned long rx_ptp_type_follow_up; 299*4882a593Smuzhiyun unsigned long rx_ptp_type_delay_req; 300*4882a593Smuzhiyun unsigned long rx_ptp_type_delay_resp; 301*4882a593Smuzhiyun unsigned long rx_ptp_type_pdelay_req; 302*4882a593Smuzhiyun unsigned long rx_ptp_type_pdelay_resp; 303*4882a593Smuzhiyun unsigned long rx_ptp_type_pdelay_follow_up; 304*4882a593Smuzhiyun unsigned long rx_ptp_announce; 305*4882a593Smuzhiyun unsigned long rx_ptp_mgmt; 306*4882a593Smuzhiyun unsigned long rx_ptp_signal; 307*4882a593Smuzhiyun unsigned long rx_ptp_resv_msg_type; 308*4882a593Smuzhiyun }; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun struct mac_link { 311*4882a593Smuzhiyun int port; 312*4882a593Smuzhiyun int duplex; 313*4882a593Smuzhiyun int speed; 314*4882a593Smuzhiyun }; 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun struct mii_regs { 317*4882a593Smuzhiyun unsigned int addr; /* MII Address */ 318*4882a593Smuzhiyun unsigned int data; /* MII Data */ 319*4882a593Smuzhiyun }; 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun struct sxgbe_core_ops { 322*4882a593Smuzhiyun /* MAC core initialization */ 323*4882a593Smuzhiyun void (*core_init)(void __iomem *ioaddr); 324*4882a593Smuzhiyun /* Dump MAC registers */ 325*4882a593Smuzhiyun void (*dump_regs)(void __iomem *ioaddr); 326*4882a593Smuzhiyun /* Handle extra events on specific interrupts hw dependent */ 327*4882a593Smuzhiyun int (*host_irq_status)(void __iomem *ioaddr, 328*4882a593Smuzhiyun struct sxgbe_extra_stats *x); 329*4882a593Smuzhiyun /* Set power management mode (e.g. magic frame) */ 330*4882a593Smuzhiyun void (*pmt)(void __iomem *ioaddr, unsigned long mode); 331*4882a593Smuzhiyun /* Set/Get Unicast MAC addresses */ 332*4882a593Smuzhiyun void (*set_umac_addr)(void __iomem *ioaddr, unsigned char *addr, 333*4882a593Smuzhiyun unsigned int reg_n); 334*4882a593Smuzhiyun void (*get_umac_addr)(void __iomem *ioaddr, unsigned char *addr, 335*4882a593Smuzhiyun unsigned int reg_n); 336*4882a593Smuzhiyun void (*enable_rx)(void __iomem *ioaddr, bool enable); 337*4882a593Smuzhiyun void (*enable_tx)(void __iomem *ioaddr, bool enable); 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun /* controller version specific operations */ 340*4882a593Smuzhiyun int (*get_controller_version)(void __iomem *ioaddr); 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* If supported then get the optional core features */ 343*4882a593Smuzhiyun unsigned int (*get_hw_feature)(void __iomem *ioaddr, 344*4882a593Smuzhiyun unsigned char feature_index); 345*4882a593Smuzhiyun /* adjust SXGBE speed */ 346*4882a593Smuzhiyun void (*set_speed)(void __iomem *ioaddr, unsigned char speed); 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun /* EEE-LPI specific operations */ 349*4882a593Smuzhiyun void (*set_eee_mode)(void __iomem *ioaddr); 350*4882a593Smuzhiyun void (*reset_eee_mode)(void __iomem *ioaddr); 351*4882a593Smuzhiyun void (*set_eee_timer)(void __iomem *ioaddr, const int ls, 352*4882a593Smuzhiyun const int tw); 353*4882a593Smuzhiyun void (*set_eee_pls)(void __iomem *ioaddr, const int link); 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* Enable disable checksum offload operations */ 356*4882a593Smuzhiyun void (*enable_rx_csum)(void __iomem *ioaddr); 357*4882a593Smuzhiyun void (*disable_rx_csum)(void __iomem *ioaddr); 358*4882a593Smuzhiyun void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num); 359*4882a593Smuzhiyun void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num); 360*4882a593Smuzhiyun }; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun const struct sxgbe_core_ops *sxgbe_get_core_ops(void); 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun struct sxgbe_ops { 365*4882a593Smuzhiyun const struct sxgbe_core_ops *mac; 366*4882a593Smuzhiyun const struct sxgbe_desc_ops *desc; 367*4882a593Smuzhiyun const struct sxgbe_dma_ops *dma; 368*4882a593Smuzhiyun const struct sxgbe_mtl_ops *mtl; 369*4882a593Smuzhiyun struct mii_regs mii; /* MII register Addresses */ 370*4882a593Smuzhiyun struct mac_link link; 371*4882a593Smuzhiyun unsigned int ctrl_uid; 372*4882a593Smuzhiyun unsigned int ctrl_id; 373*4882a593Smuzhiyun }; 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun /* SXGBE private data structures */ 376*4882a593Smuzhiyun struct sxgbe_tx_queue { 377*4882a593Smuzhiyun unsigned int irq_no; 378*4882a593Smuzhiyun struct sxgbe_priv_data *priv_ptr; 379*4882a593Smuzhiyun struct sxgbe_tx_norm_desc *dma_tx; 380*4882a593Smuzhiyun dma_addr_t dma_tx_phy; 381*4882a593Smuzhiyun dma_addr_t *tx_skbuff_dma; 382*4882a593Smuzhiyun struct sk_buff **tx_skbuff; 383*4882a593Smuzhiyun struct timer_list txtimer; 384*4882a593Smuzhiyun unsigned int cur_tx; 385*4882a593Smuzhiyun unsigned int dirty_tx; 386*4882a593Smuzhiyun u32 tx_count_frames; 387*4882a593Smuzhiyun u32 tx_coal_frames; 388*4882a593Smuzhiyun u32 tx_coal_timer; 389*4882a593Smuzhiyun int hwts_tx_en; 390*4882a593Smuzhiyun u16 prev_mss; 391*4882a593Smuzhiyun u8 queue_no; 392*4882a593Smuzhiyun }; 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun struct sxgbe_rx_queue { 395*4882a593Smuzhiyun struct sxgbe_priv_data *priv_ptr; 396*4882a593Smuzhiyun struct sxgbe_rx_norm_desc *dma_rx; 397*4882a593Smuzhiyun struct sk_buff **rx_skbuff; 398*4882a593Smuzhiyun unsigned int cur_rx; 399*4882a593Smuzhiyun unsigned int dirty_rx; 400*4882a593Smuzhiyun unsigned int irq_no; 401*4882a593Smuzhiyun u32 rx_riwt; 402*4882a593Smuzhiyun dma_addr_t *rx_skbuff_dma; 403*4882a593Smuzhiyun dma_addr_t dma_rx_phy; 404*4882a593Smuzhiyun u8 queue_no; 405*4882a593Smuzhiyun }; 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun /* SXGBE HW capabilities */ 408*4882a593Smuzhiyun struct sxgbe_hw_features { 409*4882a593Smuzhiyun /****** CAP [0] *******/ 410*4882a593Smuzhiyun unsigned int pmt_remote_wake_up; 411*4882a593Smuzhiyun unsigned int pmt_magic_frame; 412*4882a593Smuzhiyun /* IEEE 1588-2008 */ 413*4882a593Smuzhiyun unsigned int atime_stamp; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun unsigned int eee; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun unsigned int tx_csum_offload; 418*4882a593Smuzhiyun unsigned int rx_csum_offload; 419*4882a593Smuzhiyun unsigned int multi_macaddr; 420*4882a593Smuzhiyun unsigned int tstamp_srcselect; 421*4882a593Smuzhiyun unsigned int sa_vlan_insert; 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun /****** CAP [1] *******/ 424*4882a593Smuzhiyun unsigned int rxfifo_size; 425*4882a593Smuzhiyun unsigned int txfifo_size; 426*4882a593Smuzhiyun unsigned int atstmap_hword; 427*4882a593Smuzhiyun unsigned int dcb_enable; 428*4882a593Smuzhiyun unsigned int splithead_enable; 429*4882a593Smuzhiyun unsigned int tcpseg_offload; 430*4882a593Smuzhiyun unsigned int debug_mem; 431*4882a593Smuzhiyun unsigned int rss_enable; 432*4882a593Smuzhiyun unsigned int hash_tsize; 433*4882a593Smuzhiyun unsigned int l3l4_filer_size; 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun /* This value is in bytes and 436*4882a593Smuzhiyun * as mentioned in HW features 437*4882a593Smuzhiyun * of SXGBE data book 438*4882a593Smuzhiyun */ 439*4882a593Smuzhiyun unsigned int rx_mtl_qsize; 440*4882a593Smuzhiyun unsigned int tx_mtl_qsize; 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun /****** CAP [2] *******/ 443*4882a593Smuzhiyun /* TX and RX number of channels */ 444*4882a593Smuzhiyun unsigned int rx_mtl_queues; 445*4882a593Smuzhiyun unsigned int tx_mtl_queues; 446*4882a593Smuzhiyun unsigned int rx_dma_channels; 447*4882a593Smuzhiyun unsigned int tx_dma_channels; 448*4882a593Smuzhiyun unsigned int pps_output_count; 449*4882a593Smuzhiyun unsigned int aux_input_count; 450*4882a593Smuzhiyun }; 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun struct sxgbe_priv_data { 453*4882a593Smuzhiyun /* DMA descriptos */ 454*4882a593Smuzhiyun struct sxgbe_tx_queue *txq[SXGBE_TX_QUEUES]; 455*4882a593Smuzhiyun struct sxgbe_rx_queue *rxq[SXGBE_RX_QUEUES]; 456*4882a593Smuzhiyun u8 cur_rx_qnum; 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun unsigned int dma_tx_size; 459*4882a593Smuzhiyun unsigned int dma_rx_size; 460*4882a593Smuzhiyun unsigned int dma_buf_sz; 461*4882a593Smuzhiyun u32 rx_riwt; 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun struct napi_struct napi; 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun void __iomem *ioaddr; 466*4882a593Smuzhiyun struct net_device *dev; 467*4882a593Smuzhiyun struct device *device; 468*4882a593Smuzhiyun struct sxgbe_ops *hw; /* sxgbe specific ops */ 469*4882a593Smuzhiyun int no_csum_insertion; 470*4882a593Smuzhiyun int irq; 471*4882a593Smuzhiyun int rxcsum_insertion; 472*4882a593Smuzhiyun spinlock_t stats_lock; /* lock for tx/rx statatics */ 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun int oldlink; 475*4882a593Smuzhiyun int speed; 476*4882a593Smuzhiyun int oldduplex; 477*4882a593Smuzhiyun struct mii_bus *mii; 478*4882a593Smuzhiyun int mii_irq[PHY_MAX_ADDR]; 479*4882a593Smuzhiyun u8 rx_pause; 480*4882a593Smuzhiyun u8 tx_pause; 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun struct sxgbe_extra_stats xstats; 483*4882a593Smuzhiyun struct sxgbe_plat_data *plat; 484*4882a593Smuzhiyun struct sxgbe_hw_features hw_cap; 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun u32 msg_enable; 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun struct clk *sxgbe_clk; 489*4882a593Smuzhiyun int clk_csr; 490*4882a593Smuzhiyun unsigned int mode; 491*4882a593Smuzhiyun unsigned int default_addend; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* advanced time stamp support */ 494*4882a593Smuzhiyun u32 adv_ts; 495*4882a593Smuzhiyun int use_riwt; 496*4882a593Smuzhiyun struct ptp_clock *ptp_clock; 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun /* tc control */ 499*4882a593Smuzhiyun int tx_tc; 500*4882a593Smuzhiyun int rx_tc; 501*4882a593Smuzhiyun /* EEE-LPI specific members */ 502*4882a593Smuzhiyun struct timer_list eee_ctrl_timer; 503*4882a593Smuzhiyun bool tx_path_in_lpi_mode; 504*4882a593Smuzhiyun int lpi_irq; 505*4882a593Smuzhiyun int eee_enabled; 506*4882a593Smuzhiyun int eee_active; 507*4882a593Smuzhiyun int tx_lpi_timer; 508*4882a593Smuzhiyun }; 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun /* Function prototypes */ 511*4882a593Smuzhiyun struct sxgbe_priv_data *sxgbe_drv_probe(struct device *device, 512*4882a593Smuzhiyun struct sxgbe_plat_data *plat_dat, 513*4882a593Smuzhiyun void __iomem *addr); 514*4882a593Smuzhiyun int sxgbe_drv_remove(struct net_device *ndev); 515*4882a593Smuzhiyun void sxgbe_set_ethtool_ops(struct net_device *netdev); 516*4882a593Smuzhiyun int sxgbe_mdio_unregister(struct net_device *ndev); 517*4882a593Smuzhiyun int sxgbe_mdio_register(struct net_device *ndev); 518*4882a593Smuzhiyun int sxgbe_register_platform(void); 519*4882a593Smuzhiyun void sxgbe_unregister_platform(void); 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun #ifdef CONFIG_PM 522*4882a593Smuzhiyun int sxgbe_suspend(struct net_device *ndev); 523*4882a593Smuzhiyun int sxgbe_resume(struct net_device *ndev); 524*4882a593Smuzhiyun int sxgbe_freeze(struct net_device *ndev); 525*4882a593Smuzhiyun int sxgbe_restore(struct net_device *ndev); 526*4882a593Smuzhiyun #endif /* CONFIG_PM */ 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void); 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv); 531*4882a593Smuzhiyun bool sxgbe_eee_init(struct sxgbe_priv_data * const priv); 532*4882a593Smuzhiyun #endif /* __SXGBE_COMMON_H__ */ 533