1 /******************************************************************************
3 Copyright (c) 2001-2012, Intel Corporation
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
32 ******************************************************************************/
36 #include "opt_inet6.h"
38 #ifdef HAVE_KERNEL_OPTION_HEADERS
39 #include "opt_device_polling.h"
42 #include <sys/param.h>
43 #include <sys/systm.h>
45 #include <sys/endian.h>
46 #include <sys/kernel.h>
47 #include <sys/kthread.h>
48 #include <sys/malloc.h>
50 #include <sys/module.h>
52 #include <sys/socket.h>
53 #include <sys/sockio.h>
54 #include <sys/sysctl.h>
55 #include <sys/taskqueue.h>
56 #include <sys/eventhandler.h>
57 #include <machine/bus.h>
58 #include <machine/resource.h>
61 #include <net/ethernet.h>
63 #include <net/if_arp.h>
64 #include <net/if_dl.h>
65 #include <net/if_media.h>
67 #include <net/if_types.h>
68 #include <net/if_vlan_var.h>
70 #include <netinet/in_systm.h>
71 #include <netinet/in.h>
72 #include <netinet/if_ether.h>
73 #include <netinet/ip.h>
74 #include <netinet/ip6.h>
75 #include <netinet/tcp.h>
76 #include <netinet/udp.h>
78 #include <machine/in_cksum.h>
79 #include <dev/led/led.h>
80 #include <dev/pci/pcivar.h>
81 #include <dev/pci/pcireg.h>
83 #include "e1000_api.h"
86 /*********************************************************************
87 * Legacy Em Driver version:
88 *********************************************************************/
89 char lem_driver_version[] = "1.0.6";
91 /*********************************************************************
94 * Used by probe to select devices to load on
95 * Last field stores an index into e1000_strings
96 * Last entry must be all 0s
98 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
99 *********************************************************************/
101 static em_vendor_info_t lem_vendor_info_array[] =
103 /* Intel(R) PRO/1000 Network Connection */
104 { 0x8086, E1000_DEV_ID_82540EM, PCI_ANY_ID, PCI_ANY_ID, 0},
105 { 0x8086, E1000_DEV_ID_82540EM_LOM, PCI_ANY_ID, PCI_ANY_ID, 0},
106 { 0x8086, E1000_DEV_ID_82540EP, PCI_ANY_ID, PCI_ANY_ID, 0},
107 { 0x8086, E1000_DEV_ID_82540EP_LOM, PCI_ANY_ID, PCI_ANY_ID, 0},
108 { 0x8086, E1000_DEV_ID_82540EP_LP, PCI_ANY_ID, PCI_ANY_ID, 0},
110 { 0x8086, E1000_DEV_ID_82541EI, PCI_ANY_ID, PCI_ANY_ID, 0},
111 { 0x8086, E1000_DEV_ID_82541ER, PCI_ANY_ID, PCI_ANY_ID, 0},
112 { 0x8086, E1000_DEV_ID_82541ER_LOM, PCI_ANY_ID, PCI_ANY_ID, 0},
113 { 0x8086, E1000_DEV_ID_82541EI_MOBILE, PCI_ANY_ID, PCI_ANY_ID, 0},
114 { 0x8086, E1000_DEV_ID_82541GI, PCI_ANY_ID, PCI_ANY_ID, 0},
115 { 0x8086, E1000_DEV_ID_82541GI_LF, PCI_ANY_ID, PCI_ANY_ID, 0},
116 { 0x8086, E1000_DEV_ID_82541GI_MOBILE, PCI_ANY_ID, PCI_ANY_ID, 0},
118 { 0x8086, E1000_DEV_ID_82542, PCI_ANY_ID, PCI_ANY_ID, 0},
120 { 0x8086, E1000_DEV_ID_82543GC_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0},
121 { 0x8086, E1000_DEV_ID_82543GC_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
123 { 0x8086, E1000_DEV_ID_82544EI_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
124 { 0x8086, E1000_DEV_ID_82544EI_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0},
125 { 0x8086, E1000_DEV_ID_82544GC_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
126 { 0x8086, E1000_DEV_ID_82544GC_LOM, PCI_ANY_ID, PCI_ANY_ID, 0},
128 { 0x8086, E1000_DEV_ID_82545EM_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
129 { 0x8086, E1000_DEV_ID_82545EM_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0},
130 { 0x8086, E1000_DEV_ID_82545GM_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
131 { 0x8086, E1000_DEV_ID_82545GM_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0},
132 { 0x8086, E1000_DEV_ID_82545GM_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0},
134 { 0x8086, E1000_DEV_ID_82546EB_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
135 { 0x8086, E1000_DEV_ID_82546EB_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0},
136 { 0x8086, E1000_DEV_ID_82546EB_QUAD_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
137 { 0x8086, E1000_DEV_ID_82546GB_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
138 { 0x8086, E1000_DEV_ID_82546GB_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0},
139 { 0x8086, E1000_DEV_ID_82546GB_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0},
140 { 0x8086, E1000_DEV_ID_82546GB_PCIE, PCI_ANY_ID, PCI_ANY_ID, 0},
141 { 0x8086, E1000_DEV_ID_82546GB_QUAD_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
142 { 0x8086, E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3,
143 PCI_ANY_ID, PCI_ANY_ID, 0},
145 { 0x8086, E1000_DEV_ID_82547EI, PCI_ANY_ID, PCI_ANY_ID, 0},
146 { 0x8086, E1000_DEV_ID_82547EI_MOBILE, PCI_ANY_ID, PCI_ANY_ID, 0},
147 { 0x8086, E1000_DEV_ID_82547GI, PCI_ANY_ID, PCI_ANY_ID, 0},
148 /* required last entry */
152 /*********************************************************************
153 * Table of branding strings for all supported NICs.
154 *********************************************************************/
156 static char *lem_strings[] = {
157 "Intel(R) PRO/1000 Legacy Network Connection"
160 /*********************************************************************
161 * Function prototypes
162 *********************************************************************/
163 static int lem_probe(device_t);
164 static int lem_attach(device_t);
165 static int lem_detach(device_t);
166 static int lem_shutdown(device_t);
167 static int lem_suspend(device_t);
168 static int lem_resume(device_t);
169 static void lem_start(struct ifnet *);
170 static void lem_start_locked(struct ifnet *ifp);
171 static int lem_ioctl(struct ifnet *, u_long, caddr_t);
172 static void lem_init(void *);
173 static void lem_init_locked(struct adapter *);
174 static void lem_stop(void *);
175 static void lem_media_status(struct ifnet *, struct ifmediareq *);
176 static int lem_media_change(struct ifnet *);
177 static void lem_identify_hardware(struct adapter *);
178 static int lem_allocate_pci_resources(struct adapter *);
179 static int lem_allocate_irq(struct adapter *adapter);
180 static void lem_free_pci_resources(struct adapter *);
181 static void lem_local_timer(void *);
182 static int lem_hardware_init(struct adapter *);
183 static int lem_setup_interface(device_t, struct adapter *);
184 static void lem_setup_transmit_structures(struct adapter *);
185 static void lem_initialize_transmit_unit(struct adapter *);
186 static int lem_setup_receive_structures(struct adapter *);
187 static void lem_initialize_receive_unit(struct adapter *);
188 static void lem_enable_intr(struct adapter *);
189 static void lem_disable_intr(struct adapter *);
190 static void lem_free_transmit_structures(struct adapter *);
191 static void lem_free_receive_structures(struct adapter *);
192 static void lem_update_stats_counters(struct adapter *);
193 static void lem_add_hw_stats(struct adapter *adapter);
194 static void lem_txeof(struct adapter *);
195 static void lem_tx_purge(struct adapter *);
196 static int lem_allocate_receive_structures(struct adapter *);
197 static int lem_allocate_transmit_structures(struct adapter *);
198 static bool lem_rxeof(struct adapter *, int, int *);
199 #ifndef __NO_STRICT_ALIGNMENT
200 static int lem_fixup_rx(struct adapter *);
202 static void lem_receive_checksum(struct adapter *, struct e1000_rx_desc *,
204 static void lem_transmit_checksum_setup(struct adapter *, struct mbuf *,
206 static void lem_set_promisc(struct adapter *);
207 static void lem_disable_promisc(struct adapter *);
208 static void lem_set_multi(struct adapter *);
209 static void lem_update_link_status(struct adapter *);
210 static int lem_get_buf(struct adapter *, int);
211 static void lem_register_vlan(void *, struct ifnet *, u16);
212 static void lem_unregister_vlan(void *, struct ifnet *, u16);
213 static void lem_setup_vlan_hw_support(struct adapter *);
214 static int lem_xmit(struct adapter *, struct mbuf **);
215 static void lem_smartspeed(struct adapter *);
216 static int lem_82547_fifo_workaround(struct adapter *, int);
217 static void lem_82547_update_fifo_head(struct adapter *, int);
218 static int lem_82547_tx_fifo_reset(struct adapter *);
219 static void lem_82547_move_tail(void *);
220 static int lem_dma_malloc(struct adapter *, bus_size_t,
221 struct em_dma_alloc *, int);
222 static void lem_dma_free(struct adapter *, struct em_dma_alloc *);
223 static int lem_sysctl_nvm_info(SYSCTL_HANDLER_ARGS);
224 static void lem_print_nvm_info(struct adapter *);
225 static int lem_is_valid_ether_addr(u8 *);
226 static u32 lem_fill_descriptors (bus_addr_t address, u32 length,
227 PDESC_ARRAY desc_array);
228 static int lem_sysctl_int_delay(SYSCTL_HANDLER_ARGS);
229 static void lem_add_int_delay_sysctl(struct adapter *, const char *,
230 const char *, struct em_int_delay_info *, int, int);
231 static void lem_set_flow_cntrl(struct adapter *, const char *,
232 const char *, int *, int);
233 /* Management and WOL Support */
234 static void lem_init_manageability(struct adapter *);
235 static void lem_release_manageability(struct adapter *);
236 static void lem_get_hw_control(struct adapter *);
237 static void lem_release_hw_control(struct adapter *);
238 static void lem_get_wakeup(device_t);
239 static void lem_enable_wakeup(device_t);
240 static int lem_enable_phy_wakeup(struct adapter *);
241 static void lem_led_func(void *, int);
243 static void lem_intr(void *);
244 static int lem_irq_fast(void *);
245 static void lem_handle_rxtx(void *context, int pending);
246 static void lem_handle_link(void *context, int pending);
247 static void lem_add_rx_process_limit(struct adapter *, const char *,
248 const char *, int *, int);
250 #ifdef DEVICE_POLLING
251 static poll_handler_t lem_poll;
254 /*********************************************************************
255 * FreeBSD Device Interface Entry Points
256 *********************************************************************/
258 static device_method_t lem_methods[] = {
259 /* Device interface */
260 DEVMETHOD(device_probe, lem_probe),
261 DEVMETHOD(device_attach, lem_attach),
262 DEVMETHOD(device_detach, lem_detach),
263 DEVMETHOD(device_shutdown, lem_shutdown),
264 DEVMETHOD(device_suspend, lem_suspend),
265 DEVMETHOD(device_resume, lem_resume),
269 static driver_t lem_driver = {
270 "em", lem_methods, sizeof(struct adapter),
273 extern devclass_t em_devclass;
274 DRIVER_MODULE(lem, pci, lem_driver, em_devclass, 0, 0);
275 MODULE_DEPEND(lem, pci, 1, 1, 1);
276 MODULE_DEPEND(lem, ether, 1, 1, 1);
278 /*********************************************************************
279 * Tunable default values.
280 *********************************************************************/
282 #define EM_TICKS_TO_USECS(ticks) ((1024 * (ticks) + 500) / 1000)
283 #define EM_USECS_TO_TICKS(usecs) ((1000 * (usecs) + 512) / 1024)
285 #define MAX_INTS_PER_SEC 8000
286 #define DEFAULT_ITR (1000000000/(MAX_INTS_PER_SEC * 256))
288 static int lem_tx_int_delay_dflt = EM_TICKS_TO_USECS(EM_TIDV);
289 static int lem_rx_int_delay_dflt = EM_TICKS_TO_USECS(EM_RDTR);
290 static int lem_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV);
291 static int lem_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV);
292 static int lem_rxd = EM_DEFAULT_RXD;
293 static int lem_txd = EM_DEFAULT_TXD;
294 static int lem_smart_pwr_down = FALSE;
296 /* Controls whether promiscuous also shows bad packets */
297 static int lem_debug_sbp = FALSE;
299 TUNABLE_INT("hw.em.tx_int_delay", &lem_tx_int_delay_dflt);
300 TUNABLE_INT("hw.em.rx_int_delay", &lem_rx_int_delay_dflt);
301 TUNABLE_INT("hw.em.tx_abs_int_delay", &lem_tx_abs_int_delay_dflt);
302 TUNABLE_INT("hw.em.rx_abs_int_delay", &lem_rx_abs_int_delay_dflt);
303 TUNABLE_INT("hw.em.rxd", &lem_rxd);
304 TUNABLE_INT("hw.em.txd", &lem_txd);
305 TUNABLE_INT("hw.em.smart_pwr_down", &lem_smart_pwr_down);
306 TUNABLE_INT("hw.em.sbp", &lem_debug_sbp);
308 /* Interrupt style - default to fast */
309 static int lem_use_legacy_irq = 0;
310 TUNABLE_INT("hw.em.use_legacy_irq", &lem_use_legacy_irq);
312 /* How many packets rxeof tries to clean at a time */
313 static int lem_rx_process_limit = 100;
314 TUNABLE_INT("hw.em.rx_process_limit", &lem_rx_process_limit);
316 /* Flow control setting - default to FULL */
317 static int lem_fc_setting = e1000_fc_full;
318 TUNABLE_INT("hw.em.fc_setting", &lem_fc_setting);
320 /* Global used in WOL setup with multiport cards */
321 static int global_quad_port_a = 0;
323 #ifdef DEV_NETMAP /* see ixgbe.c for details */
324 #include <dev/netmap/if_lem_netmap.h>
325 #endif /* DEV_NETMAP */
327 /*********************************************************************
328 * Device identification routine
330 * em_probe determines if the driver should be loaded on
331 * adapter based on PCI vendor/device id of the adapter.
333 * return BUS_PROBE_DEFAULT on success, positive on failure
334 *********************************************************************/
337 lem_probe(device_t dev)
339 char adapter_name[60];
340 u16 pci_vendor_id = 0;
341 u16 pci_device_id = 0;
342 u16 pci_subvendor_id = 0;
343 u16 pci_subdevice_id = 0;
344 em_vendor_info_t *ent;
346 INIT_DEBUGOUT("em_probe: begin");
348 pci_vendor_id = pci_get_vendor(dev);
349 if (pci_vendor_id != EM_VENDOR_ID)
352 pci_device_id = pci_get_device(dev);
353 pci_subvendor_id = pci_get_subvendor(dev);
354 pci_subdevice_id = pci_get_subdevice(dev);
356 ent = lem_vendor_info_array;
357 while (ent->vendor_id != 0) {
358 if ((pci_vendor_id == ent->vendor_id) &&
359 (pci_device_id == ent->device_id) &&
361 ((pci_subvendor_id == ent->subvendor_id) ||
362 (ent->subvendor_id == PCI_ANY_ID)) &&
364 ((pci_subdevice_id == ent->subdevice_id) ||
365 (ent->subdevice_id == PCI_ANY_ID))) {
366 sprintf(adapter_name, "%s %s",
367 lem_strings[ent->index],
369 device_set_desc_copy(dev, adapter_name);
370 return (BUS_PROBE_DEFAULT);
378 /*********************************************************************
379 * Device initialization routine
381 * The attach entry point is called when the driver is being loaded.
382 * This routine identifies the type of hardware, allocates all resources
383 * and initializes the hardware.
385 * return 0 on success, positive on failure
386 *********************************************************************/
389 lem_attach(device_t dev)
391 struct adapter *adapter;
395 INIT_DEBUGOUT("lem_attach: begin");
397 adapter = device_get_softc(dev);
398 adapter->dev = adapter->osdep.dev = dev;
399 EM_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
400 EM_TX_LOCK_INIT(adapter, device_get_nameunit(dev));
401 EM_RX_LOCK_INIT(adapter, device_get_nameunit(dev));
404 SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
405 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
406 OID_AUTO, "nvm", CTLTYPE_INT|CTLFLAG_RW, adapter, 0,
407 lem_sysctl_nvm_info, "I", "NVM Information");
409 callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
410 callout_init_mtx(&adapter->tx_fifo_timer, &adapter->tx_mtx, 0);
412 /* Determine hardware and mac info */
413 lem_identify_hardware(adapter);
415 /* Setup PCI resources */
416 if (lem_allocate_pci_resources(adapter)) {
417 device_printf(dev, "Allocation of PCI resources failed\n");
422 /* Do Shared Code initialization */
423 if (e1000_setup_init_funcs(&adapter->hw, TRUE)) {
424 device_printf(dev, "Setup of Shared code failed\n");
429 e1000_get_bus_info(&adapter->hw);
431 /* Set up some sysctls for the tunable interrupt delays */
432 lem_add_int_delay_sysctl(adapter, "rx_int_delay",
433 "receive interrupt delay in usecs", &adapter->rx_int_delay,
434 E1000_REGISTER(&adapter->hw, E1000_RDTR), lem_rx_int_delay_dflt);
435 lem_add_int_delay_sysctl(adapter, "tx_int_delay",
436 "transmit interrupt delay in usecs", &adapter->tx_int_delay,
437 E1000_REGISTER(&adapter->hw, E1000_TIDV), lem_tx_int_delay_dflt);
438 if (adapter->hw.mac.type >= e1000_82540) {
439 lem_add_int_delay_sysctl(adapter, "rx_abs_int_delay",
440 "receive interrupt delay limit in usecs",
441 &adapter->rx_abs_int_delay,
442 E1000_REGISTER(&adapter->hw, E1000_RADV),
443 lem_rx_abs_int_delay_dflt);
444 lem_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
445 "transmit interrupt delay limit in usecs",
446 &adapter->tx_abs_int_delay,
447 E1000_REGISTER(&adapter->hw, E1000_TADV),
448 lem_tx_abs_int_delay_dflt);
449 lem_add_int_delay_sysctl(adapter, "itr",
450 "interrupt delay limit in usecs/4",
452 E1000_REGISTER(&adapter->hw, E1000_ITR),
456 /* Sysctls for limiting the amount of work done in the taskqueue */
457 lem_add_rx_process_limit(adapter, "rx_processing_limit",
458 "max number of rx packets to process", &adapter->rx_process_limit,
459 lem_rx_process_limit);
461 /* Sysctl for setting the interface flow control */
462 lem_set_flow_cntrl(adapter, "flow_control",
463 "flow control setting",
464 &adapter->fc_setting, lem_fc_setting);
467 * Validate number of transmit and receive descriptors. It
468 * must not exceed hardware maximum, and must be multiple
469 * of E1000_DBA_ALIGN.
471 if (((lem_txd * sizeof(struct e1000_tx_desc)) % EM_DBA_ALIGN) != 0 ||
472 (adapter->hw.mac.type >= e1000_82544 && lem_txd > EM_MAX_TXD) ||
473 (adapter->hw.mac.type < e1000_82544 && lem_txd > EM_MAX_TXD_82543) ||
474 (lem_txd < EM_MIN_TXD)) {
475 device_printf(dev, "Using %d TX descriptors instead of %d!\n",
476 EM_DEFAULT_TXD, lem_txd);
477 adapter->num_tx_desc = EM_DEFAULT_TXD;
479 adapter->num_tx_desc = lem_txd;
480 if (((lem_rxd * sizeof(struct e1000_rx_desc)) % EM_DBA_ALIGN) != 0 ||
481 (adapter->hw.mac.type >= e1000_82544 && lem_rxd > EM_MAX_RXD) ||
482 (adapter->hw.mac.type < e1000_82544 && lem_rxd > EM_MAX_RXD_82543) ||
483 (lem_rxd < EM_MIN_RXD)) {
484 device_printf(dev, "Using %d RX descriptors instead of %d!\n",
485 EM_DEFAULT_RXD, lem_rxd);
486 adapter->num_rx_desc = EM_DEFAULT_RXD;
488 adapter->num_rx_desc = lem_rxd;
490 adapter->hw.mac.autoneg = DO_AUTO_NEG;
491 adapter->hw.phy.autoneg_wait_to_complete = FALSE;
492 adapter->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
493 adapter->rx_buffer_len = 2048;
495 e1000_init_script_state_82541(&adapter->hw, TRUE);
496 e1000_set_tbi_compatibility_82543(&adapter->hw, TRUE);
499 if (adapter->hw.phy.media_type == e1000_media_type_copper) {
500 adapter->hw.phy.mdix = AUTO_ALL_MODES;
501 adapter->hw.phy.disable_polarity_correction = FALSE;
502 adapter->hw.phy.ms_type = EM_MASTER_SLAVE;
506 * Set the frame limits assuming
507 * standard ethernet sized frames.
509 adapter->max_frame_size = ETHERMTU + ETHER_HDR_LEN + ETHERNET_FCS_SIZE;
510 adapter->min_frame_size = ETH_ZLEN + ETHERNET_FCS_SIZE;
513 * This controls when hardware reports transmit completion
516 adapter->hw.mac.report_tx_early = 1;
518 tsize = roundup2(adapter->num_tx_desc * sizeof(struct e1000_tx_desc),
521 /* Allocate Transmit Descriptor ring */
522 if (lem_dma_malloc(adapter, tsize, &adapter->txdma, BUS_DMA_NOWAIT)) {
523 device_printf(dev, "Unable to allocate tx_desc memory\n");
527 adapter->tx_desc_base =
528 (struct e1000_tx_desc *)adapter->txdma.dma_vaddr;
530 rsize = roundup2(adapter->num_rx_desc * sizeof(struct e1000_rx_desc),
533 /* Allocate Receive Descriptor ring */
534 if (lem_dma_malloc(adapter, rsize, &adapter->rxdma, BUS_DMA_NOWAIT)) {
535 device_printf(dev, "Unable to allocate rx_desc memory\n");
539 adapter->rx_desc_base =
540 (struct e1000_rx_desc *)adapter->rxdma.dma_vaddr;
542 /* Allocate multicast array memory. */
543 adapter->mta = malloc(sizeof(u8) * ETH_ADDR_LEN *
544 MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT);
545 if (adapter->mta == NULL) {
546 device_printf(dev, "Can not allocate multicast setup array\n");
552 ** Start from a known state, this is
553 ** important in reading the nvm and
556 e1000_reset_hw(&adapter->hw);
558 /* Make sure we have a good EEPROM before we read from it */
559 if (e1000_validate_nvm_checksum(&adapter->hw) < 0) {
561 ** Some PCI-E parts fail the first check due to
562 ** the link being in sleep state, call it again,
563 ** if it fails a second time its a real issue.
565 if (e1000_validate_nvm_checksum(&adapter->hw) < 0) {
567 "The EEPROM Checksum Is Not Valid\n");
573 /* Copy the permanent MAC address out of the EEPROM */
574 if (e1000_read_mac_addr(&adapter->hw) < 0) {
575 device_printf(dev, "EEPROM read error while reading MAC"
581 if (!lem_is_valid_ether_addr(adapter->hw.mac.addr)) {
582 device_printf(dev, "Invalid MAC address\n");
587 /* Initialize the hardware */
588 if (lem_hardware_init(adapter)) {
589 device_printf(dev, "Unable to initialize the hardware\n");
594 /* Allocate transmit descriptors and buffers */
595 if (lem_allocate_transmit_structures(adapter)) {
596 device_printf(dev, "Could not setup transmit structures\n");
601 /* Allocate receive descriptors and buffers */
602 if (lem_allocate_receive_structures(adapter)) {
603 device_printf(dev, "Could not setup receive structures\n");
609 ** Do interrupt configuration
611 error = lem_allocate_irq(adapter);
616 * Get Wake-on-Lan and Management info for later use
620 /* Setup OS specific network interface */
621 if (lem_setup_interface(dev, adapter) != 0)
624 /* Initialize statistics */
625 lem_update_stats_counters(adapter);
627 adapter->hw.mac.get_link_status = 1;
628 lem_update_link_status(adapter);
630 /* Indicate SOL/IDER usage */
631 if (e1000_check_reset_block(&adapter->hw))
633 "PHY reset is blocked due to SOL/IDER session.\n");
635 /* Do we need workaround for 82544 PCI-X adapter? */
636 if (adapter->hw.bus.type == e1000_bus_type_pcix &&
637 adapter->hw.mac.type == e1000_82544)
638 adapter->pcix_82544 = TRUE;
640 adapter->pcix_82544 = FALSE;
642 /* Register for VLAN events */
643 adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
644 lem_register_vlan, adapter, EVENTHANDLER_PRI_FIRST);
645 adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
646 lem_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
648 lem_add_hw_stats(adapter);
650 /* Non-AMT based hardware can now take control from firmware */
651 if (adapter->has_manage && !adapter->has_amt)
652 lem_get_hw_control(adapter);
654 /* Tell the stack that the interface is not active */
655 adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
657 adapter->led_dev = led_create(lem_led_func, adapter,
658 device_get_nameunit(dev));
661 lem_netmap_attach(adapter);
662 #endif /* DEV_NETMAP */
663 INIT_DEBUGOUT("lem_attach: end");
668 lem_free_transmit_structures(adapter);
671 lem_release_hw_control(adapter);
672 lem_dma_free(adapter, &adapter->rxdma);
674 lem_dma_free(adapter, &adapter->txdma);
677 if (adapter->ifp != NULL)
678 if_free(adapter->ifp);
679 lem_free_pci_resources(adapter);
680 free(adapter->mta, M_DEVBUF);
681 EM_TX_LOCK_DESTROY(adapter);
682 EM_RX_LOCK_DESTROY(adapter);
683 EM_CORE_LOCK_DESTROY(adapter);
688 /*********************************************************************
689 * Device removal routine
691 * The detach entry point is called when the driver is being removed.
692 * This routine stops the adapter and deallocates all the resources
693 * that were allocated for driver operation.
695 * return 0 on success, positive on failure
696 *********************************************************************/
699 lem_detach(device_t dev)
701 struct adapter *adapter = device_get_softc(dev);
702 struct ifnet *ifp = adapter->ifp;
704 INIT_DEBUGOUT("em_detach: begin");
706 /* Make sure VLANS are not using driver */
707 if (adapter->ifp->if_vlantrunk != NULL) {
708 device_printf(dev,"Vlan in use, detach first\n");
712 #ifdef DEVICE_POLLING
713 if (ifp->if_capenable & IFCAP_POLLING)
714 ether_poll_deregister(ifp);
717 if (adapter->led_dev != NULL)
718 led_destroy(adapter->led_dev);
720 EM_CORE_LOCK(adapter);
722 adapter->in_detach = 1;
724 e1000_phy_hw_reset(&adapter->hw);
726 lem_release_manageability(adapter);
728 EM_TX_UNLOCK(adapter);
729 EM_CORE_UNLOCK(adapter);
731 /* Unregister VLAN events */
732 if (adapter->vlan_attach != NULL)
733 EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach);
734 if (adapter->vlan_detach != NULL)
735 EVENTHANDLER_DEREGISTER(vlan_unconfig, adapter->vlan_detach);
737 ether_ifdetach(adapter->ifp);
738 callout_drain(&adapter->timer);
739 callout_drain(&adapter->tx_fifo_timer);
743 #endif /* DEV_NETMAP */
744 lem_free_pci_resources(adapter);
745 bus_generic_detach(dev);
748 lem_free_transmit_structures(adapter);
749 lem_free_receive_structures(adapter);
751 /* Free Transmit Descriptor ring */
752 if (adapter->tx_desc_base) {
753 lem_dma_free(adapter, &adapter->txdma);
754 adapter->tx_desc_base = NULL;
757 /* Free Receive Descriptor ring */
758 if (adapter->rx_desc_base) {
759 lem_dma_free(adapter, &adapter->rxdma);
760 adapter->rx_desc_base = NULL;
763 lem_release_hw_control(adapter);
764 free(adapter->mta, M_DEVBUF);
765 EM_TX_LOCK_DESTROY(adapter);
766 EM_RX_LOCK_DESTROY(adapter);
767 EM_CORE_LOCK_DESTROY(adapter);
772 /*********************************************************************
774 * Shutdown entry point
776 **********************************************************************/
779 lem_shutdown(device_t dev)
781 return lem_suspend(dev);
785 * Suspend/resume device methods.
788 lem_suspend(device_t dev)
790 struct adapter *adapter = device_get_softc(dev);
792 EM_CORE_LOCK(adapter);
794 lem_release_manageability(adapter);
795 lem_release_hw_control(adapter);
796 lem_enable_wakeup(dev);
798 EM_CORE_UNLOCK(adapter);
800 return bus_generic_suspend(dev);
804 lem_resume(device_t dev)
806 struct adapter *adapter = device_get_softc(dev);
807 struct ifnet *ifp = adapter->ifp;
809 EM_CORE_LOCK(adapter);
810 lem_init_locked(adapter);
811 lem_init_manageability(adapter);
812 EM_CORE_UNLOCK(adapter);
815 return bus_generic_resume(dev);
820 lem_start_locked(struct ifnet *ifp)
822 struct adapter *adapter = ifp->if_softc;
825 EM_TX_LOCK_ASSERT(adapter);
827 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) !=
830 if (!adapter->link_active)
834 * Force a cleanup if number of TX descriptors
835 * available hits the threshold
837 if (adapter->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
839 /* Now do we at least have a minimal? */
840 if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) {
841 adapter->no_tx_desc_avail1++;
846 while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
848 IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
852 * Encapsulation can modify our pointer, and or make it
853 * NULL on failure. In that event, we can't requeue.
855 if (lem_xmit(adapter, &m_head)) {
858 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
859 IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
863 /* Send a copy of the frame to the BPF listener */
864 ETHER_BPF_MTAP(ifp, m_head);
866 /* Set timeout in case hardware has problems transmitting. */
867 adapter->watchdog_check = TRUE;
868 adapter->watchdog_time = ticks;
870 if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD)
871 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
877 lem_start(struct ifnet *ifp)
879 struct adapter *adapter = ifp->if_softc;
882 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
883 lem_start_locked(ifp);
884 EM_TX_UNLOCK(adapter);
887 /*********************************************************************
890 * em_ioctl is called when the user wants to configure the
893 * return 0 on success, positive on failure
894 **********************************************************************/
897 lem_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
899 struct adapter *adapter = ifp->if_softc;
900 struct ifreq *ifr = (struct ifreq *)data;
901 #if defined(INET) || defined(INET6)
902 struct ifaddr *ifa = (struct ifaddr *)data;
904 bool avoid_reset = FALSE;
907 if (adapter->in_detach)
913 if (ifa->ifa_addr->sa_family == AF_INET)
917 if (ifa->ifa_addr->sa_family == AF_INET6)
921 ** Calling init results in link renegotiation,
922 ** so we avoid doing it when possible.
925 ifp->if_flags |= IFF_UP;
926 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
929 if (!(ifp->if_flags & IFF_NOARP))
930 arp_ifinit(ifp, ifa);
933 error = ether_ioctl(ifp, command, data);
939 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
941 EM_CORE_LOCK(adapter);
942 switch (adapter->hw.mac.type) {
944 max_frame_size = ETHER_MAX_LEN;
947 max_frame_size = MAX_JUMBO_FRAME_SIZE;
949 if (ifr->ifr_mtu > max_frame_size - ETHER_HDR_LEN -
951 EM_CORE_UNLOCK(adapter);
956 ifp->if_mtu = ifr->ifr_mtu;
957 adapter->max_frame_size =
958 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
959 lem_init_locked(adapter);
960 EM_CORE_UNLOCK(adapter);
964 IOCTL_DEBUGOUT("ioctl rcv'd:\
965 SIOCSIFFLAGS (Set Interface Flags)");
966 EM_CORE_LOCK(adapter);
967 if (ifp->if_flags & IFF_UP) {
968 if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) {
969 if ((ifp->if_flags ^ adapter->if_flags) &
970 (IFF_PROMISC | IFF_ALLMULTI)) {
971 lem_disable_promisc(adapter);
972 lem_set_promisc(adapter);
975 lem_init_locked(adapter);
977 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
980 EM_TX_UNLOCK(adapter);
982 adapter->if_flags = ifp->if_flags;
983 EM_CORE_UNLOCK(adapter);
987 IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI");
988 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
989 EM_CORE_LOCK(adapter);
990 lem_disable_intr(adapter);
991 lem_set_multi(adapter);
992 if (adapter->hw.mac.type == e1000_82542 &&
993 adapter->hw.revision_id == E1000_REVISION_2) {
994 lem_initialize_receive_unit(adapter);
996 #ifdef DEVICE_POLLING
997 if (!(ifp->if_capenable & IFCAP_POLLING))
999 lem_enable_intr(adapter);
1000 EM_CORE_UNLOCK(adapter);
1004 /* Check SOL/IDER usage */
1005 EM_CORE_LOCK(adapter);
1006 if (e1000_check_reset_block(&adapter->hw)) {
1007 EM_CORE_UNLOCK(adapter);
1008 device_printf(adapter->dev, "Media change is"
1009 " blocked due to SOL/IDER session.\n");
1012 EM_CORE_UNLOCK(adapter);
1014 IOCTL_DEBUGOUT("ioctl rcv'd: \
1015 SIOCxIFMEDIA (Get/Set Interface Media)");
1016 error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
1022 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)");
1024 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1025 #ifdef DEVICE_POLLING
1026 if (mask & IFCAP_POLLING) {
1027 if (ifr->ifr_reqcap & IFCAP_POLLING) {
1028 error = ether_poll_register(lem_poll, ifp);
1031 EM_CORE_LOCK(adapter);
1032 lem_disable_intr(adapter);
1033 ifp->if_capenable |= IFCAP_POLLING;
1034 EM_CORE_UNLOCK(adapter);
1036 error = ether_poll_deregister(ifp);
1037 /* Enable interrupt even in error case */
1038 EM_CORE_LOCK(adapter);
1039 lem_enable_intr(adapter);
1040 ifp->if_capenable &= ~IFCAP_POLLING;
1041 EM_CORE_UNLOCK(adapter);
1045 if (mask & IFCAP_HWCSUM) {
1046 ifp->if_capenable ^= IFCAP_HWCSUM;
1049 if (mask & IFCAP_VLAN_HWTAGGING) {
1050 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1053 if ((mask & IFCAP_WOL) &&
1054 (ifp->if_capabilities & IFCAP_WOL) != 0) {
1055 if (mask & IFCAP_WOL_MCAST)
1056 ifp->if_capenable ^= IFCAP_WOL_MCAST;
1057 if (mask & IFCAP_WOL_MAGIC)
1058 ifp->if_capenable ^= IFCAP_WOL_MAGIC;
1060 if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING))
1062 VLAN_CAPABILITIES(ifp);
1067 error = ether_ioctl(ifp, command, data);
1075 /*********************************************************************
1078 * This routine is used in two ways. It is used by the stack as
1079 * init entry point in network interface structure. It is also used
1080 * by the driver as a hw/sw initialization routine to get to a
1083 * return 0 on success, positive on failure
1084 **********************************************************************/
1087 lem_init_locked(struct adapter *adapter)
1089 struct ifnet *ifp = adapter->ifp;
1090 device_t dev = adapter->dev;
1093 INIT_DEBUGOUT("lem_init: begin");
1095 EM_CORE_LOCK_ASSERT(adapter);
1097 EM_TX_LOCK(adapter);
1099 EM_TX_UNLOCK(adapter);
1102 * Packet Buffer Allocation (PBA)
1103 * Writing PBA sets the receive portion of the buffer
1104 * the remainder is used for the transmit buffer.
1106 * Devices before the 82547 had a Packet Buffer of 64K.
1107 * Default allocation: PBA=48K for Rx, leaving 16K for Tx.
1108 * After the 82547 the buffer was reduced to 40K.
1109 * Default allocation: PBA=30K for Rx, leaving 10K for Tx.
1110 * Note: default does not leave enough room for Jumbo Frame >10k.
1112 switch (adapter->hw.mac.type) {
1114 case e1000_82547_rev_2: /* 82547: Total Packet Buffer is 40K */
1115 if (adapter->max_frame_size > 8192)
1116 pba = E1000_PBA_22K; /* 22K for Rx, 18K for Tx */
1118 pba = E1000_PBA_30K; /* 30K for Rx, 10K for Tx */
1119 adapter->tx_fifo_head = 0;
1120 adapter->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT;
1121 adapter->tx_fifo_size =
1122 (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT;
1125 /* Devices before 82547 had a Packet Buffer of 64K. */
1126 if (adapter->max_frame_size > 8192)
1127 pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */
1129 pba = E1000_PBA_48K; /* 48K for Rx, 16K for Tx */
1132 INIT_DEBUGOUT1("lem_init: pba=%dK",pba);
1133 E1000_WRITE_REG(&adapter->hw, E1000_PBA, pba);
1135 /* Get the latest mac address, User can use a LAA */
1136 bcopy(IF_LLADDR(adapter->ifp), adapter->hw.mac.addr,
1139 /* Put the address into the Receive Address Array */
1140 e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0);
1142 /* Initialize the hardware */
1143 if (lem_hardware_init(adapter)) {
1144 device_printf(dev, "Unable to initialize the hardware\n");
1147 lem_update_link_status(adapter);
1149 /* Setup VLAN support, basic and offload if available */
1150 E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN);
1152 /* Set hardware offload abilities */
1153 ifp->if_hwassist = 0;
1154 if (adapter->hw.mac.type >= e1000_82543) {
1155 if (ifp->if_capenable & IFCAP_TXCSUM)
1156 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
1159 /* Configure for OS presence */
1160 lem_init_manageability(adapter);
1162 /* Prepare transmit descriptors and buffers */
1163 lem_setup_transmit_structures(adapter);
1164 lem_initialize_transmit_unit(adapter);
1166 /* Setup Multicast table */
1167 lem_set_multi(adapter);
1169 /* Prepare receive descriptors and buffers */
1170 if (lem_setup_receive_structures(adapter)) {
1171 device_printf(dev, "Could not setup receive structures\n");
1172 EM_TX_LOCK(adapter);
1174 EM_TX_UNLOCK(adapter);
1177 lem_initialize_receive_unit(adapter);
1179 /* Use real VLAN Filter support? */
1180 if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) {
1181 if (ifp->if_capenable & IFCAP_VLAN_HWFILTER)
1182 /* Use real VLAN Filter support */
1183 lem_setup_vlan_hw_support(adapter);
1186 ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL);
1187 ctrl |= E1000_CTRL_VME;
1188 E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
1192 /* Don't lose promiscuous settings */
1193 lem_set_promisc(adapter);
1195 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1196 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1198 callout_reset(&adapter->timer, hz, lem_local_timer, adapter);
1199 e1000_clear_hw_cntrs_base_generic(&adapter->hw);
1201 #ifdef DEVICE_POLLING
1203 * Only enable interrupts if we are not polling, make sure
1204 * they are off otherwise.
1206 if (ifp->if_capenable & IFCAP_POLLING)
1207 lem_disable_intr(adapter);
1209 #endif /* DEVICE_POLLING */
1210 lem_enable_intr(adapter);
1212 /* AMT based hardware can now take control from firmware */
1213 if (adapter->has_manage && adapter->has_amt)
1214 lem_get_hw_control(adapter);
1220 struct adapter *adapter = arg;
1222 EM_CORE_LOCK(adapter);
1223 lem_init_locked(adapter);
1224 EM_CORE_UNLOCK(adapter);
1228 #ifdef DEVICE_POLLING
1229 /*********************************************************************
1231 * Legacy polling routine
1233 *********************************************************************/
1235 lem_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
1237 struct adapter *adapter = ifp->if_softc;
1238 u32 reg_icr, rx_done = 0;
1240 EM_CORE_LOCK(adapter);
1241 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1242 EM_CORE_UNLOCK(adapter);
1246 if (cmd == POLL_AND_CHECK_STATUS) {
1247 reg_icr = E1000_READ_REG(&adapter->hw, E1000_ICR);
1248 if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
1249 callout_stop(&adapter->timer);
1250 adapter->hw.mac.get_link_status = 1;
1251 lem_update_link_status(adapter);
1252 callout_reset(&adapter->timer, hz,
1253 lem_local_timer, adapter);
1256 EM_CORE_UNLOCK(adapter);
1258 lem_rxeof(adapter, count, &rx_done);
1260 EM_TX_LOCK(adapter);
1262 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1263 lem_start_locked(ifp);
1264 EM_TX_UNLOCK(adapter);
1267 #endif /* DEVICE_POLLING */
1269 /*********************************************************************
1271 * Legacy Interrupt Service routine
1273 *********************************************************************/
1277 struct adapter *adapter = arg;
1278 struct ifnet *ifp = adapter->ifp;
1282 if ((ifp->if_capenable & IFCAP_POLLING) ||
1283 ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0))
1286 EM_CORE_LOCK(adapter);
1287 reg_icr = E1000_READ_REG(&adapter->hw, E1000_ICR);
1288 if (reg_icr & E1000_ICR_RXO)
1289 adapter->rx_overruns++;
1291 if ((reg_icr == 0xffffffff) || (reg_icr == 0)) {
1292 EM_CORE_UNLOCK(adapter);
1296 if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
1297 callout_stop(&adapter->timer);
1298 adapter->hw.mac.get_link_status = 1;
1299 lem_update_link_status(adapter);
1300 /* Deal with TX cruft when link lost */
1301 lem_tx_purge(adapter);
1302 callout_reset(&adapter->timer, hz,
1303 lem_local_timer, adapter);
1304 EM_CORE_UNLOCK(adapter);
1308 EM_CORE_UNLOCK(adapter);
1309 lem_rxeof(adapter, -1, NULL);
1311 EM_TX_LOCK(adapter);
1313 if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
1314 !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1315 lem_start_locked(ifp);
1316 EM_TX_UNLOCK(adapter);
1322 lem_handle_link(void *context, int pending)
1324 struct adapter *adapter = context;
1325 struct ifnet *ifp = adapter->ifp;
1327 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1330 EM_CORE_LOCK(adapter);
1331 callout_stop(&adapter->timer);
1332 lem_update_link_status(adapter);
1333 /* Deal with TX cruft when link lost */
1334 lem_tx_purge(adapter);
1335 callout_reset(&adapter->timer, hz, lem_local_timer, adapter);
1336 EM_CORE_UNLOCK(adapter);
1340 /* Combined RX/TX handler, used by Legacy and MSI */
1342 lem_handle_rxtx(void *context, int pending)
1344 struct adapter *adapter = context;
1345 struct ifnet *ifp = adapter->ifp;
1348 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1349 bool more = lem_rxeof(adapter, adapter->rx_process_limit, NULL);
1350 EM_TX_LOCK(adapter);
1352 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1353 lem_start_locked(ifp);
1354 EM_TX_UNLOCK(adapter);
1356 taskqueue_enqueue(adapter->tq, &adapter->rxtx_task);
1361 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1362 lem_enable_intr(adapter);
1365 /*********************************************************************
1367 * Fast Legacy/MSI Combined Interrupt Service routine
1369 *********************************************************************/
1371 lem_irq_fast(void *arg)
1373 struct adapter *adapter = arg;
1379 reg_icr = E1000_READ_REG(&adapter->hw, E1000_ICR);
1382 if (reg_icr == 0xffffffff)
1383 return FILTER_STRAY;
1385 /* Definitely not our interrupt. */
1387 return FILTER_STRAY;
1390 * Mask interrupts until the taskqueue is finished running. This is
1391 * cheap, just assume that it is needed. This also works around the
1392 * MSI message reordering errata on certain systems.
1394 lem_disable_intr(adapter);
1395 taskqueue_enqueue(adapter->tq, &adapter->rxtx_task);
1397 /* Link status change */
1398 if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
1399 adapter->hw.mac.get_link_status = 1;
1400 taskqueue_enqueue(taskqueue_fast, &adapter->link_task);
1403 if (reg_icr & E1000_ICR_RXO)
1404 adapter->rx_overruns++;
1405 return FILTER_HANDLED;
1409 /*********************************************************************
1411 * Media Ioctl callback
1413 * This routine is called whenever the user queries the status of
1414 * the interface using ifconfig.
1416 **********************************************************************/
1418 lem_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1420 struct adapter *adapter = ifp->if_softc;
1421 u_char fiber_type = IFM_1000_SX;
1423 INIT_DEBUGOUT("lem_media_status: begin");
1425 EM_CORE_LOCK(adapter);
1426 lem_update_link_status(adapter);
1428 ifmr->ifm_status = IFM_AVALID;
1429 ifmr->ifm_active = IFM_ETHER;
1431 if (!adapter->link_active) {
1432 EM_CORE_UNLOCK(adapter);
1436 ifmr->ifm_status |= IFM_ACTIVE;
1438 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) ||
1439 (adapter->hw.phy.media_type == e1000_media_type_internal_serdes)) {
1440 if (adapter->hw.mac.type == e1000_82545)
1441 fiber_type = IFM_1000_LX;
1442 ifmr->ifm_active |= fiber_type | IFM_FDX;
1444 switch (adapter->link_speed) {
1446 ifmr->ifm_active |= IFM_10_T;
1449 ifmr->ifm_active |= IFM_100_TX;
1452 ifmr->ifm_active |= IFM_1000_T;
1455 if (adapter->link_duplex == FULL_DUPLEX)
1456 ifmr->ifm_active |= IFM_FDX;
1458 ifmr->ifm_active |= IFM_HDX;
1460 EM_CORE_UNLOCK(adapter);
1463 /*********************************************************************
1465 * Media Ioctl callback
1467 * This routine is called when the user changes speed/duplex using
1468 * media/mediopt option with ifconfig.
1470 **********************************************************************/
1472 lem_media_change(struct ifnet *ifp)
1474 struct adapter *adapter = ifp->if_softc;
1475 struct ifmedia *ifm = &adapter->media;
1477 INIT_DEBUGOUT("lem_media_change: begin");
1479 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1482 EM_CORE_LOCK(adapter);
1483 switch (IFM_SUBTYPE(ifm->ifm_media)) {
1485 adapter->hw.mac.autoneg = DO_AUTO_NEG;
1486 adapter->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
1491 adapter->hw.mac.autoneg = DO_AUTO_NEG;
1492 adapter->hw.phy.autoneg_advertised = ADVERTISE_1000_FULL;
1495 adapter->hw.mac.autoneg = FALSE;
1496 adapter->hw.phy.autoneg_advertised = 0;
1497 if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1498 adapter->hw.mac.forced_speed_duplex = ADVERTISE_100_FULL;
1500 adapter->hw.mac.forced_speed_duplex = ADVERTISE_100_HALF;
1503 adapter->hw.mac.autoneg = FALSE;
1504 adapter->hw.phy.autoneg_advertised = 0;
1505 if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1506 adapter->hw.mac.forced_speed_duplex = ADVERTISE_10_FULL;
1508 adapter->hw.mac.forced_speed_duplex = ADVERTISE_10_HALF;
1511 device_printf(adapter->dev, "Unsupported media type\n");
1514 lem_init_locked(adapter);
1515 EM_CORE_UNLOCK(adapter);
1520 /*********************************************************************
1522 * This routine maps the mbufs to tx descriptors.
1524 * return 0 on success, positive on failure
1525 **********************************************************************/
1528 lem_xmit(struct adapter *adapter, struct mbuf **m_headp)
1530 bus_dma_segment_t segs[EM_MAX_SCATTER];
1532 struct em_buffer *tx_buffer, *tx_buffer_mapped;
1533 struct e1000_tx_desc *ctxd = NULL;
1534 struct mbuf *m_head;
1535 u32 txd_upper, txd_lower, txd_used, txd_saved;
1536 int error, nsegs, i, j, first, last = 0;
1539 txd_upper = txd_lower = txd_used = txd_saved = 0;
1542 ** When doing checksum offload, it is critical to
1543 ** make sure the first mbuf has more than header,
1544 ** because that routine expects data to be present.
1546 if ((m_head->m_pkthdr.csum_flags & CSUM_OFFLOAD) &&
1547 (m_head->m_len < ETHER_HDR_LEN + sizeof(struct ip))) {
1548 m_head = m_pullup(m_head, ETHER_HDR_LEN + sizeof(struct ip));
1555 * Map the packet for DMA
1557 * Capture the first descriptor index,
1558 * this descriptor will have the index
1559 * of the EOP which is the only one that
1560 * now gets a DONE bit writeback.
1562 first = adapter->next_avail_tx_desc;
1563 tx_buffer = &adapter->tx_buffer_area[first];
1564 tx_buffer_mapped = tx_buffer;
1565 map = tx_buffer->map;
1567 error = bus_dmamap_load_mbuf_sg(adapter->txtag, map,
1568 *m_headp, segs, &nsegs, BUS_DMA_NOWAIT);
1571 * There are two types of errors we can (try) to handle:
1572 * - EFBIG means the mbuf chain was too long and bus_dma ran
1573 * out of segments. Defragment the mbuf chain and try again.
1574 * - ENOMEM means bus_dma could not obtain enough bounce buffers
1575 * at this point in time. Defer sending and try again later.
1576 * All other errors, in particular EINVAL, are fatal and prevent the
1577 * mbuf chain from ever going through. Drop it and report error.
1579 if (error == EFBIG) {
1582 m = m_defrag(*m_headp, M_NOWAIT);
1584 adapter->mbuf_alloc_failed++;
1592 error = bus_dmamap_load_mbuf_sg(adapter->txtag, map,
1593 *m_headp, segs, &nsegs, BUS_DMA_NOWAIT);
1596 adapter->no_tx_dma_setup++;
1601 } else if (error != 0) {
1602 adapter->no_tx_dma_setup++;
1606 if (nsegs > (adapter->num_tx_desc_avail - 2)) {
1607 adapter->no_tx_desc_avail2++;
1608 bus_dmamap_unload(adapter->txtag, map);
1613 /* Do hardware assists */
1614 if (m_head->m_pkthdr.csum_flags & CSUM_OFFLOAD)
1615 lem_transmit_checksum_setup(adapter, m_head,
1616 &txd_upper, &txd_lower);
1618 i = adapter->next_avail_tx_desc;
1619 if (adapter->pcix_82544)
1622 /* Set up our transmit descriptors */
1623 for (j = 0; j < nsegs; j++) {
1625 bus_addr_t seg_addr;
1626 /* If adapter is 82544 and on PCIX bus */
1627 if(adapter->pcix_82544) {
1628 DESC_ARRAY desc_array;
1629 u32 array_elements, counter;
1631 * Check the Address and Length combination and
1632 * split the data accordingly
1634 array_elements = lem_fill_descriptors(segs[j].ds_addr,
1635 segs[j].ds_len, &desc_array);
1636 for (counter = 0; counter < array_elements; counter++) {
1637 if (txd_used == adapter->num_tx_desc_avail) {
1638 adapter->next_avail_tx_desc = txd_saved;
1639 adapter->no_tx_desc_avail2++;
1640 bus_dmamap_unload(adapter->txtag, map);
1643 tx_buffer = &adapter->tx_buffer_area[i];
1644 ctxd = &adapter->tx_desc_base[i];
1645 ctxd->buffer_addr = htole64(
1646 desc_array.descriptor[counter].address);
1647 ctxd->lower.data = htole32(
1648 (adapter->txd_cmd | txd_lower | (u16)
1649 desc_array.descriptor[counter].length));
1651 htole32((txd_upper));
1653 if (++i == adapter->num_tx_desc)
1655 tx_buffer->m_head = NULL;
1656 tx_buffer->next_eop = -1;
1660 tx_buffer = &adapter->tx_buffer_area[i];
1661 ctxd = &adapter->tx_desc_base[i];
1662 seg_addr = segs[j].ds_addr;
1663 seg_len = segs[j].ds_len;
1664 ctxd->buffer_addr = htole64(seg_addr);
1665 ctxd->lower.data = htole32(
1666 adapter->txd_cmd | txd_lower | seg_len);
1670 if (++i == adapter->num_tx_desc)
1672 tx_buffer->m_head = NULL;
1673 tx_buffer->next_eop = -1;
1677 adapter->next_avail_tx_desc = i;
1679 if (adapter->pcix_82544)
1680 adapter->num_tx_desc_avail -= txd_used;
1682 adapter->num_tx_desc_avail -= nsegs;
1684 if (m_head->m_flags & M_VLANTAG) {
1685 /* Set the vlan id. */
1686 ctxd->upper.fields.special =
1687 htole16(m_head->m_pkthdr.ether_vtag);
1688 /* Tell hardware to add tag */
1689 ctxd->lower.data |= htole32(E1000_TXD_CMD_VLE);
1692 tx_buffer->m_head = m_head;
1693 tx_buffer_mapped->map = tx_buffer->map;
1694 tx_buffer->map = map;
1695 bus_dmamap_sync(adapter->txtag, map, BUS_DMASYNC_PREWRITE);
1698 * Last Descriptor of Packet
1699 * needs End Of Packet (EOP)
1700 * and Report Status (RS)
1703 htole32(E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS);
1705 * Keep track in the first buffer which
1706 * descriptor will be written back
1708 tx_buffer = &adapter->tx_buffer_area[first];
1709 tx_buffer->next_eop = last;
1710 adapter->watchdog_time = ticks;
1713 * Advance the Transmit Descriptor Tail (TDT), this tells the E1000
1714 * that this frame is available to transmit.
1716 bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
1717 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1718 if (adapter->hw.mac.type == e1000_82547 &&
1719 adapter->link_duplex == HALF_DUPLEX)
1720 lem_82547_move_tail(adapter);
1722 E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), i);
1723 if (adapter->hw.mac.type == e1000_82547)
1724 lem_82547_update_fifo_head(adapter,
1725 m_head->m_pkthdr.len);
1731 /*********************************************************************
1733 * 82547 workaround to avoid controller hang in half-duplex environment.
1734 * The workaround is to avoid queuing a large packet that would span
1735 * the internal Tx FIFO ring boundary. We need to reset the FIFO pointers
1736 * in this case. We do that only when FIFO is quiescent.
1738 **********************************************************************/
1740 lem_82547_move_tail(void *arg)
1742 struct adapter *adapter = arg;
1743 struct e1000_tx_desc *tx_desc;
1744 u16 hw_tdt, sw_tdt, length = 0;
1747 EM_TX_LOCK_ASSERT(adapter);
1749 hw_tdt = E1000_READ_REG(&adapter->hw, E1000_TDT(0));
1750 sw_tdt = adapter->next_avail_tx_desc;
1752 while (hw_tdt != sw_tdt) {
1753 tx_desc = &adapter->tx_desc_base[hw_tdt];
1754 length += tx_desc->lower.flags.length;
1755 eop = tx_desc->lower.data & E1000_TXD_CMD_EOP;
1756 if (++hw_tdt == adapter->num_tx_desc)
1760 if (lem_82547_fifo_workaround(adapter, length)) {
1761 adapter->tx_fifo_wrk_cnt++;
1762 callout_reset(&adapter->tx_fifo_timer, 1,
1763 lem_82547_move_tail, adapter);
1766 E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), hw_tdt);
1767 lem_82547_update_fifo_head(adapter, length);
1774 lem_82547_fifo_workaround(struct adapter *adapter, int len)
1776 int fifo_space, fifo_pkt_len;
1778 fifo_pkt_len = roundup2(len + EM_FIFO_HDR, EM_FIFO_HDR);
1780 if (adapter->link_duplex == HALF_DUPLEX) {
1781 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
1783 if (fifo_pkt_len >= (EM_82547_PKT_THRESH + fifo_space)) {
1784 if (lem_82547_tx_fifo_reset(adapter))
1795 lem_82547_update_fifo_head(struct adapter *adapter, int len)
1797 int fifo_pkt_len = roundup2(len + EM_FIFO_HDR, EM_FIFO_HDR);
1799 /* tx_fifo_head is always 16 byte aligned */
1800 adapter->tx_fifo_head += fifo_pkt_len;
1801 if (adapter->tx_fifo_head >= adapter->tx_fifo_size) {
1802 adapter->tx_fifo_head -= adapter->tx_fifo_size;
1808 lem_82547_tx_fifo_reset(struct adapter *adapter)
1812 if ((E1000_READ_REG(&adapter->hw, E1000_TDT(0)) ==
1813 E1000_READ_REG(&adapter->hw, E1000_TDH(0))) &&
1814 (E1000_READ_REG(&adapter->hw, E1000_TDFT) ==
1815 E1000_READ_REG(&adapter->hw, E1000_TDFH)) &&
1816 (E1000_READ_REG(&adapter->hw, E1000_TDFTS) ==
1817 E1000_READ_REG(&adapter->hw, E1000_TDFHS)) &&
1818 (E1000_READ_REG(&adapter->hw, E1000_TDFPC) == 0)) {
1819 /* Disable TX unit */
1820 tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL);
1821 E1000_WRITE_REG(&adapter->hw, E1000_TCTL,
1822 tctl & ~E1000_TCTL_EN);
1824 /* Reset FIFO pointers */
1825 E1000_WRITE_REG(&adapter->hw, E1000_TDFT,
1826 adapter->tx_head_addr);
1827 E1000_WRITE_REG(&adapter->hw, E1000_TDFH,
1828 adapter->tx_head_addr);
1829 E1000_WRITE_REG(&adapter->hw, E1000_TDFTS,
1830 adapter->tx_head_addr);
1831 E1000_WRITE_REG(&adapter->hw, E1000_TDFHS,
1832 adapter->tx_head_addr);
1834 /* Re-enable TX unit */
1835 E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl);
1836 E1000_WRITE_FLUSH(&adapter->hw);
1838 adapter->tx_fifo_head = 0;
1839 adapter->tx_fifo_reset_cnt++;
1849 lem_set_promisc(struct adapter *adapter)
1851 struct ifnet *ifp = adapter->ifp;
1854 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
1856 if (ifp->if_flags & IFF_PROMISC) {
1857 reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
1858 /* Turn this on if you want to see bad packets */
1860 reg_rctl |= E1000_RCTL_SBP;
1861 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
1862 } else if (ifp->if_flags & IFF_ALLMULTI) {
1863 reg_rctl |= E1000_RCTL_MPE;
1864 reg_rctl &= ~E1000_RCTL_UPE;
1865 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
1870 lem_disable_promisc(struct adapter *adapter)
1872 struct ifnet *ifp = adapter->ifp;
1876 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
1877 reg_rctl &= (~E1000_RCTL_UPE);
1878 if (ifp->if_flags & IFF_ALLMULTI)
1879 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
1881 struct ifmultiaddr *ifma;
1882 #if __FreeBSD_version < 800000
1885 if_maddr_rlock(ifp);
1887 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1888 if (ifma->ifma_addr->sa_family != AF_LINK)
1890 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
1894 #if __FreeBSD_version < 800000
1895 IF_ADDR_UNLOCK(ifp);
1897 if_maddr_runlock(ifp);
1900 /* Don't disable if in MAX groups */
1901 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
1902 reg_rctl &= (~E1000_RCTL_MPE);
1903 reg_rctl &= (~E1000_RCTL_SBP);
1904 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
1908 /*********************************************************************
1911 * This routine is called whenever multicast address list is updated.
1913 **********************************************************************/
1916 lem_set_multi(struct adapter *adapter)
1918 struct ifnet *ifp = adapter->ifp;
1919 struct ifmultiaddr *ifma;
1921 u8 *mta; /* Multicast array memory */
1924 IOCTL_DEBUGOUT("lem_set_multi: begin");
1927 bzero(mta, sizeof(u8) * ETH_ADDR_LEN * MAX_NUM_MULTICAST_ADDRESSES);
1929 if (adapter->hw.mac.type == e1000_82542 &&
1930 adapter->hw.revision_id == E1000_REVISION_2) {
1931 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
1932 if (adapter->hw.bus.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
1933 e1000_pci_clear_mwi(&adapter->hw);
1934 reg_rctl |= E1000_RCTL_RST;
1935 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
1939 #if __FreeBSD_version < 800000
1942 if_maddr_rlock(ifp);
1944 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1945 if (ifma->ifma_addr->sa_family != AF_LINK)
1948 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
1951 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
1952 &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN);
1955 #if __FreeBSD_version < 800000
1956 IF_ADDR_UNLOCK(ifp);
1958 if_maddr_runlock(ifp);
1960 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
1961 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
1962 reg_rctl |= E1000_RCTL_MPE;
1963 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
1965 e1000_update_mc_addr_list(&adapter->hw, mta, mcnt);
1967 if (adapter->hw.mac.type == e1000_82542 &&
1968 adapter->hw.revision_id == E1000_REVISION_2) {
1969 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
1970 reg_rctl &= ~E1000_RCTL_RST;
1971 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
1973 if (adapter->hw.bus.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
1974 e1000_pci_set_mwi(&adapter->hw);
1979 /*********************************************************************
1982 * This routine checks for link status and updates statistics.
1984 **********************************************************************/
1987 lem_local_timer(void *arg)
1989 struct adapter *adapter = arg;
1991 EM_CORE_LOCK_ASSERT(adapter);
1993 lem_update_link_status(adapter);
1994 lem_update_stats_counters(adapter);
1996 lem_smartspeed(adapter);
1999 * We check the watchdog: the time since
2000 * the last TX descriptor was cleaned.
2001 * This implies a functional TX engine.
2003 if ((adapter->watchdog_check == TRUE) &&
2004 (ticks - adapter->watchdog_time > EM_WATCHDOG))
2007 callout_reset(&adapter->timer, hz, lem_local_timer, adapter);
2010 device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
2011 adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2012 adapter->watchdog_events++;
2013 lem_init_locked(adapter);
2017 lem_update_link_status(struct adapter *adapter)
2019 struct e1000_hw *hw = &adapter->hw;
2020 struct ifnet *ifp = adapter->ifp;
2021 device_t dev = adapter->dev;
2024 /* Get the cached link value or read phy for real */
2025 switch (hw->phy.media_type) {
2026 case e1000_media_type_copper:
2027 if (hw->mac.get_link_status) {
2028 /* Do the work to read phy */
2029 e1000_check_for_link(hw);
2030 link_check = !hw->mac.get_link_status;
2031 if (link_check) /* ESB2 fix */
2032 e1000_cfg_on_link_up(hw);
2036 case e1000_media_type_fiber:
2037 e1000_check_for_link(hw);
2038 link_check = (E1000_READ_REG(hw, E1000_STATUS) &
2041 case e1000_media_type_internal_serdes:
2042 e1000_check_for_link(hw);
2043 link_check = adapter->hw.mac.serdes_has_link;
2046 case e1000_media_type_unknown:
2050 /* Now check for a transition */
2051 if (link_check && (adapter->link_active == 0)) {
2052 e1000_get_speed_and_duplex(hw, &adapter->link_speed,
2053 &adapter->link_duplex);
2055 device_printf(dev, "Link is up %d Mbps %s\n",
2056 adapter->link_speed,
2057 ((adapter->link_duplex == FULL_DUPLEX) ?
2058 "Full Duplex" : "Half Duplex"));
2059 adapter->link_active = 1;
2060 adapter->smartspeed = 0;
2061 ifp->if_baudrate = adapter->link_speed * 1000000;
2062 if_link_state_change(ifp, LINK_STATE_UP);
2063 } else if (!link_check && (adapter->link_active == 1)) {
2064 ifp->if_baudrate = adapter->link_speed = 0;
2065 adapter->link_duplex = 0;
2067 device_printf(dev, "Link is Down\n");
2068 adapter->link_active = 0;
2069 /* Link down, disable watchdog */
2070 adapter->watchdog_check = FALSE;
2071 if_link_state_change(ifp, LINK_STATE_DOWN);
2075 /*********************************************************************
2077 * This routine disables all traffic on the adapter by issuing a
2078 * global reset on the MAC and deallocates TX/RX buffers.
2080 * This routine should always be called with BOTH the CORE
2082 **********************************************************************/
2087 struct adapter *adapter = arg;
2088 struct ifnet *ifp = adapter->ifp;
2090 EM_CORE_LOCK_ASSERT(adapter);
2091 EM_TX_LOCK_ASSERT(adapter);
2093 INIT_DEBUGOUT("lem_stop: begin");
2095 lem_disable_intr(adapter);
2096 callout_stop(&adapter->timer);
2097 callout_stop(&adapter->tx_fifo_timer);
2099 /* Tell the stack that the interface is no longer active */
2100 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2102 e1000_reset_hw(&adapter->hw);
2103 if (adapter->hw.mac.type >= e1000_82544)
2104 E1000_WRITE_REG(&adapter->hw, E1000_WUC, 0);
2106 e1000_led_off(&adapter->hw);
2107 e1000_cleanup_led(&adapter->hw);
2111 /*********************************************************************
2113 * Determine hardware revision.
2115 **********************************************************************/
2117 lem_identify_hardware(struct adapter *adapter)
2119 device_t dev = adapter->dev;
2121 /* Make sure our PCI config space has the necessary stuff set */
2122 adapter->hw.bus.pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2);
2123 if (!((adapter->hw.bus.pci_cmd_word & PCIM_CMD_BUSMASTEREN) &&
2124 (adapter->hw.bus.pci_cmd_word & PCIM_CMD_MEMEN))) {
2125 device_printf(dev, "Memory Access and/or Bus Master bits "
2127 adapter->hw.bus.pci_cmd_word |=
2128 (PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN);
2129 pci_write_config(dev, PCIR_COMMAND,
2130 adapter->hw.bus.pci_cmd_word, 2);
2133 /* Save off the information about this board */
2134 adapter->hw.vendor_id = pci_get_vendor(dev);
2135 adapter->hw.device_id = pci_get_device(dev);
2136 adapter->hw.revision_id = pci_read_config(dev, PCIR_REVID, 1);
2137 adapter->hw.subsystem_vendor_id =
2138 pci_read_config(dev, PCIR_SUBVEND_0, 2);
2139 adapter->hw.subsystem_device_id =
2140 pci_read_config(dev, PCIR_SUBDEV_0, 2);
2142 /* Do Shared Code Init and Setup */
2143 if (e1000_set_mac_type(&adapter->hw)) {
2144 device_printf(dev, "Setup init failure\n");
2150 lem_allocate_pci_resources(struct adapter *adapter)
2152 device_t dev = adapter->dev;
2153 int val, rid, error = E1000_SUCCESS;
2156 adapter->memory = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
2158 if (adapter->memory == NULL) {
2159 device_printf(dev, "Unable to allocate bus resource: memory\n");
2162 adapter->osdep.mem_bus_space_tag =
2163 rman_get_bustag(adapter->memory);
2164 adapter->osdep.mem_bus_space_handle =
2165 rman_get_bushandle(adapter->memory);
2166 adapter->hw.hw_addr = (u8 *)&adapter->osdep.mem_bus_space_handle;
2168 /* Only older adapters use IO mapping */
2169 if (adapter->hw.mac.type > e1000_82543) {
2170 /* Figure our where our IO BAR is ? */
2171 for (rid = PCIR_BAR(0); rid < PCIR_CIS;) {
2172 val = pci_read_config(dev, rid, 4);
2173 if (EM_BAR_TYPE(val) == EM_BAR_TYPE_IO) {
2174 adapter->io_rid = rid;
2178 /* check for 64bit BAR */
2179 if (EM_BAR_MEM_TYPE(val) == EM_BAR_MEM_TYPE_64BIT)
2182 if (rid >= PCIR_CIS) {
2183 device_printf(dev, "Unable to locate IO BAR\n");
2186 adapter->ioport = bus_alloc_resource_any(dev,
2187 SYS_RES_IOPORT, &adapter->io_rid, RF_ACTIVE);
2188 if (adapter->ioport == NULL) {
2189 device_printf(dev, "Unable to allocate bus resource: "
2193 adapter->hw.io_base = 0;
2194 adapter->osdep.io_bus_space_tag =
2195 rman_get_bustag(adapter->ioport);
2196 adapter->osdep.io_bus_space_handle =
2197 rman_get_bushandle(adapter->ioport);
2200 adapter->hw.back = &adapter->osdep;
2205 /*********************************************************************
2207 * Setup the Legacy or MSI Interrupt handler
2209 **********************************************************************/
2211 lem_allocate_irq(struct adapter *adapter)
2213 device_t dev = adapter->dev;
2216 /* Manually turn off all interrupts */
2217 E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xffffffff);
2219 /* We allocate a single interrupt resource */
2220 adapter->res[0] = bus_alloc_resource_any(dev,
2221 SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
2222 if (adapter->res[0] == NULL) {
2223 device_printf(dev, "Unable to allocate bus resource: "
2228 /* Do Legacy setup? */
2229 if (lem_use_legacy_irq) {
2230 if ((error = bus_setup_intr(dev, adapter->res[0],
2231 INTR_TYPE_NET | INTR_MPSAFE, NULL, lem_intr, adapter,
2232 &adapter->tag[0])) != 0) {
2234 "Failed to register interrupt handler");
2241 * Use a Fast interrupt and the associated
2242 * deferred processing contexts.
2244 TASK_INIT(&adapter->rxtx_task, 0, lem_handle_rxtx, adapter);
2245 TASK_INIT(&adapter->link_task, 0, lem_handle_link, adapter);
2246 adapter->tq = taskqueue_create_fast("lem_taskq", M_NOWAIT,
2247 taskqueue_thread_enqueue, &adapter->tq);
2248 taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s taskq",
2249 device_get_nameunit(adapter->dev));
2250 if ((error = bus_setup_intr(dev, adapter->res[0],
2251 INTR_TYPE_NET, lem_irq_fast, NULL, adapter,
2252 &adapter->tag[0])) != 0) {
2253 device_printf(dev, "Failed to register fast interrupt "
2254 "handler: %d\n", error);
2255 taskqueue_free(adapter->tq);
2265 lem_free_pci_resources(struct adapter *adapter)
2267 device_t dev = adapter->dev;
2270 if (adapter->tag[0] != NULL) {
2271 bus_teardown_intr(dev, adapter->res[0],
2273 adapter->tag[0] = NULL;
2276 if (adapter->res[0] != NULL) {
2277 bus_release_resource(dev, SYS_RES_IRQ,
2278 0, adapter->res[0]);
2281 if (adapter->memory != NULL)
2282 bus_release_resource(dev, SYS_RES_MEMORY,
2283 PCIR_BAR(0), adapter->memory);
2285 if (adapter->ioport != NULL)
2286 bus_release_resource(dev, SYS_RES_IOPORT,
2287 adapter->io_rid, adapter->ioport);
2291 /*********************************************************************
2293 * Initialize the hardware to a configuration
2294 * as specified by the adapter structure.
2296 **********************************************************************/
2298 lem_hardware_init(struct adapter *adapter)
2300 device_t dev = adapter->dev;
2303 INIT_DEBUGOUT("lem_hardware_init: begin");
2305 /* Issue a global reset */
2306 e1000_reset_hw(&adapter->hw);
2308 /* When hardware is reset, fifo_head is also reset */
2309 adapter->tx_fifo_head = 0;
2312 * These parameters control the automatic generation (Tx) and
2313 * response (Rx) to Ethernet PAUSE frames.
2314 * - High water mark should allow for at least two frames to be
2315 * received after sending an XOFF.
2316 * - Low water mark works best when it is very near the high water mark.
2317 * This allows the receiver to restart by sending XON when it has
2318 * drained a bit. Here we use an arbitary value of 1500 which will
2319 * restart after one full frame is pulled from the buffer. There
2320 * could be several smaller frames in the buffer and if so they will
2321 * not trigger the XON until their total number reduces the buffer
2323 * - The pause time is fairly large at 1000 x 512ns = 512 usec.
2325 rx_buffer_size = ((E1000_READ_REG(&adapter->hw, E1000_PBA) &
2328 adapter->hw.fc.high_water = rx_buffer_size -
2329 roundup2(adapter->max_frame_size, 1024);
2330 adapter->hw.fc.low_water = adapter->hw.fc.high_water - 1500;
2332 adapter->hw.fc.pause_time = EM_FC_PAUSE_TIME;
2333 adapter->hw.fc.send_xon = TRUE;
2335 /* Set Flow control, use the tunable location if sane */
2336 if ((lem_fc_setting >= 0) && (lem_fc_setting < 4))
2337 adapter->hw.fc.requested_mode = lem_fc_setting;
2339 adapter->hw.fc.requested_mode = e1000_fc_none;
2341 if (e1000_init_hw(&adapter->hw) < 0) {
2342 device_printf(dev, "Hardware Initialization Failed\n");
2346 e1000_check_for_link(&adapter->hw);
2351 /*********************************************************************
2353 * Setup networking device structure and register an interface.
2355 **********************************************************************/
2357 lem_setup_interface(device_t dev, struct adapter *adapter)
2361 INIT_DEBUGOUT("lem_setup_interface: begin");
2363 ifp = adapter->ifp = if_alloc(IFT_ETHER);
2365 device_printf(dev, "can not allocate ifnet structure\n");
2368 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
2369 ifp->if_init = lem_init;
2370 ifp->if_softc = adapter;
2371 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2372 ifp->if_ioctl = lem_ioctl;
2373 ifp->if_start = lem_start;
2374 IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1);
2375 ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1;
2376 IFQ_SET_READY(&ifp->if_snd);
2378 ether_ifattach(ifp, adapter->hw.mac.addr);
2380 ifp->if_capabilities = ifp->if_capenable = 0;
2382 if (adapter->hw.mac.type >= e1000_82543) {
2383 ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM;
2384 ifp->if_capenable |= IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM;
2388 * Tell the upper layer(s) we support long frames.
2390 ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
2391 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
2392 ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
2395 ** Dont turn this on by default, if vlans are
2396 ** created on another pseudo device (eg. lagg)
2397 ** then vlan events are not passed thru, breaking
2398 ** operation, but with HW FILTER off it works. If
2399 ** using vlans directly on the em driver you can
2400 ** enable this and get full hardware tag filtering.
2402 ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
2404 #ifdef DEVICE_POLLING
2405 ifp->if_capabilities |= IFCAP_POLLING;
2408 /* Enable only WOL MAGIC by default */
2410 ifp->if_capabilities |= IFCAP_WOL;
2411 ifp->if_capenable |= IFCAP_WOL_MAGIC;
2415 * Specify the media types supported by this adapter and register
2416 * callbacks to update media and link information
2418 ifmedia_init(&adapter->media, IFM_IMASK,
2419 lem_media_change, lem_media_status);
2420 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) ||
2421 (adapter->hw.phy.media_type == e1000_media_type_internal_serdes)) {
2422 u_char fiber_type = IFM_1000_SX; /* default type */
2424 if (adapter->hw.mac.type == e1000_82545)
2425 fiber_type = IFM_1000_LX;
2426 ifmedia_add(&adapter->media, IFM_ETHER | fiber_type | IFM_FDX,
2428 ifmedia_add(&adapter->media, IFM_ETHER | fiber_type, 0, NULL);
2430 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
2431 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T | IFM_FDX,
2433 ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX,
2435 ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
2437 if (adapter->hw.phy.type != e1000_phy_ife) {
2438 ifmedia_add(&adapter->media,
2439 IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
2440 ifmedia_add(&adapter->media,
2441 IFM_ETHER | IFM_1000_T, 0, NULL);
2444 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2445 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
2450 /*********************************************************************
2452 * Workaround for SmartSpeed on 82541 and 82547 controllers
2454 **********************************************************************/
2456 lem_smartspeed(struct adapter *adapter)
2460 if (adapter->link_active || (adapter->hw.phy.type != e1000_phy_igp) ||
2461 adapter->hw.mac.autoneg == 0 ||
2462 (adapter->hw.phy.autoneg_advertised & ADVERTISE_1000_FULL) == 0)
2465 if (adapter->smartspeed == 0) {
2466 /* If Master/Slave config fault is asserted twice,
2467 * we assume back-to-back */
2468 e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_tmp);
2469 if (!(phy_tmp & SR_1000T_MS_CONFIG_FAULT))
2471 e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_tmp);
2472 if (phy_tmp & SR_1000T_MS_CONFIG_FAULT) {
2473 e1000_read_phy_reg(&adapter->hw,
2474 PHY_1000T_CTRL, &phy_tmp);
2475 if(phy_tmp & CR_1000T_MS_ENABLE) {
2476 phy_tmp &= ~CR_1000T_MS_ENABLE;
2477 e1000_write_phy_reg(&adapter->hw,
2478 PHY_1000T_CTRL, phy_tmp);
2479 adapter->smartspeed++;
2480 if(adapter->hw.mac.autoneg &&
2481 !e1000_copper_link_autoneg(&adapter->hw) &&
2482 !e1000_read_phy_reg(&adapter->hw,
2483 PHY_CONTROL, &phy_tmp)) {
2484 phy_tmp |= (MII_CR_AUTO_NEG_EN |
2485 MII_CR_RESTART_AUTO_NEG);
2486 e1000_write_phy_reg(&adapter->hw,
2487 PHY_CONTROL, phy_tmp);
2492 } else if(adapter->smartspeed == EM_SMARTSPEED_DOWNSHIFT) {
2493 /* If still no link, perhaps using 2/3 pair cable */
2494 e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_tmp);
2495 phy_tmp |= CR_1000T_MS_ENABLE;
2496 e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_tmp);
2497 if(adapter->hw.mac.autoneg &&
2498 !e1000_copper_link_autoneg(&adapter->hw) &&
2499 !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_tmp)) {
2500 phy_tmp |= (MII_CR_AUTO_NEG_EN |
2501 MII_CR_RESTART_AUTO_NEG);
2502 e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, phy_tmp);
2505 /* Restart process after EM_SMARTSPEED_MAX iterations */
2506 if(adapter->smartspeed++ == EM_SMARTSPEED_MAX)
2507 adapter->smartspeed = 0;
2512 * Manage DMA'able memory.
2515 lem_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2519 *(bus_addr_t *) arg = segs[0].ds_addr;
2523 lem_dma_malloc(struct adapter *adapter, bus_size_t size,
2524 struct em_dma_alloc *dma, int mapflags)
2528 error = bus_dma_tag_create(bus_get_dma_tag(adapter->dev), /* parent */
2529 EM_DBA_ALIGN, 0, /* alignment, bounds */
2530 BUS_SPACE_MAXADDR, /* lowaddr */
2531 BUS_SPACE_MAXADDR, /* highaddr */
2532 NULL, NULL, /* filter, filterarg */
2535 size, /* maxsegsize */
2537 NULL, /* lockfunc */
2541 device_printf(adapter->dev,
2542 "%s: bus_dma_tag_create failed: %d\n",
2547 error = bus_dmamem_alloc(dma->dma_tag, (void**) &dma->dma_vaddr,
2548 BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &dma->dma_map);
2550 device_printf(adapter->dev,
2551 "%s: bus_dmamem_alloc(%ju) failed: %d\n",
2552 __func__, (uintmax_t)size, error);
2557 error = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr,
2558 size, lem_dmamap_cb, &dma->dma_paddr, mapflags | BUS_DMA_NOWAIT);
2559 if (error || dma->dma_paddr == 0) {
2560 device_printf(adapter->dev,
2561 "%s: bus_dmamap_load failed: %d\n",
2569 bus_dmamap_unload(dma->dma_tag, dma->dma_map);
2571 bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
2572 bus_dma_tag_destroy(dma->dma_tag);
2574 dma->dma_map = NULL;
2575 dma->dma_tag = NULL;
2581 lem_dma_free(struct adapter *adapter, struct em_dma_alloc *dma)
2583 if (dma->dma_tag == NULL)
2585 if (dma->dma_map != NULL) {
2586 bus_dmamap_sync(dma->dma_tag, dma->dma_map,
2587 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2588 bus_dmamap_unload(dma->dma_tag, dma->dma_map);
2589 bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
2590 dma->dma_map = NULL;
2592 bus_dma_tag_destroy(dma->dma_tag);
2593 dma->dma_tag = NULL;
2597 /*********************************************************************
2599 * Allocate memory for tx_buffer structures. The tx_buffer stores all
2600 * the information needed to transmit a packet on the wire.
2602 **********************************************************************/
2604 lem_allocate_transmit_structures(struct adapter *adapter)
2606 device_t dev = adapter->dev;
2607 struct em_buffer *tx_buffer;
2611 * Create DMA tags for tx descriptors
2613 if ((error = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */
2614 1, 0, /* alignment, bounds */
2615 BUS_SPACE_MAXADDR, /* lowaddr */
2616 BUS_SPACE_MAXADDR, /* highaddr */
2617 NULL, NULL, /* filter, filterarg */
2618 MCLBYTES * EM_MAX_SCATTER, /* maxsize */
2619 EM_MAX_SCATTER, /* nsegments */
2620 MCLBYTES, /* maxsegsize */
2622 NULL, /* lockfunc */
2624 &adapter->txtag)) != 0) {
2625 device_printf(dev, "Unable to allocate TX DMA tag\n");
2629 adapter->tx_buffer_area = malloc(sizeof(struct em_buffer) *
2630 adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO);
2631 if (adapter->tx_buffer_area == NULL) {
2632 device_printf(dev, "Unable to allocate tx_buffer memory\n");
2637 /* Create the descriptor buffer dma maps */
2638 for (int i = 0; i < adapter->num_tx_desc; i++) {
2639 tx_buffer = &adapter->tx_buffer_area[i];
2640 error = bus_dmamap_create(adapter->txtag, 0, &tx_buffer->map);
2642 device_printf(dev, "Unable to create TX DMA map\n");
2645 tx_buffer->next_eop = -1;
2650 lem_free_transmit_structures(adapter);
2654 /*********************************************************************
2656 * (Re)Initialize transmit structures.
2658 **********************************************************************/
2660 lem_setup_transmit_structures(struct adapter *adapter)
2662 struct em_buffer *tx_buffer;
2664 /* we are already locked */
2665 struct netmap_adapter *na = NA(adapter->ifp);
2666 struct netmap_slot *slot = netmap_reset(na, NR_TX, 0, 0);
2667 #endif /* DEV_NETMAP */
2669 /* Clear the old ring contents */
2670 bzero(adapter->tx_desc_base,
2671 (sizeof(struct e1000_tx_desc)) * adapter->num_tx_desc);
2673 /* Free any existing TX buffers */
2674 for (int i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
2675 tx_buffer = &adapter->tx_buffer_area[i];
2676 bus_dmamap_sync(adapter->txtag, tx_buffer->map,
2677 BUS_DMASYNC_POSTWRITE);
2678 bus_dmamap_unload(adapter->txtag, tx_buffer->map);
2679 m_freem(tx_buffer->m_head);
2680 tx_buffer->m_head = NULL;
2683 /* the i-th NIC entry goes to slot si */
2684 int si = netmap_idx_n2k(&na->tx_rings[0], i);
2688 addr = PNMB(slot + si, &paddr);
2689 adapter->tx_desc_base[si].buffer_addr = htole64(paddr);
2690 /* reload the map for netmap mode */
2691 netmap_load_map(adapter->txtag, tx_buffer->map, addr);
2693 #endif /* DEV_NETMAP */
2694 tx_buffer->next_eop = -1;
2698 adapter->last_hw_offload = 0;
2699 adapter->next_avail_tx_desc = 0;
2700 adapter->next_tx_to_clean = 0;
2701 adapter->num_tx_desc_avail = adapter->num_tx_desc;
2703 bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
2704 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2709 /*********************************************************************
2711 * Enable transmit unit.
2713 **********************************************************************/
2715 lem_initialize_transmit_unit(struct adapter *adapter)
2720 INIT_DEBUGOUT("lem_initialize_transmit_unit: begin");
2721 /* Setup the Base and Length of the Tx Descriptor Ring */
2722 bus_addr = adapter->txdma.dma_paddr;
2723 E1000_WRITE_REG(&adapter->hw, E1000_TDLEN(0),
2724 adapter->num_tx_desc * sizeof(struct e1000_tx_desc));
2725 E1000_WRITE_REG(&adapter->hw, E1000_TDBAH(0),
2726 (u32)(bus_addr >> 32));
2727 E1000_WRITE_REG(&adapter->hw, E1000_TDBAL(0),
2729 /* Setup the HW Tx Head and Tail descriptor pointers */
2730 E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), 0);
2731 E1000_WRITE_REG(&adapter->hw, E1000_TDH(0), 0);
2733 HW_DEBUGOUT2("Base = %x, Length = %x\n",
2734 E1000_READ_REG(&adapter->hw, E1000_TDBAL(0)),
2735 E1000_READ_REG(&adapter->hw, E1000_TDLEN(0)));
2737 /* Set the default values for the Tx Inter Packet Gap timer */
2738 switch (adapter->hw.mac.type) {
2740 tipg = DEFAULT_82542_TIPG_IPGT;
2741 tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
2742 tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
2745 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) ||
2746 (adapter->hw.phy.media_type ==
2747 e1000_media_type_internal_serdes))
2748 tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
2750 tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
2751 tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
2752 tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
2755 E1000_WRITE_REG(&adapter->hw, E1000_TIPG, tipg);
2756 E1000_WRITE_REG(&adapter->hw, E1000_TIDV, adapter->tx_int_delay.value);
2757 if(adapter->hw.mac.type >= e1000_82540)
2758 E1000_WRITE_REG(&adapter->hw, E1000_TADV,
2759 adapter->tx_abs_int_delay.value);
2761 /* Program the Transmit Control Register */
2762 tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL);
2763 tctl &= ~E1000_TCTL_CT;
2764 tctl |= (E1000_TCTL_PSP | E1000_TCTL_RTLC | E1000_TCTL_EN |
2765 (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT));
2767 /* This write will effectively turn on the transmit unit. */
2768 E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl);
2770 /* Setup Transmit Descriptor Base Settings */
2771 adapter->txd_cmd = E1000_TXD_CMD_IFCS;
2773 if (adapter->tx_int_delay.value > 0)
2774 adapter->txd_cmd |= E1000_TXD_CMD_IDE;
2777 /*********************************************************************
2779 * Free all transmit related data structures.
2781 **********************************************************************/
2783 lem_free_transmit_structures(struct adapter *adapter)
2785 struct em_buffer *tx_buffer;
2787 INIT_DEBUGOUT("free_transmit_structures: begin");
2789 if (adapter->tx_buffer_area != NULL) {
2790 for (int i = 0; i < adapter->num_tx_desc; i++) {
2791 tx_buffer = &adapter->tx_buffer_area[i];
2792 if (tx_buffer->m_head != NULL) {
2793 bus_dmamap_sync(adapter->txtag, tx_buffer->map,
2794 BUS_DMASYNC_POSTWRITE);
2795 bus_dmamap_unload(adapter->txtag,
2797 m_freem(tx_buffer->m_head);
2798 tx_buffer->m_head = NULL;
2799 } else if (tx_buffer->map != NULL)
2800 bus_dmamap_unload(adapter->txtag,
2802 if (tx_buffer->map != NULL) {
2803 bus_dmamap_destroy(adapter->txtag,
2805 tx_buffer->map = NULL;
2809 if (adapter->tx_buffer_area != NULL) {
2810 free(adapter->tx_buffer_area, M_DEVBUF);
2811 adapter->tx_buffer_area = NULL;
2813 if (adapter->txtag != NULL) {
2814 bus_dma_tag_destroy(adapter->txtag);
2815 adapter->txtag = NULL;
2817 #if __FreeBSD_version >= 800000
2818 if (adapter->br != NULL)
2819 buf_ring_free(adapter->br, M_DEVBUF);
2823 /*********************************************************************
2825 * The offload context needs to be set when we transfer the first
2826 * packet of a particular protocol (TCP/UDP). This routine has been
2827 * enhanced to deal with inserted VLAN headers, and IPV6 (not complete)
2829 * Added back the old method of keeping the current context type
2830 * and not setting if unnecessary, as this is reported to be a
2831 * big performance win. -jfv
2832 **********************************************************************/
2834 lem_transmit_checksum_setup(struct adapter *adapter, struct mbuf *mp,
2835 u32 *txd_upper, u32 *txd_lower)
2837 struct e1000_context_desc *TXD = NULL;
2838 struct em_buffer *tx_buffer;
2839 struct ether_vlan_header *eh;
2840 struct ip *ip = NULL;
2841 struct ip6_hdr *ip6;
2842 int curr_txd, ehdrlen;
2843 u32 cmd, hdr_len, ip_hlen;
2848 cmd = hdr_len = ipproto = 0;
2849 *txd_upper = *txd_lower = 0;
2850 curr_txd = adapter->next_avail_tx_desc;
2853 * Determine where frame payload starts.
2854 * Jump over vlan headers if already present,
2855 * helpful for QinQ too.
2857 eh = mtod(mp, struct ether_vlan_header *);
2858 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
2859 etype = ntohs(eh->evl_proto);
2860 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
2862 etype = ntohs(eh->evl_encap_proto);
2863 ehdrlen = ETHER_HDR_LEN;
2867 * We only support TCP/UDP for IPv4 and IPv6 for the moment.
2868 * TODO: Support SCTP too when it hits the tree.
2872 ip = (struct ip *)(mp->m_data + ehdrlen);
2873 ip_hlen = ip->ip_hl << 2;
2875 /* Setup of IP header checksum. */
2876 if (mp->m_pkthdr.csum_flags & CSUM_IP) {
2878 * Start offset for header checksum calculation.
2879 * End offset for header checksum calculation.
2880 * Offset of place to put the checksum.
2882 TXD = (struct e1000_context_desc *)
2883 &adapter->tx_desc_base[curr_txd];
2884 TXD->lower_setup.ip_fields.ipcss = ehdrlen;
2885 TXD->lower_setup.ip_fields.ipcse =
2886 htole16(ehdrlen + ip_hlen);
2887 TXD->lower_setup.ip_fields.ipcso =
2888 ehdrlen + offsetof(struct ip, ip_sum);
2889 cmd |= E1000_TXD_CMD_IP;
2890 *txd_upper |= E1000_TXD_POPTS_IXSM << 8;
2893 hdr_len = ehdrlen + ip_hlen;
2897 case ETHERTYPE_IPV6:
2898 ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
2899 ip_hlen = sizeof(struct ip6_hdr); /* XXX: No header stacking. */
2901 /* IPv6 doesn't have a header checksum. */
2903 hdr_len = ehdrlen + ip_hlen;
2904 ipproto = ip6->ip6_nxt;
2913 if (mp->m_pkthdr.csum_flags & CSUM_TCP) {
2914 *txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2915 *txd_upper |= E1000_TXD_POPTS_TXSM << 8;
2916 /* no need for context if already set */
2917 if (adapter->last_hw_offload == CSUM_TCP)
2919 adapter->last_hw_offload = CSUM_TCP;
2921 * Start offset for payload checksum calculation.
2922 * End offset for payload checksum calculation.
2923 * Offset of place to put the checksum.
2925 TXD = (struct e1000_context_desc *)
2926 &adapter->tx_desc_base[curr_txd];
2927 TXD->upper_setup.tcp_fields.tucss = hdr_len;
2928 TXD->upper_setup.tcp_fields.tucse = htole16(0);
2929 TXD->upper_setup.tcp_fields.tucso =
2930 hdr_len + offsetof(struct tcphdr, th_sum);
2931 cmd |= E1000_TXD_CMD_TCP;
2936 if (mp->m_pkthdr.csum_flags & CSUM_UDP) {
2937 *txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2938 *txd_upper |= E1000_TXD_POPTS_TXSM << 8;
2939 /* no need for context if already set */
2940 if (adapter->last_hw_offload == CSUM_UDP)
2942 adapter->last_hw_offload = CSUM_UDP;
2944 * Start offset for header checksum calculation.
2945 * End offset for header checksum calculation.
2946 * Offset of place to put the checksum.
2948 TXD = (struct e1000_context_desc *)
2949 &adapter->tx_desc_base[curr_txd];
2950 TXD->upper_setup.tcp_fields.tucss = hdr_len;
2951 TXD->upper_setup.tcp_fields.tucse = htole16(0);
2952 TXD->upper_setup.tcp_fields.tucso =
2953 hdr_len + offsetof(struct udphdr, uh_sum);
2963 TXD->tcp_seg_setup.data = htole32(0);
2964 TXD->cmd_and_length =
2965 htole32(adapter->txd_cmd | E1000_TXD_CMD_DEXT | cmd);
2966 tx_buffer = &adapter->tx_buffer_area[curr_txd];
2967 tx_buffer->m_head = NULL;
2968 tx_buffer->next_eop = -1;
2970 if (++curr_txd == adapter->num_tx_desc)
2973 adapter->num_tx_desc_avail--;
2974 adapter->next_avail_tx_desc = curr_txd;
2978 /**********************************************************************
2980 * Examine each tx_buffer in the used queue. If the hardware is done
2981 * processing the packet then free associated resources. The
2982 * tx_buffer is put back on the free queue.
2984 **********************************************************************/
2986 lem_txeof(struct adapter *adapter)
2988 int first, last, done, num_avail;
2989 struct em_buffer *tx_buffer;
2990 struct e1000_tx_desc *tx_desc, *eop_desc;
2991 struct ifnet *ifp = adapter->ifp;
2993 EM_TX_LOCK_ASSERT(adapter);
2996 if (netmap_tx_irq(ifp, 0 | (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT)))
2998 #endif /* DEV_NETMAP */
2999 if (adapter->num_tx_desc_avail == adapter->num_tx_desc)
3002 num_avail = adapter->num_tx_desc_avail;
3003 first = adapter->next_tx_to_clean;
3004 tx_desc = &adapter->tx_desc_base[first];
3005 tx_buffer = &adapter->tx_buffer_area[first];
3006 last = tx_buffer->next_eop;
3007 eop_desc = &adapter->tx_desc_base[last];
3010 * What this does is get the index of the
3011 * first descriptor AFTER the EOP of the
3012 * first packet, that way we can do the
3013 * simple comparison on the inner while loop.
3015 if (++last == adapter->num_tx_desc)
3019 bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
3020 BUS_DMASYNC_POSTREAD);
3022 while (eop_desc->upper.fields.status & E1000_TXD_STAT_DD) {
3023 /* We clean the range of the packet */
3024 while (first != done) {
3025 tx_desc->upper.data = 0;
3026 tx_desc->lower.data = 0;
3027 tx_desc->buffer_addr = 0;
3030 if (tx_buffer->m_head) {
3032 bus_dmamap_sync(adapter->txtag,
3034 BUS_DMASYNC_POSTWRITE);
3035 bus_dmamap_unload(adapter->txtag,
3038 m_freem(tx_buffer->m_head);
3039 tx_buffer->m_head = NULL;
3041 tx_buffer->next_eop = -1;
3042 adapter->watchdog_time = ticks;
3044 if (++first == adapter->num_tx_desc)
3047 tx_buffer = &adapter->tx_buffer_area[first];
3048 tx_desc = &adapter->tx_desc_base[first];
3050 /* See if we can continue to the next packet */
3051 last = tx_buffer->next_eop;
3053 eop_desc = &adapter->tx_desc_base[last];
3054 /* Get new done point */
3055 if (++last == adapter->num_tx_desc) last = 0;
3060 bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
3061 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3063 adapter->next_tx_to_clean = first;
3064 adapter->num_tx_desc_avail = num_avail;
3067 * If we have enough room, clear IFF_DRV_OACTIVE to
3068 * tell the stack that it is OK to send packets.
3069 * If there are no pending descriptors, clear the watchdog.
3071 if (adapter->num_tx_desc_avail > EM_TX_CLEANUP_THRESHOLD) {
3072 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3073 if (adapter->num_tx_desc_avail == adapter->num_tx_desc) {
3074 adapter->watchdog_check = FALSE;
3080 /*********************************************************************
3082 * When Link is lost sometimes there is work still in the TX ring
3083 * which may result in a watchdog, rather than allow that we do an
3084 * attempted cleanup and then reinit here. Note that this has been
3085 * seens mostly with fiber adapters.
3087 **********************************************************************/
3089 lem_tx_purge(struct adapter *adapter)
3091 if ((!adapter->link_active) && (adapter->watchdog_check)) {
3092 EM_TX_LOCK(adapter);
3094 EM_TX_UNLOCK(adapter);
3095 if (adapter->watchdog_check) /* Still outstanding? */
3096 lem_init_locked(adapter);
3100 /*********************************************************************
3102 * Get a buffer from system mbuf buffer pool.
3104 **********************************************************************/
3106 lem_get_buf(struct adapter *adapter, int i)
3109 bus_dma_segment_t segs[1];
3111 struct em_buffer *rx_buffer;
3114 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
3116 adapter->mbuf_cluster_failed++;
3119 m->m_len = m->m_pkthdr.len = MCLBYTES;
3121 if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN))
3122 m_adj(m, ETHER_ALIGN);
3125 * Using memory from the mbuf cluster pool, invoke the
3126 * bus_dma machinery to arrange the memory mapping.
3128 error = bus_dmamap_load_mbuf_sg(adapter->rxtag,
3129 adapter->rx_sparemap, m, segs, &nsegs, BUS_DMA_NOWAIT);
3135 /* If nsegs is wrong then the stack is corrupt. */
3136 KASSERT(nsegs == 1, ("Too many segments returned!"));
3138 rx_buffer = &adapter->rx_buffer_area[i];
3139 if (rx_buffer->m_head != NULL)
3140 bus_dmamap_unload(adapter->rxtag, rx_buffer->map);
3142 map = rx_buffer->map;
3143 rx_buffer->map = adapter->rx_sparemap;
3144 adapter->rx_sparemap = map;
3145 bus_dmamap_sync(adapter->rxtag, rx_buffer->map, BUS_DMASYNC_PREREAD);
3146 rx_buffer->m_head = m;
3148 adapter->rx_desc_base[i].buffer_addr = htole64(segs[0].ds_addr);
3152 /*********************************************************************
3154 * Allocate memory for rx_buffer structures. Since we use one
3155 * rx_buffer per received packet, the maximum number of rx_buffer's
3156 * that we'll need is equal to the number of receive descriptors
3157 * that we've allocated.
3159 **********************************************************************/
3161 lem_allocate_receive_structures(struct adapter *adapter)
3163 device_t dev = adapter->dev;
3164 struct em_buffer *rx_buffer;
3167 adapter->rx_buffer_area = malloc(sizeof(struct em_buffer) *
3168 adapter->num_rx_desc, M_DEVBUF, M_NOWAIT | M_ZERO);
3169 if (adapter->rx_buffer_area == NULL) {
3170 device_printf(dev, "Unable to allocate rx_buffer memory\n");
3174 error = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */
3175 1, 0, /* alignment, bounds */
3176 BUS_SPACE_MAXADDR, /* lowaddr */
3177 BUS_SPACE_MAXADDR, /* highaddr */
3178 NULL, NULL, /* filter, filterarg */
3179 MCLBYTES, /* maxsize */
3181 MCLBYTES, /* maxsegsize */
3183 NULL, /* lockfunc */
3187 device_printf(dev, "%s: bus_dma_tag_create failed %d\n",
3192 /* Create the spare map (used by getbuf) */
3193 error = bus_dmamap_create(adapter->rxtag, BUS_DMA_NOWAIT,
3194 &adapter->rx_sparemap);
3196 device_printf(dev, "%s: bus_dmamap_create failed: %d\n",
3201 rx_buffer = adapter->rx_buffer_area;
3202 for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
3203 error = bus_dmamap_create(adapter->rxtag, BUS_DMA_NOWAIT,
3206 device_printf(dev, "%s: bus_dmamap_create failed: %d\n",
3215 lem_free_receive_structures(adapter);
3219 /*********************************************************************
3221 * (Re)initialize receive structures.
3223 **********************************************************************/
3225 lem_setup_receive_structures(struct adapter *adapter)
3227 struct em_buffer *rx_buffer;
3230 /* we are already under lock */
3231 struct netmap_adapter *na = NA(adapter->ifp);
3232 struct netmap_slot *slot = netmap_reset(na, NR_RX, 0, 0);
3235 /* Reset descriptor ring */
3236 bzero(adapter->rx_desc_base,
3237 (sizeof(struct e1000_rx_desc)) * adapter->num_rx_desc);
3239 /* Free current RX buffers. */
3240 rx_buffer = adapter->rx_buffer_area;
3241 for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
3242 if (rx_buffer->m_head != NULL) {
3243 bus_dmamap_sync(adapter->rxtag, rx_buffer->map,
3244 BUS_DMASYNC_POSTREAD);
3245 bus_dmamap_unload(adapter->rxtag, rx_buffer->map);
3246 m_freem(rx_buffer->m_head);
3247 rx_buffer->m_head = NULL;
3251 /* Allocate new ones. */
3252 for (i = 0; i < adapter->num_rx_desc; i++) {
3255 /* the i-th NIC entry goes to slot si */
3256 int si = netmap_idx_n2k(&na->rx_rings[0], i);
3260 addr = PNMB(slot + si, &paddr);
3261 netmap_load_map(adapter->rxtag, rx_buffer->map, addr);
3262 /* Update descriptor */
3263 adapter->rx_desc_base[i].buffer_addr = htole64(paddr);
3266 #endif /* DEV_NETMAP */
3267 error = lem_get_buf(adapter, i);
3272 /* Setup our descriptor pointers */
3273 adapter->next_rx_desc_to_check = 0;
3274 bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
3275 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3280 /*********************************************************************
3282 * Enable receive unit.
3284 **********************************************************************/
3287 lem_initialize_receive_unit(struct adapter *adapter)
3289 struct ifnet *ifp = adapter->ifp;
3293 INIT_DEBUGOUT("lem_initialize_receive_unit: begin");
3296 * Make sure receives are disabled while setting
3297 * up the descriptor ring
3299 rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
3300 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl & ~E1000_RCTL_EN);
3302 if (adapter->hw.mac.type >= e1000_82540) {
3303 E1000_WRITE_REG(&adapter->hw, E1000_RADV,
3304 adapter->rx_abs_int_delay.value);
3306 * Set the interrupt throttling rate. Value is calculated
3307 * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns)
3309 E1000_WRITE_REG(&adapter->hw, E1000_ITR, DEFAULT_ITR);
3312 /* Setup the Base and Length of the Rx Descriptor Ring */
3313 bus_addr = adapter->rxdma.dma_paddr;
3314 E1000_WRITE_REG(&adapter->hw, E1000_RDLEN(0),
3315 adapter->num_rx_desc * sizeof(struct e1000_rx_desc));
3316 E1000_WRITE_REG(&adapter->hw, E1000_RDBAH(0),
3317 (u32)(bus_addr >> 32));
3318 E1000_WRITE_REG(&adapter->hw, E1000_RDBAL(0),
3321 /* Setup the Receive Control Register */
3322 rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
3323 rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
3324 E1000_RCTL_RDMTS_HALF |
3325 (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT);
3327 /* Make sure VLAN Filters are off */
3328 rctl &= ~E1000_RCTL_VFE;
3330 if (e1000_tbi_sbp_enabled_82543(&adapter->hw))
3331 rctl |= E1000_RCTL_SBP;
3333 rctl &= ~E1000_RCTL_SBP;
3335 switch (adapter->rx_buffer_len) {
3338 rctl |= E1000_RCTL_SZ_2048;
3341 rctl |= E1000_RCTL_SZ_4096 |
3342 E1000_RCTL_BSEX | E1000_RCTL_LPE;
3345 rctl |= E1000_RCTL_SZ_8192 |
3346 E1000_RCTL_BSEX | E1000_RCTL_LPE;
3349 rctl |= E1000_RCTL_SZ_16384 |
3350 E1000_RCTL_BSEX | E1000_RCTL_LPE;
3354 if (ifp->if_mtu > ETHERMTU)
3355 rctl |= E1000_RCTL_LPE;
3357 rctl &= ~E1000_RCTL_LPE;
3359 /* Enable 82543 Receive Checksum Offload for TCP and UDP */
3360 if ((adapter->hw.mac.type >= e1000_82543) &&
3361 (ifp->if_capenable & IFCAP_RXCSUM)) {
3362 rxcsum = E1000_READ_REG(&adapter->hw, E1000_RXCSUM);
3363 rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL);
3364 E1000_WRITE_REG(&adapter->hw, E1000_RXCSUM, rxcsum);
3367 /* Enable Receives */
3368 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl);
3371 * Setup the HW Rx Head and
3372 * Tail Descriptor Pointers
3374 E1000_WRITE_REG(&adapter->hw, E1000_RDH(0), 0);
3375 rctl = adapter->num_rx_desc - 1; /* default RDT value */
3377 /* preserve buffers already made available to clients */
3378 if (ifp->if_capenable & IFCAP_NETMAP)
3379 rctl -= NA(adapter->ifp)->rx_rings[0].nr_hwavail;
3380 #endif /* DEV_NETMAP */
3381 E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), rctl);
3386 /*********************************************************************
3388 * Free receive related data structures.
3390 **********************************************************************/
3392 lem_free_receive_structures(struct adapter *adapter)
3394 struct em_buffer *rx_buffer;
3397 INIT_DEBUGOUT("free_receive_structures: begin");
3399 if (adapter->rx_sparemap) {
3400 bus_dmamap_destroy(adapter->rxtag, adapter->rx_sparemap);
3401 adapter->rx_sparemap = NULL;
3404 /* Cleanup any existing buffers */
3405 if (adapter->rx_buffer_area != NULL) {
3406 rx_buffer = adapter->rx_buffer_area;
3407 for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
3408 if (rx_buffer->m_head != NULL) {
3409 bus_dmamap_sync(adapter->rxtag, rx_buffer->map,
3410 BUS_DMASYNC_POSTREAD);
3411 bus_dmamap_unload(adapter->rxtag,
3413 m_freem(rx_buffer->m_head);
3414 rx_buffer->m_head = NULL;
3415 } else if (rx_buffer->map != NULL)
3416 bus_dmamap_unload(adapter->rxtag,
3418 if (rx_buffer->map != NULL) {
3419 bus_dmamap_destroy(adapter->rxtag,
3421 rx_buffer->map = NULL;
3426 if (adapter->rx_buffer_area != NULL) {
3427 free(adapter->rx_buffer_area, M_DEVBUF);
3428 adapter->rx_buffer_area = NULL;
3431 if (adapter->rxtag != NULL) {
3432 bus_dma_tag_destroy(adapter->rxtag);
3433 adapter->rxtag = NULL;
3437 /*********************************************************************
3439 * This routine executes in interrupt context. It replenishes
3440 * the mbufs in the descriptor and sends data which has been
3441 * dma'ed into host memory to upper layer.
3443 * We loop at most count times if count is > 0, or until done if
3446 * For polling we also now return the number of cleaned packets
3447 *********************************************************************/
3449 lem_rxeof(struct adapter *adapter, int count, int *done)
3451 struct ifnet *ifp = adapter->ifp;
3453 u8 status = 0, accept_frame = 0, eop = 0;
3454 u16 len, desc_len, prev_len_adj;
3456 struct e1000_rx_desc *current_desc;
3458 EM_RX_LOCK(adapter);
3459 i = adapter->next_rx_desc_to_check;
3460 current_desc = &adapter->rx_desc_base[i];
3461 bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
3462 BUS_DMASYNC_POSTREAD);
3465 if (netmap_rx_irq(ifp, 0 | NETMAP_LOCKED_ENTER, &rx_sent))
3467 #endif /* DEV_NETMAP */
3469 if (!((current_desc->status) & E1000_RXD_STAT_DD)) {
3472 EM_RX_UNLOCK(adapter);
3476 while (count != 0 && ifp->if_drv_flags & IFF_DRV_RUNNING) {
3477 struct mbuf *m = NULL;
3479 status = current_desc->status;
3480 if ((status & E1000_RXD_STAT_DD) == 0)
3483 mp = adapter->rx_buffer_area[i].m_head;
3485 * Can't defer bus_dmamap_sync(9) because TBI_ACCEPT
3486 * needs to access the last received byte in the mbuf.
3488 bus_dmamap_sync(adapter->rxtag, adapter->rx_buffer_area[i].map,
3489 BUS_DMASYNC_POSTREAD);
3493 desc_len = le16toh(current_desc->length);
3494 if (status & E1000_RXD_STAT_EOP) {
3497 if (desc_len < ETHER_CRC_LEN) {
3499 prev_len_adj = ETHER_CRC_LEN - desc_len;
3501 len = desc_len - ETHER_CRC_LEN;
3507 if (current_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
3509 u32 pkt_len = desc_len;
3511 if (adapter->fmp != NULL)
3512 pkt_len += adapter->fmp->m_pkthdr.len;
3514 last_byte = *(mtod(mp, caddr_t) + desc_len - 1);
3515 if (TBI_ACCEPT(&adapter->hw, status,
3516 current_desc->errors, pkt_len, last_byte,
3517 adapter->min_frame_size, adapter->max_frame_size)) {
3518 e1000_tbi_adjust_stats_82543(&adapter->hw,
3519 &adapter->stats, pkt_len,
3520 adapter->hw.mac.addr,
3521 adapter->max_frame_size);
3529 if (lem_get_buf(adapter, i) != 0) {
3534 /* Assign correct length to the current fragment */
3537 if (adapter->fmp == NULL) {
3538 mp->m_pkthdr.len = len;
3539 adapter->fmp = mp; /* Store the first mbuf */
3542 /* Chain mbuf's together */
3543 mp->m_flags &= ~M_PKTHDR;
3545 * Adjust length of previous mbuf in chain if
3546 * we received less than 4 bytes in the last
3549 if (prev_len_adj > 0) {
3550 adapter->lmp->m_len -= prev_len_adj;
3551 adapter->fmp->m_pkthdr.len -=
3554 adapter->lmp->m_next = mp;
3555 adapter->lmp = adapter->lmp->m_next;
3556 adapter->fmp->m_pkthdr.len += len;
3560 adapter->fmp->m_pkthdr.rcvif = ifp;
3562 lem_receive_checksum(adapter, current_desc,
3564 #ifndef __NO_STRICT_ALIGNMENT
3565 if (adapter->max_frame_size >
3566 (MCLBYTES - ETHER_ALIGN) &&
3567 lem_fixup_rx(adapter) != 0)
3570 if (status & E1000_RXD_STAT_VP) {
3571 adapter->fmp->m_pkthdr.ether_vtag =
3572 le16toh(current_desc->special);
3573 adapter->fmp->m_flags |= M_VLANTAG;
3575 #ifndef __NO_STRICT_ALIGNMENT
3579 adapter->fmp = NULL;
3580 adapter->lmp = NULL;
3583 adapter->dropped_pkts++;
3585 /* Reuse loaded DMA map and just update mbuf chain */
3586 mp = adapter->rx_buffer_area[i].m_head;
3587 mp->m_len = mp->m_pkthdr.len = MCLBYTES;
3588 mp->m_data = mp->m_ext.ext_buf;
3590 if (adapter->max_frame_size <=
3591 (MCLBYTES - ETHER_ALIGN))
3592 m_adj(mp, ETHER_ALIGN);
3593 if (adapter->fmp != NULL) {
3594 m_freem(adapter->fmp);
3595 adapter->fmp = NULL;
3596 adapter->lmp = NULL;
3601 /* Zero out the receive descriptors status. */
3602 current_desc->status = 0;
3603 bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
3604 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3606 /* Advance our pointers to the next descriptor. */
3607 if (++i == adapter->num_rx_desc)
3609 /* Call into the stack */
3611 adapter->next_rx_desc_to_check = i;
3612 EM_RX_UNLOCK(adapter);
3613 (*ifp->if_input)(ifp, m);
3614 EM_RX_LOCK(adapter);
3616 i = adapter->next_rx_desc_to_check;
3618 current_desc = &adapter->rx_desc_base[i];
3620 adapter->next_rx_desc_to_check = i;
3622 /* Advance the E1000's Receive Queue #0 "Tail Pointer". */
3624 i = adapter->num_rx_desc - 1;
3625 E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), i);
3628 EM_RX_UNLOCK(adapter);
3629 return ((status & E1000_RXD_STAT_DD) ? TRUE : FALSE);
3632 #ifndef __NO_STRICT_ALIGNMENT
3634 * When jumbo frames are enabled we should realign entire payload on
3635 * architecures with strict alignment. This is serious design mistake of 8254x
3636 * as it nullifies DMA operations. 8254x just allows RX buffer size to be
3637 * 2048/4096/8192/16384. What we really want is 2048 - ETHER_ALIGN to align its
3638 * payload. On architecures without strict alignment restrictions 8254x still
3639 * performs unaligned memory access which would reduce the performance too.
3640 * To avoid copying over an entire frame to align, we allocate a new mbuf and
3641 * copy ethernet header to the new mbuf. The new mbuf is prepended into the
3642 * existing mbuf chain.
3644 * Be aware, best performance of the 8254x is achived only when jumbo frame is
3645 * not used at all on architectures with strict alignment.
3648 lem_fixup_rx(struct adapter *adapter)
3655 if (m->m_len <= (MCLBYTES - ETHER_HDR_LEN)) {
3656 bcopy(m->m_data, m->m_data + ETHER_HDR_LEN, m->m_len);
3657 m->m_data += ETHER_HDR_LEN;
3659 MGETHDR(n, M_NOWAIT, MT_DATA);
3661 bcopy(m->m_data, n->m_data, ETHER_HDR_LEN);
3662 m->m_data += ETHER_HDR_LEN;
3663 m->m_len -= ETHER_HDR_LEN;
3664 n->m_len = ETHER_HDR_LEN;
3665 M_MOVE_PKTHDR(n, m);
3669 adapter->dropped_pkts++;
3670 m_freem(adapter->fmp);
3671 adapter->fmp = NULL;
3680 /*********************************************************************
3682 * Verify that the hardware indicated that the checksum is valid.
3683 * Inform the stack about the status of checksum so that stack
3684 * doesn't spend time verifying the checksum.
3686 *********************************************************************/
3688 lem_receive_checksum(struct adapter *adapter,
3689 struct e1000_rx_desc *rx_desc, struct mbuf *mp)
3691 /* 82543 or newer only */
3692 if ((adapter->hw.mac.type < e1000_82543) ||
3693 /* Ignore Checksum bit is set */
3694 (rx_desc->status & E1000_RXD_STAT_IXSM)) {
3695 mp->m_pkthdr.csum_flags = 0;
3699 if (rx_desc->status & E1000_RXD_STAT_IPCS) {
3701 if (!(rx_desc->errors & E1000_RXD_ERR_IPE)) {
3702 /* IP Checksum Good */
3703 mp->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
3704 mp->m_pkthdr.csum_flags |= CSUM_IP_VALID;
3707 mp->m_pkthdr.csum_flags = 0;
3711 if (rx_desc->status & E1000_RXD_STAT_TCPCS) {
3713 if (!(rx_desc->errors & E1000_RXD_ERR_TCPE)) {
3714 mp->m_pkthdr.csum_flags |=
3715 (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
3716 mp->m_pkthdr.csum_data = htons(0xffff);
3722 * This routine is run via an vlan
3726 lem_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3728 struct adapter *adapter = ifp->if_softc;
3731 if (ifp->if_softc != arg) /* Not our event */
3734 if ((vtag == 0) || (vtag > 4095)) /* Invalid ID */
3737 EM_CORE_LOCK(adapter);
3738 index = (vtag >> 5) & 0x7F;
3740 adapter->shadow_vfta[index] |= (1 << bit);
3741 ++adapter->num_vlans;
3742 /* Re-init to load the changes */
3743 if (ifp->if_capenable & IFCAP_VLAN_HWFILTER)
3744 lem_init_locked(adapter);
3745 EM_CORE_UNLOCK(adapter);
3749 * This routine is run via an vlan
3753 lem_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3755 struct adapter *adapter = ifp->if_softc;
3758 if (ifp->if_softc != arg)
3761 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
3764 EM_CORE_LOCK(adapter);
3765 index = (vtag >> 5) & 0x7F;
3767 adapter->shadow_vfta[index] &= ~(1 << bit);
3768 --adapter->num_vlans;
3769 /* Re-init to load the changes */
3770 if (ifp->if_capenable & IFCAP_VLAN_HWFILTER)
3771 lem_init_locked(adapter);
3772 EM_CORE_UNLOCK(adapter);
3776 lem_setup_vlan_hw_support(struct adapter *adapter)
3778 struct e1000_hw *hw = &adapter->hw;
3782 ** We get here thru init_locked, meaning
3783 ** a soft reset, this has already cleared
3784 ** the VFTA and other state, so if there
3785 ** have been no vlan's registered do nothing.
3787 if (adapter->num_vlans == 0)
3791 ** A soft reset zero's out the VFTA, so
3792 ** we need to repopulate it now.
3794 for (int i = 0; i < EM_VFTA_SIZE; i++)
3795 if (adapter->shadow_vfta[i] != 0)
3796 E1000_WRITE_REG_ARRAY(hw, E1000_VFTA,
3797 i, adapter->shadow_vfta[i]);
3799 reg = E1000_READ_REG(hw, E1000_CTRL);
3800 reg |= E1000_CTRL_VME;
3801 E1000_WRITE_REG(hw, E1000_CTRL, reg);
3803 /* Enable the Filter Table */
3804 reg = E1000_READ_REG(hw, E1000_RCTL);
3805 reg &= ~E1000_RCTL_CFIEN;
3806 reg |= E1000_RCTL_VFE;
3807 E1000_WRITE_REG(hw, E1000_RCTL, reg);
3811 lem_enable_intr(struct adapter *adapter)
3813 struct e1000_hw *hw = &adapter->hw;
3814 u32 ims_mask = IMS_ENABLE_MASK;
3816 E1000_WRITE_REG(hw, E1000_IMS, ims_mask);
3820 lem_disable_intr(struct adapter *adapter)
3822 struct e1000_hw *hw = &adapter->hw;
3824 E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
3828 * Bit of a misnomer, what this really means is
3829 * to enable OS management of the system... aka
3830 * to disable special hardware management features
3833 lem_init_manageability(struct adapter *adapter)
3835 /* A shared code workaround */
3836 if (adapter->has_manage) {
3837 int manc = E1000_READ_REG(&adapter->hw, E1000_MANC);
3838 /* disable hardware interception of ARP */
3839 manc &= ~(E1000_MANC_ARP_EN);
3840 E1000_WRITE_REG(&adapter->hw, E1000_MANC, manc);
3845 * Give control back to hardware management
3846 * controller if there is one.
3849 lem_release_manageability(struct adapter *adapter)
3851 if (adapter->has_manage) {
3852 int manc = E1000_READ_REG(&adapter->hw, E1000_MANC);
3854 /* re-enable hardware interception of ARP */
3855 manc |= E1000_MANC_ARP_EN;
3856 E1000_WRITE_REG(&adapter->hw, E1000_MANC, manc);
3861 * lem_get_hw_control sets the {CTRL_EXT|FWSM}:DRV_LOAD bit.
3862 * For ASF and Pass Through versions of f/w this means
3863 * that the driver is loaded. For AMT version type f/w
3864 * this means that the network i/f is open.
3867 lem_get_hw_control(struct adapter *adapter)
3871 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT);
3872 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT,
3873 ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
3878 * lem_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit.
3879 * For ASF and Pass Through versions of f/w this means that
3880 * the driver is no longer loaded. For AMT versions of the
3881 * f/w this means that the network i/f is closed.
3884 lem_release_hw_control(struct adapter *adapter)
3888 if (!adapter->has_manage)
3891 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT);
3892 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT,
3893 ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
3898 lem_is_valid_ether_addr(u8 *addr)
3900 char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
3902 if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) {
3910 ** Parse the interface capabilities with regard
3911 ** to both system management and wake-on-lan for
3915 lem_get_wakeup(device_t dev)
3917 struct adapter *adapter = device_get_softc(dev);
3918 u16 eeprom_data = 0, device_id, apme_mask;
3920 adapter->has_manage = e1000_enable_mng_pass_thru(&adapter->hw);
3921 apme_mask = EM_EEPROM_APME;
3923 switch (adapter->hw.mac.type) {
3928 e1000_read_nvm(&adapter->hw,
3929 NVM_INIT_CONTROL2_REG, 1, &eeprom_data);
3930 apme_mask = EM_82544_APME;
3933 case e1000_82546_rev_3:
3934 if (adapter->hw.bus.func == 1) {
3935 e1000_read_nvm(&adapter->hw,
3936 NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
3939 e1000_read_nvm(&adapter->hw,
3940 NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
3943 e1000_read_nvm(&adapter->hw,
3944 NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
3947 if (eeprom_data & apme_mask)
3948 adapter->wol = (E1000_WUFC_MAG | E1000_WUFC_MC);
3950 * We have the eeprom settings, now apply the special cases
3951 * where the eeprom may be wrong or the board won't support
3952 * wake on lan on a particular port
3954 device_id = pci_get_device(dev);
3955 switch (device_id) {
3956 case E1000_DEV_ID_82546GB_PCIE:
3959 case E1000_DEV_ID_82546EB_FIBER:
3960 case E1000_DEV_ID_82546GB_FIBER:
3961 /* Wake events only supported on port A for dual fiber
3962 * regardless of eeprom setting */
3963 if (E1000_READ_REG(&adapter->hw, E1000_STATUS) &
3964 E1000_STATUS_FUNC_1)
3967 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
3968 /* if quad port adapter, disable WoL on all but port A */
3969 if (global_quad_port_a != 0)
3971 /* Reset for multiple quad port adapters */
3972 if (++global_quad_port_a == 4)
3973 global_quad_port_a = 0;
3981 * Enable PCI Wake On Lan capability
3984 lem_enable_wakeup(device_t dev)
3986 struct adapter *adapter = device_get_softc(dev);
3987 struct ifnet *ifp = adapter->ifp;
3988 u32 pmc, ctrl, ctrl_ext, rctl;
3991 if ((pci_find_cap(dev, PCIY_PMG, &pmc) != 0))
3994 /* Advertise the wakeup capability */
3995 ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL);
3996 ctrl |= (E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN3);
3997 E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
3998 E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN);
4000 /* Keep the laser running on Fiber adapters */
4001 if (adapter->hw.phy.media_type == e1000_media_type_fiber ||
4002 adapter->hw.phy.media_type == e1000_media_type_internal_serdes) {
4003 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT);
4004 ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA;
4005 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, ctrl_ext);
4009 ** Determine type of Wakeup: note that wol
4010 ** is set with all bits on by default.
4012 if ((ifp->if_capenable & IFCAP_WOL_MAGIC) == 0)
4013 adapter->wol &= ~E1000_WUFC_MAG;
4015 if ((ifp->if_capenable & IFCAP_WOL_MCAST) == 0)
4016 adapter->wol &= ~E1000_WUFC_MC;
4018 rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
4019 rctl |= E1000_RCTL_MPE;
4020 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl);
4023 if (adapter->hw.mac.type == e1000_pchlan) {
4024 if (lem_enable_phy_wakeup(adapter))
4027 E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN);
4028 E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol);
4033 status = pci_read_config(dev, pmc + PCIR_POWER_STATUS, 2);
4034 status &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
4035 if (ifp->if_capenable & IFCAP_WOL)
4036 status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
4037 pci_write_config(dev, pmc + PCIR_POWER_STATUS, status, 2);
4043 ** WOL in the newer chipset interfaces (pchlan)
4044 ** require thing to be copied into the phy
4047 lem_enable_phy_wakeup(struct adapter *adapter)
4049 struct e1000_hw *hw = &adapter->hw;
4053 /* copy MAC RARs to PHY RARs */
4054 for (int i = 0; i < adapter->hw.mac.rar_entry_count; i++) {
4055 mreg = E1000_READ_REG(hw, E1000_RAL(i));
4056 e1000_write_phy_reg(hw, BM_RAR_L(i), (u16)(mreg & 0xFFFF));
4057 e1000_write_phy_reg(hw, BM_RAR_M(i),
4058 (u16)((mreg >> 16) & 0xFFFF));
4059 mreg = E1000_READ_REG(hw, E1000_RAH(i));
4060 e1000_write_phy_reg(hw, BM_RAR_H(i), (u16)(mreg & 0xFFFF));
4061 e1000_write_phy_reg(hw, BM_RAR_CTRL(i),
4062 (u16)((mreg >> 16) & 0xFFFF));
4065 /* copy MAC MTA to PHY MTA */
4066 for (int i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
4067 mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
4068 e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF));
4069 e1000_write_phy_reg(hw, BM_MTA(i) + 1,
4070 (u16)((mreg >> 16) & 0xFFFF));
4073 /* configure PHY Rx Control register */
4074 e1000_read_phy_reg(&adapter->hw, BM_RCTL, &preg);
4075 mreg = E1000_READ_REG(hw, E1000_RCTL);
4076 if (mreg & E1000_RCTL_UPE)
4077 preg |= BM_RCTL_UPE;
4078 if (mreg & E1000_RCTL_MPE)
4079 preg |= BM_RCTL_MPE;
4080 preg &= ~(BM_RCTL_MO_MASK);
4081 if (mreg & E1000_RCTL_MO_3)
4082 preg |= (((mreg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT)
4083 << BM_RCTL_MO_SHIFT);
4084 if (mreg & E1000_RCTL_BAM)
4085 preg |= BM_RCTL_BAM;
4086 if (mreg & E1000_RCTL_PMCF)
4087 preg |= BM_RCTL_PMCF;
4088 mreg = E1000_READ_REG(hw, E1000_CTRL);
4089 if (mreg & E1000_CTRL_RFCE)
4090 preg |= BM_RCTL_RFCE;
4091 e1000_write_phy_reg(&adapter->hw, BM_RCTL, preg);
4093 /* enable PHY wakeup in MAC register */
4094 E1000_WRITE_REG(hw, E1000_WUC,
4095 E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN);
4096 E1000_WRITE_REG(hw, E1000_WUFC, adapter->wol);
4098 /* configure and enable PHY wakeup in PHY registers */
4099 e1000_write_phy_reg(&adapter->hw, BM_WUFC, adapter->wol);
4100 e1000_write_phy_reg(&adapter->hw, BM_WUC, E1000_WUC_PME_EN);
4102 /* activate PHY wakeup */
4103 ret = hw->phy.ops.acquire(hw);
4105 printf("Could not acquire PHY\n");
4108 e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
4109 (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
4110 ret = e1000_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &preg);
4112 printf("Could not read PHY page 769\n");
4115 preg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
4116 ret = e1000_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, preg);
4118 printf("Could not set PHY Host Wakeup bit\n");
4120 hw->phy.ops.release(hw);
4126 lem_led_func(void *arg, int onoff)
4128 struct adapter *adapter = arg;
4130 EM_CORE_LOCK(adapter);
4132 e1000_setup_led(&adapter->hw);
4133 e1000_led_on(&adapter->hw);
4135 e1000_led_off(&adapter->hw);
4136 e1000_cleanup_led(&adapter->hw);
4138 EM_CORE_UNLOCK(adapter);
4141 /*********************************************************************
4142 * 82544 Coexistence issue workaround.
4143 * There are 2 issues.
4144 * 1. Transmit Hang issue.
4145 * To detect this issue, following equation can be used...
4146 * SIZE[3:0] + ADDR[2:0] = SUM[3:0].
4147 * If SUM[3:0] is in between 1 to 4, we will have this issue.
4150 * To detect this issue, following equation can be used...
4151 * SIZE[3:0] + ADDR[2:0] = SUM[3:0].
4152 * If SUM[3:0] is in between 9 to c, we will have this issue.
4156 * Make sure we do not have ending address
4157 * as 1,2,3,4(Hang) or 9,a,b,c (DAC)
4159 *************************************************************************/
4161 lem_fill_descriptors (bus_addr_t address, u32 length,
4162 PDESC_ARRAY desc_array)
4164 u32 safe_terminator;
4166 /* Since issue is sensitive to length and address.*/
4167 /* Let us first check the address...*/
4169 desc_array->descriptor[0].address = address;
4170 desc_array->descriptor[0].length = length;
4171 desc_array->elements = 1;
4172 return (desc_array->elements);
4174 safe_terminator = (u32)((((u32)address & 0x7) +
4175 (length & 0xF)) & 0xF);
4176 /* if it does not fall between 0x1 to 0x4 and 0x9 to 0xC then return */
4177 if (safe_terminator == 0 ||
4178 (safe_terminator > 4 &&
4179 safe_terminator < 9) ||
4180 (safe_terminator > 0xC &&
4181 safe_terminator <= 0xF)) {
4182 desc_array->descriptor[0].address = address;
4183 desc_array->descriptor[0].length = length;
4184 desc_array->elements = 1;
4185 return (desc_array->elements);
4188 desc_array->descriptor[0].address = address;
4189 desc_array->descriptor[0].length = length - 4;
4190 desc_array->descriptor[1].address = address + (length - 4);
4191 desc_array->descriptor[1].length = 4;
4192 desc_array->elements = 2;
4193 return (desc_array->elements);
4196 /**********************************************************************
4198 * Update the board statistics counters.
4200 **********************************************************************/
4202 lem_update_stats_counters(struct adapter *adapter)
4206 if(adapter->hw.phy.media_type == e1000_media_type_copper ||
4207 (E1000_READ_REG(&adapter->hw, E1000_STATUS) & E1000_STATUS_LU)) {
4208 adapter->stats.symerrs += E1000_READ_REG(&adapter->hw, E1000_SYMERRS);
4209 adapter->stats.sec += E1000_READ_REG(&adapter->hw, E1000_SEC);
4211 adapter->stats.crcerrs += E1000_READ_REG(&adapter->hw, E1000_CRCERRS);
4212 adapter->stats.mpc += E1000_READ_REG(&adapter->hw, E1000_MPC);
4213 adapter->stats.scc += E1000_READ_REG(&adapter->hw, E1000_SCC);
4214 adapter->stats.ecol += E1000_READ_REG(&adapter->hw, E1000_ECOL);
4216 adapter->stats.mcc += E1000_READ_REG(&adapter->hw, E1000_MCC);
4217 adapter->stats.latecol += E1000_READ_REG(&adapter->hw, E1000_LATECOL);
4218 adapter->stats.colc += E1000_READ_REG(&adapter->hw, E1000_COLC);
4219 adapter->stats.dc += E1000_READ_REG(&adapter->hw, E1000_DC);
4220 adapter->stats.rlec += E1000_READ_REG(&adapter->hw, E1000_RLEC);
4221 adapter->stats.xonrxc += E1000_READ_REG(&adapter->hw, E1000_XONRXC);
4222 adapter->stats.xontxc += E1000_READ_REG(&adapter->hw, E1000_XONTXC);
4223 adapter->stats.xoffrxc += E1000_READ_REG(&adapter->hw, E1000_XOFFRXC);
4224 adapter->stats.xofftxc += E1000_READ_REG(&adapter->hw, E1000_XOFFTXC);
4225 adapter->stats.fcruc += E1000_READ_REG(&adapter->hw, E1000_FCRUC);
4226 adapter->stats.prc64 += E1000_READ_REG(&adapter->hw, E1000_PRC64);
4227 adapter->stats.prc127 += E1000_READ_REG(&adapter->hw, E1000_PRC127);
4228 adapter->stats.prc255 += E1000_READ_REG(&adapter->hw, E1000_PRC255);
4229 adapter->stats.prc511 += E1000_READ_REG(&adapter->hw, E1000_PRC511);
4230 adapter->stats.prc1023 += E1000_READ_REG(&adapter->hw, E1000_PRC1023);
4231 adapter->stats.prc1522 += E1000_READ_REG(&adapter->hw, E1000_PRC1522);
4232 adapter->stats.gprc += E1000_READ_REG(&adapter->hw, E1000_GPRC);
4233 adapter->stats.bprc += E1000_READ_REG(&adapter->hw, E1000_BPRC);
4234 adapter->stats.mprc += E1000_READ_REG(&adapter->hw, E1000_MPRC);
4235 adapter->stats.gptc += E1000_READ_REG(&adapter->hw, E1000_GPTC);
4237 /* For the 64-bit byte counters the low dword must be read first. */
4238 /* Both registers clear on the read of the high dword */
4240 adapter->stats.gorc += E1000_READ_REG(&adapter->hw, E1000_GORCL) +
4241 ((u64)E1000_READ_REG(&adapter->hw, E1000_GORCH) << 32);
4242 adapter->stats.gotc += E1000_READ_REG(&adapter->hw, E1000_GOTCL) +
4243 ((u64)E1000_READ_REG(&adapter->hw, E1000_GOTCH) << 32);
4245 adapter->stats.rnbc += E1000_READ_REG(&adapter->hw, E1000_RNBC);
4246 adapter->stats.ruc += E1000_READ_REG(&adapter->hw, E1000_RUC);
4247 adapter->stats.rfc += E1000_READ_REG(&adapter->hw, E1000_RFC);
4248 adapter->stats.roc += E1000_READ_REG(&adapter->hw, E1000_ROC);
4249 adapter->stats.rjc += E1000_READ_REG(&adapter->hw, E1000_RJC);
4251 adapter->stats.tor += E1000_READ_REG(&adapter->hw, E1000_TORH);
4252 adapter->stats.tot += E1000_READ_REG(&adapter->hw, E1000_TOTH);
4254 adapter->stats.tpr += E1000_READ_REG(&adapter->hw, E1000_TPR);
4255 adapter->stats.tpt += E1000_READ_REG(&adapter->hw, E1000_TPT);
4256 adapter->stats.ptc64 += E1000_READ_REG(&adapter->hw, E1000_PTC64);
4257 adapter->stats.ptc127 += E1000_READ_REG(&adapter->hw, E1000_PTC127);
4258 adapter->stats.ptc255 += E1000_READ_REG(&adapter->hw, E1000_PTC255);
4259 adapter->stats.ptc511 += E1000_READ_REG(&adapter->hw, E1000_PTC511);
4260 adapter->stats.ptc1023 += E1000_READ_REG(&adapter->hw, E1000_PTC1023);
4261 adapter->stats.ptc1522 += E1000_READ_REG(&adapter->hw, E1000_PTC1522);
4262 adapter->stats.mptc += E1000_READ_REG(&adapter->hw, E1000_MPTC);
4263 adapter->stats.bptc += E1000_READ_REG(&adapter->hw, E1000_BPTC);
4265 if (adapter->hw.mac.type >= e1000_82543) {
4266 adapter->stats.algnerrc +=
4267 E1000_READ_REG(&adapter->hw, E1000_ALGNERRC);
4268 adapter->stats.rxerrc +=
4269 E1000_READ_REG(&adapter->hw, E1000_RXERRC);
4270 adapter->stats.tncrs +=
4271 E1000_READ_REG(&adapter->hw, E1000_TNCRS);
4272 adapter->stats.cexterr +=
4273 E1000_READ_REG(&adapter->hw, E1000_CEXTERR);
4274 adapter->stats.tsctc +=
4275 E1000_READ_REG(&adapter->hw, E1000_TSCTC);
4276 adapter->stats.tsctfc +=
4277 E1000_READ_REG(&adapter->hw, E1000_TSCTFC);
4281 ifp->if_collisions = adapter->stats.colc;
4284 ifp->if_ierrors = adapter->dropped_pkts + adapter->stats.rxerrc +
4285 adapter->stats.crcerrs + adapter->stats.algnerrc +
4286 adapter->stats.ruc + adapter->stats.roc +
4287 adapter->stats.mpc + adapter->stats.cexterr;
4290 ifp->if_oerrors = adapter->stats.ecol +
4291 adapter->stats.latecol + adapter->watchdog_events;
4294 /* Export a single 32-bit register via a read-only sysctl. */
4296 lem_sysctl_reg_handler(SYSCTL_HANDLER_ARGS)
4298 struct adapter *adapter;
4301 adapter = oidp->oid_arg1;
4302 val = E1000_READ_REG(&adapter->hw, oidp->oid_arg2);
4303 return (sysctl_handle_int(oidp, &val, 0, req));
4307 * Add sysctl variables, one per statistic, to the system.
4310 lem_add_hw_stats(struct adapter *adapter)
4312 device_t dev = adapter->dev;
4314 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
4315 struct sysctl_oid *tree = device_get_sysctl_tree(dev);
4316 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
4317 struct e1000_hw_stats *stats = &adapter->stats;
4319 struct sysctl_oid *stat_node;
4320 struct sysctl_oid_list *stat_list;
4322 /* Driver Statistics */
4323 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_alloc_fail",
4324 CTLFLAG_RD, &adapter->mbuf_alloc_failed,
4326 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "cluster_alloc_fail",
4327 CTLFLAG_RD, &adapter->mbuf_cluster_failed,
4328 "Std mbuf cluster failed");
4329 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
4330 CTLFLAG_RD, &adapter->dropped_pkts,
4331 "Driver dropped packets");
4332 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_dma_fail",
4333 CTLFLAG_RD, &adapter->no_tx_dma_setup,
4334 "Driver tx dma failure in xmit");
4335 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_desc_fail1",
4336 CTLFLAG_RD, &adapter->no_tx_desc_avail1,
4337 "Not enough tx descriptors failure in xmit");
4338 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_desc_fail2",
4339 CTLFLAG_RD, &adapter->no_tx_desc_avail2,
4340 "Not enough tx descriptors failure in xmit");
4341 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "rx_overruns",
4342 CTLFLAG_RD, &adapter->rx_overruns,
4344 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_timeouts",
4345 CTLFLAG_RD, &adapter->watchdog_events,
4346 "Watchdog timeouts");
4348 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "device_control",
4349 CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_CTRL,
4350 lem_sysctl_reg_handler, "IU",
4351 "Device Control Register");
4352 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_control",
4353 CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_RCTL,
4354 lem_sysctl_reg_handler, "IU",
4355 "Receiver Control Register");
4356 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "fc_high_water",
4357 CTLFLAG_RD, &adapter->hw.fc.high_water, 0,
4358 "Flow Control High Watermark");
4359 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "fc_low_water",
4360 CTLFLAG_RD, &adapter->hw.fc.low_water, 0,
4361 "Flow Control Low Watermark");
4362 SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "fifo_workaround",
4363 CTLFLAG_RD, &adapter->tx_fifo_wrk_cnt,
4364 "TX FIFO workaround events");
4365 SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "fifo_reset",
4366 CTLFLAG_RD, &adapter->tx_fifo_reset_cnt,
4369 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "txd_head",
4370 CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_TDH(0),
4371 lem_sysctl_reg_handler, "IU",
4372 "Transmit Descriptor Head");
4373 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "txd_tail",
4374 CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_TDT(0),
4375 lem_sysctl_reg_handler, "IU",
4376 "Transmit Descriptor Tail");
4377 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rxd_head",
4378 CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_RDH(0),
4379 lem_sysctl_reg_handler, "IU",
4380 "Receive Descriptor Head");
4381 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rxd_tail",
4382 CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_RDT(0),
4383 lem_sysctl_reg_handler, "IU",
4384 "Receive Descriptor Tail");
4387 /* MAC stats get their own sub node */
4389 stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac_stats",
4390 CTLFLAG_RD, NULL, "Statistics");
4391 stat_list = SYSCTL_CHILDREN(stat_node);
4393 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "excess_coll",
4394 CTLFLAG_RD, &stats->ecol,
4395 "Excessive collisions");
4396 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "single_coll",
4397 CTLFLAG_RD, &stats->scc,
4398 "Single collisions");
4399 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "multiple_coll",
4400 CTLFLAG_RD, &stats->mcc,
4401 "Multiple collisions");
4402 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "late_coll",
4403 CTLFLAG_RD, &stats->latecol,
4405 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "collision_count",
4406 CTLFLAG_RD, &stats->colc,
4408 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "symbol_errors",
4409 CTLFLAG_RD, &adapter->stats.symerrs,
4411 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "sequence_errors",
4412 CTLFLAG_RD, &adapter->stats.sec,
4414 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "defer_count",
4415 CTLFLAG_RD, &adapter->stats.dc,
4417 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "missed_packets",
4418 CTLFLAG_RD, &adapter->stats.mpc,
4420 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_no_buff",
4421 CTLFLAG_RD, &adapter->stats.rnbc,
4422 "Receive No Buffers");
4423 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_undersize",
4424 CTLFLAG_RD, &adapter->stats.ruc,
4425 "Receive Undersize");
4426 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_fragmented",
4427 CTLFLAG_RD, &adapter->stats.rfc,
4428 "Fragmented Packets Received ");
4429 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_oversize",
4430 CTLFLAG_RD, &adapter->stats.roc,
4431 "Oversized Packets Received");
4432 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_jabber",
4433 CTLFLAG_RD, &adapter->stats.rjc,
4435 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_errs",
4436 CTLFLAG_RD, &adapter->stats.rxerrc,
4438 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "crc_errs",
4439 CTLFLAG_RD, &adapter->stats.crcerrs,
4441 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "alignment_errs",
4442 CTLFLAG_RD, &adapter->stats.algnerrc,
4443 "Alignment Errors");
4444 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "coll_ext_errs",
4445 CTLFLAG_RD, &adapter->stats.cexterr,
4446 "Collision/Carrier extension errors");
4447 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_recvd",
4448 CTLFLAG_RD, &adapter->stats.xonrxc,
4450 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_txd",
4451 CTLFLAG_RD, &adapter->stats.xontxc,
4453 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_recvd",
4454 CTLFLAG_RD, &adapter->stats.xoffrxc,
4456 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_txd",
4457 CTLFLAG_RD, &adapter->stats.xofftxc,
4458 "XOFF Transmitted");
4460 /* Packet Reception Stats */
4461 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_recvd",
4462 CTLFLAG_RD, &adapter->stats.tpr,
4463 "Total Packets Received ");
4464 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_recvd",
4465 CTLFLAG_RD, &adapter->stats.gprc,
4466 "Good Packets Received");
4467 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_recvd",
4468 CTLFLAG_RD, &adapter->stats.bprc,
4469 "Broadcast Packets Received");
4470 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_recvd",
4471 CTLFLAG_RD, &adapter->stats.mprc,
4472 "Multicast Packets Received");
4473 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_64",
4474 CTLFLAG_RD, &adapter->stats.prc64,
4475 "64 byte frames received ");
4476 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_65_127",
4477 CTLFLAG_RD, &adapter->stats.prc127,
4478 "65-127 byte frames received");
4479 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_128_255",
4480 CTLFLAG_RD, &adapter->stats.prc255,
4481 "128-255 byte frames received");
4482 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_256_511",
4483 CTLFLAG_RD, &adapter->stats.prc511,
4484 "256-511 byte frames received");
4485 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_512_1023",
4486 CTLFLAG_RD, &adapter->stats.prc1023,
4487 "512-1023 byte frames received");
4488 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_1024_1522",
4489 CTLFLAG_RD, &adapter->stats.prc1522,
4490 "1023-1522 byte frames received");
4491 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_recvd",
4492 CTLFLAG_RD, &adapter->stats.gorc,
4493 "Good Octets Received");
4495 /* Packet Transmission Stats */
4496 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
4497 CTLFLAG_RD, &adapter->stats.gotc,
4498 "Good Octets Transmitted");
4499 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_txd",
4500 CTLFLAG_RD, &adapter->stats.tpt,
4501 "Total Packets Transmitted");
4502 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_txd",
4503 CTLFLAG_RD, &adapter->stats.gptc,
4504 "Good Packets Transmitted");
4505 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_txd",
4506 CTLFLAG_RD, &adapter->stats.bptc,
4507 "Broadcast Packets Transmitted");
4508 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_txd",
4509 CTLFLAG_RD, &adapter->stats.mptc,
4510 "Multicast Packets Transmitted");
4511 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_64",
4512 CTLFLAG_RD, &adapter->stats.ptc64,
4513 "64 byte frames transmitted ");
4514 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_65_127",
4515 CTLFLAG_RD, &adapter->stats.ptc127,
4516 "65-127 byte frames transmitted");
4517 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_128_255",
4518 CTLFLAG_RD, &adapter->stats.ptc255,
4519 "128-255 byte frames transmitted");
4520 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_256_511",
4521 CTLFLAG_RD, &adapter->stats.ptc511,
4522 "256-511 byte frames transmitted");
4523 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_512_1023",
4524 CTLFLAG_RD, &adapter->stats.ptc1023,
4525 "512-1023 byte frames transmitted");
4526 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_1024_1522",
4527 CTLFLAG_RD, &adapter->stats.ptc1522,
4528 "1024-1522 byte frames transmitted");
4529 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tso_txd",
4530 CTLFLAG_RD, &adapter->stats.tsctc,
4531 "TSO Contexts Transmitted");
4532 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tso_ctx_fail",
4533 CTLFLAG_RD, &adapter->stats.tsctfc,
4534 "TSO Contexts Failed");
4537 /**********************************************************************
4539 * This routine provides a way to dump out the adapter eeprom,
4540 * often a useful debug/service tool. This only dumps the first
4541 * 32 words, stuff that matters is in that extent.
4543 **********************************************************************/
4546 lem_sysctl_nvm_info(SYSCTL_HANDLER_ARGS)
4548 struct adapter *adapter;
4553 error = sysctl_handle_int(oidp, &result, 0, req);
4555 if (error || !req->newptr)
4559 * This value will cause a hex dump of the
4560 * first 32 16-bit words of the EEPROM to
4564 adapter = (struct adapter *)arg1;
4565 lem_print_nvm_info(adapter);
4572 lem_print_nvm_info(struct adapter *adapter)
4577 /* Its a bit crude, but it gets the job done */
4578 printf("\nInterface EEPROM Dump:\n");
4579 printf("Offset\n0x0000 ");
4580 for (i = 0, j = 0; i < 32; i++, j++) {
4581 if (j == 8) { /* Make the offset block */
4583 printf("\n0x00%x0 ",row);
4585 e1000_read_nvm(&adapter->hw, i, 1, &eeprom_data);
4586 printf("%04x ", eeprom_data);
4592 lem_sysctl_int_delay(SYSCTL_HANDLER_ARGS)
4594 struct em_int_delay_info *info;
4595 struct adapter *adapter;
4601 info = (struct em_int_delay_info *)arg1;
4602 usecs = info->value;
4603 error = sysctl_handle_int(oidp, &usecs, 0, req);
4604 if (error != 0 || req->newptr == NULL)
4606 if (usecs < 0 || usecs > EM_TICKS_TO_USECS(65535))
4608 info->value = usecs;
4609 ticks = EM_USECS_TO_TICKS(usecs);
4610 if (info->offset == E1000_ITR) /* units are 256ns here */
4613 adapter = info->adapter;
4615 EM_CORE_LOCK(adapter);
4616 regval = E1000_READ_OFFSET(&adapter->hw, info->offset);
4617 regval = (regval & ~0xffff) | (ticks & 0xffff);
4618 /* Handle a few special cases. */
4619 switch (info->offset) {
4624 adapter->txd_cmd &= ~E1000_TXD_CMD_IDE;
4625 /* Don't write 0 into the TIDV register. */
4628 adapter->txd_cmd |= E1000_TXD_CMD_IDE;
4631 E1000_WRITE_OFFSET(&adapter->hw, info->offset, regval);
4632 EM_CORE_UNLOCK(adapter);
4637 lem_add_int_delay_sysctl(struct adapter *adapter, const char *name,
4638 const char *description, struct em_int_delay_info *info,
4639 int offset, int value)
4641 info->adapter = adapter;
4642 info->offset = offset;
4643 info->value = value;
4644 SYSCTL_ADD_PROC(device_get_sysctl_ctx(adapter->dev),
4645 SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
4646 OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW,
4647 info, 0, lem_sysctl_int_delay, "I", description);
4651 lem_set_flow_cntrl(struct adapter *adapter, const char *name,
4652 const char *description, int *limit, int value)
4655 SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
4656 SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
4657 OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW, limit, value, description);
4661 lem_add_rx_process_limit(struct adapter *adapter, const char *name,
4662 const char *description, int *limit, int value)
4665 SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
4666 SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
4667 OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW, limit, value, description);