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