ixv.c revision 1.57 1 1.1 dyoung /******************************************************************************
2 1.1 dyoung
3 1.21 msaitoh Copyright (c) 2001-2015, Intel Corporation
4 1.1 dyoung All rights reserved.
5 1.1 dyoung
6 1.1 dyoung Redistribution and use in source and binary forms, with or without
7 1.1 dyoung modification, are permitted provided that the following conditions are met:
8 1.1 dyoung
9 1.1 dyoung 1. Redistributions of source code must retain the above copyright notice,
10 1.1 dyoung this list of conditions and the following disclaimer.
11 1.1 dyoung
12 1.1 dyoung 2. Redistributions in binary form must reproduce the above copyright
13 1.1 dyoung notice, this list of conditions and the following disclaimer in the
14 1.1 dyoung documentation and/or other materials provided with the distribution.
15 1.1 dyoung
16 1.1 dyoung 3. Neither the name of the Intel Corporation nor the names of its
17 1.1 dyoung contributors may be used to endorse or promote products derived from
18 1.1 dyoung this software without specific prior written permission.
19 1.1 dyoung
20 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 1.1 dyoung AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 1.1 dyoung IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 1.1 dyoung ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 1.1 dyoung LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 1.1 dyoung CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 1.1 dyoung SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 1.1 dyoung INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 1.1 dyoung CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 1.1 dyoung POSSIBILITY OF SUCH DAMAGE.
31 1.1 dyoung
32 1.1 dyoung ******************************************************************************/
33 1.29 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/if_ixv.c 302384 2016-07-07 03:39:18Z sbruno $*/
34 1.57 msaitoh /*$NetBSD: ixv.c,v 1.57 2017/08/30 08:24:57 msaitoh Exp $*/
35 1.1 dyoung
36 1.55 msaitoh #ifdef _KERNEL_OPT
37 1.1 dyoung #include "opt_inet.h"
38 1.4 msaitoh #include "opt_inet6.h"
39 1.55 msaitoh #include "opt_net_mpsafe.h"
40 1.55 msaitoh #endif
41 1.1 dyoung
42 1.21 msaitoh #include "ixgbe.h"
43 1.13 msaitoh #include "vlan.h"
44 1.1 dyoung
45 1.1 dyoung /*********************************************************************
46 1.1 dyoung * Driver version
47 1.1 dyoung *********************************************************************/
48 1.26 msaitoh char ixv_driver_version[] = "1.4.6-k";
49 1.1 dyoung
50 1.1 dyoung /*********************************************************************
51 1.1 dyoung * PCI Device ID Table
52 1.1 dyoung *
53 1.1 dyoung * Used by probe to select devices to load on
54 1.1 dyoung * Last field stores an index into ixv_strings
55 1.1 dyoung * Last entry must be all 0s
56 1.1 dyoung *
57 1.1 dyoung * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
58 1.1 dyoung *********************************************************************/
59 1.1 dyoung
60 1.21 msaitoh static ixgbe_vendor_info_t ixv_vendor_info_array[] =
61 1.1 dyoung {
62 1.1 dyoung {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, 0, 0, 0},
63 1.5 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, 0, 0, 0},
64 1.21 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550_VF, 0, 0, 0},
65 1.21 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_VF, 0, 0, 0},
66 1.1 dyoung /* required last entry */
67 1.1 dyoung {0, 0, 0, 0, 0}
68 1.1 dyoung };
69 1.1 dyoung
70 1.1 dyoung /*********************************************************************
71 1.1 dyoung * Table of branding strings
72 1.1 dyoung *********************************************************************/
73 1.1 dyoung
74 1.3 msaitoh static const char *ixv_strings[] = {
75 1.1 dyoung "Intel(R) PRO/10GbE Virtual Function Network Driver"
76 1.1 dyoung };
77 1.1 dyoung
78 1.1 dyoung /*********************************************************************
79 1.1 dyoung * Function prototypes
80 1.1 dyoung *********************************************************************/
81 1.3 msaitoh static int ixv_probe(device_t, cfdata_t, void *);
82 1.22 msaitoh static void ixv_attach(device_t, device_t, void *);
83 1.3 msaitoh static int ixv_detach(device_t, int);
84 1.3 msaitoh #if 0
85 1.1 dyoung static int ixv_shutdown(device_t);
86 1.3 msaitoh #endif
87 1.57 msaitoh static int ixv_ifflags_cb(struct ethercom *);
88 1.3 msaitoh static int ixv_ioctl(struct ifnet *, u_long, void *);
89 1.3 msaitoh static int ixv_init(struct ifnet *);
90 1.1 dyoung static void ixv_init_locked(struct adapter *);
91 1.56 msaitoh static void ixv_ifstop(struct ifnet *, int);
92 1.1 dyoung static void ixv_stop(void *);
93 1.1 dyoung static void ixv_media_status(struct ifnet *, struct ifmediareq *);
94 1.1 dyoung static int ixv_media_change(struct ifnet *);
95 1.1 dyoung static void ixv_identify_hardware(struct adapter *);
96 1.3 msaitoh static int ixv_allocate_pci_resources(struct adapter *,
97 1.3 msaitoh const struct pci_attach_args *);
98 1.11 msaitoh static int ixv_allocate_msix(struct adapter *,
99 1.11 msaitoh const struct pci_attach_args *);
100 1.1 dyoung static int ixv_setup_msix(struct adapter *);
101 1.1 dyoung static void ixv_free_pci_resources(struct adapter *);
102 1.1 dyoung static void ixv_local_timer(void *);
103 1.22 msaitoh static void ixv_local_timer_locked(void *);
104 1.1 dyoung static void ixv_setup_interface(device_t, struct adapter *);
105 1.1 dyoung static void ixv_config_link(struct adapter *);
106 1.1 dyoung
107 1.1 dyoung static void ixv_initialize_transmit_units(struct adapter *);
108 1.1 dyoung static void ixv_initialize_receive_units(struct adapter *);
109 1.1 dyoung
110 1.1 dyoung static void ixv_enable_intr(struct adapter *);
111 1.1 dyoung static void ixv_disable_intr(struct adapter *);
112 1.1 dyoung static void ixv_set_multi(struct adapter *);
113 1.1 dyoung static void ixv_update_link_status(struct adapter *);
114 1.3 msaitoh static int ixv_sysctl_debug(SYSCTLFN_PROTO);
115 1.1 dyoung static void ixv_set_ivar(struct adapter *, u8, u8, s8);
116 1.1 dyoung static void ixv_configure_ivars(struct adapter *);
117 1.1 dyoung static u8 * ixv_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
118 1.1 dyoung
119 1.1 dyoung static void ixv_setup_vlan_support(struct adapter *);
120 1.3 msaitoh #if 0
121 1.1 dyoung static void ixv_register_vlan(void *, struct ifnet *, u16);
122 1.1 dyoung static void ixv_unregister_vlan(void *, struct ifnet *, u16);
123 1.3 msaitoh #endif
124 1.1 dyoung
125 1.48 msaitoh static void ixv_add_device_sysctls(struct adapter *);
126 1.1 dyoung static void ixv_save_stats(struct adapter *);
127 1.1 dyoung static void ixv_init_stats(struct adapter *);
128 1.1 dyoung static void ixv_update_stats(struct adapter *);
129 1.21 msaitoh static void ixv_add_stats_sysctls(struct adapter *);
130 1.25 msaitoh static void ixv_set_sysctl_value(struct adapter *, const char *,
131 1.25 msaitoh const char *, int *, int);
132 1.1 dyoung
133 1.1 dyoung /* The MSI/X Interrupt handlers */
134 1.11 msaitoh static int ixv_msix_que(void *);
135 1.11 msaitoh static int ixv_msix_mbx(void *);
136 1.1 dyoung
137 1.1 dyoung /* Deferred interrupt tasklets */
138 1.3 msaitoh static void ixv_handle_que(void *);
139 1.3 msaitoh static void ixv_handle_mbx(void *);
140 1.3 msaitoh
141 1.3 msaitoh const struct sysctlnode *ixv_sysctl_instance(struct adapter *);
142 1.21 msaitoh static ixgbe_vendor_info_t *ixv_lookup(const struct pci_attach_args *);
143 1.1 dyoung
144 1.25 msaitoh #ifdef DEV_NETMAP
145 1.25 msaitoh /*
146 1.25 msaitoh * This is defined in <dev/netmap/ixgbe_netmap.h>, which is included by
147 1.25 msaitoh * if_ix.c.
148 1.25 msaitoh */
149 1.25 msaitoh extern void ixgbe_netmap_attach(struct adapter *adapter);
150 1.25 msaitoh
151 1.25 msaitoh #include <net/netmap.h>
152 1.25 msaitoh #include <sys/selinfo.h>
153 1.25 msaitoh #include <dev/netmap/netmap_kern.h>
154 1.25 msaitoh #endif /* DEV_NETMAP */
155 1.25 msaitoh
156 1.1 dyoung /*********************************************************************
157 1.1 dyoung * FreeBSD Device Interface Entry Points
158 1.1 dyoung *********************************************************************/
159 1.1 dyoung
160 1.3 msaitoh CFATTACH_DECL3_NEW(ixv, sizeof(struct adapter),
161 1.3 msaitoh ixv_probe, ixv_attach, ixv_detach, NULL, NULL, NULL,
162 1.3 msaitoh DVF_DETACH_SHUTDOWN);
163 1.3 msaitoh
164 1.3 msaitoh # if 0
165 1.1 dyoung static device_method_t ixv_methods[] = {
166 1.1 dyoung /* Device interface */
167 1.1 dyoung DEVMETHOD(device_probe, ixv_probe),
168 1.1 dyoung DEVMETHOD(device_attach, ixv_attach),
169 1.1 dyoung DEVMETHOD(device_detach, ixv_detach),
170 1.1 dyoung DEVMETHOD(device_shutdown, ixv_shutdown),
171 1.8 msaitoh DEVMETHOD_END
172 1.1 dyoung };
173 1.3 msaitoh #endif
174 1.1 dyoung
175 1.1 dyoung #if 0
176 1.1 dyoung static driver_t ixv_driver = {
177 1.21 msaitoh "ixv", ixv_methods, sizeof(struct adapter),
178 1.1 dyoung };
179 1.1 dyoung
180 1.22 msaitoh devclass_t ixv_devclass;
181 1.22 msaitoh DRIVER_MODULE(ixv, pci, ixv_driver, ixv_devclass, 0, 0);
182 1.1 dyoung MODULE_DEPEND(ixv, pci, 1, 1, 1);
183 1.1 dyoung MODULE_DEPEND(ixv, ether, 1, 1, 1);
184 1.25 msaitoh #ifdef DEV_NETMAP
185 1.25 msaitoh MODULE_DEPEND(ix, netmap, 1, 1, 1);
186 1.25 msaitoh #endif /* DEV_NETMAP */
187 1.22 msaitoh /* XXX depend on 'ix' ? */
188 1.1 dyoung #endif
189 1.1 dyoung
190 1.1 dyoung /*
191 1.1 dyoung ** TUNEABLE PARAMETERS:
192 1.1 dyoung */
193 1.1 dyoung
194 1.23 msaitoh /* Number of Queues - do not exceed MSIX vectors - 1 */
195 1.44 msaitoh static int ixv_num_queues = 0;
196 1.23 msaitoh #define TUNABLE_INT(__x, __y)
197 1.23 msaitoh TUNABLE_INT("hw.ixv.num_queues", &ixv_num_queues);
198 1.23 msaitoh
199 1.1 dyoung /*
200 1.1 dyoung ** AIM: Adaptive Interrupt Moderation
201 1.1 dyoung ** which means that the interrupt rate
202 1.1 dyoung ** is varied over time based on the
203 1.1 dyoung ** traffic for that interrupt vector
204 1.1 dyoung */
205 1.50 msaitoh static bool ixv_enable_aim = false;
206 1.1 dyoung TUNABLE_INT("hw.ixv.enable_aim", &ixv_enable_aim);
207 1.1 dyoung
208 1.1 dyoung /* How many packets rxeof tries to clean at a time */
209 1.21 msaitoh static int ixv_rx_process_limit = 256;
210 1.1 dyoung TUNABLE_INT("hw.ixv.rx_process_limit", &ixv_rx_process_limit);
211 1.1 dyoung
212 1.21 msaitoh /* How many packets txeof tries to clean at a time */
213 1.21 msaitoh static int ixv_tx_process_limit = 256;
214 1.21 msaitoh TUNABLE_INT("hw.ixv.tx_process_limit", &ixv_tx_process_limit);
215 1.1 dyoung
216 1.1 dyoung /*
217 1.1 dyoung ** Number of TX descriptors per ring,
218 1.1 dyoung ** setting higher than RX as this seems
219 1.1 dyoung ** the better performing choice.
220 1.1 dyoung */
221 1.1 dyoung static int ixv_txd = DEFAULT_TXD;
222 1.1 dyoung TUNABLE_INT("hw.ixv.txd", &ixv_txd);
223 1.1 dyoung
224 1.1 dyoung /* Number of RX descriptors per ring */
225 1.1 dyoung static int ixv_rxd = DEFAULT_RXD;
226 1.1 dyoung TUNABLE_INT("hw.ixv.rxd", &ixv_rxd);
227 1.1 dyoung
228 1.1 dyoung /*
229 1.1 dyoung ** Shadow VFTA table, this is needed because
230 1.1 dyoung ** the real filter table gets cleared during
231 1.1 dyoung ** a soft reset and we need to repopulate it.
232 1.1 dyoung */
233 1.21 msaitoh static u32 ixv_shadow_vfta[IXGBE_VFTA_SIZE];
234 1.1 dyoung
235 1.55 msaitoh #ifdef NET_MPSAFE
236 1.55 msaitoh #define IXGBE_MPSAFE 1
237 1.55 msaitoh #define IXGBE_CALLOUT_FLAGS CALLOUT_MPSAFE
238 1.55 msaitoh #define IXGBE_SOFTINFT_FLAGS SOFTINT_MPSAFE
239 1.55 msaitoh #else
240 1.55 msaitoh #define IXGBE_CALLOUT_FLAGS 0
241 1.55 msaitoh #define IXGBE_SOFTINFT_FLAGS 0
242 1.55 msaitoh #endif
243 1.55 msaitoh
244 1.1 dyoung /*********************************************************************
245 1.1 dyoung * Device identification routine
246 1.1 dyoung *
247 1.1 dyoung * ixv_probe determines if the driver should be loaded on
248 1.1 dyoung * adapter based on PCI vendor/device id of the adapter.
249 1.1 dyoung *
250 1.4 msaitoh * return 1 on success, 0 on failure
251 1.1 dyoung *********************************************************************/
252 1.1 dyoung
253 1.1 dyoung static int
254 1.3 msaitoh ixv_probe(device_t dev, cfdata_t cf, void *aux)
255 1.3 msaitoh {
256 1.19 knakahar #ifdef __HAVE_PCI_MSI_MSIX
257 1.3 msaitoh const struct pci_attach_args *pa = aux;
258 1.3 msaitoh
259 1.3 msaitoh return (ixv_lookup(pa) != NULL) ? 1 : 0;
260 1.18 msaitoh #else
261 1.18 msaitoh return 0;
262 1.18 msaitoh #endif
263 1.3 msaitoh }
264 1.3 msaitoh
265 1.21 msaitoh static ixgbe_vendor_info_t *
266 1.3 msaitoh ixv_lookup(const struct pci_attach_args *pa)
267 1.1 dyoung {
268 1.3 msaitoh pcireg_t subid;
269 1.21 msaitoh ixgbe_vendor_info_t *ent;
270 1.1 dyoung
271 1.31 msaitoh INIT_DEBUGOUT("ixv_lookup: begin");
272 1.1 dyoung
273 1.3 msaitoh if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
274 1.3 msaitoh return NULL;
275 1.1 dyoung
276 1.3 msaitoh subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
277 1.1 dyoung
278 1.3 msaitoh for (ent = ixv_vendor_info_array; ent->vendor_id != 0; ent++) {
279 1.3 msaitoh if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
280 1.3 msaitoh (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
281 1.3 msaitoh ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
282 1.1 dyoung (ent->subvendor_id == 0)) &&
283 1.3 msaitoh ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
284 1.1 dyoung (ent->subdevice_id == 0))) {
285 1.3 msaitoh return ent;
286 1.1 dyoung }
287 1.1 dyoung }
288 1.3 msaitoh return NULL;
289 1.3 msaitoh }
290 1.3 msaitoh
291 1.3 msaitoh
292 1.1 dyoung /*********************************************************************
293 1.57 msaitoh *
294 1.57 msaitoh * Determine hardware revision.
295 1.57 msaitoh *
296 1.57 msaitoh **********************************************************************/
297 1.57 msaitoh static void
298 1.57 msaitoh ixv_identify_hardware(struct adapter *adapter)
299 1.57 msaitoh {
300 1.57 msaitoh pcitag_t tag;
301 1.57 msaitoh pci_chipset_tag_t pc;
302 1.57 msaitoh pcireg_t subid, id;
303 1.57 msaitoh struct ixgbe_hw *hw = &adapter->hw;
304 1.57 msaitoh
305 1.57 msaitoh pc = adapter->osdep.pc;
306 1.57 msaitoh tag = adapter->osdep.tag;
307 1.57 msaitoh
308 1.57 msaitoh /*
309 1.57 msaitoh ** Make sure BUSMASTER is set, on a VM under
310 1.57 msaitoh ** KVM it may not be and will break things.
311 1.57 msaitoh */
312 1.57 msaitoh ixgbe_pci_enable_busmaster(pc, tag);
313 1.57 msaitoh
314 1.57 msaitoh id = pci_conf_read(pc, tag, PCI_ID_REG);
315 1.57 msaitoh subid = pci_conf_read(pc, tag, PCI_SUBSYS_ID_REG);
316 1.57 msaitoh
317 1.57 msaitoh /* Save off the information about this board */
318 1.57 msaitoh hw->vendor_id = PCI_VENDOR(id);
319 1.57 msaitoh hw->device_id = PCI_PRODUCT(id);
320 1.57 msaitoh hw->revision_id = PCI_REVISION(pci_conf_read(pc, tag, PCI_CLASS_REG));
321 1.57 msaitoh hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
322 1.57 msaitoh hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
323 1.57 msaitoh
324 1.57 msaitoh /* We need this to determine device-specific things */
325 1.57 msaitoh ixgbe_set_mac_type(hw);
326 1.57 msaitoh
327 1.57 msaitoh /* Set the right number of segments */
328 1.57 msaitoh adapter->num_segs = IXGBE_82599_SCATTER;
329 1.57 msaitoh
330 1.57 msaitoh return;
331 1.57 msaitoh }
332 1.57 msaitoh
333 1.57 msaitoh /*********************************************************************
334 1.1 dyoung * Device initialization routine
335 1.1 dyoung *
336 1.1 dyoung * The attach entry point is called when the driver is being loaded.
337 1.1 dyoung * This routine identifies the type of hardware, allocates all resources
338 1.1 dyoung * and initializes the hardware.
339 1.1 dyoung *
340 1.1 dyoung * return 0 on success, positive on failure
341 1.1 dyoung *********************************************************************/
342 1.1 dyoung
343 1.3 msaitoh static void
344 1.3 msaitoh ixv_attach(device_t parent, device_t dev, void *aux)
345 1.1 dyoung {
346 1.1 dyoung struct adapter *adapter;
347 1.1 dyoung struct ixgbe_hw *hw;
348 1.1 dyoung int error = 0;
349 1.21 msaitoh ixgbe_vendor_info_t *ent;
350 1.3 msaitoh const struct pci_attach_args *pa = aux;
351 1.1 dyoung
352 1.1 dyoung INIT_DEBUGOUT("ixv_attach: begin");
353 1.1 dyoung
354 1.1 dyoung /* Allocate, clear, and link in our adapter structure */
355 1.3 msaitoh adapter = device_private(dev);
356 1.26 msaitoh adapter->dev = dev;
357 1.1 dyoung hw = &adapter->hw;
358 1.26 msaitoh
359 1.26 msaitoh #ifdef DEV_NETMAP
360 1.26 msaitoh adapter->init_locked = ixv_init_locked;
361 1.26 msaitoh adapter->stop_locked = ixv_stop;
362 1.26 msaitoh #endif
363 1.26 msaitoh
364 1.13 msaitoh adapter->osdep.pc = pa->pa_pc;
365 1.13 msaitoh adapter->osdep.tag = pa->pa_tag;
366 1.43 msaitoh if (pci_dma64_available(pa))
367 1.43 msaitoh adapter->osdep.dmat = pa->pa_dmat64;
368 1.43 msaitoh else
369 1.43 msaitoh adapter->osdep.dmat = pa->pa_dmat;
370 1.13 msaitoh adapter->osdep.attached = false;
371 1.1 dyoung
372 1.3 msaitoh ent = ixv_lookup(pa);
373 1.3 msaitoh
374 1.3 msaitoh KASSERT(ent != NULL);
375 1.3 msaitoh
376 1.3 msaitoh aprint_normal(": %s, Version - %s\n",
377 1.3 msaitoh ixv_strings[ent->index], ixv_driver_version);
378 1.3 msaitoh
379 1.1 dyoung /* Core Lock Init*/
380 1.21 msaitoh IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
381 1.1 dyoung
382 1.1 dyoung /* Set up the timer callout */
383 1.55 msaitoh callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
384 1.1 dyoung
385 1.1 dyoung /* Determine hardware revision */
386 1.1 dyoung ixv_identify_hardware(adapter);
387 1.1 dyoung
388 1.1 dyoung /* Do base PCI setup - map BAR0 */
389 1.3 msaitoh if (ixv_allocate_pci_resources(adapter, pa)) {
390 1.26 msaitoh aprint_error_dev(dev, "ixv_allocate_pci_resources() failed!\n");
391 1.1 dyoung error = ENXIO;
392 1.1 dyoung goto err_out;
393 1.1 dyoung }
394 1.1 dyoung
395 1.25 msaitoh /* Sysctls for limiting the amount of work done in the taskqueues */
396 1.25 msaitoh ixv_set_sysctl_value(adapter, "rx_processing_limit",
397 1.25 msaitoh "max number of rx packets to process",
398 1.25 msaitoh &adapter->rx_process_limit, ixv_rx_process_limit);
399 1.25 msaitoh
400 1.25 msaitoh ixv_set_sysctl_value(adapter, "tx_processing_limit",
401 1.25 msaitoh "max number of tx packets to process",
402 1.25 msaitoh &adapter->tx_process_limit, ixv_tx_process_limit);
403 1.25 msaitoh
404 1.1 dyoung /* Do descriptor calc and sanity checks */
405 1.1 dyoung if (((ixv_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
406 1.1 dyoung ixv_txd < MIN_TXD || ixv_txd > MAX_TXD) {
407 1.3 msaitoh aprint_error_dev(dev, "TXD config issue, using default!\n");
408 1.1 dyoung adapter->num_tx_desc = DEFAULT_TXD;
409 1.1 dyoung } else
410 1.1 dyoung adapter->num_tx_desc = ixv_txd;
411 1.1 dyoung
412 1.1 dyoung if (((ixv_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
413 1.10 msaitoh ixv_rxd < MIN_RXD || ixv_rxd > MAX_RXD) {
414 1.3 msaitoh aprint_error_dev(dev, "RXD config issue, using default!\n");
415 1.1 dyoung adapter->num_rx_desc = DEFAULT_RXD;
416 1.1 dyoung } else
417 1.1 dyoung adapter->num_rx_desc = ixv_rxd;
418 1.1 dyoung
419 1.1 dyoung /* Allocate our TX/RX Queues */
420 1.21 msaitoh if (ixgbe_allocate_queues(adapter)) {
421 1.26 msaitoh aprint_error_dev(dev, "ixgbe_allocate_queues() failed!\n");
422 1.1 dyoung error = ENOMEM;
423 1.1 dyoung goto err_out;
424 1.1 dyoung }
425 1.1 dyoung
426 1.1 dyoung /*
427 1.1 dyoung ** Initialize the shared code: its
428 1.1 dyoung ** at this point the mac type is set.
429 1.1 dyoung */
430 1.1 dyoung error = ixgbe_init_shared_code(hw);
431 1.1 dyoung if (error) {
432 1.26 msaitoh aprint_error_dev(dev, "ixgbe_init_shared_code() failed!\n");
433 1.1 dyoung error = EIO;
434 1.1 dyoung goto err_late;
435 1.1 dyoung }
436 1.1 dyoung
437 1.1 dyoung /* Setup the mailbox */
438 1.1 dyoung ixgbe_init_mbx_params_vf(hw);
439 1.1 dyoung
440 1.26 msaitoh /* Reset mbox api to 1.0 */
441 1.26 msaitoh error = ixgbe_reset_hw(hw);
442 1.26 msaitoh if (error == IXGBE_ERR_RESET_FAILED)
443 1.26 msaitoh aprint_error_dev(dev, "ixgbe_reset_hw() failure: Reset Failed!\n");
444 1.26 msaitoh else if (error)
445 1.26 msaitoh aprint_error_dev(dev, "ixgbe_reset_hw() failed with error %d\n", error);
446 1.26 msaitoh if (error) {
447 1.26 msaitoh error = EIO;
448 1.26 msaitoh goto err_late;
449 1.26 msaitoh }
450 1.1 dyoung
451 1.26 msaitoh /* Negotiate mailbox API version */
452 1.26 msaitoh error = ixgbevf_negotiate_api_version(hw, ixgbe_mbox_api_11);
453 1.36 msaitoh if (error)
454 1.36 msaitoh aprint_debug_dev(dev,
455 1.36 msaitoh "MBX API 1.1 negotiation failed! Error %d\n", error);
456 1.23 msaitoh
457 1.1 dyoung error = ixgbe_init_hw(hw);
458 1.1 dyoung if (error) {
459 1.26 msaitoh aprint_error_dev(dev, "ixgbe_init_hw() failed!\n");
460 1.1 dyoung error = EIO;
461 1.1 dyoung goto err_late;
462 1.1 dyoung }
463 1.1 dyoung
464 1.11 msaitoh error = ixv_allocate_msix(adapter, pa);
465 1.26 msaitoh if (error) {
466 1.26 msaitoh device_printf(dev, "ixv_allocate_msix() failed!\n");
467 1.1 dyoung goto err_late;
468 1.26 msaitoh }
469 1.1 dyoung
470 1.21 msaitoh /* If no mac address was assigned, make a random one */
471 1.21 msaitoh if (!ixv_check_ether_addr(hw->mac.addr)) {
472 1.21 msaitoh u8 addr[ETHER_ADDR_LEN];
473 1.21 msaitoh uint64_t rndval = cprng_fast64();
474 1.21 msaitoh
475 1.21 msaitoh memcpy(addr, &rndval, sizeof(addr));
476 1.21 msaitoh addr[0] &= 0xFE;
477 1.21 msaitoh addr[0] |= 0x02;
478 1.21 msaitoh bcopy(addr, hw->mac.addr, sizeof(addr));
479 1.21 msaitoh }
480 1.21 msaitoh
481 1.50 msaitoh /* hw.ix defaults init */
482 1.50 msaitoh adapter->enable_aim = ixv_enable_aim;
483 1.50 msaitoh
484 1.1 dyoung /* Setup OS specific network interface */
485 1.1 dyoung ixv_setup_interface(dev, adapter);
486 1.1 dyoung
487 1.1 dyoung /* Do the stats setup */
488 1.1 dyoung ixv_save_stats(adapter);
489 1.1 dyoung ixv_init_stats(adapter);
490 1.1 dyoung
491 1.1 dyoung /* Register for VLAN events */
492 1.12 msaitoh #if 0 /* XXX delete after write? */
493 1.1 dyoung adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
494 1.1 dyoung ixv_register_vlan, adapter, EVENTHANDLER_PRI_FIRST);
495 1.1 dyoung adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
496 1.1 dyoung ixv_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
497 1.3 msaitoh #endif
498 1.1 dyoung
499 1.48 msaitoh /* Add sysctls */
500 1.48 msaitoh ixv_add_device_sysctls(adapter);
501 1.48 msaitoh ixv_add_stats_sysctls(adapter);
502 1.48 msaitoh
503 1.25 msaitoh #ifdef DEV_NETMAP
504 1.25 msaitoh ixgbe_netmap_attach(adapter);
505 1.25 msaitoh #endif /* DEV_NETMAP */
506 1.1 dyoung INIT_DEBUGOUT("ixv_attach: end");
507 1.13 msaitoh adapter->osdep.attached = true;
508 1.57 msaitoh
509 1.3 msaitoh return;
510 1.1 dyoung
511 1.1 dyoung err_late:
512 1.21 msaitoh ixgbe_free_transmit_structures(adapter);
513 1.21 msaitoh ixgbe_free_receive_structures(adapter);
514 1.1 dyoung err_out:
515 1.1 dyoung ixv_free_pci_resources(adapter);
516 1.3 msaitoh return;
517 1.1 dyoung
518 1.1 dyoung }
519 1.1 dyoung
520 1.1 dyoung /*********************************************************************
521 1.1 dyoung * Device removal routine
522 1.1 dyoung *
523 1.1 dyoung * The detach entry point is called when the driver is being removed.
524 1.1 dyoung * This routine stops the adapter and deallocates all the resources
525 1.1 dyoung * that were allocated for driver operation.
526 1.1 dyoung *
527 1.1 dyoung * return 0 on success, positive on failure
528 1.1 dyoung *********************************************************************/
529 1.1 dyoung
530 1.1 dyoung static int
531 1.3 msaitoh ixv_detach(device_t dev, int flags)
532 1.1 dyoung {
533 1.3 msaitoh struct adapter *adapter = device_private(dev);
534 1.1 dyoung struct ix_queue *que = adapter->queues;
535 1.41 msaitoh struct tx_ring *txr = adapter->tx_rings;
536 1.49 msaitoh struct rx_ring *rxr = adapter->rx_rings;
537 1.49 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
538 1.1 dyoung
539 1.1 dyoung INIT_DEBUGOUT("ixv_detach: begin");
540 1.13 msaitoh if (adapter->osdep.attached == false)
541 1.13 msaitoh return 0;
542 1.1 dyoung
543 1.56 msaitoh /* Stop the interface. Callouts are stopped in it. */
544 1.56 msaitoh ixv_ifstop(adapter->ifp, 1);
545 1.56 msaitoh
546 1.13 msaitoh #if NVLAN > 0
547 1.1 dyoung /* Make sure VLANS are not using driver */
548 1.3 msaitoh if (!VLAN_ATTACHED(&adapter->osdep.ec))
549 1.3 msaitoh ; /* nothing to do: no VLANs */
550 1.3 msaitoh else if ((flags & (DETACH_SHUTDOWN|DETACH_FORCE)) != 0)
551 1.3 msaitoh vlan_ifdetach(adapter->ifp);
552 1.3 msaitoh else {
553 1.26 msaitoh aprint_error_dev(dev, "VLANs in use, detach first\n");
554 1.3 msaitoh return EBUSY;
555 1.1 dyoung }
556 1.13 msaitoh #endif
557 1.1 dyoung
558 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
559 1.1 dyoung ixv_stop(adapter);
560 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
561 1.1 dyoung
562 1.41 msaitoh for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
563 1.21 msaitoh #ifndef IXGBE_LEGACY_TX
564 1.35 msaitoh softint_disestablish(txr->txr_si);
565 1.21 msaitoh #endif
566 1.3 msaitoh softint_disestablish(que->que_si);
567 1.1 dyoung }
568 1.1 dyoung
569 1.21 msaitoh /* Drain the Mailbox(link) queue */
570 1.21 msaitoh softint_disestablish(adapter->link_si);
571 1.1 dyoung
572 1.1 dyoung /* Unregister VLAN events */
573 1.3 msaitoh #if 0 /* XXX msaitoh delete after write? */
574 1.1 dyoung if (adapter->vlan_attach != NULL)
575 1.1 dyoung EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach);
576 1.1 dyoung if (adapter->vlan_detach != NULL)
577 1.1 dyoung EVENTHANDLER_DEREGISTER(vlan_unconfig, adapter->vlan_detach);
578 1.3 msaitoh #endif
579 1.1 dyoung
580 1.1 dyoung ether_ifdetach(adapter->ifp);
581 1.3 msaitoh callout_halt(&adapter->timer, NULL);
582 1.25 msaitoh #ifdef DEV_NETMAP
583 1.25 msaitoh netmap_detach(adapter->ifp);
584 1.25 msaitoh #endif /* DEV_NETMAP */
585 1.1 dyoung ixv_free_pci_resources(adapter);
586 1.3 msaitoh #if 0 /* XXX the NetBSD port is probably missing something here */
587 1.1 dyoung bus_generic_detach(dev);
588 1.3 msaitoh #endif
589 1.3 msaitoh if_detach(adapter->ifp);
590 1.52 msaitoh if_percpuq_destroy(adapter->ipq);
591 1.1 dyoung
592 1.41 msaitoh sysctl_teardown(&adapter->sysctllog);
593 1.49 msaitoh evcnt_detach(&adapter->handleq);
594 1.49 msaitoh evcnt_detach(&adapter->req);
595 1.49 msaitoh evcnt_detach(&adapter->efbig_tx_dma_setup);
596 1.49 msaitoh evcnt_detach(&adapter->mbuf_defrag_failed);
597 1.49 msaitoh evcnt_detach(&adapter->efbig2_tx_dma_setup);
598 1.49 msaitoh evcnt_detach(&adapter->einval_tx_dma_setup);
599 1.49 msaitoh evcnt_detach(&adapter->other_tx_dma_setup);
600 1.49 msaitoh evcnt_detach(&adapter->eagain_tx_dma_setup);
601 1.49 msaitoh evcnt_detach(&adapter->enomem_tx_dma_setup);
602 1.49 msaitoh evcnt_detach(&adapter->watchdog_events);
603 1.49 msaitoh evcnt_detach(&adapter->tso_err);
604 1.49 msaitoh evcnt_detach(&adapter->link_irq);
605 1.49 msaitoh
606 1.49 msaitoh txr = adapter->tx_rings;
607 1.49 msaitoh for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
608 1.49 msaitoh evcnt_detach(&adapter->queues[i].irqs);
609 1.49 msaitoh evcnt_detach(&txr->no_desc_avail);
610 1.49 msaitoh evcnt_detach(&txr->total_packets);
611 1.49 msaitoh evcnt_detach(&txr->tso_tx);
612 1.49 msaitoh #ifndef IXGBE_LEGACY_TX
613 1.49 msaitoh evcnt_detach(&txr->pcq_drops);
614 1.49 msaitoh #endif
615 1.49 msaitoh
616 1.49 msaitoh evcnt_detach(&rxr->rx_packets);
617 1.49 msaitoh evcnt_detach(&rxr->rx_bytes);
618 1.49 msaitoh evcnt_detach(&rxr->rx_copies);
619 1.49 msaitoh evcnt_detach(&rxr->no_jmbuf);
620 1.49 msaitoh evcnt_detach(&rxr->rx_discarded);
621 1.49 msaitoh }
622 1.49 msaitoh evcnt_detach(&stats->ipcs);
623 1.49 msaitoh evcnt_detach(&stats->l4cs);
624 1.49 msaitoh evcnt_detach(&stats->ipcs_bad);
625 1.49 msaitoh evcnt_detach(&stats->l4cs_bad);
626 1.49 msaitoh
627 1.49 msaitoh /* Packet Reception Stats */
628 1.49 msaitoh evcnt_detach(&stats->vfgorc);
629 1.49 msaitoh evcnt_detach(&stats->vfgprc);
630 1.49 msaitoh evcnt_detach(&stats->vfmprc);
631 1.49 msaitoh
632 1.49 msaitoh /* Packet Transmission Stats */
633 1.49 msaitoh evcnt_detach(&stats->vfgotc);
634 1.49 msaitoh evcnt_detach(&stats->vfgptc);
635 1.41 msaitoh
636 1.21 msaitoh ixgbe_free_transmit_structures(adapter);
637 1.21 msaitoh ixgbe_free_receive_structures(adapter);
638 1.1 dyoung
639 1.21 msaitoh IXGBE_CORE_LOCK_DESTROY(adapter);
640 1.1 dyoung return (0);
641 1.1 dyoung }
642 1.1 dyoung
643 1.1 dyoung /*********************************************************************
644 1.1 dyoung * Init entry point
645 1.1 dyoung *
646 1.1 dyoung * This routine is used in two ways. It is used by the stack as
647 1.1 dyoung * init entry point in network interface structure. It is also used
648 1.1 dyoung * by the driver as a hw/sw initialization routine to get to a
649 1.1 dyoung * consistent state.
650 1.1 dyoung *
651 1.1 dyoung * return 0 on success, positive on failure
652 1.1 dyoung **********************************************************************/
653 1.1 dyoung #define IXGBE_MHADD_MFS_SHIFT 16
654 1.1 dyoung
655 1.1 dyoung static void
656 1.1 dyoung ixv_init_locked(struct adapter *adapter)
657 1.1 dyoung {
658 1.1 dyoung struct ifnet *ifp = adapter->ifp;
659 1.1 dyoung device_t dev = adapter->dev;
660 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
661 1.26 msaitoh int error = 0;
662 1.1 dyoung
663 1.26 msaitoh INIT_DEBUGOUT("ixv_init_locked: begin");
664 1.3 msaitoh KASSERT(mutex_owned(&adapter->core_mtx));
665 1.1 dyoung hw->adapter_stopped = FALSE;
666 1.1 dyoung ixgbe_stop_adapter(hw);
667 1.1 dyoung callout_stop(&adapter->timer);
668 1.1 dyoung
669 1.57 msaitoh /* reprogram the RAR[0] in case user changed it. */
670 1.57 msaitoh ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
671 1.1 dyoung
672 1.1 dyoung /* Get the latest mac address, User can use a LAA */
673 1.3 msaitoh memcpy(hw->mac.addr, CLLADDR(adapter->ifp->if_sadl),
674 1.1 dyoung IXGBE_ETH_LENGTH_OF_ADDRESS);
675 1.1 dyoung ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1);
676 1.1 dyoung hw->addr_ctrl.rar_used_count = 1;
677 1.1 dyoung
678 1.1 dyoung /* Prepare transmit descriptors and buffers */
679 1.21 msaitoh if (ixgbe_setup_transmit_structures(adapter)) {
680 1.26 msaitoh aprint_error_dev(dev, "Could not setup transmit structures\n");
681 1.1 dyoung ixv_stop(adapter);
682 1.1 dyoung return;
683 1.1 dyoung }
684 1.1 dyoung
685 1.26 msaitoh /* Reset VF and renegotiate mailbox API version */
686 1.1 dyoung ixgbe_reset_hw(hw);
687 1.26 msaitoh error = ixgbevf_negotiate_api_version(hw, ixgbe_mbox_api_11);
688 1.26 msaitoh if (error)
689 1.26 msaitoh device_printf(dev, "MBX API 1.1 negotiation failed! Error %d\n", error);
690 1.26 msaitoh
691 1.1 dyoung ixv_initialize_transmit_units(adapter);
692 1.1 dyoung
693 1.1 dyoung /* Setup Multicast table */
694 1.1 dyoung ixv_set_multi(adapter);
695 1.1 dyoung
696 1.1 dyoung /*
697 1.1 dyoung ** Determine the correct mbuf pool
698 1.1 dyoung ** for doing jumbo/headersplit
699 1.1 dyoung */
700 1.1 dyoung if (ifp->if_mtu > ETHERMTU)
701 1.1 dyoung adapter->rx_mbuf_sz = MJUMPAGESIZE;
702 1.1 dyoung else
703 1.1 dyoung adapter->rx_mbuf_sz = MCLBYTES;
704 1.1 dyoung
705 1.1 dyoung /* Prepare receive descriptors and buffers */
706 1.21 msaitoh if (ixgbe_setup_receive_structures(adapter)) {
707 1.26 msaitoh device_printf(dev, "Could not setup receive structures\n");
708 1.1 dyoung ixv_stop(adapter);
709 1.1 dyoung return;
710 1.1 dyoung }
711 1.1 dyoung
712 1.1 dyoung /* Configure RX settings */
713 1.1 dyoung ixv_initialize_receive_units(adapter);
714 1.1 dyoung
715 1.3 msaitoh #if 0 /* XXX isn't it required? -- msaitoh */
716 1.1 dyoung /* Set the various hardware offload abilities */
717 1.1 dyoung ifp->if_hwassist = 0;
718 1.1 dyoung if (ifp->if_capenable & IFCAP_TSO4)
719 1.1 dyoung ifp->if_hwassist |= CSUM_TSO;
720 1.1 dyoung if (ifp->if_capenable & IFCAP_TXCSUM) {
721 1.1 dyoung ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
722 1.1 dyoung #if __FreeBSD_version >= 800000
723 1.1 dyoung ifp->if_hwassist |= CSUM_SCTP;
724 1.1 dyoung #endif
725 1.1 dyoung }
726 1.3 msaitoh #endif
727 1.1 dyoung
728 1.1 dyoung /* Set up VLAN offload and filter */
729 1.1 dyoung ixv_setup_vlan_support(adapter);
730 1.1 dyoung
731 1.1 dyoung /* Set up MSI/X routing */
732 1.1 dyoung ixv_configure_ivars(adapter);
733 1.1 dyoung
734 1.1 dyoung /* Set up auto-mask */
735 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, IXGBE_EICS_RTX_QUEUE);
736 1.1 dyoung
737 1.57 msaitoh /* Set moderation on the Link interrupt */
738 1.57 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VTEITR(adapter->vector), IXGBE_LINK_ITR);
739 1.1 dyoung
740 1.1 dyoung /* Stats init */
741 1.1 dyoung ixv_init_stats(adapter);
742 1.1 dyoung
743 1.1 dyoung /* Config/Enable Link */
744 1.1 dyoung ixv_config_link(adapter);
745 1.37 msaitoh hw->mac.get_link_status = TRUE;
746 1.1 dyoung
747 1.26 msaitoh /* Start watchdog */
748 1.26 msaitoh callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
749 1.26 msaitoh
750 1.1 dyoung /* And now turn on interrupts */
751 1.1 dyoung ixv_enable_intr(adapter);
752 1.1 dyoung
753 1.1 dyoung /* Now inform the stack we're ready */
754 1.3 msaitoh ifp->if_flags |= IFF_RUNNING;
755 1.3 msaitoh ifp->if_flags &= ~IFF_OACTIVE;
756 1.1 dyoung
757 1.1 dyoung return;
758 1.1 dyoung }
759 1.1 dyoung
760 1.1 dyoung /*
761 1.1 dyoung **
762 1.1 dyoung ** MSIX Interrupt Handlers and Tasklets
763 1.1 dyoung **
764 1.1 dyoung */
765 1.1 dyoung
766 1.1 dyoung static inline void
767 1.1 dyoung ixv_enable_queue(struct adapter *adapter, u32 vector)
768 1.1 dyoung {
769 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
770 1.1 dyoung u32 queue = 1 << vector;
771 1.1 dyoung u32 mask;
772 1.1 dyoung
773 1.1 dyoung mask = (IXGBE_EIMS_RTX_QUEUE & queue);
774 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
775 1.1 dyoung }
776 1.1 dyoung
777 1.1 dyoung static inline void
778 1.1 dyoung ixv_disable_queue(struct adapter *adapter, u32 vector)
779 1.1 dyoung {
780 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
781 1.1 dyoung u64 queue = (u64)(1 << vector);
782 1.1 dyoung u32 mask;
783 1.1 dyoung
784 1.1 dyoung mask = (IXGBE_EIMS_RTX_QUEUE & queue);
785 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask);
786 1.1 dyoung }
787 1.1 dyoung
788 1.1 dyoung static inline void
789 1.1 dyoung ixv_rearm_queues(struct adapter *adapter, u64 queues)
790 1.1 dyoung {
791 1.1 dyoung u32 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
792 1.1 dyoung IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEICS, mask);
793 1.1 dyoung }
794 1.1 dyoung
795 1.1 dyoung
796 1.1 dyoung /*********************************************************************
797 1.1 dyoung *
798 1.1 dyoung * MSI Queue Interrupt Service routine
799 1.1 dyoung *
800 1.1 dyoung **********************************************************************/
801 1.11 msaitoh int
802 1.1 dyoung ixv_msix_que(void *arg)
803 1.1 dyoung {
804 1.1 dyoung struct ix_queue *que = arg;
805 1.1 dyoung struct adapter *adapter = que->adapter;
806 1.51 msaitoh #ifdef IXGBE_LEGACY_TX
807 1.21 msaitoh struct ifnet *ifp = adapter->ifp;
808 1.51 msaitoh #endif
809 1.1 dyoung struct tx_ring *txr = que->txr;
810 1.1 dyoung struct rx_ring *rxr = que->rxr;
811 1.21 msaitoh bool more;
812 1.1 dyoung u32 newitr = 0;
813 1.1 dyoung
814 1.1 dyoung ixv_disable_queue(adapter, que->msix);
815 1.21 msaitoh ++que->irqs.ev_count;
816 1.1 dyoung
817 1.34 msaitoh #ifdef __NetBSD__
818 1.34 msaitoh /* Don't run ixgbe_rxeof in interrupt context */
819 1.34 msaitoh more = true;
820 1.34 msaitoh #else
821 1.21 msaitoh more = ixgbe_rxeof(que);
822 1.34 msaitoh #endif
823 1.1 dyoung
824 1.21 msaitoh IXGBE_TX_LOCK(txr);
825 1.21 msaitoh ixgbe_txeof(txr);
826 1.21 msaitoh IXGBE_TX_UNLOCK(txr);
827 1.1 dyoung
828 1.1 dyoung /* Do AIM now? */
829 1.1 dyoung
830 1.50 msaitoh if (adapter->enable_aim == false)
831 1.1 dyoung goto no_calc;
832 1.1 dyoung /*
833 1.1 dyoung ** Do Adaptive Interrupt Moderation:
834 1.1 dyoung ** - Write out last calculated setting
835 1.1 dyoung ** - Calculate based on average size over
836 1.1 dyoung ** the last interval.
837 1.1 dyoung */
838 1.1 dyoung if (que->eitr_setting)
839 1.1 dyoung IXGBE_WRITE_REG(&adapter->hw,
840 1.1 dyoung IXGBE_VTEITR(que->msix),
841 1.1 dyoung que->eitr_setting);
842 1.1 dyoung
843 1.57 msaitoh que->eitr_setting = 0;
844 1.57 msaitoh
845 1.57 msaitoh /* Idle, do nothing */
846 1.57 msaitoh if ((txr->bytes == 0) && (rxr->bytes == 0))
847 1.57 msaitoh goto no_calc;
848 1.1 dyoung
849 1.1 dyoung if ((txr->bytes) && (txr->packets))
850 1.57 msaitoh newitr = txr->bytes/txr->packets;
851 1.1 dyoung if ((rxr->bytes) && (rxr->packets))
852 1.1 dyoung newitr = max(newitr,
853 1.1 dyoung (rxr->bytes / rxr->packets));
854 1.1 dyoung newitr += 24; /* account for hardware frame, crc */
855 1.1 dyoung
856 1.1 dyoung /* set an upper boundary */
857 1.1 dyoung newitr = min(newitr, 3000);
858 1.1 dyoung
859 1.1 dyoung /* Be nice to the mid range */
860 1.1 dyoung if ((newitr > 300) && (newitr < 1200))
861 1.1 dyoung newitr = (newitr / 3);
862 1.1 dyoung else
863 1.1 dyoung newitr = (newitr / 2);
864 1.1 dyoung
865 1.1 dyoung newitr |= newitr << 16;
866 1.1 dyoung
867 1.1 dyoung /* save for next interrupt */
868 1.1 dyoung que->eitr_setting = newitr;
869 1.1 dyoung
870 1.57 msaitoh /* Reset state */
871 1.57 msaitoh txr->bytes = 0;
872 1.57 msaitoh txr->packets = 0;
873 1.57 msaitoh rxr->bytes = 0;
874 1.57 msaitoh rxr->packets = 0;
875 1.1 dyoung
876 1.1 dyoung no_calc:
877 1.21 msaitoh if (more)
878 1.3 msaitoh softint_schedule(que->que_si);
879 1.1 dyoung else /* Reenable this interrupt */
880 1.1 dyoung ixv_enable_queue(adapter, que->msix);
881 1.11 msaitoh return 1;
882 1.1 dyoung }
883 1.1 dyoung
884 1.11 msaitoh static int
885 1.1 dyoung ixv_msix_mbx(void *arg)
886 1.1 dyoung {
887 1.1 dyoung struct adapter *adapter = arg;
888 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
889 1.1 dyoung u32 reg;
890 1.1 dyoung
891 1.22 msaitoh ++adapter->link_irq.ev_count;
892 1.1 dyoung
893 1.1 dyoung /* First get the cause */
894 1.1 dyoung reg = IXGBE_READ_REG(hw, IXGBE_VTEICS);
895 1.1 dyoung /* Clear interrupt with write */
896 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEICR, reg);
897 1.1 dyoung
898 1.1 dyoung /* Link status change */
899 1.1 dyoung if (reg & IXGBE_EICR_LSC)
900 1.21 msaitoh softint_schedule(adapter->link_si);
901 1.1 dyoung
902 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, IXGBE_EIMS_OTHER);
903 1.57 msaitoh
904 1.11 msaitoh return 1;
905 1.1 dyoung }
906 1.1 dyoung
907 1.1 dyoung /*********************************************************************
908 1.1 dyoung *
909 1.1 dyoung * Media Ioctl callback
910 1.1 dyoung *
911 1.1 dyoung * This routine is called whenever the user queries the status of
912 1.1 dyoung * the interface using ifconfig.
913 1.1 dyoung *
914 1.1 dyoung **********************************************************************/
915 1.1 dyoung static void
916 1.1 dyoung ixv_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
917 1.1 dyoung {
918 1.1 dyoung struct adapter *adapter = ifp->if_softc;
919 1.1 dyoung
920 1.1 dyoung INIT_DEBUGOUT("ixv_media_status: begin");
921 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
922 1.1 dyoung ixv_update_link_status(adapter);
923 1.1 dyoung
924 1.1 dyoung ifmr->ifm_status = IFM_AVALID;
925 1.1 dyoung ifmr->ifm_active = IFM_ETHER;
926 1.1 dyoung
927 1.1 dyoung if (!adapter->link_active) {
928 1.39 msaitoh ifmr->ifm_active |= IFM_NONE;
929 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
930 1.1 dyoung return;
931 1.1 dyoung }
932 1.1 dyoung
933 1.1 dyoung ifmr->ifm_status |= IFM_ACTIVE;
934 1.1 dyoung
935 1.1 dyoung switch (adapter->link_speed) {
936 1.42 msaitoh case IXGBE_LINK_SPEED_10GB_FULL:
937 1.42 msaitoh ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
938 1.42 msaitoh break;
939 1.1 dyoung case IXGBE_LINK_SPEED_1GB_FULL:
940 1.1 dyoung ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
941 1.1 dyoung break;
942 1.42 msaitoh case IXGBE_LINK_SPEED_100_FULL:
943 1.42 msaitoh ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
944 1.1 dyoung break;
945 1.1 dyoung }
946 1.1 dyoung
947 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
948 1.1 dyoung
949 1.1 dyoung return;
950 1.1 dyoung }
951 1.1 dyoung
952 1.1 dyoung /*********************************************************************
953 1.1 dyoung *
954 1.1 dyoung * Media Ioctl callback
955 1.1 dyoung *
956 1.1 dyoung * This routine is called when the user changes speed/duplex using
957 1.1 dyoung * media/mediopt option with ifconfig.
958 1.1 dyoung *
959 1.1 dyoung **********************************************************************/
960 1.1 dyoung static int
961 1.57 msaitoh ixv_media_change(struct ifnet *ifp)
962 1.1 dyoung {
963 1.1 dyoung struct adapter *adapter = ifp->if_softc;
964 1.1 dyoung struct ifmedia *ifm = &adapter->media;
965 1.1 dyoung
966 1.1 dyoung INIT_DEBUGOUT("ixv_media_change: begin");
967 1.1 dyoung
968 1.1 dyoung if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
969 1.1 dyoung return (EINVAL);
970 1.1 dyoung
971 1.57 msaitoh switch (IFM_SUBTYPE(ifm->ifm_media)) {
972 1.57 msaitoh case IFM_AUTO:
973 1.57 msaitoh break;
974 1.57 msaitoh default:
975 1.57 msaitoh device_printf(adapter->dev, "Only auto media type\n");
976 1.1 dyoung return (EINVAL);
977 1.57 msaitoh }
978 1.1 dyoung
979 1.1 dyoung return (0);
980 1.1 dyoung }
981 1.1 dyoung
982 1.1 dyoung
983 1.1 dyoung /*********************************************************************
984 1.1 dyoung * Multicast Update
985 1.1 dyoung *
986 1.1 dyoung * This routine is called whenever multicast address list is updated.
987 1.1 dyoung *
988 1.1 dyoung **********************************************************************/
989 1.1 dyoung #define IXGBE_RAR_ENTRIES 16
990 1.1 dyoung
991 1.1 dyoung static void
992 1.1 dyoung ixv_set_multi(struct adapter *adapter)
993 1.1 dyoung {
994 1.3 msaitoh struct ether_multi *enm;
995 1.3 msaitoh struct ether_multistep step;
996 1.1 dyoung u8 mta[MAX_NUM_MULTICAST_ADDRESSES * IXGBE_ETH_LENGTH_OF_ADDRESS];
997 1.1 dyoung u8 *update_ptr;
998 1.1 dyoung int mcnt = 0;
999 1.3 msaitoh struct ethercom *ec = &adapter->osdep.ec;
1000 1.1 dyoung
1001 1.1 dyoung IOCTL_DEBUGOUT("ixv_set_multi: begin");
1002 1.1 dyoung
1003 1.3 msaitoh ETHER_FIRST_MULTI(step, ec, enm);
1004 1.3 msaitoh while (enm != NULL) {
1005 1.3 msaitoh bcopy(enm->enm_addrlo,
1006 1.1 dyoung &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
1007 1.1 dyoung IXGBE_ETH_LENGTH_OF_ADDRESS);
1008 1.1 dyoung mcnt++;
1009 1.3 msaitoh /* XXX This might be required --msaitoh */
1010 1.3 msaitoh if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES)
1011 1.3 msaitoh break;
1012 1.3 msaitoh ETHER_NEXT_MULTI(step, enm);
1013 1.1 dyoung }
1014 1.1 dyoung
1015 1.1 dyoung update_ptr = mta;
1016 1.1 dyoung
1017 1.1 dyoung ixgbe_update_mc_addr_list(&adapter->hw,
1018 1.5 msaitoh update_ptr, mcnt, ixv_mc_array_itr, TRUE);
1019 1.1 dyoung
1020 1.1 dyoung return;
1021 1.1 dyoung }
1022 1.1 dyoung
1023 1.1 dyoung /*
1024 1.1 dyoung * This is an iterator function now needed by the multicast
1025 1.1 dyoung * shared code. It simply feeds the shared code routine the
1026 1.1 dyoung * addresses in the array of ixv_set_multi() one by one.
1027 1.1 dyoung */
1028 1.1 dyoung static u8 *
1029 1.1 dyoung ixv_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
1030 1.1 dyoung {
1031 1.1 dyoung u8 *addr = *update_ptr;
1032 1.1 dyoung u8 *newptr;
1033 1.1 dyoung *vmdq = 0;
1034 1.1 dyoung
1035 1.1 dyoung newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
1036 1.1 dyoung *update_ptr = newptr;
1037 1.57 msaitoh
1038 1.1 dyoung return addr;
1039 1.1 dyoung }
1040 1.1 dyoung
1041 1.1 dyoung /*********************************************************************
1042 1.1 dyoung * Timer routine
1043 1.1 dyoung *
1044 1.1 dyoung * This routine checks for link status,updates statistics,
1045 1.1 dyoung * and runs the watchdog check.
1046 1.1 dyoung *
1047 1.1 dyoung **********************************************************************/
1048 1.1 dyoung
1049 1.1 dyoung static void
1050 1.22 msaitoh ixv_local_timer(void *arg)
1051 1.22 msaitoh {
1052 1.22 msaitoh struct adapter *adapter = arg;
1053 1.22 msaitoh
1054 1.22 msaitoh IXGBE_CORE_LOCK(adapter);
1055 1.22 msaitoh ixv_local_timer_locked(adapter);
1056 1.22 msaitoh IXGBE_CORE_UNLOCK(adapter);
1057 1.22 msaitoh }
1058 1.22 msaitoh
1059 1.22 msaitoh static void
1060 1.22 msaitoh ixv_local_timer_locked(void *arg)
1061 1.1 dyoung {
1062 1.1 dyoung struct adapter *adapter = arg;
1063 1.1 dyoung device_t dev = adapter->dev;
1064 1.22 msaitoh struct ix_queue *que = adapter->queues;
1065 1.21 msaitoh u64 queues = 0;
1066 1.21 msaitoh int hung = 0;
1067 1.1 dyoung
1068 1.3 msaitoh KASSERT(mutex_owned(&adapter->core_mtx));
1069 1.1 dyoung
1070 1.1 dyoung ixv_update_link_status(adapter);
1071 1.1 dyoung
1072 1.1 dyoung /* Stats Update */
1073 1.1 dyoung ixv_update_stats(adapter);
1074 1.1 dyoung
1075 1.1 dyoung /*
1076 1.21 msaitoh ** Check the TX queues status
1077 1.21 msaitoh ** - mark hung queues so we don't schedule on them
1078 1.21 msaitoh ** - watchdog only if all queues show hung
1079 1.22 msaitoh */
1080 1.22 msaitoh for (int i = 0; i < adapter->num_queues; i++, que++) {
1081 1.21 msaitoh /* Keep track of queues with work for soft irq */
1082 1.21 msaitoh if (que->txr->busy)
1083 1.21 msaitoh queues |= ((u64)1 << que->me);
1084 1.21 msaitoh /*
1085 1.21 msaitoh ** Each time txeof runs without cleaning, but there
1086 1.21 msaitoh ** are uncleaned descriptors it increments busy. If
1087 1.21 msaitoh ** we get to the MAX we declare it hung.
1088 1.21 msaitoh */
1089 1.21 msaitoh if (que->busy == IXGBE_QUEUE_HUNG) {
1090 1.21 msaitoh ++hung;
1091 1.21 msaitoh /* Mark the queue as inactive */
1092 1.21 msaitoh adapter->active_queues &= ~((u64)1 << que->me);
1093 1.22 msaitoh continue;
1094 1.21 msaitoh } else {
1095 1.21 msaitoh /* Check if we've come back from hung */
1096 1.21 msaitoh if ((adapter->active_queues & ((u64)1 << que->me)) == 0)
1097 1.57 msaitoh adapter->active_queues |= ((u64)1 << que->me);
1098 1.22 msaitoh }
1099 1.21 msaitoh if (que->busy >= IXGBE_MAX_TX_BUSY) {
1100 1.21 msaitoh device_printf(dev,"Warning queue %d "
1101 1.21 msaitoh "appears to be hung!\n", i);
1102 1.21 msaitoh que->txr->busy = IXGBE_QUEUE_HUNG;
1103 1.21 msaitoh ++hung;
1104 1.1 dyoung }
1105 1.21 msaitoh }
1106 1.21 msaitoh
1107 1.29 msaitoh /* Only truly watchdog if all queues show hung */
1108 1.21 msaitoh if (hung == adapter->num_queues)
1109 1.21 msaitoh goto watchdog;
1110 1.21 msaitoh else if (queues != 0) { /* Force an IRQ on queues with work */
1111 1.21 msaitoh ixv_rearm_queues(adapter, queues);
1112 1.1 dyoung }
1113 1.21 msaitoh
1114 1.1 dyoung callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
1115 1.57 msaitoh
1116 1.1 dyoung return;
1117 1.1 dyoung
1118 1.21 msaitoh watchdog:
1119 1.57 msaitoh
1120 1.1 dyoung device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
1121 1.3 msaitoh adapter->ifp->if_flags &= ~IFF_RUNNING;
1122 1.3 msaitoh adapter->watchdog_events.ev_count++;
1123 1.1 dyoung ixv_init_locked(adapter);
1124 1.1 dyoung }
1125 1.1 dyoung
1126 1.1 dyoung /*
1127 1.1 dyoung ** Note: this routine updates the OS on the link state
1128 1.1 dyoung ** the real check of the hardware only happens with
1129 1.1 dyoung ** a link interrupt.
1130 1.1 dyoung */
1131 1.1 dyoung static void
1132 1.1 dyoung ixv_update_link_status(struct adapter *adapter)
1133 1.1 dyoung {
1134 1.1 dyoung struct ifnet *ifp = adapter->ifp;
1135 1.1 dyoung device_t dev = adapter->dev;
1136 1.1 dyoung
1137 1.57 msaitoh if (adapter->link_up) {
1138 1.1 dyoung if (adapter->link_active == FALSE) {
1139 1.42 msaitoh if (bootverbose) {
1140 1.42 msaitoh const char *bpsmsg;
1141 1.42 msaitoh
1142 1.42 msaitoh switch (adapter->link_speed) {
1143 1.42 msaitoh case IXGBE_LINK_SPEED_10GB_FULL:
1144 1.42 msaitoh bpsmsg = "10 Gbps";
1145 1.42 msaitoh break;
1146 1.42 msaitoh case IXGBE_LINK_SPEED_1GB_FULL:
1147 1.42 msaitoh bpsmsg = "1 Gbps";
1148 1.42 msaitoh break;
1149 1.42 msaitoh case IXGBE_LINK_SPEED_100_FULL:
1150 1.42 msaitoh bpsmsg = "100 Mbps";
1151 1.42 msaitoh break;
1152 1.42 msaitoh default:
1153 1.42 msaitoh bpsmsg = "unknown speed";
1154 1.42 msaitoh break;
1155 1.42 msaitoh }
1156 1.42 msaitoh device_printf(dev,"Link is up %s %s \n",
1157 1.42 msaitoh bpsmsg, "Full Duplex");
1158 1.42 msaitoh }
1159 1.1 dyoung adapter->link_active = TRUE;
1160 1.1 dyoung if_link_state_change(ifp, LINK_STATE_UP);
1161 1.1 dyoung }
1162 1.1 dyoung } else { /* Link down */
1163 1.1 dyoung if (adapter->link_active == TRUE) {
1164 1.1 dyoung if (bootverbose)
1165 1.1 dyoung device_printf(dev,"Link is Down\n");
1166 1.1 dyoung if_link_state_change(ifp, LINK_STATE_DOWN);
1167 1.1 dyoung adapter->link_active = FALSE;
1168 1.1 dyoung }
1169 1.1 dyoung }
1170 1.1 dyoung
1171 1.1 dyoung return;
1172 1.1 dyoung }
1173 1.1 dyoung
1174 1.1 dyoung
1175 1.3 msaitoh static void
1176 1.3 msaitoh ixv_ifstop(struct ifnet *ifp, int disable)
1177 1.3 msaitoh {
1178 1.3 msaitoh struct adapter *adapter = ifp->if_softc;
1179 1.3 msaitoh
1180 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
1181 1.3 msaitoh ixv_stop(adapter);
1182 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
1183 1.3 msaitoh }
1184 1.3 msaitoh
1185 1.1 dyoung /*********************************************************************
1186 1.1 dyoung *
1187 1.1 dyoung * This routine disables all traffic on the adapter by issuing a
1188 1.1 dyoung * global reset on the MAC and deallocates TX/RX buffers.
1189 1.1 dyoung *
1190 1.1 dyoung **********************************************************************/
1191 1.1 dyoung
1192 1.1 dyoung static void
1193 1.1 dyoung ixv_stop(void *arg)
1194 1.1 dyoung {
1195 1.1 dyoung struct ifnet *ifp;
1196 1.1 dyoung struct adapter *adapter = arg;
1197 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1198 1.1 dyoung ifp = adapter->ifp;
1199 1.1 dyoung
1200 1.3 msaitoh KASSERT(mutex_owned(&adapter->core_mtx));
1201 1.1 dyoung
1202 1.1 dyoung INIT_DEBUGOUT("ixv_stop: begin\n");
1203 1.1 dyoung ixv_disable_intr(adapter);
1204 1.1 dyoung
1205 1.1 dyoung /* Tell the stack that the interface is no longer active */
1206 1.3 msaitoh ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1207 1.1 dyoung
1208 1.1 dyoung ixgbe_reset_hw(hw);
1209 1.1 dyoung adapter->hw.adapter_stopped = FALSE;
1210 1.1 dyoung ixgbe_stop_adapter(hw);
1211 1.1 dyoung callout_stop(&adapter->timer);
1212 1.1 dyoung
1213 1.1 dyoung /* reprogram the RAR[0] in case user changed it. */
1214 1.1 dyoung ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
1215 1.1 dyoung
1216 1.1 dyoung return;
1217 1.1 dyoung }
1218 1.1 dyoung
1219 1.1 dyoung
1220 1.57 msaitoh static int
1221 1.57 msaitoh ixv_allocate_pci_resources(struct adapter *adapter,
1222 1.57 msaitoh const struct pci_attach_args *pa)
1223 1.1 dyoung {
1224 1.57 msaitoh pcireg_t memtype;
1225 1.57 msaitoh device_t dev = adapter->dev;
1226 1.57 msaitoh bus_addr_t addr;
1227 1.57 msaitoh int flags;
1228 1.3 msaitoh
1229 1.57 msaitoh memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
1230 1.57 msaitoh switch (memtype) {
1231 1.57 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1232 1.57 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1233 1.57 msaitoh adapter->osdep.mem_bus_space_tag = pa->pa_memt;
1234 1.57 msaitoh if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
1235 1.57 msaitoh memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
1236 1.57 msaitoh goto map_err;
1237 1.57 msaitoh if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
1238 1.57 msaitoh aprint_normal_dev(dev, "clearing prefetchable bit\n");
1239 1.57 msaitoh flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
1240 1.57 msaitoh }
1241 1.57 msaitoh if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
1242 1.57 msaitoh adapter->osdep.mem_size, flags,
1243 1.3 msaitoh &adapter->osdep.mem_bus_space_handle) != 0) {
1244 1.3 msaitoh map_err:
1245 1.3 msaitoh adapter->osdep.mem_size = 0;
1246 1.3 msaitoh aprint_error_dev(dev, "unable to map BAR0\n");
1247 1.3 msaitoh return ENXIO;
1248 1.3 msaitoh }
1249 1.3 msaitoh break;
1250 1.3 msaitoh default:
1251 1.3 msaitoh aprint_error_dev(dev, "unexpected type on BAR0\n");
1252 1.3 msaitoh return ENXIO;
1253 1.1 dyoung }
1254 1.46 msaitoh adapter->hw.back = adapter;
1255 1.1 dyoung
1256 1.23 msaitoh /* Pick up the tuneable queues */
1257 1.23 msaitoh adapter->num_queues = ixv_num_queues;
1258 1.1 dyoung
1259 1.1 dyoung /*
1260 1.1 dyoung ** Now setup MSI/X, should
1261 1.1 dyoung ** return us the number of
1262 1.1 dyoung ** configured vectors.
1263 1.1 dyoung */
1264 1.1 dyoung adapter->msix = ixv_setup_msix(adapter);
1265 1.1 dyoung if (adapter->msix == ENXIO)
1266 1.1 dyoung return (ENXIO);
1267 1.1 dyoung else
1268 1.1 dyoung return (0);
1269 1.1 dyoung }
1270 1.1 dyoung
1271 1.1 dyoung static void
1272 1.1 dyoung ixv_free_pci_resources(struct adapter * adapter)
1273 1.1 dyoung {
1274 1.1 dyoung struct ix_queue *que = adapter->queues;
1275 1.11 msaitoh int rid;
1276 1.1 dyoung
1277 1.1 dyoung /*
1278 1.1 dyoung ** Release all msix queue resources:
1279 1.1 dyoung */
1280 1.1 dyoung for (int i = 0; i < adapter->num_queues; i++, que++) {
1281 1.1 dyoung if (que->res != NULL)
1282 1.11 msaitoh pci_intr_disestablish(adapter->osdep.pc,
1283 1.11 msaitoh adapter->osdep.ihs[i]);
1284 1.1 dyoung }
1285 1.1 dyoung
1286 1.12 msaitoh
1287 1.49 msaitoh /* Clean the Link interrupt last */
1288 1.49 msaitoh rid = adapter->vector;
1289 1.1 dyoung
1290 1.41 msaitoh if (adapter->osdep.ihs[rid] != NULL) {
1291 1.11 msaitoh pci_intr_disestablish(adapter->osdep.pc,
1292 1.11 msaitoh adapter->osdep.ihs[rid]);
1293 1.41 msaitoh adapter->osdep.ihs[rid] = NULL;
1294 1.41 msaitoh }
1295 1.11 msaitoh
1296 1.11 msaitoh pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
1297 1.11 msaitoh adapter->osdep.nintrs);
1298 1.11 msaitoh
1299 1.11 msaitoh if (adapter->osdep.mem_size != 0) {
1300 1.11 msaitoh bus_space_unmap(adapter->osdep.mem_bus_space_tag,
1301 1.11 msaitoh adapter->osdep.mem_bus_space_handle,
1302 1.11 msaitoh adapter->osdep.mem_size);
1303 1.11 msaitoh }
1304 1.1 dyoung
1305 1.1 dyoung return;
1306 1.1 dyoung }
1307 1.1 dyoung
1308 1.1 dyoung /*********************************************************************
1309 1.1 dyoung *
1310 1.1 dyoung * Setup networking device structure and register an interface.
1311 1.1 dyoung *
1312 1.1 dyoung **********************************************************************/
1313 1.1 dyoung static void
1314 1.1 dyoung ixv_setup_interface(device_t dev, struct adapter *adapter)
1315 1.1 dyoung {
1316 1.3 msaitoh struct ethercom *ec = &adapter->osdep.ec;
1317 1.1 dyoung struct ifnet *ifp;
1318 1.1 dyoung
1319 1.1 dyoung INIT_DEBUGOUT("ixv_setup_interface: begin");
1320 1.1 dyoung
1321 1.3 msaitoh ifp = adapter->ifp = &ec->ec_if;
1322 1.3 msaitoh strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
1323 1.46 msaitoh ifp->if_baudrate = IF_Gbps(10);
1324 1.1 dyoung ifp->if_init = ixv_init;
1325 1.3 msaitoh ifp->if_stop = ixv_ifstop;
1326 1.1 dyoung ifp->if_softc = adapter;
1327 1.1 dyoung ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1328 1.55 msaitoh #ifdef IXGBE_MPSAFE
1329 1.55 msaitoh ifp->if_extflags = IFEF_START_MPSAFE;
1330 1.55 msaitoh #endif
1331 1.1 dyoung ifp->if_ioctl = ixv_ioctl;
1332 1.35 msaitoh #ifndef IXGBE_LEGACY_TX
1333 1.21 msaitoh ifp->if_transmit = ixgbe_mq_start;
1334 1.35 msaitoh #endif
1335 1.21 msaitoh ifp->if_start = ixgbe_start;
1336 1.45 msaitoh IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
1337 1.45 msaitoh IFQ_SET_READY(&ifp->if_snd);
1338 1.1 dyoung
1339 1.34 msaitoh if_initialize(ifp);
1340 1.52 msaitoh adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
1341 1.1 dyoung ether_ifattach(ifp, adapter->hw.mac.addr);
1342 1.51 msaitoh /*
1343 1.51 msaitoh * We use per TX queue softint, so if_deferred_start_init() isn't
1344 1.51 msaitoh * used.
1345 1.51 msaitoh */
1346 1.34 msaitoh if_register(ifp);
1347 1.3 msaitoh ether_set_ifflags_cb(ec, ixv_ifflags_cb);
1348 1.1 dyoung
1349 1.1 dyoung adapter->max_frame_size =
1350 1.26 msaitoh ifp->if_mtu + IXGBE_MTU_HDR_VLAN;
1351 1.1 dyoung
1352 1.1 dyoung /*
1353 1.1 dyoung * Tell the upper layer(s) we support long frames.
1354 1.1 dyoung */
1355 1.3 msaitoh ifp->if_hdrlen = sizeof(struct ether_vlan_header);
1356 1.3 msaitoh
1357 1.3 msaitoh ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSOv4;
1358 1.3 msaitoh ifp->if_capenable = 0;
1359 1.1 dyoung
1360 1.3 msaitoh ec->ec_capabilities |= ETHERCAP_VLAN_HWCSUM;
1361 1.3 msaitoh ec->ec_capabilities |= ETHERCAP_JUMBO_MTU;
1362 1.4 msaitoh ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING
1363 1.4 msaitoh | ETHERCAP_VLAN_MTU;
1364 1.3 msaitoh ec->ec_capenable = ec->ec_capabilities;
1365 1.1 dyoung
1366 1.3 msaitoh /* Don't enable LRO by default */
1367 1.3 msaitoh ifp->if_capabilities |= IFCAP_LRO;
1368 1.21 msaitoh #if 0
1369 1.21 msaitoh ifp->if_capenable = ifp->if_capabilities;
1370 1.21 msaitoh #endif
1371 1.3 msaitoh
1372 1.3 msaitoh /*
1373 1.3 msaitoh ** Dont turn this on by default, if vlans are
1374 1.3 msaitoh ** created on another pseudo device (eg. lagg)
1375 1.3 msaitoh ** then vlan events are not passed thru, breaking
1376 1.3 msaitoh ** operation, but with HW FILTER off it works. If
1377 1.3 msaitoh ** using vlans directly on the em driver you can
1378 1.3 msaitoh ** enable this and get full hardware tag filtering.
1379 1.3 msaitoh */
1380 1.3 msaitoh ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
1381 1.1 dyoung
1382 1.1 dyoung /*
1383 1.1 dyoung * Specify the media types supported by this adapter and register
1384 1.1 dyoung * callbacks to update media and link information
1385 1.1 dyoung */
1386 1.1 dyoung ifmedia_init(&adapter->media, IFM_IMASK, ixv_media_change,
1387 1.57 msaitoh ixv_media_status);
1388 1.1 dyoung ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1389 1.1 dyoung ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1390 1.1 dyoung
1391 1.1 dyoung return;
1392 1.1 dyoung }
1393 1.1 dyoung
1394 1.1 dyoung /*********************************************************************
1395 1.1 dyoung *
1396 1.21 msaitoh * Enable transmit unit.
1397 1.1 dyoung *
1398 1.1 dyoung **********************************************************************/
1399 1.21 msaitoh static void
1400 1.21 msaitoh ixv_initialize_transmit_units(struct adapter *adapter)
1401 1.1 dyoung {
1402 1.21 msaitoh struct tx_ring *txr = adapter->tx_rings;
1403 1.21 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1404 1.1 dyoung
1405 1.1 dyoung
1406 1.21 msaitoh for (int i = 0; i < adapter->num_queues; i++, txr++) {
1407 1.21 msaitoh u64 tdba = txr->txdma.dma_paddr;
1408 1.21 msaitoh u32 txctrl, txdctl;
1409 1.1 dyoung
1410 1.21 msaitoh /* Set WTHRESH to 8, burst writeback */
1411 1.21 msaitoh txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
1412 1.21 msaitoh txdctl |= (8 << 16);
1413 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
1414 1.1 dyoung
1415 1.21 msaitoh /* Set the HW Tx Head and Tail indices */
1416 1.21 msaitoh IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDH(i), 0);
1417 1.21 msaitoh IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDT(i), 0);
1418 1.1 dyoung
1419 1.21 msaitoh /* Set Tx Tail register */
1420 1.21 msaitoh txr->tail = IXGBE_VFTDT(i);
1421 1.1 dyoung
1422 1.21 msaitoh /* Set Ring parameters */
1423 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(i),
1424 1.57 msaitoh (tdba & 0x00000000ffffffffULL));
1425 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(i), (tdba >> 32));
1426 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(i),
1427 1.21 msaitoh adapter->num_tx_desc *
1428 1.21 msaitoh sizeof(struct ixgbe_legacy_tx_desc));
1429 1.21 msaitoh txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(i));
1430 1.21 msaitoh txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
1431 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i), txctrl);
1432 1.1 dyoung
1433 1.21 msaitoh /* Now enable */
1434 1.21 msaitoh txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
1435 1.21 msaitoh txdctl |= IXGBE_TXDCTL_ENABLE;
1436 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
1437 1.1 dyoung }
1438 1.1 dyoung
1439 1.21 msaitoh return;
1440 1.1 dyoung }
1441 1.1 dyoung
1442 1.1 dyoung
1443 1.1 dyoung /*********************************************************************
1444 1.1 dyoung *
1445 1.21 msaitoh * Setup receive registers and features.
1446 1.1 dyoung *
1447 1.1 dyoung **********************************************************************/
1448 1.21 msaitoh #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
1449 1.21 msaitoh
1450 1.21 msaitoh static void
1451 1.21 msaitoh ixv_initialize_receive_units(struct adapter *adapter)
1452 1.1 dyoung {
1453 1.21 msaitoh struct rx_ring *rxr = adapter->rx_rings;
1454 1.21 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1455 1.23 msaitoh struct ifnet *ifp = adapter->ifp;
1456 1.23 msaitoh u32 bufsz, rxcsum, psrtype;
1457 1.1 dyoung
1458 1.23 msaitoh if (ifp->if_mtu > ETHERMTU)
1459 1.23 msaitoh bufsz = 4096 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1460 1.23 msaitoh else
1461 1.23 msaitoh bufsz = 2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1462 1.1 dyoung
1463 1.23 msaitoh psrtype = IXGBE_PSRTYPE_TCPHDR | IXGBE_PSRTYPE_UDPHDR |
1464 1.23 msaitoh IXGBE_PSRTYPE_IPV4HDR | IXGBE_PSRTYPE_IPV6HDR |
1465 1.23 msaitoh IXGBE_PSRTYPE_L2HDR;
1466 1.1 dyoung
1467 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
1468 1.23 msaitoh
1469 1.26 msaitoh /* Tell PF our max_frame size */
1470 1.26 msaitoh ixgbevf_rlpml_set_vf(hw, adapter->max_frame_size);
1471 1.1 dyoung
1472 1.23 msaitoh for (int i = 0; i < adapter->num_queues; i++, rxr++) {
1473 1.1 dyoung u64 rdba = rxr->rxdma.dma_paddr;
1474 1.1 dyoung u32 reg, rxdctl;
1475 1.1 dyoung
1476 1.23 msaitoh /* Disable the queue */
1477 1.23 msaitoh rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
1478 1.28 msaitoh rxdctl &= ~IXGBE_RXDCTL_ENABLE;
1479 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl);
1480 1.23 msaitoh for (int j = 0; j < 10; j++) {
1481 1.23 msaitoh if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)) &
1482 1.23 msaitoh IXGBE_RXDCTL_ENABLE)
1483 1.23 msaitoh msec_delay(1);
1484 1.23 msaitoh else
1485 1.23 msaitoh break;
1486 1.23 msaitoh }
1487 1.23 msaitoh wmb();
1488 1.1 dyoung /* Setup the Base and Length of the Rx Descriptor Ring */
1489 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(i),
1490 1.1 dyoung (rdba & 0x00000000ffffffffULL));
1491 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(i),
1492 1.1 dyoung (rdba >> 32));
1493 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(i),
1494 1.1 dyoung adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
1495 1.1 dyoung
1496 1.23 msaitoh /* Reset the ring indices */
1497 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0);
1498 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), 0);
1499 1.23 msaitoh
1500 1.1 dyoung /* Set up the SRRCTL register */
1501 1.1 dyoung reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i));
1502 1.1 dyoung reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
1503 1.1 dyoung reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
1504 1.1 dyoung reg |= bufsz;
1505 1.21 msaitoh reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
1506 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), reg);
1507 1.1 dyoung
1508 1.23 msaitoh /* Capture Rx Tail index */
1509 1.21 msaitoh rxr->tail = IXGBE_VFRDT(rxr->me);
1510 1.21 msaitoh
1511 1.21 msaitoh /* Do the queue enabling last */
1512 1.28 msaitoh rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME;
1513 1.21 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl);
1514 1.21 msaitoh for (int k = 0; k < 10; k++) {
1515 1.21 msaitoh if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)) &
1516 1.21 msaitoh IXGBE_RXDCTL_ENABLE)
1517 1.21 msaitoh break;
1518 1.21 msaitoh else
1519 1.21 msaitoh msec_delay(1);
1520 1.21 msaitoh }
1521 1.21 msaitoh wmb();
1522 1.24 msaitoh
1523 1.24 msaitoh /* Set the Tail Pointer */
1524 1.25 msaitoh #ifdef DEV_NETMAP
1525 1.25 msaitoh /*
1526 1.25 msaitoh * In netmap mode, we must preserve the buffers made
1527 1.25 msaitoh * available to userspace before the if_init()
1528 1.25 msaitoh * (this is true by default on the TX side, because
1529 1.25 msaitoh * init makes all buffers available to userspace).
1530 1.25 msaitoh *
1531 1.25 msaitoh * netmap_reset() and the device specific routines
1532 1.25 msaitoh * (e.g. ixgbe_setup_receive_rings()) map these
1533 1.25 msaitoh * buffers at the end of the NIC ring, so here we
1534 1.25 msaitoh * must set the RDT (tail) register to make sure
1535 1.25 msaitoh * they are not overwritten.
1536 1.25 msaitoh *
1537 1.25 msaitoh * In this driver the NIC ring starts at RDH = 0,
1538 1.25 msaitoh * RDT points to the last slot available for reception (?),
1539 1.25 msaitoh * so RDT = num_rx_desc - 1 means the whole ring is available.
1540 1.25 msaitoh */
1541 1.25 msaitoh if (ifp->if_capenable & IFCAP_NETMAP) {
1542 1.25 msaitoh struct netmap_adapter *na = NA(adapter->ifp);
1543 1.25 msaitoh struct netmap_kring *kring = &na->rx_rings[i];
1544 1.25 msaitoh int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
1545 1.25 msaitoh
1546 1.25 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), t);
1547 1.25 msaitoh } else
1548 1.25 msaitoh #endif /* DEV_NETMAP */
1549 1.25 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me),
1550 1.25 msaitoh adapter->num_rx_desc - 1);
1551 1.1 dyoung }
1552 1.1 dyoung
1553 1.1 dyoung rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
1554 1.1 dyoung
1555 1.1 dyoung if (ifp->if_capenable & IFCAP_RXCSUM)
1556 1.1 dyoung rxcsum |= IXGBE_RXCSUM_PCSD;
1557 1.1 dyoung
1558 1.1 dyoung if (!(rxcsum & IXGBE_RXCSUM_PCSD))
1559 1.1 dyoung rxcsum |= IXGBE_RXCSUM_IPPCSE;
1560 1.1 dyoung
1561 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
1562 1.1 dyoung
1563 1.1 dyoung return;
1564 1.1 dyoung }
1565 1.1 dyoung
1566 1.1 dyoung static void
1567 1.1 dyoung ixv_setup_vlan_support(struct adapter *adapter)
1568 1.1 dyoung {
1569 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1570 1.1 dyoung u32 ctrl, vid, vfta, retry;
1571 1.26 msaitoh struct rx_ring *rxr;
1572 1.1 dyoung
1573 1.1 dyoung /*
1574 1.1 dyoung ** We get here thru init_locked, meaning
1575 1.1 dyoung ** a soft reset, this has already cleared
1576 1.1 dyoung ** the VFTA and other state, so if there
1577 1.1 dyoung ** have been no vlan's registered do nothing.
1578 1.1 dyoung */
1579 1.20 msaitoh if (!VLAN_ATTACHED(&adapter->osdep.ec))
1580 1.1 dyoung return;
1581 1.1 dyoung
1582 1.1 dyoung /* Enable the queues */
1583 1.1 dyoung for (int i = 0; i < adapter->num_queues; i++) {
1584 1.1 dyoung ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
1585 1.1 dyoung ctrl |= IXGBE_RXDCTL_VME;
1586 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl);
1587 1.26 msaitoh /*
1588 1.26 msaitoh * Let Rx path know that it needs to store VLAN tag
1589 1.26 msaitoh * as part of extra mbuf info.
1590 1.26 msaitoh */
1591 1.26 msaitoh rxr = &adapter->rx_rings[i];
1592 1.26 msaitoh rxr->vtag_strip = TRUE;
1593 1.1 dyoung }
1594 1.1 dyoung
1595 1.1 dyoung /*
1596 1.1 dyoung ** A soft reset zero's out the VFTA, so
1597 1.1 dyoung ** we need to repopulate it now.
1598 1.1 dyoung */
1599 1.21 msaitoh for (int i = 0; i < IXGBE_VFTA_SIZE; i++) {
1600 1.1 dyoung if (ixv_shadow_vfta[i] == 0)
1601 1.1 dyoung continue;
1602 1.1 dyoung vfta = ixv_shadow_vfta[i];
1603 1.1 dyoung /*
1604 1.1 dyoung ** Reconstruct the vlan id's
1605 1.1 dyoung ** based on the bits set in each
1606 1.1 dyoung ** of the array ints.
1607 1.1 dyoung */
1608 1.26 msaitoh for (int j = 0; j < 32; j++) {
1609 1.1 dyoung retry = 0;
1610 1.1 dyoung if ((vfta & (1 << j)) == 0)
1611 1.1 dyoung continue;
1612 1.1 dyoung vid = (i * 32) + j;
1613 1.1 dyoung /* Call the shared code mailbox routine */
1614 1.1 dyoung while (ixgbe_set_vfta(hw, vid, 0, TRUE)) {
1615 1.1 dyoung if (++retry > 5)
1616 1.1 dyoung break;
1617 1.1 dyoung }
1618 1.1 dyoung }
1619 1.1 dyoung }
1620 1.1 dyoung }
1621 1.1 dyoung
1622 1.3 msaitoh #if 0 /* XXX Badly need to overhaul vlan(4) on NetBSD. */
1623 1.1 dyoung /*
1624 1.1 dyoung ** This routine is run via an vlan config EVENT,
1625 1.1 dyoung ** it enables us to use the HW Filter table since
1626 1.1 dyoung ** we can get the vlan id. This just creates the
1627 1.1 dyoung ** entry in the soft version of the VFTA, init will
1628 1.1 dyoung ** repopulate the real table.
1629 1.1 dyoung */
1630 1.1 dyoung static void
1631 1.1 dyoung ixv_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
1632 1.1 dyoung {
1633 1.1 dyoung struct adapter *adapter = ifp->if_softc;
1634 1.1 dyoung u16 index, bit;
1635 1.1 dyoung
1636 1.26 msaitoh if (ifp->if_softc != arg) /* Not our event */
1637 1.1 dyoung return;
1638 1.1 dyoung
1639 1.26 msaitoh if ((vtag == 0) || (vtag > 4095)) /* Invalid */
1640 1.1 dyoung return;
1641 1.1 dyoung
1642 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
1643 1.1 dyoung index = (vtag >> 5) & 0x7F;
1644 1.1 dyoung bit = vtag & 0x1F;
1645 1.1 dyoung ixv_shadow_vfta[index] |= (1 << bit);
1646 1.1 dyoung /* Re-init to load the changes */
1647 1.5 msaitoh ixv_init_locked(adapter);
1648 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
1649 1.1 dyoung }
1650 1.1 dyoung
1651 1.1 dyoung /*
1652 1.1 dyoung ** This routine is run via an vlan
1653 1.1 dyoung ** unconfig EVENT, remove our entry
1654 1.1 dyoung ** in the soft vfta.
1655 1.1 dyoung */
1656 1.1 dyoung static void
1657 1.1 dyoung ixv_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
1658 1.1 dyoung {
1659 1.1 dyoung struct adapter *adapter = ifp->if_softc;
1660 1.1 dyoung u16 index, bit;
1661 1.1 dyoung
1662 1.1 dyoung if (ifp->if_softc != arg)
1663 1.1 dyoung return;
1664 1.1 dyoung
1665 1.1 dyoung if ((vtag == 0) || (vtag > 4095)) /* Invalid */
1666 1.1 dyoung return;
1667 1.1 dyoung
1668 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
1669 1.1 dyoung index = (vtag >> 5) & 0x7F;
1670 1.1 dyoung bit = vtag & 0x1F;
1671 1.1 dyoung ixv_shadow_vfta[index] &= ~(1 << bit);
1672 1.1 dyoung /* Re-init to load the changes */
1673 1.5 msaitoh ixv_init_locked(adapter);
1674 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
1675 1.1 dyoung }
1676 1.3 msaitoh #endif
1677 1.1 dyoung
1678 1.1 dyoung static void
1679 1.1 dyoung ixv_enable_intr(struct adapter *adapter)
1680 1.1 dyoung {
1681 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1682 1.1 dyoung struct ix_queue *que = adapter->queues;
1683 1.1 dyoung u32 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
1684 1.1 dyoung
1685 1.1 dyoung
1686 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
1687 1.1 dyoung
1688 1.1 dyoung mask = IXGBE_EIMS_ENABLE_MASK;
1689 1.1 dyoung mask &= ~(IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
1690 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
1691 1.1 dyoung
1692 1.1 dyoung for (int i = 0; i < adapter->num_queues; i++, que++)
1693 1.1 dyoung ixv_enable_queue(adapter, que->msix);
1694 1.1 dyoung
1695 1.1 dyoung IXGBE_WRITE_FLUSH(hw);
1696 1.1 dyoung
1697 1.1 dyoung return;
1698 1.1 dyoung }
1699 1.1 dyoung
1700 1.1 dyoung static void
1701 1.1 dyoung ixv_disable_intr(struct adapter *adapter)
1702 1.1 dyoung {
1703 1.1 dyoung IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIAC, 0);
1704 1.1 dyoung IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIMC, ~0);
1705 1.1 dyoung IXGBE_WRITE_FLUSH(&adapter->hw);
1706 1.57 msaitoh
1707 1.1 dyoung return;
1708 1.1 dyoung }
1709 1.1 dyoung
1710 1.1 dyoung /*
1711 1.1 dyoung ** Setup the correct IVAR register for a particular MSIX interrupt
1712 1.1 dyoung ** - entry is the register array entry
1713 1.1 dyoung ** - vector is the MSIX vector for this queue
1714 1.1 dyoung ** - type is RX/TX/MISC
1715 1.1 dyoung */
1716 1.1 dyoung static void
1717 1.1 dyoung ixv_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
1718 1.1 dyoung {
1719 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1720 1.1 dyoung u32 ivar, index;
1721 1.1 dyoung
1722 1.1 dyoung vector |= IXGBE_IVAR_ALLOC_VAL;
1723 1.1 dyoung
1724 1.1 dyoung if (type == -1) { /* MISC IVAR */
1725 1.1 dyoung ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
1726 1.1 dyoung ivar &= ~0xFF;
1727 1.1 dyoung ivar |= vector;
1728 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
1729 1.1 dyoung } else { /* RX/TX IVARS */
1730 1.1 dyoung index = (16 * (entry & 1)) + (8 * type);
1731 1.1 dyoung ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1));
1732 1.1 dyoung ivar &= ~(0xFF << index);
1733 1.1 dyoung ivar |= (vector << index);
1734 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar);
1735 1.1 dyoung }
1736 1.1 dyoung }
1737 1.1 dyoung
1738 1.1 dyoung static void
1739 1.1 dyoung ixv_configure_ivars(struct adapter *adapter)
1740 1.1 dyoung {
1741 1.1 dyoung struct ix_queue *que = adapter->queues;
1742 1.1 dyoung
1743 1.57 msaitoh for (int i = 0; i < adapter->num_queues; i++, que++) {
1744 1.1 dyoung /* First the RX queue entry */
1745 1.57 msaitoh ixv_set_ivar(adapter, i, que->msix, 0);
1746 1.1 dyoung /* ... and the TX */
1747 1.1 dyoung ixv_set_ivar(adapter, i, que->msix, 1);
1748 1.1 dyoung /* Set an initial value in EITR */
1749 1.57 msaitoh IXGBE_WRITE_REG(&adapter->hw,
1750 1.57 msaitoh IXGBE_VTEITR(que->msix), IXV_EITR_DEFAULT);
1751 1.1 dyoung }
1752 1.1 dyoung
1753 1.21 msaitoh /* For the mailbox interrupt */
1754 1.57 msaitoh ixv_set_ivar(adapter, 1, adapter->vector, -1);
1755 1.1 dyoung }
1756 1.1 dyoung
1757 1.1 dyoung
1758 1.1 dyoung /*
1759 1.57 msaitoh ** The VF stats registers never have a truly virgin
1760 1.57 msaitoh ** starting point, so this routine tries to make an
1761 1.1 dyoung ** artificial one, marking ground zero on attach as
1762 1.1 dyoung ** it were.
1763 1.1 dyoung */
1764 1.1 dyoung static void
1765 1.1 dyoung ixv_save_stats(struct adapter *adapter)
1766 1.1 dyoung {
1767 1.21 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
1768 1.21 msaitoh
1769 1.21 msaitoh if (stats->vfgprc.ev_count || stats->vfgptc.ev_count) {
1770 1.21 msaitoh stats->saved_reset_vfgprc +=
1771 1.21 msaitoh stats->vfgprc.ev_count - stats->base_vfgprc;
1772 1.21 msaitoh stats->saved_reset_vfgptc +=
1773 1.21 msaitoh stats->vfgptc.ev_count - stats->base_vfgptc;
1774 1.21 msaitoh stats->saved_reset_vfgorc +=
1775 1.21 msaitoh stats->vfgorc.ev_count - stats->base_vfgorc;
1776 1.21 msaitoh stats->saved_reset_vfgotc +=
1777 1.21 msaitoh stats->vfgotc.ev_count - stats->base_vfgotc;
1778 1.21 msaitoh stats->saved_reset_vfmprc +=
1779 1.21 msaitoh stats->vfmprc.ev_count - stats->base_vfmprc;
1780 1.1 dyoung }
1781 1.1 dyoung }
1782 1.1 dyoung
1783 1.1 dyoung static void
1784 1.1 dyoung ixv_init_stats(struct adapter *adapter)
1785 1.1 dyoung {
1786 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1787 1.57 msaitoh
1788 1.21 msaitoh adapter->stats.vf.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
1789 1.21 msaitoh adapter->stats.vf.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
1790 1.21 msaitoh adapter->stats.vf.last_vfgorc |=
1791 1.1 dyoung (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
1792 1.1 dyoung
1793 1.21 msaitoh adapter->stats.vf.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
1794 1.21 msaitoh adapter->stats.vf.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
1795 1.21 msaitoh adapter->stats.vf.last_vfgotc |=
1796 1.1 dyoung (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
1797 1.1 dyoung
1798 1.21 msaitoh adapter->stats.vf.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
1799 1.1 dyoung
1800 1.21 msaitoh adapter->stats.vf.base_vfgprc = adapter->stats.vf.last_vfgprc;
1801 1.21 msaitoh adapter->stats.vf.base_vfgorc = adapter->stats.vf.last_vfgorc;
1802 1.21 msaitoh adapter->stats.vf.base_vfgptc = adapter->stats.vf.last_vfgptc;
1803 1.21 msaitoh adapter->stats.vf.base_vfgotc = adapter->stats.vf.last_vfgotc;
1804 1.21 msaitoh adapter->stats.vf.base_vfmprc = adapter->stats.vf.last_vfmprc;
1805 1.1 dyoung }
1806 1.1 dyoung
1807 1.1 dyoung #define UPDATE_STAT_32(reg, last, count) \
1808 1.1 dyoung { \
1809 1.1 dyoung u32 current = IXGBE_READ_REG(hw, reg); \
1810 1.1 dyoung if (current < last) \
1811 1.21 msaitoh count.ev_count += 0x100000000LL; \
1812 1.1 dyoung last = current; \
1813 1.21 msaitoh count.ev_count &= 0xFFFFFFFF00000000LL; \
1814 1.21 msaitoh count.ev_count |= current; \
1815 1.1 dyoung }
1816 1.1 dyoung
1817 1.1 dyoung #define UPDATE_STAT_36(lsb, msb, last, count) \
1818 1.1 dyoung { \
1819 1.1 dyoung u64 cur_lsb = IXGBE_READ_REG(hw, lsb); \
1820 1.1 dyoung u64 cur_msb = IXGBE_READ_REG(hw, msb); \
1821 1.1 dyoung u64 current = ((cur_msb << 32) | cur_lsb); \
1822 1.1 dyoung if (current < last) \
1823 1.21 msaitoh count.ev_count += 0x1000000000LL; \
1824 1.1 dyoung last = current; \
1825 1.21 msaitoh count.ev_count &= 0xFFFFFFF000000000LL; \
1826 1.21 msaitoh count.ev_count |= current; \
1827 1.1 dyoung }
1828 1.1 dyoung
1829 1.1 dyoung /*
1830 1.1 dyoung ** ixv_update_stats - Update the board statistics counters.
1831 1.1 dyoung */
1832 1.1 dyoung void
1833 1.1 dyoung ixv_update_stats(struct adapter *adapter)
1834 1.1 dyoung {
1835 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1836 1.1 dyoung
1837 1.21 msaitoh UPDATE_STAT_32(IXGBE_VFGPRC, adapter->stats.vf.last_vfgprc,
1838 1.21 msaitoh adapter->stats.vf.vfgprc);
1839 1.21 msaitoh UPDATE_STAT_32(IXGBE_VFGPTC, adapter->stats.vf.last_vfgptc,
1840 1.21 msaitoh adapter->stats.vf.vfgptc);
1841 1.1 dyoung UPDATE_STAT_36(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB,
1842 1.21 msaitoh adapter->stats.vf.last_vfgorc, adapter->stats.vf.vfgorc);
1843 1.1 dyoung UPDATE_STAT_36(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB,
1844 1.21 msaitoh adapter->stats.vf.last_vfgotc, adapter->stats.vf.vfgotc);
1845 1.21 msaitoh UPDATE_STAT_32(IXGBE_VFMPRC, adapter->stats.vf.last_vfmprc,
1846 1.21 msaitoh adapter->stats.vf.vfmprc);
1847 1.1 dyoung }
1848 1.1 dyoung
1849 1.3 msaitoh const struct sysctlnode *
1850 1.3 msaitoh ixv_sysctl_instance(struct adapter *adapter)
1851 1.3 msaitoh {
1852 1.3 msaitoh const char *dvname;
1853 1.3 msaitoh struct sysctllog **log;
1854 1.3 msaitoh int rc;
1855 1.3 msaitoh const struct sysctlnode *rnode;
1856 1.3 msaitoh
1857 1.3 msaitoh log = &adapter->sysctllog;
1858 1.3 msaitoh dvname = device_xname(adapter->dev);
1859 1.3 msaitoh
1860 1.3 msaitoh if ((rc = sysctl_createv(log, 0, NULL, &rnode,
1861 1.3 msaitoh 0, CTLTYPE_NODE, dvname,
1862 1.3 msaitoh SYSCTL_DESCR("ixv information and settings"),
1863 1.3 msaitoh NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
1864 1.3 msaitoh goto err;
1865 1.3 msaitoh
1866 1.3 msaitoh return rnode;
1867 1.3 msaitoh err:
1868 1.3 msaitoh printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
1869 1.3 msaitoh return NULL;
1870 1.3 msaitoh }
1871 1.48 msaitoh
1872 1.48 msaitoh static void
1873 1.48 msaitoh ixv_add_device_sysctls(struct adapter *adapter)
1874 1.48 msaitoh {
1875 1.48 msaitoh struct sysctllog **log;
1876 1.48 msaitoh const struct sysctlnode *rnode, *cnode;
1877 1.48 msaitoh device_t dev;
1878 1.48 msaitoh
1879 1.48 msaitoh dev = adapter->dev;
1880 1.48 msaitoh log = &adapter->sysctllog;
1881 1.48 msaitoh
1882 1.48 msaitoh if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
1883 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl root\n");
1884 1.48 msaitoh return;
1885 1.48 msaitoh }
1886 1.48 msaitoh
1887 1.48 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
1888 1.48 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT,
1889 1.48 msaitoh "debug", SYSCTL_DESCR("Debug Info"),
1890 1.48 msaitoh ixv_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
1891 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
1892 1.48 msaitoh
1893 1.48 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
1894 1.50 msaitoh CTLFLAG_READWRITE, CTLTYPE_BOOL,
1895 1.48 msaitoh "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
1896 1.50 msaitoh NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
1897 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
1898 1.48 msaitoh }
1899 1.48 msaitoh
1900 1.48 msaitoh /*
1901 1.48 msaitoh * Add statistic sysctls for the VF.
1902 1.48 msaitoh */
1903 1.48 msaitoh static void
1904 1.48 msaitoh ixv_add_stats_sysctls(struct adapter *adapter)
1905 1.48 msaitoh {
1906 1.48 msaitoh device_t dev = adapter->dev;
1907 1.49 msaitoh const struct sysctlnode *rnode;
1908 1.49 msaitoh struct sysctllog **log = &adapter->sysctllog;
1909 1.48 msaitoh struct ix_queue *que = &adapter->queues[0];
1910 1.48 msaitoh struct tx_ring *txr = que->txr;
1911 1.48 msaitoh struct rx_ring *rxr = que->rxr;
1912 1.48 msaitoh
1913 1.48 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
1914 1.48 msaitoh const char *xname = device_xname(dev);
1915 1.48 msaitoh
1916 1.48 msaitoh /* Driver Statistics */
1917 1.49 msaitoh evcnt_attach_dynamic(&adapter->handleq, EVCNT_TYPE_MISC,
1918 1.49 msaitoh NULL, xname, "Handled queue in softint");
1919 1.49 msaitoh evcnt_attach_dynamic(&adapter->req, EVCNT_TYPE_MISC,
1920 1.49 msaitoh NULL, xname, "Requeued in softint");
1921 1.49 msaitoh evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
1922 1.49 msaitoh NULL, xname, "Driver tx dma soft fail EFBIG");
1923 1.48 msaitoh evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
1924 1.48 msaitoh NULL, xname, "m_defrag() failed");
1925 1.49 msaitoh evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
1926 1.49 msaitoh NULL, xname, "Driver tx dma hard fail EFBIG");
1927 1.49 msaitoh evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
1928 1.49 msaitoh NULL, xname, "Driver tx dma hard fail EINVAL");
1929 1.49 msaitoh evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
1930 1.49 msaitoh NULL, xname, "Driver tx dma hard fail other");
1931 1.49 msaitoh evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
1932 1.49 msaitoh NULL, xname, "Driver tx dma soft fail EAGAIN");
1933 1.49 msaitoh evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
1934 1.49 msaitoh NULL, xname, "Driver tx dma soft fail ENOMEM");
1935 1.48 msaitoh evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
1936 1.48 msaitoh NULL, xname, "Watchdog timeouts");
1937 1.49 msaitoh evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
1938 1.49 msaitoh NULL, xname, "TSO errors");
1939 1.49 msaitoh evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_INTR,
1940 1.49 msaitoh NULL, xname, "Link MSIX IRQ Handled");
1941 1.49 msaitoh
1942 1.49 msaitoh for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
1943 1.49 msaitoh snprintf(adapter->queues[i].evnamebuf,
1944 1.49 msaitoh sizeof(adapter->queues[i].evnamebuf), "%s q%d",
1945 1.49 msaitoh xname, i);
1946 1.49 msaitoh snprintf(adapter->queues[i].namebuf,
1947 1.49 msaitoh sizeof(adapter->queues[i].namebuf), "q%d", i);
1948 1.49 msaitoh
1949 1.49 msaitoh if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
1950 1.49 msaitoh aprint_error_dev(dev, "could not create sysctl root\n");
1951 1.49 msaitoh break;
1952 1.49 msaitoh }
1953 1.49 msaitoh
1954 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &rnode,
1955 1.49 msaitoh 0, CTLTYPE_NODE,
1956 1.49 msaitoh adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
1957 1.49 msaitoh NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
1958 1.49 msaitoh break;
1959 1.49 msaitoh
1960 1.49 msaitoh #if 0 /* not yet */
1961 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
1962 1.49 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT,
1963 1.49 msaitoh "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
1964 1.49 msaitoh ixgbe_sysctl_interrupt_rate_handler, 0,
1965 1.49 msaitoh (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
1966 1.49 msaitoh break;
1967 1.49 msaitoh
1968 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
1969 1.49 msaitoh CTLFLAG_READONLY, CTLTYPE_QUAD,
1970 1.49 msaitoh "irqs", SYSCTL_DESCR("irqs on this queue"),
1971 1.49 msaitoh NULL, 0, &(adapter->queues[i].irqs),
1972 1.49 msaitoh 0, CTL_CREATE, CTL_EOL) != 0)
1973 1.49 msaitoh break;
1974 1.49 msaitoh
1975 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
1976 1.49 msaitoh CTLFLAG_READONLY, CTLTYPE_INT,
1977 1.49 msaitoh "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
1978 1.49 msaitoh ixgbe_sysctl_tdh_handler, 0, (void *)txr,
1979 1.49 msaitoh 0, CTL_CREATE, CTL_EOL) != 0)
1980 1.49 msaitoh break;
1981 1.49 msaitoh
1982 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
1983 1.49 msaitoh CTLFLAG_READONLY, CTLTYPE_INT,
1984 1.49 msaitoh "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
1985 1.49 msaitoh ixgbe_sysctl_tdt_handler, 0, (void *)txr,
1986 1.49 msaitoh 0, CTL_CREATE, CTL_EOL) != 0)
1987 1.49 msaitoh break;
1988 1.49 msaitoh #endif
1989 1.49 msaitoh evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
1990 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
1991 1.49 msaitoh evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
1992 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "TSO");
1993 1.49 msaitoh evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
1994 1.49 msaitoh NULL, adapter->queues[i].evnamebuf,
1995 1.49 msaitoh "Queue No Descriptor Available");
1996 1.49 msaitoh evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
1997 1.49 msaitoh NULL, adapter->queues[i].evnamebuf,
1998 1.49 msaitoh "Queue Packets Transmitted");
1999 1.49 msaitoh #ifndef IXGBE_LEGACY_TX
2000 1.49 msaitoh evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
2001 1.49 msaitoh NULL, adapter->queues[i].evnamebuf,
2002 1.49 msaitoh "Packets dropped in pcq");
2003 1.49 msaitoh #endif
2004 1.49 msaitoh
2005 1.49 msaitoh #ifdef LRO
2006 1.49 msaitoh struct lro_ctrl *lro = &rxr->lro;
2007 1.49 msaitoh #endif /* LRO */
2008 1.49 msaitoh
2009 1.49 msaitoh #if 0 /* not yet */
2010 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2011 1.49 msaitoh CTLFLAG_READONLY,
2012 1.49 msaitoh CTLTYPE_INT,
2013 1.49 msaitoh "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
2014 1.49 msaitoh ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
2015 1.49 msaitoh CTL_CREATE, CTL_EOL) != 0)
2016 1.49 msaitoh break;
2017 1.49 msaitoh
2018 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2019 1.49 msaitoh CTLFLAG_READONLY,
2020 1.49 msaitoh CTLTYPE_INT,
2021 1.49 msaitoh "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
2022 1.49 msaitoh ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
2023 1.49 msaitoh CTL_CREATE, CTL_EOL) != 0)
2024 1.49 msaitoh break;
2025 1.49 msaitoh #endif
2026 1.49 msaitoh
2027 1.49 msaitoh evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
2028 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
2029 1.49 msaitoh evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
2030 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
2031 1.49 msaitoh evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
2032 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
2033 1.49 msaitoh evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
2034 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
2035 1.49 msaitoh evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
2036 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "Rx discarded");
2037 1.49 msaitoh #ifdef LRO
2038 1.49 msaitoh SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
2039 1.49 msaitoh CTLFLAG_RD, &lro->lro_queued, 0,
2040 1.49 msaitoh "LRO Queued");
2041 1.49 msaitoh SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
2042 1.49 msaitoh CTLFLAG_RD, &lro->lro_flushed, 0,
2043 1.49 msaitoh "LRO Flushed");
2044 1.49 msaitoh #endif /* LRO */
2045 1.49 msaitoh }
2046 1.49 msaitoh
2047 1.49 msaitoh /* MAC stats get the own sub node */
2048 1.49 msaitoh
2049 1.49 msaitoh snprintf(stats->namebuf,
2050 1.49 msaitoh sizeof(stats->namebuf), "%s MAC Statistics", xname);
2051 1.49 msaitoh
2052 1.49 msaitoh evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
2053 1.49 msaitoh stats->namebuf, "rx csum offload - IP");
2054 1.49 msaitoh evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
2055 1.49 msaitoh stats->namebuf, "rx csum offload - L4");
2056 1.49 msaitoh evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
2057 1.49 msaitoh stats->namebuf, "rx csum offload - IP bad");
2058 1.49 msaitoh evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
2059 1.49 msaitoh stats->namebuf, "rx csum offload - L4 bad");
2060 1.48 msaitoh
2061 1.49 msaitoh /* Packet Reception Stats */
2062 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgprc, EVCNT_TYPE_MISC, NULL,
2063 1.48 msaitoh xname, "Good Packets Received");
2064 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgorc, EVCNT_TYPE_MISC, NULL,
2065 1.48 msaitoh xname, "Good Octets Received");
2066 1.48 msaitoh evcnt_attach_dynamic(&stats->vfmprc, EVCNT_TYPE_MISC, NULL,
2067 1.48 msaitoh xname, "Multicast Packets Received");
2068 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgptc, EVCNT_TYPE_MISC, NULL,
2069 1.48 msaitoh xname, "Good Packets Transmitted");
2070 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgotc, EVCNT_TYPE_MISC, NULL,
2071 1.48 msaitoh xname, "Good Octets Transmitted");
2072 1.48 msaitoh }
2073 1.48 msaitoh
2074 1.48 msaitoh static void
2075 1.48 msaitoh ixv_set_sysctl_value(struct adapter *adapter, const char *name,
2076 1.48 msaitoh const char *description, int *limit, int value)
2077 1.48 msaitoh {
2078 1.48 msaitoh device_t dev = adapter->dev;
2079 1.48 msaitoh struct sysctllog **log;
2080 1.48 msaitoh const struct sysctlnode *rnode, *cnode;
2081 1.48 msaitoh
2082 1.48 msaitoh log = &adapter->sysctllog;
2083 1.48 msaitoh if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
2084 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl root\n");
2085 1.48 msaitoh return;
2086 1.48 msaitoh }
2087 1.48 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2088 1.48 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT,
2089 1.48 msaitoh name, SYSCTL_DESCR(description),
2090 1.48 msaitoh NULL, 0, limit, 0, CTL_CREATE, CTL_EOL) != 0)
2091 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2092 1.48 msaitoh *limit = value;
2093 1.48 msaitoh }
2094 1.57 msaitoh
2095 1.57 msaitoh /**********************************************************************
2096 1.57 msaitoh *
2097 1.57 msaitoh * This routine is called only when em_display_debug_stats is enabled.
2098 1.57 msaitoh * This routine provides a way to take a look at important statistics
2099 1.57 msaitoh * maintained by the driver and hardware.
2100 1.57 msaitoh *
2101 1.57 msaitoh **********************************************************************/
2102 1.57 msaitoh static void
2103 1.57 msaitoh ixv_print_debug_info(struct adapter *adapter)
2104 1.57 msaitoh {
2105 1.57 msaitoh device_t dev = adapter->dev;
2106 1.57 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2107 1.57 msaitoh struct ix_queue *que = adapter->queues;
2108 1.57 msaitoh struct rx_ring *rxr;
2109 1.57 msaitoh struct tx_ring *txr;
2110 1.57 msaitoh #ifdef LRO
2111 1.57 msaitoh struct lro_ctrl *lro;
2112 1.57 msaitoh #endif /* LRO */
2113 1.57 msaitoh
2114 1.57 msaitoh device_printf(dev,"Error Byte Count = %u \n",
2115 1.57 msaitoh IXGBE_READ_REG(hw, IXGBE_ERRBC));
2116 1.57 msaitoh
2117 1.57 msaitoh for (int i = 0; i < adapter->num_queues; i++, que++) {
2118 1.57 msaitoh txr = que->txr;
2119 1.57 msaitoh rxr = que->rxr;
2120 1.57 msaitoh #ifdef LRO
2121 1.57 msaitoh lro = &rxr->lro;
2122 1.57 msaitoh #endif /* LRO */
2123 1.57 msaitoh device_printf(dev,"QUE(%d) IRQs Handled: %lu\n",
2124 1.57 msaitoh que->msix, (long)que->irqs.ev_count);
2125 1.57 msaitoh device_printf(dev,"RX(%d) Packets Received: %lld\n",
2126 1.57 msaitoh rxr->me, (long long)rxr->rx_packets.ev_count);
2127 1.57 msaitoh device_printf(dev,"RX(%d) Bytes Received: %lu\n",
2128 1.57 msaitoh rxr->me, (long)rxr->rx_bytes.ev_count);
2129 1.57 msaitoh #ifdef LRO
2130 1.57 msaitoh device_printf(dev,"RX(%d) LRO Queued= %lld\n",
2131 1.57 msaitoh rxr->me, (long long)lro->lro_queued);
2132 1.57 msaitoh device_printf(dev,"RX(%d) LRO Flushed= %lld\n",
2133 1.57 msaitoh rxr->me, (long long)lro->lro_flushed);
2134 1.57 msaitoh #endif /* LRO */
2135 1.57 msaitoh device_printf(dev,"TX(%d) Packets Sent: %lu\n",
2136 1.57 msaitoh txr->me, (long)txr->total_packets.ev_count);
2137 1.57 msaitoh device_printf(dev,"TX(%d) NO Desc Avail: %lu\n",
2138 1.57 msaitoh txr->me, (long)txr->no_desc_avail.ev_count);
2139 1.57 msaitoh }
2140 1.57 msaitoh
2141 1.57 msaitoh device_printf(dev,"MBX IRQ Handled: %lu\n",
2142 1.57 msaitoh (long)adapter->link_irq.ev_count);
2143 1.57 msaitoh return;
2144 1.57 msaitoh }
2145 1.57 msaitoh
2146 1.57 msaitoh static int
2147 1.57 msaitoh ixv_sysctl_debug(SYSCTLFN_ARGS)
2148 1.57 msaitoh {
2149 1.57 msaitoh struct sysctlnode node;
2150 1.57 msaitoh int error, result;
2151 1.57 msaitoh struct adapter *adapter;
2152 1.57 msaitoh
2153 1.57 msaitoh node = *rnode;
2154 1.57 msaitoh adapter = (struct adapter *)node.sysctl_data;
2155 1.57 msaitoh node.sysctl_data = &result;
2156 1.57 msaitoh error = sysctl_lookup(SYSCTLFN_CALL(&node));
2157 1.57 msaitoh
2158 1.57 msaitoh if (error)
2159 1.57 msaitoh return error;
2160 1.57 msaitoh
2161 1.57 msaitoh if (result == 1)
2162 1.57 msaitoh ixv_print_debug_info(adapter);
2163 1.57 msaitoh
2164 1.57 msaitoh return 0;
2165 1.57 msaitoh }
2166 1.57 msaitoh
2167 1.57 msaitoh /*********************************************************************
2168 1.57 msaitoh *
2169 1.57 msaitoh * Shutdown entry point
2170 1.57 msaitoh *
2171 1.57 msaitoh **********************************************************************/
2172 1.57 msaitoh #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
2173 1.57 msaitoh static int
2174 1.57 msaitoh ixv_shutdown(device_t dev)
2175 1.57 msaitoh {
2176 1.57 msaitoh struct adapter *adapter = device_private(dev);
2177 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
2178 1.57 msaitoh ixv_stop(adapter);
2179 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
2180 1.57 msaitoh
2181 1.57 msaitoh return (0);
2182 1.57 msaitoh }
2183 1.57 msaitoh #endif
2184 1.57 msaitoh
2185 1.57 msaitoh static int
2186 1.57 msaitoh ixv_ifflags_cb(struct ethercom *ec)
2187 1.57 msaitoh {
2188 1.57 msaitoh struct ifnet *ifp = &ec->ec_if;
2189 1.57 msaitoh struct adapter *adapter = ifp->if_softc;
2190 1.57 msaitoh int change = ifp->if_flags ^ adapter->if_flags, rc = 0;
2191 1.57 msaitoh
2192 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
2193 1.57 msaitoh
2194 1.57 msaitoh if (change != 0)
2195 1.57 msaitoh adapter->if_flags = ifp->if_flags;
2196 1.57 msaitoh
2197 1.57 msaitoh if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0)
2198 1.57 msaitoh rc = ENETRESET;
2199 1.57 msaitoh
2200 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
2201 1.57 msaitoh
2202 1.57 msaitoh return rc;
2203 1.57 msaitoh }
2204 1.57 msaitoh
2205 1.57 msaitoh /*********************************************************************
2206 1.57 msaitoh * Ioctl entry point
2207 1.57 msaitoh *
2208 1.57 msaitoh * ixv_ioctl is called when the user wants to configure the
2209 1.57 msaitoh * interface.
2210 1.57 msaitoh *
2211 1.57 msaitoh * return 0 on success, positive on failure
2212 1.57 msaitoh **********************************************************************/
2213 1.57 msaitoh
2214 1.57 msaitoh static int
2215 1.57 msaitoh ixv_ioctl(struct ifnet * ifp, u_long command, void *data)
2216 1.57 msaitoh {
2217 1.57 msaitoh struct adapter *adapter = ifp->if_softc;
2218 1.57 msaitoh struct ifcapreq *ifcr = data;
2219 1.57 msaitoh struct ifreq *ifr = (struct ifreq *) data;
2220 1.57 msaitoh int error = 0;
2221 1.57 msaitoh int l4csum_en;
2222 1.57 msaitoh const int l4csum = IFCAP_CSUM_TCPv4_Rx|IFCAP_CSUM_UDPv4_Rx|
2223 1.57 msaitoh IFCAP_CSUM_TCPv6_Rx|IFCAP_CSUM_UDPv6_Rx;
2224 1.57 msaitoh
2225 1.57 msaitoh switch (command) {
2226 1.57 msaitoh case SIOCSIFFLAGS:
2227 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
2228 1.57 msaitoh break;
2229 1.57 msaitoh case SIOCADDMULTI:
2230 1.57 msaitoh case SIOCDELMULTI:
2231 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
2232 1.57 msaitoh break;
2233 1.57 msaitoh case SIOCSIFMEDIA:
2234 1.57 msaitoh case SIOCGIFMEDIA:
2235 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
2236 1.57 msaitoh break;
2237 1.57 msaitoh case SIOCSIFCAP:
2238 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
2239 1.57 msaitoh break;
2240 1.57 msaitoh case SIOCSIFMTU:
2241 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
2242 1.57 msaitoh break;
2243 1.57 msaitoh default:
2244 1.57 msaitoh IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
2245 1.57 msaitoh break;
2246 1.57 msaitoh }
2247 1.57 msaitoh
2248 1.57 msaitoh switch (command) {
2249 1.57 msaitoh case SIOCSIFMEDIA:
2250 1.57 msaitoh case SIOCGIFMEDIA:
2251 1.57 msaitoh return ifmedia_ioctl(ifp, ifr, &adapter->media, command);
2252 1.57 msaitoh case SIOCSIFCAP:
2253 1.57 msaitoh /* Layer-4 Rx checksum offload has to be turned on and
2254 1.57 msaitoh * off as a unit.
2255 1.57 msaitoh */
2256 1.57 msaitoh l4csum_en = ifcr->ifcr_capenable & l4csum;
2257 1.57 msaitoh if (l4csum_en != l4csum && l4csum_en != 0)
2258 1.57 msaitoh return EINVAL;
2259 1.57 msaitoh /*FALLTHROUGH*/
2260 1.57 msaitoh case SIOCADDMULTI:
2261 1.57 msaitoh case SIOCDELMULTI:
2262 1.57 msaitoh case SIOCSIFFLAGS:
2263 1.57 msaitoh case SIOCSIFMTU:
2264 1.57 msaitoh default:
2265 1.57 msaitoh if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
2266 1.57 msaitoh return error;
2267 1.57 msaitoh if ((ifp->if_flags & IFF_RUNNING) == 0)
2268 1.57 msaitoh ;
2269 1.57 msaitoh else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
2270 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
2271 1.57 msaitoh ixv_init_locked(adapter);
2272 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
2273 1.57 msaitoh } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
2274 1.57 msaitoh /*
2275 1.57 msaitoh * Multicast list has changed; set the hardware filter
2276 1.57 msaitoh * accordingly.
2277 1.57 msaitoh */
2278 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
2279 1.57 msaitoh ixv_disable_intr(adapter);
2280 1.57 msaitoh ixv_set_multi(adapter);
2281 1.57 msaitoh ixv_enable_intr(adapter);
2282 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
2283 1.57 msaitoh }
2284 1.57 msaitoh return 0;
2285 1.57 msaitoh }
2286 1.57 msaitoh }
2287 1.57 msaitoh
2288 1.57 msaitoh static int
2289 1.57 msaitoh ixv_init(struct ifnet *ifp)
2290 1.57 msaitoh {
2291 1.57 msaitoh struct adapter *adapter = ifp->if_softc;
2292 1.57 msaitoh
2293 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
2294 1.57 msaitoh ixv_init_locked(adapter);
2295 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
2296 1.57 msaitoh
2297 1.57 msaitoh return 0;
2298 1.57 msaitoh }
2299 1.57 msaitoh
2300 1.57 msaitoh
2301 1.57 msaitoh static void
2302 1.57 msaitoh ixv_handle_que(void *context)
2303 1.57 msaitoh {
2304 1.57 msaitoh struct ix_queue *que = context;
2305 1.57 msaitoh struct adapter *adapter = que->adapter;
2306 1.57 msaitoh struct tx_ring *txr = que->txr;
2307 1.57 msaitoh struct ifnet *ifp = adapter->ifp;
2308 1.57 msaitoh bool more;
2309 1.57 msaitoh
2310 1.57 msaitoh adapter->handleq.ev_count++;
2311 1.57 msaitoh
2312 1.57 msaitoh if (ifp->if_flags & IFF_RUNNING) {
2313 1.57 msaitoh more = ixgbe_rxeof(que);
2314 1.57 msaitoh IXGBE_TX_LOCK(txr);
2315 1.57 msaitoh ixgbe_txeof(txr);
2316 1.57 msaitoh #ifndef IXGBE_LEGACY_TX
2317 1.57 msaitoh if (pcq_peek(txr->txr_interq) != NULL)
2318 1.57 msaitoh ixgbe_mq_start_locked(ifp, txr);
2319 1.57 msaitoh #endif
2320 1.57 msaitoh /* Only for queue 0 */
2321 1.57 msaitoh if ((&adapter->queues[0] == que)
2322 1.57 msaitoh && (!IFQ_IS_EMPTY(&ifp->if_snd)))
2323 1.57 msaitoh ixgbe_start_locked(txr, ifp);
2324 1.57 msaitoh IXGBE_TX_UNLOCK(txr);
2325 1.57 msaitoh if (more) {
2326 1.57 msaitoh adapter->req.ev_count++;
2327 1.57 msaitoh softint_schedule(que->que_si);
2328 1.57 msaitoh return;
2329 1.57 msaitoh }
2330 1.57 msaitoh }
2331 1.57 msaitoh
2332 1.57 msaitoh /* Reenable this interrupt */
2333 1.57 msaitoh ixv_enable_queue(adapter, que->msix);
2334 1.57 msaitoh
2335 1.57 msaitoh return;
2336 1.57 msaitoh }
2337 1.57 msaitoh
2338 1.57 msaitoh /*********************************************************************
2339 1.57 msaitoh *
2340 1.57 msaitoh * Setup MSIX Interrupt resources and handlers
2341 1.57 msaitoh *
2342 1.57 msaitoh **********************************************************************/
2343 1.57 msaitoh static int
2344 1.57 msaitoh ixv_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
2345 1.57 msaitoh {
2346 1.57 msaitoh device_t dev = adapter->dev;
2347 1.57 msaitoh struct ix_queue *que = adapter->queues;
2348 1.57 msaitoh struct tx_ring *txr = adapter->tx_rings;
2349 1.57 msaitoh int error, rid, vector = 0;
2350 1.57 msaitoh pci_chipset_tag_t pc;
2351 1.57 msaitoh pcitag_t tag;
2352 1.57 msaitoh char intrbuf[PCI_INTRSTR_LEN];
2353 1.57 msaitoh char intr_xname[32];
2354 1.57 msaitoh const char *intrstr = NULL;
2355 1.57 msaitoh kcpuset_t *affinity;
2356 1.57 msaitoh int cpu_id = 0;
2357 1.57 msaitoh
2358 1.57 msaitoh pc = adapter->osdep.pc;
2359 1.57 msaitoh tag = adapter->osdep.tag;
2360 1.57 msaitoh
2361 1.57 msaitoh adapter->osdep.nintrs = adapter->num_queues + 1;
2362 1.57 msaitoh if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
2363 1.57 msaitoh adapter->osdep.nintrs) != 0) {
2364 1.57 msaitoh aprint_error_dev(dev,
2365 1.57 msaitoh "failed to allocate MSI-X interrupt\n");
2366 1.57 msaitoh return (ENXIO);
2367 1.57 msaitoh }
2368 1.57 msaitoh
2369 1.57 msaitoh kcpuset_create(&affinity, false);
2370 1.57 msaitoh for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
2371 1.57 msaitoh snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
2372 1.57 msaitoh device_xname(dev), i);
2373 1.57 msaitoh intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
2374 1.57 msaitoh sizeof(intrbuf));
2375 1.57 msaitoh #ifdef IXGBE_MPSAFE
2376 1.57 msaitoh pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
2377 1.57 msaitoh true);
2378 1.57 msaitoh #endif
2379 1.57 msaitoh /* Set the handler function */
2380 1.57 msaitoh que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
2381 1.57 msaitoh adapter->osdep.intrs[i], IPL_NET, ixv_msix_que, que,
2382 1.57 msaitoh intr_xname);
2383 1.57 msaitoh if (que->res == NULL) {
2384 1.57 msaitoh pci_intr_release(pc, adapter->osdep.intrs,
2385 1.57 msaitoh adapter->osdep.nintrs);
2386 1.57 msaitoh aprint_error_dev(dev,
2387 1.57 msaitoh "Failed to register QUE handler\n");
2388 1.57 msaitoh kcpuset_destroy(affinity);
2389 1.57 msaitoh return (ENXIO);
2390 1.57 msaitoh }
2391 1.57 msaitoh que->msix = vector;
2392 1.57 msaitoh adapter->active_queues |= (u64)(1 << que->msix);
2393 1.57 msaitoh
2394 1.57 msaitoh cpu_id = i;
2395 1.57 msaitoh /* Round-robin affinity */
2396 1.57 msaitoh kcpuset_zero(affinity);
2397 1.57 msaitoh kcpuset_set(affinity, cpu_id % ncpu);
2398 1.57 msaitoh error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
2399 1.57 msaitoh NULL);
2400 1.57 msaitoh aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
2401 1.57 msaitoh intrstr);
2402 1.57 msaitoh if (error == 0)
2403 1.57 msaitoh aprint_normal(", bound queue %d to cpu %d\n",
2404 1.57 msaitoh i, cpu_id % ncpu);
2405 1.57 msaitoh else
2406 1.57 msaitoh aprint_normal("\n");
2407 1.57 msaitoh
2408 1.57 msaitoh #ifndef IXGBE_LEGACY_TX
2409 1.57 msaitoh txr->txr_si
2410 1.57 msaitoh = softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
2411 1.57 msaitoh ixgbe_deferred_mq_start, txr);
2412 1.57 msaitoh #endif
2413 1.57 msaitoh que->que_si
2414 1.57 msaitoh = softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
2415 1.57 msaitoh ixv_handle_que, que);
2416 1.57 msaitoh if (que->que_si == NULL) {
2417 1.57 msaitoh aprint_error_dev(dev,
2418 1.57 msaitoh "could not establish software interrupt\n");
2419 1.57 msaitoh }
2420 1.57 msaitoh }
2421 1.57 msaitoh
2422 1.57 msaitoh /* and Mailbox */
2423 1.57 msaitoh cpu_id++;
2424 1.57 msaitoh snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
2425 1.57 msaitoh intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
2426 1.57 msaitoh sizeof(intrbuf));
2427 1.57 msaitoh #ifdef IXGBE_MPSAFE
2428 1.57 msaitoh pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
2429 1.57 msaitoh true);
2430 1.57 msaitoh #endif
2431 1.57 msaitoh /* Set the mbx handler function */
2432 1.57 msaitoh adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
2433 1.57 msaitoh adapter->osdep.intrs[vector], IPL_NET, ixv_msix_mbx, adapter,
2434 1.57 msaitoh intr_xname);
2435 1.57 msaitoh if (adapter->osdep.ihs[vector] == NULL) {
2436 1.57 msaitoh adapter->res = NULL;
2437 1.57 msaitoh aprint_error_dev(dev, "Failed to register LINK handler\n");
2438 1.57 msaitoh kcpuset_destroy(affinity);
2439 1.57 msaitoh return (ENXIO);
2440 1.57 msaitoh }
2441 1.57 msaitoh /* Round-robin affinity */
2442 1.57 msaitoh kcpuset_zero(affinity);
2443 1.57 msaitoh kcpuset_set(affinity, cpu_id % ncpu);
2444 1.57 msaitoh error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,NULL);
2445 1.57 msaitoh
2446 1.57 msaitoh aprint_normal_dev(dev,
2447 1.57 msaitoh "for link, interrupting at %s", intrstr);
2448 1.57 msaitoh if (error == 0)
2449 1.57 msaitoh aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
2450 1.57 msaitoh else
2451 1.57 msaitoh aprint_normal("\n");
2452 1.57 msaitoh
2453 1.57 msaitoh adapter->vector = vector;
2454 1.57 msaitoh /* Tasklets for Mailbox */
2455 1.57 msaitoh adapter->link_si = softint_establish(SOFTINT_NET |IXGBE_SOFTINFT_FLAGS,
2456 1.57 msaitoh ixv_handle_mbx, adapter);
2457 1.57 msaitoh /*
2458 1.57 msaitoh ** Due to a broken design QEMU will fail to properly
2459 1.57 msaitoh ** enable the guest for MSIX unless the vectors in
2460 1.57 msaitoh ** the table are all set up, so we must rewrite the
2461 1.57 msaitoh ** ENABLE in the MSIX control register again at this
2462 1.57 msaitoh ** point to cause it to successfully initialize us.
2463 1.57 msaitoh */
2464 1.57 msaitoh if (adapter->hw.mac.type == ixgbe_mac_82599_vf) {
2465 1.57 msaitoh int msix_ctrl;
2466 1.57 msaitoh pci_get_capability(pc, tag, PCI_CAP_MSIX, &rid, NULL);
2467 1.57 msaitoh rid += PCI_MSIX_CTL;
2468 1.57 msaitoh msix_ctrl = pci_conf_read(pc, tag, rid);
2469 1.57 msaitoh msix_ctrl |= PCI_MSIX_CTL_ENABLE;
2470 1.57 msaitoh pci_conf_write(pc, tag, rid, msix_ctrl);
2471 1.57 msaitoh }
2472 1.57 msaitoh
2473 1.57 msaitoh kcpuset_destroy(affinity);
2474 1.57 msaitoh return (0);
2475 1.57 msaitoh }
2476 1.57 msaitoh
2477 1.57 msaitoh /*
2478 1.57 msaitoh * Setup MSIX resources, note that the VF
2479 1.57 msaitoh * device MUST use MSIX, there is no fallback.
2480 1.57 msaitoh */
2481 1.57 msaitoh static int
2482 1.57 msaitoh ixv_setup_msix(struct adapter *adapter)
2483 1.57 msaitoh {
2484 1.57 msaitoh device_t dev = adapter->dev;
2485 1.57 msaitoh int want, queues, msgs;
2486 1.57 msaitoh
2487 1.57 msaitoh /* Must have at least 2 MSIX vectors */
2488 1.57 msaitoh msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
2489 1.57 msaitoh if (msgs < 2) {
2490 1.57 msaitoh aprint_error_dev(dev,"MSIX config error\n");
2491 1.57 msaitoh return (ENXIO);
2492 1.57 msaitoh }
2493 1.57 msaitoh msgs = MIN(msgs, IXG_MAX_NINTR);
2494 1.57 msaitoh
2495 1.57 msaitoh /* Figure out a reasonable auto config value */
2496 1.57 msaitoh queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
2497 1.57 msaitoh
2498 1.57 msaitoh if (ixv_num_queues != 0)
2499 1.57 msaitoh queues = ixv_num_queues;
2500 1.57 msaitoh else if ((ixv_num_queues == 0) && (queues > IXGBE_VF_MAX_TX_QUEUES))
2501 1.57 msaitoh queues = IXGBE_VF_MAX_TX_QUEUES;
2502 1.57 msaitoh
2503 1.57 msaitoh /*
2504 1.57 msaitoh ** Want vectors for the queues,
2505 1.57 msaitoh ** plus an additional for mailbox.
2506 1.57 msaitoh */
2507 1.57 msaitoh want = queues + 1;
2508 1.57 msaitoh if (msgs >= want)
2509 1.57 msaitoh msgs = want;
2510 1.57 msaitoh else {
2511 1.57 msaitoh aprint_error_dev(dev,
2512 1.57 msaitoh "MSIX Configuration Problem, "
2513 1.57 msaitoh "%d vectors but %d queues wanted!\n",
2514 1.57 msaitoh msgs, want);
2515 1.57 msaitoh return -1;
2516 1.57 msaitoh }
2517 1.57 msaitoh
2518 1.57 msaitoh adapter->msix_mem = (void *)1; /* XXX */
2519 1.57 msaitoh aprint_normal_dev(dev,
2520 1.57 msaitoh "Using MSIX interrupts with %d vectors\n", msgs);
2521 1.57 msaitoh adapter->num_queues = queues;
2522 1.57 msaitoh return (msgs);
2523 1.57 msaitoh }
2524 1.57 msaitoh
2525 1.57 msaitoh /*
2526 1.57 msaitoh ** Tasklet handler for MSIX MBX interrupts
2527 1.57 msaitoh ** - do outside interrupt since it might sleep
2528 1.57 msaitoh */
2529 1.57 msaitoh static void
2530 1.57 msaitoh ixv_handle_mbx(void *context)
2531 1.57 msaitoh {
2532 1.57 msaitoh struct adapter *adapter = context;
2533 1.57 msaitoh
2534 1.57 msaitoh ixgbe_check_link(&adapter->hw,
2535 1.57 msaitoh &adapter->link_speed, &adapter->link_up, 0);
2536 1.57 msaitoh ixv_update_link_status(adapter);
2537 1.57 msaitoh }
2538 1.57 msaitoh
2539 1.57 msaitoh
2540 1.57 msaitoh static void
2541 1.57 msaitoh ixv_config_link(struct adapter *adapter)
2542 1.57 msaitoh {
2543 1.57 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2544 1.57 msaitoh
2545 1.57 msaitoh if (hw->mac.ops.check_link)
2546 1.57 msaitoh hw->mac.ops.check_link(hw, &adapter->link_speed,
2547 1.57 msaitoh &adapter->link_up, FALSE);
2548 1.57 msaitoh }
2549 1.57 msaitoh
2550 1.57 msaitoh
2551