]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixl/if_ixl.c
MFV: xz 5.4.1.
[FreeBSD/FreeBSD.git] / sys / dev / ixl / if_ixl.c
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         if_t 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 (if_getflags(ifp) & 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         if_t 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_getlladdr(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         if_t 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         if_t 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