xref: /freebsd/sys/dev/al_eth/al_eth.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
17902c8dcSWojciech Macek /*-
27902c8dcSWojciech Macek  * Copyright (c) 2015,2016 Annapurna Labs Ltd. and affiliates
37902c8dcSWojciech Macek  * All rights reserved.
47902c8dcSWojciech Macek  *
57902c8dcSWojciech Macek  * Developed by Semihalf.
67902c8dcSWojciech Macek  *
77902c8dcSWojciech Macek  * Redistribution and use in source and binary forms, with or without
87902c8dcSWojciech Macek  * modification, are permitted provided that the following conditions
97902c8dcSWojciech Macek  * are met:
107902c8dcSWojciech Macek  * 1. Redistributions of source code must retain the above copyright
117902c8dcSWojciech Macek  *    notice, this list of conditions and the following disclaimer.
127902c8dcSWojciech Macek  * 2. Redistributions in binary form must reproduce the above copyright
137902c8dcSWojciech Macek  *    notice, this list of conditions and the following disclaimer in the
147902c8dcSWojciech Macek  *    documentation and/or other materials provided with the distribution.
157902c8dcSWojciech Macek  *
167902c8dcSWojciech Macek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
177902c8dcSWojciech Macek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187902c8dcSWojciech Macek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197902c8dcSWojciech Macek  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
207902c8dcSWojciech Macek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217902c8dcSWojciech Macek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227902c8dcSWojciech Macek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237902c8dcSWojciech Macek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247902c8dcSWojciech Macek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257902c8dcSWojciech Macek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267902c8dcSWojciech Macek  * SUCH DAMAGE.
277902c8dcSWojciech Macek  */
287902c8dcSWojciech Macek 
297902c8dcSWojciech Macek #ifndef __AL_ETH_H__
307902c8dcSWojciech Macek #define	__AL_ETH_H__
317902c8dcSWojciech Macek 
327902c8dcSWojciech Macek #include "al_init_eth_lm.h"
337902c8dcSWojciech Macek #include "al_hal_eth.h"
347902c8dcSWojciech Macek #include "al_hal_udma_iofic.h"
357902c8dcSWojciech Macek #include "al_hal_udma_debug.h"
367902c8dcSWojciech Macek #include "al_serdes.h"
377902c8dcSWojciech Macek 
387902c8dcSWojciech Macek enum board_t {
397902c8dcSWojciech Macek 	ALPINE_INTEGRATED = 0,
407902c8dcSWojciech Macek 	ALPINE_NIC = 1,
417902c8dcSWojciech Macek 	ALPINE_FPGA_NIC = 2,
427902c8dcSWojciech Macek };
437902c8dcSWojciech Macek 
447902c8dcSWojciech Macek #define	AL_ETH_MAX_HW_QUEUES	4
457902c8dcSWojciech Macek #define	AL_ETH_NUM_QUEUES	4
467902c8dcSWojciech Macek #define	AL_ETH_MAX_MSIX_VEC	(1 + 2 * AL_ETH_MAX_HW_QUEUES)
477902c8dcSWojciech Macek 
487902c8dcSWojciech Macek #define AL_ETH_DEFAULT_TX_SW_DESCS	(512)
497902c8dcSWojciech Macek #define AL_ETH_DEFAULT_TX_HW_DESCS	(512)
507902c8dcSWojciech Macek #define AL_ETH_DEFAULT_RX_DESCS		(512)
517902c8dcSWojciech Macek 
527902c8dcSWojciech Macek #if ((AL_ETH_DEFAULT_TX_SW_DESCS / 4) < (AL_ETH_PKT_MAX_BUFS + 2))
537902c8dcSWojciech Macek #define	AL_ETH_TX_WAKEUP_THRESH		(AL_ETH_DEFAULT_TX_SW_DESCS / 4)
547902c8dcSWojciech Macek #else
557902c8dcSWojciech Macek #define	AL_ETH_TX_WAKEUP_THRESH		(AL_ETH_PKT_MAX_BUFS + 2)
567902c8dcSWojciech Macek #endif
577902c8dcSWojciech Macek 
587902c8dcSWojciech Macek #define	NET_IP_ALIGN				2
597902c8dcSWojciech Macek #define	AL_ETH_DEFAULT_SMALL_PACKET_LEN		(128 - NET_IP_ALIGN)
607902c8dcSWojciech Macek #define	AL_ETH_HEADER_COPY_SIZE			(128 - NET_IP_ALIGN)
617902c8dcSWojciech Macek 
627902c8dcSWojciech Macek #define	AL_ETH_DEFAULT_MAX_RX_BUFF_ALLOC_SIZE	9216
637902c8dcSWojciech Macek /*
647902c8dcSWojciech Macek  * Minimum the buffer size to 600 to avoid situation the mtu will be changed
657902c8dcSWojciech Macek  * from too little buffer to very big one and then the number of buffer per
667902c8dcSWojciech Macek  * packet could reach the maximum AL_ETH_PKT_MAX_BUFS
677902c8dcSWojciech Macek  */
687902c8dcSWojciech Macek #define	AL_ETH_DEFAULT_MIN_RX_BUFF_ALLOC_SIZE	600
697902c8dcSWojciech Macek #define	AL_ETH_DEFAULT_FORCE_1000_BASEX FALSE
707902c8dcSWojciech Macek 
717902c8dcSWojciech Macek #define	AL_ETH_DEFAULT_LINK_POLL_INTERVAL	100
727902c8dcSWojciech Macek #define	AL_ETH_FIRST_LINK_POLL_INTERVAL		1
737902c8dcSWojciech Macek 
747902c8dcSWojciech Macek #define	AL_ETH_NAME_MAX_LEN	20
757902c8dcSWojciech Macek #define	AL_ETH_IRQNAME_SIZE	40
767902c8dcSWojciech Macek 
777902c8dcSWojciech Macek #define	AL_ETH_DEFAULT_MDIO_FREQ_KHZ	2500
787902c8dcSWojciech Macek #define	AL_ETH_MDIO_FREQ_1000_KHZ	1000
797902c8dcSWojciech Macek 
807902c8dcSWojciech Macek struct al_eth_irq {
817902c8dcSWojciech Macek 	driver_filter_t *handler;
827902c8dcSWojciech Macek 	void		*data;
837902c8dcSWojciech Macek 	unsigned int	vector;
847902c8dcSWojciech Macek 	uint8_t		requested;
857902c8dcSWojciech Macek 	char		name[AL_ETH_IRQNAME_SIZE];
867902c8dcSWojciech Macek 	struct resource *res;
877902c8dcSWojciech Macek 	void		*cookie;
887902c8dcSWojciech Macek };
897902c8dcSWojciech Macek 
907902c8dcSWojciech Macek struct al_eth_tx_buffer {
917902c8dcSWojciech Macek 	struct mbuf *m;
927902c8dcSWojciech Macek 	struct al_eth_pkt hal_pkt;
937902c8dcSWojciech Macek 	bus_dmamap_t	dma_map;
947902c8dcSWojciech Macek 	unsigned int	tx_descs;
957902c8dcSWojciech Macek };
967902c8dcSWojciech Macek 
977902c8dcSWojciech Macek struct al_eth_rx_buffer {
987902c8dcSWojciech Macek 	struct mbuf	*m;
997902c8dcSWojciech Macek 	unsigned int	data_size;
1007902c8dcSWojciech Macek 	bus_dmamap_t	dma_map;
1017902c8dcSWojciech Macek 	struct al_buf	al_buf;
1027902c8dcSWojciech Macek };
1037902c8dcSWojciech Macek 
1047902c8dcSWojciech Macek struct al_eth_ring {
1057902c8dcSWojciech Macek 	device_t dev;
1067902c8dcSWojciech Macek 	struct al_eth_adapter *adapter;
1077902c8dcSWojciech Macek 	/* Used to get rx packets from hal */
1087902c8dcSWojciech Macek 	struct al_eth_pkt hal_pkt;
1097902c8dcSWojciech Macek 	/* Udma queue handler */
1107902c8dcSWojciech Macek 	struct al_udma_q *dma_q;
1117902c8dcSWojciech Macek 	uint32_t ring_id;
1127902c8dcSWojciech Macek 	uint16_t next_to_use;
1137902c8dcSWojciech Macek 	uint16_t next_to_clean;
1147902c8dcSWojciech Macek 	/* The offset of the interrupt unmask register */
1157902c8dcSWojciech Macek 	uint32_t *unmask_reg_offset;
1167902c8dcSWojciech Macek 	/*
1177902c8dcSWojciech Macek 	 * The value to write to the above register to
1187902c8dcSWojciech Macek 	 * unmask the interrupt of this ring
1197902c8dcSWojciech Macek 	 */
1207902c8dcSWojciech Macek 	uint32_t unmask_val;
1217902c8dcSWojciech Macek 	struct al_eth_meta_data hal_meta;
1227902c8dcSWojciech Macek 	/* Contex of tx packet */
1237902c8dcSWojciech Macek 	struct al_eth_tx_buffer *tx_buffer_info;
1247902c8dcSWojciech Macek 	/* Contex of rx packet */
1257902c8dcSWojciech Macek 	struct al_eth_rx_buffer *rx_buffer_info;
1267902c8dcSWojciech Macek 	/* Number of tx/rx_buffer_info's entries */
1277902c8dcSWojciech Macek 	int sw_count;
1287902c8dcSWojciech Macek 	/* Number of hw descriptors */
1297902c8dcSWojciech Macek 	int hw_count;
1307902c8dcSWojciech Macek 	/* Size (in bytes) of hw descriptors */
1317902c8dcSWojciech Macek 	size_t descs_size;
1327902c8dcSWojciech Macek 	/* Size (in bytes) of hw completion descriptors, used for rx */
1337902c8dcSWojciech Macek 	size_t cdescs_size;
1347902c8dcSWojciech Macek 	struct ifnet *netdev;
1357902c8dcSWojciech Macek 	struct al_udma_q_params	q_params;
1367902c8dcSWojciech Macek 	struct buf_ring *br;
1377902c8dcSWojciech Macek 	struct mtx br_mtx;
1387902c8dcSWojciech Macek 	struct task enqueue_task;
1397902c8dcSWojciech Macek 	struct taskqueue *enqueue_tq;
1407902c8dcSWojciech Macek 	volatile uint32_t enqueue_is_running;
1417902c8dcSWojciech Macek 	struct task cmpl_task;
1427902c8dcSWojciech Macek 	struct taskqueue *cmpl_tq;
1437902c8dcSWojciech Macek 	volatile uint32_t cmpl_is_running;
1447902c8dcSWojciech Macek 	uint32_t lro_enabled;
1457902c8dcSWojciech Macek 	struct lro_ctrl lro;
1467902c8dcSWojciech Macek 	bus_dma_tag_t dma_buf_tag;
1477902c8dcSWojciech Macek 	volatile uint32_t stall;
1487902c8dcSWojciech Macek };
1497902c8dcSWojciech Macek 
1507902c8dcSWojciech Macek #define	AL_ETH_TX_RING_IDX_NEXT(tx_ring, idx) (((idx) + 1) & (AL_ETH_DEFAULT_TX_SW_DESCS - 1))
1517902c8dcSWojciech Macek 
1527902c8dcSWojciech Macek #define	AL_ETH_RX_RING_IDX_NEXT(rx_ring, idx) (((idx) + 1) & (AL_ETH_DEFAULT_RX_DESCS - 1))
1537902c8dcSWojciech Macek #define	AL_ETH_RX_RING_IDX_ADD(rx_ring, idx, n) (((idx) + (n)) & (AL_ETH_DEFAULT_RX_DESCS - 1))
1547902c8dcSWojciech Macek 
1557902c8dcSWojciech Macek /* flow control configuration */
1567902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_RX_FIFO_TH_HIGH	0x160
1577902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_RX_FIFO_TH_LOW		0x90
1587902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_QUANTA			0xffff
1597902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_QUANTA_TH		0x8000
1607902c8dcSWojciech Macek 
1617902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_AUTONEG	1
1627902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_RX_PAUSE	2
1637902c8dcSWojciech Macek #define	AL_ETH_FLOW_CTRL_TX_PAUSE	4
1647902c8dcSWojciech Macek 
1657902c8dcSWojciech Macek /* link configuration for 1G port */
1667902c8dcSWojciech Macek struct al_eth_link_config {
1677902c8dcSWojciech Macek 	int old_link;
1687902c8dcSWojciech Macek 	/* Describes what we actually have. */
1697902c8dcSWojciech Macek 	int	active_duplex;
1707902c8dcSWojciech Macek 	int	active_speed;
1717902c8dcSWojciech Macek 
1727902c8dcSWojciech Macek 	/* current flow control status */
1737902c8dcSWojciech Macek 	uint8_t flow_ctrl_active;
1747902c8dcSWojciech Macek 	/* supported configuration (can be changed from ethtool) */
1757902c8dcSWojciech Macek 	uint8_t flow_ctrl_supported;
1767902c8dcSWojciech Macek 
1777902c8dcSWojciech Macek 	/* the following are not relevant to RGMII */
178*463edaf4SJohn Baldwin 	bool	force_1000_base_x;
179*463edaf4SJohn Baldwin 	bool	autoneg;
1807902c8dcSWojciech Macek };
1817902c8dcSWojciech Macek 
1827902c8dcSWojciech Macek /* SFP detection event */
1837902c8dcSWojciech Macek enum al_eth_sfp_detect_evt {
1847902c8dcSWojciech Macek 	/* No change (no connect, disconnect, or new SFP module */
1857902c8dcSWojciech Macek 	AL_ETH_SFP_DETECT_EVT_NO_CHANGE,
1867902c8dcSWojciech Macek 	/* SFP module connected */
1877902c8dcSWojciech Macek 	AL_ETH_SFP_DETECT_EVT_CONNECTED,
1887902c8dcSWojciech Macek 	/* SFP module disconnected */
1897902c8dcSWojciech Macek 	AL_ETH_SFP_DETECT_EVT_DISCONNECTED,
1907902c8dcSWojciech Macek 	/* SFP module replaced */
1917902c8dcSWojciech Macek 	AL_ETH_SFP_DETECT_EVT_CHANGED,
1927902c8dcSWojciech Macek };
1937902c8dcSWojciech Macek 
1947902c8dcSWojciech Macek /* SFP detection status */
1957902c8dcSWojciech Macek struct al_eth_sfp_detect_stat {
1967902c8dcSWojciech Macek 	/* Status is valid (i.e. rest of fields are valid) */
197*463edaf4SJohn Baldwin 	bool			valid;
198*463edaf4SJohn Baldwin 	bool			connected;
1997902c8dcSWojciech Macek 	uint8_t			sfp_10g;
2007902c8dcSWojciech Macek 	uint8_t			sfp_1g;
2017902c8dcSWojciech Macek 	uint8_t			sfp_cable_tech;
202*463edaf4SJohn Baldwin 	bool			lt_en;
203*463edaf4SJohn Baldwin 	bool			an_en;
2047902c8dcSWojciech Macek 	enum al_eth_mac_mode	mac_mode;
2057902c8dcSWojciech Macek };
2067902c8dcSWojciech Macek 
2077902c8dcSWojciech Macek struct al_eth_retimer_params {
208*463edaf4SJohn Baldwin 	bool				exist;
2097902c8dcSWojciech Macek 	uint8_t				bus_id;
2107902c8dcSWojciech Macek 	uint8_t				i2c_addr;
2117902c8dcSWojciech Macek 	enum al_eth_retimer_channel	channel;
2127902c8dcSWojciech Macek };
2137902c8dcSWojciech Macek 
2147902c8dcSWojciech Macek struct msix_entry {
2157902c8dcSWojciech Macek 	int entry;
2167902c8dcSWojciech Macek 	int vector;
2177902c8dcSWojciech Macek };
2187902c8dcSWojciech Macek 
2197902c8dcSWojciech Macek /* board specific private data structure */
2207902c8dcSWojciech Macek struct al_eth_adapter {
2217902c8dcSWojciech Macek 	enum board_t	board_type;
2227902c8dcSWojciech Macek 	device_t	miibus;
2237902c8dcSWojciech Macek 	struct mii_data *mii;
2247902c8dcSWojciech Macek 	uint16_t dev_id;
2257902c8dcSWojciech Macek 	uint8_t rev_id;
2267902c8dcSWojciech Macek 
2277902c8dcSWojciech Macek 	device_t dev;
2287902c8dcSWojciech Macek 	struct ifnet *netdev;
2297902c8dcSWojciech Macek 	struct ifmedia media;
2307902c8dcSWojciech Macek 	struct resource	*udma_res;
2317902c8dcSWojciech Macek 	struct resource	*mac_res;
2327902c8dcSWojciech Macek 	struct resource	*ec_res;
2337902c8dcSWojciech Macek 	int if_flags;
2347902c8dcSWojciech Macek 	struct callout wd_callout;
2357902c8dcSWojciech Macek 	struct mtx     wd_mtx;
2367902c8dcSWojciech Macek 	struct callout stats_callout;
2377902c8dcSWojciech Macek 	struct mtx     stats_mtx;
2387902c8dcSWojciech Macek 
2397902c8dcSWojciech Macek 	/* this is for intx mode */
2407902c8dcSWojciech Macek 	void *irq_cookie;
2417902c8dcSWojciech Macek 	struct resource *irq_res;
2427902c8dcSWojciech Macek 
2437902c8dcSWojciech Macek 	/*
2447902c8dcSWojciech Macek 	 * Some features need tri-state capability,
2457902c8dcSWojciech Macek 	 * thus the additional *_CAPABLE flags.
2467902c8dcSWojciech Macek 	 */
2477902c8dcSWojciech Macek 	uint32_t flags;
2487902c8dcSWojciech Macek #define	AL_ETH_FLAG_MSIX_CAPABLE		(uint32_t)(1 << 1)
2497902c8dcSWojciech Macek #define	AL_ETH_FLAG_MSIX_ENABLED		(uint32_t)(1 << 2)
2507902c8dcSWojciech Macek #define	AL_ETH_FLAG_IN_NETPOLL			(uint32_t)(1 << 3)
2517902c8dcSWojciech Macek #define	AL_ETH_FLAG_MQ_CAPABLE			(uint32_t)(1 << 4)
2527902c8dcSWojciech Macek #define	AL_ETH_FLAG_SRIOV_CAPABLE		(uint32_t)(1 << 5)
2537902c8dcSWojciech Macek #define	AL_ETH_FLAG_SRIOV_ENABLED		(uint32_t)(1 << 6)
2547902c8dcSWojciech Macek #define	AL_ETH_FLAG_RESET_REQUESTED		(uint32_t)(1 << 7)
2557902c8dcSWojciech Macek 
2567902c8dcSWojciech Macek 	struct al_hal_eth_adapter hal_adapter;
2577902c8dcSWojciech Macek 
2587902c8dcSWojciech Macek 	/*
2597902c8dcSWojciech Macek 	 * Rx packets that shorter that this len will be copied to the mbuf
2607902c8dcSWojciech Macek 	 */
2617902c8dcSWojciech Macek 	unsigned int small_copy_len;
2627902c8dcSWojciech Macek 
2637902c8dcSWojciech Macek 	/* Maximum size for rx buffer */
2647902c8dcSWojciech Macek 	unsigned int max_rx_buff_alloc_size;
2657902c8dcSWojciech Macek 	uint32_t rx_mbuf_sz;
2667902c8dcSWojciech Macek 
2677902c8dcSWojciech Macek 	/* Tx fast path data */
2687902c8dcSWojciech Macek 	int num_tx_queues;
2697902c8dcSWojciech Macek 
2707902c8dcSWojciech Macek 	/* Rx fast path data */
2717902c8dcSWojciech Macek 	int num_rx_queues;
2727902c8dcSWojciech Macek 
2737902c8dcSWojciech Macek 	/* TX */
2747902c8dcSWojciech Macek 	struct al_eth_ring tx_ring[AL_ETH_NUM_QUEUES];
2757902c8dcSWojciech Macek 
2767902c8dcSWojciech Macek 	/* RX */
2777902c8dcSWojciech Macek 	struct al_eth_ring rx_ring[AL_ETH_NUM_QUEUES];
2787902c8dcSWojciech Macek 
2797902c8dcSWojciech Macek 	enum al_iofic_mode int_mode;
2807902c8dcSWojciech Macek 
2817902c8dcSWojciech Macek #define	AL_ETH_MGMT_IRQ_IDX		0
2827902c8dcSWojciech Macek #define	AL_ETH_RXQ_IRQ_IDX(adapter, q)	(1 + (q))
2837902c8dcSWojciech Macek #define	AL_ETH_TXQ_IRQ_IDX(adapter, q)	(1 + (adapter)->num_rx_queues + (q))
2847902c8dcSWojciech Macek 	struct al_eth_irq irq_tbl[AL_ETH_MAX_MSIX_VEC];
2857902c8dcSWojciech Macek 	struct msix_entry *msix_entries;
2867902c8dcSWojciech Macek 	int	msix_vecs;
2877902c8dcSWojciech Macek 	int	irq_vecs;
2887902c8dcSWojciech Macek 
2897902c8dcSWojciech Macek 	unsigned int tx_usecs, rx_usecs; /* interrupt coalescing */
2907902c8dcSWojciech Macek 
2917902c8dcSWojciech Macek 	unsigned int tx_ring_count;
2927902c8dcSWojciech Macek 	unsigned int tx_descs_count;
2937902c8dcSWojciech Macek 	unsigned int rx_ring_count;
2947902c8dcSWojciech Macek 	unsigned int rx_descs_count;
2957902c8dcSWojciech Macek 
2967902c8dcSWojciech Macek 	/* RSS */
2977902c8dcSWojciech Macek 	uint32_t toeplitz_hash_key[AL_ETH_RX_HASH_KEY_NUM];
2987902c8dcSWojciech Macek #define	AL_ETH_RX_RSS_TABLE_SIZE	AL_ETH_RX_THASH_TABLE_SIZE
2997902c8dcSWojciech Macek 	uint8_t	 rss_ind_tbl[AL_ETH_RX_RSS_TABLE_SIZE];
3007902c8dcSWojciech Macek 
3017902c8dcSWojciech Macek 	uint32_t msg_enable;
3027902c8dcSWojciech Macek 	struct al_eth_mac_stats mac_stats;
3037902c8dcSWojciech Macek 
3047902c8dcSWojciech Macek 	enum al_eth_mac_mode	mac_mode;
305*463edaf4SJohn Baldwin 	bool			mac_mode_set; /* Relevant only when 'auto_speed' is set */
3067902c8dcSWojciech Macek 	uint8_t mac_addr[ETHER_ADDR_LEN];
3077902c8dcSWojciech Macek 	/* mdio and phy*/
308*463edaf4SJohn Baldwin 	bool			phy_exist;
3097902c8dcSWojciech Macek 	struct mii_bus		*mdio_bus;
3107902c8dcSWojciech Macek 	struct phy_device	*phydev;
3117902c8dcSWojciech Macek 	uint8_t			phy_addr;
3127902c8dcSWojciech Macek 	struct al_eth_link_config	link_config;
3137902c8dcSWojciech Macek 
3147902c8dcSWojciech Macek 	/* HAL layer data */
3157902c8dcSWojciech Macek 	int			id_number;
3167902c8dcSWojciech Macek 	char			name[AL_ETH_NAME_MAX_LEN];
3177902c8dcSWojciech Macek 	void			*internal_pcie_base; /* use for ALPINE_NIC devices */
3187902c8dcSWojciech Macek 	void			*udma_base;
3197902c8dcSWojciech Macek 	void			*ec_base;
3207902c8dcSWojciech Macek 	void			*mac_base;
3217902c8dcSWojciech Macek 
3227902c8dcSWojciech Macek 	struct al_eth_flow_control_params flow_ctrl_params;
3237902c8dcSWojciech Macek 
3247902c8dcSWojciech Macek 	struct al_eth_adapter_params eth_hal_params;
3257902c8dcSWojciech Macek 
3267902c8dcSWojciech Macek 	struct task			link_status_task;
3277902c8dcSWojciech Macek 	uint32_t			link_poll_interval; /* task interval in mSec */
3287902c8dcSWojciech Macek 
329*463edaf4SJohn Baldwin 	bool				serdes_init;
3307902c8dcSWojciech Macek 	struct al_serdes_grp_obj	serdes_obj;
3317902c8dcSWojciech Macek 	uint8_t				serdes_grp;
3327902c8dcSWojciech Macek 	uint8_t				serdes_lane;
3337902c8dcSWojciech Macek 
334*463edaf4SJohn Baldwin 	bool				an_en;	/* run kr auto-negotiation */
335*463edaf4SJohn Baldwin 	bool				lt_en;	/* run kr link-training */
3367902c8dcSWojciech Macek 
337*463edaf4SJohn Baldwin 	bool				sfp_detection_needed; /* true if need to run sfp detection */
338*463edaf4SJohn Baldwin 	bool				auto_speed; /* true if allowed to change SerDes speed configuration */
3397902c8dcSWojciech Macek 	uint8_t				i2c_adapter_id; /* identifier for the i2c adapter to use to access SFP+ module */
3407902c8dcSWojciech Macek 	enum al_eth_ref_clk_freq	ref_clk_freq; /* reference clock frequency */
3417902c8dcSWojciech Macek 	unsigned int			mdio_freq; /* MDIO frequency [Khz] */
3427902c8dcSWojciech Macek 
343*463edaf4SJohn Baldwin 	bool up;
3447902c8dcSWojciech Macek 
345*463edaf4SJohn Baldwin 	bool				last_link;
346*463edaf4SJohn Baldwin 	bool				last_establish_failed;
3477902c8dcSWojciech Macek 	struct al_eth_lm_context	lm_context;
348*463edaf4SJohn Baldwin 	bool				use_lm;
3497902c8dcSWojciech Macek 
350*463edaf4SJohn Baldwin 	bool				dont_override_serdes; /* avoid overriding serdes parameters
3517902c8dcSWojciech Macek 								   to preset static values */
3527902c8dcSWojciech Macek 	struct mtx			serdes_config_lock;
3537902c8dcSWojciech Macek 	struct mtx			if_rx_lock;
3547902c8dcSWojciech Macek 
3557902c8dcSWojciech Macek 	uint32_t wol;
3567902c8dcSWojciech Macek 
3577902c8dcSWojciech Macek 	struct al_eth_retimer_params	retimer;
3587902c8dcSWojciech Macek 
3597902c8dcSWojciech Macek 	bool				phy_fixup_needed;
3607902c8dcSWojciech Macek 
3617902c8dcSWojciech Macek 	enum al_eth_lm_max_speed	max_speed;
3627902c8dcSWojciech Macek };
3637902c8dcSWojciech Macek 
3647902c8dcSWojciech Macek #endif /* !(AL_ETH_H) */
365