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