1*4882a593Smuzhiyun /* Synopsys DesignWare Core Enterprise Ethernet (XLGMAC) Driver 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright (c) 2017 Synopsys, Inc. (www.synopsys.com) 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is dual-licensed; you may select either version 2 of 6*4882a593Smuzhiyun * the GNU General Public License ("GPL") or BSD license ("BSD"). 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * This Synopsys DWC XLGMAC software driver and associated documentation 9*4882a593Smuzhiyun * (hereinafter the "Software") is an unsupported proprietary work of 10*4882a593Smuzhiyun * Synopsys, Inc. unless otherwise expressly agreed to in writing between 11*4882a593Smuzhiyun * Synopsys and you. The Software IS NOT an item of Licensed Software or a 12*4882a593Smuzhiyun * Licensed Product under any End User Software License Agreement or 13*4882a593Smuzhiyun * Agreement for Licensed Products with Synopsys or any supplement thereto. 14*4882a593Smuzhiyun * Synopsys is a registered trademark of Synopsys, Inc. Other names included 15*4882a593Smuzhiyun * in the SOFTWARE may be the trademarks of their respective owners. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef __DWC_XLGMAC_H__ 19*4882a593Smuzhiyun #define __DWC_XLGMAC_H__ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <linux/dma-mapping.h> 22*4882a593Smuzhiyun #include <linux/netdevice.h> 23*4882a593Smuzhiyun #include <linux/workqueue.h> 24*4882a593Smuzhiyun #include <linux/phy.h> 25*4882a593Smuzhiyun #include <linux/if_vlan.h> 26*4882a593Smuzhiyun #include <linux/bitops.h> 27*4882a593Smuzhiyun #include <linux/timecounter.h> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define XLGMAC_DRV_NAME "dwc-xlgmac" 30*4882a593Smuzhiyun #define XLGMAC_DRV_VERSION "1.0.0" 31*4882a593Smuzhiyun #define XLGMAC_DRV_DESC "Synopsys DWC XLGMAC Driver" 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Descriptor related parameters */ 34*4882a593Smuzhiyun #define XLGMAC_TX_DESC_CNT 1024 35*4882a593Smuzhiyun #define XLGMAC_TX_DESC_MIN_FREE (XLGMAC_TX_DESC_CNT >> 3) 36*4882a593Smuzhiyun #define XLGMAC_TX_DESC_MAX_PROC (XLGMAC_TX_DESC_CNT >> 1) 37*4882a593Smuzhiyun #define XLGMAC_RX_DESC_CNT 1024 38*4882a593Smuzhiyun #define XLGMAC_RX_DESC_MAX_DIRTY (XLGMAC_RX_DESC_CNT >> 3) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* Descriptors required for maximum contiguous TSO/GSO packet */ 41*4882a593Smuzhiyun #define XLGMAC_TX_MAX_SPLIT ((GSO_MAX_SIZE / XLGMAC_TX_MAX_BUF_SIZE) + 1) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* Maximum possible descriptors needed for a SKB */ 44*4882a593Smuzhiyun #define XLGMAC_TX_MAX_DESC_NR (MAX_SKB_FRAGS + XLGMAC_TX_MAX_SPLIT + 2) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define XLGMAC_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) 47*4882a593Smuzhiyun #define XLGMAC_RX_MIN_BUF_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) 48*4882a593Smuzhiyun #define XLGMAC_RX_BUF_ALIGN 64 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* Maximum Size for Splitting the Header Data 51*4882a593Smuzhiyun * Keep in sync with SKB_ALLOC_SIZE 52*4882a593Smuzhiyun * 3'b000: 64 bytes, 3'b001: 128 bytes 53*4882a593Smuzhiyun * 3'b010: 256 bytes, 3'b011: 512 bytes 54*4882a593Smuzhiyun * 3'b100: 1023 bytes , 3'b101'3'b111: Reserved 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun #define XLGMAC_SPH_HDSMS_SIZE 3 57*4882a593Smuzhiyun #define XLGMAC_SKB_ALLOC_SIZE 512 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define XLGMAC_MAX_FIFO 81920 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #define XLGMAC_MAX_DMA_CHANNELS 16 62*4882a593Smuzhiyun #define XLGMAC_DMA_STOP_TIMEOUT 5 63*4882a593Smuzhiyun #define XLGMAC_DMA_INTERRUPT_MASK 0x31c7 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Default coalescing parameters */ 66*4882a593Smuzhiyun #define XLGMAC_INIT_DMA_TX_USECS 1000 67*4882a593Smuzhiyun #define XLGMAC_INIT_DMA_TX_FRAMES 25 68*4882a593Smuzhiyun #define XLGMAC_INIT_DMA_RX_USECS 30 69*4882a593Smuzhiyun #define XLGMAC_INIT_DMA_RX_FRAMES 25 70*4882a593Smuzhiyun #define XLGMAC_MAX_DMA_RIWT 0xff 71*4882a593Smuzhiyun #define XLGMAC_MIN_DMA_RIWT 0x01 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Flow control queue count */ 74*4882a593Smuzhiyun #define XLGMAC_MAX_FLOW_CONTROL_QUEUES 8 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* System clock is 125 MHz */ 77*4882a593Smuzhiyun #define XLGMAC_SYSCLOCK 125000000 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* Maximum MAC address hash table size (256 bits = 8 bytes) */ 80*4882a593Smuzhiyun #define XLGMAC_MAC_HASH_TABLE_SIZE 8 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* Receive Side Scaling */ 83*4882a593Smuzhiyun #define XLGMAC_RSS_HASH_KEY_SIZE 40 84*4882a593Smuzhiyun #define XLGMAC_RSS_MAX_TABLE_SIZE 256 85*4882a593Smuzhiyun #define XLGMAC_RSS_LOOKUP_TABLE_TYPE 0 86*4882a593Smuzhiyun #define XLGMAC_RSS_HASH_KEY_TYPE 1 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define XLGMAC_STD_PACKET_MTU 1500 89*4882a593Smuzhiyun #define XLGMAC_JUMBO_PACKET_MTU 9000 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Helper macro for descriptor handling 92*4882a593Smuzhiyun * Always use XLGMAC_GET_DESC_DATA to access the descriptor data 93*4882a593Smuzhiyun */ 94*4882a593Smuzhiyun #define XLGMAC_GET_DESC_DATA(ring, idx) ({ \ 95*4882a593Smuzhiyun typeof(ring) _ring = (ring); \ 96*4882a593Smuzhiyun ((_ring)->desc_data_head + \ 97*4882a593Smuzhiyun ((idx) & ((_ring)->dma_desc_count - 1))); \ 98*4882a593Smuzhiyun }) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #define XLGMAC_GET_REG_BITS(var, pos, len) ({ \ 101*4882a593Smuzhiyun typeof(pos) _pos = (pos); \ 102*4882a593Smuzhiyun typeof(len) _len = (len); \ 103*4882a593Smuzhiyun ((var) & GENMASK(_pos + _len - 1, _pos)) >> (_pos); \ 104*4882a593Smuzhiyun }) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define XLGMAC_GET_REG_BITS_LE(var, pos, len) ({ \ 107*4882a593Smuzhiyun typeof(pos) _pos = (pos); \ 108*4882a593Smuzhiyun typeof(len) _len = (len); \ 109*4882a593Smuzhiyun typeof(var) _var = le32_to_cpu((var)); \ 110*4882a593Smuzhiyun ((_var) & GENMASK(_pos + _len - 1, _pos)) >> (_pos); \ 111*4882a593Smuzhiyun }) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define XLGMAC_SET_REG_BITS(var, pos, len, val) ({ \ 114*4882a593Smuzhiyun typeof(var) _var = (var); \ 115*4882a593Smuzhiyun typeof(pos) _pos = (pos); \ 116*4882a593Smuzhiyun typeof(len) _len = (len); \ 117*4882a593Smuzhiyun typeof(val) _val = (val); \ 118*4882a593Smuzhiyun _val = (_val << _pos) & GENMASK(_pos + _len - 1, _pos); \ 119*4882a593Smuzhiyun _var = (_var & ~GENMASK(_pos + _len - 1, _pos)) | _val; \ 120*4882a593Smuzhiyun }) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define XLGMAC_SET_REG_BITS_LE(var, pos, len, val) ({ \ 123*4882a593Smuzhiyun typeof(var) _var = (var); \ 124*4882a593Smuzhiyun typeof(pos) _pos = (pos); \ 125*4882a593Smuzhiyun typeof(len) _len = (len); \ 126*4882a593Smuzhiyun typeof(val) _val = (val); \ 127*4882a593Smuzhiyun _val = (_val << _pos) & GENMASK(_pos + _len - 1, _pos); \ 128*4882a593Smuzhiyun _var = (_var & ~GENMASK(_pos + _len - 1, _pos)) | _val; \ 129*4882a593Smuzhiyun cpu_to_le32(_var); \ 130*4882a593Smuzhiyun }) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun struct xlgmac_pdata; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun enum xlgmac_int { 135*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_TI, 136*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_TPS, 137*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_TBU, 138*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_RI, 139*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_RBU, 140*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_RPS, 141*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_TI_RI, 142*4882a593Smuzhiyun XLGMAC_INT_DMA_CH_SR_FBE, 143*4882a593Smuzhiyun XLGMAC_INT_DMA_ALL, 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun struct xlgmac_stats { 147*4882a593Smuzhiyun /* MMC TX counters */ 148*4882a593Smuzhiyun u64 txoctetcount_gb; 149*4882a593Smuzhiyun u64 txframecount_gb; 150*4882a593Smuzhiyun u64 txbroadcastframes_g; 151*4882a593Smuzhiyun u64 txmulticastframes_g; 152*4882a593Smuzhiyun u64 tx64octets_gb; 153*4882a593Smuzhiyun u64 tx65to127octets_gb; 154*4882a593Smuzhiyun u64 tx128to255octets_gb; 155*4882a593Smuzhiyun u64 tx256to511octets_gb; 156*4882a593Smuzhiyun u64 tx512to1023octets_gb; 157*4882a593Smuzhiyun u64 tx1024tomaxoctets_gb; 158*4882a593Smuzhiyun u64 txunicastframes_gb; 159*4882a593Smuzhiyun u64 txmulticastframes_gb; 160*4882a593Smuzhiyun u64 txbroadcastframes_gb; 161*4882a593Smuzhiyun u64 txunderflowerror; 162*4882a593Smuzhiyun u64 txoctetcount_g; 163*4882a593Smuzhiyun u64 txframecount_g; 164*4882a593Smuzhiyun u64 txpauseframes; 165*4882a593Smuzhiyun u64 txvlanframes_g; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* MMC RX counters */ 168*4882a593Smuzhiyun u64 rxframecount_gb; 169*4882a593Smuzhiyun u64 rxoctetcount_gb; 170*4882a593Smuzhiyun u64 rxoctetcount_g; 171*4882a593Smuzhiyun u64 rxbroadcastframes_g; 172*4882a593Smuzhiyun u64 rxmulticastframes_g; 173*4882a593Smuzhiyun u64 rxcrcerror; 174*4882a593Smuzhiyun u64 rxrunterror; 175*4882a593Smuzhiyun u64 rxjabbererror; 176*4882a593Smuzhiyun u64 rxundersize_g; 177*4882a593Smuzhiyun u64 rxoversize_g; 178*4882a593Smuzhiyun u64 rx64octets_gb; 179*4882a593Smuzhiyun u64 rx65to127octets_gb; 180*4882a593Smuzhiyun u64 rx128to255octets_gb; 181*4882a593Smuzhiyun u64 rx256to511octets_gb; 182*4882a593Smuzhiyun u64 rx512to1023octets_gb; 183*4882a593Smuzhiyun u64 rx1024tomaxoctets_gb; 184*4882a593Smuzhiyun u64 rxunicastframes_g; 185*4882a593Smuzhiyun u64 rxlengtherror; 186*4882a593Smuzhiyun u64 rxoutofrangetype; 187*4882a593Smuzhiyun u64 rxpauseframes; 188*4882a593Smuzhiyun u64 rxfifooverflow; 189*4882a593Smuzhiyun u64 rxvlanframes_gb; 190*4882a593Smuzhiyun u64 rxwatchdogerror; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* Extra counters */ 193*4882a593Smuzhiyun u64 tx_tso_packets; 194*4882a593Smuzhiyun u64 rx_split_header_packets; 195*4882a593Smuzhiyun u64 tx_process_stopped; 196*4882a593Smuzhiyun u64 rx_process_stopped; 197*4882a593Smuzhiyun u64 tx_buffer_unavailable; 198*4882a593Smuzhiyun u64 rx_buffer_unavailable; 199*4882a593Smuzhiyun u64 fatal_bus_error; 200*4882a593Smuzhiyun u64 tx_vlan_packets; 201*4882a593Smuzhiyun u64 rx_vlan_packets; 202*4882a593Smuzhiyun u64 napi_poll_isr; 203*4882a593Smuzhiyun u64 napi_poll_txtimer; 204*4882a593Smuzhiyun }; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun struct xlgmac_ring_buf { 207*4882a593Smuzhiyun struct sk_buff *skb; 208*4882a593Smuzhiyun dma_addr_t skb_dma; 209*4882a593Smuzhiyun unsigned int skb_len; 210*4882a593Smuzhiyun }; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* Common Tx and Rx DMA hardware descriptor */ 213*4882a593Smuzhiyun struct xlgmac_dma_desc { 214*4882a593Smuzhiyun __le32 desc0; 215*4882a593Smuzhiyun __le32 desc1; 216*4882a593Smuzhiyun __le32 desc2; 217*4882a593Smuzhiyun __le32 desc3; 218*4882a593Smuzhiyun }; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun /* Page allocation related values */ 221*4882a593Smuzhiyun struct xlgmac_page_alloc { 222*4882a593Smuzhiyun struct page *pages; 223*4882a593Smuzhiyun unsigned int pages_len; 224*4882a593Smuzhiyun unsigned int pages_offset; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun dma_addr_t pages_dma; 227*4882a593Smuzhiyun }; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* Ring entry buffer data */ 230*4882a593Smuzhiyun struct xlgmac_buffer_data { 231*4882a593Smuzhiyun struct xlgmac_page_alloc pa; 232*4882a593Smuzhiyun struct xlgmac_page_alloc pa_unmap; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun dma_addr_t dma_base; 235*4882a593Smuzhiyun unsigned long dma_off; 236*4882a593Smuzhiyun unsigned int dma_len; 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* Tx-related desc data */ 240*4882a593Smuzhiyun struct xlgmac_tx_desc_data { 241*4882a593Smuzhiyun unsigned int packets; /* BQL packet count */ 242*4882a593Smuzhiyun unsigned int bytes; /* BQL byte count */ 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* Rx-related desc data */ 246*4882a593Smuzhiyun struct xlgmac_rx_desc_data { 247*4882a593Smuzhiyun struct xlgmac_buffer_data hdr; /* Header locations */ 248*4882a593Smuzhiyun struct xlgmac_buffer_data buf; /* Payload locations */ 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun unsigned short hdr_len; /* Length of received header */ 251*4882a593Smuzhiyun unsigned short len; /* Length of received packet */ 252*4882a593Smuzhiyun }; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun struct xlgmac_pkt_info { 255*4882a593Smuzhiyun struct sk_buff *skb; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun unsigned int attributes; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun unsigned int errors; 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /* descriptors needed for this packet */ 262*4882a593Smuzhiyun unsigned int desc_count; 263*4882a593Smuzhiyun unsigned int length; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun unsigned int tx_packets; 266*4882a593Smuzhiyun unsigned int tx_bytes; 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun unsigned int header_len; 269*4882a593Smuzhiyun unsigned int tcp_header_len; 270*4882a593Smuzhiyun unsigned int tcp_payload_len; 271*4882a593Smuzhiyun unsigned short mss; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun unsigned short vlan_ctag; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun u64 rx_tstamp; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun u32 rss_hash; 278*4882a593Smuzhiyun enum pkt_hash_types rss_hash_type; 279*4882a593Smuzhiyun }; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun struct xlgmac_desc_data { 282*4882a593Smuzhiyun /* dma_desc: Virtual address of descriptor 283*4882a593Smuzhiyun * dma_desc_addr: DMA address of descriptor 284*4882a593Smuzhiyun */ 285*4882a593Smuzhiyun struct xlgmac_dma_desc *dma_desc; 286*4882a593Smuzhiyun dma_addr_t dma_desc_addr; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /* skb: Virtual address of SKB 289*4882a593Smuzhiyun * skb_dma: DMA address of SKB data 290*4882a593Smuzhiyun * skb_dma_len: Length of SKB DMA area 291*4882a593Smuzhiyun */ 292*4882a593Smuzhiyun struct sk_buff *skb; 293*4882a593Smuzhiyun dma_addr_t skb_dma; 294*4882a593Smuzhiyun unsigned int skb_dma_len; 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun /* Tx/Rx -related data */ 297*4882a593Smuzhiyun struct xlgmac_tx_desc_data tx; 298*4882a593Smuzhiyun struct xlgmac_rx_desc_data rx; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun unsigned int mapped_as_page; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /* Incomplete receive save location. If the budget is exhausted 303*4882a593Smuzhiyun * or the last descriptor (last normal descriptor or a following 304*4882a593Smuzhiyun * context descriptor) has not been DMA'd yet the current state 305*4882a593Smuzhiyun * of the receive processing needs to be saved. 306*4882a593Smuzhiyun */ 307*4882a593Smuzhiyun unsigned int state_saved; 308*4882a593Smuzhiyun struct { 309*4882a593Smuzhiyun struct sk_buff *skb; 310*4882a593Smuzhiyun unsigned int len; 311*4882a593Smuzhiyun unsigned int error; 312*4882a593Smuzhiyun } state; 313*4882a593Smuzhiyun }; 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun struct xlgmac_ring { 316*4882a593Smuzhiyun /* Per packet related information */ 317*4882a593Smuzhiyun struct xlgmac_pkt_info pkt_info; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* Virtual/DMA addresses of DMA descriptor list and the total count */ 320*4882a593Smuzhiyun struct xlgmac_dma_desc *dma_desc_head; 321*4882a593Smuzhiyun dma_addr_t dma_desc_head_addr; 322*4882a593Smuzhiyun unsigned int dma_desc_count; 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun /* Array of descriptor data corresponding the DMA descriptor 325*4882a593Smuzhiyun * (always use the XLGMAC_GET_DESC_DATA macro to access this data) 326*4882a593Smuzhiyun */ 327*4882a593Smuzhiyun struct xlgmac_desc_data *desc_data_head; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* Page allocation for RX buffers */ 330*4882a593Smuzhiyun struct xlgmac_page_alloc rx_hdr_pa; 331*4882a593Smuzhiyun struct xlgmac_page_alloc rx_buf_pa; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* Ring index values 334*4882a593Smuzhiyun * cur - Tx: index of descriptor to be used for current transfer 335*4882a593Smuzhiyun * Rx: index of descriptor to check for packet availability 336*4882a593Smuzhiyun * dirty - Tx: index of descriptor to check for transfer complete 337*4882a593Smuzhiyun * Rx: index of descriptor to check for buffer reallocation 338*4882a593Smuzhiyun */ 339*4882a593Smuzhiyun unsigned int cur; 340*4882a593Smuzhiyun unsigned int dirty; 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* Coalesce frame count used for interrupt bit setting */ 343*4882a593Smuzhiyun unsigned int coalesce_count; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun union { 346*4882a593Smuzhiyun struct { 347*4882a593Smuzhiyun unsigned int xmit_more; 348*4882a593Smuzhiyun unsigned int queue_stopped; 349*4882a593Smuzhiyun unsigned short cur_mss; 350*4882a593Smuzhiyun unsigned short cur_vlan_ctag; 351*4882a593Smuzhiyun } tx; 352*4882a593Smuzhiyun }; 353*4882a593Smuzhiyun } ____cacheline_aligned; 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun struct xlgmac_channel { 356*4882a593Smuzhiyun char name[16]; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /* Address of private data area for device */ 359*4882a593Smuzhiyun struct xlgmac_pdata *pdata; 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun /* Queue index and base address of queue's DMA registers */ 362*4882a593Smuzhiyun unsigned int queue_index; 363*4882a593Smuzhiyun void __iomem *dma_regs; 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun /* Per channel interrupt irq number */ 366*4882a593Smuzhiyun int dma_irq; 367*4882a593Smuzhiyun char dma_irq_name[IFNAMSIZ + 32]; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun /* Netdev related settings */ 370*4882a593Smuzhiyun struct napi_struct napi; 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun unsigned int saved_ier; 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun unsigned int tx_timer_active; 375*4882a593Smuzhiyun struct timer_list tx_timer; 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun struct xlgmac_ring *tx_ring; 378*4882a593Smuzhiyun struct xlgmac_ring *rx_ring; 379*4882a593Smuzhiyun } ____cacheline_aligned; 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun struct xlgmac_desc_ops { 382*4882a593Smuzhiyun int (*alloc_channles_and_rings)(struct xlgmac_pdata *pdata); 383*4882a593Smuzhiyun void (*free_channels_and_rings)(struct xlgmac_pdata *pdata); 384*4882a593Smuzhiyun int (*map_tx_skb)(struct xlgmac_channel *channel, 385*4882a593Smuzhiyun struct sk_buff *skb); 386*4882a593Smuzhiyun int (*map_rx_buffer)(struct xlgmac_pdata *pdata, 387*4882a593Smuzhiyun struct xlgmac_ring *ring, 388*4882a593Smuzhiyun struct xlgmac_desc_data *desc_data); 389*4882a593Smuzhiyun void (*unmap_desc_data)(struct xlgmac_pdata *pdata, 390*4882a593Smuzhiyun struct xlgmac_desc_data *desc_data); 391*4882a593Smuzhiyun void (*tx_desc_init)(struct xlgmac_pdata *pdata); 392*4882a593Smuzhiyun void (*rx_desc_init)(struct xlgmac_pdata *pdata); 393*4882a593Smuzhiyun }; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun struct xlgmac_hw_ops { 396*4882a593Smuzhiyun int (*init)(struct xlgmac_pdata *pdata); 397*4882a593Smuzhiyun int (*exit)(struct xlgmac_pdata *pdata); 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun int (*tx_complete)(struct xlgmac_dma_desc *dma_desc); 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun void (*enable_tx)(struct xlgmac_pdata *pdata); 402*4882a593Smuzhiyun void (*disable_tx)(struct xlgmac_pdata *pdata); 403*4882a593Smuzhiyun void (*enable_rx)(struct xlgmac_pdata *pdata); 404*4882a593Smuzhiyun void (*disable_rx)(struct xlgmac_pdata *pdata); 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun int (*enable_int)(struct xlgmac_channel *channel, 407*4882a593Smuzhiyun enum xlgmac_int int_id); 408*4882a593Smuzhiyun int (*disable_int)(struct xlgmac_channel *channel, 409*4882a593Smuzhiyun enum xlgmac_int int_id); 410*4882a593Smuzhiyun void (*dev_xmit)(struct xlgmac_channel *channel); 411*4882a593Smuzhiyun int (*dev_read)(struct xlgmac_channel *channel); 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun int (*set_mac_address)(struct xlgmac_pdata *pdata, u8 *addr); 414*4882a593Smuzhiyun int (*config_rx_mode)(struct xlgmac_pdata *pdata); 415*4882a593Smuzhiyun int (*enable_rx_csum)(struct xlgmac_pdata *pdata); 416*4882a593Smuzhiyun int (*disable_rx_csum)(struct xlgmac_pdata *pdata); 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun /* For MII speed configuration */ 419*4882a593Smuzhiyun int (*set_xlgmii_25000_speed)(struct xlgmac_pdata *pdata); 420*4882a593Smuzhiyun int (*set_xlgmii_40000_speed)(struct xlgmac_pdata *pdata); 421*4882a593Smuzhiyun int (*set_xlgmii_50000_speed)(struct xlgmac_pdata *pdata); 422*4882a593Smuzhiyun int (*set_xlgmii_100000_speed)(struct xlgmac_pdata *pdata); 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /* For descriptor related operation */ 425*4882a593Smuzhiyun void (*tx_desc_init)(struct xlgmac_channel *channel); 426*4882a593Smuzhiyun void (*rx_desc_init)(struct xlgmac_channel *channel); 427*4882a593Smuzhiyun void (*tx_desc_reset)(struct xlgmac_desc_data *desc_data); 428*4882a593Smuzhiyun void (*rx_desc_reset)(struct xlgmac_pdata *pdata, 429*4882a593Smuzhiyun struct xlgmac_desc_data *desc_data, 430*4882a593Smuzhiyun unsigned int index); 431*4882a593Smuzhiyun int (*is_last_desc)(struct xlgmac_dma_desc *dma_desc); 432*4882a593Smuzhiyun int (*is_context_desc)(struct xlgmac_dma_desc *dma_desc); 433*4882a593Smuzhiyun void (*tx_start_xmit)(struct xlgmac_channel *channel, 434*4882a593Smuzhiyun struct xlgmac_ring *ring); 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun /* For Flow Control */ 437*4882a593Smuzhiyun int (*config_tx_flow_control)(struct xlgmac_pdata *pdata); 438*4882a593Smuzhiyun int (*config_rx_flow_control)(struct xlgmac_pdata *pdata); 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun /* For Vlan related config */ 441*4882a593Smuzhiyun int (*enable_rx_vlan_stripping)(struct xlgmac_pdata *pdata); 442*4882a593Smuzhiyun int (*disable_rx_vlan_stripping)(struct xlgmac_pdata *pdata); 443*4882a593Smuzhiyun int (*enable_rx_vlan_filtering)(struct xlgmac_pdata *pdata); 444*4882a593Smuzhiyun int (*disable_rx_vlan_filtering)(struct xlgmac_pdata *pdata); 445*4882a593Smuzhiyun int (*update_vlan_hash_table)(struct xlgmac_pdata *pdata); 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun /* For RX coalescing */ 448*4882a593Smuzhiyun int (*config_rx_coalesce)(struct xlgmac_pdata *pdata); 449*4882a593Smuzhiyun int (*config_tx_coalesce)(struct xlgmac_pdata *pdata); 450*4882a593Smuzhiyun unsigned int (*usec_to_riwt)(struct xlgmac_pdata *pdata, 451*4882a593Smuzhiyun unsigned int usec); 452*4882a593Smuzhiyun unsigned int (*riwt_to_usec)(struct xlgmac_pdata *pdata, 453*4882a593Smuzhiyun unsigned int riwt); 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun /* For RX and TX threshold config */ 456*4882a593Smuzhiyun int (*config_rx_threshold)(struct xlgmac_pdata *pdata, 457*4882a593Smuzhiyun unsigned int val); 458*4882a593Smuzhiyun int (*config_tx_threshold)(struct xlgmac_pdata *pdata, 459*4882a593Smuzhiyun unsigned int val); 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun /* For RX and TX Store and Forward Mode config */ 462*4882a593Smuzhiyun int (*config_rsf_mode)(struct xlgmac_pdata *pdata, 463*4882a593Smuzhiyun unsigned int val); 464*4882a593Smuzhiyun int (*config_tsf_mode)(struct xlgmac_pdata *pdata, 465*4882a593Smuzhiyun unsigned int val); 466*4882a593Smuzhiyun 467*4882a593Smuzhiyun /* For TX DMA Operate on Second Frame config */ 468*4882a593Smuzhiyun int (*config_osp_mode)(struct xlgmac_pdata *pdata); 469*4882a593Smuzhiyun 470*4882a593Smuzhiyun /* For RX and TX PBL config */ 471*4882a593Smuzhiyun int (*config_rx_pbl_val)(struct xlgmac_pdata *pdata); 472*4882a593Smuzhiyun int (*get_rx_pbl_val)(struct xlgmac_pdata *pdata); 473*4882a593Smuzhiyun int (*config_tx_pbl_val)(struct xlgmac_pdata *pdata); 474*4882a593Smuzhiyun int (*get_tx_pbl_val)(struct xlgmac_pdata *pdata); 475*4882a593Smuzhiyun int (*config_pblx8)(struct xlgmac_pdata *pdata); 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun /* For MMC statistics */ 478*4882a593Smuzhiyun void (*rx_mmc_int)(struct xlgmac_pdata *pdata); 479*4882a593Smuzhiyun void (*tx_mmc_int)(struct xlgmac_pdata *pdata); 480*4882a593Smuzhiyun void (*read_mmc_stats)(struct xlgmac_pdata *pdata); 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun /* For Receive Side Scaling */ 483*4882a593Smuzhiyun int (*enable_rss)(struct xlgmac_pdata *pdata); 484*4882a593Smuzhiyun int (*disable_rss)(struct xlgmac_pdata *pdata); 485*4882a593Smuzhiyun int (*set_rss_hash_key)(struct xlgmac_pdata *pdata, 486*4882a593Smuzhiyun const u8 *key); 487*4882a593Smuzhiyun int (*set_rss_lookup_table)(struct xlgmac_pdata *pdata, 488*4882a593Smuzhiyun const u32 *table); 489*4882a593Smuzhiyun }; 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun /* This structure contains flags that indicate what hardware features 492*4882a593Smuzhiyun * or configurations are present in the device. 493*4882a593Smuzhiyun */ 494*4882a593Smuzhiyun struct xlgmac_hw_features { 495*4882a593Smuzhiyun /* HW Version */ 496*4882a593Smuzhiyun unsigned int version; 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun /* HW Feature Register0 */ 499*4882a593Smuzhiyun unsigned int phyifsel; /* PHY interface support */ 500*4882a593Smuzhiyun unsigned int vlhash; /* VLAN Hash Filter */ 501*4882a593Smuzhiyun unsigned int sma; /* SMA(MDIO) Interface */ 502*4882a593Smuzhiyun unsigned int rwk; /* PMT remote wake-up packet */ 503*4882a593Smuzhiyun unsigned int mgk; /* PMT magic packet */ 504*4882a593Smuzhiyun unsigned int mmc; /* RMON module */ 505*4882a593Smuzhiyun unsigned int aoe; /* ARP Offload */ 506*4882a593Smuzhiyun unsigned int ts; /* IEEE 1588-2008 Advanced Timestamp */ 507*4882a593Smuzhiyun unsigned int eee; /* Energy Efficient Ethernet */ 508*4882a593Smuzhiyun unsigned int tx_coe; /* Tx Checksum Offload */ 509*4882a593Smuzhiyun unsigned int rx_coe; /* Rx Checksum Offload */ 510*4882a593Smuzhiyun unsigned int addn_mac; /* Additional MAC Addresses */ 511*4882a593Smuzhiyun unsigned int ts_src; /* Timestamp Source */ 512*4882a593Smuzhiyun unsigned int sa_vlan_ins; /* Source Address or VLAN Insertion */ 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun /* HW Feature Register1 */ 515*4882a593Smuzhiyun unsigned int rx_fifo_size; /* MTL Receive FIFO Size */ 516*4882a593Smuzhiyun unsigned int tx_fifo_size; /* MTL Transmit FIFO Size */ 517*4882a593Smuzhiyun unsigned int adv_ts_hi; /* Advance Timestamping High Word */ 518*4882a593Smuzhiyun unsigned int dma_width; /* DMA width */ 519*4882a593Smuzhiyun unsigned int dcb; /* DCB Feature */ 520*4882a593Smuzhiyun unsigned int sph; /* Split Header Feature */ 521*4882a593Smuzhiyun unsigned int tso; /* TCP Segmentation Offload */ 522*4882a593Smuzhiyun unsigned int dma_debug; /* DMA Debug Registers */ 523*4882a593Smuzhiyun unsigned int rss; /* Receive Side Scaling */ 524*4882a593Smuzhiyun unsigned int tc_cnt; /* Number of Traffic Classes */ 525*4882a593Smuzhiyun unsigned int hash_table_size; /* Hash Table Size */ 526*4882a593Smuzhiyun unsigned int l3l4_filter_num; /* Number of L3-L4 Filters */ 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun /* HW Feature Register2 */ 529*4882a593Smuzhiyun unsigned int rx_q_cnt; /* Number of MTL Receive Queues */ 530*4882a593Smuzhiyun unsigned int tx_q_cnt; /* Number of MTL Transmit Queues */ 531*4882a593Smuzhiyun unsigned int rx_ch_cnt; /* Number of DMA Receive Channels */ 532*4882a593Smuzhiyun unsigned int tx_ch_cnt; /* Number of DMA Transmit Channels */ 533*4882a593Smuzhiyun unsigned int pps_out_num; /* Number of PPS outputs */ 534*4882a593Smuzhiyun unsigned int aux_snap_num; /* Number of Aux snapshot inputs */ 535*4882a593Smuzhiyun }; 536*4882a593Smuzhiyun 537*4882a593Smuzhiyun struct xlgmac_resources { 538*4882a593Smuzhiyun void __iomem *addr; 539*4882a593Smuzhiyun int irq; 540*4882a593Smuzhiyun }; 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun struct xlgmac_pdata { 543*4882a593Smuzhiyun struct net_device *netdev; 544*4882a593Smuzhiyun struct device *dev; 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun struct xlgmac_hw_ops hw_ops; 547*4882a593Smuzhiyun struct xlgmac_desc_ops desc_ops; 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun /* Device statistics */ 550*4882a593Smuzhiyun struct xlgmac_stats stats; 551*4882a593Smuzhiyun 552*4882a593Smuzhiyun u32 msg_enable; 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun /* MAC registers base */ 555*4882a593Smuzhiyun void __iomem *mac_regs; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun /* Hardware features of the device */ 558*4882a593Smuzhiyun struct xlgmac_hw_features hw_feat; 559*4882a593Smuzhiyun 560*4882a593Smuzhiyun struct work_struct restart_work; 561*4882a593Smuzhiyun 562*4882a593Smuzhiyun /* Rings for Tx/Rx on a DMA channel */ 563*4882a593Smuzhiyun struct xlgmac_channel *channel_head; 564*4882a593Smuzhiyun unsigned int channel_count; 565*4882a593Smuzhiyun unsigned int tx_ring_count; 566*4882a593Smuzhiyun unsigned int rx_ring_count; 567*4882a593Smuzhiyun unsigned int tx_desc_count; 568*4882a593Smuzhiyun unsigned int rx_desc_count; 569*4882a593Smuzhiyun unsigned int tx_q_count; 570*4882a593Smuzhiyun unsigned int rx_q_count; 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun /* Tx/Rx common settings */ 573*4882a593Smuzhiyun unsigned int pblx8; 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun /* Tx settings */ 576*4882a593Smuzhiyun unsigned int tx_sf_mode; 577*4882a593Smuzhiyun unsigned int tx_threshold; 578*4882a593Smuzhiyun unsigned int tx_pbl; 579*4882a593Smuzhiyun unsigned int tx_osp_mode; 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun /* Rx settings */ 582*4882a593Smuzhiyun unsigned int rx_sf_mode; 583*4882a593Smuzhiyun unsigned int rx_threshold; 584*4882a593Smuzhiyun unsigned int rx_pbl; 585*4882a593Smuzhiyun 586*4882a593Smuzhiyun /* Tx coalescing settings */ 587*4882a593Smuzhiyun unsigned int tx_usecs; 588*4882a593Smuzhiyun unsigned int tx_frames; 589*4882a593Smuzhiyun 590*4882a593Smuzhiyun /* Rx coalescing settings */ 591*4882a593Smuzhiyun unsigned int rx_riwt; 592*4882a593Smuzhiyun unsigned int rx_usecs; 593*4882a593Smuzhiyun unsigned int rx_frames; 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun /* Current Rx buffer size */ 596*4882a593Smuzhiyun unsigned int rx_buf_size; 597*4882a593Smuzhiyun 598*4882a593Smuzhiyun /* Flow control settings */ 599*4882a593Smuzhiyun unsigned int tx_pause; 600*4882a593Smuzhiyun unsigned int rx_pause; 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun /* Device interrupt number */ 603*4882a593Smuzhiyun int dev_irq; 604*4882a593Smuzhiyun unsigned int per_channel_irq; 605*4882a593Smuzhiyun int channel_irq[XLGMAC_MAX_DMA_CHANNELS]; 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun /* Netdev related settings */ 608*4882a593Smuzhiyun unsigned char mac_addr[ETH_ALEN]; 609*4882a593Smuzhiyun netdev_features_t netdev_features; 610*4882a593Smuzhiyun struct napi_struct napi; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun /* Filtering support */ 613*4882a593Smuzhiyun unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun /* Device clocks */ 616*4882a593Smuzhiyun unsigned long sysclk_rate; 617*4882a593Smuzhiyun 618*4882a593Smuzhiyun /* RSS addressing mutex */ 619*4882a593Smuzhiyun struct mutex rss_mutex; 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun /* Receive Side Scaling settings */ 622*4882a593Smuzhiyun u8 rss_key[XLGMAC_RSS_HASH_KEY_SIZE]; 623*4882a593Smuzhiyun u32 rss_table[XLGMAC_RSS_MAX_TABLE_SIZE]; 624*4882a593Smuzhiyun u32 rss_options; 625*4882a593Smuzhiyun 626*4882a593Smuzhiyun int phy_speed; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun char drv_name[32]; 629*4882a593Smuzhiyun char drv_ver[32]; 630*4882a593Smuzhiyun }; 631*4882a593Smuzhiyun 632*4882a593Smuzhiyun void xlgmac_init_desc_ops(struct xlgmac_desc_ops *desc_ops); 633*4882a593Smuzhiyun void xlgmac_init_hw_ops(struct xlgmac_hw_ops *hw_ops); 634*4882a593Smuzhiyun const struct net_device_ops *xlgmac_get_netdev_ops(void); 635*4882a593Smuzhiyun const struct ethtool_ops *xlgmac_get_ethtool_ops(void); 636*4882a593Smuzhiyun void xlgmac_dump_tx_desc(struct xlgmac_pdata *pdata, 637*4882a593Smuzhiyun struct xlgmac_ring *ring, 638*4882a593Smuzhiyun unsigned int idx, 639*4882a593Smuzhiyun unsigned int count, 640*4882a593Smuzhiyun unsigned int flag); 641*4882a593Smuzhiyun void xlgmac_dump_rx_desc(struct xlgmac_pdata *pdata, 642*4882a593Smuzhiyun struct xlgmac_ring *ring, 643*4882a593Smuzhiyun unsigned int idx); 644*4882a593Smuzhiyun void xlgmac_print_pkt(struct net_device *netdev, 645*4882a593Smuzhiyun struct sk_buff *skb, bool tx_rx); 646*4882a593Smuzhiyun void xlgmac_get_all_hw_features(struct xlgmac_pdata *pdata); 647*4882a593Smuzhiyun void xlgmac_print_all_hw_features(struct xlgmac_pdata *pdata); 648*4882a593Smuzhiyun int xlgmac_drv_probe(struct device *dev, 649*4882a593Smuzhiyun struct xlgmac_resources *res); 650*4882a593Smuzhiyun int xlgmac_drv_remove(struct device *dev); 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun /* For debug prints */ 653*4882a593Smuzhiyun #ifdef XLGMAC_DEBUG 654*4882a593Smuzhiyun #define XLGMAC_PR(fmt, args...) \ 655*4882a593Smuzhiyun pr_alert("[%s,%d]:" fmt, __func__, __LINE__, ## args) 656*4882a593Smuzhiyun #else 657*4882a593Smuzhiyun #define XLGMAC_PR(x...) do { } while (0) 658*4882a593Smuzhiyun #endif 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun #endif /* __DWC_XLGMAC_H__ */ 661