ixv.c revision 1.185 1 1.185 msaitoh /* $NetBSD: ixv.c,v 1.185 2023/10/06 14:34:23 msaitoh Exp $ */
2 1.58 msaitoh
3 1.1 dyoung /******************************************************************************
4 1.1 dyoung
5 1.58 msaitoh Copyright (c) 2001-2017, Intel Corporation
6 1.1 dyoung All rights reserved.
7 1.58 msaitoh
8 1.58 msaitoh Redistribution and use in source and binary forms, with or without
9 1.1 dyoung modification, are permitted provided that the following conditions are met:
10 1.58 msaitoh
11 1.58 msaitoh 1. Redistributions of source code must retain the above copyright notice,
12 1.1 dyoung this list of conditions and the following disclaimer.
13 1.58 msaitoh
14 1.58 msaitoh 2. Redistributions in binary form must reproduce the above copyright
15 1.58 msaitoh notice, this list of conditions and the following disclaimer in the
16 1.1 dyoung documentation and/or other materials provided with the distribution.
17 1.58 msaitoh
18 1.58 msaitoh 3. Neither the name of the Intel Corporation nor the names of its
19 1.58 msaitoh contributors may be used to endorse or promote products derived from
20 1.1 dyoung this software without specific prior written permission.
21 1.58 msaitoh
22 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 1.58 msaitoh AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.58 msaitoh IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.58 msaitoh ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 1.58 msaitoh LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 1.58 msaitoh CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 1.58 msaitoh SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 1.58 msaitoh INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 1.58 msaitoh CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 1.1 dyoung POSSIBILITY OF SUCH DAMAGE.
33 1.1 dyoung
34 1.1 dyoung ******************************************************************************/
35 1.92 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/if_ixv.c 331224 2018-03-19 20:55:05Z erj $*/
36 1.1 dyoung
37 1.159 msaitoh #include <sys/cdefs.h>
38 1.185 msaitoh __KERNEL_RCSID(0, "$NetBSD: ixv.c,v 1.185 2023/10/06 14:34:23 msaitoh Exp $");
39 1.159 msaitoh
40 1.55 msaitoh #ifdef _KERNEL_OPT
41 1.1 dyoung #include "opt_inet.h"
42 1.4 msaitoh #include "opt_inet6.h"
43 1.55 msaitoh #include "opt_net_mpsafe.h"
44 1.55 msaitoh #endif
45 1.1 dyoung
46 1.21 msaitoh #include "ixgbe.h"
47 1.1 dyoung
48 1.58 msaitoh /************************************************************************
49 1.58 msaitoh * Driver version
50 1.58 msaitoh ************************************************************************/
51 1.103 maxv static const char ixv_driver_version[] = "2.0.1-k";
52 1.117 msaitoh /* XXX NetBSD: + 1.5.17 */
53 1.58 msaitoh
54 1.58 msaitoh /************************************************************************
55 1.58 msaitoh * PCI Device ID Table
56 1.58 msaitoh *
57 1.58 msaitoh * Used by probe to select devices to load on
58 1.58 msaitoh * Last field stores an index into ixv_strings
59 1.58 msaitoh * Last entry must be all 0s
60 1.1 dyoung *
61 1.58 msaitoh * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
62 1.58 msaitoh ************************************************************************/
63 1.103 maxv static const ixgbe_vendor_info_t ixv_vendor_info_array[] =
64 1.1 dyoung {
65 1.1 dyoung {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, 0, 0, 0},
66 1.5 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, 0, 0, 0},
67 1.21 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550_VF, 0, 0, 0},
68 1.21 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_VF, 0, 0, 0},
69 1.58 msaitoh {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_VF, 0, 0, 0},
70 1.1 dyoung /* required last entry */
71 1.1 dyoung {0, 0, 0, 0, 0}
72 1.1 dyoung };
73 1.1 dyoung
74 1.58 msaitoh /************************************************************************
75 1.58 msaitoh * Table of branding strings
76 1.58 msaitoh ************************************************************************/
77 1.58 msaitoh static const char *ixv_strings[] = {
78 1.1 dyoung "Intel(R) PRO/10GbE Virtual Function Network Driver"
79 1.1 dyoung };
80 1.1 dyoung
81 1.1 dyoung /*********************************************************************
82 1.1 dyoung * Function prototypes
83 1.1 dyoung *********************************************************************/
84 1.114 msaitoh static int ixv_probe(device_t, cfdata_t, void *);
85 1.22 msaitoh static void ixv_attach(device_t, device_t, void *);
86 1.114 msaitoh static int ixv_detach(device_t, int);
87 1.3 msaitoh #if 0
88 1.114 msaitoh static int ixv_shutdown(device_t);
89 1.3 msaitoh #endif
90 1.57 msaitoh static int ixv_ifflags_cb(struct ethercom *);
91 1.114 msaitoh static int ixv_ioctl(struct ifnet *, u_long, void *);
92 1.3 msaitoh static int ixv_init(struct ifnet *);
93 1.1 dyoung static void ixv_init_locked(struct adapter *);
94 1.56 msaitoh static void ixv_ifstop(struct ifnet *, int);
95 1.153 msaitoh static void ixv_stop_locked(void *);
96 1.114 msaitoh static void ixv_init_device_features(struct adapter *);
97 1.114 msaitoh static void ixv_media_status(struct ifnet *, struct ifmediareq *);
98 1.114 msaitoh static int ixv_media_change(struct ifnet *);
99 1.114 msaitoh static int ixv_allocate_pci_resources(struct adapter *,
100 1.3 msaitoh const struct pci_attach_args *);
101 1.154 msaitoh static void ixv_free_deferred_handlers(struct adapter *);
102 1.114 msaitoh static int ixv_allocate_msix(struct adapter *,
103 1.11 msaitoh const struct pci_attach_args *);
104 1.114 msaitoh static int ixv_configure_interrupts(struct adapter *);
105 1.1 dyoung static void ixv_free_pci_resources(struct adapter *);
106 1.114 msaitoh static void ixv_local_timer(void *);
107 1.151 msaitoh static void ixv_handle_timer(struct work *, void *);
108 1.114 msaitoh static int ixv_setup_interface(device_t, struct adapter *);
109 1.151 msaitoh static void ixv_schedule_admin_tasklet(struct adapter *);
110 1.114 msaitoh static int ixv_negotiate_api(struct adapter *);
111 1.114 msaitoh
112 1.114 msaitoh static void ixv_initialize_transmit_units(struct adapter *);
113 1.114 msaitoh static void ixv_initialize_receive_units(struct adapter *);
114 1.114 msaitoh static void ixv_initialize_rss_mapping(struct adapter *);
115 1.117 msaitoh static s32 ixv_check_link(struct adapter *);
116 1.114 msaitoh
117 1.114 msaitoh static void ixv_enable_intr(struct adapter *);
118 1.114 msaitoh static void ixv_disable_intr(struct adapter *);
119 1.138 msaitoh static int ixv_set_rxfilter(struct adapter *);
120 1.114 msaitoh static void ixv_update_link_status(struct adapter *);
121 1.3 msaitoh static int ixv_sysctl_debug(SYSCTLFN_PROTO);
122 1.1 dyoung static void ixv_set_ivar(struct adapter *, u8, u8, s8);
123 1.1 dyoung static void ixv_configure_ivars(struct adapter *);
124 1.1 dyoung static u8 * ixv_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
125 1.95 msaitoh static void ixv_eitr_write(struct adapter *, uint32_t, uint32_t);
126 1.1 dyoung
127 1.126 msaitoh static void ixv_setup_vlan_tagging(struct adapter *);
128 1.120 msaitoh static int ixv_setup_vlan_support(struct adapter *);
129 1.120 msaitoh static int ixv_vlan_cb(struct ethercom *, uint16_t, bool);
130 1.128 msaitoh static int ixv_register_vlan(struct adapter *, u16);
131 1.128 msaitoh static int ixv_unregister_vlan(struct adapter *, u16);
132 1.1 dyoung
133 1.48 msaitoh static void ixv_add_device_sysctls(struct adapter *);
134 1.1 dyoung static void ixv_init_stats(struct adapter *);
135 1.1 dyoung static void ixv_update_stats(struct adapter *);
136 1.21 msaitoh static void ixv_add_stats_sysctls(struct adapter *);
137 1.131 msaitoh static void ixv_clear_evcnt(struct adapter *);
138 1.83 msaitoh
139 1.83 msaitoh /* Sysctl handlers */
140 1.114 msaitoh static int ixv_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
141 1.114 msaitoh static int ixv_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
142 1.164 msaitoh static int ixv_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
143 1.114 msaitoh static int ixv_sysctl_rdh_handler(SYSCTLFN_PROTO);
144 1.114 msaitoh static int ixv_sysctl_rdt_handler(SYSCTLFN_PROTO);
145 1.114 msaitoh static int ixv_sysctl_tdt_handler(SYSCTLFN_PROTO);
146 1.114 msaitoh static int ixv_sysctl_tdh_handler(SYSCTLFN_PROTO);
147 1.179 msaitoh static int ixv_sysctl_tx_process_limit(SYSCTLFN_PROTO);
148 1.179 msaitoh static int ixv_sysctl_rx_process_limit(SYSCTLFN_PROTO);
149 1.163 msaitoh static int ixv_sysctl_rx_copy_len(SYSCTLFN_PROTO);
150 1.1 dyoung
151 1.58 msaitoh /* The MSI-X Interrupt handlers */
152 1.11 msaitoh static int ixv_msix_que(void *);
153 1.11 msaitoh static int ixv_msix_mbx(void *);
154 1.1 dyoung
155 1.151 msaitoh /* Event handlers running on workqueue */
156 1.3 msaitoh static void ixv_handle_que(void *);
157 1.3 msaitoh
158 1.151 msaitoh /* Deferred workqueue handlers */
159 1.151 msaitoh static void ixv_handle_admin(struct work *, void *);
160 1.84 knakahar static void ixv_handle_que_work(struct work *, void *);
161 1.84 knakahar
162 1.3 msaitoh const struct sysctlnode *ixv_sysctl_instance(struct adapter *);
163 1.103 maxv static const ixgbe_vendor_info_t *ixv_lookup(const struct pci_attach_args *);
164 1.1 dyoung
165 1.58 msaitoh /************************************************************************
166 1.150 msaitoh * NetBSD Device Interface Entry Points
167 1.58 msaitoh ************************************************************************/
168 1.3 msaitoh CFATTACH_DECL3_NEW(ixv, sizeof(struct adapter),
169 1.3 msaitoh ixv_probe, ixv_attach, ixv_detach, NULL, NULL, NULL,
170 1.3 msaitoh DVF_DETACH_SHUTDOWN);
171 1.3 msaitoh
172 1.1 dyoung #if 0
173 1.1 dyoung static driver_t ixv_driver = {
174 1.21 msaitoh "ixv", ixv_methods, sizeof(struct adapter),
175 1.1 dyoung };
176 1.1 dyoung
177 1.22 msaitoh devclass_t ixv_devclass;
178 1.22 msaitoh DRIVER_MODULE(ixv, pci, ixv_driver, ixv_devclass, 0, 0);
179 1.1 dyoung MODULE_DEPEND(ixv, pci, 1, 1, 1);
180 1.1 dyoung MODULE_DEPEND(ixv, ether, 1, 1, 1);
181 1.1 dyoung #endif
182 1.1 dyoung
183 1.1 dyoung /*
184 1.58 msaitoh * TUNEABLE PARAMETERS:
185 1.58 msaitoh */
186 1.1 dyoung
187 1.58 msaitoh /* Number of Queues - do not exceed MSI-X vectors - 1 */
188 1.44 msaitoh static int ixv_num_queues = 0;
189 1.23 msaitoh #define TUNABLE_INT(__x, __y)
190 1.23 msaitoh TUNABLE_INT("hw.ixv.num_queues", &ixv_num_queues);
191 1.23 msaitoh
192 1.1 dyoung /*
193 1.58 msaitoh * AIM: Adaptive Interrupt Moderation
194 1.58 msaitoh * which means that the interrupt rate
195 1.58 msaitoh * is varied over time based on the
196 1.58 msaitoh * traffic for that interrupt vector
197 1.58 msaitoh */
198 1.50 msaitoh static bool ixv_enable_aim = false;
199 1.1 dyoung TUNABLE_INT("hw.ixv.enable_aim", &ixv_enable_aim);
200 1.1 dyoung
201 1.83 msaitoh static int ixv_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
202 1.83 msaitoh TUNABLE_INT("hw.ixv.max_interrupt_rate", &ixv_max_interrupt_rate);
203 1.83 msaitoh
204 1.1 dyoung /* How many packets rxeof tries to clean at a time */
205 1.21 msaitoh static int ixv_rx_process_limit = 256;
206 1.1 dyoung TUNABLE_INT("hw.ixv.rx_process_limit", &ixv_rx_process_limit);
207 1.1 dyoung
208 1.21 msaitoh /* How many packets txeof tries to clean at a time */
209 1.21 msaitoh static int ixv_tx_process_limit = 256;
210 1.21 msaitoh TUNABLE_INT("hw.ixv.tx_process_limit", &ixv_tx_process_limit);
211 1.1 dyoung
212 1.112 msaitoh /* Which packet processing uses workqueue or softint */
213 1.84 knakahar static bool ixv_txrx_workqueue = false;
214 1.84 knakahar
215 1.1 dyoung /*
216 1.58 msaitoh * Number of TX descriptors per ring,
217 1.58 msaitoh * setting higher than RX as this seems
218 1.58 msaitoh * the better performing choice.
219 1.58 msaitoh */
220 1.64 msaitoh static int ixv_txd = PERFORM_TXD;
221 1.1 dyoung TUNABLE_INT("hw.ixv.txd", &ixv_txd);
222 1.1 dyoung
223 1.1 dyoung /* Number of RX descriptors per ring */
224 1.64 msaitoh static int ixv_rxd = PERFORM_RXD;
225 1.1 dyoung TUNABLE_INT("hw.ixv.rxd", &ixv_rxd);
226 1.1 dyoung
227 1.58 msaitoh /* Legacy Transmit (single queue) */
228 1.58 msaitoh static int ixv_enable_legacy_tx = 0;
229 1.58 msaitoh TUNABLE_INT("hw.ixv.enable_legacy_tx", &ixv_enable_legacy_tx);
230 1.58 msaitoh
231 1.55 msaitoh #ifdef NET_MPSAFE
232 1.55 msaitoh #define IXGBE_MPSAFE 1
233 1.55 msaitoh #define IXGBE_CALLOUT_FLAGS CALLOUT_MPSAFE
234 1.149 msaitoh #define IXGBE_SOFTINT_FLAGS SOFTINT_MPSAFE
235 1.84 knakahar #define IXGBE_WORKQUEUE_FLAGS WQ_PERCPU | WQ_MPSAFE
236 1.151 msaitoh #define IXGBE_TASKLET_WQ_FLAGS WQ_MPSAFE
237 1.55 msaitoh #else
238 1.55 msaitoh #define IXGBE_CALLOUT_FLAGS 0
239 1.149 msaitoh #define IXGBE_SOFTINT_FLAGS 0
240 1.84 knakahar #define IXGBE_WORKQUEUE_FLAGS WQ_PERCPU
241 1.151 msaitoh #define IXGBE_TASKLET_WQ_FLAGS 0
242 1.55 msaitoh #endif
243 1.84 knakahar #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
244 1.55 msaitoh
245 1.58 msaitoh #if 0
246 1.58 msaitoh static int (*ixv_start_locked)(struct ifnet *, struct tx_ring *);
247 1.58 msaitoh static int (*ixv_ring_empty)(struct ifnet *, struct buf_ring *);
248 1.58 msaitoh #endif
249 1.58 msaitoh
250 1.58 msaitoh /************************************************************************
251 1.58 msaitoh * ixv_probe - Device identification routine
252 1.1 dyoung *
253 1.58 msaitoh * Determines if the driver should be loaded on
254 1.58 msaitoh * adapter based on its PCI vendor/device ID.
255 1.1 dyoung *
256 1.58 msaitoh * return BUS_PROBE_DEFAULT on success, positive on failure
257 1.58 msaitoh ************************************************************************/
258 1.1 dyoung static int
259 1.3 msaitoh ixv_probe(device_t dev, cfdata_t cf, void *aux)
260 1.3 msaitoh {
261 1.19 knakahar #ifdef __HAVE_PCI_MSI_MSIX
262 1.3 msaitoh const struct pci_attach_args *pa = aux;
263 1.3 msaitoh
264 1.3 msaitoh return (ixv_lookup(pa) != NULL) ? 1 : 0;
265 1.18 msaitoh #else
266 1.18 msaitoh return 0;
267 1.18 msaitoh #endif
268 1.58 msaitoh } /* ixv_probe */
269 1.3 msaitoh
270 1.103 maxv static const ixgbe_vendor_info_t *
271 1.3 msaitoh ixv_lookup(const struct pci_attach_args *pa)
272 1.1 dyoung {
273 1.103 maxv const ixgbe_vendor_info_t *ent;
274 1.3 msaitoh pcireg_t subid;
275 1.1 dyoung
276 1.31 msaitoh INIT_DEBUGOUT("ixv_lookup: begin");
277 1.1 dyoung
278 1.3 msaitoh if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
279 1.3 msaitoh return NULL;
280 1.1 dyoung
281 1.3 msaitoh subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
282 1.1 dyoung
283 1.3 msaitoh for (ent = ixv_vendor_info_array; ent->vendor_id != 0; ent++) {
284 1.3 msaitoh if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
285 1.3 msaitoh (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
286 1.3 msaitoh ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
287 1.1 dyoung (ent->subvendor_id == 0)) &&
288 1.3 msaitoh ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
289 1.1 dyoung (ent->subdevice_id == 0))) {
290 1.3 msaitoh return ent;
291 1.1 dyoung }
292 1.1 dyoung }
293 1.58 msaitoh
294 1.3 msaitoh return NULL;
295 1.3 msaitoh }
296 1.3 msaitoh
297 1.58 msaitoh /************************************************************************
298 1.58 msaitoh * ixv_attach - Device initialization routine
299 1.57 msaitoh *
300 1.58 msaitoh * Called when the driver is being loaded.
301 1.58 msaitoh * Identifies the type of hardware, allocates all resources
302 1.58 msaitoh * and initializes the hardware.
303 1.57 msaitoh *
304 1.58 msaitoh * return 0 on success, positive on failure
305 1.58 msaitoh ************************************************************************/
306 1.3 msaitoh static void
307 1.3 msaitoh ixv_attach(device_t parent, device_t dev, void *aux)
308 1.1 dyoung {
309 1.1 dyoung struct adapter *adapter;
310 1.1 dyoung struct ixgbe_hw *hw;
311 1.114 msaitoh int error = 0;
312 1.58 msaitoh pcireg_t id, subid;
313 1.103 maxv const ixgbe_vendor_info_t *ent;
314 1.3 msaitoh const struct pci_attach_args *pa = aux;
315 1.60 msaitoh const char *apivstr;
316 1.66 msaitoh const char *str;
317 1.151 msaitoh char wqname[MAXCOMLEN];
318 1.63 msaitoh char buf[256];
319 1.63 msaitoh
320 1.1 dyoung INIT_DEBUGOUT("ixv_attach: begin");
321 1.1 dyoung
322 1.58 msaitoh /*
323 1.58 msaitoh * Make sure BUSMASTER is set, on a VM under
324 1.58 msaitoh * KVM it may not be and will break things.
325 1.58 msaitoh */
326 1.58 msaitoh ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
327 1.58 msaitoh
328 1.1 dyoung /* Allocate, clear, and link in our adapter structure */
329 1.3 msaitoh adapter = device_private(dev);
330 1.150 msaitoh adapter->hw.back = adapter;
331 1.26 msaitoh adapter->dev = dev;
332 1.1 dyoung hw = &adapter->hw;
333 1.26 msaitoh
334 1.26 msaitoh adapter->init_locked = ixv_init_locked;
335 1.153 msaitoh adapter->stop_locked = ixv_stop_locked;
336 1.26 msaitoh
337 1.13 msaitoh adapter->osdep.pc = pa->pa_pc;
338 1.13 msaitoh adapter->osdep.tag = pa->pa_tag;
339 1.43 msaitoh if (pci_dma64_available(pa))
340 1.43 msaitoh adapter->osdep.dmat = pa->pa_dmat64;
341 1.43 msaitoh else
342 1.43 msaitoh adapter->osdep.dmat = pa->pa_dmat;
343 1.13 msaitoh adapter->osdep.attached = false;
344 1.1 dyoung
345 1.3 msaitoh ent = ixv_lookup(pa);
346 1.3 msaitoh
347 1.3 msaitoh KASSERT(ent != NULL);
348 1.3 msaitoh
349 1.3 msaitoh aprint_normal(": %s, Version - %s\n",
350 1.3 msaitoh ixv_strings[ent->index], ixv_driver_version);
351 1.3 msaitoh
352 1.150 msaitoh /* Core Lock Init */
353 1.21 msaitoh IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
354 1.1 dyoung
355 1.1 dyoung /* Do base PCI setup - map BAR0 */
356 1.3 msaitoh if (ixv_allocate_pci_resources(adapter, pa)) {
357 1.26 msaitoh aprint_error_dev(dev, "ixv_allocate_pci_resources() failed!\n");
358 1.1 dyoung error = ENXIO;
359 1.1 dyoung goto err_out;
360 1.1 dyoung }
361 1.1 dyoung
362 1.58 msaitoh /* SYSCTL APIs */
363 1.58 msaitoh ixv_add_device_sysctls(adapter);
364 1.25 msaitoh
365 1.151 msaitoh /* Set up the timer callout and workqueue */
366 1.58 msaitoh callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
367 1.151 msaitoh snprintf(wqname, sizeof(wqname), "%s-timer", device_xname(dev));
368 1.151 msaitoh error = workqueue_create(&adapter->timer_wq, wqname,
369 1.151 msaitoh ixv_handle_timer, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
370 1.151 msaitoh IXGBE_TASKLET_WQ_FLAGS);
371 1.151 msaitoh if (error) {
372 1.151 msaitoh aprint_error_dev(dev,
373 1.151 msaitoh "could not create timer workqueue (%d)\n", error);
374 1.151 msaitoh goto err_out;
375 1.151 msaitoh }
376 1.25 msaitoh
377 1.58 msaitoh /* Save off the information about this board */
378 1.58 msaitoh id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
379 1.58 msaitoh subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
380 1.58 msaitoh hw->vendor_id = PCI_VENDOR(id);
381 1.58 msaitoh hw->device_id = PCI_PRODUCT(id);
382 1.58 msaitoh hw->revision_id =
383 1.58 msaitoh PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
384 1.58 msaitoh hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
385 1.58 msaitoh hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
386 1.1 dyoung
387 1.58 msaitoh /* A subset of set_mac_type */
388 1.58 msaitoh switch (hw->device_id) {
389 1.58 msaitoh case IXGBE_DEV_ID_82599_VF:
390 1.58 msaitoh hw->mac.type = ixgbe_mac_82599_vf;
391 1.66 msaitoh str = "82599 VF";
392 1.58 msaitoh break;
393 1.58 msaitoh case IXGBE_DEV_ID_X540_VF:
394 1.58 msaitoh hw->mac.type = ixgbe_mac_X540_vf;
395 1.66 msaitoh str = "X540 VF";
396 1.58 msaitoh break;
397 1.58 msaitoh case IXGBE_DEV_ID_X550_VF:
398 1.58 msaitoh hw->mac.type = ixgbe_mac_X550_vf;
399 1.66 msaitoh str = "X550 VF";
400 1.58 msaitoh break;
401 1.58 msaitoh case IXGBE_DEV_ID_X550EM_X_VF:
402 1.58 msaitoh hw->mac.type = ixgbe_mac_X550EM_x_vf;
403 1.66 msaitoh str = "X550EM X VF";
404 1.58 msaitoh break;
405 1.58 msaitoh case IXGBE_DEV_ID_X550EM_A_VF:
406 1.58 msaitoh hw->mac.type = ixgbe_mac_X550EM_a_vf;
407 1.66 msaitoh str = "X550EM A VF";
408 1.58 msaitoh break;
409 1.58 msaitoh default:
410 1.58 msaitoh /* Shouldn't get here since probe succeeded */
411 1.58 msaitoh aprint_error_dev(dev, "Unknown device ID!\n");
412 1.58 msaitoh error = ENXIO;
413 1.1 dyoung goto err_out;
414 1.58 msaitoh break;
415 1.1 dyoung }
416 1.66 msaitoh aprint_normal_dev(dev, "device %s\n", str);
417 1.1 dyoung
418 1.58 msaitoh ixv_init_device_features(adapter);
419 1.58 msaitoh
420 1.58 msaitoh /* Initialize the shared code */
421 1.58 msaitoh error = ixgbe_init_ops_vf(hw);
422 1.1 dyoung if (error) {
423 1.58 msaitoh aprint_error_dev(dev, "ixgbe_init_ops_vf() failed!\n");
424 1.1 dyoung error = EIO;
425 1.58 msaitoh goto err_out;
426 1.1 dyoung }
427 1.1 dyoung
428 1.1 dyoung /* Setup the mailbox */
429 1.1 dyoung ixgbe_init_mbx_params_vf(hw);
430 1.1 dyoung
431 1.58 msaitoh /* Set the right number of segments */
432 1.168 msaitoh KASSERT(IXGBE_82599_SCATTER_MAX >= IXGBE_SCATTER_DEFAULT);
433 1.168 msaitoh adapter->num_segs = IXGBE_SCATTER_DEFAULT;
434 1.58 msaitoh
435 1.26 msaitoh /* Reset mbox api to 1.0 */
436 1.58 msaitoh error = hw->mac.ops.reset_hw(hw);
437 1.26 msaitoh if (error == IXGBE_ERR_RESET_FAILED)
438 1.58 msaitoh aprint_error_dev(dev, "...reset_hw() failure: Reset Failed!\n");
439 1.26 msaitoh else if (error)
440 1.58 msaitoh aprint_error_dev(dev, "...reset_hw() failed with error %d\n",
441 1.58 msaitoh error);
442 1.26 msaitoh if (error) {
443 1.26 msaitoh error = EIO;
444 1.58 msaitoh goto err_out;
445 1.26 msaitoh }
446 1.1 dyoung
447 1.58 msaitoh error = hw->mac.ops.init_hw(hw);
448 1.1 dyoung if (error) {
449 1.58 msaitoh aprint_error_dev(dev, "...init_hw() failed!\n");
450 1.1 dyoung error = EIO;
451 1.58 msaitoh goto err_out;
452 1.1 dyoung }
453 1.63 msaitoh
454 1.58 msaitoh /* Negotiate mailbox API version */
455 1.58 msaitoh error = ixv_negotiate_api(adapter);
456 1.58 msaitoh if (error)
457 1.58 msaitoh aprint_normal_dev(dev,
458 1.58 msaitoh "MBX API negotiation failed during attach!\n");
459 1.60 msaitoh switch (hw->api_version) {
460 1.60 msaitoh case ixgbe_mbox_api_10:
461 1.60 msaitoh apivstr = "1.0";
462 1.60 msaitoh break;
463 1.60 msaitoh case ixgbe_mbox_api_20:
464 1.60 msaitoh apivstr = "2.0";
465 1.60 msaitoh break;
466 1.60 msaitoh case ixgbe_mbox_api_11:
467 1.60 msaitoh apivstr = "1.1";
468 1.60 msaitoh break;
469 1.60 msaitoh case ixgbe_mbox_api_12:
470 1.60 msaitoh apivstr = "1.2";
471 1.60 msaitoh break;
472 1.60 msaitoh case ixgbe_mbox_api_13:
473 1.60 msaitoh apivstr = "1.3";
474 1.60 msaitoh break;
475 1.172 msaitoh case ixgbe_mbox_api_14:
476 1.172 msaitoh apivstr = "1.4";
477 1.172 msaitoh break;
478 1.172 msaitoh case ixgbe_mbox_api_15:
479 1.172 msaitoh apivstr = "1.5";
480 1.172 msaitoh break;
481 1.60 msaitoh default:
482 1.60 msaitoh apivstr = "unknown";
483 1.60 msaitoh break;
484 1.60 msaitoh }
485 1.60 msaitoh aprint_normal_dev(dev, "Mailbox API %s\n", apivstr);
486 1.1 dyoung
487 1.21 msaitoh /* If no mac address was assigned, make a random one */
488 1.21 msaitoh if (!ixv_check_ether_addr(hw->mac.addr)) {
489 1.21 msaitoh u8 addr[ETHER_ADDR_LEN];
490 1.59 msaitoh uint64_t rndval = cprng_strong64();
491 1.21 msaitoh
492 1.21 msaitoh memcpy(addr, &rndval, sizeof(addr));
493 1.21 msaitoh addr[0] &= 0xFE;
494 1.21 msaitoh addr[0] |= 0x02;
495 1.21 msaitoh bcopy(addr, hw->mac.addr, sizeof(addr));
496 1.21 msaitoh }
497 1.21 msaitoh
498 1.58 msaitoh /* Register for VLAN events */
499 1.120 msaitoh ether_set_vlan_cb(&adapter->osdep.ec, ixv_vlan_cb);
500 1.58 msaitoh
501 1.58 msaitoh /* Do descriptor calc and sanity checks */
502 1.58 msaitoh if (((ixv_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
503 1.58 msaitoh ixv_txd < MIN_TXD || ixv_txd > MAX_TXD) {
504 1.58 msaitoh aprint_error_dev(dev, "TXD config issue, using default!\n");
505 1.58 msaitoh adapter->num_tx_desc = DEFAULT_TXD;
506 1.58 msaitoh } else
507 1.58 msaitoh adapter->num_tx_desc = ixv_txd;
508 1.58 msaitoh
509 1.58 msaitoh if (((ixv_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
510 1.58 msaitoh ixv_rxd < MIN_RXD || ixv_rxd > MAX_RXD) {
511 1.58 msaitoh aprint_error_dev(dev, "RXD config issue, using default!\n");
512 1.58 msaitoh adapter->num_rx_desc = DEFAULT_RXD;
513 1.58 msaitoh } else
514 1.58 msaitoh adapter->num_rx_desc = ixv_rxd;
515 1.58 msaitoh
516 1.179 msaitoh /* Sysctls for limiting the amount of work done in the taskqueues */
517 1.179 msaitoh adapter->rx_process_limit
518 1.179 msaitoh = (ixv_rx_process_limit <= adapter->num_rx_desc)
519 1.179 msaitoh ? ixv_rx_process_limit : adapter->num_rx_desc;
520 1.179 msaitoh adapter->tx_process_limit
521 1.179 msaitoh = (ixv_tx_process_limit <= adapter->num_tx_desc)
522 1.179 msaitoh ? ixv_tx_process_limit : adapter->num_tx_desc;
523 1.179 msaitoh
524 1.163 msaitoh /* Set default high limit of copying mbuf in rxeof */
525 1.163 msaitoh adapter->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
526 1.163 msaitoh
527 1.58 msaitoh /* Setup MSI-X */
528 1.63 msaitoh error = ixv_configure_interrupts(adapter);
529 1.58 msaitoh if (error)
530 1.58 msaitoh goto err_out;
531 1.58 msaitoh
532 1.58 msaitoh /* Allocate our TX/RX Queues */
533 1.58 msaitoh if (ixgbe_allocate_queues(adapter)) {
534 1.58 msaitoh aprint_error_dev(dev, "ixgbe_allocate_queues() failed!\n");
535 1.58 msaitoh error = ENOMEM;
536 1.58 msaitoh goto err_out;
537 1.58 msaitoh }
538 1.58 msaitoh
539 1.50 msaitoh /* hw.ix defaults init */
540 1.50 msaitoh adapter->enable_aim = ixv_enable_aim;
541 1.50 msaitoh
542 1.84 knakahar adapter->txrx_use_workqueue = ixv_txrx_workqueue;
543 1.84 knakahar
544 1.76 msaitoh error = ixv_allocate_msix(adapter, pa);
545 1.76 msaitoh if (error) {
546 1.130 msaitoh aprint_error_dev(dev, "ixv_allocate_msix() failed!\n");
547 1.76 msaitoh goto err_late;
548 1.76 msaitoh }
549 1.76 msaitoh
550 1.1 dyoung /* Setup OS specific network interface */
551 1.73 msaitoh error = ixv_setup_interface(dev, adapter);
552 1.73 msaitoh if (error != 0) {
553 1.73 msaitoh aprint_error_dev(dev, "ixv_setup_interface() failed!\n");
554 1.73 msaitoh goto err_late;
555 1.73 msaitoh }
556 1.1 dyoung
557 1.170 msaitoh /* Allocate multicast array memory */
558 1.170 msaitoh adapter->mta = malloc(sizeof(*adapter->mta) *
559 1.170 msaitoh IXGBE_MAX_VF_MC, M_DEVBUF, M_WAITOK);
560 1.170 msaitoh
561 1.185 msaitoh /* Check if VF was disabled by PF */
562 1.185 msaitoh error = hw->mac.ops.get_link_state(hw, &adapter->link_enabled);
563 1.185 msaitoh if (error) {
564 1.185 msaitoh /* PF is not capable of controlling VF state. Enable the link. */
565 1.185 msaitoh adapter->link_enabled = TRUE;
566 1.185 msaitoh }
567 1.185 msaitoh
568 1.1 dyoung /* Do the stats setup */
569 1.1 dyoung ixv_init_stats(adapter);
570 1.58 msaitoh ixv_add_stats_sysctls(adapter);
571 1.1 dyoung
572 1.58 msaitoh if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
573 1.58 msaitoh ixgbe_netmap_attach(adapter);
574 1.48 msaitoh
575 1.63 msaitoh snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_cap);
576 1.63 msaitoh aprint_verbose_dev(dev, "feature cap %s\n", buf);
577 1.63 msaitoh snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_en);
578 1.63 msaitoh aprint_verbose_dev(dev, "feature ena %s\n", buf);
579 1.63 msaitoh
580 1.1 dyoung INIT_DEBUGOUT("ixv_attach: end");
581 1.13 msaitoh adapter->osdep.attached = true;
582 1.57 msaitoh
583 1.3 msaitoh return;
584 1.1 dyoung
585 1.1 dyoung err_late:
586 1.144 msaitoh ixgbe_free_queues(adapter);
587 1.1 dyoung err_out:
588 1.1 dyoung ixv_free_pci_resources(adapter);
589 1.58 msaitoh IXGBE_CORE_LOCK_DESTROY(adapter);
590 1.58 msaitoh
591 1.3 msaitoh return;
592 1.58 msaitoh } /* ixv_attach */
593 1.1 dyoung
594 1.58 msaitoh /************************************************************************
595 1.58 msaitoh * ixv_detach - Device removal routine
596 1.1 dyoung *
597 1.58 msaitoh * Called when the driver is being removed.
598 1.58 msaitoh * Stops the adapter and deallocates all the resources
599 1.58 msaitoh * that were allocated for driver operation.
600 1.1 dyoung *
601 1.58 msaitoh * return 0 on success, positive on failure
602 1.58 msaitoh ************************************************************************/
603 1.1 dyoung static int
604 1.3 msaitoh ixv_detach(device_t dev, int flags)
605 1.1 dyoung {
606 1.114 msaitoh struct adapter *adapter = device_private(dev);
607 1.67 msaitoh struct ixgbe_hw *hw = &adapter->hw;
608 1.41 msaitoh struct tx_ring *txr = adapter->tx_rings;
609 1.49 msaitoh struct rx_ring *rxr = adapter->rx_rings;
610 1.49 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
611 1.1 dyoung
612 1.1 dyoung INIT_DEBUGOUT("ixv_detach: begin");
613 1.13 msaitoh if (adapter->osdep.attached == false)
614 1.13 msaitoh return 0;
615 1.1 dyoung
616 1.56 msaitoh /* Stop the interface. Callouts are stopped in it. */
617 1.56 msaitoh ixv_ifstop(adapter->ifp, 1);
618 1.56 msaitoh
619 1.169 yamaguch if (VLAN_ATTACHED(&adapter->osdep.ec) &&
620 1.169 yamaguch (flags & (DETACH_SHUTDOWN | DETACH_FORCE)) == 0) {
621 1.26 msaitoh aprint_error_dev(dev, "VLANs in use, detach first\n");
622 1.3 msaitoh return EBUSY;
623 1.1 dyoung }
624 1.1 dyoung
625 1.1 dyoung ether_ifdetach(adapter->ifp);
626 1.3 msaitoh callout_halt(&adapter->timer, NULL);
627 1.154 msaitoh ixv_free_deferred_handlers(adapter);
628 1.58 msaitoh
629 1.58 msaitoh if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
630 1.58 msaitoh netmap_detach(adapter->ifp);
631 1.58 msaitoh
632 1.1 dyoung ixv_free_pci_resources(adapter);
633 1.3 msaitoh #if 0 /* XXX the NetBSD port is probably missing something here */
634 1.1 dyoung bus_generic_detach(dev);
635 1.3 msaitoh #endif
636 1.3 msaitoh if_detach(adapter->ifp);
637 1.145 thorpej ifmedia_fini(&adapter->media);
638 1.52 msaitoh if_percpuq_destroy(adapter->ipq);
639 1.1 dyoung
640 1.41 msaitoh sysctl_teardown(&adapter->sysctllog);
641 1.49 msaitoh evcnt_detach(&adapter->efbig_tx_dma_setup);
642 1.49 msaitoh evcnt_detach(&adapter->mbuf_defrag_failed);
643 1.49 msaitoh evcnt_detach(&adapter->efbig2_tx_dma_setup);
644 1.49 msaitoh evcnt_detach(&adapter->einval_tx_dma_setup);
645 1.49 msaitoh evcnt_detach(&adapter->other_tx_dma_setup);
646 1.49 msaitoh evcnt_detach(&adapter->eagain_tx_dma_setup);
647 1.49 msaitoh evcnt_detach(&adapter->enomem_tx_dma_setup);
648 1.49 msaitoh evcnt_detach(&adapter->watchdog_events);
649 1.49 msaitoh evcnt_detach(&adapter->tso_err);
650 1.151 msaitoh evcnt_detach(&adapter->admin_irqev);
651 1.151 msaitoh evcnt_detach(&adapter->link_workev);
652 1.49 msaitoh
653 1.49 msaitoh txr = adapter->tx_rings;
654 1.49 msaitoh for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
655 1.49 msaitoh evcnt_detach(&adapter->queues[i].irqs);
656 1.85 msaitoh evcnt_detach(&adapter->queues[i].handleq);
657 1.85 msaitoh evcnt_detach(&adapter->queues[i].req);
658 1.49 msaitoh evcnt_detach(&txr->total_packets);
659 1.49 msaitoh #ifndef IXGBE_LEGACY_TX
660 1.49 msaitoh evcnt_detach(&txr->pcq_drops);
661 1.49 msaitoh #endif
662 1.184 msaitoh evcnt_detach(&txr->no_desc_avail);
663 1.184 msaitoh evcnt_detach(&txr->tso_tx);
664 1.49 msaitoh
665 1.49 msaitoh evcnt_detach(&rxr->rx_packets);
666 1.49 msaitoh evcnt_detach(&rxr->rx_bytes);
667 1.49 msaitoh evcnt_detach(&rxr->rx_copies);
668 1.166 msaitoh evcnt_detach(&rxr->no_mbuf);
669 1.49 msaitoh evcnt_detach(&rxr->rx_discarded);
670 1.49 msaitoh }
671 1.49 msaitoh evcnt_detach(&stats->ipcs);
672 1.49 msaitoh evcnt_detach(&stats->l4cs);
673 1.49 msaitoh evcnt_detach(&stats->ipcs_bad);
674 1.49 msaitoh evcnt_detach(&stats->l4cs_bad);
675 1.49 msaitoh
676 1.49 msaitoh /* Packet Reception Stats */
677 1.49 msaitoh evcnt_detach(&stats->vfgorc);
678 1.49 msaitoh evcnt_detach(&stats->vfgprc);
679 1.49 msaitoh evcnt_detach(&stats->vfmprc);
680 1.49 msaitoh
681 1.49 msaitoh /* Packet Transmission Stats */
682 1.49 msaitoh evcnt_detach(&stats->vfgotc);
683 1.49 msaitoh evcnt_detach(&stats->vfgptc);
684 1.41 msaitoh
685 1.67 msaitoh /* Mailbox Stats */
686 1.67 msaitoh evcnt_detach(&hw->mbx.stats.msgs_tx);
687 1.67 msaitoh evcnt_detach(&hw->mbx.stats.msgs_rx);
688 1.67 msaitoh evcnt_detach(&hw->mbx.stats.acks);
689 1.67 msaitoh evcnt_detach(&hw->mbx.stats.reqs);
690 1.67 msaitoh evcnt_detach(&hw->mbx.stats.rsts);
691 1.67 msaitoh
692 1.144 msaitoh ixgbe_free_queues(adapter);
693 1.1 dyoung
694 1.21 msaitoh IXGBE_CORE_LOCK_DESTROY(adapter);
695 1.58 msaitoh
696 1.1 dyoung return (0);
697 1.58 msaitoh } /* ixv_detach */
698 1.1 dyoung
699 1.58 msaitoh /************************************************************************
700 1.58 msaitoh * ixv_init_locked - Init entry point
701 1.58 msaitoh *
702 1.58 msaitoh * Used in two ways: It is used by the stack as an init entry
703 1.58 msaitoh * point in network interface structure. It is also used
704 1.58 msaitoh * by the driver as a hw/sw initialization routine to get
705 1.58 msaitoh * to a consistent state.
706 1.1 dyoung *
707 1.58 msaitoh * return 0 on success, positive on failure
708 1.58 msaitoh ************************************************************************/
709 1.1 dyoung static void
710 1.1 dyoung ixv_init_locked(struct adapter *adapter)
711 1.1 dyoung {
712 1.1 dyoung struct ifnet *ifp = adapter->ifp;
713 1.114 msaitoh device_t dev = adapter->dev;
714 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
715 1.102 msaitoh struct ix_queue *que;
716 1.114 msaitoh int error = 0;
717 1.68 msaitoh uint32_t mask;
718 1.68 msaitoh int i;
719 1.1 dyoung
720 1.26 msaitoh INIT_DEBUGOUT("ixv_init_locked: begin");
721 1.3 msaitoh KASSERT(mutex_owned(&adapter->core_mtx));
722 1.1 dyoung hw->adapter_stopped = FALSE;
723 1.58 msaitoh hw->mac.ops.stop_adapter(hw);
724 1.63 msaitoh callout_stop(&adapter->timer);
725 1.102 msaitoh for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
726 1.102 msaitoh que->disabled_count = 0;
727 1.1 dyoung
728 1.139 msaitoh adapter->max_frame_size =
729 1.139 msaitoh ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
730 1.139 msaitoh
731 1.57 msaitoh /* reprogram the RAR[0] in case user changed it. */
732 1.58 msaitoh hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
733 1.1 dyoung
734 1.1 dyoung /* Get the latest mac address, User can use a LAA */
735 1.91 msaitoh memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
736 1.1 dyoung IXGBE_ETH_LENGTH_OF_ADDRESS);
737 1.58 msaitoh hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, 1);
738 1.1 dyoung
739 1.1 dyoung /* Prepare transmit descriptors and buffers */
740 1.21 msaitoh if (ixgbe_setup_transmit_structures(adapter)) {
741 1.26 msaitoh aprint_error_dev(dev, "Could not setup transmit structures\n");
742 1.153 msaitoh ixv_stop_locked(adapter);
743 1.1 dyoung return;
744 1.1 dyoung }
745 1.1 dyoung
746 1.26 msaitoh /* Reset VF and renegotiate mailbox API version */
747 1.58 msaitoh hw->mac.ops.reset_hw(hw);
748 1.92 msaitoh hw->mac.ops.start_hw(hw);
749 1.58 msaitoh error = ixv_negotiate_api(adapter);
750 1.26 msaitoh if (error)
751 1.58 msaitoh device_printf(dev,
752 1.58 msaitoh "Mailbox API negotiation failed in init_locked!\n");
753 1.26 msaitoh
754 1.1 dyoung ixv_initialize_transmit_units(adapter);
755 1.1 dyoung
756 1.1 dyoung /* Setup Multicast table */
757 1.138 msaitoh ixv_set_rxfilter(adapter);
758 1.1 dyoung
759 1.165 msaitoh /* Use fixed buffer size, even for jumbo frames */
760 1.165 msaitoh adapter->rx_mbuf_sz = MCLBYTES;
761 1.1 dyoung
762 1.1 dyoung /* Prepare receive descriptors and buffers */
763 1.160 msaitoh error = ixgbe_setup_receive_structures(adapter);
764 1.160 msaitoh if (error) {
765 1.160 msaitoh device_printf(dev,
766 1.160 msaitoh "Could not setup receive structures (err = %d)\n", error);
767 1.153 msaitoh ixv_stop_locked(adapter);
768 1.1 dyoung return;
769 1.1 dyoung }
770 1.1 dyoung
771 1.1 dyoung /* Configure RX settings */
772 1.1 dyoung ixv_initialize_receive_units(adapter);
773 1.1 dyoung
774 1.151 msaitoh /* Initialize variable holding task enqueue requests interrupts */
775 1.151 msaitoh adapter->task_requests = 0;
776 1.151 msaitoh
777 1.1 dyoung /* Set up VLAN offload and filter */
778 1.1 dyoung ixv_setup_vlan_support(adapter);
779 1.1 dyoung
780 1.58 msaitoh /* Set up MSI-X routing */
781 1.1 dyoung ixv_configure_ivars(adapter);
782 1.1 dyoung
783 1.1 dyoung /* Set up auto-mask */
784 1.68 msaitoh mask = (1 << adapter->vector);
785 1.102 msaitoh for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
786 1.68 msaitoh mask |= (1 << que->msix);
787 1.68 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, mask);
788 1.1 dyoung
789 1.57 msaitoh /* Set moderation on the Link interrupt */
790 1.95 msaitoh ixv_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
791 1.1 dyoung
792 1.1 dyoung /* Stats init */
793 1.1 dyoung ixv_init_stats(adapter);
794 1.1 dyoung
795 1.1 dyoung /* Config/Enable Link */
796 1.185 msaitoh error = hw->mac.ops.get_link_state(hw, &adapter->link_enabled);
797 1.185 msaitoh if (error) {
798 1.185 msaitoh /* PF is not capable of controlling VF state. Enable the link. */
799 1.185 msaitoh adapter->link_enabled = TRUE;
800 1.185 msaitoh } else if (adapter->link_enabled == FALSE)
801 1.185 msaitoh device_printf(dev, "VF is disabled by PF\n");
802 1.185 msaitoh
803 1.62 msaitoh hw->mac.get_link_status = TRUE;
804 1.58 msaitoh hw->mac.ops.check_link(hw, &adapter->link_speed, &adapter->link_up,
805 1.58 msaitoh FALSE);
806 1.1 dyoung
807 1.26 msaitoh /* Start watchdog */
808 1.26 msaitoh callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
809 1.152 msaitoh atomic_store_relaxed(&adapter->timer_pending, 0);
810 1.151 msaitoh
811 1.151 msaitoh /* OK to schedule workqueues. */
812 1.151 msaitoh adapter->schedule_wqs_ok = true;
813 1.26 msaitoh
814 1.1 dyoung /* And now turn on interrupts */
815 1.1 dyoung ixv_enable_intr(adapter);
816 1.1 dyoung
817 1.79 msaitoh /* Update saved flags. See ixgbe_ifflags_cb() */
818 1.79 msaitoh adapter->if_flags = ifp->if_flags;
819 1.120 msaitoh adapter->ec_capenable = adapter->osdep.ec.ec_capenable;
820 1.79 msaitoh
821 1.1 dyoung /* Now inform the stack we're ready */
822 1.3 msaitoh ifp->if_flags |= IFF_RUNNING;
823 1.3 msaitoh ifp->if_flags &= ~IFF_OACTIVE;
824 1.1 dyoung
825 1.1 dyoung return;
826 1.58 msaitoh } /* ixv_init_locked */
827 1.1 dyoung
828 1.88 msaitoh /************************************************************************
829 1.88 msaitoh * ixv_enable_queue
830 1.88 msaitoh ************************************************************************/
831 1.1 dyoung static inline void
832 1.1 dyoung ixv_enable_queue(struct adapter *adapter, u32 vector)
833 1.1 dyoung {
834 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
835 1.82 knakahar struct ix_queue *que = &adapter->queues[vector];
836 1.124 msaitoh u32 queue = 1UL << vector;
837 1.114 msaitoh u32 mask;
838 1.1 dyoung
839 1.90 knakahar mutex_enter(&que->dc_mtx);
840 1.90 knakahar if (que->disabled_count > 0 && --que->disabled_count > 0)
841 1.82 knakahar goto out;
842 1.82 knakahar
843 1.1 dyoung mask = (IXGBE_EIMS_RTX_QUEUE & queue);
844 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
845 1.82 knakahar out:
846 1.90 knakahar mutex_exit(&que->dc_mtx);
847 1.58 msaitoh } /* ixv_enable_queue */
848 1.1 dyoung
849 1.88 msaitoh /************************************************************************
850 1.88 msaitoh * ixv_disable_queue
851 1.88 msaitoh ************************************************************************/
852 1.1 dyoung static inline void
853 1.1 dyoung ixv_disable_queue(struct adapter *adapter, u32 vector)
854 1.1 dyoung {
855 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
856 1.82 knakahar struct ix_queue *que = &adapter->queues[vector];
857 1.124 msaitoh u32 queue = 1UL << vector;
858 1.114 msaitoh u32 mask;
859 1.1 dyoung
860 1.90 knakahar mutex_enter(&que->dc_mtx);
861 1.90 knakahar if (que->disabled_count++ > 0)
862 1.82 knakahar goto out;
863 1.82 knakahar
864 1.1 dyoung mask = (IXGBE_EIMS_RTX_QUEUE & queue);
865 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask);
866 1.82 knakahar out:
867 1.90 knakahar mutex_exit(&que->dc_mtx);
868 1.58 msaitoh } /* ixv_disable_queue */
869 1.1 dyoung
870 1.105 kamil #if 0
871 1.1 dyoung static inline void
872 1.1 dyoung ixv_rearm_queues(struct adapter *adapter, u64 queues)
873 1.1 dyoung {
874 1.1 dyoung u32 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
875 1.1 dyoung IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEICS, mask);
876 1.58 msaitoh } /* ixv_rearm_queues */
877 1.105 kamil #endif
878 1.1 dyoung
879 1.1 dyoung
880 1.58 msaitoh /************************************************************************
881 1.91 msaitoh * ixv_msix_que - MSI-X Queue Interrupt Service routine
882 1.58 msaitoh ************************************************************************/
883 1.58 msaitoh static int
884 1.1 dyoung ixv_msix_que(void *arg)
885 1.1 dyoung {
886 1.1 dyoung struct ix_queue *que = arg;
887 1.114 msaitoh struct adapter *adapter = que->adapter;
888 1.1 dyoung struct tx_ring *txr = que->txr;
889 1.1 dyoung struct rx_ring *rxr = que->rxr;
890 1.21 msaitoh bool more;
891 1.1 dyoung u32 newitr = 0;
892 1.1 dyoung
893 1.1 dyoung ixv_disable_queue(adapter, que->msix);
894 1.178 msaitoh IXGBE_EVC_ADD(&que->irqs, 1);
895 1.1 dyoung
896 1.34 msaitoh #ifdef __NetBSD__
897 1.34 msaitoh /* Don't run ixgbe_rxeof in interrupt context */
898 1.34 msaitoh more = true;
899 1.34 msaitoh #else
900 1.21 msaitoh more = ixgbe_rxeof(que);
901 1.34 msaitoh #endif
902 1.1 dyoung
903 1.21 msaitoh IXGBE_TX_LOCK(txr);
904 1.21 msaitoh ixgbe_txeof(txr);
905 1.21 msaitoh IXGBE_TX_UNLOCK(txr);
906 1.1 dyoung
907 1.1 dyoung /* Do AIM now? */
908 1.1 dyoung
909 1.50 msaitoh if (adapter->enable_aim == false)
910 1.1 dyoung goto no_calc;
911 1.1 dyoung /*
912 1.58 msaitoh * Do Adaptive Interrupt Moderation:
913 1.58 msaitoh * - Write out last calculated setting
914 1.58 msaitoh * - Calculate based on average size over
915 1.58 msaitoh * the last interval.
916 1.58 msaitoh */
917 1.63 msaitoh if (que->eitr_setting)
918 1.95 msaitoh ixv_eitr_write(adapter, que->msix, que->eitr_setting);
919 1.58 msaitoh
920 1.57 msaitoh que->eitr_setting = 0;
921 1.57 msaitoh
922 1.57 msaitoh /* Idle, do nothing */
923 1.57 msaitoh if ((txr->bytes == 0) && (rxr->bytes == 0))
924 1.57 msaitoh goto no_calc;
925 1.1 dyoung
926 1.1 dyoung if ((txr->bytes) && (txr->packets))
927 1.57 msaitoh newitr = txr->bytes/txr->packets;
928 1.1 dyoung if ((rxr->bytes) && (rxr->packets))
929 1.106 riastrad newitr = uimax(newitr, (rxr->bytes / rxr->packets));
930 1.1 dyoung newitr += 24; /* account for hardware frame, crc */
931 1.1 dyoung
932 1.1 dyoung /* set an upper boundary */
933 1.106 riastrad newitr = uimin(newitr, 3000);
934 1.1 dyoung
935 1.1 dyoung /* Be nice to the mid range */
936 1.1 dyoung if ((newitr > 300) && (newitr < 1200))
937 1.1 dyoung newitr = (newitr / 3);
938 1.1 dyoung else
939 1.1 dyoung newitr = (newitr / 2);
940 1.1 dyoung
941 1.80 msaitoh /*
942 1.80 msaitoh * When RSC is used, ITR interval must be larger than RSC_DELAY.
943 1.80 msaitoh * Currently, we use 2us for RSC_DELAY. The minimum value is always
944 1.80 msaitoh * greater than 2us on 100M (and 10M?(not documented)), but it's not
945 1.80 msaitoh * on 1G and higher.
946 1.80 msaitoh */
947 1.80 msaitoh if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
948 1.80 msaitoh && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
949 1.80 msaitoh if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
950 1.80 msaitoh newitr = IXGBE_MIN_RSC_EITR_10G1G;
951 1.80 msaitoh }
952 1.58 msaitoh
953 1.58 msaitoh /* save for next interrupt */
954 1.58 msaitoh que->eitr_setting = newitr;
955 1.1 dyoung
956 1.57 msaitoh /* Reset state */
957 1.57 msaitoh txr->bytes = 0;
958 1.57 msaitoh txr->packets = 0;
959 1.57 msaitoh rxr->bytes = 0;
960 1.57 msaitoh rxr->packets = 0;
961 1.1 dyoung
962 1.1 dyoung no_calc:
963 1.86 msaitoh if (more)
964 1.3 msaitoh softint_schedule(que->que_si);
965 1.86 msaitoh else /* Re-enable this interrupt */
966 1.1 dyoung ixv_enable_queue(adapter, que->msix);
967 1.58 msaitoh
968 1.11 msaitoh return 1;
969 1.58 msaitoh } /* ixv_msix_que */
970 1.1 dyoung
971 1.58 msaitoh /************************************************************************
972 1.58 msaitoh * ixv_msix_mbx
973 1.58 msaitoh ************************************************************************/
974 1.11 msaitoh static int
975 1.1 dyoung ixv_msix_mbx(void *arg)
976 1.1 dyoung {
977 1.1 dyoung struct adapter *adapter = arg;
978 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
979 1.1 dyoung
980 1.178 msaitoh IXGBE_EVC_ADD(&adapter->admin_irqev, 1);
981 1.69 msaitoh /* NetBSD: We use auto-clear, so it's not required to write VTEICR */
982 1.1 dyoung
983 1.1 dyoung /* Link status change */
984 1.69 msaitoh hw->mac.get_link_status = TRUE;
985 1.151 msaitoh atomic_or_32(&adapter->task_requests, IXGBE_REQUEST_TASK_MBX);
986 1.151 msaitoh ixv_schedule_admin_tasklet(adapter);
987 1.57 msaitoh
988 1.11 msaitoh return 1;
989 1.58 msaitoh } /* ixv_msix_mbx */
990 1.1 dyoung
991 1.80 msaitoh static void
992 1.95 msaitoh ixv_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
993 1.80 msaitoh {
994 1.80 msaitoh
995 1.80 msaitoh /*
996 1.80 msaitoh * Newer devices than 82598 have VF function, so this function is
997 1.80 msaitoh * simple.
998 1.80 msaitoh */
999 1.80 msaitoh itr |= IXGBE_EITR_CNT_WDIS;
1000 1.80 msaitoh
1001 1.95 msaitoh IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEITR(index), itr);
1002 1.80 msaitoh }
1003 1.80 msaitoh
1004 1.80 msaitoh
1005 1.58 msaitoh /************************************************************************
1006 1.58 msaitoh * ixv_media_status - Media Ioctl callback
1007 1.1 dyoung *
1008 1.58 msaitoh * Called whenever the user queries the status of
1009 1.58 msaitoh * the interface using ifconfig.
1010 1.58 msaitoh ************************************************************************/
1011 1.1 dyoung static void
1012 1.63 msaitoh ixv_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1013 1.1 dyoung {
1014 1.1 dyoung struct adapter *adapter = ifp->if_softc;
1015 1.1 dyoung
1016 1.1 dyoung INIT_DEBUGOUT("ixv_media_status: begin");
1017 1.1 dyoung ixv_update_link_status(adapter);
1018 1.1 dyoung
1019 1.1 dyoung ifmr->ifm_status = IFM_AVALID;
1020 1.1 dyoung ifmr->ifm_active = IFM_ETHER;
1021 1.1 dyoung
1022 1.109 msaitoh if (adapter->link_active != LINK_STATE_UP) {
1023 1.39 msaitoh ifmr->ifm_active |= IFM_NONE;
1024 1.1 dyoung return;
1025 1.1 dyoung }
1026 1.1 dyoung
1027 1.1 dyoung ifmr->ifm_status |= IFM_ACTIVE;
1028 1.1 dyoung
1029 1.1 dyoung switch (adapter->link_speed) {
1030 1.42 msaitoh case IXGBE_LINK_SPEED_10GB_FULL:
1031 1.42 msaitoh ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
1032 1.42 msaitoh break;
1033 1.71 msaitoh case IXGBE_LINK_SPEED_5GB_FULL:
1034 1.71 msaitoh ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
1035 1.71 msaitoh break;
1036 1.71 msaitoh case IXGBE_LINK_SPEED_2_5GB_FULL:
1037 1.71 msaitoh ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
1038 1.71 msaitoh break;
1039 1.1 dyoung case IXGBE_LINK_SPEED_1GB_FULL:
1040 1.1 dyoung ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
1041 1.1 dyoung break;
1042 1.42 msaitoh case IXGBE_LINK_SPEED_100_FULL:
1043 1.42 msaitoh ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
1044 1.1 dyoung break;
1045 1.58 msaitoh case IXGBE_LINK_SPEED_10_FULL:
1046 1.58 msaitoh ifmr->ifm_active |= IFM_10_T | IFM_FDX;
1047 1.58 msaitoh break;
1048 1.1 dyoung }
1049 1.1 dyoung
1050 1.70 msaitoh ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
1051 1.58 msaitoh } /* ixv_media_status */
1052 1.1 dyoung
1053 1.58 msaitoh /************************************************************************
1054 1.58 msaitoh * ixv_media_change - Media Ioctl callback
1055 1.1 dyoung *
1056 1.58 msaitoh * Called when the user changes speed/duplex using
1057 1.58 msaitoh * media/mediopt option with ifconfig.
1058 1.58 msaitoh ************************************************************************/
1059 1.1 dyoung static int
1060 1.57 msaitoh ixv_media_change(struct ifnet *ifp)
1061 1.1 dyoung {
1062 1.1 dyoung struct adapter *adapter = ifp->if_softc;
1063 1.1 dyoung struct ifmedia *ifm = &adapter->media;
1064 1.1 dyoung
1065 1.1 dyoung INIT_DEBUGOUT("ixv_media_change: begin");
1066 1.1 dyoung
1067 1.1 dyoung if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1068 1.1 dyoung return (EINVAL);
1069 1.1 dyoung
1070 1.57 msaitoh switch (IFM_SUBTYPE(ifm->ifm_media)) {
1071 1.57 msaitoh case IFM_AUTO:
1072 1.57 msaitoh break;
1073 1.57 msaitoh default:
1074 1.57 msaitoh device_printf(adapter->dev, "Only auto media type\n");
1075 1.1 dyoung return (EINVAL);
1076 1.57 msaitoh }
1077 1.1 dyoung
1078 1.1 dyoung return (0);
1079 1.58 msaitoh } /* ixv_media_change */
1080 1.1 dyoung
1081 1.151 msaitoh static void
1082 1.151 msaitoh ixv_schedule_admin_tasklet(struct adapter *adapter)
1083 1.151 msaitoh {
1084 1.151 msaitoh if (adapter->schedule_wqs_ok) {
1085 1.152 msaitoh if (atomic_cas_uint(&adapter->admin_pending, 0, 1) == 0)
1086 1.151 msaitoh workqueue_enqueue(adapter->admin_wq,
1087 1.151 msaitoh &adapter->admin_wc, NULL);
1088 1.151 msaitoh }
1089 1.151 msaitoh }
1090 1.151 msaitoh
1091 1.137 msaitoh /************************************************************************
1092 1.58 msaitoh * ixv_negotiate_api
1093 1.1 dyoung *
1094 1.58 msaitoh * Negotiate the Mailbox API with the PF;
1095 1.58 msaitoh * start with the most featured API first.
1096 1.58 msaitoh ************************************************************************/
1097 1.58 msaitoh static int
1098 1.58 msaitoh ixv_negotiate_api(struct adapter *adapter)
1099 1.58 msaitoh {
1100 1.58 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1101 1.173 msaitoh int mbx_api[] = { ixgbe_mbox_api_15,
1102 1.173 msaitoh ixgbe_mbox_api_13,
1103 1.134 msaitoh ixgbe_mbox_api_12,
1104 1.134 msaitoh ixgbe_mbox_api_11,
1105 1.114 msaitoh ixgbe_mbox_api_10,
1106 1.114 msaitoh ixgbe_mbox_api_unknown };
1107 1.114 msaitoh int i = 0;
1108 1.58 msaitoh
1109 1.58 msaitoh while (mbx_api[i] != ixgbe_mbox_api_unknown) {
1110 1.173 msaitoh if (ixgbevf_negotiate_api_version(hw, mbx_api[i]) == 0) {
1111 1.173 msaitoh if (hw->api_version >= ixgbe_mbox_api_15)
1112 1.173 msaitoh ixgbe_upgrade_mbx_params_vf(hw);
1113 1.58 msaitoh return (0);
1114 1.173 msaitoh }
1115 1.58 msaitoh i++;
1116 1.58 msaitoh }
1117 1.58 msaitoh
1118 1.58 msaitoh return (EINVAL);
1119 1.58 msaitoh } /* ixv_negotiate_api */
1120 1.58 msaitoh
1121 1.58 msaitoh
1122 1.58 msaitoh /************************************************************************
1123 1.150 msaitoh * ixv_set_rxfilter - Multicast Update
1124 1.1 dyoung *
1125 1.58 msaitoh * Called whenever multicast address list is updated.
1126 1.58 msaitoh ************************************************************************/
1127 1.138 msaitoh static int
1128 1.138 msaitoh ixv_set_rxfilter(struct adapter *adapter)
1129 1.1 dyoung {
1130 1.170 msaitoh struct ixgbe_mc_addr *mta;
1131 1.138 msaitoh struct ifnet *ifp = adapter->ifp;
1132 1.138 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1133 1.138 msaitoh u8 *update_ptr;
1134 1.138 msaitoh int mcnt = 0;
1135 1.138 msaitoh struct ethercom *ec = &adapter->osdep.ec;
1136 1.138 msaitoh struct ether_multi *enm;
1137 1.138 msaitoh struct ether_multistep step;
1138 1.138 msaitoh bool overflow = false;
1139 1.138 msaitoh int error, rc = 0;
1140 1.1 dyoung
1141 1.72 msaitoh KASSERT(mutex_owned(&adapter->core_mtx));
1142 1.138 msaitoh IOCTL_DEBUGOUT("ixv_set_rxfilter: begin");
1143 1.1 dyoung
1144 1.170 msaitoh mta = adapter->mta;
1145 1.170 msaitoh bzero(mta, sizeof(*mta) * IXGBE_MAX_VF_MC);
1146 1.170 msaitoh
1147 1.138 msaitoh /* 1: For PROMISC */
1148 1.138 msaitoh if (ifp->if_flags & IFF_PROMISC) {
1149 1.138 msaitoh error = hw->mac.ops.update_xcast_mode(hw,
1150 1.138 msaitoh IXGBEVF_XCAST_MODE_PROMISC);
1151 1.138 msaitoh if (error == IXGBE_ERR_NOT_TRUSTED) {
1152 1.138 msaitoh device_printf(adapter->dev,
1153 1.138 msaitoh "this interface is not trusted\n");
1154 1.138 msaitoh error = EPERM;
1155 1.138 msaitoh } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
1156 1.138 msaitoh device_printf(adapter->dev,
1157 1.138 msaitoh "the PF doesn't support promisc mode\n");
1158 1.138 msaitoh error = EOPNOTSUPP;
1159 1.138 msaitoh } else if (error == IXGBE_ERR_NOT_IN_PROMISC) {
1160 1.138 msaitoh device_printf(adapter->dev,
1161 1.138 msaitoh "the PF may not in promisc mode\n");
1162 1.138 msaitoh error = EINVAL;
1163 1.138 msaitoh } else if (error) {
1164 1.138 msaitoh device_printf(adapter->dev,
1165 1.138 msaitoh "failed to set promisc mode. error = %d\n",
1166 1.138 msaitoh error);
1167 1.138 msaitoh error = EIO;
1168 1.138 msaitoh } else
1169 1.138 msaitoh return 0;
1170 1.138 msaitoh rc = error;
1171 1.138 msaitoh }
1172 1.138 msaitoh
1173 1.138 msaitoh /* 2: For ALLMULTI or normal */
1174 1.72 msaitoh ETHER_LOCK(ec);
1175 1.3 msaitoh ETHER_FIRST_MULTI(step, ec, enm);
1176 1.3 msaitoh while (enm != NULL) {
1177 1.138 msaitoh if ((mcnt >= IXGBE_MAX_VF_MC) ||
1178 1.138 msaitoh (memcmp(enm->enm_addrlo, enm->enm_addrhi,
1179 1.138 msaitoh ETHER_ADDR_LEN) != 0)) {
1180 1.134 msaitoh overflow = true;
1181 1.134 msaitoh break;
1182 1.134 msaitoh }
1183 1.3 msaitoh bcopy(enm->enm_addrlo,
1184 1.170 msaitoh mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
1185 1.1 dyoung mcnt++;
1186 1.3 msaitoh ETHER_NEXT_MULTI(step, enm);
1187 1.1 dyoung }
1188 1.72 msaitoh ETHER_UNLOCK(ec);
1189 1.1 dyoung
1190 1.138 msaitoh /* 3: For ALLMULTI */
1191 1.134 msaitoh if (overflow) {
1192 1.134 msaitoh error = hw->mac.ops.update_xcast_mode(hw,
1193 1.134 msaitoh IXGBEVF_XCAST_MODE_ALLMULTI);
1194 1.134 msaitoh if (error == IXGBE_ERR_NOT_TRUSTED) {
1195 1.134 msaitoh device_printf(adapter->dev,
1196 1.134 msaitoh "this interface is not trusted\n");
1197 1.135 msaitoh error = EPERM;
1198 1.135 msaitoh } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
1199 1.135 msaitoh device_printf(adapter->dev,
1200 1.135 msaitoh "the PF doesn't support allmulti mode\n");
1201 1.135 msaitoh error = EOPNOTSUPP;
1202 1.134 msaitoh } else if (error) {
1203 1.134 msaitoh device_printf(adapter->dev,
1204 1.134 msaitoh "number of Ethernet multicast addresses "
1205 1.134 msaitoh "exceeds the limit (%d). error = %d\n",
1206 1.134 msaitoh IXGBE_MAX_VF_MC, error);
1207 1.134 msaitoh error = ENOSPC;
1208 1.134 msaitoh } else {
1209 1.138 msaitoh ETHER_LOCK(ec);
1210 1.134 msaitoh ec->ec_flags |= ETHER_F_ALLMULTI;
1211 1.138 msaitoh ETHER_UNLOCK(ec);
1212 1.148 msaitoh return rc; /* Promisc might have failed */
1213 1.134 msaitoh }
1214 1.138 msaitoh
1215 1.138 msaitoh if (rc == 0)
1216 1.138 msaitoh rc = error;
1217 1.138 msaitoh
1218 1.138 msaitoh /* Continue to update the multicast table as many as we can */
1219 1.134 msaitoh }
1220 1.134 msaitoh
1221 1.138 msaitoh /* 4: For normal operation */
1222 1.138 msaitoh error = hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
1223 1.138 msaitoh if ((error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) || (error == 0)) {
1224 1.138 msaitoh /* Normal operation */
1225 1.138 msaitoh ETHER_LOCK(ec);
1226 1.134 msaitoh ec->ec_flags &= ~ETHER_F_ALLMULTI;
1227 1.138 msaitoh ETHER_UNLOCK(ec);
1228 1.138 msaitoh error = 0;
1229 1.138 msaitoh } else if (error) {
1230 1.138 msaitoh device_printf(adapter->dev,
1231 1.138 msaitoh "failed to set Ethernet multicast address "
1232 1.138 msaitoh "operation to normal. error = %d\n", error);
1233 1.134 msaitoh }
1234 1.134 msaitoh
1235 1.170 msaitoh update_ptr = (u8 *)mta;
1236 1.138 msaitoh error = adapter->hw.mac.ops.update_mc_addr_list(&adapter->hw,
1237 1.138 msaitoh update_ptr, mcnt, ixv_mc_array_itr, TRUE);
1238 1.138 msaitoh if (rc == 0)
1239 1.138 msaitoh rc = error;
1240 1.138 msaitoh
1241 1.138 msaitoh return rc;
1242 1.138 msaitoh } /* ixv_set_rxfilter */
1243 1.1 dyoung
1244 1.58 msaitoh /************************************************************************
1245 1.58 msaitoh * ixv_mc_array_itr
1246 1.58 msaitoh *
1247 1.58 msaitoh * An iterator function needed by the multicast shared code.
1248 1.58 msaitoh * It feeds the shared code routine the addresses in the
1249 1.138 msaitoh * array of ixv_set_rxfilter() one by one.
1250 1.58 msaitoh ************************************************************************/
1251 1.1 dyoung static u8 *
1252 1.1 dyoung ixv_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
1253 1.1 dyoung {
1254 1.170 msaitoh struct ixgbe_mc_addr *mta;
1255 1.170 msaitoh
1256 1.170 msaitoh mta = (struct ixgbe_mc_addr *)*update_ptr;
1257 1.88 msaitoh
1258 1.1 dyoung *vmdq = 0;
1259 1.170 msaitoh *update_ptr = (u8*)(mta + 1);
1260 1.1 dyoung
1261 1.170 msaitoh return (mta->addr);
1262 1.58 msaitoh } /* ixv_mc_array_itr */
1263 1.1 dyoung
1264 1.58 msaitoh /************************************************************************
1265 1.58 msaitoh * ixv_local_timer - Timer routine
1266 1.1 dyoung *
1267 1.58 msaitoh * Checks for link status, updates statistics,
1268 1.58 msaitoh * and runs the watchdog check.
1269 1.58 msaitoh ************************************************************************/
1270 1.1 dyoung static void
1271 1.22 msaitoh ixv_local_timer(void *arg)
1272 1.22 msaitoh {
1273 1.22 msaitoh struct adapter *adapter = arg;
1274 1.22 msaitoh
1275 1.151 msaitoh if (adapter->schedule_wqs_ok) {
1276 1.152 msaitoh if (atomic_cas_uint(&adapter->timer_pending, 0, 1) == 0)
1277 1.151 msaitoh workqueue_enqueue(adapter->timer_wq,
1278 1.151 msaitoh &adapter->timer_wc, NULL);
1279 1.151 msaitoh }
1280 1.22 msaitoh }
1281 1.22 msaitoh
1282 1.22 msaitoh static void
1283 1.151 msaitoh ixv_handle_timer(struct work *wk, void *context)
1284 1.1 dyoung {
1285 1.151 msaitoh struct adapter *adapter = context;
1286 1.98 msaitoh device_t dev = adapter->dev;
1287 1.22 msaitoh struct ix_queue *que = adapter->queues;
1288 1.98 msaitoh u64 queues = 0;
1289 1.87 msaitoh u64 v0, v1, v2, v3, v4, v5, v6, v7;
1290 1.98 msaitoh int hung = 0;
1291 1.87 msaitoh int i;
1292 1.1 dyoung
1293 1.151 msaitoh IXGBE_CORE_LOCK(adapter);
1294 1.1 dyoung
1295 1.117 msaitoh if (ixv_check_link(adapter)) {
1296 1.117 msaitoh ixv_init_locked(adapter);
1297 1.151 msaitoh IXGBE_CORE_UNLOCK(adapter);
1298 1.117 msaitoh return;
1299 1.117 msaitoh }
1300 1.1 dyoung
1301 1.1 dyoung /* Stats Update */
1302 1.1 dyoung ixv_update_stats(adapter);
1303 1.1 dyoung
1304 1.87 msaitoh /* Update some event counters */
1305 1.87 msaitoh v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
1306 1.87 msaitoh que = adapter->queues;
1307 1.87 msaitoh for (i = 0; i < adapter->num_queues; i++, que++) {
1308 1.114 msaitoh struct tx_ring *txr = que->txr;
1309 1.87 msaitoh
1310 1.87 msaitoh v0 += txr->q_efbig_tx_dma_setup;
1311 1.87 msaitoh v1 += txr->q_mbuf_defrag_failed;
1312 1.87 msaitoh v2 += txr->q_efbig2_tx_dma_setup;
1313 1.87 msaitoh v3 += txr->q_einval_tx_dma_setup;
1314 1.87 msaitoh v4 += txr->q_other_tx_dma_setup;
1315 1.87 msaitoh v5 += txr->q_eagain_tx_dma_setup;
1316 1.87 msaitoh v6 += txr->q_enomem_tx_dma_setup;
1317 1.87 msaitoh v7 += txr->q_tso_err;
1318 1.87 msaitoh }
1319 1.178 msaitoh IXGBE_EVC_STORE(&adapter->efbig_tx_dma_setup, v0);
1320 1.178 msaitoh IXGBE_EVC_STORE(&adapter->mbuf_defrag_failed, v1);
1321 1.178 msaitoh IXGBE_EVC_STORE(&adapter->efbig2_tx_dma_setup, v2);
1322 1.178 msaitoh IXGBE_EVC_STORE(&adapter->einval_tx_dma_setup, v3);
1323 1.178 msaitoh IXGBE_EVC_STORE(&adapter->other_tx_dma_setup, v4);
1324 1.178 msaitoh IXGBE_EVC_STORE(&adapter->eagain_tx_dma_setup, v5);
1325 1.178 msaitoh IXGBE_EVC_STORE(&adapter->enomem_tx_dma_setup, v6);
1326 1.178 msaitoh IXGBE_EVC_STORE(&adapter->tso_err, v7);
1327 1.87 msaitoh
1328 1.98 msaitoh /*
1329 1.98 msaitoh * Check the TX queues status
1330 1.114 msaitoh * - mark hung queues so we don't schedule on them
1331 1.114 msaitoh * - watchdog only if all queues show hung
1332 1.98 msaitoh */
1333 1.98 msaitoh que = adapter->queues;
1334 1.98 msaitoh for (i = 0; i < adapter->num_queues; i++, que++) {
1335 1.98 msaitoh /* Keep track of queues with work for soft irq */
1336 1.98 msaitoh if (que->txr->busy)
1337 1.98 msaitoh queues |= ((u64)1 << que->me);
1338 1.21 msaitoh /*
1339 1.98 msaitoh * Each time txeof runs without cleaning, but there
1340 1.98 msaitoh * are uncleaned descriptors it increments busy. If
1341 1.98 msaitoh * we get to the MAX we declare it hung.
1342 1.58 msaitoh */
1343 1.98 msaitoh if (que->busy == IXGBE_QUEUE_HUNG) {
1344 1.98 msaitoh ++hung;
1345 1.98 msaitoh /* Mark the queue as inactive */
1346 1.98 msaitoh adapter->active_queues &= ~((u64)1 << que->me);
1347 1.98 msaitoh continue;
1348 1.98 msaitoh } else {
1349 1.98 msaitoh /* Check if we've come back from hung */
1350 1.98 msaitoh if ((adapter->active_queues & ((u64)1 << que->me)) == 0)
1351 1.98 msaitoh adapter->active_queues |= ((u64)1 << que->me);
1352 1.1 dyoung }
1353 1.98 msaitoh if (que->busy >= IXGBE_MAX_TX_BUSY) {
1354 1.98 msaitoh device_printf(dev,
1355 1.98 msaitoh "Warning queue %d appears to be hung!\n", i);
1356 1.98 msaitoh que->txr->busy = IXGBE_QUEUE_HUNG;
1357 1.98 msaitoh ++hung;
1358 1.98 msaitoh }
1359 1.98 msaitoh }
1360 1.98 msaitoh
1361 1.98 msaitoh /* Only truly watchdog if all queues show hung */
1362 1.98 msaitoh if (hung == adapter->num_queues)
1363 1.98 msaitoh goto watchdog;
1364 1.104 msaitoh #if 0
1365 1.98 msaitoh else if (queues != 0) { /* Force an IRQ on queues with work */
1366 1.98 msaitoh ixv_rearm_queues(adapter, queues);
1367 1.21 msaitoh }
1368 1.104 msaitoh #endif
1369 1.21 msaitoh
1370 1.152 msaitoh atomic_store_relaxed(&adapter->timer_pending, 0);
1371 1.151 msaitoh IXGBE_CORE_UNLOCK(adapter);
1372 1.98 msaitoh callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
1373 1.98 msaitoh
1374 1.98 msaitoh return;
1375 1.96 msaitoh
1376 1.98 msaitoh watchdog:
1377 1.98 msaitoh device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
1378 1.98 msaitoh adapter->ifp->if_flags &= ~IFF_RUNNING;
1379 1.178 msaitoh IXGBE_EVC_ADD(&adapter->watchdog_events, 1);
1380 1.98 msaitoh ixv_init_locked(adapter);
1381 1.151 msaitoh IXGBE_CORE_UNLOCK(adapter);
1382 1.151 msaitoh } /* ixv_handle_timer */
1383 1.1 dyoung
1384 1.58 msaitoh /************************************************************************
1385 1.58 msaitoh * ixv_update_link_status - Update OS on link state
1386 1.58 msaitoh *
1387 1.58 msaitoh * Note: Only updates the OS on the cached link state.
1388 1.114 msaitoh * The real check of the hardware only happens with
1389 1.114 msaitoh * a link interrupt.
1390 1.58 msaitoh ************************************************************************/
1391 1.1 dyoung static void
1392 1.1 dyoung ixv_update_link_status(struct adapter *adapter)
1393 1.1 dyoung {
1394 1.58 msaitoh struct ifnet *ifp = adapter->ifp;
1395 1.58 msaitoh device_t dev = adapter->dev;
1396 1.1 dyoung
1397 1.89 knakahar KASSERT(mutex_owned(&adapter->core_mtx));
1398 1.89 knakahar
1399 1.185 msaitoh if (adapter->link_up && adapter->link_enabled) {
1400 1.109 msaitoh if (adapter->link_active != LINK_STATE_UP) {
1401 1.42 msaitoh if (bootverbose) {
1402 1.42 msaitoh const char *bpsmsg;
1403 1.42 msaitoh
1404 1.42 msaitoh switch (adapter->link_speed) {
1405 1.42 msaitoh case IXGBE_LINK_SPEED_10GB_FULL:
1406 1.42 msaitoh bpsmsg = "10 Gbps";
1407 1.42 msaitoh break;
1408 1.58 msaitoh case IXGBE_LINK_SPEED_5GB_FULL:
1409 1.58 msaitoh bpsmsg = "5 Gbps";
1410 1.58 msaitoh break;
1411 1.58 msaitoh case IXGBE_LINK_SPEED_2_5GB_FULL:
1412 1.58 msaitoh bpsmsg = "2.5 Gbps";
1413 1.58 msaitoh break;
1414 1.42 msaitoh case IXGBE_LINK_SPEED_1GB_FULL:
1415 1.42 msaitoh bpsmsg = "1 Gbps";
1416 1.42 msaitoh break;
1417 1.42 msaitoh case IXGBE_LINK_SPEED_100_FULL:
1418 1.42 msaitoh bpsmsg = "100 Mbps";
1419 1.42 msaitoh break;
1420 1.58 msaitoh case IXGBE_LINK_SPEED_10_FULL:
1421 1.58 msaitoh bpsmsg = "10 Mbps";
1422 1.58 msaitoh break;
1423 1.42 msaitoh default:
1424 1.42 msaitoh bpsmsg = "unknown speed";
1425 1.42 msaitoh break;
1426 1.42 msaitoh }
1427 1.63 msaitoh device_printf(dev, "Link is up %s %s \n",
1428 1.42 msaitoh bpsmsg, "Full Duplex");
1429 1.42 msaitoh }
1430 1.109 msaitoh adapter->link_active = LINK_STATE_UP;
1431 1.1 dyoung if_link_state_change(ifp, LINK_STATE_UP);
1432 1.1 dyoung }
1433 1.109 msaitoh } else {
1434 1.109 msaitoh /*
1435 1.109 msaitoh * Do it when link active changes to DOWN. i.e.
1436 1.109 msaitoh * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
1437 1.114 msaitoh * b) LINK_STATE_UP -> LINK_STATE_DOWN
1438 1.109 msaitoh */
1439 1.109 msaitoh if (adapter->link_active != LINK_STATE_DOWN) {
1440 1.1 dyoung if (bootverbose)
1441 1.63 msaitoh device_printf(dev, "Link is Down\n");
1442 1.1 dyoung if_link_state_change(ifp, LINK_STATE_DOWN);
1443 1.109 msaitoh adapter->link_active = LINK_STATE_DOWN;
1444 1.1 dyoung }
1445 1.1 dyoung }
1446 1.58 msaitoh } /* ixv_update_link_status */
1447 1.1 dyoung
1448 1.1 dyoung
1449 1.58 msaitoh /************************************************************************
1450 1.58 msaitoh * ixv_stop - Stop the hardware
1451 1.58 msaitoh *
1452 1.58 msaitoh * Disables all traffic on the adapter by issuing a
1453 1.58 msaitoh * global reset on the MAC and deallocates TX/RX buffers.
1454 1.58 msaitoh ************************************************************************/
1455 1.3 msaitoh static void
1456 1.3 msaitoh ixv_ifstop(struct ifnet *ifp, int disable)
1457 1.3 msaitoh {
1458 1.3 msaitoh struct adapter *adapter = ifp->if_softc;
1459 1.3 msaitoh
1460 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
1461 1.153 msaitoh ixv_stop_locked(adapter);
1462 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
1463 1.151 msaitoh
1464 1.151 msaitoh workqueue_wait(adapter->admin_wq, &adapter->admin_wc);
1465 1.152 msaitoh atomic_store_relaxed(&adapter->admin_pending, 0);
1466 1.151 msaitoh workqueue_wait(adapter->timer_wq, &adapter->timer_wc);
1467 1.152 msaitoh atomic_store_relaxed(&adapter->timer_pending, 0);
1468 1.3 msaitoh }
1469 1.3 msaitoh
1470 1.1 dyoung static void
1471 1.153 msaitoh ixv_stop_locked(void *arg)
1472 1.1 dyoung {
1473 1.114 msaitoh struct ifnet *ifp;
1474 1.114 msaitoh struct adapter *adapter = arg;
1475 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
1476 1.58 msaitoh
1477 1.1 dyoung ifp = adapter->ifp;
1478 1.1 dyoung
1479 1.3 msaitoh KASSERT(mutex_owned(&adapter->core_mtx));
1480 1.1 dyoung
1481 1.153 msaitoh INIT_DEBUGOUT("ixv_stop_locked: begin\n");
1482 1.1 dyoung ixv_disable_intr(adapter);
1483 1.1 dyoung
1484 1.1 dyoung /* Tell the stack that the interface is no longer active */
1485 1.3 msaitoh ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1486 1.1 dyoung
1487 1.58 msaitoh hw->mac.ops.reset_hw(hw);
1488 1.1 dyoung adapter->hw.adapter_stopped = FALSE;
1489 1.58 msaitoh hw->mac.ops.stop_adapter(hw);
1490 1.98 msaitoh callout_stop(&adapter->timer);
1491 1.1 dyoung
1492 1.151 msaitoh /* Don't schedule workqueues. */
1493 1.151 msaitoh adapter->schedule_wqs_ok = false;
1494 1.151 msaitoh
1495 1.1 dyoung /* reprogram the RAR[0] in case user changed it. */
1496 1.58 msaitoh hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
1497 1.1 dyoung
1498 1.1 dyoung return;
1499 1.153 msaitoh } /* ixv_stop_locked */
1500 1.1 dyoung
1501 1.1 dyoung
1502 1.58 msaitoh /************************************************************************
1503 1.58 msaitoh * ixv_allocate_pci_resources
1504 1.58 msaitoh ************************************************************************/
1505 1.57 msaitoh static int
1506 1.57 msaitoh ixv_allocate_pci_resources(struct adapter *adapter,
1507 1.57 msaitoh const struct pci_attach_args *pa)
1508 1.1 dyoung {
1509 1.108 msaitoh pcireg_t memtype, csr;
1510 1.114 msaitoh device_t dev = adapter->dev;
1511 1.57 msaitoh bus_addr_t addr;
1512 1.57 msaitoh int flags;
1513 1.3 msaitoh
1514 1.57 msaitoh memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
1515 1.57 msaitoh switch (memtype) {
1516 1.57 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1517 1.57 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1518 1.57 msaitoh adapter->osdep.mem_bus_space_tag = pa->pa_memt;
1519 1.57 msaitoh if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
1520 1.114 msaitoh memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
1521 1.57 msaitoh goto map_err;
1522 1.57 msaitoh if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
1523 1.57 msaitoh aprint_normal_dev(dev, "clearing prefetchable bit\n");
1524 1.57 msaitoh flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
1525 1.57 msaitoh }
1526 1.57 msaitoh if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
1527 1.57 msaitoh adapter->osdep.mem_size, flags,
1528 1.3 msaitoh &adapter->osdep.mem_bus_space_handle) != 0) {
1529 1.3 msaitoh map_err:
1530 1.3 msaitoh adapter->osdep.mem_size = 0;
1531 1.3 msaitoh aprint_error_dev(dev, "unable to map BAR0\n");
1532 1.3 msaitoh return ENXIO;
1533 1.3 msaitoh }
1534 1.108 msaitoh /*
1535 1.108 msaitoh * Enable address decoding for memory range in case it's not
1536 1.108 msaitoh * set.
1537 1.108 msaitoh */
1538 1.108 msaitoh csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
1539 1.108 msaitoh PCI_COMMAND_STATUS_REG);
1540 1.108 msaitoh csr |= PCI_COMMAND_MEM_ENABLE;
1541 1.108 msaitoh pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
1542 1.108 msaitoh csr);
1543 1.3 msaitoh break;
1544 1.3 msaitoh default:
1545 1.3 msaitoh aprint_error_dev(dev, "unexpected type on BAR0\n");
1546 1.3 msaitoh return ENXIO;
1547 1.1 dyoung }
1548 1.1 dyoung
1549 1.23 msaitoh /* Pick up the tuneable queues */
1550 1.23 msaitoh adapter->num_queues = ixv_num_queues;
1551 1.1 dyoung
1552 1.58 msaitoh return (0);
1553 1.58 msaitoh } /* ixv_allocate_pci_resources */
1554 1.1 dyoung
1555 1.151 msaitoh static void
1556 1.154 msaitoh ixv_free_deferred_handlers(struct adapter *adapter)
1557 1.151 msaitoh {
1558 1.151 msaitoh struct ix_queue *que = adapter->queues;
1559 1.151 msaitoh struct tx_ring *txr = adapter->tx_rings;
1560 1.151 msaitoh int i;
1561 1.151 msaitoh
1562 1.151 msaitoh for (i = 0; i < adapter->num_queues; i++, que++, txr++) {
1563 1.151 msaitoh if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
1564 1.151 msaitoh if (txr->txr_si != NULL)
1565 1.151 msaitoh softint_disestablish(txr->txr_si);
1566 1.151 msaitoh }
1567 1.151 msaitoh if (que->que_si != NULL)
1568 1.151 msaitoh softint_disestablish(que->que_si);
1569 1.151 msaitoh }
1570 1.151 msaitoh if (adapter->txr_wq != NULL)
1571 1.151 msaitoh workqueue_destroy(adapter->txr_wq);
1572 1.151 msaitoh if (adapter->txr_wq_enqueued != NULL)
1573 1.151 msaitoh percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
1574 1.151 msaitoh if (adapter->que_wq != NULL)
1575 1.151 msaitoh workqueue_destroy(adapter->que_wq);
1576 1.151 msaitoh
1577 1.151 msaitoh /* Drain the Mailbox(link) queue */
1578 1.151 msaitoh if (adapter->admin_wq != NULL) {
1579 1.151 msaitoh workqueue_destroy(adapter->admin_wq);
1580 1.151 msaitoh adapter->admin_wq = NULL;
1581 1.151 msaitoh }
1582 1.151 msaitoh if (adapter->timer_wq != NULL) {
1583 1.151 msaitoh workqueue_destroy(adapter->timer_wq);
1584 1.151 msaitoh adapter->timer_wq = NULL;
1585 1.151 msaitoh }
1586 1.154 msaitoh } /* ixv_free_deferred_handlers */
1587 1.151 msaitoh
1588 1.58 msaitoh /************************************************************************
1589 1.58 msaitoh * ixv_free_pci_resources
1590 1.58 msaitoh ************************************************************************/
1591 1.1 dyoung static void
1592 1.1 dyoung ixv_free_pci_resources(struct adapter * adapter)
1593 1.1 dyoung {
1594 1.114 msaitoh struct ix_queue *que = adapter->queues;
1595 1.11 msaitoh int rid;
1596 1.1 dyoung
1597 1.1 dyoung /*
1598 1.58 msaitoh * Release all msix queue resources:
1599 1.58 msaitoh */
1600 1.1 dyoung for (int i = 0; i < adapter->num_queues; i++, que++) {
1601 1.1 dyoung if (que->res != NULL)
1602 1.11 msaitoh pci_intr_disestablish(adapter->osdep.pc,
1603 1.11 msaitoh adapter->osdep.ihs[i]);
1604 1.1 dyoung }
1605 1.1 dyoung
1606 1.12 msaitoh
1607 1.58 msaitoh /* Clean the Mailbox interrupt last */
1608 1.49 msaitoh rid = adapter->vector;
1609 1.1 dyoung
1610 1.41 msaitoh if (adapter->osdep.ihs[rid] != NULL) {
1611 1.11 msaitoh pci_intr_disestablish(adapter->osdep.pc,
1612 1.11 msaitoh adapter->osdep.ihs[rid]);
1613 1.41 msaitoh adapter->osdep.ihs[rid] = NULL;
1614 1.41 msaitoh }
1615 1.11 msaitoh
1616 1.11 msaitoh pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
1617 1.11 msaitoh adapter->osdep.nintrs);
1618 1.11 msaitoh
1619 1.11 msaitoh if (adapter->osdep.mem_size != 0) {
1620 1.11 msaitoh bus_space_unmap(adapter->osdep.mem_bus_space_tag,
1621 1.11 msaitoh adapter->osdep.mem_bus_space_handle,
1622 1.11 msaitoh adapter->osdep.mem_size);
1623 1.11 msaitoh }
1624 1.1 dyoung
1625 1.1 dyoung return;
1626 1.58 msaitoh } /* ixv_free_pci_resources */
1627 1.1 dyoung
1628 1.58 msaitoh /************************************************************************
1629 1.58 msaitoh * ixv_setup_interface
1630 1.1 dyoung *
1631 1.58 msaitoh * Setup networking device structure and register an interface.
1632 1.58 msaitoh ************************************************************************/
1633 1.73 msaitoh static int
1634 1.1 dyoung ixv_setup_interface(device_t dev, struct adapter *adapter)
1635 1.1 dyoung {
1636 1.3 msaitoh struct ethercom *ec = &adapter->osdep.ec;
1637 1.1 dyoung struct ifnet *ifp;
1638 1.1 dyoung
1639 1.1 dyoung INIT_DEBUGOUT("ixv_setup_interface: begin");
1640 1.1 dyoung
1641 1.3 msaitoh ifp = adapter->ifp = &ec->ec_if;
1642 1.3 msaitoh strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
1643 1.46 msaitoh ifp->if_baudrate = IF_Gbps(10);
1644 1.1 dyoung ifp->if_init = ixv_init;
1645 1.3 msaitoh ifp->if_stop = ixv_ifstop;
1646 1.1 dyoung ifp->if_softc = adapter;
1647 1.1 dyoung ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1648 1.55 msaitoh #ifdef IXGBE_MPSAFE
1649 1.74 ozaki ifp->if_extflags = IFEF_MPSAFE;
1650 1.55 msaitoh #endif
1651 1.1 dyoung ifp->if_ioctl = ixv_ioctl;
1652 1.58 msaitoh if (adapter->feat_en & IXGBE_FEATURE_LEGACY_TX) {
1653 1.58 msaitoh #if 0
1654 1.58 msaitoh ixv_start_locked = ixgbe_legacy_start_locked;
1655 1.58 msaitoh #endif
1656 1.58 msaitoh } else {
1657 1.58 msaitoh ifp->if_transmit = ixgbe_mq_start;
1658 1.58 msaitoh #if 0
1659 1.58 msaitoh ixv_start_locked = ixgbe_mq_start_locked;
1660 1.35 msaitoh #endif
1661 1.58 msaitoh }
1662 1.58 msaitoh ifp->if_start = ixgbe_legacy_start;
1663 1.45 msaitoh IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
1664 1.45 msaitoh IFQ_SET_READY(&ifp->if_snd);
1665 1.1 dyoung
1666 1.162 riastrad if_initialize(ifp);
1667 1.52 msaitoh adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
1668 1.1 dyoung ether_ifattach(ifp, adapter->hw.mac.addr);
1669 1.141 msaitoh aprint_normal_dev(dev, "Ethernet address %s\n",
1670 1.141 msaitoh ether_sprintf(adapter->hw.mac.addr));
1671 1.51 msaitoh /*
1672 1.51 msaitoh * We use per TX queue softint, so if_deferred_start_init() isn't
1673 1.51 msaitoh * used.
1674 1.51 msaitoh */
1675 1.3 msaitoh ether_set_ifflags_cb(ec, ixv_ifflags_cb);
1676 1.1 dyoung
1677 1.58 msaitoh adapter->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
1678 1.1 dyoung
1679 1.1 dyoung /*
1680 1.1 dyoung * Tell the upper layer(s) we support long frames.
1681 1.1 dyoung */
1682 1.3 msaitoh ifp->if_hdrlen = sizeof(struct ether_vlan_header);
1683 1.3 msaitoh
1684 1.58 msaitoh /* Set capability flags */
1685 1.58 msaitoh ifp->if_capabilities |= IFCAP_HWCSUM
1686 1.114 msaitoh | IFCAP_TSOv4
1687 1.114 msaitoh | IFCAP_TSOv6;
1688 1.3 msaitoh ifp->if_capenable = 0;
1689 1.1 dyoung
1690 1.120 msaitoh ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER
1691 1.120 msaitoh | ETHERCAP_VLAN_HWTAGGING
1692 1.58 msaitoh | ETHERCAP_VLAN_HWCSUM
1693 1.58 msaitoh | ETHERCAP_JUMBO_MTU
1694 1.58 msaitoh | ETHERCAP_VLAN_MTU;
1695 1.58 msaitoh
1696 1.58 msaitoh /* Enable the above capabilities by default */
1697 1.3 msaitoh ec->ec_capenable = ec->ec_capabilities;
1698 1.1 dyoung
1699 1.3 msaitoh /* Don't enable LRO by default */
1700 1.107 msaitoh #if 0
1701 1.107 msaitoh /* NetBSD doesn't support LRO yet */
1702 1.3 msaitoh ifp->if_capabilities |= IFCAP_LRO;
1703 1.21 msaitoh #endif
1704 1.3 msaitoh
1705 1.3 msaitoh /*
1706 1.1 dyoung * Specify the media types supported by this adapter and register
1707 1.1 dyoung * callbacks to update media and link information
1708 1.1 dyoung */
1709 1.115 msaitoh ec->ec_ifmedia = &adapter->media;
1710 1.147 thorpej ifmedia_init_with_lock(&adapter->media, IFM_IMASK, ixv_media_change,
1711 1.147 thorpej ixv_media_status, &adapter->core_mtx);
1712 1.1 dyoung ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1713 1.1 dyoung ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1714 1.1 dyoung
1715 1.101 ozaki if_register(ifp);
1716 1.101 ozaki
1717 1.73 msaitoh return 0;
1718 1.58 msaitoh } /* ixv_setup_interface */
1719 1.58 msaitoh
1720 1.58 msaitoh
1721 1.58 msaitoh /************************************************************************
1722 1.58 msaitoh * ixv_initialize_transmit_units - Enable transmit unit.
1723 1.58 msaitoh ************************************************************************/
1724 1.21 msaitoh static void
1725 1.21 msaitoh ixv_initialize_transmit_units(struct adapter *adapter)
1726 1.1 dyoung {
1727 1.21 msaitoh struct tx_ring *txr = adapter->tx_rings;
1728 1.21 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1729 1.91 msaitoh int i;
1730 1.1 dyoung
1731 1.91 msaitoh for (i = 0; i < adapter->num_queues; i++, txr++) {
1732 1.58 msaitoh u64 tdba = txr->txdma.dma_paddr;
1733 1.58 msaitoh u32 txctrl, txdctl;
1734 1.91 msaitoh int j = txr->me;
1735 1.1 dyoung
1736 1.21 msaitoh /* Set WTHRESH to 8, burst writeback */
1737 1.91 msaitoh txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
1738 1.168 msaitoh txdctl |= IXGBE_TX_WTHRESH << IXGBE_TXDCTL_WTHRESH_SHIFT;
1739 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
1740 1.1 dyoung
1741 1.21 msaitoh /* Set the HW Tx Head and Tail indices */
1742 1.91 msaitoh IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDH(j), 0);
1743 1.91 msaitoh IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDT(j), 0);
1744 1.1 dyoung
1745 1.21 msaitoh /* Set Tx Tail register */
1746 1.91 msaitoh txr->tail = IXGBE_VFTDT(j);
1747 1.1 dyoung
1748 1.100 msaitoh txr->txr_no_space = false;
1749 1.100 msaitoh
1750 1.21 msaitoh /* Set Ring parameters */
1751 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(j),
1752 1.57 msaitoh (tdba & 0x00000000ffffffffULL));
1753 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(j), (tdba >> 32));
1754 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(j),
1755 1.58 msaitoh adapter->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc));
1756 1.91 msaitoh txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(j));
1757 1.21 msaitoh txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
1758 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(j), txctrl);
1759 1.1 dyoung
1760 1.21 msaitoh /* Now enable */
1761 1.91 msaitoh txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
1762 1.21 msaitoh txdctl |= IXGBE_TXDCTL_ENABLE;
1763 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
1764 1.1 dyoung }
1765 1.1 dyoung
1766 1.21 msaitoh return;
1767 1.58 msaitoh } /* ixv_initialize_transmit_units */
1768 1.58 msaitoh
1769 1.58 msaitoh
1770 1.58 msaitoh /************************************************************************
1771 1.58 msaitoh * ixv_initialize_rss_mapping
1772 1.58 msaitoh ************************************************************************/
1773 1.58 msaitoh static void
1774 1.58 msaitoh ixv_initialize_rss_mapping(struct adapter *adapter)
1775 1.58 msaitoh {
1776 1.58 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1777 1.114 msaitoh u32 reta = 0, mrqc, rss_key[10];
1778 1.114 msaitoh int queue_id;
1779 1.114 msaitoh int i, j;
1780 1.114 msaitoh u32 rss_hash_config;
1781 1.58 msaitoh
1782 1.78 knakahar /* force use default RSS key. */
1783 1.78 knakahar #ifdef __NetBSD__
1784 1.78 knakahar rss_getkey((uint8_t *) &rss_key);
1785 1.78 knakahar #else
1786 1.58 msaitoh if (adapter->feat_en & IXGBE_FEATURE_RSS) {
1787 1.58 msaitoh /* Fetch the configured RSS key */
1788 1.58 msaitoh rss_getkey((uint8_t *)&rss_key);
1789 1.58 msaitoh } else {
1790 1.58 msaitoh /* set up random bits */
1791 1.58 msaitoh cprng_fast(&rss_key, sizeof(rss_key));
1792 1.58 msaitoh }
1793 1.78 knakahar #endif
1794 1.58 msaitoh
1795 1.58 msaitoh /* Now fill out hash function seeds */
1796 1.58 msaitoh for (i = 0; i < 10; i++)
1797 1.58 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), rss_key[i]);
1798 1.58 msaitoh
1799 1.58 msaitoh /* Set up the redirection table */
1800 1.58 msaitoh for (i = 0, j = 0; i < 64; i++, j++) {
1801 1.58 msaitoh if (j == adapter->num_queues)
1802 1.58 msaitoh j = 0;
1803 1.1 dyoung
1804 1.58 msaitoh if (adapter->feat_en & IXGBE_FEATURE_RSS) {
1805 1.58 msaitoh /*
1806 1.58 msaitoh * Fetch the RSS bucket id for the given indirection
1807 1.58 msaitoh * entry. Cap it at the number of configured buckets
1808 1.58 msaitoh * (which is num_queues.)
1809 1.58 msaitoh */
1810 1.58 msaitoh queue_id = rss_get_indirection_to_bucket(i);
1811 1.58 msaitoh queue_id = queue_id % adapter->num_queues;
1812 1.58 msaitoh } else
1813 1.58 msaitoh queue_id = j;
1814 1.1 dyoung
1815 1.58 msaitoh /*
1816 1.58 msaitoh * The low 8 bits are for hash value (n+0);
1817 1.58 msaitoh * The next 8 bits are for hash value (n+1), etc.
1818 1.58 msaitoh */
1819 1.58 msaitoh reta >>= 8;
1820 1.58 msaitoh reta |= ((uint32_t)queue_id) << 24;
1821 1.58 msaitoh if ((i & 3) == 3) {
1822 1.58 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRETA(i >> 2), reta);
1823 1.58 msaitoh reta = 0;
1824 1.58 msaitoh }
1825 1.58 msaitoh }
1826 1.21 msaitoh
1827 1.58 msaitoh /* Perform hash on these packet types */
1828 1.58 msaitoh if (adapter->feat_en & IXGBE_FEATURE_RSS)
1829 1.58 msaitoh rss_hash_config = rss_gethashconfig();
1830 1.58 msaitoh else {
1831 1.58 msaitoh /*
1832 1.58 msaitoh * Disable UDP - IP fragments aren't currently being handled
1833 1.58 msaitoh * and so we end up with a mix of 2-tuple and 4-tuple
1834 1.58 msaitoh * traffic.
1835 1.58 msaitoh */
1836 1.58 msaitoh rss_hash_config = RSS_HASHTYPE_RSS_IPV4
1837 1.114 msaitoh | RSS_HASHTYPE_RSS_TCP_IPV4
1838 1.114 msaitoh | RSS_HASHTYPE_RSS_IPV6
1839 1.114 msaitoh | RSS_HASHTYPE_RSS_TCP_IPV6;
1840 1.58 msaitoh }
1841 1.58 msaitoh
1842 1.58 msaitoh mrqc = IXGBE_MRQC_RSSEN;
1843 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
1844 1.58 msaitoh mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
1845 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
1846 1.58 msaitoh mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
1847 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
1848 1.58 msaitoh mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
1849 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
1850 1.58 msaitoh mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
1851 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
1852 1.182 msaitoh device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_IPV6_EX "
1853 1.182 msaitoh "defined, but not supported\n", __func__);
1854 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
1855 1.182 msaitoh device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_TCP_IPV6_EX "
1856 1.182 msaitoh "defined, but not supported\n", __func__);
1857 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
1858 1.58 msaitoh mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
1859 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
1860 1.58 msaitoh mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
1861 1.58 msaitoh if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
1862 1.182 msaitoh device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_UDP_IPV6_EX "
1863 1.182 msaitoh "defined, but not supported\n", __func__);
1864 1.58 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, mrqc);
1865 1.58 msaitoh } /* ixv_initialize_rss_mapping */
1866 1.58 msaitoh
1867 1.58 msaitoh
1868 1.58 msaitoh /************************************************************************
1869 1.58 msaitoh * ixv_initialize_receive_units - Setup receive registers and features.
1870 1.58 msaitoh ************************************************************************/
1871 1.21 msaitoh static void
1872 1.21 msaitoh ixv_initialize_receive_units(struct adapter *adapter)
1873 1.1 dyoung {
1874 1.21 msaitoh struct rx_ring *rxr = adapter->rx_rings;
1875 1.21 msaitoh struct ixgbe_hw *hw = &adapter->hw;
1876 1.23 msaitoh struct ifnet *ifp = adapter->ifp;
1877 1.117 msaitoh u32 bufsz, psrtype;
1878 1.1 dyoung
1879 1.23 msaitoh if (ifp->if_mtu > ETHERMTU)
1880 1.23 msaitoh bufsz = 4096 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1881 1.23 msaitoh else
1882 1.23 msaitoh bufsz = 2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1883 1.1 dyoung
1884 1.58 msaitoh psrtype = IXGBE_PSRTYPE_TCPHDR
1885 1.114 msaitoh | IXGBE_PSRTYPE_UDPHDR
1886 1.114 msaitoh | IXGBE_PSRTYPE_IPV4HDR
1887 1.114 msaitoh | IXGBE_PSRTYPE_IPV6HDR
1888 1.114 msaitoh | IXGBE_PSRTYPE_L2HDR;
1889 1.58 msaitoh
1890 1.58 msaitoh if (adapter->num_queues > 1)
1891 1.58 msaitoh psrtype |= 1 << 29;
1892 1.1 dyoung
1893 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
1894 1.23 msaitoh
1895 1.26 msaitoh /* Tell PF our max_frame size */
1896 1.58 msaitoh if (ixgbevf_rlpml_set_vf(hw, adapter->max_frame_size) != 0) {
1897 1.182 msaitoh device_printf(adapter->dev, "There is a problem with the PF "
1898 1.182 msaitoh "setup. It is likely the receive unit for this VF will "
1899 1.182 msaitoh "not function correctly.\n");
1900 1.58 msaitoh }
1901 1.1 dyoung
1902 1.23 msaitoh for (int i = 0; i < adapter->num_queues; i++, rxr++) {
1903 1.1 dyoung u64 rdba = rxr->rxdma.dma_paddr;
1904 1.1 dyoung u32 reg, rxdctl;
1905 1.91 msaitoh int j = rxr->me;
1906 1.1 dyoung
1907 1.23 msaitoh /* Disable the queue */
1908 1.91 msaitoh rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j));
1909 1.28 msaitoh rxdctl &= ~IXGBE_RXDCTL_ENABLE;
1910 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1911 1.91 msaitoh for (int k = 0; k < 10; k++) {
1912 1.91 msaitoh if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
1913 1.23 msaitoh IXGBE_RXDCTL_ENABLE)
1914 1.23 msaitoh msec_delay(1);
1915 1.23 msaitoh else
1916 1.23 msaitoh break;
1917 1.23 msaitoh }
1918 1.143 msaitoh IXGBE_WRITE_BARRIER(hw);
1919 1.1 dyoung /* Setup the Base and Length of the Rx Descriptor Ring */
1920 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(j),
1921 1.1 dyoung (rdba & 0x00000000ffffffffULL));
1922 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(j), (rdba >> 32));
1923 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(j),
1924 1.1 dyoung adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
1925 1.1 dyoung
1926 1.23 msaitoh /* Reset the ring indices */
1927 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0);
1928 1.23 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), 0);
1929 1.23 msaitoh
1930 1.1 dyoung /* Set up the SRRCTL register */
1931 1.91 msaitoh reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(j));
1932 1.1 dyoung reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
1933 1.1 dyoung reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
1934 1.1 dyoung reg |= bufsz;
1935 1.21 msaitoh reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
1936 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(j), reg);
1937 1.1 dyoung
1938 1.23 msaitoh /* Capture Rx Tail index */
1939 1.21 msaitoh rxr->tail = IXGBE_VFRDT(rxr->me);
1940 1.21 msaitoh
1941 1.21 msaitoh /* Do the queue enabling last */
1942 1.28 msaitoh rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME;
1943 1.91 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1944 1.21 msaitoh for (int k = 0; k < 10; k++) {
1945 1.91 msaitoh if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
1946 1.21 msaitoh IXGBE_RXDCTL_ENABLE)
1947 1.21 msaitoh break;
1948 1.58 msaitoh msec_delay(1);
1949 1.21 msaitoh }
1950 1.143 msaitoh IXGBE_WRITE_BARRIER(hw);
1951 1.24 msaitoh
1952 1.24 msaitoh /* Set the Tail Pointer */
1953 1.88 msaitoh #ifdef DEV_NETMAP
1954 1.25 msaitoh /*
1955 1.25 msaitoh * In netmap mode, we must preserve the buffers made
1956 1.25 msaitoh * available to userspace before the if_init()
1957 1.25 msaitoh * (this is true by default on the TX side, because
1958 1.25 msaitoh * init makes all buffers available to userspace).
1959 1.25 msaitoh *
1960 1.25 msaitoh * netmap_reset() and the device specific routines
1961 1.25 msaitoh * (e.g. ixgbe_setup_receive_rings()) map these
1962 1.25 msaitoh * buffers at the end of the NIC ring, so here we
1963 1.25 msaitoh * must set the RDT (tail) register to make sure
1964 1.25 msaitoh * they are not overwritten.
1965 1.25 msaitoh *
1966 1.25 msaitoh * In this driver the NIC ring starts at RDH = 0,
1967 1.25 msaitoh * RDT points to the last slot available for reception (?),
1968 1.25 msaitoh * so RDT = num_rx_desc - 1 means the whole ring is available.
1969 1.25 msaitoh */
1970 1.58 msaitoh if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
1971 1.58 msaitoh (ifp->if_capenable & IFCAP_NETMAP)) {
1972 1.25 msaitoh struct netmap_adapter *na = NA(adapter->ifp);
1973 1.117 msaitoh struct netmap_kring *kring = na->rx_rings[i];
1974 1.25 msaitoh int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
1975 1.25 msaitoh
1976 1.25 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), t);
1977 1.25 msaitoh } else
1978 1.25 msaitoh #endif /* DEV_NETMAP */
1979 1.25 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me),
1980 1.25 msaitoh adapter->num_rx_desc - 1);
1981 1.1 dyoung }
1982 1.1 dyoung
1983 1.140 msaitoh if (adapter->hw.mac.type >= ixgbe_mac_X550_vf)
1984 1.140 msaitoh ixv_initialize_rss_mapping(adapter);
1985 1.58 msaitoh } /* ixv_initialize_receive_units */
1986 1.1 dyoung
1987 1.58 msaitoh /************************************************************************
1988 1.83 msaitoh * ixv_sysctl_tdh_handler - Transmit Descriptor Head handler function
1989 1.83 msaitoh *
1990 1.83 msaitoh * Retrieves the TDH value from the hardware
1991 1.83 msaitoh ************************************************************************/
1992 1.113 msaitoh static int
1993 1.83 msaitoh ixv_sysctl_tdh_handler(SYSCTLFN_ARGS)
1994 1.83 msaitoh {
1995 1.83 msaitoh struct sysctlnode node = *rnode;
1996 1.83 msaitoh struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
1997 1.83 msaitoh uint32_t val;
1998 1.83 msaitoh
1999 1.83 msaitoh if (!txr)
2000 1.83 msaitoh return (0);
2001 1.83 msaitoh
2002 1.83 msaitoh val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_VFTDH(txr->me));
2003 1.83 msaitoh node.sysctl_data = &val;
2004 1.83 msaitoh return sysctl_lookup(SYSCTLFN_CALL(&node));
2005 1.83 msaitoh } /* ixv_sysctl_tdh_handler */
2006 1.83 msaitoh
2007 1.83 msaitoh /************************************************************************
2008 1.83 msaitoh * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
2009 1.83 msaitoh *
2010 1.83 msaitoh * Retrieves the TDT value from the hardware
2011 1.83 msaitoh ************************************************************************/
2012 1.113 msaitoh static int
2013 1.83 msaitoh ixv_sysctl_tdt_handler(SYSCTLFN_ARGS)
2014 1.83 msaitoh {
2015 1.83 msaitoh struct sysctlnode node = *rnode;
2016 1.83 msaitoh struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2017 1.83 msaitoh uint32_t val;
2018 1.83 msaitoh
2019 1.83 msaitoh if (!txr)
2020 1.83 msaitoh return (0);
2021 1.83 msaitoh
2022 1.83 msaitoh val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_VFTDT(txr->me));
2023 1.83 msaitoh node.sysctl_data = &val;
2024 1.83 msaitoh return sysctl_lookup(SYSCTLFN_CALL(&node));
2025 1.83 msaitoh } /* ixv_sysctl_tdt_handler */
2026 1.83 msaitoh
2027 1.83 msaitoh /************************************************************************
2028 1.99 msaitoh * ixv_sysctl_next_to_check_handler - Receive Descriptor next to check
2029 1.99 msaitoh * handler function
2030 1.99 msaitoh *
2031 1.99 msaitoh * Retrieves the next_to_check value
2032 1.99 msaitoh ************************************************************************/
2033 1.113 msaitoh static int
2034 1.99 msaitoh ixv_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
2035 1.99 msaitoh {
2036 1.99 msaitoh struct sysctlnode node = *rnode;
2037 1.99 msaitoh struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2038 1.99 msaitoh uint32_t val;
2039 1.99 msaitoh
2040 1.99 msaitoh if (!rxr)
2041 1.99 msaitoh return (0);
2042 1.99 msaitoh
2043 1.99 msaitoh val = rxr->next_to_check;
2044 1.99 msaitoh node.sysctl_data = &val;
2045 1.99 msaitoh return sysctl_lookup(SYSCTLFN_CALL(&node));
2046 1.99 msaitoh } /* ixv_sysctl_next_to_check_handler */
2047 1.99 msaitoh
2048 1.99 msaitoh /************************************************************************
2049 1.164 msaitoh * ixv_sysctl_next_to_refresh_handler - Receive Descriptor next to refresh
2050 1.164 msaitoh * handler function
2051 1.164 msaitoh *
2052 1.164 msaitoh * Retrieves the next_to_refresh value
2053 1.164 msaitoh ************************************************************************/
2054 1.164 msaitoh static int
2055 1.164 msaitoh ixv_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
2056 1.164 msaitoh {
2057 1.164 msaitoh struct sysctlnode node = *rnode;
2058 1.164 msaitoh struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2059 1.164 msaitoh struct adapter *adapter;
2060 1.164 msaitoh uint32_t val;
2061 1.164 msaitoh
2062 1.164 msaitoh if (!rxr)
2063 1.164 msaitoh return (0);
2064 1.164 msaitoh
2065 1.164 msaitoh adapter = rxr->adapter;
2066 1.164 msaitoh if (ixgbe_fw_recovery_mode_swflag(adapter))
2067 1.164 msaitoh return (EPERM);
2068 1.164 msaitoh
2069 1.164 msaitoh val = rxr->next_to_refresh;
2070 1.164 msaitoh node.sysctl_data = &val;
2071 1.164 msaitoh return sysctl_lookup(SYSCTLFN_CALL(&node));
2072 1.164 msaitoh } /* ixv_sysctl_next_to_refresh_handler */
2073 1.164 msaitoh
2074 1.164 msaitoh /************************************************************************
2075 1.83 msaitoh * ixv_sysctl_rdh_handler - Receive Descriptor Head handler function
2076 1.83 msaitoh *
2077 1.83 msaitoh * Retrieves the RDH value from the hardware
2078 1.83 msaitoh ************************************************************************/
2079 1.113 msaitoh static int
2080 1.83 msaitoh ixv_sysctl_rdh_handler(SYSCTLFN_ARGS)
2081 1.83 msaitoh {
2082 1.83 msaitoh struct sysctlnode node = *rnode;
2083 1.83 msaitoh struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2084 1.83 msaitoh uint32_t val;
2085 1.83 msaitoh
2086 1.83 msaitoh if (!rxr)
2087 1.83 msaitoh return (0);
2088 1.83 msaitoh
2089 1.83 msaitoh val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_VFRDH(rxr->me));
2090 1.83 msaitoh node.sysctl_data = &val;
2091 1.83 msaitoh return sysctl_lookup(SYSCTLFN_CALL(&node));
2092 1.83 msaitoh } /* ixv_sysctl_rdh_handler */
2093 1.83 msaitoh
2094 1.83 msaitoh /************************************************************************
2095 1.83 msaitoh * ixv_sysctl_rdt_handler - Receive Descriptor Tail handler function
2096 1.83 msaitoh *
2097 1.83 msaitoh * Retrieves the RDT value from the hardware
2098 1.83 msaitoh ************************************************************************/
2099 1.113 msaitoh static int
2100 1.83 msaitoh ixv_sysctl_rdt_handler(SYSCTLFN_ARGS)
2101 1.83 msaitoh {
2102 1.83 msaitoh struct sysctlnode node = *rnode;
2103 1.83 msaitoh struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2104 1.83 msaitoh uint32_t val;
2105 1.83 msaitoh
2106 1.83 msaitoh if (!rxr)
2107 1.83 msaitoh return (0);
2108 1.83 msaitoh
2109 1.83 msaitoh val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_VFRDT(rxr->me));
2110 1.83 msaitoh node.sysctl_data = &val;
2111 1.83 msaitoh return sysctl_lookup(SYSCTLFN_CALL(&node));
2112 1.83 msaitoh } /* ixv_sysctl_rdt_handler */
2113 1.83 msaitoh
2114 1.126 msaitoh static void
2115 1.126 msaitoh ixv_setup_vlan_tagging(struct adapter *adapter)
2116 1.1 dyoung {
2117 1.65 msaitoh struct ethercom *ec = &adapter->osdep.ec;
2118 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
2119 1.114 msaitoh struct rx_ring *rxr;
2120 1.126 msaitoh u32 ctrl;
2121 1.126 msaitoh int i;
2122 1.110 msaitoh bool hwtagging;
2123 1.1 dyoung
2124 1.111 msaitoh /* Enable HW tagging only if any vlan is attached */
2125 1.110 msaitoh hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
2126 1.111 msaitoh && VLAN_ATTACHED(ec);
2127 1.1 dyoung
2128 1.1 dyoung /* Enable the queues */
2129 1.126 msaitoh for (i = 0; i < adapter->num_queues; i++) {
2130 1.65 msaitoh rxr = &adapter->rx_rings[i];
2131 1.65 msaitoh ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(rxr->me));
2132 1.110 msaitoh if (hwtagging)
2133 1.110 msaitoh ctrl |= IXGBE_RXDCTL_VME;
2134 1.110 msaitoh else
2135 1.110 msaitoh ctrl &= ~IXGBE_RXDCTL_VME;
2136 1.65 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(rxr->me), ctrl);
2137 1.26 msaitoh /*
2138 1.26 msaitoh * Let Rx path know that it needs to store VLAN tag
2139 1.26 msaitoh * as part of extra mbuf info.
2140 1.26 msaitoh */
2141 1.110 msaitoh rxr->vtag_strip = hwtagging ? TRUE : FALSE;
2142 1.1 dyoung }
2143 1.126 msaitoh } /* ixv_setup_vlan_tagging */
2144 1.126 msaitoh
2145 1.126 msaitoh /************************************************************************
2146 1.126 msaitoh * ixv_setup_vlan_support
2147 1.126 msaitoh ************************************************************************/
2148 1.126 msaitoh static int
2149 1.126 msaitoh ixv_setup_vlan_support(struct adapter *adapter)
2150 1.126 msaitoh {
2151 1.126 msaitoh struct ethercom *ec = &adapter->osdep.ec;
2152 1.126 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2153 1.126 msaitoh u32 vid, vfta, retry;
2154 1.126 msaitoh struct vlanid_list *vlanidp;
2155 1.126 msaitoh int rv, error = 0;
2156 1.1 dyoung
2157 1.126 msaitoh /*
2158 1.126 msaitoh * This function is called from both if_init and ifflags_cb()
2159 1.126 msaitoh * on NetBSD.
2160 1.126 msaitoh */
2161 1.126 msaitoh
2162 1.126 msaitoh /*
2163 1.126 msaitoh * Part 1:
2164 1.126 msaitoh * Setup VLAN HW tagging
2165 1.126 msaitoh */
2166 1.126 msaitoh ixv_setup_vlan_tagging(adapter);
2167 1.126 msaitoh
2168 1.126 msaitoh if (!VLAN_ATTACHED(ec))
2169 1.120 msaitoh return 0;
2170 1.120 msaitoh
2171 1.126 msaitoh /*
2172 1.126 msaitoh * Part 2:
2173 1.126 msaitoh * Setup VLAN HW filter
2174 1.126 msaitoh */
2175 1.120 msaitoh /* Cleanup shadow_vfta */
2176 1.65 msaitoh for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
2177 1.120 msaitoh adapter->shadow_vfta[i] = 0;
2178 1.120 msaitoh /* Generate shadow_vfta from ec_vids */
2179 1.127 msaitoh ETHER_LOCK(ec);
2180 1.120 msaitoh SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) {
2181 1.120 msaitoh uint32_t idx;
2182 1.120 msaitoh
2183 1.120 msaitoh idx = vlanidp->vid / 32;
2184 1.120 msaitoh KASSERT(idx < IXGBE_VFTA_SIZE);
2185 1.123 msaitoh adapter->shadow_vfta[idx] |= (u32)1 << (vlanidp->vid % 32);
2186 1.120 msaitoh }
2187 1.127 msaitoh ETHER_UNLOCK(ec);
2188 1.142 msaitoh
2189 1.1 dyoung /*
2190 1.58 msaitoh * A soft reset zero's out the VFTA, so
2191 1.58 msaitoh * we need to repopulate it now.
2192 1.58 msaitoh */
2193 1.21 msaitoh for (int i = 0; i < IXGBE_VFTA_SIZE; i++) {
2194 1.65 msaitoh if (adapter->shadow_vfta[i] == 0)
2195 1.1 dyoung continue;
2196 1.65 msaitoh vfta = adapter->shadow_vfta[i];
2197 1.1 dyoung /*
2198 1.58 msaitoh * Reconstruct the vlan id's
2199 1.58 msaitoh * based on the bits set in each
2200 1.58 msaitoh * of the array ints.
2201 1.58 msaitoh */
2202 1.26 msaitoh for (int j = 0; j < 32; j++) {
2203 1.1 dyoung retry = 0;
2204 1.123 msaitoh if ((vfta & ((u32)1 << j)) == 0)
2205 1.1 dyoung continue;
2206 1.1 dyoung vid = (i * 32) + j;
2207 1.142 msaitoh
2208 1.1 dyoung /* Call the shared code mailbox routine */
2209 1.120 msaitoh while ((rv = hw->mac.ops.set_vfta(hw, vid, 0, TRUE,
2210 1.120 msaitoh FALSE)) != 0) {
2211 1.120 msaitoh if (++retry > 5) {
2212 1.120 msaitoh device_printf(adapter->dev,
2213 1.120 msaitoh "%s: max retry exceeded\n",
2214 1.120 msaitoh __func__);
2215 1.1 dyoung break;
2216 1.120 msaitoh }
2217 1.120 msaitoh }
2218 1.120 msaitoh if (rv != 0) {
2219 1.120 msaitoh device_printf(adapter->dev,
2220 1.120 msaitoh "failed to set vlan %d\n", vid);
2221 1.120 msaitoh error = EACCES;
2222 1.1 dyoung }
2223 1.1 dyoung }
2224 1.1 dyoung }
2225 1.120 msaitoh return error;
2226 1.58 msaitoh } /* ixv_setup_vlan_support */
2227 1.1 dyoung
2228 1.120 msaitoh static int
2229 1.120 msaitoh ixv_vlan_cb(struct ethercom *ec, uint16_t vid, bool set)
2230 1.120 msaitoh {
2231 1.120 msaitoh struct ifnet *ifp = &ec->ec_if;
2232 1.126 msaitoh struct adapter *adapter = ifp->if_softc;
2233 1.120 msaitoh int rv;
2234 1.120 msaitoh
2235 1.120 msaitoh if (set)
2236 1.128 msaitoh rv = ixv_register_vlan(adapter, vid);
2237 1.120 msaitoh else
2238 1.128 msaitoh rv = ixv_unregister_vlan(adapter, vid);
2239 1.120 msaitoh
2240 1.126 msaitoh if (rv != 0)
2241 1.126 msaitoh return rv;
2242 1.126 msaitoh
2243 1.126 msaitoh /*
2244 1.126 msaitoh * Control VLAN HW tagging when ec_nvlan is changed from 1 to 0
2245 1.126 msaitoh * or 0 to 1.
2246 1.126 msaitoh */
2247 1.126 msaitoh if ((set && (ec->ec_nvlans == 1)) || (!set && (ec->ec_nvlans == 0)))
2248 1.126 msaitoh ixv_setup_vlan_tagging(adapter);
2249 1.126 msaitoh
2250 1.120 msaitoh return rv;
2251 1.120 msaitoh }
2252 1.120 msaitoh
2253 1.58 msaitoh /************************************************************************
2254 1.58 msaitoh * ixv_register_vlan
2255 1.58 msaitoh *
2256 1.58 msaitoh * Run via a vlan config EVENT, it enables us to use the
2257 1.58 msaitoh * HW Filter table since we can get the vlan id. This just
2258 1.58 msaitoh * creates the entry in the soft version of the VFTA, init
2259 1.58 msaitoh * will repopulate the real table.
2260 1.58 msaitoh ************************************************************************/
2261 1.120 msaitoh static int
2262 1.128 msaitoh ixv_register_vlan(struct adapter *adapter, u16 vtag)
2263 1.1 dyoung {
2264 1.120 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2265 1.1 dyoung u16 index, bit;
2266 1.120 msaitoh int error;
2267 1.1 dyoung
2268 1.26 msaitoh if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2269 1.120 msaitoh return EINVAL;
2270 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
2271 1.1 dyoung index = (vtag >> 5) & 0x7F;
2272 1.1 dyoung bit = vtag & 0x1F;
2273 1.122 msaitoh adapter->shadow_vfta[index] |= ((u32)1 << bit);
2274 1.120 msaitoh error = hw->mac.ops.set_vfta(hw, vtag, 0, true, false);
2275 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
2276 1.120 msaitoh
2277 1.120 msaitoh if (error != 0) {
2278 1.120 msaitoh device_printf(adapter->dev, "failed to register vlan %hu\n",
2279 1.120 msaitoh vtag);
2280 1.120 msaitoh error = EACCES;
2281 1.120 msaitoh }
2282 1.120 msaitoh return error;
2283 1.58 msaitoh } /* ixv_register_vlan */
2284 1.1 dyoung
2285 1.58 msaitoh /************************************************************************
2286 1.58 msaitoh * ixv_unregister_vlan
2287 1.58 msaitoh *
2288 1.58 msaitoh * Run via a vlan unconfig EVENT, remove our entry
2289 1.58 msaitoh * in the soft vfta.
2290 1.58 msaitoh ************************************************************************/
2291 1.120 msaitoh static int
2292 1.128 msaitoh ixv_unregister_vlan(struct adapter *adapter, u16 vtag)
2293 1.1 dyoung {
2294 1.120 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2295 1.1 dyoung u16 index, bit;
2296 1.142 msaitoh int error;
2297 1.1 dyoung
2298 1.58 msaitoh if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2299 1.120 msaitoh return EINVAL;
2300 1.1 dyoung
2301 1.21 msaitoh IXGBE_CORE_LOCK(adapter);
2302 1.1 dyoung index = (vtag >> 5) & 0x7F;
2303 1.1 dyoung bit = vtag & 0x1F;
2304 1.122 msaitoh adapter->shadow_vfta[index] &= ~((u32)1 << bit);
2305 1.120 msaitoh error = hw->mac.ops.set_vfta(hw, vtag, 0, false, false);
2306 1.21 msaitoh IXGBE_CORE_UNLOCK(adapter);
2307 1.120 msaitoh
2308 1.120 msaitoh if (error != 0) {
2309 1.120 msaitoh device_printf(adapter->dev, "failed to unregister vlan %hu\n",
2310 1.120 msaitoh vtag);
2311 1.120 msaitoh error = EIO;
2312 1.120 msaitoh }
2313 1.120 msaitoh return error;
2314 1.58 msaitoh } /* ixv_unregister_vlan */
2315 1.1 dyoung
2316 1.58 msaitoh /************************************************************************
2317 1.58 msaitoh * ixv_enable_intr
2318 1.58 msaitoh ************************************************************************/
2319 1.1 dyoung static void
2320 1.1 dyoung ixv_enable_intr(struct adapter *adapter)
2321 1.1 dyoung {
2322 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
2323 1.1 dyoung struct ix_queue *que = adapter->queues;
2324 1.114 msaitoh u32 mask;
2325 1.68 msaitoh int i;
2326 1.1 dyoung
2327 1.68 msaitoh /* For VTEIAC */
2328 1.68 msaitoh mask = (1 << adapter->vector);
2329 1.68 msaitoh for (i = 0; i < adapter->num_queues; i++, que++)
2330 1.68 msaitoh mask |= (1 << que->msix);
2331 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
2332 1.1 dyoung
2333 1.68 msaitoh /* For VTEIMS */
2334 1.68 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << adapter->vector));
2335 1.69 msaitoh que = adapter->queues;
2336 1.68 msaitoh for (i = 0; i < adapter->num_queues; i++, que++)
2337 1.1 dyoung ixv_enable_queue(adapter, que->msix);
2338 1.1 dyoung
2339 1.1 dyoung IXGBE_WRITE_FLUSH(hw);
2340 1.58 msaitoh } /* ixv_enable_intr */
2341 1.1 dyoung
2342 1.58 msaitoh /************************************************************************
2343 1.58 msaitoh * ixv_disable_intr
2344 1.58 msaitoh ************************************************************************/
2345 1.1 dyoung static void
2346 1.1 dyoung ixv_disable_intr(struct adapter *adapter)
2347 1.1 dyoung {
2348 1.82 knakahar struct ix_queue *que = adapter->queues;
2349 1.82 knakahar
2350 1.1 dyoung IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIAC, 0);
2351 1.82 knakahar
2352 1.82 knakahar /* disable interrupts other than queues */
2353 1.82 knakahar IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIMC, adapter->vector);
2354 1.82 knakahar
2355 1.82 knakahar for (int i = 0; i < adapter->num_queues; i++, que++)
2356 1.82 knakahar ixv_disable_queue(adapter, que->msix);
2357 1.82 knakahar
2358 1.1 dyoung IXGBE_WRITE_FLUSH(&adapter->hw);
2359 1.58 msaitoh } /* ixv_disable_intr */
2360 1.1 dyoung
2361 1.58 msaitoh /************************************************************************
2362 1.58 msaitoh * ixv_set_ivar
2363 1.58 msaitoh *
2364 1.58 msaitoh * Setup the correct IVAR register for a particular MSI-X interrupt
2365 1.58 msaitoh * - entry is the register array entry
2366 1.58 msaitoh * - vector is the MSI-X vector for this queue
2367 1.58 msaitoh * - type is RX/TX/MISC
2368 1.58 msaitoh ************************************************************************/
2369 1.1 dyoung static void
2370 1.1 dyoung ixv_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
2371 1.1 dyoung {
2372 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
2373 1.114 msaitoh u32 ivar, index;
2374 1.1 dyoung
2375 1.1 dyoung vector |= IXGBE_IVAR_ALLOC_VAL;
2376 1.1 dyoung
2377 1.1 dyoung if (type == -1) { /* MISC IVAR */
2378 1.1 dyoung ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
2379 1.1 dyoung ivar &= ~0xFF;
2380 1.1 dyoung ivar |= vector;
2381 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
2382 1.114 msaitoh } else { /* RX/TX IVARS */
2383 1.1 dyoung index = (16 * (entry & 1)) + (8 * type);
2384 1.1 dyoung ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1));
2385 1.121 msaitoh ivar &= ~(0xffUL << index);
2386 1.121 msaitoh ivar |= ((u32)vector << index);
2387 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar);
2388 1.1 dyoung }
2389 1.58 msaitoh } /* ixv_set_ivar */
2390 1.1 dyoung
2391 1.58 msaitoh /************************************************************************
2392 1.58 msaitoh * ixv_configure_ivars
2393 1.58 msaitoh ************************************************************************/
2394 1.1 dyoung static void
2395 1.1 dyoung ixv_configure_ivars(struct adapter *adapter)
2396 1.1 dyoung {
2397 1.58 msaitoh struct ix_queue *que = adapter->queues;
2398 1.1 dyoung
2399 1.80 msaitoh /* XXX We should sync EITR value calculation with ixgbe.c? */
2400 1.80 msaitoh
2401 1.57 msaitoh for (int i = 0; i < adapter->num_queues; i++, que++) {
2402 1.1 dyoung /* First the RX queue entry */
2403 1.57 msaitoh ixv_set_ivar(adapter, i, que->msix, 0);
2404 1.1 dyoung /* ... and the TX */
2405 1.1 dyoung ixv_set_ivar(adapter, i, que->msix, 1);
2406 1.1 dyoung /* Set an initial value in EITR */
2407 1.95 msaitoh ixv_eitr_write(adapter, que->msix, IXGBE_EITR_DEFAULT);
2408 1.1 dyoung }
2409 1.1 dyoung
2410 1.21 msaitoh /* For the mailbox interrupt */
2411 1.57 msaitoh ixv_set_ivar(adapter, 1, adapter->vector, -1);
2412 1.58 msaitoh } /* ixv_configure_ivars */
2413 1.1 dyoung
2414 1.1 dyoung
2415 1.58 msaitoh /************************************************************************
2416 1.176 msaitoh * ixv_init_stats
2417 1.58 msaitoh *
2418 1.58 msaitoh * The VF stats registers never have a truly virgin
2419 1.176 msaitoh * starting point, so this routine save initial vaules to
2420 1.176 msaitoh * last_<REGNAME>.
2421 1.58 msaitoh ************************************************************************/
2422 1.1 dyoung static void
2423 1.1 dyoung ixv_init_stats(struct adapter *adapter)
2424 1.1 dyoung {
2425 1.1 dyoung struct ixgbe_hw *hw = &adapter->hw;
2426 1.57 msaitoh
2427 1.21 msaitoh adapter->stats.vf.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
2428 1.21 msaitoh adapter->stats.vf.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
2429 1.21 msaitoh adapter->stats.vf.last_vfgorc |=
2430 1.1 dyoung (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
2431 1.1 dyoung
2432 1.21 msaitoh adapter->stats.vf.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
2433 1.21 msaitoh adapter->stats.vf.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
2434 1.21 msaitoh adapter->stats.vf.last_vfgotc |=
2435 1.1 dyoung (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
2436 1.1 dyoung
2437 1.21 msaitoh adapter->stats.vf.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
2438 1.58 msaitoh } /* ixv_init_stats */
2439 1.1 dyoung
2440 1.1 dyoung #define UPDATE_STAT_32(reg, last, count) \
2441 1.114 msaitoh { \
2442 1.58 msaitoh u32 current = IXGBE_READ_REG(hw, (reg)); \
2443 1.178 msaitoh IXGBE_EVC_ADD(&count, current - (last)); \
2444 1.58 msaitoh (last) = current; \
2445 1.1 dyoung }
2446 1.1 dyoung
2447 1.178 msaitoh #define UPDATE_STAT_36(lsb, msb, last, count) \
2448 1.178 msaitoh { \
2449 1.178 msaitoh u64 cur_lsb = IXGBE_READ_REG(hw, (lsb)); \
2450 1.178 msaitoh u64 cur_msb = IXGBE_READ_REG(hw, (msb)); \
2451 1.178 msaitoh u64 current = ((cur_msb << 32) | cur_lsb); \
2452 1.178 msaitoh if (current < (last)) \
2453 1.178 msaitoh IXGBE_EVC_ADD(&count, current + __BIT(36) - (last)); \
2454 1.178 msaitoh else \
2455 1.178 msaitoh IXGBE_EVC_ADD(&count, current - (last)); \
2456 1.178 msaitoh (last) = current; \
2457 1.1 dyoung }
2458 1.1 dyoung
2459 1.58 msaitoh /************************************************************************
2460 1.58 msaitoh * ixv_update_stats - Update the board statistics counters.
2461 1.58 msaitoh ************************************************************************/
2462 1.1 dyoung void
2463 1.1 dyoung ixv_update_stats(struct adapter *adapter)
2464 1.1 dyoung {
2465 1.63 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2466 1.58 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
2467 1.1 dyoung
2468 1.88 msaitoh UPDATE_STAT_32(IXGBE_VFGPRC, stats->last_vfgprc, stats->vfgprc);
2469 1.88 msaitoh UPDATE_STAT_32(IXGBE_VFGPTC, stats->last_vfgptc, stats->vfgptc);
2470 1.88 msaitoh UPDATE_STAT_36(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB, stats->last_vfgorc,
2471 1.58 msaitoh stats->vfgorc);
2472 1.88 msaitoh UPDATE_STAT_36(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB, stats->last_vfgotc,
2473 1.58 msaitoh stats->vfgotc);
2474 1.88 msaitoh UPDATE_STAT_32(IXGBE_VFMPRC, stats->last_vfmprc, stats->vfmprc);
2475 1.58 msaitoh
2476 1.146 msaitoh /* VF doesn't count errors by hardware */
2477 1.146 msaitoh
2478 1.58 msaitoh } /* ixv_update_stats */
2479 1.1 dyoung
2480 1.83 msaitoh /************************************************************************
2481 1.83 msaitoh * ixv_sysctl_interrupt_rate_handler
2482 1.83 msaitoh ************************************************************************/
2483 1.83 msaitoh static int
2484 1.83 msaitoh ixv_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
2485 1.83 msaitoh {
2486 1.83 msaitoh struct sysctlnode node = *rnode;
2487 1.83 msaitoh struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
2488 1.114 msaitoh struct adapter *adapter = que->adapter;
2489 1.83 msaitoh uint32_t reg, usec, rate;
2490 1.83 msaitoh int error;
2491 1.83 msaitoh
2492 1.83 msaitoh if (que == NULL)
2493 1.83 msaitoh return 0;
2494 1.83 msaitoh reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_VTEITR(que->msix));
2495 1.83 msaitoh usec = ((reg & 0x0FF8) >> 3);
2496 1.83 msaitoh if (usec > 0)
2497 1.83 msaitoh rate = 500000 / usec;
2498 1.83 msaitoh else
2499 1.83 msaitoh rate = 0;
2500 1.83 msaitoh node.sysctl_data = &rate;
2501 1.83 msaitoh error = sysctl_lookup(SYSCTLFN_CALL(&node));
2502 1.83 msaitoh if (error || newp == NULL)
2503 1.83 msaitoh return error;
2504 1.83 msaitoh reg &= ~0xfff; /* default, no limitation */
2505 1.83 msaitoh if (rate > 0 && rate < 500000) {
2506 1.83 msaitoh if (rate < 1000)
2507 1.83 msaitoh rate = 1000;
2508 1.148 msaitoh reg |= ((4000000 / rate) & 0xff8);
2509 1.83 msaitoh /*
2510 1.83 msaitoh * When RSC is used, ITR interval must be larger than
2511 1.83 msaitoh * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
2512 1.83 msaitoh * The minimum value is always greater than 2us on 100M
2513 1.83 msaitoh * (and 10M?(not documented)), but it's not on 1G and higher.
2514 1.83 msaitoh */
2515 1.83 msaitoh if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
2516 1.83 msaitoh && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
2517 1.83 msaitoh if ((adapter->num_queues > 1)
2518 1.83 msaitoh && (reg < IXGBE_MIN_RSC_EITR_10G1G))
2519 1.83 msaitoh return EINVAL;
2520 1.83 msaitoh }
2521 1.83 msaitoh ixv_max_interrupt_rate = rate;
2522 1.83 msaitoh } else
2523 1.83 msaitoh ixv_max_interrupt_rate = 0;
2524 1.95 msaitoh ixv_eitr_write(adapter, que->msix, reg);
2525 1.83 msaitoh
2526 1.83 msaitoh return (0);
2527 1.83 msaitoh } /* ixv_sysctl_interrupt_rate_handler */
2528 1.83 msaitoh
2529 1.3 msaitoh const struct sysctlnode *
2530 1.3 msaitoh ixv_sysctl_instance(struct adapter *adapter)
2531 1.3 msaitoh {
2532 1.3 msaitoh const char *dvname;
2533 1.3 msaitoh struct sysctllog **log;
2534 1.3 msaitoh int rc;
2535 1.3 msaitoh const struct sysctlnode *rnode;
2536 1.3 msaitoh
2537 1.3 msaitoh log = &adapter->sysctllog;
2538 1.3 msaitoh dvname = device_xname(adapter->dev);
2539 1.3 msaitoh
2540 1.3 msaitoh if ((rc = sysctl_createv(log, 0, NULL, &rnode,
2541 1.3 msaitoh 0, CTLTYPE_NODE, dvname,
2542 1.3 msaitoh SYSCTL_DESCR("ixv information and settings"),
2543 1.3 msaitoh NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
2544 1.3 msaitoh goto err;
2545 1.3 msaitoh
2546 1.3 msaitoh return rnode;
2547 1.3 msaitoh err:
2548 1.129 msaitoh device_printf(adapter->dev,
2549 1.129 msaitoh "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
2550 1.3 msaitoh return NULL;
2551 1.3 msaitoh }
2552 1.48 msaitoh
2553 1.48 msaitoh static void
2554 1.48 msaitoh ixv_add_device_sysctls(struct adapter *adapter)
2555 1.48 msaitoh {
2556 1.48 msaitoh struct sysctllog **log;
2557 1.48 msaitoh const struct sysctlnode *rnode, *cnode;
2558 1.48 msaitoh device_t dev;
2559 1.48 msaitoh
2560 1.48 msaitoh dev = adapter->dev;
2561 1.48 msaitoh log = &adapter->sysctllog;
2562 1.48 msaitoh
2563 1.48 msaitoh if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
2564 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl root\n");
2565 1.48 msaitoh return;
2566 1.48 msaitoh }
2567 1.48 msaitoh
2568 1.48 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2569 1.158 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT, "debug",
2570 1.158 msaitoh SYSCTL_DESCR("Debug Info"),
2571 1.48 msaitoh ixv_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
2572 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2573 1.48 msaitoh
2574 1.48 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2575 1.163 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT,
2576 1.163 msaitoh "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
2577 1.163 msaitoh ixv_sysctl_rx_copy_len, 0,
2578 1.163 msaitoh (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
2579 1.163 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2580 1.163 msaitoh
2581 1.163 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2582 1.180 msaitoh CTLFLAG_READONLY, CTLTYPE_INT,
2583 1.180 msaitoh "num_tx_desc", SYSCTL_DESCR("Number of TX descriptors"),
2584 1.180 msaitoh NULL, 0, &adapter->num_tx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
2585 1.180 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2586 1.180 msaitoh
2587 1.180 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2588 1.180 msaitoh CTLFLAG_READONLY, CTLTYPE_INT,
2589 1.180 msaitoh "num_rx_desc", SYSCTL_DESCR("Number of RX descriptors"),
2590 1.180 msaitoh NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
2591 1.180 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2592 1.180 msaitoh
2593 1.180 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2594 1.179 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT, "rx_process_limit",
2595 1.179 msaitoh SYSCTL_DESCR("max number of RX packets to process"),
2596 1.179 msaitoh ixv_sysctl_rx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
2597 1.179 msaitoh CTL_EOL) != 0)
2598 1.179 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2599 1.179 msaitoh
2600 1.179 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2601 1.179 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT, "tx_process_limit",
2602 1.179 msaitoh SYSCTL_DESCR("max number of TX packets to process"),
2603 1.179 msaitoh ixv_sysctl_tx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
2604 1.179 msaitoh CTL_EOL) != 0)
2605 1.179 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2606 1.179 msaitoh
2607 1.179 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2608 1.158 msaitoh CTLFLAG_READWRITE, CTLTYPE_BOOL, "enable_aim",
2609 1.158 msaitoh SYSCTL_DESCR("Interrupt Moderation"),
2610 1.50 msaitoh NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
2611 1.48 msaitoh aprint_error_dev(dev, "could not create sysctl\n");
2612 1.84 knakahar
2613 1.84 knakahar if (sysctl_createv(log, 0, &rnode, &cnode,
2614 1.158 msaitoh CTLFLAG_READWRITE, CTLTYPE_BOOL, "txrx_workqueue",
2615 1.158 msaitoh SYSCTL_DESCR("Use workqueue for packet processing"),
2616 1.158 msaitoh NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL)
2617 1.158 msaitoh != 0)
2618 1.84 knakahar aprint_error_dev(dev, "could not create sysctl\n");
2619 1.48 msaitoh }
2620 1.48 msaitoh
2621 1.58 msaitoh /************************************************************************
2622 1.58 msaitoh * ixv_add_stats_sysctls - Add statistic sysctls for the VF.
2623 1.58 msaitoh ************************************************************************/
2624 1.48 msaitoh static void
2625 1.48 msaitoh ixv_add_stats_sysctls(struct adapter *adapter)
2626 1.48 msaitoh {
2627 1.114 msaitoh device_t dev = adapter->dev;
2628 1.114 msaitoh struct tx_ring *txr = adapter->tx_rings;
2629 1.114 msaitoh struct rx_ring *rxr = adapter->rx_rings;
2630 1.58 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
2631 1.67 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2632 1.83 msaitoh const struct sysctlnode *rnode, *cnode;
2633 1.49 msaitoh struct sysctllog **log = &adapter->sysctllog;
2634 1.48 msaitoh const char *xname = device_xname(dev);
2635 1.48 msaitoh
2636 1.48 msaitoh /* Driver Statistics */
2637 1.49 msaitoh evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
2638 1.49 msaitoh NULL, xname, "Driver tx dma soft fail EFBIG");
2639 1.48 msaitoh evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
2640 1.48 msaitoh NULL, xname, "m_defrag() failed");
2641 1.49 msaitoh evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
2642 1.49 msaitoh NULL, xname, "Driver tx dma hard fail EFBIG");
2643 1.49 msaitoh evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
2644 1.49 msaitoh NULL, xname, "Driver tx dma hard fail EINVAL");
2645 1.49 msaitoh evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
2646 1.49 msaitoh NULL, xname, "Driver tx dma hard fail other");
2647 1.49 msaitoh evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
2648 1.49 msaitoh NULL, xname, "Driver tx dma soft fail EAGAIN");
2649 1.49 msaitoh evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
2650 1.49 msaitoh NULL, xname, "Driver tx dma soft fail ENOMEM");
2651 1.48 msaitoh evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
2652 1.48 msaitoh NULL, xname, "Watchdog timeouts");
2653 1.49 msaitoh evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
2654 1.49 msaitoh NULL, xname, "TSO errors");
2655 1.151 msaitoh evcnt_attach_dynamic(&adapter->admin_irqev, EVCNT_TYPE_INTR,
2656 1.151 msaitoh NULL, xname, "Admin MSI-X IRQ Handled");
2657 1.151 msaitoh evcnt_attach_dynamic(&adapter->link_workev, EVCNT_TYPE_INTR,
2658 1.151 msaitoh NULL, xname, "Admin event");
2659 1.49 msaitoh
2660 1.49 msaitoh for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
2661 1.184 msaitoh #ifdef LRO
2662 1.184 msaitoh struct lro_ctrl *lro = &rxr->lro;
2663 1.184 msaitoh #endif
2664 1.184 msaitoh
2665 1.49 msaitoh snprintf(adapter->queues[i].evnamebuf,
2666 1.182 msaitoh sizeof(adapter->queues[i].evnamebuf), "%s q%d", xname, i);
2667 1.49 msaitoh snprintf(adapter->queues[i].namebuf,
2668 1.49 msaitoh sizeof(adapter->queues[i].namebuf), "q%d", i);
2669 1.49 msaitoh
2670 1.49 msaitoh if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
2671 1.182 msaitoh aprint_error_dev(dev,
2672 1.182 msaitoh "could not create sysctl root\n");
2673 1.49 msaitoh break;
2674 1.49 msaitoh }
2675 1.49 msaitoh
2676 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &rnode,
2677 1.49 msaitoh 0, CTLTYPE_NODE,
2678 1.49 msaitoh adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
2679 1.49 msaitoh NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
2680 1.49 msaitoh break;
2681 1.49 msaitoh
2682 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2683 1.49 msaitoh CTLFLAG_READWRITE, CTLTYPE_INT,
2684 1.49 msaitoh "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
2685 1.83 msaitoh ixv_sysctl_interrupt_rate_handler, 0,
2686 1.49 msaitoh (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
2687 1.49 msaitoh break;
2688 1.49 msaitoh
2689 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2690 1.49 msaitoh CTLFLAG_READONLY, CTLTYPE_INT,
2691 1.49 msaitoh "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
2692 1.83 msaitoh ixv_sysctl_tdh_handler, 0, (void *)txr,
2693 1.49 msaitoh 0, CTL_CREATE, CTL_EOL) != 0)
2694 1.49 msaitoh break;
2695 1.49 msaitoh
2696 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2697 1.49 msaitoh CTLFLAG_READONLY, CTLTYPE_INT,
2698 1.49 msaitoh "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
2699 1.83 msaitoh ixv_sysctl_tdt_handler, 0, (void *)txr,
2700 1.49 msaitoh 0, CTL_CREATE, CTL_EOL) != 0)
2701 1.49 msaitoh break;
2702 1.83 msaitoh
2703 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2704 1.158 msaitoh CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxck",
2705 1.158 msaitoh SYSCTL_DESCR("Receive Descriptor next to check"),
2706 1.158 msaitoh ixv_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
2707 1.99 msaitoh CTL_CREATE, CTL_EOL) != 0)
2708 1.99 msaitoh break;
2709 1.99 msaitoh
2710 1.99 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2711 1.164 msaitoh CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
2712 1.164 msaitoh SYSCTL_DESCR("Receive Descriptor next to refresh"),
2713 1.164 msaitoh ixv_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
2714 1.164 msaitoh CTL_CREATE, CTL_EOL) != 0)
2715 1.164 msaitoh break;
2716 1.164 msaitoh
2717 1.164 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2718 1.158 msaitoh CTLFLAG_READONLY, CTLTYPE_INT, "rxd_head",
2719 1.158 msaitoh SYSCTL_DESCR("Receive Descriptor Head"),
2720 1.83 msaitoh ixv_sysctl_rdh_handler, 0, (void *)rxr, 0,
2721 1.49 msaitoh CTL_CREATE, CTL_EOL) != 0)
2722 1.49 msaitoh break;
2723 1.49 msaitoh
2724 1.49 msaitoh if (sysctl_createv(log, 0, &rnode, &cnode,
2725 1.158 msaitoh CTLFLAG_READONLY, CTLTYPE_INT, "rxd_tail",
2726 1.158 msaitoh SYSCTL_DESCR("Receive Descriptor Tail"),
2727 1.83 msaitoh ixv_sysctl_rdt_handler, 0, (void *)rxr, 0,
2728 1.49 msaitoh CTL_CREATE, CTL_EOL) != 0)
2729 1.49 msaitoh break;
2730 1.49 msaitoh
2731 1.184 msaitoh evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
2732 1.184 msaitoh NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
2733 1.184 msaitoh evcnt_attach_dynamic(&adapter->queues[i].handleq,
2734 1.184 msaitoh EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
2735 1.184 msaitoh "Handled queue in softint");
2736 1.184 msaitoh evcnt_attach_dynamic(&adapter->queues[i].req, EVCNT_TYPE_MISC,
2737 1.184 msaitoh NULL, adapter->queues[i].evnamebuf, "Requeued in softint");
2738 1.184 msaitoh evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
2739 1.184 msaitoh NULL, adapter->queues[i].evnamebuf,
2740 1.184 msaitoh "Queue Packets Transmitted");
2741 1.184 msaitoh #ifndef IXGBE_LEGACY_TX
2742 1.184 msaitoh evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
2743 1.184 msaitoh NULL, adapter->queues[i].evnamebuf,
2744 1.184 msaitoh "Packets dropped in pcq");
2745 1.184 msaitoh #endif
2746 1.184 msaitoh evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
2747 1.158 msaitoh NULL, adapter->queues[i].evnamebuf,
2748 1.184 msaitoh "TX Queue No Descriptor Available");
2749 1.184 msaitoh evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
2750 1.184 msaitoh NULL, adapter->queues[i].evnamebuf, "TSO");
2751 1.184 msaitoh
2752 1.49 msaitoh evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
2753 1.158 msaitoh NULL, adapter->queues[i].evnamebuf,
2754 1.158 msaitoh "Queue Bytes Received");
2755 1.184 msaitoh evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
2756 1.184 msaitoh NULL, adapter->queues[i].evnamebuf,
2757 1.184 msaitoh "Queue Packets Received");
2758 1.166 msaitoh evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
2759 1.166 msaitoh NULL, adapter->queues[i].evnamebuf, "Rx no mbuf");
2760 1.49 msaitoh evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
2761 1.49 msaitoh NULL, adapter->queues[i].evnamebuf, "Rx discarded");
2762 1.184 msaitoh evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
2763 1.184 msaitoh NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
2764 1.49 msaitoh #ifdef LRO
2765 1.49 msaitoh SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
2766 1.49 msaitoh CTLFLAG_RD, &lro->lro_queued, 0,
2767 1.49 msaitoh "LRO Queued");
2768 1.49 msaitoh SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
2769 1.49 msaitoh CTLFLAG_RD, &lro->lro_flushed, 0,
2770 1.49 msaitoh "LRO Flushed");
2771 1.49 msaitoh #endif /* LRO */
2772 1.49 msaitoh }
2773 1.49 msaitoh
2774 1.58 msaitoh /* MAC stats get their own sub node */
2775 1.49 msaitoh
2776 1.49 msaitoh snprintf(stats->namebuf,
2777 1.49 msaitoh sizeof(stats->namebuf), "%s MAC Statistics", xname);
2778 1.49 msaitoh
2779 1.49 msaitoh evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
2780 1.49 msaitoh stats->namebuf, "rx csum offload - IP");
2781 1.49 msaitoh evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
2782 1.49 msaitoh stats->namebuf, "rx csum offload - L4");
2783 1.49 msaitoh evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
2784 1.49 msaitoh stats->namebuf, "rx csum offload - IP bad");
2785 1.49 msaitoh evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
2786 1.49 msaitoh stats->namebuf, "rx csum offload - L4 bad");
2787 1.48 msaitoh
2788 1.49 msaitoh /* Packet Reception Stats */
2789 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgprc, EVCNT_TYPE_MISC, NULL,
2790 1.48 msaitoh xname, "Good Packets Received");
2791 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgorc, EVCNT_TYPE_MISC, NULL,
2792 1.48 msaitoh xname, "Good Octets Received");
2793 1.48 msaitoh evcnt_attach_dynamic(&stats->vfmprc, EVCNT_TYPE_MISC, NULL,
2794 1.48 msaitoh xname, "Multicast Packets Received");
2795 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgptc, EVCNT_TYPE_MISC, NULL,
2796 1.48 msaitoh xname, "Good Packets Transmitted");
2797 1.48 msaitoh evcnt_attach_dynamic(&stats->vfgotc, EVCNT_TYPE_MISC, NULL,
2798 1.48 msaitoh xname, "Good Octets Transmitted");
2799 1.67 msaitoh
2800 1.67 msaitoh /* Mailbox Stats */
2801 1.67 msaitoh evcnt_attach_dynamic(&hw->mbx.stats.msgs_tx, EVCNT_TYPE_MISC, NULL,
2802 1.67 msaitoh xname, "message TXs");
2803 1.67 msaitoh evcnt_attach_dynamic(&hw->mbx.stats.msgs_rx, EVCNT_TYPE_MISC, NULL,
2804 1.67 msaitoh xname, "message RXs");
2805 1.67 msaitoh evcnt_attach_dynamic(&hw->mbx.stats.acks, EVCNT_TYPE_MISC, NULL,
2806 1.67 msaitoh xname, "ACKs");
2807 1.67 msaitoh evcnt_attach_dynamic(&hw->mbx.stats.reqs, EVCNT_TYPE_MISC, NULL,
2808 1.67 msaitoh xname, "REQs");
2809 1.67 msaitoh evcnt_attach_dynamic(&hw->mbx.stats.rsts, EVCNT_TYPE_MISC, NULL,
2810 1.67 msaitoh xname, "RSTs");
2811 1.67 msaitoh
2812 1.58 msaitoh } /* ixv_add_stats_sysctls */
2813 1.48 msaitoh
2814 1.131 msaitoh static void
2815 1.131 msaitoh ixv_clear_evcnt(struct adapter *adapter)
2816 1.131 msaitoh {
2817 1.131 msaitoh struct tx_ring *txr = adapter->tx_rings;
2818 1.131 msaitoh struct rx_ring *rxr = adapter->rx_rings;
2819 1.131 msaitoh struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
2820 1.131 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2821 1.131 msaitoh int i;
2822 1.131 msaitoh
2823 1.131 msaitoh /* Driver Statistics */
2824 1.178 msaitoh IXGBE_EVC_STORE(&adapter->efbig_tx_dma_setup, 0);
2825 1.178 msaitoh IXGBE_EVC_STORE(&adapter->mbuf_defrag_failed, 0);
2826 1.178 msaitoh IXGBE_EVC_STORE(&adapter->efbig2_tx_dma_setup, 0);
2827 1.178 msaitoh IXGBE_EVC_STORE(&adapter->einval_tx_dma_setup, 0);
2828 1.178 msaitoh IXGBE_EVC_STORE(&adapter->other_tx_dma_setup, 0);
2829 1.178 msaitoh IXGBE_EVC_STORE(&adapter->eagain_tx_dma_setup, 0);
2830 1.178 msaitoh IXGBE_EVC_STORE(&adapter->enomem_tx_dma_setup, 0);
2831 1.178 msaitoh IXGBE_EVC_STORE(&adapter->watchdog_events, 0);
2832 1.178 msaitoh IXGBE_EVC_STORE(&adapter->tso_err, 0);
2833 1.178 msaitoh IXGBE_EVC_STORE(&adapter->admin_irqev, 0);
2834 1.178 msaitoh IXGBE_EVC_STORE(&adapter->link_workev, 0);
2835 1.131 msaitoh
2836 1.131 msaitoh for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
2837 1.178 msaitoh IXGBE_EVC_STORE(&adapter->queues[i].irqs, 0);
2838 1.178 msaitoh IXGBE_EVC_STORE(&adapter->queues[i].handleq, 0);
2839 1.178 msaitoh IXGBE_EVC_STORE(&adapter->queues[i].req, 0);
2840 1.178 msaitoh IXGBE_EVC_STORE(&txr->total_packets, 0);
2841 1.131 msaitoh #ifndef IXGBE_LEGACY_TX
2842 1.178 msaitoh IXGBE_EVC_STORE(&txr->pcq_drops, 0);
2843 1.131 msaitoh #endif
2844 1.184 msaitoh IXGBE_EVC_STORE(&txr->no_desc_avail, 0);
2845 1.184 msaitoh IXGBE_EVC_STORE(&txr->tso_tx, 0);
2846 1.131 msaitoh txr->q_efbig_tx_dma_setup = 0;
2847 1.131 msaitoh txr->q_mbuf_defrag_failed = 0;
2848 1.131 msaitoh txr->q_efbig2_tx_dma_setup = 0;
2849 1.131 msaitoh txr->q_einval_tx_dma_setup = 0;
2850 1.131 msaitoh txr->q_other_tx_dma_setup = 0;
2851 1.131 msaitoh txr->q_eagain_tx_dma_setup = 0;
2852 1.131 msaitoh txr->q_enomem_tx_dma_setup = 0;
2853 1.131 msaitoh txr->q_tso_err = 0;
2854 1.131 msaitoh
2855 1.178 msaitoh IXGBE_EVC_STORE(&rxr->rx_packets, 0);
2856 1.178 msaitoh IXGBE_EVC_STORE(&rxr->rx_bytes, 0);
2857 1.178 msaitoh IXGBE_EVC_STORE(&rxr->rx_copies, 0);
2858 1.178 msaitoh IXGBE_EVC_STORE(&rxr->no_mbuf, 0);
2859 1.178 msaitoh IXGBE_EVC_STORE(&rxr->rx_discarded, 0);
2860 1.131 msaitoh }
2861 1.131 msaitoh
2862 1.131 msaitoh /* MAC stats get their own sub node */
2863 1.131 msaitoh
2864 1.178 msaitoh IXGBE_EVC_STORE(&stats->ipcs, 0);
2865 1.178 msaitoh IXGBE_EVC_STORE(&stats->l4cs, 0);
2866 1.178 msaitoh IXGBE_EVC_STORE(&stats->ipcs_bad, 0);
2867 1.178 msaitoh IXGBE_EVC_STORE(&stats->l4cs_bad, 0);
2868 1.131 msaitoh
2869 1.176 msaitoh /*
2870 1.176 msaitoh * Packet Reception Stats.
2871 1.176 msaitoh * Call ixv_init_stats() to save last VF counters' values.
2872 1.176 msaitoh */
2873 1.176 msaitoh ixv_init_stats(adapter);
2874 1.178 msaitoh IXGBE_EVC_STORE(&stats->vfgprc, 0);
2875 1.178 msaitoh IXGBE_EVC_STORE(&stats->vfgorc, 0);
2876 1.178 msaitoh IXGBE_EVC_STORE(&stats->vfmprc, 0);
2877 1.178 msaitoh IXGBE_EVC_STORE(&stats->vfgptc, 0);
2878 1.178 msaitoh IXGBE_EVC_STORE(&stats->vfgotc, 0);
2879 1.131 msaitoh
2880 1.131 msaitoh /* Mailbox Stats */
2881 1.178 msaitoh IXGBE_EVC_STORE(&hw->mbx.stats.msgs_tx, 0);
2882 1.178 msaitoh IXGBE_EVC_STORE(&hw->mbx.stats.msgs_rx, 0);
2883 1.178 msaitoh IXGBE_EVC_STORE(&hw->mbx.stats.acks, 0);
2884 1.178 msaitoh IXGBE_EVC_STORE(&hw->mbx.stats.reqs, 0);
2885 1.178 msaitoh IXGBE_EVC_STORE(&hw->mbx.stats.rsts, 0);
2886 1.131 msaitoh
2887 1.131 msaitoh } /* ixv_clear_evcnt */
2888 1.131 msaitoh
2889 1.175 msaitoh #define PRINTQS(adapter, regname) \
2890 1.175 msaitoh do { \
2891 1.175 msaitoh struct ixgbe_hw *_hw = &(adapter)->hw; \
2892 1.175 msaitoh int _i; \
2893 1.175 msaitoh \
2894 1.175 msaitoh printf("%s: %s", device_xname((adapter)->dev), #regname); \
2895 1.175 msaitoh for (_i = 0; _i < (adapter)->num_queues; _i++) { \
2896 1.175 msaitoh printf((_i == 0) ? "\t" : " "); \
2897 1.175 msaitoh printf("%08x", IXGBE_READ_REG(_hw, \
2898 1.175 msaitoh IXGBE_##regname(_i))); \
2899 1.175 msaitoh } \
2900 1.175 msaitoh printf("\n"); \
2901 1.175 msaitoh } while (0)
2902 1.175 msaitoh
2903 1.58 msaitoh /************************************************************************
2904 1.58 msaitoh * ixv_print_debug_info
2905 1.57 msaitoh *
2906 1.58 msaitoh * Provides a way to take a look at important statistics
2907 1.58 msaitoh * maintained by the driver and hardware.
2908 1.58 msaitoh ************************************************************************/
2909 1.57 msaitoh static void
2910 1.57 msaitoh ixv_print_debug_info(struct adapter *adapter)
2911 1.57 msaitoh {
2912 1.114 msaitoh device_t dev = adapter->dev;
2913 1.175 msaitoh struct ixgbe_hw *hw = &adapter->hw;
2914 1.175 msaitoh int i;
2915 1.57 msaitoh
2916 1.175 msaitoh device_printf(dev, "queue:");
2917 1.175 msaitoh for (i = 0; i < adapter->num_queues; i++) {
2918 1.175 msaitoh printf((i == 0) ? "\t" : " ");
2919 1.175 msaitoh printf("%8d", i);
2920 1.58 msaitoh }
2921 1.175 msaitoh printf("\n");
2922 1.175 msaitoh PRINTQS(adapter, VFRDBAL);
2923 1.175 msaitoh PRINTQS(adapter, VFRDBAH);
2924 1.175 msaitoh PRINTQS(adapter, VFRDLEN);
2925 1.175 msaitoh PRINTQS(adapter, VFSRRCTL);
2926 1.175 msaitoh PRINTQS(adapter, VFRDH);
2927 1.175 msaitoh PRINTQS(adapter, VFRDT);
2928 1.175 msaitoh PRINTQS(adapter, VFRXDCTL);
2929 1.175 msaitoh
2930 1.175 msaitoh device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_VTEIMS));
2931 1.175 msaitoh device_printf(dev, "EIAM:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_VTEIAM));
2932 1.175 msaitoh device_printf(dev, "EIAC:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_VTEIAC));
2933 1.58 msaitoh } /* ixv_print_debug_info */
2934 1.58 msaitoh
2935 1.58 msaitoh /************************************************************************
2936 1.58 msaitoh * ixv_sysctl_debug
2937 1.58 msaitoh ************************************************************************/
2938 1.57 msaitoh static int
2939 1.57 msaitoh ixv_sysctl_debug(SYSCTLFN_ARGS)
2940 1.57 msaitoh {
2941 1.97 msaitoh struct sysctlnode node = *rnode;
2942 1.97 msaitoh struct adapter *adapter = (struct adapter *)node.sysctl_data;
2943 1.174 msaitoh int error, result = 0;
2944 1.57 msaitoh
2945 1.57 msaitoh node.sysctl_data = &result;
2946 1.57 msaitoh error = sysctl_lookup(SYSCTLFN_CALL(&node));
2947 1.57 msaitoh
2948 1.58 msaitoh if (error || newp == NULL)
2949 1.57 msaitoh return error;
2950 1.57 msaitoh
2951 1.97 msaitoh if (result == 1)
2952 1.57 msaitoh ixv_print_debug_info(adapter);
2953 1.57 msaitoh
2954 1.57 msaitoh return 0;
2955 1.58 msaitoh } /* ixv_sysctl_debug */
2956 1.58 msaitoh
2957 1.58 msaitoh /************************************************************************
2958 1.163 msaitoh * ixv_sysctl_rx_copy_len
2959 1.163 msaitoh ************************************************************************/
2960 1.163 msaitoh static int
2961 1.163 msaitoh ixv_sysctl_rx_copy_len(SYSCTLFN_ARGS)
2962 1.163 msaitoh {
2963 1.163 msaitoh struct sysctlnode node = *rnode;
2964 1.163 msaitoh struct adapter *adapter = (struct adapter *)node.sysctl_data;
2965 1.163 msaitoh int error;
2966 1.163 msaitoh int result = adapter->rx_copy_len;
2967 1.163 msaitoh
2968 1.163 msaitoh node.sysctl_data = &result;
2969 1.163 msaitoh error = sysctl_lookup(SYSCTLFN_CALL(&node));
2970 1.163 msaitoh
2971 1.163 msaitoh if (error || newp == NULL)
2972 1.163 msaitoh return error;
2973 1.163 msaitoh
2974 1.163 msaitoh if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
2975 1.163 msaitoh return EINVAL;
2976 1.163 msaitoh
2977 1.163 msaitoh adapter->rx_copy_len = result;
2978 1.163 msaitoh
2979 1.163 msaitoh return 0;
2980 1.179 msaitoh } /* ixv_sysctl_rx_copy_len */
2981 1.179 msaitoh
2982 1.179 msaitoh /************************************************************************
2983 1.179 msaitoh * ixv_sysctl_tx_process_limit
2984 1.179 msaitoh ************************************************************************/
2985 1.179 msaitoh static int
2986 1.179 msaitoh ixv_sysctl_tx_process_limit(SYSCTLFN_ARGS)
2987 1.179 msaitoh {
2988 1.179 msaitoh struct sysctlnode node = *rnode;
2989 1.179 msaitoh struct adapter *adapter = (struct adapter *)node.sysctl_data;
2990 1.179 msaitoh int error;
2991 1.179 msaitoh int result = adapter->tx_process_limit;
2992 1.179 msaitoh
2993 1.179 msaitoh node.sysctl_data = &result;
2994 1.179 msaitoh error = sysctl_lookup(SYSCTLFN_CALL(&node));
2995 1.179 msaitoh
2996 1.179 msaitoh if (error || newp == NULL)
2997 1.179 msaitoh return error;
2998 1.179 msaitoh
2999 1.179 msaitoh if ((result <= 0) || (result > adapter->num_tx_desc))
3000 1.179 msaitoh return EINVAL;
3001 1.179 msaitoh
3002 1.179 msaitoh adapter->tx_process_limit = result;
3003 1.179 msaitoh
3004 1.179 msaitoh return 0;
3005 1.179 msaitoh } /* ixv_sysctl_tx_process_limit */
3006 1.179 msaitoh
3007 1.179 msaitoh /************************************************************************
3008 1.179 msaitoh * ixv_sysctl_rx_process_limit
3009 1.179 msaitoh ************************************************************************/
3010 1.179 msaitoh static int
3011 1.179 msaitoh ixv_sysctl_rx_process_limit(SYSCTLFN_ARGS)
3012 1.179 msaitoh {
3013 1.179 msaitoh struct sysctlnode node = *rnode;
3014 1.179 msaitoh struct adapter *adapter = (struct adapter *)node.sysctl_data;
3015 1.179 msaitoh int error;
3016 1.179 msaitoh int result = adapter->rx_process_limit;
3017 1.179 msaitoh
3018 1.179 msaitoh node.sysctl_data = &result;
3019 1.179 msaitoh error = sysctl_lookup(SYSCTLFN_CALL(&node));
3020 1.179 msaitoh
3021 1.179 msaitoh if (error || newp == NULL)
3022 1.179 msaitoh return error;
3023 1.179 msaitoh
3024 1.179 msaitoh if ((result <= 0) || (result > adapter->num_rx_desc))
3025 1.179 msaitoh return EINVAL;
3026 1.179 msaitoh
3027 1.179 msaitoh adapter->rx_process_limit = result;
3028 1.179 msaitoh
3029 1.179 msaitoh return 0;
3030 1.179 msaitoh } /* ixv_sysctl_rx_process_limit */
3031 1.163 msaitoh
3032 1.163 msaitoh /************************************************************************
3033 1.58 msaitoh * ixv_init_device_features
3034 1.58 msaitoh ************************************************************************/
3035 1.58 msaitoh static void
3036 1.58 msaitoh ixv_init_device_features(struct adapter *adapter)
3037 1.58 msaitoh {
3038 1.58 msaitoh adapter->feat_cap = IXGBE_FEATURE_NETMAP
3039 1.114 msaitoh | IXGBE_FEATURE_VF
3040 1.114 msaitoh | IXGBE_FEATURE_RSS
3041 1.114 msaitoh | IXGBE_FEATURE_LEGACY_TX;
3042 1.58 msaitoh
3043 1.58 msaitoh /* A tad short on feature flags for VFs, atm. */
3044 1.58 msaitoh switch (adapter->hw.mac.type) {
3045 1.58 msaitoh case ixgbe_mac_82599_vf:
3046 1.58 msaitoh break;
3047 1.58 msaitoh case ixgbe_mac_X540_vf:
3048 1.58 msaitoh break;
3049 1.58 msaitoh case ixgbe_mac_X550_vf:
3050 1.58 msaitoh case ixgbe_mac_X550EM_x_vf:
3051 1.58 msaitoh case ixgbe_mac_X550EM_a_vf:
3052 1.58 msaitoh adapter->feat_cap |= IXGBE_FEATURE_NEEDS_CTXD;
3053 1.58 msaitoh break;
3054 1.58 msaitoh default:
3055 1.58 msaitoh break;
3056 1.58 msaitoh }
3057 1.57 msaitoh
3058 1.58 msaitoh /* Enabled by default... */
3059 1.58 msaitoh /* Is a virtual function (VF) */
3060 1.58 msaitoh if (adapter->feat_cap & IXGBE_FEATURE_VF)
3061 1.58 msaitoh adapter->feat_en |= IXGBE_FEATURE_VF;
3062 1.58 msaitoh /* Netmap */
3063 1.58 msaitoh if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
3064 1.58 msaitoh adapter->feat_en |= IXGBE_FEATURE_NETMAP;
3065 1.58 msaitoh /* Receive-Side Scaling (RSS) */
3066 1.58 msaitoh if (adapter->feat_cap & IXGBE_FEATURE_RSS)
3067 1.58 msaitoh adapter->feat_en |= IXGBE_FEATURE_RSS;
3068 1.58 msaitoh /* Needs advanced context descriptor regardless of offloads req'd */
3069 1.58 msaitoh if (adapter->feat_cap & IXGBE_FEATURE_NEEDS_CTXD)
3070 1.58 msaitoh adapter->feat_en |= IXGBE_FEATURE_NEEDS_CTXD;
3071 1.58 msaitoh
3072 1.58 msaitoh /* Enabled via sysctl... */
3073 1.58 msaitoh /* Legacy (single queue) transmit */
3074 1.58 msaitoh if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
3075 1.58 msaitoh ixv_enable_legacy_tx)
3076 1.58 msaitoh adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
3077 1.58 msaitoh } /* ixv_init_device_features */
3078 1.58 msaitoh
3079 1.58 msaitoh /************************************************************************
3080 1.58 msaitoh * ixv_shutdown - Shutdown entry point
3081 1.58 msaitoh ************************************************************************/
3082 1.57 msaitoh #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
3083 1.57 msaitoh static int
3084 1.57 msaitoh ixv_shutdown(device_t dev)
3085 1.57 msaitoh {
3086 1.57 msaitoh struct adapter *adapter = device_private(dev);
3087 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
3088 1.153 msaitoh ixv_stop_locked(adapter);
3089 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
3090 1.57 msaitoh
3091 1.57 msaitoh return (0);
3092 1.58 msaitoh } /* ixv_shutdown */
3093 1.57 msaitoh #endif
3094 1.57 msaitoh
3095 1.57 msaitoh static int
3096 1.57 msaitoh ixv_ifflags_cb(struct ethercom *ec)
3097 1.57 msaitoh {
3098 1.57 msaitoh struct ifnet *ifp = &ec->ec_if;
3099 1.57 msaitoh struct adapter *adapter = ifp->if_softc;
3100 1.137 msaitoh u_short saved_flags;
3101 1.136 msaitoh u_short change;
3102 1.136 msaitoh int rv = 0;
3103 1.57 msaitoh
3104 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
3105 1.57 msaitoh
3106 1.137 msaitoh saved_flags = adapter->if_flags;
3107 1.93 msaitoh change = ifp->if_flags ^ adapter->if_flags;
3108 1.57 msaitoh if (change != 0)
3109 1.57 msaitoh adapter->if_flags = ifp->if_flags;
3110 1.57 msaitoh
3111 1.118 msaitoh if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
3112 1.118 msaitoh rv = ENETRESET;
3113 1.118 msaitoh goto out;
3114 1.137 msaitoh } else if ((change & IFF_PROMISC) != 0) {
3115 1.138 msaitoh rv = ixv_set_rxfilter(adapter);
3116 1.137 msaitoh if (rv != 0) {
3117 1.137 msaitoh /* Restore previous */
3118 1.137 msaitoh adapter->if_flags = saved_flags;
3119 1.137 msaitoh goto out;
3120 1.137 msaitoh }
3121 1.118 msaitoh }
3122 1.57 msaitoh
3123 1.120 msaitoh /* Check for ec_capenable. */
3124 1.120 msaitoh change = ec->ec_capenable ^ adapter->ec_capenable;
3125 1.120 msaitoh adapter->ec_capenable = ec->ec_capenable;
3126 1.120 msaitoh if ((change & ~(ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING
3127 1.120 msaitoh | ETHERCAP_VLAN_HWFILTER)) != 0) {
3128 1.120 msaitoh rv = ENETRESET;
3129 1.120 msaitoh goto out;
3130 1.120 msaitoh }
3131 1.120 msaitoh
3132 1.120 msaitoh /*
3133 1.120 msaitoh * Special handling is not required for ETHERCAP_VLAN_MTU.
3134 1.120 msaitoh * PF's MAXFRS(MHADD) does not include the 4bytes of the VLAN header.
3135 1.120 msaitoh */
3136 1.120 msaitoh
3137 1.65 msaitoh /* Set up VLAN support and filter */
3138 1.120 msaitoh if ((change & (ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_HWFILTER)) != 0)
3139 1.120 msaitoh rv = ixv_setup_vlan_support(adapter);
3140 1.65 msaitoh
3141 1.118 msaitoh out:
3142 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
3143 1.57 msaitoh
3144 1.118 msaitoh return rv;
3145 1.57 msaitoh }
3146 1.57 msaitoh
3147 1.58 msaitoh
3148 1.58 msaitoh /************************************************************************
3149 1.58 msaitoh * ixv_ioctl - Ioctl entry point
3150 1.57 msaitoh *
3151 1.58 msaitoh * Called when the user wants to configure the interface.
3152 1.57 msaitoh *
3153 1.58 msaitoh * return 0 on success, positive on failure
3154 1.58 msaitoh ************************************************************************/
3155 1.57 msaitoh static int
3156 1.58 msaitoh ixv_ioctl(struct ifnet *ifp, u_long command, void *data)
3157 1.57 msaitoh {
3158 1.57 msaitoh struct adapter *adapter = ifp->if_softc;
3159 1.134 msaitoh struct ixgbe_hw *hw = &adapter->hw;
3160 1.57 msaitoh struct ifcapreq *ifcr = data;
3161 1.134 msaitoh int error;
3162 1.57 msaitoh int l4csum_en;
3163 1.113 msaitoh const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
3164 1.113 msaitoh IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
3165 1.57 msaitoh
3166 1.57 msaitoh switch (command) {
3167 1.57 msaitoh case SIOCSIFFLAGS:
3168 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
3169 1.57 msaitoh break;
3170 1.132 msaitoh case SIOCADDMULTI: {
3171 1.132 msaitoh struct ether_multi *enm;
3172 1.132 msaitoh struct ether_multistep step;
3173 1.132 msaitoh struct ethercom *ec = &adapter->osdep.ec;
3174 1.134 msaitoh bool overflow = false;
3175 1.132 msaitoh int mcnt = 0;
3176 1.132 msaitoh
3177 1.132 msaitoh /*
3178 1.132 msaitoh * Check the number of multicast address. If it exceeds,
3179 1.132 msaitoh * return ENOSPC.
3180 1.132 msaitoh * Update this code when we support API 1.3.
3181 1.132 msaitoh */
3182 1.132 msaitoh ETHER_LOCK(ec);
3183 1.132 msaitoh ETHER_FIRST_MULTI(step, ec, enm);
3184 1.132 msaitoh while (enm != NULL) {
3185 1.132 msaitoh mcnt++;
3186 1.132 msaitoh
3187 1.132 msaitoh /*
3188 1.132 msaitoh * This code is before adding, so one room is required
3189 1.132 msaitoh * at least.
3190 1.132 msaitoh */
3191 1.132 msaitoh if (mcnt > (IXGBE_MAX_VF_MC - 1)) {
3192 1.134 msaitoh overflow = true;
3193 1.132 msaitoh break;
3194 1.132 msaitoh }
3195 1.132 msaitoh ETHER_NEXT_MULTI(step, enm);
3196 1.132 msaitoh }
3197 1.132 msaitoh ETHER_UNLOCK(ec);
3198 1.134 msaitoh error = 0;
3199 1.134 msaitoh if (overflow && ((ec->ec_flags & ETHER_F_ALLMULTI) == 0)) {
3200 1.134 msaitoh error = hw->mac.ops.update_xcast_mode(hw,
3201 1.134 msaitoh IXGBEVF_XCAST_MODE_ALLMULTI);
3202 1.134 msaitoh if (error == IXGBE_ERR_NOT_TRUSTED) {
3203 1.134 msaitoh device_printf(adapter->dev,
3204 1.134 msaitoh "this interface is not trusted\n");
3205 1.135 msaitoh error = EPERM;
3206 1.135 msaitoh } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
3207 1.135 msaitoh device_printf(adapter->dev,
3208 1.135 msaitoh "the PF doesn't support allmulti mode\n");
3209 1.135 msaitoh error = EOPNOTSUPP;
3210 1.134 msaitoh } else if (error) {
3211 1.134 msaitoh device_printf(adapter->dev,
3212 1.134 msaitoh "number of Ethernet multicast addresses "
3213 1.134 msaitoh "exceeds the limit (%d). error = %d\n",
3214 1.134 msaitoh IXGBE_MAX_VF_MC, error);
3215 1.134 msaitoh error = ENOSPC;
3216 1.134 msaitoh } else
3217 1.134 msaitoh ec->ec_flags |= ETHER_F_ALLMULTI;
3218 1.134 msaitoh }
3219 1.132 msaitoh if (error)
3220 1.132 msaitoh return error;
3221 1.132 msaitoh }
3222 1.132 msaitoh /*FALLTHROUGH*/
3223 1.57 msaitoh case SIOCDELMULTI:
3224 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
3225 1.57 msaitoh break;
3226 1.57 msaitoh case SIOCSIFMEDIA:
3227 1.57 msaitoh case SIOCGIFMEDIA:
3228 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
3229 1.57 msaitoh break;
3230 1.57 msaitoh case SIOCSIFCAP:
3231 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
3232 1.57 msaitoh break;
3233 1.57 msaitoh case SIOCSIFMTU:
3234 1.57 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
3235 1.57 msaitoh break;
3236 1.131 msaitoh case SIOCZIFDATA:
3237 1.131 msaitoh IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
3238 1.131 msaitoh ixv_update_stats(adapter);
3239 1.131 msaitoh ixv_clear_evcnt(adapter);
3240 1.131 msaitoh break;
3241 1.57 msaitoh default:
3242 1.57 msaitoh IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
3243 1.57 msaitoh break;
3244 1.57 msaitoh }
3245 1.57 msaitoh
3246 1.57 msaitoh switch (command) {
3247 1.57 msaitoh case SIOCSIFCAP:
3248 1.57 msaitoh /* Layer-4 Rx checksum offload has to be turned on and
3249 1.57 msaitoh * off as a unit.
3250 1.57 msaitoh */
3251 1.57 msaitoh l4csum_en = ifcr->ifcr_capenable & l4csum;
3252 1.57 msaitoh if (l4csum_en != l4csum && l4csum_en != 0)
3253 1.57 msaitoh return EINVAL;
3254 1.57 msaitoh /*FALLTHROUGH*/
3255 1.57 msaitoh case SIOCADDMULTI:
3256 1.57 msaitoh case SIOCDELMULTI:
3257 1.57 msaitoh case SIOCSIFFLAGS:
3258 1.57 msaitoh case SIOCSIFMTU:
3259 1.57 msaitoh default:
3260 1.57 msaitoh if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
3261 1.57 msaitoh return error;
3262 1.57 msaitoh if ((ifp->if_flags & IFF_RUNNING) == 0)
3263 1.57 msaitoh ;
3264 1.57 msaitoh else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
3265 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
3266 1.57 msaitoh ixv_init_locked(adapter);
3267 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
3268 1.57 msaitoh } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
3269 1.57 msaitoh /*
3270 1.57 msaitoh * Multicast list has changed; set the hardware filter
3271 1.57 msaitoh * accordingly.
3272 1.57 msaitoh */
3273 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
3274 1.57 msaitoh ixv_disable_intr(adapter);
3275 1.138 msaitoh ixv_set_rxfilter(adapter);
3276 1.57 msaitoh ixv_enable_intr(adapter);
3277 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
3278 1.57 msaitoh }
3279 1.57 msaitoh return 0;
3280 1.57 msaitoh }
3281 1.58 msaitoh } /* ixv_ioctl */
3282 1.57 msaitoh
3283 1.58 msaitoh /************************************************************************
3284 1.58 msaitoh * ixv_init
3285 1.58 msaitoh ************************************************************************/
3286 1.57 msaitoh static int
3287 1.57 msaitoh ixv_init(struct ifnet *ifp)
3288 1.57 msaitoh {
3289 1.57 msaitoh struct adapter *adapter = ifp->if_softc;
3290 1.57 msaitoh
3291 1.57 msaitoh IXGBE_CORE_LOCK(adapter);
3292 1.57 msaitoh ixv_init_locked(adapter);
3293 1.57 msaitoh IXGBE_CORE_UNLOCK(adapter);
3294 1.57 msaitoh
3295 1.57 msaitoh return 0;
3296 1.58 msaitoh } /* ixv_init */
3297 1.57 msaitoh
3298 1.58 msaitoh /************************************************************************
3299 1.58 msaitoh * ixv_handle_que
3300 1.58 msaitoh ************************************************************************/
3301 1.57 msaitoh static void
3302 1.57 msaitoh ixv_handle_que(void *context)
3303 1.57 msaitoh {
3304 1.57 msaitoh struct ix_queue *que = context;
3305 1.114 msaitoh struct adapter *adapter = que->adapter;
3306 1.57 msaitoh struct tx_ring *txr = que->txr;
3307 1.114 msaitoh struct ifnet *ifp = adapter->ifp;
3308 1.57 msaitoh bool more;
3309 1.57 msaitoh
3310 1.178 msaitoh IXGBE_EVC_ADD(&que->handleq, 1);
3311 1.57 msaitoh
3312 1.57 msaitoh if (ifp->if_flags & IFF_RUNNING) {
3313 1.57 msaitoh IXGBE_TX_LOCK(txr);
3314 1.183 msaitoh more = ixgbe_txeof(txr);
3315 1.58 msaitoh if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
3316 1.58 msaitoh if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
3317 1.58 msaitoh ixgbe_mq_start_locked(ifp, txr);
3318 1.57 msaitoh /* Only for queue 0 */
3319 1.61 msaitoh /* NetBSD still needs this for CBQ */
3320 1.57 msaitoh if ((&adapter->queues[0] == que)
3321 1.58 msaitoh && (!ixgbe_legacy_ring_empty(ifp, NULL)))
3322 1.58 msaitoh ixgbe_legacy_start_locked(ifp, txr);
3323 1.57 msaitoh IXGBE_TX_UNLOCK(txr);
3324 1.183 msaitoh more |= ixgbe_rxeof(que);
3325 1.57 msaitoh if (more) {
3326 1.178 msaitoh IXGBE_EVC_ADD(&que->req, 1);
3327 1.84 knakahar if (adapter->txrx_use_workqueue) {
3328 1.84 knakahar /*
3329 1.84 knakahar * "enqueued flag" is not required here
3330 1.84 knakahar * the same as ixg(4). See ixgbe_msix_que().
3331 1.84 knakahar */
3332 1.84 knakahar workqueue_enqueue(adapter->que_wq,
3333 1.84 knakahar &que->wq_cookie, curcpu());
3334 1.84 knakahar } else
3335 1.84 knakahar softint_schedule(que->que_si);
3336 1.57 msaitoh return;
3337 1.57 msaitoh }
3338 1.57 msaitoh }
3339 1.57 msaitoh
3340 1.58 msaitoh /* Re-enable this interrupt */
3341 1.57 msaitoh ixv_enable_queue(adapter, que->msix);
3342 1.57 msaitoh
3343 1.57 msaitoh return;
3344 1.58 msaitoh } /* ixv_handle_que */
3345 1.57 msaitoh
3346 1.58 msaitoh /************************************************************************
3347 1.84 knakahar * ixv_handle_que_work
3348 1.84 knakahar ************************************************************************/
3349 1.84 knakahar static void
3350 1.84 knakahar ixv_handle_que_work(struct work *wk, void *context)
3351 1.84 knakahar {
3352 1.84 knakahar struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
3353 1.84 knakahar
3354 1.84 knakahar /*
3355 1.84 knakahar * "enqueued flag" is not required here the same as ixg(4).
3356 1.84 knakahar * See ixgbe_msix_que().
3357 1.84 knakahar */
3358 1.84 knakahar ixv_handle_que(que);
3359 1.84 knakahar }
3360 1.84 knakahar
3361 1.84 knakahar /************************************************************************
3362 1.58 msaitoh * ixv_allocate_msix - Setup MSI-X Interrupt resources and handlers
3363 1.58 msaitoh ************************************************************************/
3364 1.57 msaitoh static int
3365 1.57 msaitoh ixv_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
3366 1.57 msaitoh {
3367 1.57 msaitoh device_t dev = adapter->dev;
3368 1.57 msaitoh struct ix_queue *que = adapter->queues;
3369 1.98 msaitoh struct tx_ring *txr = adapter->tx_rings;
3370 1.114 msaitoh int error, msix_ctrl, rid, vector = 0;
3371 1.57 msaitoh pci_chipset_tag_t pc;
3372 1.57 msaitoh pcitag_t tag;
3373 1.57 msaitoh char intrbuf[PCI_INTRSTR_LEN];
3374 1.84 knakahar char wqname[MAXCOMLEN];
3375 1.57 msaitoh char intr_xname[32];
3376 1.57 msaitoh const char *intrstr = NULL;
3377 1.57 msaitoh kcpuset_t *affinity;
3378 1.57 msaitoh int cpu_id = 0;
3379 1.57 msaitoh
3380 1.57 msaitoh pc = adapter->osdep.pc;
3381 1.57 msaitoh tag = adapter->osdep.tag;
3382 1.57 msaitoh
3383 1.57 msaitoh adapter->osdep.nintrs = adapter->num_queues + 1;
3384 1.57 msaitoh if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
3385 1.57 msaitoh adapter->osdep.nintrs) != 0) {
3386 1.57 msaitoh aprint_error_dev(dev,
3387 1.57 msaitoh "failed to allocate MSI-X interrupt\n");
3388 1.57 msaitoh return (ENXIO);
3389 1.57 msaitoh }
3390 1.57 msaitoh
3391 1.57 msaitoh kcpuset_create(&affinity, false);
3392 1.57 msaitoh for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
3393 1.57 msaitoh snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
3394 1.57 msaitoh device_xname(dev), i);
3395 1.57 msaitoh intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
3396 1.57 msaitoh sizeof(intrbuf));
3397 1.57 msaitoh #ifdef IXGBE_MPSAFE
3398 1.57 msaitoh pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
3399 1.57 msaitoh true);
3400 1.57 msaitoh #endif
3401 1.57 msaitoh /* Set the handler function */
3402 1.57 msaitoh que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
3403 1.57 msaitoh adapter->osdep.intrs[i], IPL_NET, ixv_msix_que, que,
3404 1.57 msaitoh intr_xname);
3405 1.57 msaitoh if (que->res == NULL) {
3406 1.57 msaitoh pci_intr_release(pc, adapter->osdep.intrs,
3407 1.57 msaitoh adapter->osdep.nintrs);
3408 1.57 msaitoh aprint_error_dev(dev,
3409 1.57 msaitoh "Failed to register QUE handler\n");
3410 1.57 msaitoh kcpuset_destroy(affinity);
3411 1.57 msaitoh return (ENXIO);
3412 1.57 msaitoh }
3413 1.57 msaitoh que->msix = vector;
3414 1.114 msaitoh adapter->active_queues |= (u64)(1 << que->msix);
3415 1.57 msaitoh
3416 1.57 msaitoh cpu_id = i;
3417 1.57 msaitoh /* Round-robin affinity */
3418 1.57 msaitoh kcpuset_zero(affinity);
3419 1.57 msaitoh kcpuset_set(affinity, cpu_id % ncpu);
3420 1.57 msaitoh error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
3421 1.57 msaitoh NULL);
3422 1.57 msaitoh aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
3423 1.57 msaitoh intrstr);
3424 1.57 msaitoh if (error == 0)
3425 1.57 msaitoh aprint_normal(", bound queue %d to cpu %d\n",
3426 1.57 msaitoh i, cpu_id % ncpu);
3427 1.57 msaitoh else
3428 1.57 msaitoh aprint_normal("\n");
3429 1.57 msaitoh
3430 1.57 msaitoh #ifndef IXGBE_LEGACY_TX
3431 1.57 msaitoh txr->txr_si
3432 1.149 msaitoh = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
3433 1.57 msaitoh ixgbe_deferred_mq_start, txr);
3434 1.57 msaitoh #endif
3435 1.57 msaitoh que->que_si
3436 1.149 msaitoh = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
3437 1.57 msaitoh ixv_handle_que, que);
3438 1.57 msaitoh if (que->que_si == NULL) {
3439 1.57 msaitoh aprint_error_dev(dev,
3440 1.113 msaitoh "could not establish software interrupt\n");
3441 1.57 msaitoh }
3442 1.57 msaitoh }
3443 1.84 knakahar snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
3444 1.84 knakahar error = workqueue_create(&adapter->txr_wq, wqname,
3445 1.84 knakahar ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
3446 1.84 knakahar IXGBE_WORKQUEUE_FLAGS);
3447 1.84 knakahar if (error) {
3448 1.158 msaitoh aprint_error_dev(dev,
3449 1.158 msaitoh "couldn't create workqueue for deferred Tx\n");
3450 1.84 knakahar }
3451 1.84 knakahar adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
3452 1.84 knakahar
3453 1.84 knakahar snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
3454 1.84 knakahar error = workqueue_create(&adapter->que_wq, wqname,
3455 1.84 knakahar ixv_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
3456 1.84 knakahar IXGBE_WORKQUEUE_FLAGS);
3457 1.84 knakahar if (error) {
3458 1.158 msaitoh aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
3459 1.84 knakahar }
3460 1.57 msaitoh
3461 1.57 msaitoh /* and Mailbox */
3462 1.57 msaitoh cpu_id++;
3463 1.57 msaitoh snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
3464 1.77 msaitoh adapter->vector = vector;
3465 1.57 msaitoh intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
3466 1.57 msaitoh sizeof(intrbuf));
3467 1.57 msaitoh #ifdef IXGBE_MPSAFE
3468 1.57 msaitoh pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
3469 1.57 msaitoh true);
3470 1.57 msaitoh #endif
3471 1.57 msaitoh /* Set the mbx handler function */
3472 1.57 msaitoh adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
3473 1.57 msaitoh adapter->osdep.intrs[vector], IPL_NET, ixv_msix_mbx, adapter,
3474 1.57 msaitoh intr_xname);
3475 1.57 msaitoh if (adapter->osdep.ihs[vector] == NULL) {
3476 1.57 msaitoh aprint_error_dev(dev, "Failed to register LINK handler\n");
3477 1.57 msaitoh kcpuset_destroy(affinity);
3478 1.57 msaitoh return (ENXIO);
3479 1.57 msaitoh }
3480 1.57 msaitoh /* Round-robin affinity */
3481 1.57 msaitoh kcpuset_zero(affinity);
3482 1.57 msaitoh kcpuset_set(affinity, cpu_id % ncpu);
3483 1.150 msaitoh error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,
3484 1.150 msaitoh NULL);
3485 1.57 msaitoh
3486 1.57 msaitoh aprint_normal_dev(dev,
3487 1.57 msaitoh "for link, interrupting at %s", intrstr);
3488 1.57 msaitoh if (error == 0)
3489 1.57 msaitoh aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
3490 1.57 msaitoh else
3491 1.57 msaitoh aprint_normal("\n");
3492 1.57 msaitoh
3493 1.57 msaitoh /* Tasklets for Mailbox */
3494 1.151 msaitoh snprintf(wqname, sizeof(wqname), "%s-admin", device_xname(dev));
3495 1.151 msaitoh error = workqueue_create(&adapter->admin_wq, wqname,
3496 1.151 msaitoh ixv_handle_admin, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
3497 1.151 msaitoh IXGBE_TASKLET_WQ_FLAGS);
3498 1.151 msaitoh if (error) {
3499 1.151 msaitoh aprint_error_dev(dev,
3500 1.151 msaitoh "could not create admin workqueue (%d)\n", error);
3501 1.151 msaitoh goto err_out;
3502 1.151 msaitoh }
3503 1.151 msaitoh
3504 1.57 msaitoh /*
3505 1.58 msaitoh * Due to a broken design QEMU will fail to properly
3506 1.58 msaitoh * enable the guest for MSI-X unless the vectors in
3507 1.58 msaitoh * the table are all set up, so we must rewrite the
3508 1.58 msaitoh * ENABLE in the MSI-X control register again at this
3509 1.58 msaitoh * point to cause it to successfully initialize us.
3510 1.58 msaitoh */
3511 1.57 msaitoh if (adapter->hw.mac.type == ixgbe_mac_82599_vf) {
3512 1.57 msaitoh pci_get_capability(pc, tag, PCI_CAP_MSIX, &rid, NULL);
3513 1.57 msaitoh rid += PCI_MSIX_CTL;
3514 1.57 msaitoh msix_ctrl = pci_conf_read(pc, tag, rid);
3515 1.57 msaitoh msix_ctrl |= PCI_MSIX_CTL_ENABLE;
3516 1.57 msaitoh pci_conf_write(pc, tag, rid, msix_ctrl);
3517 1.57 msaitoh }
3518 1.57 msaitoh
3519 1.57 msaitoh kcpuset_destroy(affinity);
3520 1.57 msaitoh return (0);
3521 1.151 msaitoh err_out:
3522 1.151 msaitoh kcpuset_destroy(affinity);
3523 1.154 msaitoh ixv_free_deferred_handlers(adapter);
3524 1.151 msaitoh ixv_free_pci_resources(adapter);
3525 1.151 msaitoh return (error);
3526 1.58 msaitoh } /* ixv_allocate_msix */
3527 1.57 msaitoh
3528 1.58 msaitoh /************************************************************************
3529 1.58 msaitoh * ixv_configure_interrupts - Setup MSI-X resources
3530 1.58 msaitoh *
3531 1.58 msaitoh * Note: The VF device MUST use MSI-X, there is no fallback.
3532 1.58 msaitoh ************************************************************************/
3533 1.57 msaitoh static int
3534 1.58 msaitoh ixv_configure_interrupts(struct adapter *adapter)
3535 1.57 msaitoh {
3536 1.57 msaitoh device_t dev = adapter->dev;
3537 1.57 msaitoh int want, queues, msgs;
3538 1.57 msaitoh
3539 1.58 msaitoh /* Must have at least 2 MSI-X vectors */
3540 1.57 msaitoh msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
3541 1.57 msaitoh if (msgs < 2) {
3542 1.63 msaitoh aprint_error_dev(dev, "MSIX config error\n");
3543 1.57 msaitoh return (ENXIO);
3544 1.57 msaitoh }
3545 1.57 msaitoh msgs = MIN(msgs, IXG_MAX_NINTR);
3546 1.57 msaitoh
3547 1.57 msaitoh /* Figure out a reasonable auto config value */
3548 1.57 msaitoh queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
3549 1.57 msaitoh
3550 1.57 msaitoh if (ixv_num_queues != 0)
3551 1.57 msaitoh queues = ixv_num_queues;
3552 1.57 msaitoh else if ((ixv_num_queues == 0) && (queues > IXGBE_VF_MAX_TX_QUEUES))
3553 1.57 msaitoh queues = IXGBE_VF_MAX_TX_QUEUES;
3554 1.57 msaitoh
3555 1.57 msaitoh /*
3556 1.58 msaitoh * Want vectors for the queues,
3557 1.58 msaitoh * plus an additional for mailbox.
3558 1.58 msaitoh */
3559 1.57 msaitoh want = queues + 1;
3560 1.57 msaitoh if (msgs >= want)
3561 1.57 msaitoh msgs = want;
3562 1.57 msaitoh else {
3563 1.114 msaitoh aprint_error_dev(dev,
3564 1.58 msaitoh "MSI-X Configuration Problem, "
3565 1.182 msaitoh "%d vectors but %d queues wanted!\n", msgs, want);
3566 1.57 msaitoh return -1;
3567 1.57 msaitoh }
3568 1.57 msaitoh
3569 1.57 msaitoh aprint_normal_dev(dev,
3570 1.58 msaitoh "Using MSI-X interrupts with %d vectors\n", msgs);
3571 1.57 msaitoh adapter->num_queues = queues;
3572 1.57 msaitoh
3573 1.58 msaitoh return (0);
3574 1.58 msaitoh } /* ixv_configure_interrupts */
3575 1.58 msaitoh
3576 1.58 msaitoh
3577 1.58 msaitoh /************************************************************************
3578 1.151 msaitoh * ixv_handle_admin - Tasklet handler for MSI-X MBX interrupts
3579 1.58 msaitoh *
3580 1.58 msaitoh * Done outside of interrupt context since the driver might sleep
3581 1.58 msaitoh ************************************************************************/
3582 1.57 msaitoh static void
3583 1.151 msaitoh ixv_handle_admin(struct work *wk, void *context)
3584 1.57 msaitoh {
3585 1.58 msaitoh struct adapter *adapter = context;
3586 1.151 msaitoh struct ixgbe_hw *hw = &adapter->hw;
3587 1.57 msaitoh
3588 1.89 knakahar IXGBE_CORE_LOCK(adapter);
3589 1.89 knakahar
3590 1.178 msaitoh IXGBE_EVC_ADD(&adapter->link_workev, 1);
3591 1.58 msaitoh adapter->hw.mac.ops.check_link(&adapter->hw, &adapter->link_speed,
3592 1.58 msaitoh &adapter->link_up, FALSE);
3593 1.57 msaitoh ixv_update_link_status(adapter);
3594 1.89 knakahar
3595 1.151 msaitoh adapter->task_requests = 0;
3596 1.152 msaitoh atomic_store_relaxed(&adapter->admin_pending, 0);
3597 1.151 msaitoh
3598 1.151 msaitoh /* Re-enable interrupts */
3599 1.151 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << adapter->vector));
3600 1.151 msaitoh
3601 1.89 knakahar IXGBE_CORE_UNLOCK(adapter);
3602 1.151 msaitoh } /* ixv_handle_admin */
3603 1.57 msaitoh
3604 1.58 msaitoh /************************************************************************
3605 1.58 msaitoh * ixv_check_link - Used in the local timer to poll for link changes
3606 1.58 msaitoh ************************************************************************/
3607 1.117 msaitoh static s32
3608 1.58 msaitoh ixv_check_link(struct adapter *adapter)
3609 1.57 msaitoh {
3610 1.117 msaitoh s32 error;
3611 1.89 knakahar
3612 1.89 knakahar KASSERT(mutex_owned(&adapter->core_mtx));
3613 1.89 knakahar
3614 1.58 msaitoh adapter->hw.mac.get_link_status = TRUE;
3615 1.57 msaitoh
3616 1.117 msaitoh error = adapter->hw.mac.ops.check_link(&adapter->hw,
3617 1.117 msaitoh &adapter->link_speed, &adapter->link_up, FALSE);
3618 1.58 msaitoh ixv_update_link_status(adapter);
3619 1.117 msaitoh
3620 1.117 msaitoh return error;
3621 1.58 msaitoh } /* ixv_check_link */
3622