diff options
Diffstat (limited to 'drivers/net/ethernet/amd/xgbe/xgbe.h')
| -rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe.h | 676 | 
1 files changed, 676 insertions, 0 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h new file mode 100644 index 00000000000..ab0627162c0 --- /dev/null +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -0,0 +1,676 @@ +/* + * AMD 10Gb Ethernet driver + * + * This file is available to you under your choice of the following two + * licenses: + * + * License 1: GPLv2 + * + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * + * This file is free software; you may copy, redistribute and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or (at + * your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * This file incorporates work covered by the following copyright and + * permission notice: + *     The Synopsys DWC ETHER XGMAC Software Driver and documentation + *     (hereinafter "Software") is an unsupported proprietary work of Synopsys, + *     Inc. unless otherwise expressly agreed to in writing between Synopsys + *     and you. + * + *     The Software IS NOT an item of Licensed Software or Licensed Product + *     under any End User Software License Agreement or Agreement for Licensed + *     Product with Synopsys or any supplement thereto.  Permission is hereby + *     granted, free of charge, to any person obtaining a copy of this software + *     annotated with this license and the Software, to deal in the Software + *     without restriction, including without limitation the rights to use, + *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies + *     of the Software, and to permit persons to whom the Software is furnished + *     to do so, subject to the following conditions: + * + *     The above copyright notice and this permission notice shall be included + *     in all copies or substantial portions of the Software. + * + *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + *     THE POSSIBILITY OF SUCH DAMAGE. + * + * + * License 2: Modified BSD + * + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + *     * Redistributions of source code must retain the above copyright + *       notice, this list of conditions and the following disclaimer. + *     * Redistributions in binary form must reproduce the above copyright + *       notice, this list of conditions and the following disclaimer in the + *       documentation and/or other materials provided with the distribution. + *     * Neither the name of Advanced Micro Devices, Inc. nor the + *       names of its contributors may be used to endorse or promote products + *       derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file incorporates work covered by the following copyright and + * permission notice: + *     The Synopsys DWC ETHER XGMAC Software Driver and documentation + *     (hereinafter "Software") is an unsupported proprietary work of Synopsys, + *     Inc. unless otherwise expressly agreed to in writing between Synopsys + *     and you. + * + *     The Software IS NOT an item of Licensed Software or Licensed Product + *     under any End User Software License Agreement or Agreement for Licensed + *     Product with Synopsys or any supplement thereto.  Permission is hereby + *     granted, free of charge, to any person obtaining a copy of this software + *     annotated with this license and the Software, to deal in the Software + *     without restriction, including without limitation the rights to use, + *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies + *     of the Software, and to permit persons to whom the Software is furnished + *     to do so, subject to the following conditions: + * + *     The above copyright notice and this permission notice shall be included + *     in all copies or substantial portions of the Software. + * + *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + *     THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __XGBE_H__ +#define __XGBE_H__ + +#include <linux/dma-mapping.h> +#include <linux/netdevice.h> +#include <linux/workqueue.h> +#include <linux/phy.h> + + +#define XGBE_DRV_NAME		"amd-xgbe" +#define XGBE_DRV_VERSION	"1.0.0-a" +#define XGBE_DRV_DESC		"AMD 10 Gigabit Ethernet Driver" + +/* Descriptor related defines */ +#define TX_DESC_CNT		512 +#define TX_DESC_MIN_FREE	(TX_DESC_CNT >> 3) +#define TX_DESC_MAX_PROC	(TX_DESC_CNT >> 1) +#define RX_DESC_CNT		512 + +#define TX_MAX_BUF_SIZE		(0x3fff & ~(64 - 1)) + +#define RX_MIN_BUF_SIZE		(ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) +#define RX_BUF_ALIGN		64 + +#define XGBE_MAX_DMA_CHANNELS	16 +#define DMA_ARDOMAIN_SETTING	0x2 +#define DMA_ARCACHE_SETTING	0xb +#define DMA_AWDOMAIN_SETTING	0x2 +#define DMA_AWCACHE_SETTING	0x7 +#define DMA_INTERRUPT_MASK	0x31c7 + +#define XGMAC_MIN_PACKET	60 +#define XGMAC_STD_PACKET_MTU	1500 +#define XGMAC_MAX_STD_PACKET	1518 +#define XGMAC_JUMBO_PACKET_MTU	9000 +#define XGMAC_MAX_JUMBO_PACKET	9018 + +#define MAX_MULTICAST_LIST	14 +#define TX_FLAGS_IP_PKT		0x00000001 +#define TX_FLAGS_TCP_PKT	0x00000002 + +/* MDIO bus phy name */ +#define XGBE_PHY_NAME		"amd_xgbe_phy" +#define XGBE_PRTAD		0 + +/* Driver PMT macros */ +#define XGMAC_DRIVER_CONTEXT	1 +#define XGMAC_IOCTL_CONTEXT	2 + +#define FIFO_SIZE_B(x)		(x) +#define FIFO_SIZE_KB(x)		(x * 1024) + +#define XGBE_TC_CNT		2 + +/* Helper macro for descriptor handling + *  Always use GET_DESC_DATA to access the descriptor data + *  since the index is free-running and needs to be and-ed + *  with the descriptor count value of the ring to index to + *  the proper descriptor data. + */ +#define GET_DESC_DATA(_ring, _idx)				\ +	((_ring)->rdata +					\ +	 ((_idx) & ((_ring)->rdesc_count - 1))) + + +/* Default coalescing parameters */ +#define XGMAC_INIT_DMA_TX_USECS		100 +#define XGMAC_INIT_DMA_TX_FRAMES	16 + +#define XGMAC_MAX_DMA_RIWT		0xff +#define XGMAC_INIT_DMA_RX_USECS		100 +#define XGMAC_INIT_DMA_RX_FRAMES	16 + +/* Flow control queue count */ +#define XGMAC_MAX_FLOW_CONTROL_QUEUES	8 + + +struct xgbe_prv_data; + +struct xgbe_packet_data { +	unsigned int attributes; + +	unsigned int errors; + +	unsigned int rdesc_count; +	unsigned int length; + +	unsigned int header_len; +	unsigned int tcp_header_len; +	unsigned int tcp_payload_len; +	unsigned short mss; + +	unsigned short vlan_ctag; +}; + +/* Common Rx and Tx descriptor mapping */ +struct xgbe_ring_desc { +	unsigned int desc0; +	unsigned int desc1; +	unsigned int desc2; +	unsigned int desc3; +}; + +/* Structure used to hold information related to the descriptor + * and the packet associated with the descriptor (always use + * use the GET_DESC_DATA macro to access this data from the ring) + */ +struct xgbe_ring_data { +	struct xgbe_ring_desc *rdesc;	/* Virtual address of descriptor */ +	dma_addr_t rdesc_dma;		/* DMA address of descriptor */ + +	struct sk_buff *skb;		/* Virtual address of SKB */ +	dma_addr_t skb_dma;		/* DMA address of SKB data */ +	unsigned int skb_dma_len;	/* Length of SKB DMA area */ +	unsigned int tso_header;        /* TSO header indicator */ + +	unsigned short len;		/* Length of received Rx packet */ + +	unsigned int interrupt;		/* Interrupt indicator */ + +	unsigned int mapped_as_page; +}; + +struct xgbe_ring { +	/* Ring lock - used just for TX rings at the moment */ +	spinlock_t lock; + +	/* Per packet related information */ +	struct xgbe_packet_data packet_data; + +	/* Virtual/DMA addresses and count of allocated descriptor memory */ +	struct xgbe_ring_desc *rdesc; +	dma_addr_t rdesc_dma; +	unsigned int rdesc_count; + +	/* Array of descriptor data corresponding the descriptor memory +	 * (always use the GET_DESC_DATA macro to access this data) +	 */ +	struct xgbe_ring_data *rdata; + +	/* Ring index values +	 *  cur   - Tx: index of descriptor to be used for current transfer +	 *          Rx: index of descriptor to check for packet availability +	 *  dirty - Tx: index of descriptor to check for transfer complete +	 *          Rx: count of descriptors in which a packet has been received +	 *              (used with skb_realloc_index to refresh the ring) +	 */ +	unsigned int cur; +	unsigned int dirty; + +	/* Coalesce frame count used for interrupt bit setting */ +	unsigned int coalesce_count; + +	union { +		struct { +			unsigned int queue_stopped; +			unsigned short cur_mss; +			unsigned short cur_vlan_ctag; +		} tx; + +		struct { +			unsigned int realloc_index; +			unsigned int realloc_threshold; +		} rx; +	}; +} ____cacheline_aligned; + +/* Structure used to describe the descriptor rings associated with + * a DMA channel. + */ +struct xgbe_channel { +	char name[16]; + +	/* Address of private data area for device */ +	struct xgbe_prv_data *pdata; + +	/* Queue index and base address of queue's DMA registers */ +	unsigned int queue_index; +	void __iomem *dma_regs; + +	unsigned int saved_ier; + +	unsigned int tx_timer_active; +	struct hrtimer tx_timer; + +	struct xgbe_ring *tx_ring; +	struct xgbe_ring *rx_ring; +} ____cacheline_aligned; + +enum xgbe_int { +	XGMAC_INT_DMA_ISR_DC0IS, +	XGMAC_INT_DMA_CH_SR_TI, +	XGMAC_INT_DMA_CH_SR_TPS, +	XGMAC_INT_DMA_CH_SR_TBU, +	XGMAC_INT_DMA_CH_SR_RI, +	XGMAC_INT_DMA_CH_SR_RBU, +	XGMAC_INT_DMA_CH_SR_RPS, +	XGMAC_INT_DMA_CH_SR_FBE, +	XGMAC_INT_DMA_ALL, +}; + +enum xgbe_int_state { +	XGMAC_INT_STATE_SAVE, +	XGMAC_INT_STATE_RESTORE, +}; + +enum xgbe_mtl_fifo_size { +	XGMAC_MTL_FIFO_SIZE_256  = 0x00, +	XGMAC_MTL_FIFO_SIZE_512  = 0x01, +	XGMAC_MTL_FIFO_SIZE_1K   = 0x03, +	XGMAC_MTL_FIFO_SIZE_2K   = 0x07, +	XGMAC_MTL_FIFO_SIZE_4K   = 0x0f, +	XGMAC_MTL_FIFO_SIZE_8K   = 0x1f, +	XGMAC_MTL_FIFO_SIZE_16K  = 0x3f, +	XGMAC_MTL_FIFO_SIZE_32K  = 0x7f, +	XGMAC_MTL_FIFO_SIZE_64K  = 0xff, +	XGMAC_MTL_FIFO_SIZE_128K = 0x1ff, +	XGMAC_MTL_FIFO_SIZE_256K = 0x3ff, +}; + +struct xgbe_mmc_stats { +	/* Tx Stats */ +	u64 txoctetcount_gb; +	u64 txframecount_gb; +	u64 txbroadcastframes_g; +	u64 txmulticastframes_g; +	u64 tx64octets_gb; +	u64 tx65to127octets_gb; +	u64 tx128to255octets_gb; +	u64 tx256to511octets_gb; +	u64 tx512to1023octets_gb; +	u64 tx1024tomaxoctets_gb; +	u64 txunicastframes_gb; +	u64 txmulticastframes_gb; +	u64 txbroadcastframes_gb; +	u64 txunderflowerror; +	u64 txoctetcount_g; +	u64 txframecount_g; +	u64 txpauseframes; +	u64 txvlanframes_g; + +	/* Rx Stats */ +	u64 rxframecount_gb; +	u64 rxoctetcount_gb; +	u64 rxoctetcount_g; +	u64 rxbroadcastframes_g; +	u64 rxmulticastframes_g; +	u64 rxcrcerror; +	u64 rxrunterror; +	u64 rxjabbererror; +	u64 rxundersize_g; +	u64 rxoversize_g; +	u64 rx64octets_gb; +	u64 rx65to127octets_gb; +	u64 rx128to255octets_gb; +	u64 rx256to511octets_gb; +	u64 rx512to1023octets_gb; +	u64 rx1024tomaxoctets_gb; +	u64 rxunicastframes_g; +	u64 rxlengtherror; +	u64 rxoutofrangetype; +	u64 rxpauseframes; +	u64 rxfifooverflow; +	u64 rxvlanframes_gb; +	u64 rxwatchdogerror; +}; + +struct xgbe_hw_if { +	int (*tx_complete)(struct xgbe_ring_desc *); + +	int (*set_promiscuous_mode)(struct xgbe_prv_data *, unsigned int); +	int (*set_all_multicast_mode)(struct xgbe_prv_data *, unsigned int); +	int (*set_addn_mac_addrs)(struct xgbe_prv_data *, unsigned int); +	int (*set_mac_address)(struct xgbe_prv_data *, u8 *addr); + +	int (*enable_rx_csum)(struct xgbe_prv_data *); +	int (*disable_rx_csum)(struct xgbe_prv_data *); + +	int (*enable_rx_vlan_stripping)(struct xgbe_prv_data *); +	int (*disable_rx_vlan_stripping)(struct xgbe_prv_data *); + +	int (*read_mmd_regs)(struct xgbe_prv_data *, int, int); +	void (*write_mmd_regs)(struct xgbe_prv_data *, int, int, int); +	int (*set_gmii_speed)(struct xgbe_prv_data *); +	int (*set_gmii_2500_speed)(struct xgbe_prv_data *); +	int (*set_xgmii_speed)(struct xgbe_prv_data *); + +	void (*enable_tx)(struct xgbe_prv_data *); +	void (*disable_tx)(struct xgbe_prv_data *); +	void (*enable_rx)(struct xgbe_prv_data *); +	void (*disable_rx)(struct xgbe_prv_data *); + +	void (*powerup_tx)(struct xgbe_prv_data *); +	void (*powerdown_tx)(struct xgbe_prv_data *); +	void (*powerup_rx)(struct xgbe_prv_data *); +	void (*powerdown_rx)(struct xgbe_prv_data *); + +	int (*init)(struct xgbe_prv_data *); +	int (*exit)(struct xgbe_prv_data *); + +	int (*enable_int)(struct xgbe_channel *, enum xgbe_int); +	int (*disable_int)(struct xgbe_channel *, enum xgbe_int); +	void (*pre_xmit)(struct xgbe_channel *); +	int (*dev_read)(struct xgbe_channel *); +	void (*tx_desc_init)(struct xgbe_channel *); +	void (*rx_desc_init)(struct xgbe_channel *); +	void (*rx_desc_reset)(struct xgbe_ring_data *); +	void (*tx_desc_reset)(struct xgbe_ring_data *); +	int (*is_last_desc)(struct xgbe_ring_desc *); +	int (*is_context_desc)(struct xgbe_ring_desc *); + +	/* For FLOW ctrl */ +	int (*config_tx_flow_control)(struct xgbe_prv_data *); +	int (*config_rx_flow_control)(struct xgbe_prv_data *); + +	/* For RX coalescing */ +	int (*config_rx_coalesce)(struct xgbe_prv_data *); +	int (*config_tx_coalesce)(struct xgbe_prv_data *); +	unsigned int (*usec_to_riwt)(struct xgbe_prv_data *, unsigned int); +	unsigned int (*riwt_to_usec)(struct xgbe_prv_data *, unsigned int); + +	/* For RX and TX threshold config */ +	int (*config_rx_threshold)(struct xgbe_prv_data *, unsigned int); +	int (*config_tx_threshold)(struct xgbe_prv_data *, unsigned int); + +	/* For RX and TX Store and Forward Mode config */ +	int (*config_rsf_mode)(struct xgbe_prv_data *, unsigned int); +	int (*config_tsf_mode)(struct xgbe_prv_data *, unsigned int); + +	/* For TX DMA Operate on Second Frame config */ +	int (*config_osp_mode)(struct xgbe_prv_data *); + +	/* For RX and TX PBL config */ +	int (*config_rx_pbl_val)(struct xgbe_prv_data *); +	int (*get_rx_pbl_val)(struct xgbe_prv_data *); +	int (*config_tx_pbl_val)(struct xgbe_prv_data *); +	int (*get_tx_pbl_val)(struct xgbe_prv_data *); +	int (*config_pblx8)(struct xgbe_prv_data *); + +	/* For MMC statistics */ +	void (*rx_mmc_int)(struct xgbe_prv_data *); +	void (*tx_mmc_int)(struct xgbe_prv_data *); +	void (*read_mmc_stats)(struct xgbe_prv_data *); +}; + +struct xgbe_desc_if { +	int (*alloc_ring_resources)(struct xgbe_prv_data *); +	void (*free_ring_resources)(struct xgbe_prv_data *); +	int (*map_tx_skb)(struct xgbe_channel *, struct sk_buff *); +	void (*realloc_skb)(struct xgbe_channel *); +	void (*unmap_skb)(struct xgbe_prv_data *, struct xgbe_ring_data *); +	void (*wrapper_tx_desc_init)(struct xgbe_prv_data *); +	void (*wrapper_rx_desc_init)(struct xgbe_prv_data *); +}; + +/* This structure contains flags that indicate what hardware features + * or configurations are present in the device. + */ +struct xgbe_hw_features { +	/* HW Feature Register0 */ +	unsigned int gmii;		/* 1000 Mbps support */ +	unsigned int vlhash;		/* VLAN Hash Filter */ +	unsigned int sma;		/* SMA(MDIO) Interface */ +	unsigned int rwk;		/* PMT remote wake-up packet */ +	unsigned int mgk;		/* PMT magic packet */ +	unsigned int mmc;		/* RMON module */ +	unsigned int aoe;		/* ARP Offload */ +	unsigned int ts;		/* IEEE 1588-2008 Adavanced Timestamp */ +	unsigned int eee;		/* Energy Efficient Ethernet */ +	unsigned int tx_coe;		/* Tx Checksum Offload */ +	unsigned int rx_coe;		/* Rx Checksum Offload */ +	unsigned int addn_mac;		/* Additional MAC Addresses */ +	unsigned int ts_src;		/* Timestamp Source */ +	unsigned int sa_vlan_ins;	/* Source Address or VLAN Insertion */ + +	/* HW Feature Register1 */ +	unsigned int rx_fifo_size;	/* MTL Receive FIFO Size */ +	unsigned int tx_fifo_size;	/* MTL Transmit FIFO Size */ +	unsigned int adv_ts_hi;		/* Advance Timestamping High Word */ +	unsigned int dcb;		/* DCB Feature */ +	unsigned int sph;		/* Split Header Feature */ +	unsigned int tso;		/* TCP Segmentation Offload */ +	unsigned int dma_debug;		/* DMA Debug Registers */ +	unsigned int rss;		/* Receive Side Scaling */ +	unsigned int hash_table_size;	/* Hash Table Size */ +	unsigned int l3l4_filter_num;	/* Number of L3-L4 Filters */ + +	/* HW Feature Register2 */ +	unsigned int rx_q_cnt;		/* Number of MTL Receive Queues */ +	unsigned int tx_q_cnt;		/* Number of MTL Transmit Queues */ +	unsigned int rx_ch_cnt;		/* Number of DMA Receive Channels */ +	unsigned int tx_ch_cnt;		/* Number of DMA Transmit Channels */ +	unsigned int pps_out_num;	/* Number of PPS outputs */ +	unsigned int aux_snap_num;	/* Number of Aux snapshot inputs */ +}; + +struct xgbe_prv_data { +	struct net_device *netdev; +	struct platform_device *pdev; +	struct device *dev; + +	/* XGMAC/XPCS related mmio registers */ +	void __iomem *xgmac_regs;	/* XGMAC CSRs */ +	void __iomem *xpcs_regs;	/* XPCS MMD registers */ + +	/* Overall device lock */ +	spinlock_t lock; + +	/* XPCS indirect addressing mutex */ +	struct mutex xpcs_mutex; + +	int irq_number; + +	struct xgbe_hw_if hw_if; +	struct xgbe_desc_if desc_if; + +	/* Rings for Tx/Rx on a DMA channel */ +	struct xgbe_channel *channel; +	unsigned int channel_count; +	unsigned int tx_ring_count; +	unsigned int tx_desc_count; +	unsigned int rx_ring_count; +	unsigned int rx_desc_count; + +	/* Tx/Rx common settings */ +	unsigned int pblx8; + +	/* Tx settings */ +	unsigned int tx_sf_mode; +	unsigned int tx_threshold; +	unsigned int tx_pbl; +	unsigned int tx_osp_mode; + +	/* Rx settings */ +	unsigned int rx_sf_mode; +	unsigned int rx_threshold; +	unsigned int rx_pbl; + +	/* Tx coalescing settings */ +	unsigned int tx_usecs; +	unsigned int tx_frames; + +	/* Rx coalescing settings */ +	unsigned int rx_riwt; +	unsigned int rx_frames; + +	/* Current MTU */ +	unsigned int rx_buf_size; + +	/* Flow control settings */ +	unsigned int pause_autoneg; +	unsigned int tx_pause; +	unsigned int rx_pause; + +	/* MDIO settings */ +	struct module *phy_module; +	char *mii_bus_id; +	struct mii_bus *mii; +	int mdio_mmd; +	struct phy_device *phydev; +	int default_autoneg; +	int default_speed; + +	/* Current PHY settings */ +	phy_interface_t phy_mode; +	int phy_link; +	int phy_speed; +	unsigned int phy_tx_pause; +	unsigned int phy_rx_pause; + +	/* Netdev related settings */ +	netdev_features_t netdev_features; +	struct napi_struct napi; +	struct xgbe_mmc_stats mmc_stats; + +	/* System clock value used for Rx watchdog */ +	struct clk *sysclock; + +	/* Hardware features of the device */ +	struct xgbe_hw_features hw_feat; + +	/* Device restart work structure */ +	struct work_struct restart_work; + +	/* Keeps track of power mode */ +	unsigned int power_down; + +#ifdef CONFIG_DEBUG_FS +	struct dentry *xgbe_debugfs; + +	unsigned int debugfs_xgmac_reg; + +	unsigned int debugfs_xpcs_mmd; +	unsigned int debugfs_xpcs_reg; +#endif +}; + +/* Function prototypes*/ + +void xgbe_init_function_ptrs_dev(struct xgbe_hw_if *); +void xgbe_init_function_ptrs_desc(struct xgbe_desc_if *); +struct net_device_ops *xgbe_get_netdev_ops(void); +struct ethtool_ops *xgbe_get_ethtool_ops(void); + +int xgbe_mdio_register(struct xgbe_prv_data *); +void xgbe_mdio_unregister(struct xgbe_prv_data *); +void xgbe_dump_phy_registers(struct xgbe_prv_data *); +void xgbe_dump_tx_desc(struct xgbe_ring *, unsigned int, unsigned int, +		       unsigned int); +void xgbe_dump_rx_desc(struct xgbe_ring *, struct xgbe_ring_desc *, +		       unsigned int); +void xgbe_print_pkt(struct net_device *, struct sk_buff *, bool); +void xgbe_get_all_hw_features(struct xgbe_prv_data *); +int xgbe_powerup(struct net_device *, unsigned int); +int xgbe_powerdown(struct net_device *, unsigned int); +void xgbe_init_rx_coalesce(struct xgbe_prv_data *); +void xgbe_init_tx_coalesce(struct xgbe_prv_data *); + +#ifdef CONFIG_DEBUG_FS +void xgbe_debugfs_init(struct xgbe_prv_data *); +void xgbe_debugfs_exit(struct xgbe_prv_data *); +#else +static inline void xgbe_debugfs_init(struct xgbe_prv_data *pdata) {} +static inline void xgbe_debugfs_exit(struct xgbe_prv_data *pdata) {} +#endif /* CONFIG_DEBUG_FS */ + +/* NOTE: Uncomment for TX and RX DESCRIPTOR DUMP in KERNEL LOG */ +#if 0 +#define XGMAC_ENABLE_TX_DESC_DUMP +#define XGMAC_ENABLE_RX_DESC_DUMP +#endif + +/* NOTE: Uncomment for TX and RX PACKET DUMP in KERNEL LOG */ +#if 0 +#define XGMAC_ENABLE_TX_PKT_DUMP +#define XGMAC_ENABLE_RX_PKT_DUMP +#endif + +/* NOTE: Uncomment for function trace log messages in KERNEL LOG */ +#if 0 +#define YDEBUG +#define YDEBUG_MDIO +#endif + +/* For debug prints */ +#ifdef YDEBUG +#define DBGPR(x...) pr_alert(x) +#define DBGPHY_REGS(x...) xgbe_dump_phy_registers(x) +#else +#define DBGPR(x...) do { } while (0) +#define DBGPHY_REGS(x...) do { } while (0) +#endif + +#ifdef YDEBUG_MDIO +#define DBGPR_MDIO(x...) pr_alert(x) +#else +#define DBGPR_MDIO(x...) do { } while (0) +#endif + +#endif  | 
