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