cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dwc-xlgmac.h (19345B)


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