1 /*- 2 * Copyright (c) 2015,2016 Annapurna Labs Ltd. and affiliates 3 * All rights reserved. 4 * 5 * Developed by Semihalf. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * 28 * $FreeBSD$ 29 */ 30 31 #ifndef __AL_ETH_H__ 32 #define __AL_ETH_H__ 33 34 #include "al_init_eth_lm.h" 35 #include "al_hal_eth.h" 36 #include "al_hal_udma_iofic.h" 37 #include "al_hal_udma_debug.h" 38 #include "al_serdes.h" 39 40 enum board_t { 41 ALPINE_INTEGRATED = 0, 42 ALPINE_NIC = 1, 43 ALPINE_FPGA_NIC = 2, 44 }; 45 46 #define AL_ETH_MAX_HW_QUEUES 4 47 #define AL_ETH_NUM_QUEUES 4 48 #define AL_ETH_MAX_MSIX_VEC (1 + 2 * AL_ETH_MAX_HW_QUEUES) 49 50 #define AL_ETH_DEFAULT_TX_SW_DESCS (512) 51 #define AL_ETH_DEFAULT_TX_HW_DESCS (512) 52 #define AL_ETH_DEFAULT_RX_DESCS (512) 53 54 #if ((AL_ETH_DEFAULT_TX_SW_DESCS / 4) < (AL_ETH_PKT_MAX_BUFS + 2)) 55 #define AL_ETH_TX_WAKEUP_THRESH (AL_ETH_DEFAULT_TX_SW_DESCS / 4) 56 #else 57 #define AL_ETH_TX_WAKEUP_THRESH (AL_ETH_PKT_MAX_BUFS + 2) 58 #endif 59 60 #define NET_IP_ALIGN 2 61 #define AL_ETH_DEFAULT_SMALL_PACKET_LEN (128 - NET_IP_ALIGN) 62 #define AL_ETH_HEADER_COPY_SIZE (128 - NET_IP_ALIGN) 63 64 #define AL_ETH_DEFAULT_MAX_RX_BUFF_ALLOC_SIZE 9216 65 /* 66 * Minimum the buffer size to 600 to avoid situation the mtu will be changed 67 * from too little buffer to very big one and then the number of buffer per 68 * packet could reach the maximum AL_ETH_PKT_MAX_BUFS 69 */ 70 #define AL_ETH_DEFAULT_MIN_RX_BUFF_ALLOC_SIZE 600 71 #define AL_ETH_DEFAULT_FORCE_1000_BASEX FALSE 72 73 #define AL_ETH_DEFAULT_LINK_POLL_INTERVAL 100 74 #define AL_ETH_FIRST_LINK_POLL_INTERVAL 1 75 76 #define AL_ETH_NAME_MAX_LEN 20 77 #define AL_ETH_IRQNAME_SIZE 40 78 79 #define AL_ETH_DEFAULT_MDIO_FREQ_KHZ 2500 80 #define AL_ETH_MDIO_FREQ_1000_KHZ 1000 81 82 struct al_eth_irq { 83 driver_filter_t *handler; 84 void *data; 85 unsigned int vector; 86 uint8_t requested; 87 char name[AL_ETH_IRQNAME_SIZE]; 88 struct resource *res; 89 void *cookie; 90 }; 91 92 struct al_eth_tx_buffer { 93 struct mbuf *m; 94 struct al_eth_pkt hal_pkt; 95 bus_dmamap_t dma_map; 96 unsigned int tx_descs; 97 }; 98 99 struct al_eth_rx_buffer { 100 struct mbuf *m; 101 unsigned int data_size; 102 bus_dmamap_t dma_map; 103 struct al_buf al_buf; 104 }; 105 106 struct al_eth_ring { 107 device_t dev; 108 struct al_eth_adapter *adapter; 109 /* Used to get rx packets from hal */ 110 struct al_eth_pkt hal_pkt; 111 /* Udma queue handler */ 112 struct al_udma_q *dma_q; 113 uint32_t ring_id; 114 uint16_t next_to_use; 115 uint16_t next_to_clean; 116 /* The offset of the interrupt unmask register */ 117 uint32_t *unmask_reg_offset; 118 /* 119 * The value to write to the above register to 120 * unmask the interrupt of this ring 121 */ 122 uint32_t unmask_val; 123 struct al_eth_meta_data hal_meta; 124 /* Contex of tx packet */ 125 struct al_eth_tx_buffer *tx_buffer_info; 126 /* Contex of rx packet */ 127 struct al_eth_rx_buffer *rx_buffer_info; 128 /* Number of tx/rx_buffer_info's entries */ 129 int sw_count; 130 /* Number of hw descriptors */ 131 int hw_count; 132 /* Size (in bytes) of hw descriptors */ 133 size_t descs_size; 134 /* Size (in bytes) of hw completion descriptors, used for rx */ 135 size_t cdescs_size; 136 struct ifnet *netdev; 137 struct al_udma_q_params q_params; 138 struct buf_ring *br; 139 struct mtx br_mtx; 140 struct task enqueue_task; 141 struct taskqueue *enqueue_tq; 142 volatile uint32_t enqueue_is_running; 143 struct task cmpl_task; 144 struct taskqueue *cmpl_tq; 145 volatile uint32_t cmpl_is_running; 146 uint32_t lro_enabled; 147 struct lro_ctrl lro; 148 bus_dma_tag_t dma_buf_tag; 149 volatile uint32_t stall; 150 }; 151 152 #define AL_ETH_TX_RING_IDX_NEXT(tx_ring, idx) (((idx) + 1) & (AL_ETH_DEFAULT_TX_SW_DESCS - 1)) 153 154 #define AL_ETH_RX_RING_IDX_NEXT(rx_ring, idx) (((idx) + 1) & (AL_ETH_DEFAULT_RX_DESCS - 1)) 155 #define AL_ETH_RX_RING_IDX_ADD(rx_ring, idx, n) (((idx) + (n)) & (AL_ETH_DEFAULT_RX_DESCS - 1)) 156 157 /* flow control configuration */ 158 #define AL_ETH_FLOW_CTRL_RX_FIFO_TH_HIGH 0x160 159 #define AL_ETH_FLOW_CTRL_RX_FIFO_TH_LOW 0x90 160 #define AL_ETH_FLOW_CTRL_QUANTA 0xffff 161 #define AL_ETH_FLOW_CTRL_QUANTA_TH 0x8000 162 163 #define AL_ETH_FLOW_CTRL_AUTONEG 1 164 #define AL_ETH_FLOW_CTRL_RX_PAUSE 2 165 #define AL_ETH_FLOW_CTRL_TX_PAUSE 4 166 167 /* link configuration for 1G port */ 168 struct al_eth_link_config { 169 int old_link; 170 /* Describes what we actually have. */ 171 int active_duplex; 172 int active_speed; 173 174 /* current flow control status */ 175 uint8_t flow_ctrl_active; 176 /* supported configuration (can be changed from ethtool) */ 177 uint8_t flow_ctrl_supported; 178 179 /* the following are not relevant to RGMII */ 180 boolean_t force_1000_base_x; 181 boolean_t autoneg; 182 }; 183 184 /* SFP detection event */ 185 enum al_eth_sfp_detect_evt { 186 /* No change (no connect, disconnect, or new SFP module */ 187 AL_ETH_SFP_DETECT_EVT_NO_CHANGE, 188 /* SFP module connected */ 189 AL_ETH_SFP_DETECT_EVT_CONNECTED, 190 /* SFP module disconnected */ 191 AL_ETH_SFP_DETECT_EVT_DISCONNECTED, 192 /* SFP module replaced */ 193 AL_ETH_SFP_DETECT_EVT_CHANGED, 194 }; 195 196 /* SFP detection status */ 197 struct al_eth_sfp_detect_stat { 198 /* Status is valid (i.e. rest of fields are valid) */ 199 boolean_t valid; 200 boolean_t connected; 201 uint8_t sfp_10g; 202 uint8_t sfp_1g; 203 uint8_t sfp_cable_tech; 204 boolean_t lt_en; 205 boolean_t an_en; 206 enum al_eth_mac_mode mac_mode; 207 }; 208 209 struct al_eth_retimer_params { 210 boolean_t exist; 211 uint8_t bus_id; 212 uint8_t i2c_addr; 213 enum al_eth_retimer_channel channel; 214 }; 215 216 struct msix_entry { 217 int entry; 218 int vector; 219 }; 220 221 /* board specific private data structure */ 222 struct al_eth_adapter { 223 enum board_t board_type; 224 device_t miibus; 225 struct mii_data *mii; 226 uint16_t dev_id; 227 uint8_t rev_id; 228 229 device_t dev; 230 struct ifnet *netdev; 231 struct ifmedia media; 232 struct resource *udma_res; 233 struct resource *mac_res; 234 struct resource *ec_res; 235 int if_flags; 236 struct callout wd_callout; 237 struct mtx wd_mtx; 238 struct callout stats_callout; 239 struct mtx stats_mtx; 240 241 /* this is for intx mode */ 242 void *irq_cookie; 243 struct resource *irq_res; 244 245 /* 246 * Some features need tri-state capability, 247 * thus the additional *_CAPABLE flags. 248 */ 249 uint32_t flags; 250 #define AL_ETH_FLAG_MSIX_CAPABLE (uint32_t)(1 << 1) 251 #define AL_ETH_FLAG_MSIX_ENABLED (uint32_t)(1 << 2) 252 #define AL_ETH_FLAG_IN_NETPOLL (uint32_t)(1 << 3) 253 #define AL_ETH_FLAG_MQ_CAPABLE (uint32_t)(1 << 4) 254 #define AL_ETH_FLAG_SRIOV_CAPABLE (uint32_t)(1 << 5) 255 #define AL_ETH_FLAG_SRIOV_ENABLED (uint32_t)(1 << 6) 256 #define AL_ETH_FLAG_RESET_REQUESTED (uint32_t)(1 << 7) 257 258 struct al_hal_eth_adapter hal_adapter; 259 260 /* 261 * Rx packets that shorter that this len will be copied to the mbuf 262 */ 263 unsigned int small_copy_len; 264 265 /* Maximum size for rx buffer */ 266 unsigned int max_rx_buff_alloc_size; 267 uint32_t rx_mbuf_sz; 268 269 /* Tx fast path data */ 270 int num_tx_queues; 271 272 /* Rx fast path data */ 273 int num_rx_queues; 274 275 /* TX */ 276 struct al_eth_ring tx_ring[AL_ETH_NUM_QUEUES]; 277 278 /* RX */ 279 struct al_eth_ring rx_ring[AL_ETH_NUM_QUEUES]; 280 281 enum al_iofic_mode int_mode; 282 283 #define AL_ETH_MGMT_IRQ_IDX 0 284 #define AL_ETH_RXQ_IRQ_IDX(adapter, q) (1 + (q)) 285 #define AL_ETH_TXQ_IRQ_IDX(adapter, q) (1 + (adapter)->num_rx_queues + (q)) 286 struct al_eth_irq irq_tbl[AL_ETH_MAX_MSIX_VEC]; 287 struct msix_entry *msix_entries; 288 int msix_vecs; 289 int irq_vecs; 290 291 unsigned int tx_usecs, rx_usecs; /* interrupt coalescing */ 292 293 unsigned int tx_ring_count; 294 unsigned int tx_descs_count; 295 unsigned int rx_ring_count; 296 unsigned int rx_descs_count; 297 298 /* RSS */ 299 uint32_t toeplitz_hash_key[AL_ETH_RX_HASH_KEY_NUM]; 300 #define AL_ETH_RX_RSS_TABLE_SIZE AL_ETH_RX_THASH_TABLE_SIZE 301 uint8_t rss_ind_tbl[AL_ETH_RX_RSS_TABLE_SIZE]; 302 303 uint32_t msg_enable; 304 struct al_eth_mac_stats mac_stats; 305 306 enum al_eth_mac_mode mac_mode; 307 boolean_t mac_mode_set; /* Relevant only when 'auto_speed' is set */ 308 uint8_t mac_addr[ETHER_ADDR_LEN]; 309 /* mdio and phy*/ 310 boolean_t phy_exist; 311 struct mii_bus *mdio_bus; 312 struct phy_device *phydev; 313 uint8_t phy_addr; 314 struct al_eth_link_config link_config; 315 316 /* HAL layer data */ 317 int id_number; 318 char name[AL_ETH_NAME_MAX_LEN]; 319 void *internal_pcie_base; /* use for ALPINE_NIC devices */ 320 void *udma_base; 321 void *ec_base; 322 void *mac_base; 323 324 struct al_eth_flow_control_params flow_ctrl_params; 325 326 struct al_eth_adapter_params eth_hal_params; 327 328 struct task link_status_task; 329 uint32_t link_poll_interval; /* task interval in mSec */ 330 331 boolean_t serdes_init; 332 struct al_serdes_grp_obj serdes_obj; 333 uint8_t serdes_grp; 334 uint8_t serdes_lane; 335 336 boolean_t an_en; /* run kr auto-negotiation */ 337 boolean_t lt_en; /* run kr link-training */ 338 339 boolean_t sfp_detection_needed; /* true if need to run sfp detection */ 340 boolean_t auto_speed; /* true if allowed to change SerDes speed configuration */ 341 uint8_t i2c_adapter_id; /* identifier for the i2c adapter to use to access SFP+ module */ 342 enum al_eth_ref_clk_freq ref_clk_freq; /* reference clock frequency */ 343 unsigned int mdio_freq; /* MDIO frequency [Khz] */ 344 345 boolean_t up; 346 347 boolean_t last_link; 348 boolean_t last_establish_failed; 349 struct al_eth_lm_context lm_context; 350 boolean_t use_lm; 351 352 boolean_t dont_override_serdes; /* avoid overriding serdes parameters 353 to preset static values */ 354 struct mtx serdes_config_lock; 355 struct mtx if_rx_lock; 356 357 uint32_t wol; 358 359 struct al_eth_retimer_params retimer; 360 361 bool phy_fixup_needed; 362 363 enum al_eth_lm_max_speed max_speed; 364 }; 365 366 #endif /* !(AL_ETH_H) */ 367