1 /****************************************************************************** 2 3 Copyright (c) 2013-2018, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 9 1. Redistributions of source code must retain the above copyright notice, 10 this list of conditions and the following disclaimer. 11 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 3. Neither the name of the Intel Corporation nor the names of its 17 contributors may be used to endorse or promote products derived from 18 this software without specific prior written permission. 19 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 POSSIBILITY OF SUCH DAMAGE. 31 32 ******************************************************************************/ 33 /*$FreeBSD$*/ 34 35 #include "ixl.h" 36 #include "ixl_pf.h" 37 38 #ifdef IXL_IW 39 #include "ixl_iw.h" 40 #include "ixl_iw_int.h" 41 #endif 42 43 #ifdef PCI_IOV 44 #include "ixl_pf_iov.h" 45 #endif 46 47 /********************************************************************* 48 * Driver version 49 *********************************************************************/ 50 #define IXL_DRIVER_VERSION_MAJOR 2 51 #define IXL_DRIVER_VERSION_MINOR 3 52 #define IXL_DRIVER_VERSION_BUILD 2 53 54 #define IXL_DRIVER_VERSION_STRING \ 55 __XSTRING(IXL_DRIVER_VERSION_MAJOR) "." \ 56 __XSTRING(IXL_DRIVER_VERSION_MINOR) "." \ 57 __XSTRING(IXL_DRIVER_VERSION_BUILD) "-k" 58 59 /********************************************************************* 60 * PCI Device ID Table 61 * 62 * Used by probe to select devices to load on 63 * 64 * ( Vendor ID, Device ID, Branding String ) 65 *********************************************************************/ 66 67 static pci_vendor_info_t ixl_vendor_info_array[] = 68 { 69 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_SFP_XL710, "Intel(R) Ethernet Controller X710 for 10GbE SFP+"), 70 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_KX_B, "Intel(R) Ethernet Controller XL710 for 40GbE backplane"), 71 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_KX_C, "Intel(R) Ethernet Controller X710 for 10GbE backplane"), 72 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_A, "Intel(R) Ethernet Controller XL710 for 40GbE QSFP+"), 73 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_B, "Intel(R) Ethernet Controller XL710 for 40GbE QSFP+"), 74 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_C, "Intel(R) Ethernet Controller X710 for 10GbE QSFP+"), 75 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T, "Intel(R) Ethernet Controller X710 for 10GBASE-T"), 76 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T4, "Intel(R) Ethernet Controller X710/X557-AT 10GBASE-T"), 77 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_KX_X722, "Intel(R) Ethernet Connection X722 for 10GbE backplane"), 78 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_X722, "Intel(R) Ethernet Connection X722 for 10GbE QSFP+"), 79 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_SFP_X722, "Intel(R) Ethernet Connection X722 for 10GbE SFP+"), 80 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_1G_BASE_T_X722, "Intel(R) Ethernet Connection X722 for 1GbE"), 81 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T_X722, "Intel(R) Ethernet Connection X722 for 10GBASE-T"), 82 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_SFP_I_X722, "Intel(R) Ethernet Connection X722 for 10GbE SFP+"), 83 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_25G_B, "Intel(R) Ethernet Controller XXV710 for 25GbE backplane"), 84 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_25G_SFP28, "Intel(R) Ethernet Controller XXV710 for 25GbE SFP28"), 85 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T_BC, "Intel(R) Ethernet Controller X710 for 10GBASE-T"), 86 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_SFP, "Intel(R) Ethernet Controller X710 for 10GbE SFP+"), 87 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_B, "Intel(R) Ethernet Controller X710 for 10GbE backplane"), 88 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_5G_BASE_T_BC, "Intel(R) Ethernet Controller V710 for 5GBASE-T"), 89 PVIDV(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_1G_BASE_T_BC, "Intel(R) Ethernet Controller I710 for 1GBASE-T"), 90 /* required last entry */ 91 PVID_END 92 }; 93 94 /********************************************************************* 95 * Function prototypes 96 *********************************************************************/ 97 /*** IFLIB interface ***/ 98 static void *ixl_register(device_t dev); 99 static int ixl_if_attach_pre(if_ctx_t ctx); 100 static int ixl_if_attach_post(if_ctx_t ctx); 101 static int ixl_if_detach(if_ctx_t ctx); 102 static int ixl_if_shutdown(if_ctx_t ctx); 103 static int ixl_if_suspend(if_ctx_t ctx); 104 static int ixl_if_resume(if_ctx_t ctx); 105 static int ixl_if_msix_intr_assign(if_ctx_t ctx, int msix); 106 static void ixl_if_enable_intr(if_ctx_t ctx); 107 static void ixl_if_disable_intr(if_ctx_t ctx); 108 static int ixl_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid); 109 static int ixl_if_tx_queue_intr_enable(if_ctx_t ctx, uint16_t txqid); 110 static int ixl_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, int ntxqsets); 111 static int ixl_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nqs, int nqsets); 112 static void ixl_if_queues_free(if_ctx_t ctx); 113 static void ixl_if_update_admin_status(if_ctx_t ctx); 114 static void ixl_if_multi_set(if_ctx_t ctx); 115 static int ixl_if_mtu_set(if_ctx_t ctx, uint32_t mtu); 116 static void ixl_if_media_status(if_ctx_t ctx, struct ifmediareq *ifmr); 117 static int ixl_if_media_change(if_ctx_t ctx); 118 static int ixl_if_promisc_set(if_ctx_t ctx, int flags); 119 static void ixl_if_timer(if_ctx_t ctx, uint16_t qid); 120 static void ixl_if_vlan_register(if_ctx_t ctx, u16 vtag); 121 static void ixl_if_vlan_unregister(if_ctx_t ctx, u16 vtag); 122 static uint64_t ixl_if_get_counter(if_ctx_t ctx, ift_counter cnt); 123 static int ixl_if_i2c_req(if_ctx_t ctx, struct ifi2creq *req); 124 static int ixl_if_priv_ioctl(if_ctx_t ctx, u_long command, caddr_t data); 125 static bool ixl_if_needs_restart(if_ctx_t ctx, enum iflib_restart_event event); 126 #ifdef PCI_IOV 127 static void ixl_if_vflr_handle(if_ctx_t ctx); 128 #endif 129 130 /*** Other ***/ 131 static void ixl_save_pf_tunables(struct ixl_pf *); 132 static int ixl_allocate_pci_resources(struct ixl_pf *); 133 static void ixl_setup_ssctx(struct ixl_pf *pf); 134 static void ixl_admin_timer(void *arg); 135 136 /********************************************************************* 137 * FreeBSD Device Interface Entry Points 138 *********************************************************************/ 139 140 static device_method_t ixl_methods[] = { 141 /* Device interface */ 142 DEVMETHOD(device_register, ixl_register), 143 DEVMETHOD(device_probe, iflib_device_probe), 144 DEVMETHOD(device_attach, iflib_device_attach), 145 DEVMETHOD(device_detach, iflib_device_detach), 146 DEVMETHOD(device_shutdown, iflib_device_shutdown), 147 #ifdef PCI_IOV 148 DEVMETHOD(pci_iov_init, iflib_device_iov_init), 149 DEVMETHOD(pci_iov_uninit, iflib_device_iov_uninit), 150 DEVMETHOD(pci_iov_add_vf, iflib_device_iov_add_vf), 151 #endif 152 DEVMETHOD_END 153 }; 154 155 static driver_t ixl_driver = { 156 "ixl", ixl_methods, sizeof(struct ixl_pf), 157 }; 158 159 DRIVER_MODULE(ixl, pci, ixl_driver, 0, 0); 160 IFLIB_PNP_INFO(pci, ixl, ixl_vendor_info_array); 161 MODULE_VERSION(ixl, 3); 162 163 MODULE_DEPEND(ixl, pci, 1, 1, 1); 164 MODULE_DEPEND(ixl, ether, 1, 1, 1); 165 MODULE_DEPEND(ixl, iflib, 1, 1, 1); 166 167 static device_method_t ixl_if_methods[] = { 168 DEVMETHOD(ifdi_attach_pre, ixl_if_attach_pre), 169 DEVMETHOD(ifdi_attach_post, ixl_if_attach_post), 170 DEVMETHOD(ifdi_detach, ixl_if_detach), 171 DEVMETHOD(ifdi_shutdown, ixl_if_shutdown), 172 DEVMETHOD(ifdi_suspend, ixl_if_suspend), 173 DEVMETHOD(ifdi_resume, ixl_if_resume), 174 DEVMETHOD(ifdi_init, ixl_if_init), 175 DEVMETHOD(ifdi_stop, ixl_if_stop), 176 DEVMETHOD(ifdi_msix_intr_assign, ixl_if_msix_intr_assign), 177 DEVMETHOD(ifdi_intr_enable, ixl_if_enable_intr), 178 DEVMETHOD(ifdi_intr_disable, ixl_if_disable_intr), 179 DEVMETHOD(ifdi_rx_queue_intr_enable, ixl_if_rx_queue_intr_enable), 180 DEVMETHOD(ifdi_tx_queue_intr_enable, ixl_if_tx_queue_intr_enable), 181 DEVMETHOD(ifdi_tx_queues_alloc, ixl_if_tx_queues_alloc), 182 DEVMETHOD(ifdi_rx_queues_alloc, ixl_if_rx_queues_alloc), 183 DEVMETHOD(ifdi_queues_free, ixl_if_queues_free), 184 DEVMETHOD(ifdi_update_admin_status, ixl_if_update_admin_status), 185 DEVMETHOD(ifdi_multi_set, ixl_if_multi_set), 186 DEVMETHOD(ifdi_mtu_set, ixl_if_mtu_set), 187 DEVMETHOD(ifdi_media_status, ixl_if_media_status), 188 DEVMETHOD(ifdi_media_change, ixl_if_media_change), 189 DEVMETHOD(ifdi_promisc_set, ixl_if_promisc_set), 190 DEVMETHOD(ifdi_timer, ixl_if_timer), 191 DEVMETHOD(ifdi_vlan_register, ixl_if_vlan_register), 192 DEVMETHOD(ifdi_vlan_unregister, ixl_if_vlan_unregister), 193 DEVMETHOD(ifdi_get_counter, ixl_if_get_counter), 194 DEVMETHOD(ifdi_i2c_req, ixl_if_i2c_req), 195 DEVMETHOD(ifdi_priv_ioctl, ixl_if_priv_ioctl), 196 DEVMETHOD(ifdi_needs_restart, ixl_if_needs_restart), 197 #ifdef PCI_IOV 198 DEVMETHOD(ifdi_iov_init, ixl_if_iov_init), 199 DEVMETHOD(ifdi_iov_uninit, ixl_if_iov_uninit), 200 DEVMETHOD(ifdi_iov_vf_add, ixl_if_iov_vf_add), 201 DEVMETHOD(ifdi_vflr_handle, ixl_if_vflr_handle), 202 #endif 203 // ifdi_led_func 204 // ifdi_debug 205 DEVMETHOD_END 206 }; 207 208 static driver_t ixl_if_driver = { 209 "ixl_if", ixl_if_methods, sizeof(struct ixl_pf) 210 }; 211 212 /* 213 ** TUNEABLE PARAMETERS: 214 */ 215 216 static SYSCTL_NODE(_hw, OID_AUTO, ixl, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 217 "ixl driver parameters"); 218 219 #ifdef IXL_DEBUG_FC 220 /* 221 * Leave this on unless you need to send flow control 222 * frames (or other control frames) from software 223 */ 224 static int ixl_enable_tx_fc_filter = 1; 225 TUNABLE_INT("hw.ixl.enable_tx_fc_filter", 226 &ixl_enable_tx_fc_filter); 227 SYSCTL_INT(_hw_ixl, OID_AUTO, enable_tx_fc_filter, CTLFLAG_RDTUN, 228 &ixl_enable_tx_fc_filter, 0, 229 "Filter out packets with Ethertype 0x8808 from being sent out by non-HW sources"); 230 #endif 231 232 #ifdef IXL_DEBUG 233 static int ixl_debug_recovery_mode = 0; 234 TUNABLE_INT("hw.ixl.debug_recovery_mode", 235 &ixl_debug_recovery_mode); 236 SYSCTL_INT(_hw_ixl, OID_AUTO, debug_recovery_mode, CTLFLAG_RDTUN, 237 &ixl_debug_recovery_mode, 0, 238 "Act like when FW entered recovery mode (for debugging)"); 239 #endif 240 241 static int ixl_i2c_access_method = 0; 242 TUNABLE_INT("hw.ixl.i2c_access_method", 243 &ixl_i2c_access_method); 244 SYSCTL_INT(_hw_ixl, OID_AUTO, i2c_access_method, CTLFLAG_RDTUN, 245 &ixl_i2c_access_method, 0, 246 IXL_SYSCTL_HELP_I2C_METHOD); 247 248 static int ixl_enable_vf_loopback = 1; 249 TUNABLE_INT("hw.ixl.enable_vf_loopback", 250 &ixl_enable_vf_loopback); 251 SYSCTL_INT(_hw_ixl, OID_AUTO, enable_vf_loopback, CTLFLAG_RDTUN, 252 &ixl_enable_vf_loopback, 0, 253 IXL_SYSCTL_HELP_VF_LOOPBACK); 254 255 /* 256 * Different method for processing TX descriptor 257 * completion. 258 */ 259 static int ixl_enable_head_writeback = 1; 260 TUNABLE_INT("hw.ixl.enable_head_writeback", 261 &ixl_enable_head_writeback); 262 SYSCTL_INT(_hw_ixl, OID_AUTO, enable_head_writeback, CTLFLAG_RDTUN, 263 &ixl_enable_head_writeback, 0, 264 "For detecting last completed TX descriptor by hardware, use value written by HW instead of checking descriptors"); 265 266 static int ixl_core_debug_mask = 0; 267 TUNABLE_INT("hw.ixl.core_debug_mask", 268 &ixl_core_debug_mask); 269 SYSCTL_INT(_hw_ixl, OID_AUTO, core_debug_mask, CTLFLAG_RDTUN, 270 &ixl_core_debug_mask, 0, 271 "Display debug statements that are printed in non-shared code"); 272 273 static int ixl_shared_debug_mask = 0; 274 TUNABLE_INT("hw.ixl.shared_debug_mask", 275 &ixl_shared_debug_mask); 276 SYSCTL_INT(_hw_ixl, OID_AUTO, shared_debug_mask, CTLFLAG_RDTUN, 277 &ixl_shared_debug_mask, 0, 278 "Display debug statements that are printed in shared code"); 279 280 #if 0 281 /* 282 ** Controls for Interrupt Throttling 283 ** - true/false for dynamic adjustment 284 ** - default values for static ITR 285 */ 286 static int ixl_dynamic_rx_itr = 0; 287 TUNABLE_INT("hw.ixl.dynamic_rx_itr", &ixl_dynamic_rx_itr); 288 SYSCTL_INT(_hw_ixl, OID_AUTO, dynamic_rx_itr, CTLFLAG_RDTUN, 289 &ixl_dynamic_rx_itr, 0, "Dynamic RX Interrupt Rate"); 290 291 static int ixl_dynamic_tx_itr = 0; 292 TUNABLE_INT("hw.ixl.dynamic_tx_itr", &ixl_dynamic_tx_itr); 293 SYSCTL_INT(_hw_ixl, OID_AUTO, dynamic_tx_itr, CTLFLAG_RDTUN, 294 &ixl_dynamic_tx_itr, 0, "Dynamic TX Interrupt Rate"); 295 #endif 296 297 static int ixl_rx_itr = IXL_ITR_8K; 298 TUNABLE_INT("hw.ixl.rx_itr", &ixl_rx_itr); 299 SYSCTL_INT(_hw_ixl, OID_AUTO, rx_itr, CTLFLAG_RDTUN, 300 &ixl_rx_itr, 0, "RX Interrupt Rate"); 301 302 static int ixl_tx_itr = IXL_ITR_4K; 303 TUNABLE_INT("hw.ixl.tx_itr", &ixl_tx_itr); 304 SYSCTL_INT(_hw_ixl, OID_AUTO, tx_itr, CTLFLAG_RDTUN, 305 &ixl_tx_itr, 0, "TX Interrupt Rate"); 306 307 static int ixl_flow_control = -1; 308 SYSCTL_INT(_hw_ixl, OID_AUTO, flow_control, CTLFLAG_RDTUN, 309 &ixl_flow_control, 0, "Initial Flow Control setting"); 310 311 #ifdef IXL_IW 312 int ixl_enable_iwarp = 0; 313 TUNABLE_INT("hw.ixl.enable_iwarp", &ixl_enable_iwarp); 314 SYSCTL_INT(_hw_ixl, OID_AUTO, enable_iwarp, CTLFLAG_RDTUN, 315 &ixl_enable_iwarp, 0, "iWARP enabled"); 316 317 #if __FreeBSD_version < 1100000 318 int ixl_limit_iwarp_msix = 1; 319 #else 320 int ixl_limit_iwarp_msix = IXL_IW_MAX_MSIX; 321 #endif 322 TUNABLE_INT("hw.ixl.limit_iwarp_msix", &ixl_limit_iwarp_msix); 323 SYSCTL_INT(_hw_ixl, OID_AUTO, limit_iwarp_msix, CTLFLAG_RDTUN, 324 &ixl_limit_iwarp_msix, 0, "Limit MSI-X vectors assigned to iWARP"); 325 #endif 326 327 extern struct if_txrx ixl_txrx_hwb; 328 extern struct if_txrx ixl_txrx_dwb; 329 330 static struct if_shared_ctx ixl_sctx_init = { 331 .isc_magic = IFLIB_MAGIC, 332 .isc_q_align = PAGE_SIZE, 333 .isc_tx_maxsize = IXL_TSO_SIZE + sizeof(struct ether_vlan_header), 334 .isc_tx_maxsegsize = IXL_MAX_DMA_SEG_SIZE, 335 .isc_tso_maxsize = IXL_TSO_SIZE + sizeof(struct ether_vlan_header), 336 .isc_tso_maxsegsize = IXL_MAX_DMA_SEG_SIZE, 337 .isc_rx_maxsize = 16384, 338 .isc_rx_nsegments = IXL_MAX_RX_SEGS, 339 .isc_rx_maxsegsize = IXL_MAX_DMA_SEG_SIZE, 340 .isc_nfl = 1, 341 .isc_ntxqs = 1, 342 .isc_nrxqs = 1, 343 344 .isc_admin_intrcnt = 1, 345 .isc_vendor_info = ixl_vendor_info_array, 346 .isc_driver_version = IXL_DRIVER_VERSION_STRING, 347 .isc_driver = &ixl_if_driver, 348 .isc_flags = IFLIB_NEED_SCRATCH | IFLIB_NEED_ZERO_CSUM | IFLIB_TSO_INIT_IP | IFLIB_ADMIN_ALWAYS_RUN, 349 350 .isc_nrxd_min = {IXL_MIN_RING}, 351 .isc_ntxd_min = {IXL_MIN_RING}, 352 .isc_nrxd_max = {IXL_MAX_RING}, 353 .isc_ntxd_max = {IXL_MAX_RING}, 354 .isc_nrxd_default = {IXL_DEFAULT_RING}, 355 .isc_ntxd_default = {IXL_DEFAULT_RING}, 356 }; 357 358 /*** Functions ***/ 359 static void * 360 ixl_register(device_t dev) 361 { 362 return (&ixl_sctx_init); 363 } 364 365 static int 366 ixl_allocate_pci_resources(struct ixl_pf *pf) 367 { 368 device_t dev = iflib_get_dev(pf->vsi.ctx); 369 struct i40e_hw *hw = &pf->hw; 370 int rid; 371 372 /* Map BAR0 */ 373 rid = PCIR_BAR(0); 374 pf->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 375 &rid, RF_ACTIVE); 376 377 if (!(pf->pci_mem)) { 378 device_printf(dev, "Unable to allocate bus resource: PCI memory\n"); 379 return (ENXIO); 380 } 381 382 /* Save off the PCI information */ 383 hw->vendor_id = pci_get_vendor(dev); 384 hw->device_id = pci_get_device(dev); 385 hw->revision_id = pci_read_config(dev, PCIR_REVID, 1); 386 hw->subsystem_vendor_id = 387 pci_read_config(dev, PCIR_SUBVEND_0, 2); 388 hw->subsystem_device_id = 389 pci_read_config(dev, PCIR_SUBDEV_0, 2); 390 391 hw->bus.device = pci_get_slot(dev); 392 hw->bus.func = pci_get_function(dev); 393 394 /* Save off register access information */ 395 pf->osdep.mem_bus_space_tag = 396 rman_get_bustag(pf->pci_mem); 397 pf->osdep.mem_bus_space_handle = 398 rman_get_bushandle(pf->pci_mem); 399 pf->osdep.mem_bus_space_size = rman_get_size(pf->pci_mem); 400 pf->osdep.flush_reg = I40E_GLGEN_STAT; 401 pf->osdep.dev = dev; 402 403 pf->hw.hw_addr = (u8 *) &pf->osdep.mem_bus_space_handle; 404 pf->hw.back = &pf->osdep; 405 406 return (0); 407 } 408 409 static void 410 ixl_setup_ssctx(struct ixl_pf *pf) 411 { 412 if_softc_ctx_t scctx = pf->vsi.shared; 413 struct i40e_hw *hw = &pf->hw; 414 415 if (IXL_PF_IN_RECOVERY_MODE(pf)) { 416 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 1; 417 scctx->isc_ntxqsets = scctx->isc_nrxqsets = 1; 418 } else if (hw->mac.type == I40E_MAC_X722) 419 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 128; 420 else 421 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 64; 422 423 if (pf->vsi.enable_head_writeback) { 424 scctx->isc_txqsizes[0] = roundup2(scctx->isc_ntxd[0] 425 * sizeof(struct i40e_tx_desc) + sizeof(u32), DBA_ALIGN); 426 scctx->isc_txrx = &ixl_txrx_hwb; 427 } else { 428 scctx->isc_txqsizes[0] = roundup2(scctx->isc_ntxd[0] 429 * sizeof(struct i40e_tx_desc), DBA_ALIGN); 430 scctx->isc_txrx = &ixl_txrx_dwb; 431 } 432 433 scctx->isc_txrx->ift_legacy_intr = ixl_intr; 434 scctx->isc_rxqsizes[0] = roundup2(scctx->isc_nrxd[0] 435 * sizeof(union i40e_32byte_rx_desc), DBA_ALIGN); 436 scctx->isc_msix_bar = PCIR_BAR(IXL_MSIX_BAR); 437 scctx->isc_tx_nsegments = IXL_MAX_TX_SEGS; 438 scctx->isc_tx_tso_segments_max = IXL_MAX_TSO_SEGS; 439 scctx->isc_tx_tso_size_max = IXL_TSO_SIZE; 440 scctx->isc_tx_tso_segsize_max = IXL_MAX_DMA_SEG_SIZE; 441 scctx->isc_rss_table_size = pf->hw.func_caps.rss_table_size; 442 scctx->isc_tx_csum_flags = CSUM_OFFLOAD; 443 scctx->isc_capabilities = scctx->isc_capenable = IXL_CAPS; 444 } 445 446 static void 447 ixl_admin_timer(void *arg) 448 { 449 struct ixl_pf *pf = (struct ixl_pf *)arg; 450 451 /* Fire off the admin task */ 452 iflib_admin_intr_deferred(pf->vsi.ctx); 453 454 /* Reschedule the admin timer */ 455 callout_schedule(&pf->admin_timer, hz/2); 456 } 457 458 static int 459 ixl_attach_pre_recovery_mode(struct ixl_pf *pf) 460 { 461 struct ixl_vsi *vsi = &pf->vsi; 462 struct i40e_hw *hw = &pf->hw; 463 device_t dev = pf->dev; 464 465 device_printf(dev, "Firmware recovery mode detected. Limiting functionality. Refer to Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n"); 466 467 i40e_get_mac_addr(hw, hw->mac.addr); 468 469 if (vsi->shared->isc_intr == IFLIB_INTR_MSIX) { 470 ixl_configure_intr0_msix(pf); 471 ixl_enable_intr0(hw); 472 } 473 474 ixl_setup_ssctx(pf); 475 476 return (0); 477 } 478 479 static int 480 ixl_if_attach_pre(if_ctx_t ctx) 481 { 482 device_t dev; 483 struct ixl_pf *pf; 484 struct i40e_hw *hw; 485 struct ixl_vsi *vsi; 486 enum i40e_get_fw_lldp_status_resp lldp_status; 487 struct i40e_filter_control_settings filter; 488 enum i40e_status_code status; 489 int error = 0; 490 491 dev = iflib_get_dev(ctx); 492 pf = iflib_get_softc(ctx); 493 494 INIT_DBG_DEV(dev, "begin"); 495 496 vsi = &pf->vsi; 497 vsi->back = pf; 498 pf->dev = dev; 499 hw = &pf->hw; 500 501 vsi->dev = dev; 502 vsi->hw = &pf->hw; 503 vsi->id = 0; 504 vsi->num_vlans = 0; 505 vsi->ctx = ctx; 506 vsi->media = iflib_get_media(ctx); 507 vsi->shared = iflib_get_softc_ctx(ctx); 508 509 snprintf(pf->admin_mtx_name, sizeof(pf->admin_mtx_name), 510 "%s:admin", device_get_nameunit(dev)); 511 mtx_init(&pf->admin_mtx, pf->admin_mtx_name, NULL, MTX_DEF); 512 callout_init_mtx(&pf->admin_timer, &pf->admin_mtx, 0); 513 514 /* Save tunable values */ 515 ixl_save_pf_tunables(pf); 516 517 /* Do PCI setup - map BAR0, etc */ 518 if (ixl_allocate_pci_resources(pf)) { 519 device_printf(dev, "Allocation of PCI resources failed\n"); 520 error = ENXIO; 521 goto err_pci_res; 522 } 523 524 /* Establish a clean starting point */ 525 i40e_clear_hw(hw); 526 i40e_set_mac_type(hw); 527 528 error = ixl_pf_reset(pf); 529 if (error) 530 goto err_out; 531 532 /* Initialize the shared code */ 533 status = i40e_init_shared_code(hw); 534 if (status) { 535 device_printf(dev, "Unable to initialize shared code, error %s\n", 536 i40e_stat_str(hw, status)); 537 error = EIO; 538 goto err_out; 539 } 540 541 /* Set up the admin queue */ 542 hw->aq.num_arq_entries = IXL_AQ_LEN; 543 hw->aq.num_asq_entries = IXL_AQ_LEN; 544 hw->aq.arq_buf_size = IXL_AQ_BUF_SZ; 545 hw->aq.asq_buf_size = IXL_AQ_BUF_SZ; 546 547 status = i40e_init_adminq(hw); 548 if (status != 0 && status != I40E_ERR_FIRMWARE_API_VERSION) { 549 device_printf(dev, "Unable to initialize Admin Queue, error %s\n", 550 i40e_stat_str(hw, status)); 551 error = EIO; 552 goto err_out; 553 } 554 ixl_print_nvm_version(pf); 555 556 if (status == I40E_ERR_FIRMWARE_API_VERSION) { 557 device_printf(dev, "The driver for the device stopped " 558 "because the NVM image is newer than expected.\n"); 559 device_printf(dev, "You must install the most recent version of " 560 "the network driver.\n"); 561 error = EIO; 562 goto err_out; 563 } 564 565 if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR && 566 hw->aq.api_min_ver > I40E_FW_MINOR_VERSION(hw)) { 567 device_printf(dev, "The driver for the device detected " 568 "a newer version of the NVM image than expected.\n"); 569 device_printf(dev, "Please install the most recent version " 570 "of the network driver.\n"); 571 } else if (hw->aq.api_maj_ver == 1 && hw->aq.api_min_ver < 4) { 572 device_printf(dev, "The driver for the device detected " 573 "an older version of the NVM image than expected.\n"); 574 device_printf(dev, "Please update the NVM image.\n"); 575 } 576 577 if (IXL_PF_IN_RECOVERY_MODE(pf)) { 578 error = ixl_attach_pre_recovery_mode(pf); 579 if (error) 580 goto err_out; 581 return (error); 582 } 583 584 /* Clear PXE mode */ 585 i40e_clear_pxe_mode(hw); 586 587 /* Get capabilities from the device */ 588 error = ixl_get_hw_capabilities(pf); 589 if (error) { 590 device_printf(dev, "get_hw_capabilities failed: %d\n", 591 error); 592 goto err_get_cap; 593 } 594 595 /* Set up host memory cache */ 596 error = ixl_setup_hmc(pf); 597 if (error) 598 goto err_mac_hmc; 599 600 /* Disable LLDP from the firmware for certain NVM versions */ 601 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 3)) || 602 (pf->hw.aq.fw_maj_ver < 4)) { 603 i40e_aq_stop_lldp(hw, true, false, NULL); 604 pf->state |= IXL_PF_STATE_FW_LLDP_DISABLED; 605 } 606 607 /* Try enabling Energy Efficient Ethernet (EEE) mode */ 608 if (i40e_enable_eee(hw, true) == I40E_SUCCESS) 609 atomic_set_32(&pf->state, IXL_PF_STATE_EEE_ENABLED); 610 else 611 atomic_clear_32(&pf->state, IXL_PF_STATE_EEE_ENABLED); 612 613 /* Get MAC addresses from hardware */ 614 i40e_get_mac_addr(hw, hw->mac.addr); 615 error = i40e_validate_mac_addr(hw->mac.addr); 616 if (error) { 617 device_printf(dev, "validate_mac_addr failed: %d\n", error); 618 goto err_mac_hmc; 619 } 620 bcopy(hw->mac.addr, hw->mac.perm_addr, ETHER_ADDR_LEN); 621 iflib_set_mac(ctx, hw->mac.addr); 622 i40e_get_port_mac_addr(hw, hw->mac.port_addr); 623 624 /* Set up the device filtering */ 625 bzero(&filter, sizeof(filter)); 626 filter.enable_ethtype = TRUE; 627 filter.enable_macvlan = TRUE; 628 filter.enable_fdir = FALSE; 629 filter.hash_lut_size = I40E_HASH_LUT_SIZE_512; 630 if (i40e_set_filter_control(hw, &filter)) 631 device_printf(dev, "i40e_set_filter_control() failed\n"); 632 633 /* Query device FW LLDP status */ 634 if (i40e_get_fw_lldp_status(hw, &lldp_status) == I40E_SUCCESS) { 635 if (lldp_status == I40E_GET_FW_LLDP_STATUS_DISABLED) { 636 atomic_set_32(&pf->state, 637 IXL_PF_STATE_FW_LLDP_DISABLED); 638 } else { 639 atomic_clear_32(&pf->state, 640 IXL_PF_STATE_FW_LLDP_DISABLED); 641 } 642 } 643 644 /* Tell FW to apply DCB config on link up */ 645 i40e_aq_set_dcb_parameters(hw, true, NULL); 646 647 /* Fill out iflib parameters */ 648 ixl_setup_ssctx(pf); 649 650 INIT_DBG_DEV(dev, "end"); 651 return (0); 652 653 err_mac_hmc: 654 ixl_shutdown_hmc(pf); 655 err_get_cap: 656 i40e_shutdown_adminq(hw); 657 err_out: 658 ixl_free_pci_resources(pf); 659 err_pci_res: 660 mtx_lock(&pf->admin_mtx); 661 callout_stop(&pf->admin_timer); 662 mtx_unlock(&pf->admin_mtx); 663 mtx_destroy(&pf->admin_mtx); 664 return (error); 665 } 666 667 static int 668 ixl_if_attach_post(if_ctx_t ctx) 669 { 670 device_t dev; 671 struct ixl_pf *pf; 672 struct i40e_hw *hw; 673 struct ixl_vsi *vsi; 674 int error = 0; 675 enum i40e_status_code status; 676 677 dev = iflib_get_dev(ctx); 678 pf = iflib_get_softc(ctx); 679 680 INIT_DBG_DEV(dev, "begin"); 681 682 vsi = &pf->vsi; 683 vsi->ifp = iflib_get_ifp(ctx); 684 hw = &pf->hw; 685 686 /* Save off determined number of queues for interface */ 687 vsi->num_rx_queues = vsi->shared->isc_nrxqsets; 688 vsi->num_tx_queues = vsi->shared->isc_ntxqsets; 689 690 /* Setup OS network interface / ifnet */ 691 if (ixl_setup_interface(dev, pf)) { 692 device_printf(dev, "interface setup failed!\n"); 693 error = EIO; 694 goto err; 695 } 696 697 if (IXL_PF_IN_RECOVERY_MODE(pf)) { 698 /* Keep admin queue interrupts active while driver is loaded */ 699 if (vsi->shared->isc_intr == IFLIB_INTR_MSIX) { 700 ixl_configure_intr0_msix(pf); 701 ixl_enable_intr0(hw); 702 } 703 704 ixl_add_sysctls_recovery_mode(pf); 705 706 /* Start the admin timer */ 707 mtx_lock(&pf->admin_mtx); 708 callout_reset(&pf->admin_timer, hz/2, ixl_admin_timer, pf); 709 mtx_unlock(&pf->admin_mtx); 710 return (0); 711 } 712 713 /* Determine link state */ 714 if (ixl_attach_get_link_status(pf)) { 715 error = EINVAL; 716 goto err; 717 } 718 719 error = ixl_switch_config(pf); 720 if (error) { 721 device_printf(dev, "Initial ixl_switch_config() failed: %d\n", 722 error); 723 goto err; 724 } 725 726 /* Add protocol filters to list */ 727 ixl_init_filters(vsi); 728 729 /* Init queue allocation manager */ 730 error = ixl_pf_qmgr_init(&pf->qmgr, hw->func_caps.num_tx_qp); 731 if (error) { 732 device_printf(dev, "Failed to init queue manager for PF queues, error %d\n", 733 error); 734 goto err; 735 } 736 /* reserve a contiguous allocation for the PF's VSI */ 737 error = ixl_pf_qmgr_alloc_contiguous(&pf->qmgr, 738 max(vsi->num_rx_queues, vsi->num_tx_queues), &pf->qtag); 739 if (error) { 740 device_printf(dev, "Failed to reserve queues for PF LAN VSI, error %d\n", 741 error); 742 goto err; 743 } 744 device_printf(dev, "Allocating %d queues for PF LAN VSI; %d queues active\n", 745 pf->qtag.num_allocated, pf->qtag.num_active); 746 747 /* Limit PHY interrupts to link, autoneg, and modules failure */ 748 status = i40e_aq_set_phy_int_mask(hw, IXL_DEFAULT_PHY_INT_MASK, 749 NULL); 750 if (status) { 751 device_printf(dev, "i40e_aq_set_phy_mask() failed: err %s," 752 " aq_err %s\n", i40e_stat_str(hw, status), 753 i40e_aq_str(hw, hw->aq.asq_last_status)); 754 goto err; 755 } 756 757 /* Get the bus configuration and set the shared code */ 758 ixl_get_bus_info(pf); 759 760 /* Keep admin queue interrupts active while driver is loaded */ 761 if (vsi->shared->isc_intr == IFLIB_INTR_MSIX) { 762 ixl_configure_intr0_msix(pf); 763 ixl_enable_intr0(hw); 764 } 765 766 /* Set initial advertised speed sysctl value */ 767 ixl_set_initial_advertised_speeds(pf); 768 769 /* Initialize statistics & add sysctls */ 770 ixl_add_device_sysctls(pf); 771 ixl_pf_reset_stats(pf); 772 ixl_update_stats_counters(pf); 773 ixl_add_hw_stats(pf); 774 775 /* 776 * Driver may have been reloaded. Ensure that the link state 777 * is consistent with current settings. 778 */ 779 ixl_set_link(pf, (pf->state & IXL_PF_STATE_LINK_ACTIVE_ON_DOWN) != 0); 780 781 hw->phy.get_link_info = true; 782 i40e_get_link_status(hw, &pf->link_up); 783 ixl_update_link_status(pf); 784 785 #ifdef PCI_IOV 786 ixl_initialize_sriov(pf); 787 #endif 788 789 #ifdef IXL_IW 790 if (hw->func_caps.iwarp && ixl_enable_iwarp) { 791 pf->iw_enabled = (pf->iw_msix > 0) ? true : false; 792 if (pf->iw_enabled) { 793 error = ixl_iw_pf_attach(pf); 794 if (error) { 795 device_printf(dev, 796 "interfacing to iWARP driver failed: %d\n", 797 error); 798 goto err; 799 } else 800 device_printf(dev, "iWARP ready\n"); 801 } else 802 device_printf(dev, "iWARP disabled on this device " 803 "(no MSI-X vectors)\n"); 804 } else { 805 pf->iw_enabled = false; 806 device_printf(dev, "The device is not iWARP enabled\n"); 807 } 808 #endif 809 /* Start the admin timer */ 810 mtx_lock(&pf->admin_mtx); 811 callout_reset(&pf->admin_timer, hz/2, ixl_admin_timer, pf); 812 mtx_unlock(&pf->admin_mtx); 813 814 INIT_DBG_DEV(dev, "end"); 815 return (0); 816 817 err: 818 INIT_DEBUGOUT("end: error %d", error); 819 /* ixl_if_detach() is called on error from this */ 820 return (error); 821 } 822 823 /** 824 * XXX: iflib always ignores the return value of detach() 825 * -> This means that this isn't allowed to fail 826 */ 827 static int 828 ixl_if_detach(if_ctx_t ctx) 829 { 830 struct ixl_pf *pf = iflib_get_softc(ctx); 831 struct ixl_vsi *vsi = &pf->vsi; 832 struct i40e_hw *hw = &pf->hw; 833 device_t dev = pf->dev; 834 enum i40e_status_code status; 835 #ifdef IXL_IW 836 int error; 837 #endif 838 839 INIT_DBG_DEV(dev, "begin"); 840 841 /* Stop the admin timer */ 842 mtx_lock(&pf->admin_mtx); 843 callout_stop(&pf->admin_timer); 844 mtx_unlock(&pf->admin_mtx); 845 mtx_destroy(&pf->admin_mtx); 846 847 #ifdef IXL_IW 848 if (ixl_enable_iwarp && pf->iw_enabled) { 849 error = ixl_iw_pf_detach(pf); 850 if (error == EBUSY) { 851 device_printf(dev, "iwarp in use; stop it first.\n"); 852 //return (error); 853 } 854 } 855 #endif 856 /* Remove all previously allocated media types */ 857 ifmedia_removeall(vsi->media); 858 859 /* Shutdown LAN HMC */ 860 ixl_shutdown_hmc(pf); 861 862 /* Shutdown admin queue */ 863 ixl_disable_intr0(hw); 864 status = i40e_shutdown_adminq(hw); 865 if (status) 866 device_printf(dev, 867 "i40e_shutdown_adminq() failed with status %s\n", 868 i40e_stat_str(hw, status)); 869 870 ixl_pf_qmgr_destroy(&pf->qmgr); 871 ixl_free_pci_resources(pf); 872 ixl_free_filters(&vsi->ftl); 873 INIT_DBG_DEV(dev, "end"); 874 return (0); 875 } 876 877 static int 878 ixl_if_shutdown(if_ctx_t ctx) 879 { 880 int error = 0; 881 882 INIT_DEBUGOUT("ixl_if_shutdown: begin"); 883 884 /* TODO: Call ixl_if_stop()? */ 885 886 /* TODO: Then setup low power mode */ 887 888 return (error); 889 } 890 891 static int 892 ixl_if_suspend(if_ctx_t ctx) 893 { 894 int error = 0; 895 896 INIT_DEBUGOUT("ixl_if_suspend: begin"); 897 898 /* TODO: Call ixl_if_stop()? */ 899 900 /* TODO: Then setup low power mode */ 901 902 return (error); 903 } 904 905 static int 906 ixl_if_resume(if_ctx_t ctx) 907 { 908 struct ifnet *ifp = iflib_get_ifp(ctx); 909 910 INIT_DEBUGOUT("ixl_if_resume: begin"); 911 912 /* Read & clear wake-up registers */ 913 914 /* Required after D3->D0 transition */ 915 if (ifp->if_flags & IFF_UP) 916 ixl_if_init(ctx); 917 918 return (0); 919 } 920 921 void 922 ixl_if_init(if_ctx_t ctx) 923 { 924 struct ixl_pf *pf = iflib_get_softc(ctx); 925 struct ixl_vsi *vsi = &pf->vsi; 926 struct i40e_hw *hw = &pf->hw; 927 struct ifnet *ifp = iflib_get_ifp(ctx); 928 device_t dev = iflib_get_dev(ctx); 929 u8 tmpaddr[ETHER_ADDR_LEN]; 930 int ret; 931 932 if (IXL_PF_IN_RECOVERY_MODE(pf)) 933 return; 934 /* 935 * If the aq is dead here, it probably means something outside of the driver 936 * did something to the adapter, like a PF reset. 937 * So, rebuild the driver's state here if that occurs. 938 */ 939 if (!i40e_check_asq_alive(&pf->hw)) { 940 device_printf(dev, "Admin Queue is down; resetting...\n"); 941 ixl_teardown_hw_structs(pf); 942 ixl_rebuild_hw_structs_after_reset(pf, false); 943 } 944 945 /* Get the latest mac address... User might use a LAA */ 946 bcopy(IF_LLADDR(vsi->ifp), tmpaddr, ETH_ALEN); 947 if (!ixl_ether_is_equal(hw->mac.addr, tmpaddr) && 948 (i40e_validate_mac_addr(tmpaddr) == I40E_SUCCESS)) { 949 ixl_del_all_vlan_filters(vsi, hw->mac.addr); 950 bcopy(tmpaddr, hw->mac.addr, ETH_ALEN); 951 ret = i40e_aq_mac_address_write(hw, 952 I40E_AQC_WRITE_TYPE_LAA_ONLY, 953 hw->mac.addr, NULL); 954 if (ret) { 955 device_printf(dev, "LLA address change failed!!\n"); 956 return; 957 } 958 /* 959 * New filters are configured by ixl_reconfigure_filters 960 * at the end of ixl_init_locked. 961 */ 962 } 963 964 iflib_set_mac(ctx, hw->mac.addr); 965 966 /* Prepare the VSI: rings, hmc contexts, etc... */ 967 if (ixl_initialize_vsi(vsi)) { 968 device_printf(dev, "initialize vsi failed!!\n"); 969 return; 970 } 971 972 ixl_set_link(pf, true); 973 974 /* Reconfigure multicast filters in HW */ 975 ixl_if_multi_set(ctx); 976 977 /* Set up RSS */ 978 ixl_config_rss(pf); 979 980 /* Set up MSI-X routing and the ITR settings */ 981 if (vsi->shared->isc_intr == IFLIB_INTR_MSIX) { 982 ixl_configure_queue_intr_msix(pf); 983 ixl_configure_itr(pf); 984 } else 985 ixl_configure_legacy(pf); 986 987 if (vsi->enable_head_writeback) 988 ixl_init_tx_cidx(vsi); 989 else 990 ixl_init_tx_rsqs(vsi); 991 992 ixl_enable_rings(vsi); 993 994 i40e_aq_set_default_vsi(hw, vsi->seid, NULL); 995 996 /* Re-add configure filters to HW */ 997 ixl_reconfigure_filters(vsi); 998 999 /* Configure promiscuous mode */ 1000 ixl_if_promisc_set(ctx, if_getflags(ifp)); 1001 1002 #ifdef IXL_IW 1003 if (ixl_enable_iwarp && pf->iw_enabled) { 1004 ret = ixl_iw_pf_init(pf); 1005 if (ret) 1006 device_printf(dev, 1007 "initialize iwarp failed, code %d\n", ret); 1008 } 1009 #endif 1010 } 1011 1012 void 1013 ixl_if_stop(if_ctx_t ctx) 1014 { 1015 struct ixl_pf *pf = iflib_get_softc(ctx); 1016 struct ifnet *ifp = iflib_get_ifp(ctx); 1017 struct ixl_vsi *vsi = &pf->vsi; 1018 1019 INIT_DEBUGOUT("ixl_if_stop: begin\n"); 1020 1021 if (IXL_PF_IN_RECOVERY_MODE(pf)) 1022 return; 1023 1024 // TODO: This may need to be reworked 1025 #ifdef IXL_IW 1026 /* Stop iWARP device */ 1027 if (ixl_enable_iwarp && pf->iw_enabled) 1028 ixl_iw_pf_stop(pf); 1029 #endif 1030 1031 ixl_disable_rings_intr(vsi); 1032 ixl_disable_rings(pf, vsi, &pf->qtag); 1033 1034 /* 1035 * Don't set link state if only reconfiguring 1036 * e.g. on MTU change. 1037 */ 1038 if ((if_getflags(ifp) & IFF_UP) == 0 && 1039 (atomic_load_acq_32(&pf->state) & 1040 IXL_PF_STATE_LINK_ACTIVE_ON_DOWN) == 0) 1041 ixl_set_link(pf, false); 1042 } 1043 1044 static int 1045 ixl_if_msix_intr_assign(if_ctx_t ctx, int msix) 1046 { 1047 struct ixl_pf *pf = iflib_get_softc(ctx); 1048 struct ixl_vsi *vsi = &pf->vsi; 1049 struct ixl_rx_queue *rx_que = vsi->rx_queues; 1050 struct ixl_tx_queue *tx_que = vsi->tx_queues; 1051 int err, i, rid, vector = 0; 1052 char buf[16]; 1053 1054 MPASS(vsi->shared->isc_nrxqsets > 0); 1055 MPASS(vsi->shared->isc_ntxqsets > 0); 1056 1057 /* Admin Que must use vector 0*/ 1058 rid = vector + 1; 1059 err = iflib_irq_alloc_generic(ctx, &vsi->irq, rid, IFLIB_INTR_ADMIN, 1060 ixl_msix_adminq, pf, 0, "aq"); 1061 if (err) { 1062 iflib_irq_free(ctx, &vsi->irq); 1063 device_printf(iflib_get_dev(ctx), 1064 "Failed to register Admin Que handler"); 1065 return (err); 1066 } 1067 1068 #ifdef PCI_IOV 1069 /* Create soft IRQ for handling VFLRs */ 1070 iflib_softirq_alloc_generic(ctx, NULL, IFLIB_INTR_IOV, pf, 0, "iov"); 1071 #endif 1072 1073 /* Now set up the stations */ 1074 for (i = 0, vector = 1; i < vsi->shared->isc_nrxqsets; i++, vector++, rx_que++) { 1075 rid = vector + 1; 1076 1077 snprintf(buf, sizeof(buf), "rxq%d", i); 1078 err = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid, 1079 IFLIB_INTR_RXTX, ixl_msix_que, rx_que, rx_que->rxr.me, buf); 1080 /* XXX: Does the driver work as expected if there are fewer num_rx_queues than 1081 * what's expected in the iflib context? */ 1082 if (err) { 1083 device_printf(iflib_get_dev(ctx), 1084 "Failed to allocate queue RX int vector %d, err: %d\n", i, err); 1085 vsi->num_rx_queues = i + 1; 1086 goto fail; 1087 } 1088 rx_que->msix = vector; 1089 } 1090 1091 bzero(buf, sizeof(buf)); 1092 1093 for (i = 0; i < vsi->shared->isc_ntxqsets; i++, tx_que++) { 1094 snprintf(buf, sizeof(buf), "txq%d", i); 1095 iflib_softirq_alloc_generic(ctx, 1096 &vsi->rx_queues[i % vsi->shared->isc_nrxqsets].que_irq, 1097 IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf); 1098 1099 /* TODO: Maybe call a strategy function for this to figure out which 1100 * interrupts to map Tx queues to. I don't know if there's an immediately 1101 * better way than this other than a user-supplied map, though. */ 1102 tx_que->msix = (i % vsi->shared->isc_nrxqsets) + 1; 1103 } 1104 1105 return (0); 1106 fail: 1107 iflib_irq_free(ctx, &vsi->irq); 1108 rx_que = vsi->rx_queues; 1109 for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++) 1110 iflib_irq_free(ctx, &rx_que->que_irq); 1111 return (err); 1112 } 1113 1114 /* 1115 * Enable all interrupts 1116 * 1117 * Called in: 1118 * iflib_init_locked, after ixl_if_init() 1119 */ 1120 static void 1121 ixl_if_enable_intr(if_ctx_t ctx) 1122 { 1123 struct ixl_pf *pf = iflib_get_softc(ctx); 1124 struct ixl_vsi *vsi = &pf->vsi; 1125 struct i40e_hw *hw = vsi->hw; 1126 struct ixl_rx_queue *que = vsi->rx_queues; 1127 1128 ixl_enable_intr0(hw); 1129 /* Enable queue interrupts */ 1130 for (int i = 0; i < vsi->num_rx_queues; i++, que++) 1131 /* TODO: Queue index parameter is probably wrong */ 1132 ixl_enable_queue(hw, que->rxr.me); 1133 } 1134 1135 /* 1136 * Disable queue interrupts 1137 * 1138 * Other interrupt causes need to remain active. 1139 */ 1140 static void 1141 ixl_if_disable_intr(if_ctx_t ctx) 1142 { 1143 struct ixl_pf *pf = iflib_get_softc(ctx); 1144 struct ixl_vsi *vsi = &pf->vsi; 1145 struct i40e_hw *hw = vsi->hw; 1146 struct ixl_rx_queue *rx_que = vsi->rx_queues; 1147 1148 if (vsi->shared->isc_intr == IFLIB_INTR_MSIX) { 1149 for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++) 1150 ixl_disable_queue(hw, rx_que->msix - 1); 1151 } else { 1152 // Set PFINT_LNKLST0 FIRSTQ_INDX to 0x7FF 1153 // stops queues from triggering interrupts 1154 wr32(hw, I40E_PFINT_LNKLST0, 0x7FF); 1155 } 1156 } 1157 1158 static int 1159 ixl_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid) 1160 { 1161 struct ixl_pf *pf = iflib_get_softc(ctx); 1162 struct ixl_vsi *vsi = &pf->vsi; 1163 struct i40e_hw *hw = vsi->hw; 1164 struct ixl_rx_queue *rx_que = &vsi->rx_queues[rxqid]; 1165 1166 ixl_enable_queue(hw, rx_que->msix - 1); 1167 return (0); 1168 } 1169 1170 static int 1171 ixl_if_tx_queue_intr_enable(if_ctx_t ctx, uint16_t txqid) 1172 { 1173 struct ixl_pf *pf = iflib_get_softc(ctx); 1174 struct ixl_vsi *vsi = &pf->vsi; 1175 struct i40e_hw *hw = vsi->hw; 1176 struct ixl_tx_queue *tx_que = &vsi->tx_queues[txqid]; 1177 1178 ixl_enable_queue(hw, tx_que->msix - 1); 1179 return (0); 1180 } 1181 1182 static int 1183 ixl_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, int ntxqsets) 1184 { 1185 struct ixl_pf *pf = iflib_get_softc(ctx); 1186 struct ixl_vsi *vsi = &pf->vsi; 1187 if_softc_ctx_t scctx = vsi->shared; 1188 struct ixl_tx_queue *que; 1189 int i, j, error = 0; 1190 1191 MPASS(scctx->isc_ntxqsets > 0); 1192 MPASS(ntxqs == 1); 1193 MPASS(scctx->isc_ntxqsets == ntxqsets); 1194 1195 /* Allocate queue structure memory */ 1196 if (!(vsi->tx_queues = 1197 (struct ixl_tx_queue *) malloc(sizeof(struct ixl_tx_queue) *ntxqsets, M_IXL, M_NOWAIT | M_ZERO))) { 1198 device_printf(iflib_get_dev(ctx), "Unable to allocate TX ring memory\n"); 1199 return (ENOMEM); 1200 } 1201 1202 for (i = 0, que = vsi->tx_queues; i < ntxqsets; i++, que++) { 1203 struct tx_ring *txr = &que->txr; 1204 1205 txr->me = i; 1206 que->vsi = vsi; 1207 1208 if (!vsi->enable_head_writeback) { 1209 /* Allocate report status array */ 1210 if (!(txr->tx_rsq = malloc(sizeof(qidx_t) * scctx->isc_ntxd[0], M_IXL, M_NOWAIT))) { 1211 device_printf(iflib_get_dev(ctx), "failed to allocate tx_rsq memory\n"); 1212 error = ENOMEM; 1213 goto fail; 1214 } 1215 /* Init report status array */ 1216 for (j = 0; j < scctx->isc_ntxd[0]; j++) 1217 txr->tx_rsq[j] = QIDX_INVALID; 1218 } 1219 /* get the virtual and physical address of the hardware queues */ 1220 txr->tail = I40E_QTX_TAIL(txr->me); 1221 txr->tx_base = (struct i40e_tx_desc *)vaddrs[i * ntxqs]; 1222 txr->tx_paddr = paddrs[i * ntxqs]; 1223 txr->que = que; 1224 } 1225 1226 return (0); 1227 fail: 1228 ixl_if_queues_free(ctx); 1229 return (error); 1230 } 1231 1232 static int 1233 ixl_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nrxqs, int nrxqsets) 1234 { 1235 struct ixl_pf *pf = iflib_get_softc(ctx); 1236 struct ixl_vsi *vsi = &pf->vsi; 1237 struct ixl_rx_queue *que; 1238 int i, error = 0; 1239 1240 #ifdef INVARIANTS 1241 if_softc_ctx_t scctx = vsi->shared; 1242 MPASS(scctx->isc_nrxqsets > 0); 1243 MPASS(nrxqs == 1); 1244 MPASS(scctx->isc_nrxqsets == nrxqsets); 1245 #endif 1246 1247 /* Allocate queue structure memory */ 1248 if (!(vsi->rx_queues = 1249 (struct ixl_rx_queue *) malloc(sizeof(struct ixl_rx_queue) * 1250 nrxqsets, M_IXL, M_NOWAIT | M_ZERO))) { 1251 device_printf(iflib_get_dev(ctx), "Unable to allocate RX ring memory\n"); 1252 error = ENOMEM; 1253 goto fail; 1254 } 1255 1256 for (i = 0, que = vsi->rx_queues; i < nrxqsets; i++, que++) { 1257 struct rx_ring *rxr = &que->rxr; 1258 1259 rxr->me = i; 1260 que->vsi = vsi; 1261 1262 /* get the virtual and physical address of the hardware queues */ 1263 rxr->tail = I40E_QRX_TAIL(rxr->me); 1264 rxr->rx_base = (union i40e_rx_desc *)vaddrs[i * nrxqs]; 1265 rxr->rx_paddr = paddrs[i * nrxqs]; 1266 rxr->que = que; 1267 } 1268 1269 return (0); 1270 fail: 1271 ixl_if_queues_free(ctx); 1272 return (error); 1273 } 1274 1275 static void 1276 ixl_if_queues_free(if_ctx_t ctx) 1277 { 1278 struct ixl_pf *pf = iflib_get_softc(ctx); 1279 struct ixl_vsi *vsi = &pf->vsi; 1280 1281 if (vsi->tx_queues != NULL && !vsi->enable_head_writeback) { 1282 struct ixl_tx_queue *que; 1283 int i = 0; 1284 1285 for (i = 0, que = vsi->tx_queues; i < vsi->num_tx_queues; i++, que++) { 1286 struct tx_ring *txr = &que->txr; 1287 if (txr->tx_rsq != NULL) { 1288 free(txr->tx_rsq, M_IXL); 1289 txr->tx_rsq = NULL; 1290 } 1291 } 1292 } 1293 1294 if (vsi->tx_queues != NULL) { 1295 free(vsi->tx_queues, M_IXL); 1296 vsi->tx_queues = NULL; 1297 } 1298 if (vsi->rx_queues != NULL) { 1299 free(vsi->rx_queues, M_IXL); 1300 vsi->rx_queues = NULL; 1301 } 1302 1303 if (!IXL_PF_IN_RECOVERY_MODE(pf)) 1304 sysctl_ctx_free(&vsi->sysctl_ctx); 1305 } 1306 1307 void 1308 ixl_update_link_status(struct ixl_pf *pf) 1309 { 1310 struct ixl_vsi *vsi = &pf->vsi; 1311 struct i40e_hw *hw = &pf->hw; 1312 u64 baudrate; 1313 1314 if (pf->link_up) { 1315 if (vsi->link_active == FALSE) { 1316 vsi->link_active = TRUE; 1317 baudrate = ixl_max_aq_speed_to_value(hw->phy.link_info.link_speed); 1318 iflib_link_state_change(vsi->ctx, LINK_STATE_UP, baudrate); 1319 ixl_link_up_msg(pf); 1320 #ifdef PCI_IOV 1321 ixl_broadcast_link_state(pf); 1322 #endif 1323 } 1324 } else { /* Link down */ 1325 if (vsi->link_active == TRUE) { 1326 vsi->link_active = FALSE; 1327 iflib_link_state_change(vsi->ctx, LINK_STATE_DOWN, 0); 1328 #ifdef PCI_IOV 1329 ixl_broadcast_link_state(pf); 1330 #endif 1331 } 1332 } 1333 } 1334 1335 static void 1336 ixl_handle_lan_overflow_event(struct ixl_pf *pf, struct i40e_arq_event_info *e) 1337 { 1338 device_t dev = pf->dev; 1339 u32 rxq_idx, qtx_ctl; 1340 1341 rxq_idx = (e->desc.params.external.param0 & I40E_PRTDCB_RUPTQ_RXQNUM_MASK) >> 1342 I40E_PRTDCB_RUPTQ_RXQNUM_SHIFT; 1343 qtx_ctl = e->desc.params.external.param1; 1344 1345 device_printf(dev, "LAN overflow event: global rxq_idx %d\n", rxq_idx); 1346 device_printf(dev, "LAN overflow event: QTX_CTL 0x%08x\n", qtx_ctl); 1347 } 1348 1349 static int 1350 ixl_process_adminq(struct ixl_pf *pf, u16 *pending) 1351 { 1352 enum i40e_status_code status = I40E_SUCCESS; 1353 struct i40e_arq_event_info event; 1354 struct i40e_hw *hw = &pf->hw; 1355 device_t dev = pf->dev; 1356 u16 opcode; 1357 u32 loop = 0, reg; 1358 1359 event.buf_len = IXL_AQ_BUF_SZ; 1360 event.msg_buf = malloc(event.buf_len, M_IXL, M_NOWAIT | M_ZERO); 1361 if (!event.msg_buf) { 1362 device_printf(dev, "%s: Unable to allocate memory for Admin" 1363 " Queue event!\n", __func__); 1364 return (ENOMEM); 1365 } 1366 1367 /* clean and process any events */ 1368 do { 1369 status = i40e_clean_arq_element(hw, &event, pending); 1370 if (status) 1371 break; 1372 opcode = LE16_TO_CPU(event.desc.opcode); 1373 ixl_dbg(pf, IXL_DBG_AQ, 1374 "Admin Queue event: %#06x\n", opcode); 1375 switch (opcode) { 1376 case i40e_aqc_opc_get_link_status: 1377 ixl_link_event(pf, &event); 1378 break; 1379 case i40e_aqc_opc_send_msg_to_pf: 1380 #ifdef PCI_IOV 1381 ixl_handle_vf_msg(pf, &event); 1382 #endif 1383 break; 1384 /* 1385 * This should only occur on no-drop queues, which 1386 * aren't currently configured. 1387 */ 1388 case i40e_aqc_opc_event_lan_overflow: 1389 ixl_handle_lan_overflow_event(pf, &event); 1390 break; 1391 default: 1392 break; 1393 } 1394 } while (*pending && (loop++ < IXL_ADM_LIMIT)); 1395 1396 free(event.msg_buf, M_IXL); 1397 1398 /* Re-enable admin queue interrupt cause */ 1399 reg = rd32(hw, I40E_PFINT_ICR0_ENA); 1400 reg |= I40E_PFINT_ICR0_ENA_ADMINQ_MASK; 1401 wr32(hw, I40E_PFINT_ICR0_ENA, reg); 1402 1403 return (status); 1404 } 1405 1406 static void 1407 ixl_if_update_admin_status(if_ctx_t ctx) 1408 { 1409 struct ixl_pf *pf = iflib_get_softc(ctx); 1410 struct i40e_hw *hw = &pf->hw; 1411 u16 pending; 1412 1413 if (IXL_PF_IS_RESETTING(pf)) 1414 ixl_handle_empr_reset(pf); 1415 1416 /* 1417 * Admin Queue is shut down while handling reset. 1418 * Don't proceed if it hasn't been re-initialized 1419 * e.g due to an issue with new FW. 1420 */ 1421 if (!i40e_check_asq_alive(&pf->hw)) 1422 return; 1423 1424 if (pf->state & IXL_PF_STATE_MDD_PENDING) 1425 ixl_handle_mdd_event(pf); 1426 1427 ixl_process_adminq(pf, &pending); 1428 ixl_update_link_status(pf); 1429 1430 /* 1431 * If there are still messages to process, reschedule ourselves. 1432 * Otherwise, re-enable our interrupt and go to sleep. 1433 */ 1434 if (pending > 0) 1435 iflib_admin_intr_deferred(ctx); 1436 else 1437 ixl_enable_intr0(hw); 1438 } 1439 1440 static void 1441 ixl_if_multi_set(if_ctx_t ctx) 1442 { 1443 struct ixl_pf *pf = iflib_get_softc(ctx); 1444 struct ixl_vsi *vsi = &pf->vsi; 1445 struct i40e_hw *hw = vsi->hw; 1446 int mcnt; 1447 1448 IOCTL_DEBUGOUT("ixl_if_multi_set: begin"); 1449 1450 /* Delete filters for removed multicast addresses */ 1451 ixl_del_multi(vsi, false); 1452 1453 mcnt = min(if_llmaddr_count(iflib_get_ifp(ctx)), MAX_MULTICAST_ADDR); 1454 if (__predict_false(mcnt == MAX_MULTICAST_ADDR)) { 1455 i40e_aq_set_vsi_multicast_promiscuous(hw, 1456 vsi->seid, TRUE, NULL); 1457 ixl_del_multi(vsi, true); 1458 return; 1459 } 1460 1461 ixl_add_multi(vsi); 1462 IOCTL_DEBUGOUT("ixl_if_multi_set: end"); 1463 } 1464 1465 static int 1466 ixl_if_mtu_set(if_ctx_t ctx, uint32_t mtu) 1467 { 1468 struct ixl_pf *pf = iflib_get_softc(ctx); 1469 struct ixl_vsi *vsi = &pf->vsi; 1470 1471 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)"); 1472 if (mtu > IXL_MAX_FRAME - ETHER_HDR_LEN - ETHER_CRC_LEN - 1473 ETHER_VLAN_ENCAP_LEN) 1474 return (EINVAL); 1475 1476 vsi->shared->isc_max_frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + 1477 ETHER_VLAN_ENCAP_LEN; 1478 1479 return (0); 1480 } 1481 1482 static void 1483 ixl_if_media_status(if_ctx_t ctx, struct ifmediareq *ifmr) 1484 { 1485 struct ixl_pf *pf = iflib_get_softc(ctx); 1486 struct i40e_hw *hw = &pf->hw; 1487 1488 INIT_DEBUGOUT("ixl_media_status: begin"); 1489 1490 ifmr->ifm_status = IFM_AVALID; 1491 ifmr->ifm_active = IFM_ETHER; 1492 1493 if (!pf->link_up) { 1494 return; 1495 } 1496 1497 ifmr->ifm_status |= IFM_ACTIVE; 1498 /* Hardware is always full-duplex */ 1499 ifmr->ifm_active |= IFM_FDX; 1500 1501 switch (hw->phy.link_info.phy_type) { 1502 /* 100 M */ 1503 case I40E_PHY_TYPE_100BASE_TX: 1504 ifmr->ifm_active |= IFM_100_TX; 1505 break; 1506 /* 1 G */ 1507 case I40E_PHY_TYPE_1000BASE_T: 1508 ifmr->ifm_active |= IFM_1000_T; 1509 break; 1510 case I40E_PHY_TYPE_1000BASE_SX: 1511 ifmr->ifm_active |= IFM_1000_SX; 1512 break; 1513 case I40E_PHY_TYPE_1000BASE_LX: 1514 ifmr->ifm_active |= IFM_1000_LX; 1515 break; 1516 case I40E_PHY_TYPE_1000BASE_T_OPTICAL: 1517 ifmr->ifm_active |= IFM_1000_T; 1518 break; 1519 /* 2.5 G */ 1520 case I40E_PHY_TYPE_2_5GBASE_T_LINK_STATUS: 1521 ifmr->ifm_active |= IFM_2500_T; 1522 break; 1523 /* 5 G */ 1524 case I40E_PHY_TYPE_5GBASE_T_LINK_STATUS: 1525 ifmr->ifm_active |= IFM_5000_T; 1526 break; 1527 /* 10 G */ 1528 case I40E_PHY_TYPE_10GBASE_SFPP_CU: 1529 ifmr->ifm_active |= IFM_10G_TWINAX; 1530 break; 1531 case I40E_PHY_TYPE_10GBASE_SR: 1532 ifmr->ifm_active |= IFM_10G_SR; 1533 break; 1534 case I40E_PHY_TYPE_10GBASE_LR: 1535 ifmr->ifm_active |= IFM_10G_LR; 1536 break; 1537 case I40E_PHY_TYPE_10GBASE_T: 1538 ifmr->ifm_active |= IFM_10G_T; 1539 break; 1540 case I40E_PHY_TYPE_XAUI: 1541 case I40E_PHY_TYPE_XFI: 1542 ifmr->ifm_active |= IFM_10G_TWINAX; 1543 break; 1544 case I40E_PHY_TYPE_10GBASE_AOC: 1545 ifmr->ifm_active |= IFM_10G_AOC; 1546 break; 1547 /* 25 G */ 1548 case I40E_PHY_TYPE_25GBASE_KR: 1549 ifmr->ifm_active |= IFM_25G_KR; 1550 break; 1551 case I40E_PHY_TYPE_25GBASE_CR: 1552 ifmr->ifm_active |= IFM_25G_CR; 1553 break; 1554 case I40E_PHY_TYPE_25GBASE_SR: 1555 ifmr->ifm_active |= IFM_25G_SR; 1556 break; 1557 case I40E_PHY_TYPE_25GBASE_LR: 1558 ifmr->ifm_active |= IFM_25G_LR; 1559 break; 1560 case I40E_PHY_TYPE_25GBASE_AOC: 1561 ifmr->ifm_active |= IFM_25G_AOC; 1562 break; 1563 case I40E_PHY_TYPE_25GBASE_ACC: 1564 ifmr->ifm_active |= IFM_25G_ACC; 1565 break; 1566 /* 40 G */ 1567 case I40E_PHY_TYPE_40GBASE_CR4: 1568 case I40E_PHY_TYPE_40GBASE_CR4_CU: 1569 ifmr->ifm_active |= IFM_40G_CR4; 1570 break; 1571 case I40E_PHY_TYPE_40GBASE_SR4: 1572 ifmr->ifm_active |= IFM_40G_SR4; 1573 break; 1574 case I40E_PHY_TYPE_40GBASE_LR4: 1575 ifmr->ifm_active |= IFM_40G_LR4; 1576 break; 1577 case I40E_PHY_TYPE_XLAUI: 1578 ifmr->ifm_active |= IFM_OTHER; 1579 break; 1580 case I40E_PHY_TYPE_1000BASE_KX: 1581 ifmr->ifm_active |= IFM_1000_KX; 1582 break; 1583 case I40E_PHY_TYPE_SGMII: 1584 ifmr->ifm_active |= IFM_1000_SGMII; 1585 break; 1586 /* ERJ: What's the difference between these? */ 1587 case I40E_PHY_TYPE_10GBASE_CR1_CU: 1588 case I40E_PHY_TYPE_10GBASE_CR1: 1589 ifmr->ifm_active |= IFM_10G_CR1; 1590 break; 1591 case I40E_PHY_TYPE_10GBASE_KX4: 1592 ifmr->ifm_active |= IFM_10G_KX4; 1593 break; 1594 case I40E_PHY_TYPE_10GBASE_KR: 1595 ifmr->ifm_active |= IFM_10G_KR; 1596 break; 1597 case I40E_PHY_TYPE_SFI: 1598 ifmr->ifm_active |= IFM_10G_SFI; 1599 break; 1600 /* Our single 20G media type */ 1601 case I40E_PHY_TYPE_20GBASE_KR2: 1602 ifmr->ifm_active |= IFM_20G_KR2; 1603 break; 1604 case I40E_PHY_TYPE_40GBASE_KR4: 1605 ifmr->ifm_active |= IFM_40G_KR4; 1606 break; 1607 case I40E_PHY_TYPE_XLPPI: 1608 case I40E_PHY_TYPE_40GBASE_AOC: 1609 ifmr->ifm_active |= IFM_40G_XLPPI; 1610 break; 1611 /* Unknown to driver */ 1612 default: 1613 ifmr->ifm_active |= IFM_UNKNOWN; 1614 break; 1615 } 1616 /* Report flow control status as well */ 1617 if (hw->phy.link_info.an_info & I40E_AQ_LINK_PAUSE_TX) 1618 ifmr->ifm_active |= IFM_ETH_TXPAUSE; 1619 if (hw->phy.link_info.an_info & I40E_AQ_LINK_PAUSE_RX) 1620 ifmr->ifm_active |= IFM_ETH_RXPAUSE; 1621 } 1622 1623 static int 1624 ixl_if_media_change(if_ctx_t ctx) 1625 { 1626 struct ifmedia *ifm = iflib_get_media(ctx); 1627 1628 INIT_DEBUGOUT("ixl_media_change: begin"); 1629 1630 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) 1631 return (EINVAL); 1632 1633 if_printf(iflib_get_ifp(ctx), "Media change is not supported.\n"); 1634 return (ENODEV); 1635 } 1636 1637 static int 1638 ixl_if_promisc_set(if_ctx_t ctx, int flags) 1639 { 1640 struct ixl_pf *pf = iflib_get_softc(ctx); 1641 struct ixl_vsi *vsi = &pf->vsi; 1642 struct ifnet *ifp = iflib_get_ifp(ctx); 1643 struct i40e_hw *hw = vsi->hw; 1644 int err; 1645 bool uni = FALSE, multi = FALSE; 1646 1647 if (flags & IFF_PROMISC) 1648 uni = multi = TRUE; 1649 else if (flags & IFF_ALLMULTI || if_llmaddr_count(ifp) >= 1650 MAX_MULTICAST_ADDR) 1651 multi = TRUE; 1652 1653 err = i40e_aq_set_vsi_unicast_promiscuous(hw, 1654 vsi->seid, uni, NULL, true); 1655 if (err) 1656 return (err); 1657 err = i40e_aq_set_vsi_multicast_promiscuous(hw, 1658 vsi->seid, multi, NULL); 1659 return (err); 1660 } 1661 1662 static void 1663 ixl_if_timer(if_ctx_t ctx, uint16_t qid) 1664 { 1665 struct ixl_pf *pf = iflib_get_softc(ctx); 1666 1667 if (qid != 0) 1668 return; 1669 1670 ixl_update_stats_counters(pf); 1671 } 1672 1673 static void 1674 ixl_if_vlan_register(if_ctx_t ctx, u16 vtag) 1675 { 1676 struct ixl_pf *pf = iflib_get_softc(ctx); 1677 struct ixl_vsi *vsi = &pf->vsi; 1678 struct i40e_hw *hw = vsi->hw; 1679 if_t ifp = iflib_get_ifp(ctx); 1680 1681 if ((vtag == 0) || (vtag > 4095)) /* Invalid */ 1682 return; 1683 1684 /* 1685 * Keep track of registered VLANS to know what 1686 * filters have to be configured when VLAN_HWFILTER 1687 * capability is enabled. 1688 */ 1689 ++vsi->num_vlans; 1690 bit_set(vsi->vlans_map, vtag); 1691 1692 if ((if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER) == 0) 1693 return; 1694 1695 if (vsi->num_vlans < IXL_MAX_VLAN_FILTERS) 1696 ixl_add_filter(vsi, hw->mac.addr, vtag); 1697 else if (vsi->num_vlans == IXL_MAX_VLAN_FILTERS) { 1698 /* 1699 * There is not enough HW resources to add filters 1700 * for all registered VLANs. Re-configure filtering 1701 * to allow reception of all expected traffic. 1702 */ 1703 device_printf(vsi->dev, 1704 "Not enough HW filters for all VLANs. VLAN HW filtering disabled"); 1705 ixl_del_all_vlan_filters(vsi, hw->mac.addr); 1706 ixl_add_filter(vsi, hw->mac.addr, IXL_VLAN_ANY); 1707 } 1708 } 1709 1710 static void 1711 ixl_if_vlan_unregister(if_ctx_t ctx, u16 vtag) 1712 { 1713 struct ixl_pf *pf = iflib_get_softc(ctx); 1714 struct ixl_vsi *vsi = &pf->vsi; 1715 struct i40e_hw *hw = vsi->hw; 1716 if_t ifp = iflib_get_ifp(ctx); 1717 1718 if ((vtag == 0) || (vtag > 4095)) /* Invalid */ 1719 return; 1720 1721 --vsi->num_vlans; 1722 bit_clear(vsi->vlans_map, vtag); 1723 1724 if ((if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER) == 0) 1725 return; 1726 1727 if (vsi->num_vlans < IXL_MAX_VLAN_FILTERS) 1728 ixl_del_filter(vsi, hw->mac.addr, vtag); 1729 else if (vsi->num_vlans == IXL_MAX_VLAN_FILTERS) { 1730 ixl_del_filter(vsi, hw->mac.addr, IXL_VLAN_ANY); 1731 ixl_add_vlan_filters(vsi, hw->mac.addr); 1732 } 1733 } 1734 1735 static uint64_t 1736 ixl_if_get_counter(if_ctx_t ctx, ift_counter cnt) 1737 { 1738 struct ixl_pf *pf = iflib_get_softc(ctx); 1739 struct ixl_vsi *vsi = &pf->vsi; 1740 if_t ifp = iflib_get_ifp(ctx); 1741 1742 switch (cnt) { 1743 case IFCOUNTER_IPACKETS: 1744 return (vsi->ipackets); 1745 case IFCOUNTER_IERRORS: 1746 return (vsi->ierrors); 1747 case IFCOUNTER_OPACKETS: 1748 return (vsi->opackets); 1749 case IFCOUNTER_OERRORS: 1750 return (vsi->oerrors); 1751 case IFCOUNTER_COLLISIONS: 1752 /* Collisions are by standard impossible in 40G/10G Ethernet */ 1753 return (0); 1754 case IFCOUNTER_IBYTES: 1755 return (vsi->ibytes); 1756 case IFCOUNTER_OBYTES: 1757 return (vsi->obytes); 1758 case IFCOUNTER_IMCASTS: 1759 return (vsi->imcasts); 1760 case IFCOUNTER_OMCASTS: 1761 return (vsi->omcasts); 1762 case IFCOUNTER_IQDROPS: 1763 return (vsi->iqdrops); 1764 case IFCOUNTER_OQDROPS: 1765 return (vsi->oqdrops); 1766 case IFCOUNTER_NOPROTO: 1767 return (vsi->noproto); 1768 default: 1769 return (if_get_counter_default(ifp, cnt)); 1770 } 1771 } 1772 1773 #ifdef PCI_IOV 1774 static void 1775 ixl_if_vflr_handle(if_ctx_t ctx) 1776 { 1777 struct ixl_pf *pf = iflib_get_softc(ctx); 1778 1779 ixl_handle_vflr(pf); 1780 } 1781 #endif 1782 1783 static int 1784 ixl_if_i2c_req(if_ctx_t ctx, struct ifi2creq *req) 1785 { 1786 struct ixl_pf *pf = iflib_get_softc(ctx); 1787 1788 if (pf->read_i2c_byte == NULL) 1789 return (EINVAL); 1790 1791 for (int i = 0; i < req->len; i++) 1792 if (pf->read_i2c_byte(pf, req->offset + i, 1793 req->dev_addr, &req->data[i])) 1794 return (EIO); 1795 return (0); 1796 } 1797 1798 static int 1799 ixl_if_priv_ioctl(if_ctx_t ctx, u_long command, caddr_t data) 1800 { 1801 struct ixl_pf *pf = iflib_get_softc(ctx); 1802 struct ifdrv *ifd = (struct ifdrv *)data; 1803 int error = 0; 1804 1805 /* 1806 * The iflib_if_ioctl forwards SIOCxDRVSPEC and SIOGPRIVATE_0 without 1807 * performing privilege checks. It is important that this function 1808 * perform the necessary checks for commands which should only be 1809 * executed by privileged threads. 1810 */ 1811 1812 switch(command) { 1813 case SIOCGDRVSPEC: 1814 case SIOCSDRVSPEC: 1815 /* NVM update command */ 1816 if (ifd->ifd_cmd == I40E_NVM_ACCESS) { 1817 error = priv_check(curthread, PRIV_DRIVER); 1818 if (error) 1819 break; 1820 error = ixl_handle_nvmupd_cmd(pf, ifd); 1821 } else { 1822 error = EINVAL; 1823 } 1824 break; 1825 default: 1826 error = EOPNOTSUPP; 1827 } 1828 1829 return (error); 1830 } 1831 1832 /* ixl_if_needs_restart - Tell iflib when the driver needs to be reinitialized 1833 * @ctx: iflib context 1834 * @event: event code to check 1835 * 1836 * Defaults to returning false for every event. 1837 * 1838 * @returns true if iflib needs to reinit the interface, false otherwise 1839 */ 1840 static bool 1841 ixl_if_needs_restart(if_ctx_t ctx __unused, enum iflib_restart_event event) 1842 { 1843 switch (event) { 1844 case IFLIB_RESTART_VLAN_CONFIG: 1845 default: 1846 return (false); 1847 } 1848 } 1849 1850 /* 1851 * Sanity check and save off tunable values. 1852 */ 1853 static void 1854 ixl_save_pf_tunables(struct ixl_pf *pf) 1855 { 1856 device_t dev = pf->dev; 1857 1858 /* Save tunable information */ 1859 #ifdef IXL_DEBUG_FC 1860 pf->enable_tx_fc_filter = ixl_enable_tx_fc_filter; 1861 #endif 1862 #ifdef IXL_DEBUG 1863 pf->recovery_mode = ixl_debug_recovery_mode; 1864 #endif 1865 pf->dbg_mask = ixl_core_debug_mask; 1866 pf->hw.debug_mask = ixl_shared_debug_mask; 1867 pf->vsi.enable_head_writeback = !!(ixl_enable_head_writeback); 1868 pf->enable_vf_loopback = !!(ixl_enable_vf_loopback); 1869 #if 0 1870 pf->dynamic_rx_itr = ixl_dynamic_rx_itr; 1871 pf->dynamic_tx_itr = ixl_dynamic_tx_itr; 1872 #endif 1873 1874 if (ixl_i2c_access_method > 3 || ixl_i2c_access_method < 0) 1875 pf->i2c_access_method = 0; 1876 else 1877 pf->i2c_access_method = ixl_i2c_access_method; 1878 1879 if (ixl_tx_itr < 0 || ixl_tx_itr > IXL_MAX_ITR) { 1880 device_printf(dev, "Invalid tx_itr value of %d set!\n", 1881 ixl_tx_itr); 1882 device_printf(dev, "tx_itr must be between %d and %d, " 1883 "inclusive\n", 1884 0, IXL_MAX_ITR); 1885 device_printf(dev, "Using default value of %d instead\n", 1886 IXL_ITR_4K); 1887 pf->tx_itr = IXL_ITR_4K; 1888 } else 1889 pf->tx_itr = ixl_tx_itr; 1890 1891 if (ixl_rx_itr < 0 || ixl_rx_itr > IXL_MAX_ITR) { 1892 device_printf(dev, "Invalid rx_itr value of %d set!\n", 1893 ixl_rx_itr); 1894 device_printf(dev, "rx_itr must be between %d and %d, " 1895 "inclusive\n", 1896 0, IXL_MAX_ITR); 1897 device_printf(dev, "Using default value of %d instead\n", 1898 IXL_ITR_8K); 1899 pf->rx_itr = IXL_ITR_8K; 1900 } else 1901 pf->rx_itr = ixl_rx_itr; 1902 1903 pf->fc = -1; 1904 if (ixl_flow_control != -1) { 1905 if (ixl_flow_control < 0 || ixl_flow_control > 3) { 1906 device_printf(dev, 1907 "Invalid flow_control value of %d set!\n", 1908 ixl_flow_control); 1909 device_printf(dev, 1910 "flow_control must be between %d and %d, " 1911 "inclusive\n", 0, 3); 1912 device_printf(dev, 1913 "Using default configuration instead\n"); 1914 } else 1915 pf->fc = ixl_flow_control; 1916 } 1917 } 1918 1919