if_em.c revision 135937
1/**************************************************************************
2
3Copyright (c) 2001-2003, Intel Corporation
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10    this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright
13    notice, this list of conditions and the following disclaimer in the
14    documentation and/or other materials provided with the distribution.
15
16 3. Neither the name of the Intel Corporation nor the names of its
17    contributors may be used to endorse or promote products derived from
18    this software without specific prior written permission.
19
20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30POSSIBILITY OF SUCH DAMAGE.
31
32***************************************************************************/
33
34/*$FreeBSD: head/sys/dev/em/if_em.c 135937 2004-09-29 18:28:28Z mlaier $*/
35
36#include <dev/em/if_em.h>
37
38/*********************************************************************
39 *  Set this to one to display debug statistics
40 *********************************************************************/
41int             em_display_debug_stats = 0;
42
43/*********************************************************************
44 *  Linked list of board private structures for all NICs found
45 *********************************************************************/
46
47struct adapter *em_adapter_list = NULL;
48
49
50/*********************************************************************
51 *  Driver version
52 *********************************************************************/
53
54char em_driver_version[] = "1.7.35";
55
56
57/*********************************************************************
58 *  PCI Device ID Table
59 *
60 *  Used by probe to select devices to load on
61 *  Last field stores an index into em_strings
62 *  Last entry must be all 0s
63 *
64 *  { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
65 *********************************************************************/
66
67static em_vendor_info_t em_vendor_info_array[] =
68{
69        /* Intel(R) PRO/1000 Network Connection */
70        { 0x8086, 0x1000, PCI_ANY_ID, PCI_ANY_ID, 0},
71        { 0x8086, 0x1001, PCI_ANY_ID, PCI_ANY_ID, 0},
72        { 0x8086, 0x1004, PCI_ANY_ID, PCI_ANY_ID, 0},
73        { 0x8086, 0x1008, PCI_ANY_ID, PCI_ANY_ID, 0},
74        { 0x8086, 0x1009, PCI_ANY_ID, PCI_ANY_ID, 0},
75        { 0x8086, 0x100C, PCI_ANY_ID, PCI_ANY_ID, 0},
76        { 0x8086, 0x100D, PCI_ANY_ID, PCI_ANY_ID, 0},
77        { 0x8086, 0x100E, PCI_ANY_ID, PCI_ANY_ID, 0},
78        { 0x8086, 0x100F, PCI_ANY_ID, PCI_ANY_ID, 0},
79        { 0x8086, 0x1010, PCI_ANY_ID, PCI_ANY_ID, 0},
80        { 0x8086, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0},
81        { 0x8086, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0},
82        { 0x8086, 0x1013, PCI_ANY_ID, PCI_ANY_ID, 0},
83        { 0x8086, 0x1015, PCI_ANY_ID, PCI_ANY_ID, 0},
84        { 0x8086, 0x1016, PCI_ANY_ID, PCI_ANY_ID, 0},
85        { 0x8086, 0x1017, PCI_ANY_ID, PCI_ANY_ID, 0},
86        { 0x8086, 0x1018, PCI_ANY_ID, PCI_ANY_ID, 0},
87        { 0x8086, 0x1019, PCI_ANY_ID, PCI_ANY_ID, 0},
88        { 0x8086, 0x101A, PCI_ANY_ID, PCI_ANY_ID, 0},
89	{ 0x8086, 0x101D, PCI_ANY_ID, PCI_ANY_ID, 0},
90	{ 0x8086, 0x101E, PCI_ANY_ID, PCI_ANY_ID, 0},
91	{ 0x8086, 0x1026, PCI_ANY_ID, PCI_ANY_ID, 0},
92        { 0x8086, 0x1027, PCI_ANY_ID, PCI_ANY_ID, 0},
93        { 0x8086, 0x1028, PCI_ANY_ID, PCI_ANY_ID, 0},
94        { 0x8086, 0x1075, PCI_ANY_ID, PCI_ANY_ID, 0},
95        { 0x8086, 0x1076, PCI_ANY_ID, PCI_ANY_ID, 0},
96        { 0x8086, 0x1077, PCI_ANY_ID, PCI_ANY_ID, 0},
97        { 0x8086, 0x1078, PCI_ANY_ID, PCI_ANY_ID, 0},
98        { 0x8086, 0x1079, PCI_ANY_ID, PCI_ANY_ID, 0},
99        { 0x8086, 0x107A, PCI_ANY_ID, PCI_ANY_ID, 0},
100        { 0x8086, 0x107B, PCI_ANY_ID, PCI_ANY_ID, 0},
101        { 0x8086, 0x107C, PCI_ANY_ID, PCI_ANY_ID, 0},
102        /* required last entry */
103        { 0, 0, 0, 0, 0}
104};
105
106/*********************************************************************
107 *  Table of branding strings for all supported NICs.
108 *********************************************************************/
109
110static char *em_strings[] = {
111	"Intel(R) PRO/1000 Network Connection"
112};
113
114/*********************************************************************
115 *  Function prototypes
116 *********************************************************************/
117static int  em_probe(device_t);
118static int  em_attach(device_t);
119static int  em_detach(device_t);
120static int  em_shutdown(device_t);
121static void em_intr(void *);
122static void em_start(struct ifnet *);
123static int  em_ioctl(struct ifnet *, u_long, caddr_t);
124static void em_watchdog(struct ifnet *);
125static void em_init(void *);
126static void em_init_locked(struct adapter *);
127static void em_stop(void *);
128static void em_media_status(struct ifnet *, struct ifmediareq *);
129static int  em_media_change(struct ifnet *);
130static void em_identify_hardware(struct adapter *);
131static int  em_allocate_pci_resources(struct adapter *);
132static void em_free_pci_resources(struct adapter *);
133static void em_local_timer(void *);
134static int  em_hardware_init(struct adapter *);
135static void em_setup_interface(device_t, struct adapter *);
136static int  em_setup_transmit_structures(struct adapter *);
137static void em_initialize_transmit_unit(struct adapter *);
138static int  em_setup_receive_structures(struct adapter *);
139static void em_initialize_receive_unit(struct adapter *);
140static void em_enable_intr(struct adapter *);
141static void em_disable_intr(struct adapter *);
142static void em_free_transmit_structures(struct adapter *);
143static void em_free_receive_structures(struct adapter *);
144static void em_update_stats_counters(struct adapter *);
145static void em_clean_transmit_interrupts(struct adapter *);
146static int  em_allocate_receive_structures(struct adapter *);
147static int  em_allocate_transmit_structures(struct adapter *);
148static void em_process_receive_interrupts(struct adapter *, int);
149static void em_receive_checksum(struct adapter *,
150				struct em_rx_desc *,
151				struct mbuf *);
152static void em_transmit_checksum_setup(struct adapter *,
153				       struct mbuf *,
154				       u_int32_t *,
155				       u_int32_t *);
156static void em_set_promisc(struct adapter *);
157static void em_disable_promisc(struct adapter *);
158static void em_set_multi(struct adapter *);
159static void em_print_hw_stats(struct adapter *);
160static void em_print_link_status(struct adapter *);
161static int  em_get_buf(int i, struct adapter *,
162		       struct mbuf *);
163static void em_enable_vlans(struct adapter *);
164static int  em_encap(struct adapter *, struct mbuf *);
165static void em_smartspeed(struct adapter *);
166static int  em_82547_fifo_workaround(struct adapter *, int);
167static void em_82547_update_fifo_head(struct adapter *, int);
168static int  em_82547_tx_fifo_reset(struct adapter *);
169static void em_82547_move_tail(void *arg);
170static void em_82547_move_tail_locked(struct adapter *);
171static int  em_dma_malloc(struct adapter *, bus_size_t,
172			  struct em_dma_alloc *, int);
173static void em_dma_free(struct adapter *, struct em_dma_alloc *);
174static void em_print_debug_info(struct adapter *);
175static int  em_is_valid_ether_addr(u_int8_t *);
176static int  em_sysctl_stats(SYSCTL_HANDLER_ARGS);
177static int  em_sysctl_debug_info(SYSCTL_HANDLER_ARGS);
178static u_int32_t em_fill_descriptors (u_int64_t address,
179				      u_int32_t length,
180				      PDESC_ARRAY desc_array);
181static int  em_sysctl_int_delay(SYSCTL_HANDLER_ARGS);
182static void em_add_int_delay_sysctl(struct adapter *, const char *,
183				    const char *, struct em_int_delay_info *,
184				    int, int);
185
186/*********************************************************************
187 *  FreeBSD Device Interface Entry Points
188 *********************************************************************/
189
190static device_method_t em_methods[] = {
191	/* Device interface */
192	DEVMETHOD(device_probe, em_probe),
193	DEVMETHOD(device_attach, em_attach),
194	DEVMETHOD(device_detach, em_detach),
195	DEVMETHOD(device_shutdown, em_shutdown),
196	{0, 0}
197};
198
199static driver_t em_driver = {
200	"em", em_methods, sizeof(struct adapter ),
201};
202
203static devclass_t em_devclass;
204DRIVER_MODULE(em, pci, em_driver, em_devclass, 0, 0);
205MODULE_DEPEND(em, pci, 1, 1, 1);
206MODULE_DEPEND(em, ether, 1, 1, 1);
207
208/*********************************************************************
209 *  Tunable default values.
210 *********************************************************************/
211
212#define E1000_TICKS_TO_USECS(ticks)	((1024 * (ticks) + 500) / 1000)
213#define E1000_USECS_TO_TICKS(usecs)	((1000 * (usecs) + 512) / 1024)
214
215static int em_tx_int_delay_dflt = E1000_TICKS_TO_USECS(EM_TIDV);
216static int em_rx_int_delay_dflt = E1000_TICKS_TO_USECS(EM_RDTR);
217static int em_tx_abs_int_delay_dflt = E1000_TICKS_TO_USECS(EM_TADV);
218static int em_rx_abs_int_delay_dflt = E1000_TICKS_TO_USECS(EM_RADV);
219
220TUNABLE_INT("hw.em.tx_int_delay", &em_tx_int_delay_dflt);
221TUNABLE_INT("hw.em.rx_int_delay", &em_rx_int_delay_dflt);
222TUNABLE_INT("hw.em.tx_abs_int_delay", &em_tx_abs_int_delay_dflt);
223TUNABLE_INT("hw.em.rx_abs_int_delay", &em_rx_abs_int_delay_dflt);
224
225/*********************************************************************
226 *  Device identification routine
227 *
228 *  em_probe determines if the driver should be loaded on
229 *  adapter based on PCI vendor/device id of the adapter.
230 *
231 *  return 0 on success, positive on failure
232 *********************************************************************/
233
234static int
235em_probe(device_t dev)
236{
237	em_vendor_info_t *ent;
238
239	u_int16_t       pci_vendor_id = 0;
240	u_int16_t       pci_device_id = 0;
241	u_int16_t       pci_subvendor_id = 0;
242	u_int16_t       pci_subdevice_id = 0;
243	char            adapter_name[60];
244
245	INIT_DEBUGOUT("em_probe: begin");
246
247	pci_vendor_id = pci_get_vendor(dev);
248	if (pci_vendor_id != EM_VENDOR_ID)
249		return(ENXIO);
250
251	pci_device_id = pci_get_device(dev);
252	pci_subvendor_id = pci_get_subvendor(dev);
253	pci_subdevice_id = pci_get_subdevice(dev);
254
255	ent = em_vendor_info_array;
256	while (ent->vendor_id != 0) {
257		if ((pci_vendor_id == ent->vendor_id) &&
258		    (pci_device_id == ent->device_id) &&
259
260		    ((pci_subvendor_id == ent->subvendor_id) ||
261		     (ent->subvendor_id == PCI_ANY_ID)) &&
262
263		    ((pci_subdevice_id == ent->subdevice_id) ||
264		     (ent->subdevice_id == PCI_ANY_ID))) {
265			sprintf(adapter_name, "%s, Version - %s",
266				em_strings[ent->index],
267				em_driver_version);
268			device_set_desc_copy(dev, adapter_name);
269			return(0);
270		}
271		ent++;
272	}
273
274	return(ENXIO);
275}
276
277/*********************************************************************
278 *  Device initialization routine
279 *
280 *  The attach entry point is called when the driver is being loaded.
281 *  This routine identifies the type of hardware, allocates all resources
282 *  and initializes the hardware.
283 *
284 *  return 0 on success, positive on failure
285 *********************************************************************/
286
287static int
288em_attach(device_t dev)
289{
290	struct adapter * adapter;
291	int             tsize, rsize;
292	int		error = 0;
293
294	INIT_DEBUGOUT("em_attach: begin");
295
296	/* Allocate, clear, and link in our adapter structure */
297	if (!(adapter = device_get_softc(dev))) {
298		printf("em: adapter structure allocation failed\n");
299		return(ENOMEM);
300	}
301	bzero(adapter, sizeof(struct adapter ));
302	adapter->dev = dev;
303	adapter->osdep.dev = dev;
304	adapter->unit = device_get_unit(dev);
305	EM_LOCK_INIT(adapter, device_get_nameunit(dev));
306
307	if (em_adapter_list != NULL)
308		em_adapter_list->prev = adapter;
309	adapter->next = em_adapter_list;
310	em_adapter_list = adapter;
311
312	/* SYSCTL stuff */
313        sysctl_ctx_init(&adapter->sysctl_ctx);
314        adapter->sysctl_tree = SYSCTL_ADD_NODE(&adapter->sysctl_ctx,
315                                               SYSCTL_STATIC_CHILDREN(_hw),
316                                               OID_AUTO,
317                                               device_get_nameunit(dev),
318                                               CTLFLAG_RD,
319                                               0, "");
320        if (adapter->sysctl_tree == NULL) {
321                error = EIO;
322                goto err_sysctl;
323        }
324
325        SYSCTL_ADD_PROC(&adapter->sysctl_ctx,
326                        SYSCTL_CHILDREN(adapter->sysctl_tree),
327                        OID_AUTO, "debug_info", CTLTYPE_INT|CTLFLAG_RW,
328                        (void *)adapter, 0,
329                        em_sysctl_debug_info, "I", "Debug Information");
330
331        SYSCTL_ADD_PROC(&adapter->sysctl_ctx,
332                        SYSCTL_CHILDREN(adapter->sysctl_tree),
333                        OID_AUTO, "stats", CTLTYPE_INT|CTLFLAG_RW,
334                        (void *)adapter, 0,
335                        em_sysctl_stats, "I", "Statistics");
336
337	callout_init(&adapter->timer, CALLOUT_MPSAFE);
338	callout_init(&adapter->tx_fifo_timer, CALLOUT_MPSAFE);
339
340	/* Determine hardware revision */
341	em_identify_hardware(adapter);
342
343	/* Set up some sysctls for the tunable interrupt delays */
344	em_add_int_delay_sysctl(adapter, "rx_int_delay",
345	    "receive interrupt delay in usecs", &adapter->rx_int_delay,
346	    E1000_REG_OFFSET(&adapter->hw, RDTR), em_rx_int_delay_dflt);
347	em_add_int_delay_sysctl(adapter, "tx_int_delay",
348	    "transmit interrupt delay in usecs", &adapter->tx_int_delay,
349	    E1000_REG_OFFSET(&adapter->hw, TIDV), em_tx_int_delay_dflt);
350	if (adapter->hw.mac_type >= em_82540) {
351		em_add_int_delay_sysctl(adapter, "rx_abs_int_delay",
352		    "receive interrupt delay limit in usecs",
353		    &adapter->rx_abs_int_delay,
354		    E1000_REG_OFFSET(&adapter->hw, RADV),
355		    em_rx_abs_int_delay_dflt);
356		em_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
357		    "transmit interrupt delay limit in usecs",
358		    &adapter->tx_abs_int_delay,
359		    E1000_REG_OFFSET(&adapter->hw, TADV),
360		    em_tx_abs_int_delay_dflt);
361	}
362
363	/* Parameters (to be read from user) */
364        adapter->num_tx_desc = EM_MAX_TXD;
365        adapter->num_rx_desc = EM_MAX_RXD;
366        adapter->hw.autoneg = DO_AUTO_NEG;
367        adapter->hw.wait_autoneg_complete = WAIT_FOR_AUTO_NEG_DEFAULT;
368        adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
369        adapter->hw.tbi_compatibility_en = TRUE;
370        adapter->rx_buffer_len = EM_RXBUFFER_2048;
371
372	/*
373         * These parameters control the automatic generation(Tx) and
374         * response(Rx) to Ethernet PAUSE frames.
375         */
376        adapter->hw.fc_high_water = FC_DEFAULT_HI_THRESH;
377        adapter->hw.fc_low_water  = FC_DEFAULT_LO_THRESH;
378        adapter->hw.fc_pause_time = FC_DEFAULT_TX_TIMER;
379        adapter->hw.fc_send_xon   = TRUE;
380        adapter->hw.fc = em_fc_full;
381
382	adapter->hw.phy_init_script = 1;
383	adapter->hw.phy_reset_disable = FALSE;
384
385#ifndef EM_MASTER_SLAVE
386	adapter->hw.master_slave = em_ms_hw_default;
387#else
388	adapter->hw.master_slave = EM_MASTER_SLAVE;
389#endif
390	/*
391	 * Set the max frame size assuming standard ethernet
392	 * sized frames
393	 */
394	adapter->hw.max_frame_size =
395		ETHERMTU + ETHER_HDR_LEN + ETHER_CRC_LEN;
396
397	adapter->hw.min_frame_size =
398		MINIMUM_ETHERNET_PACKET_SIZE + ETHER_CRC_LEN;
399
400	/*
401	 * This controls when hardware reports transmit completion
402	 * status.
403	 */
404	adapter->hw.report_tx_early = 1;
405
406
407	if (em_allocate_pci_resources(adapter)) {
408		printf("em%d: Allocation of PCI resources failed\n",
409		       adapter->unit);
410                error = ENXIO;
411                goto err_pci;
412	}
413
414
415	/* Initialize eeprom parameters */
416        em_init_eeprom_params(&adapter->hw);
417
418	tsize = EM_ROUNDUP(adapter->num_tx_desc *
419			   sizeof(struct em_tx_desc), 4096);
420
421	/* Allocate Transmit Descriptor ring */
422        if (em_dma_malloc(adapter, tsize, &adapter->txdma, BUS_DMA_NOWAIT)) {
423                printf("em%d: Unable to allocate tx_desc memory\n",
424                       adapter->unit);
425		error = ENOMEM;
426                goto err_tx_desc;
427        }
428        adapter->tx_desc_base = (struct em_tx_desc *) adapter->txdma.dma_vaddr;
429
430	rsize = EM_ROUNDUP(adapter->num_rx_desc *
431			   sizeof(struct em_rx_desc), 4096);
432
433	/* Allocate Receive Descriptor ring */
434        if (em_dma_malloc(adapter, rsize, &adapter->rxdma, BUS_DMA_NOWAIT)) {
435                printf("em%d: Unable to allocate rx_desc memory\n",
436                        adapter->unit);
437		error = ENOMEM;
438                goto err_rx_desc;
439        }
440        adapter->rx_desc_base = (struct em_rx_desc *) adapter->rxdma.dma_vaddr;
441
442	/* Initialize the hardware */
443	if (em_hardware_init(adapter)) {
444		printf("em%d: Unable to initialize the hardware\n",
445		       adapter->unit);
446		error = EIO;
447                goto err_hw_init;
448	}
449
450	/* Copy the permanent MAC address out of the EEPROM */
451	if (em_read_mac_addr(&adapter->hw) < 0) {
452		printf("em%d: EEPROM read error while reading mac address\n",
453		       adapter->unit);
454		error = EIO;
455                goto err_mac_addr;
456	}
457
458	if (!em_is_valid_ether_addr(adapter->hw.mac_addr)) {
459                printf("em%d: Invalid mac address\n", adapter->unit);
460                error = EIO;
461                goto err_mac_addr;
462        }
463
464	bcopy(adapter->hw.mac_addr, adapter->interface_data.ac_enaddr,
465	      ETHER_ADDR_LEN);
466
467	/* Setup OS specific network interface */
468	em_setup_interface(dev, adapter);
469
470	/* Initialize statistics */
471	em_clear_hw_cntrs(&adapter->hw);
472	em_update_stats_counters(adapter);
473	adapter->hw.get_link_status = 1;
474	em_check_for_link(&adapter->hw);
475
476	/* Print the link status */
477	if (adapter->link_active == 1) {
478		em_get_speed_and_duplex(&adapter->hw, &adapter->link_speed,
479					&adapter->link_duplex);
480		printf("em%d:  Speed:%d Mbps  Duplex:%s\n",
481		       adapter->unit,
482		       adapter->link_speed,
483		       adapter->link_duplex == FULL_DUPLEX ? "Full" : "Half");
484	} else
485		printf("em%d:  Speed:N/A  Duplex:N/A\n", adapter->unit);
486
487	/* Identify 82544 on PCIX */
488        em_get_bus_info(&adapter->hw);
489        if(adapter->hw.bus_type == em_bus_type_pcix &&
490           adapter->hw.mac_type == em_82544) {
491                adapter->pcix_82544 = TRUE;
492        }
493        else {
494                adapter->pcix_82544 = FALSE;
495        }
496	INIT_DEBUGOUT("em_attach: end");
497	return(0);
498
499err_mac_addr:
500err_hw_init:
501        em_dma_free(adapter, &adapter->rxdma);
502err_rx_desc:
503        em_dma_free(adapter, &adapter->txdma);
504err_tx_desc:
505err_pci:
506        em_free_pci_resources(adapter);
507        sysctl_ctx_free(&adapter->sysctl_ctx);
508err_sysctl:
509        return(error);
510
511}
512
513/*********************************************************************
514 *  Device removal routine
515 *
516 *  The detach entry point is called when the driver is being removed.
517 *  This routine stops the adapter and deallocates all the resources
518 *  that were allocated for driver operation.
519 *
520 *  return 0 on success, positive on failure
521 *********************************************************************/
522
523static int
524em_detach(device_t dev)
525{
526	struct adapter * adapter = device_get_softc(dev);
527	struct ifnet   *ifp = &adapter->interface_data.ac_if;
528
529	INIT_DEBUGOUT("em_detach: begin");
530
531	EM_LOCK(adapter);
532	adapter->in_detach = 1;
533	em_stop(adapter);
534	em_phy_hw_reset(&adapter->hw);
535	EM_UNLOCK(adapter);
536#if __FreeBSD_version < 500000
537        ether_ifdetach(&adapter->interface_data.ac_if, ETHER_BPF_SUPPORTED);
538#else
539        ether_ifdetach(&adapter->interface_data.ac_if);
540#endif
541	em_free_pci_resources(adapter);
542	bus_generic_detach(dev);
543
544	/* Free Transmit Descriptor ring */
545        if (adapter->tx_desc_base) {
546                em_dma_free(adapter, &adapter->txdma);
547                adapter->tx_desc_base = NULL;
548        }
549
550        /* Free Receive Descriptor ring */
551        if (adapter->rx_desc_base) {
552                em_dma_free(adapter, &adapter->rxdma);
553                adapter->rx_desc_base = NULL;
554        }
555
556	/* Free the sysctl tree */
557	sysctl_ctx_free(&adapter->sysctl_ctx);
558
559	/* Remove from the adapter list */
560	if (em_adapter_list == adapter)
561		em_adapter_list = adapter->next;
562	if (adapter->next != NULL)
563		adapter->next->prev = adapter->prev;
564	if (adapter->prev != NULL)
565		adapter->prev->next = adapter->next;
566
567	EM_LOCK_DESTROY(adapter);
568
569	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
570	ifp->if_timer = 0;
571
572	return(0);
573}
574
575/*********************************************************************
576 *
577 *  Shutdown entry point
578 *
579 **********************************************************************/
580
581static int
582em_shutdown(device_t dev)
583{
584	struct adapter *adapter = device_get_softc(dev);
585	EM_LOCK(adapter);
586	em_stop(adapter);
587	EM_UNLOCK(adapter);
588	return(0);
589}
590
591
592/*********************************************************************
593 *  Transmit entry point
594 *
595 *  em_start is called by the stack to initiate a transmit.
596 *  The driver will remain in this routine as long as there are
597 *  packets to transmit and transmit resources are available.
598 *  In case resources are not available stack is notified and
599 *  the packet is requeued.
600 **********************************************************************/
601
602static void
603em_start_locked(struct ifnet *ifp)
604{
605        struct mbuf    *m_head;
606        struct adapter *adapter = ifp->if_softc;
607
608	mtx_assert(&adapter->mtx, MA_OWNED);
609
610        if (!adapter->link_active)
611                return;
612
613        while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
614
615                IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
616
617                if (m_head == NULL) break;
618
619		if (em_encap(adapter, m_head)) {
620			ifp->if_flags |= IFF_OACTIVE;
621			IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
622			break;
623                }
624
625		/* Send a copy of the frame to the BPF listener */
626#if __FreeBSD_version < 500000
627                if (ifp->if_bpf)
628                        bpf_mtap(ifp, m_head);
629#else
630		BPF_MTAP(ifp, m_head);
631#endif
632
633                /* Set timeout in case hardware has problems transmitting */
634                ifp->if_timer = EM_TX_TIMEOUT;
635
636        }
637        return;
638}
639
640static void
641em_start(struct ifnet *ifp)
642{
643	struct adapter *adapter = ifp->if_softc;
644
645	EM_LOCK(adapter);
646	em_start_locked(ifp);
647	EM_UNLOCK(adapter);
648	return;
649}
650
651/*********************************************************************
652 *  Ioctl entry point
653 *
654 *  em_ioctl is called when the user wants to configure the
655 *  interface.
656 *
657 *  return 0 on success, positive on failure
658 **********************************************************************/
659
660static int
661em_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
662{
663	int             mask, reinit, error = 0;
664	struct ifreq   *ifr = (struct ifreq *) data;
665	struct adapter * adapter = ifp->if_softc;
666
667	if (adapter->in_detach) return(error);
668
669	switch (command) {
670	case SIOCSIFADDR:
671	case SIOCGIFADDR:
672		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFADDR (Get/Set Interface Addr)");
673		ether_ioctl(ifp, command, data);
674		break;
675	case SIOCSIFMTU:
676		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
677		if (ifr->ifr_mtu > MAX_JUMBO_FRAME_SIZE - ETHER_HDR_LEN) {
678			error = EINVAL;
679		} else {
680			EM_LOCK(adapter);
681			ifp->if_mtu = ifr->ifr_mtu;
682			adapter->hw.max_frame_size =
683			ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
684			em_init_locked(adapter);
685			EM_UNLOCK(adapter);
686		}
687		break;
688	case SIOCSIFFLAGS:
689		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)");
690		EM_LOCK(adapter);
691		if (ifp->if_flags & IFF_UP) {
692			if (!(ifp->if_flags & IFF_RUNNING)) {
693				em_init_locked(adapter);
694			}
695
696			em_disable_promisc(adapter);
697			em_set_promisc(adapter);
698		} else {
699			if (ifp->if_flags & IFF_RUNNING) {
700				em_stop(adapter);
701			}
702		}
703		EM_UNLOCK(adapter);
704		break;
705	case SIOCADDMULTI:
706	case SIOCDELMULTI:
707		IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI");
708		if (ifp->if_flags & IFF_RUNNING) {
709			EM_LOCK(adapter);
710			em_disable_intr(adapter);
711			em_set_multi(adapter);
712			if (adapter->hw.mac_type == em_82542_rev2_0) {
713				em_initialize_receive_unit(adapter);
714			}
715#ifdef DEVICE_POLLING
716                        if (!(ifp->if_flags & IFF_POLLING))
717#endif
718				em_enable_intr(adapter);
719			EM_UNLOCK(adapter);
720		}
721		break;
722	case SIOCSIFMEDIA:
723	case SIOCGIFMEDIA:
724		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFMEDIA (Get/Set Interface Media)");
725		error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
726		break;
727	case SIOCSIFCAP:
728		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)");
729		reinit = 0;
730		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
731		if (mask & IFCAP_POLLING)
732			ifp->if_capenable ^= IFCAP_POLLING;
733		if (mask & IFCAP_HWCSUM) {
734			ifp->if_capenable ^= IFCAP_HWCSUM;
735			reinit = 1;
736		}
737		if (mask & IFCAP_VLAN_HWTAGGING) {
738			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
739			reinit = 1;
740		}
741		if (reinit && (ifp->if_flags & IFF_RUNNING))
742			em_init(adapter);
743		break;
744	default:
745		IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%x)", (int)command);
746		error = EINVAL;
747	}
748
749	return(error);
750}
751
752/*********************************************************************
753 *  Watchdog entry point
754 *
755 *  This routine is called whenever hardware quits transmitting.
756 *
757 **********************************************************************/
758
759static void
760em_watchdog(struct ifnet *ifp)
761{
762	struct adapter * adapter;
763	adapter = ifp->if_softc;
764
765	/* If we are in this routine because of pause frames, then
766	 * don't reset the hardware.
767	 */
768	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF) {
769		ifp->if_timer = EM_TX_TIMEOUT;
770		return;
771	}
772
773	if (em_check_for_link(&adapter->hw))
774		printf("em%d: watchdog timeout -- resetting\n", adapter->unit);
775
776	ifp->if_flags &= ~IFF_RUNNING;
777
778	em_init(adapter);
779
780	ifp->if_oerrors++;
781	return;
782}
783
784/*********************************************************************
785 *  Init entry point
786 *
787 *  This routine is used in two ways. It is used by the stack as
788 *  init entry point in network interface structure. It is also used
789 *  by the driver as a hw/sw initialization routine to get to a
790 *  consistent state.
791 *
792 *  return 0 on success, positive on failure
793 **********************************************************************/
794
795static void
796em_init_locked(struct adapter * adapter)
797{
798	struct ifnet   *ifp;
799
800	uint32_t	pba;
801	ifp = &adapter->interface_data.ac_if;
802
803	INIT_DEBUGOUT("em_init: begin");
804
805	mtx_assert(&adapter->mtx, MA_OWNED);
806
807	em_stop(adapter);
808
809	/* Packet Buffer Allocation (PBA)
810	 * Writing PBA sets the receive portion of the buffer
811	 * the remainder is used for the transmit buffer.
812	 *
813	 * Devices before the 82547 had a Packet Buffer of 64K.
814	 *   Default allocation: PBA=48K for Rx, leaving 16K for Tx.
815	 * After the 82547 the buffer was reduced to 40K.
816	 *   Default allocation: PBA=30K for Rx, leaving 10K for Tx.
817	 *   Note: default does not leave enough room for Jumbo Frame >10k.
818	 */
819	if(adapter->hw.mac_type < em_82547) {
820		/* Total FIFO is 64K */
821		if(adapter->rx_buffer_len > EM_RXBUFFER_8192)
822			pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */
823		else
824			pba = E1000_PBA_48K; /* 48K for Rx, 16K for Tx */
825	} else {
826		/* Total FIFO is 40K */
827		if(adapter->hw.max_frame_size > EM_RXBUFFER_8192) {
828			pba = E1000_PBA_22K; /* 22K for Rx, 18K for Tx */
829		} else {
830		        pba = E1000_PBA_30K; /* 30K for Rx, 10K for Tx */
831		}
832		adapter->tx_fifo_head = 0;
833		adapter->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT;
834		adapter->tx_fifo_size = (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT;
835	}
836	INIT_DEBUGOUT1("em_init: pba=%dK",pba);
837	E1000_WRITE_REG(&adapter->hw, PBA, pba);
838
839	/* Get the latest mac address, User can use a LAA */
840        bcopy(adapter->interface_data.ac_enaddr, adapter->hw.mac_addr,
841              ETHER_ADDR_LEN);
842
843	/* Initialize the hardware */
844	if (em_hardware_init(adapter)) {
845		printf("em%d: Unable to initialize the hardware\n",
846		       adapter->unit);
847		return;
848	}
849
850	if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING)
851		em_enable_vlans(adapter);
852
853	/* Prepare transmit descriptors and buffers */
854	if (em_setup_transmit_structures(adapter)) {
855		printf("em%d: Could not setup transmit structures\n",
856		       adapter->unit);
857		em_stop(adapter);
858		return;
859	}
860	em_initialize_transmit_unit(adapter);
861
862	/* Setup Multicast table */
863	em_set_multi(adapter);
864
865	/* Prepare receive descriptors and buffers */
866	if (em_setup_receive_structures(adapter)) {
867		printf("em%d: Could not setup receive structures\n",
868		       adapter->unit);
869		em_stop(adapter);
870		return;
871	}
872	em_initialize_receive_unit(adapter);
873
874	/* Don't loose promiscuous settings */
875	em_set_promisc(adapter);
876
877	ifp->if_flags |= IFF_RUNNING;
878	ifp->if_flags &= ~IFF_OACTIVE;
879
880	if (adapter->hw.mac_type >= em_82543) {
881		if (ifp->if_capenable & IFCAP_TXCSUM)
882			ifp->if_hwassist = EM_CHECKSUM_FEATURES;
883		else
884			ifp->if_hwassist = 0;
885	}
886
887	callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
888	em_clear_hw_cntrs(&adapter->hw);
889#ifdef DEVICE_POLLING
890        /*
891         * Only enable interrupts if we are not polling, make sure
892         * they are off otherwise.
893         */
894        if (ifp->if_flags & IFF_POLLING)
895                em_disable_intr(adapter);
896        else
897#endif /* DEVICE_POLLING */
898		em_enable_intr(adapter);
899
900	/* Don't reset the phy next time init gets called */
901	adapter->hw.phy_reset_disable = TRUE;
902
903	return;
904}
905
906static void
907em_init(void *arg)
908{
909	struct adapter * adapter = arg;
910
911	EM_LOCK(adapter);
912	em_init_locked(adapter);
913	EM_UNLOCK(adapter);
914	return;
915}
916
917
918#ifdef DEVICE_POLLING
919static poll_handler_t em_poll;
920
921static void
922em_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
923{
924        struct adapter *adapter = ifp->if_softc;
925        u_int32_t reg_icr;
926
927	mtx_assert(&adapter->mtx, MA_OWNED);
928
929	if (!(ifp->if_capenable & IFCAP_POLLING)) {
930		ether_poll_deregister(ifp);
931		cmd = POLL_DEREGISTER;
932	}
933        if (cmd == POLL_DEREGISTER) {       /* final call, enable interrupts */
934                em_enable_intr(adapter);
935                return;
936        }
937        if (cmd == POLL_AND_CHECK_STATUS) {
938                reg_icr = E1000_READ_REG(&adapter->hw, ICR);
939                if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
940			callout_stop(&adapter->timer);
941                        adapter->hw.get_link_status = 1;
942                        em_check_for_link(&adapter->hw);
943                        em_print_link_status(adapter);
944			callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
945                }
946        }
947        if (ifp->if_flags & IFF_RUNNING) {
948                em_process_receive_interrupts(adapter, count);
949                em_clean_transmit_interrupts(adapter);
950        }
951
952        if (ifp->if_flags & IFF_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
953                em_start_locked(ifp);
954}
955
956static void
957em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
958{
959        struct adapter *adapter = ifp->if_softc;
960
961	EM_LOCK(adapter);
962	em_poll_locked(ifp, cmd, count);
963	EM_UNLOCK(adapter);
964}
965#endif /* DEVICE_POLLING */
966
967/*********************************************************************
968 *
969 *  Interrupt Service routine
970 *
971 **********************************************************************/
972static void
973em_intr(void *arg)
974{
975        u_int32_t       loop_cnt = EM_MAX_INTR;
976        u_int32_t       reg_icr;
977        struct ifnet    *ifp;
978        struct adapter  *adapter = arg;
979
980	EM_LOCK(adapter);
981
982        ifp = &adapter->interface_data.ac_if;
983
984#ifdef DEVICE_POLLING
985        if (ifp->if_flags & IFF_POLLING) {
986		EM_UNLOCK(adapter);
987                return;
988	}
989
990	if ((ifp->if_capenable & IFCAP_POLLING) &&
991	    ether_poll_register(em_poll, ifp)) {
992                em_disable_intr(adapter);
993                em_poll_locked(ifp, 0, 1);
994		EM_UNLOCK(adapter);
995                return;
996        }
997#endif /* DEVICE_POLLING */
998
999	reg_icr = E1000_READ_REG(&adapter->hw, ICR);
1000        if (!reg_icr) {
1001		EM_UNLOCK(adapter);
1002                return;
1003        }
1004
1005        /* Link status change */
1006        if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
1007		callout_stop(&adapter->timer);
1008                adapter->hw.get_link_status = 1;
1009                em_check_for_link(&adapter->hw);
1010                em_print_link_status(adapter);
1011		callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
1012        }
1013
1014        while (loop_cnt > 0) {
1015                if (ifp->if_flags & IFF_RUNNING) {
1016                        em_process_receive_interrupts(adapter, -1);
1017                        em_clean_transmit_interrupts(adapter);
1018                }
1019                loop_cnt--;
1020        }
1021
1022        if (ifp->if_flags & IFF_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1023                em_start_locked(ifp);
1024
1025	EM_UNLOCK(adapter);
1026        return;
1027}
1028
1029
1030
1031/*********************************************************************
1032 *
1033 *  Media Ioctl callback
1034 *
1035 *  This routine is called whenever the user queries the status of
1036 *  the interface using ifconfig.
1037 *
1038 **********************************************************************/
1039static void
1040em_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1041{
1042	struct adapter * adapter = ifp->if_softc;
1043
1044	INIT_DEBUGOUT("em_media_status: begin");
1045
1046	em_check_for_link(&adapter->hw);
1047	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
1048		if (adapter->link_active == 0) {
1049			em_get_speed_and_duplex(&adapter->hw,
1050						&adapter->link_speed,
1051						&adapter->link_duplex);
1052			adapter->link_active = 1;
1053		}
1054	} else {
1055		if (adapter->link_active == 1) {
1056			adapter->link_speed = 0;
1057			adapter->link_duplex = 0;
1058			adapter->link_active = 0;
1059		}
1060	}
1061
1062	ifmr->ifm_status = IFM_AVALID;
1063	ifmr->ifm_active = IFM_ETHER;
1064
1065	if (!adapter->link_active)
1066		return;
1067
1068	ifmr->ifm_status |= IFM_ACTIVE;
1069
1070	if (adapter->hw.media_type == em_media_type_fiber) {
1071		ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
1072	} else {
1073		switch (adapter->link_speed) {
1074		case 10:
1075			ifmr->ifm_active |= IFM_10_T;
1076			break;
1077		case 100:
1078			ifmr->ifm_active |= IFM_100_TX;
1079			break;
1080		case 1000:
1081#if __FreeBSD_version < 500000
1082			ifmr->ifm_active |= IFM_1000_TX;
1083#else
1084			ifmr->ifm_active |= IFM_1000_T;
1085#endif
1086			break;
1087		}
1088		if (adapter->link_duplex == FULL_DUPLEX)
1089			ifmr->ifm_active |= IFM_FDX;
1090		else
1091			ifmr->ifm_active |= IFM_HDX;
1092	}
1093	return;
1094}
1095
1096/*********************************************************************
1097 *
1098 *  Media Ioctl callback
1099 *
1100 *  This routine is called when the user changes speed/duplex using
1101 *  media/mediopt option with ifconfig.
1102 *
1103 **********************************************************************/
1104static int
1105em_media_change(struct ifnet *ifp)
1106{
1107	struct adapter * adapter = ifp->if_softc;
1108	struct ifmedia  *ifm = &adapter->media;
1109
1110	INIT_DEBUGOUT("em_media_change: begin");
1111
1112	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1113		return(EINVAL);
1114
1115	switch (IFM_SUBTYPE(ifm->ifm_media)) {
1116	case IFM_AUTO:
1117		adapter->hw.autoneg = DO_AUTO_NEG;
1118		adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
1119		break;
1120	case IFM_1000_SX:
1121#if __FreeBSD_version < 500000
1122	case IFM_1000_TX:
1123#else
1124	case IFM_1000_T:
1125#endif
1126		adapter->hw.autoneg = DO_AUTO_NEG;
1127		adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
1128		break;
1129	case IFM_100_TX:
1130		adapter->hw.autoneg = FALSE;
1131		adapter->hw.autoneg_advertised = 0;
1132		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1133			adapter->hw.forced_speed_duplex = em_100_full;
1134		else
1135			adapter->hw.forced_speed_duplex	= em_100_half;
1136		break;
1137	case IFM_10_T:
1138		adapter->hw.autoneg = FALSE;
1139		adapter->hw.autoneg_advertised = 0;
1140		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1141			adapter->hw.forced_speed_duplex = em_10_full;
1142		else
1143			adapter->hw.forced_speed_duplex	= em_10_half;
1144		break;
1145	default:
1146		printf("em%d: Unsupported media type\n", adapter->unit);
1147	}
1148
1149	/* As the speed/duplex settings my have changed we need to
1150	 * reset the PHY.
1151	 */
1152	adapter->hw.phy_reset_disable = FALSE;
1153
1154	em_init(adapter);
1155
1156	return(0);
1157}
1158
1159static void
1160em_tx_cb(void *arg, bus_dma_segment_t *seg, int nsegs, bus_size_t mapsize, int error)
1161{
1162        struct em_q *q = arg;
1163
1164        if (error)
1165                return;
1166        KASSERT(nsegs <= EM_MAX_SCATTER,
1167                ("Too many DMA segments returned when mapping tx packet"));
1168        q->nsegs = nsegs;
1169        bcopy(seg, q->segs, nsegs * sizeof(seg[0]));
1170}
1171
1172/*********************************************************************
1173 *
1174 *  This routine maps the mbufs to tx descriptors.
1175 *
1176 *  return 0 on success, positive on failure
1177 **********************************************************************/
1178static int
1179em_encap(struct adapter *adapter, struct mbuf *m_head)
1180{
1181        u_int32_t       txd_upper;
1182        u_int32_t       txd_lower, txd_used = 0, txd_saved = 0;
1183        int             i, j, error;
1184        u_int64_t       address;
1185
1186	/* For 82544 Workaround */
1187	DESC_ARRAY              desc_array;
1188	u_int32_t               array_elements;
1189	u_int32_t               counter;
1190
1191#if __FreeBSD_version < 500000
1192        struct ifvlan *ifv = NULL;
1193#else
1194        struct m_tag    *mtag;
1195#endif
1196        struct em_q      q;
1197        struct em_buffer   *tx_buffer = NULL;
1198        struct em_tx_desc *current_tx_desc = NULL;
1199        struct ifnet   *ifp = &adapter->interface_data.ac_if;
1200
1201        /*
1202         * Force a cleanup if number of TX descriptors
1203         * available hits the threshold
1204         */
1205        if (adapter->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
1206                em_clean_transmit_interrupts(adapter);
1207                if (adapter->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
1208                        adapter->no_tx_desc_avail1++;
1209                        return(ENOBUFS);
1210                }
1211        }
1212
1213        /*
1214         * Map the packet for DMA.
1215         */
1216        if (bus_dmamap_create(adapter->txtag, BUS_DMA_NOWAIT, &q.map)) {
1217                adapter->no_tx_map_avail++;
1218                return (ENOMEM);
1219        }
1220        error = bus_dmamap_load_mbuf(adapter->txtag, q.map,
1221                                     m_head, em_tx_cb, &q, BUS_DMA_NOWAIT);
1222        if (error != 0) {
1223                adapter->no_tx_dma_setup++;
1224                bus_dmamap_destroy(adapter->txtag, q.map);
1225                return (error);
1226        }
1227        KASSERT(q.nsegs != 0, ("em_encap: empty packet"));
1228
1229        if (q.nsegs > adapter->num_tx_desc_avail) {
1230                adapter->no_tx_desc_avail2++;
1231                bus_dmamap_destroy(adapter->txtag, q.map);
1232                return (ENOBUFS);
1233        }
1234
1235
1236        if (ifp->if_hwassist > 0) {
1237                em_transmit_checksum_setup(adapter,  m_head,
1238                                           &txd_upper, &txd_lower);
1239        } else
1240                txd_upper = txd_lower = 0;
1241
1242
1243        /* Find out if we are in vlan mode */
1244#if __FreeBSD_version < 500000
1245        if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
1246            m_head->m_pkthdr.rcvif != NULL &&
1247            m_head->m_pkthdr.rcvif->if_type == IFT_L2VLAN)
1248                ifv = m_head->m_pkthdr.rcvif->if_softc;
1249#else
1250        mtag = VLAN_OUTPUT_TAG(ifp, m_head);
1251#endif
1252
1253        i = adapter->next_avail_tx_desc;
1254	if (adapter->pcix_82544) {
1255		txd_saved = i;
1256		txd_used = 0;
1257	}
1258        for (j = 0; j < q.nsegs; j++) {
1259		/* If adapter is 82544 and on PCIX bus */
1260		if(adapter->pcix_82544) {
1261			array_elements = 0;
1262			address = htole64(q.segs[j].ds_addr);
1263			/*
1264			 * Check the Address and Length combination and
1265			 * split the data accordingly
1266			 */
1267                        array_elements = em_fill_descriptors(address,
1268							     htole32(q.segs[j].ds_len),
1269							     &desc_array);
1270			for (counter = 0; counter < array_elements; counter++) {
1271                                if (txd_used == adapter->num_tx_desc_avail) {
1272                                         adapter->next_avail_tx_desc = txd_saved;
1273                                          adapter->no_tx_desc_avail2++;
1274					  bus_dmamap_destroy(adapter->txtag, q.map);
1275                                          return (ENOBUFS);
1276                                }
1277                                tx_buffer = &adapter->tx_buffer_area[i];
1278                                current_tx_desc = &adapter->tx_desc_base[i];
1279                                current_tx_desc->buffer_addr = htole64(
1280					desc_array.descriptor[counter].address);
1281                                current_tx_desc->lower.data = htole32(
1282					(adapter->txd_cmd | txd_lower |
1283					 (u_int16_t)desc_array.descriptor[counter].length));
1284                                current_tx_desc->upper.data = htole32((txd_upper));
1285                                if (++i == adapter->num_tx_desc)
1286                                         i = 0;
1287
1288                                tx_buffer->m_head = NULL;
1289                                txd_used++;
1290                        }
1291		} else {
1292			tx_buffer = &adapter->tx_buffer_area[i];
1293			current_tx_desc = &adapter->tx_desc_base[i];
1294
1295			current_tx_desc->buffer_addr = htole64(q.segs[j].ds_addr);
1296			current_tx_desc->lower.data = htole32(
1297				adapter->txd_cmd | txd_lower | q.segs[j].ds_len);
1298			current_tx_desc->upper.data = htole32(txd_upper);
1299
1300			if (++i == adapter->num_tx_desc)
1301				i = 0;
1302
1303			tx_buffer->m_head = NULL;
1304		}
1305        }
1306
1307	adapter->next_avail_tx_desc = i;
1308	if (adapter->pcix_82544) {
1309		adapter->num_tx_desc_avail -= txd_used;
1310	}
1311	else {
1312		adapter->num_tx_desc_avail -= q.nsegs;
1313	}
1314
1315#if __FreeBSD_version < 500000
1316        if (ifv != NULL) {
1317                /* Set the vlan id */
1318                current_tx_desc->upper.fields.special = htole16(ifv->ifv_tag);
1319#else
1320        if (mtag != NULL) {
1321                /* Set the vlan id */
1322                current_tx_desc->upper.fields.special = htole16(VLAN_TAG_VALUE(mtag));
1323#endif
1324
1325                /* Tell hardware to add tag */
1326                current_tx_desc->lower.data |= htole32(E1000_TXD_CMD_VLE);
1327        }
1328
1329        tx_buffer->m_head = m_head;
1330        tx_buffer->map = q.map;
1331        bus_dmamap_sync(adapter->txtag, q.map, BUS_DMASYNC_PREWRITE);
1332
1333        /*
1334         * Last Descriptor of Packet needs End Of Packet (EOP)
1335         */
1336        current_tx_desc->lower.data |= htole32(E1000_TXD_CMD_EOP);
1337
1338        /*
1339         * Advance the Transmit Descriptor Tail (Tdt), this tells the E1000
1340         * that this frame is available to transmit.
1341         */
1342        if (adapter->hw.mac_type == em_82547 &&
1343            adapter->link_duplex == HALF_DUPLEX) {
1344                em_82547_move_tail_locked(adapter);
1345        } else {
1346                E1000_WRITE_REG(&adapter->hw, TDT, i);
1347                if (adapter->hw.mac_type == em_82547) {
1348                        em_82547_update_fifo_head(adapter, m_head->m_pkthdr.len);
1349                }
1350        }
1351
1352        return(0);
1353}
1354
1355/*********************************************************************
1356 *
1357 * 82547 workaround to avoid controller hang in half-duplex environment.
1358 * The workaround is to avoid queuing a large packet that would span
1359 * the internal Tx FIFO ring boundary. We need to reset the FIFO pointers
1360 * in this case. We do that only when FIFO is quiescent.
1361 *
1362 **********************************************************************/
1363static void
1364em_82547_move_tail_locked(struct adapter *adapter)
1365{
1366	uint16_t hw_tdt;
1367	uint16_t sw_tdt;
1368	struct em_tx_desc *tx_desc;
1369	uint16_t length = 0;
1370	boolean_t eop = 0;
1371
1372	EM_LOCK_ASSERT(adapter);
1373
1374	hw_tdt = E1000_READ_REG(&adapter->hw, TDT);
1375	sw_tdt = adapter->next_avail_tx_desc;
1376
1377	while (hw_tdt != sw_tdt) {
1378		tx_desc = &adapter->tx_desc_base[hw_tdt];
1379		length += tx_desc->lower.flags.length;
1380		eop = tx_desc->lower.data & E1000_TXD_CMD_EOP;
1381		if(++hw_tdt == adapter->num_tx_desc)
1382			hw_tdt = 0;
1383
1384		if(eop) {
1385			if (em_82547_fifo_workaround(adapter, length)) {
1386				adapter->tx_fifo_wrk_cnt++;
1387				callout_reset(&adapter->tx_fifo_timer, 1,
1388					em_82547_move_tail, adapter);
1389				break;
1390			}
1391			E1000_WRITE_REG(&adapter->hw, TDT, hw_tdt);
1392			em_82547_update_fifo_head(adapter, length);
1393			length = 0;
1394		}
1395	}
1396	return;
1397}
1398
1399static void
1400em_82547_move_tail(void *arg)
1401{
1402        struct adapter *adapter = arg;
1403
1404        EM_LOCK(adapter);
1405        em_82547_move_tail_locked(adapter);
1406        EM_UNLOCK(adapter);
1407}
1408
1409static int
1410em_82547_fifo_workaround(struct adapter *adapter, int len)
1411{
1412	int fifo_space, fifo_pkt_len;
1413
1414	fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
1415
1416	if (adapter->link_duplex == HALF_DUPLEX) {
1417		fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
1418
1419		if (fifo_pkt_len >= (EM_82547_PKT_THRESH + fifo_space)) {
1420			if (em_82547_tx_fifo_reset(adapter)) {
1421				return(0);
1422			}
1423			else {
1424				return(1);
1425			}
1426		}
1427	}
1428
1429	return(0);
1430}
1431
1432static void
1433em_82547_update_fifo_head(struct adapter *adapter, int len)
1434{
1435	int fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
1436
1437	/* tx_fifo_head is always 16 byte aligned */
1438	adapter->tx_fifo_head += fifo_pkt_len;
1439	if (adapter->tx_fifo_head >= adapter->tx_fifo_size) {
1440		adapter->tx_fifo_head -= adapter->tx_fifo_size;
1441	}
1442
1443	return;
1444}
1445
1446
1447static int
1448em_82547_tx_fifo_reset(struct adapter *adapter)
1449{
1450	uint32_t tctl;
1451
1452	if ( (E1000_READ_REG(&adapter->hw, TDT) ==
1453	      E1000_READ_REG(&adapter->hw, TDH)) &&
1454	     (E1000_READ_REG(&adapter->hw, TDFT) ==
1455	      E1000_READ_REG(&adapter->hw, TDFH)) &&
1456	     (E1000_READ_REG(&adapter->hw, TDFTS) ==
1457	      E1000_READ_REG(&adapter->hw, TDFHS)) &&
1458	     (E1000_READ_REG(&adapter->hw, TDFPC) == 0)) {
1459
1460		/* Disable TX unit */
1461		tctl = E1000_READ_REG(&adapter->hw, TCTL);
1462		E1000_WRITE_REG(&adapter->hw, TCTL, tctl & ~E1000_TCTL_EN);
1463
1464		/* Reset FIFO pointers */
1465		E1000_WRITE_REG(&adapter->hw, TDFT,  adapter->tx_head_addr);
1466		E1000_WRITE_REG(&adapter->hw, TDFH,  adapter->tx_head_addr);
1467		E1000_WRITE_REG(&adapter->hw, TDFTS, adapter->tx_head_addr);
1468		E1000_WRITE_REG(&adapter->hw, TDFHS, adapter->tx_head_addr);
1469
1470		/* Re-enable TX unit */
1471		E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
1472		E1000_WRITE_FLUSH(&adapter->hw);
1473
1474		adapter->tx_fifo_head = 0;
1475		adapter->tx_fifo_reset_cnt++;
1476
1477		return(TRUE);
1478	}
1479	else {
1480		return(FALSE);
1481	}
1482}
1483
1484static void
1485em_set_promisc(struct adapter * adapter)
1486{
1487
1488	u_int32_t       reg_rctl;
1489	u_int32_t       ctrl;
1490	struct ifnet   *ifp = &adapter->interface_data.ac_if;
1491
1492	reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1493	ctrl = E1000_READ_REG(&adapter->hw, CTRL);
1494
1495	if (ifp->if_flags & IFF_PROMISC) {
1496		reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
1497		E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1498
1499		/* Disable VLAN stripping in promiscous mode
1500		 * This enables bridging of vlan tagged frames to occur
1501		 * and also allows vlan tags to be seen in tcpdump
1502		 */
1503		ctrl &= ~E1000_CTRL_VME;
1504		E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
1505
1506	} else if (ifp->if_flags & IFF_ALLMULTI) {
1507		reg_rctl |= E1000_RCTL_MPE;
1508		reg_rctl &= ~E1000_RCTL_UPE;
1509		E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1510	}
1511
1512	return;
1513}
1514
1515static void
1516em_disable_promisc(struct adapter * adapter)
1517{
1518	u_int32_t       reg_rctl;
1519
1520	reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1521
1522	reg_rctl &=  (~E1000_RCTL_UPE);
1523	reg_rctl &=  (~E1000_RCTL_MPE);
1524	E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1525
1526	em_enable_vlans(adapter);
1527	return;
1528}
1529
1530
1531/*********************************************************************
1532 *  Multicast Update
1533 *
1534 *  This routine is called whenever multicast address list is updated.
1535 *
1536 **********************************************************************/
1537
1538static void
1539em_set_multi(struct adapter * adapter)
1540{
1541        u_int32_t reg_rctl = 0;
1542        u_int8_t  mta[MAX_NUM_MULTICAST_ADDRESSES * ETH_LENGTH_OF_ADDRESS];
1543        struct ifmultiaddr  *ifma;
1544        int mcnt = 0;
1545        struct ifnet   *ifp = &adapter->interface_data.ac_if;
1546
1547        IOCTL_DEBUGOUT("em_set_multi: begin");
1548
1549        if (adapter->hw.mac_type == em_82542_rev2_0) {
1550                reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1551                if (adapter->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE) {
1552                        em_pci_clear_mwi(&adapter->hw);
1553                }
1554                reg_rctl |= E1000_RCTL_RST;
1555                E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1556                msec_delay(5);
1557        }
1558
1559#if __FreeBSD_version < 500000
1560        LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1561#else
1562        TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1563#endif
1564                if (ifma->ifma_addr->sa_family != AF_LINK)
1565                        continue;
1566
1567		if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) break;
1568
1569                bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
1570                      &mta[mcnt*ETH_LENGTH_OF_ADDRESS], ETH_LENGTH_OF_ADDRESS);
1571                mcnt++;
1572        }
1573
1574        if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
1575                reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1576                reg_rctl |= E1000_RCTL_MPE;
1577                E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1578        } else
1579                em_mc_addr_list_update(&adapter->hw, mta, mcnt, 0, 1);
1580
1581        if (adapter->hw.mac_type == em_82542_rev2_0) {
1582                reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1583                reg_rctl &= ~E1000_RCTL_RST;
1584                E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1585                msec_delay(5);
1586                if (adapter->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE) {
1587                        em_pci_set_mwi(&adapter->hw);
1588                }
1589        }
1590
1591        return;
1592}
1593
1594
1595/*********************************************************************
1596 *  Timer routine
1597 *
1598 *  This routine checks for link status and updates statistics.
1599 *
1600 **********************************************************************/
1601
1602static void
1603em_local_timer(void *arg)
1604{
1605	struct ifnet   *ifp;
1606	struct adapter * adapter = arg;
1607	ifp = &adapter->interface_data.ac_if;
1608
1609	EM_LOCK(adapter);
1610
1611	em_check_for_link(&adapter->hw);
1612	em_print_link_status(adapter);
1613	em_update_stats_counters(adapter);
1614	if (em_display_debug_stats && ifp->if_flags & IFF_RUNNING) {
1615		em_print_hw_stats(adapter);
1616	}
1617	em_smartspeed(adapter);
1618
1619	callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
1620
1621	EM_UNLOCK(adapter);
1622	return;
1623}
1624
1625static void
1626em_print_link_status(struct adapter * adapter)
1627{
1628	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
1629		if (adapter->link_active == 0) {
1630			em_get_speed_and_duplex(&adapter->hw,
1631						&adapter->link_speed,
1632						&adapter->link_duplex);
1633			printf("em%d: Link is up %d Mbps %s\n",
1634			       adapter->unit,
1635			       adapter->link_speed,
1636			       ((adapter->link_duplex == FULL_DUPLEX) ?
1637				"Full Duplex" : "Half Duplex"));
1638			adapter->link_active = 1;
1639			adapter->smartspeed = 0;
1640		}
1641	} else {
1642		if (adapter->link_active == 1) {
1643			adapter->link_speed = 0;
1644			adapter->link_duplex = 0;
1645			printf("em%d: Link is Down\n", adapter->unit);
1646			adapter->link_active = 0;
1647		}
1648	}
1649
1650	return;
1651}
1652
1653/*********************************************************************
1654 *
1655 *  This routine disables all traffic on the adapter by issuing a
1656 *  global reset on the MAC and deallocates TX/RX buffers.
1657 *
1658 **********************************************************************/
1659
1660static void
1661em_stop(void *arg)
1662{
1663	struct ifnet   *ifp;
1664	struct adapter * adapter = arg;
1665	ifp = &adapter->interface_data.ac_if;
1666
1667	mtx_assert(&adapter->mtx, MA_OWNED);
1668
1669	INIT_DEBUGOUT("em_stop: begin");
1670	em_disable_intr(adapter);
1671	em_reset_hw(&adapter->hw);
1672	callout_stop(&adapter->timer);
1673	callout_stop(&adapter->tx_fifo_timer);
1674	em_free_transmit_structures(adapter);
1675	em_free_receive_structures(adapter);
1676
1677
1678	/* Tell the stack that the interface is no longer active */
1679	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1680
1681	return;
1682}
1683
1684
1685/*********************************************************************
1686 *
1687 *  Determine hardware revision.
1688 *
1689 **********************************************************************/
1690static void
1691em_identify_hardware(struct adapter * adapter)
1692{
1693	device_t dev = adapter->dev;
1694
1695	/* Make sure our PCI config space has the necessary stuff set */
1696	adapter->hw.pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2);
1697	if (!((adapter->hw.pci_cmd_word & PCIM_CMD_BUSMASTEREN) &&
1698	      (adapter->hw.pci_cmd_word & PCIM_CMD_MEMEN))) {
1699		printf("em%d: Memory Access and/or Bus Master bits were not set!\n",
1700		       adapter->unit);
1701		adapter->hw.pci_cmd_word |=
1702		(PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN);
1703		pci_write_config(dev, PCIR_COMMAND, adapter->hw.pci_cmd_word, 2);
1704	}
1705
1706	/* Save off the information about this board */
1707	adapter->hw.vendor_id = pci_get_vendor(dev);
1708	adapter->hw.device_id = pci_get_device(dev);
1709	adapter->hw.revision_id = pci_read_config(dev, PCIR_REVID, 1);
1710	adapter->hw.subsystem_vendor_id = pci_read_config(dev, PCIR_SUBVEND_0, 2);
1711	adapter->hw.subsystem_id = pci_read_config(dev, PCIR_SUBDEV_0, 2);
1712
1713	/* Identify the MAC */
1714        if (em_set_mac_type(&adapter->hw))
1715                printf("em%d: Unknown MAC Type\n", adapter->unit);
1716
1717	if(adapter->hw.mac_type == em_82541 ||
1718	   adapter->hw.mac_type == em_82541_rev_2 ||
1719	   adapter->hw.mac_type == em_82547 ||
1720	   adapter->hw.mac_type == em_82547_rev_2)
1721		adapter->hw.phy_init_script = TRUE;
1722
1723        return;
1724}
1725
1726static int
1727em_allocate_pci_resources(struct adapter * adapter)
1728{
1729	int             i, val, rid;
1730	device_t        dev = adapter->dev;
1731
1732	rid = EM_MMBA;
1733	adapter->res_memory = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
1734						     &rid, RF_ACTIVE);
1735	if (!(adapter->res_memory)) {
1736		printf("em%d: Unable to allocate bus resource: memory\n",
1737		       adapter->unit);
1738		return(ENXIO);
1739	}
1740	adapter->osdep.mem_bus_space_tag =
1741	rman_get_bustag(adapter->res_memory);
1742	adapter->osdep.mem_bus_space_handle =
1743	rman_get_bushandle(adapter->res_memory);
1744	adapter->hw.hw_addr = (uint8_t *)&adapter->osdep.mem_bus_space_handle;
1745
1746
1747	if (adapter->hw.mac_type > em_82543) {
1748		/* Figure our where our IO BAR is ? */
1749		rid = EM_MMBA;
1750		for (i = 0; i < 5; i++) {
1751			val = pci_read_config(dev, rid, 4);
1752			if (val & 0x00000001) {
1753				adapter->io_rid = rid;
1754				break;
1755			}
1756			rid += 4;
1757		}
1758
1759		adapter->res_ioport = bus_alloc_resource_any(dev,
1760							     SYS_RES_IOPORT,
1761							     &adapter->io_rid,
1762							     RF_ACTIVE);
1763		if (!(adapter->res_ioport)) {
1764			printf("em%d: Unable to allocate bus resource: ioport\n",
1765			       adapter->unit);
1766			return(ENXIO);
1767		}
1768
1769		adapter->hw.io_base =
1770		rman_get_start(adapter->res_ioport);
1771	}
1772
1773	rid = 0x0;
1774	adapter->res_interrupt = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1775						        RF_SHAREABLE |
1776							RF_ACTIVE);
1777	if (!(adapter->res_interrupt)) {
1778		printf("em%d: Unable to allocate bus resource: interrupt\n",
1779		       adapter->unit);
1780		return(ENXIO);
1781	}
1782	if (bus_setup_intr(dev, adapter->res_interrupt,
1783			   INTR_TYPE_NET | INTR_MPSAFE,
1784			   (void (*)(void *)) em_intr, adapter,
1785			   &adapter->int_handler_tag)) {
1786		printf("em%d: Error registering interrupt handler!\n",
1787		       adapter->unit);
1788		return(ENXIO);
1789	}
1790
1791	adapter->hw.back = &adapter->osdep;
1792
1793	return(0);
1794}
1795
1796static void
1797em_free_pci_resources(struct adapter * adapter)
1798{
1799	device_t dev = adapter->dev;
1800
1801	if (adapter->res_interrupt != NULL) {
1802		bus_teardown_intr(dev, adapter->res_interrupt,
1803				  adapter->int_handler_tag);
1804		bus_release_resource(dev, SYS_RES_IRQ, 0,
1805				     adapter->res_interrupt);
1806	}
1807	if (adapter->res_memory != NULL) {
1808		bus_release_resource(dev, SYS_RES_MEMORY, EM_MMBA,
1809				     adapter->res_memory);
1810	}
1811
1812	if (adapter->res_ioport != NULL) {
1813		bus_release_resource(dev, SYS_RES_IOPORT, adapter->io_rid,
1814				     adapter->res_ioport);
1815	}
1816	return;
1817}
1818
1819/*********************************************************************
1820 *
1821 *  Initialize the hardware to a configuration as specified by the
1822 *  adapter structure. The controller is reset, the EEPROM is
1823 *  verified, the MAC address is set, then the shared initialization
1824 *  routines are called.
1825 *
1826 **********************************************************************/
1827static int
1828em_hardware_init(struct adapter * adapter)
1829{
1830        INIT_DEBUGOUT("em_hardware_init: begin");
1831	/* Issue a global reset */
1832	em_reset_hw(&adapter->hw);
1833
1834	/* When hardware is reset, fifo_head is also reset */
1835	adapter->tx_fifo_head = 0;
1836
1837	/* Make sure we have a good EEPROM before we read from it */
1838	if (em_validate_eeprom_checksum(&adapter->hw) < 0) {
1839		printf("em%d: The EEPROM Checksum Is Not Valid\n",
1840		       adapter->unit);
1841		return(EIO);
1842	}
1843
1844	if (em_read_part_num(&adapter->hw, &(adapter->part_num)) < 0) {
1845		printf("em%d: EEPROM read error while reading part number\n",
1846		       adapter->unit);
1847		return(EIO);
1848	}
1849
1850	if (em_init_hw(&adapter->hw) < 0) {
1851		printf("em%d: Hardware Initialization Failed",
1852		       adapter->unit);
1853		return(EIO);
1854	}
1855
1856	em_check_for_link(&adapter->hw);
1857	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)
1858		adapter->link_active = 1;
1859	else
1860		adapter->link_active = 0;
1861
1862	if (adapter->link_active) {
1863		em_get_speed_and_duplex(&adapter->hw,
1864					&adapter->link_speed,
1865					&adapter->link_duplex);
1866	} else {
1867		adapter->link_speed = 0;
1868		adapter->link_duplex = 0;
1869	}
1870
1871	return(0);
1872}
1873
1874/*********************************************************************
1875 *
1876 *  Setup networking device structure and register an interface.
1877 *
1878 **********************************************************************/
1879static void
1880em_setup_interface(device_t dev, struct adapter * adapter)
1881{
1882	struct ifnet   *ifp;
1883	INIT_DEBUGOUT("em_setup_interface: begin");
1884
1885	ifp = &adapter->interface_data.ac_if;
1886	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1887	ifp->if_mtu = ETHERMTU;
1888	ifp->if_baudrate = 1000000000;
1889	ifp->if_init =  em_init;
1890	ifp->if_softc = adapter;
1891	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1892	ifp->if_ioctl = em_ioctl;
1893	ifp->if_start = em_start;
1894	ifp->if_watchdog = em_watchdog;
1895	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1);
1896	ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1;
1897	IFQ_SET_READY(&ifp->if_snd);
1898
1899#if __FreeBSD_version < 500000
1900        ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
1901#else
1902        ether_ifattach(ifp, adapter->interface_data.ac_enaddr);
1903#endif
1904
1905	ifp->if_capabilities = ifp->if_capenable = 0;
1906
1907	if (adapter->hw.mac_type >= em_82543) {
1908		ifp->if_capabilities |= IFCAP_HWCSUM;
1909		ifp->if_capenable |= IFCAP_HWCSUM;
1910	}
1911
1912	/*
1913	 * Tell the upper layer(s) we support long frames.
1914	 */
1915	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
1916#if __FreeBSD_version >= 500000
1917	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
1918	ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
1919#endif
1920
1921#ifdef DEVICE_POLLING
1922	ifp->if_capabilities |= IFCAP_POLLING;
1923	ifp->if_capenable |= IFCAP_POLLING;
1924#endif
1925
1926	/*
1927	 * Specify the media types supported by this adapter and register
1928	 * callbacks to update media and link information
1929	 */
1930	ifmedia_init(&adapter->media, IFM_IMASK, em_media_change,
1931		     em_media_status);
1932	if (adapter->hw.media_type == em_media_type_fiber) {
1933		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX | IFM_FDX,
1934			    0, NULL);
1935		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX,
1936			    0, NULL);
1937	} else {
1938		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
1939		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T | IFM_FDX,
1940			    0, NULL);
1941		ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX,
1942			    0, NULL);
1943		ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
1944			    0, NULL);
1945#if __FreeBSD_version < 500000
1946		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_TX | IFM_FDX,
1947			    0, NULL);
1948		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_TX, 0, NULL);
1949#else
1950		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1951			    0, NULL);
1952		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1953#endif
1954	}
1955	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1956	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1957
1958	return;
1959}
1960
1961
1962/*********************************************************************
1963 *
1964 *  Workaround for SmartSpeed on 82541 and 82547 controllers
1965 *
1966 **********************************************************************/
1967static void
1968em_smartspeed(struct adapter *adapter)
1969{
1970        uint16_t phy_tmp;
1971
1972	if(adapter->link_active || (adapter->hw.phy_type != em_phy_igp) ||
1973	   !adapter->hw.autoneg || !(adapter->hw.autoneg_advertised & ADVERTISE_1000_FULL))
1974		return;
1975
1976        if(adapter->smartspeed == 0) {
1977                /* If Master/Slave config fault is asserted twice,
1978                 * we assume back-to-back */
1979                em_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_tmp);
1980                if(!(phy_tmp & SR_1000T_MS_CONFIG_FAULT)) return;
1981                em_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_tmp);
1982                if(phy_tmp & SR_1000T_MS_CONFIG_FAULT) {
1983                        em_read_phy_reg(&adapter->hw, PHY_1000T_CTRL,
1984					&phy_tmp);
1985                        if(phy_tmp & CR_1000T_MS_ENABLE) {
1986                                phy_tmp &= ~CR_1000T_MS_ENABLE;
1987                                em_write_phy_reg(&adapter->hw,
1988                                                    PHY_1000T_CTRL, phy_tmp);
1989                                adapter->smartspeed++;
1990                                if(adapter->hw.autoneg &&
1991                                   !em_phy_setup_autoneg(&adapter->hw) &&
1992				   !em_read_phy_reg(&adapter->hw, PHY_CTRL,
1993                                                       &phy_tmp)) {
1994                                        phy_tmp |= (MII_CR_AUTO_NEG_EN |
1995                                                    MII_CR_RESTART_AUTO_NEG);
1996                                        em_write_phy_reg(&adapter->hw,
1997							 PHY_CTRL, phy_tmp);
1998                                }
1999                        }
2000                }
2001                return;
2002        } else if(adapter->smartspeed == EM_SMARTSPEED_DOWNSHIFT) {
2003                /* If still no link, perhaps using 2/3 pair cable */
2004                em_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_tmp);
2005                phy_tmp |= CR_1000T_MS_ENABLE;
2006                em_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_tmp);
2007                if(adapter->hw.autoneg &&
2008                   !em_phy_setup_autoneg(&adapter->hw) &&
2009                   !em_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_tmp)) {
2010                        phy_tmp |= (MII_CR_AUTO_NEG_EN |
2011                                    MII_CR_RESTART_AUTO_NEG);
2012                        em_write_phy_reg(&adapter->hw, PHY_CTRL, phy_tmp);
2013                }
2014        }
2015        /* Restart process after EM_SMARTSPEED_MAX iterations */
2016        if(adapter->smartspeed++ == EM_SMARTSPEED_MAX)
2017                adapter->smartspeed = 0;
2018
2019	return;
2020}
2021
2022
2023/*
2024 * Manage DMA'able memory.
2025 */
2026static void
2027em_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2028{
2029        if (error)
2030                return;
2031        *(bus_addr_t*) arg = segs->ds_addr;
2032        return;
2033}
2034
2035static int
2036em_dma_malloc(struct adapter *adapter, bus_size_t size,
2037        struct em_dma_alloc *dma, int mapflags)
2038{
2039        int r;
2040
2041        r = bus_dma_tag_create(NULL,                    /* parent */
2042                               PAGE_SIZE, 0,            /* alignment, bounds */
2043                               BUS_SPACE_MAXADDR,       /* lowaddr */
2044                               BUS_SPACE_MAXADDR,       /* highaddr */
2045                               NULL, NULL,              /* filter, filterarg */
2046                               size,                    /* maxsize */
2047                               1,                       /* nsegments */
2048                               size,                    /* maxsegsize */
2049                               BUS_DMA_ALLOCNOW,        /* flags */
2050			       NULL,			/* lockfunc */
2051			       NULL,			/* lockarg */
2052                               &dma->dma_tag);
2053        if (r != 0) {
2054                printf("em%d: em_dma_malloc: bus_dma_tag_create failed; "
2055                        "error %u\n", adapter->unit, r);
2056                goto fail_0;
2057        }
2058
2059        r = bus_dmamap_create(dma->dma_tag, BUS_DMA_NOWAIT, &dma->dma_map);
2060        if (r != 0) {
2061                printf("em%d: em_dma_malloc: bus_dmamap_create failed; "
2062                        "error %u\n", adapter->unit, r);
2063                goto fail_1;
2064        }
2065
2066        r = bus_dmamem_alloc(dma->dma_tag, (void**) &dma->dma_vaddr,
2067                             BUS_DMA_NOWAIT, &dma->dma_map);
2068        if (r != 0) {
2069                printf("em%d: em_dma_malloc: bus_dmammem_alloc failed; "
2070                        "size %ju, error %d\n", adapter->unit,
2071			(uintmax_t)size, r);
2072                goto fail_2;
2073        }
2074
2075        r = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr,
2076                            size,
2077                            em_dmamap_cb,
2078                            &dma->dma_paddr,
2079                            mapflags | BUS_DMA_NOWAIT);
2080        if (r != 0) {
2081                printf("em%d: em_dma_malloc: bus_dmamap_load failed; "
2082                        "error %u\n", adapter->unit, r);
2083                goto fail_3;
2084        }
2085
2086        dma->dma_size = size;
2087        return (0);
2088
2089fail_3:
2090        bus_dmamap_unload(dma->dma_tag, dma->dma_map);
2091fail_2:
2092        bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
2093fail_1:
2094        bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
2095        bus_dma_tag_destroy(dma->dma_tag);
2096fail_0:
2097        dma->dma_map = NULL;
2098        dma->dma_tag = NULL;
2099        return (r);
2100}
2101
2102static void
2103em_dma_free(struct adapter *adapter, struct em_dma_alloc *dma)
2104{
2105        bus_dmamap_unload(dma->dma_tag, dma->dma_map);
2106        bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
2107        bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
2108        bus_dma_tag_destroy(dma->dma_tag);
2109}
2110
2111
2112/*********************************************************************
2113 *
2114 *  Allocate memory for tx_buffer structures. The tx_buffer stores all
2115 *  the information needed to transmit a packet on the wire.
2116 *
2117 **********************************************************************/
2118static int
2119em_allocate_transmit_structures(struct adapter * adapter)
2120{
2121	if (!(adapter->tx_buffer_area =
2122	      (struct em_buffer *) malloc(sizeof(struct em_buffer) *
2123					     adapter->num_tx_desc, M_DEVBUF,
2124					     M_NOWAIT))) {
2125		printf("em%d: Unable to allocate tx_buffer memory\n",
2126		       adapter->unit);
2127		return ENOMEM;
2128	}
2129
2130	bzero(adapter->tx_buffer_area,
2131	      sizeof(struct em_buffer) * adapter->num_tx_desc);
2132
2133	return 0;
2134}
2135
2136/*********************************************************************
2137 *
2138 *  Allocate and initialize transmit structures.
2139 *
2140 **********************************************************************/
2141static int
2142em_setup_transmit_structures(struct adapter * adapter)
2143{
2144        /*
2145         * Setup DMA descriptor areas.
2146         */
2147        if (bus_dma_tag_create(NULL,                    /* parent */
2148                               PAGE_SIZE, 0,            /* alignment, bounds */
2149                               BUS_SPACE_MAXADDR,       /* lowaddr */
2150                               BUS_SPACE_MAXADDR,       /* highaddr */
2151                               NULL, NULL,              /* filter, filterarg */
2152                               MCLBYTES * 8,            /* maxsize */
2153                               EM_MAX_SCATTER,          /* nsegments */
2154                               MCLBYTES * 8,            /* maxsegsize */
2155                               BUS_DMA_ALLOCNOW,        /* flags */
2156			       NULL,			/* lockfunc */
2157			       NULL,			/* lockarg */
2158                               &adapter->txtag)) {
2159                printf("em%d: Unable to allocate TX DMA tag\n", adapter->unit);
2160                return (ENOMEM);
2161        }
2162
2163        if (em_allocate_transmit_structures(adapter))
2164                return (ENOMEM);
2165
2166        bzero((void *) adapter->tx_desc_base,
2167              (sizeof(struct em_tx_desc)) * adapter->num_tx_desc);
2168
2169        adapter->next_avail_tx_desc = 0;
2170        adapter->oldest_used_tx_desc = 0;
2171
2172        /* Set number of descriptors available */
2173        adapter->num_tx_desc_avail = adapter->num_tx_desc;
2174
2175        /* Set checksum context */
2176        adapter->active_checksum_context = OFFLOAD_NONE;
2177
2178        return (0);
2179}
2180
2181/*********************************************************************
2182 *
2183 *  Enable transmit unit.
2184 *
2185 **********************************************************************/
2186static void
2187em_initialize_transmit_unit(struct adapter * adapter)
2188{
2189	u_int32_t       reg_tctl;
2190	u_int32_t       reg_tipg = 0;
2191	u_int64_t	bus_addr;
2192
2193         INIT_DEBUGOUT("em_initialize_transmit_unit: begin");
2194	/* Setup the Base and Length of the Tx Descriptor Ring */
2195	bus_addr = adapter->txdma.dma_paddr;
2196	E1000_WRITE_REG(&adapter->hw, TDBAL, (u_int32_t)bus_addr);
2197	E1000_WRITE_REG(&adapter->hw, TDBAH, (u_int32_t)(bus_addr >> 32));
2198	E1000_WRITE_REG(&adapter->hw, TDLEN,
2199			adapter->num_tx_desc *
2200			sizeof(struct em_tx_desc));
2201
2202	/* Setup the HW Tx Head and Tail descriptor pointers */
2203	E1000_WRITE_REG(&adapter->hw, TDH, 0);
2204	E1000_WRITE_REG(&adapter->hw, TDT, 0);
2205
2206
2207	HW_DEBUGOUT2("Base = %x, Length = %x\n",
2208		     E1000_READ_REG(&adapter->hw, TDBAL),
2209		     E1000_READ_REG(&adapter->hw, TDLEN));
2210
2211	/* Set the default values for the Tx Inter Packet Gap timer */
2212	switch (adapter->hw.mac_type) {
2213	case em_82542_rev2_0:
2214        case em_82542_rev2_1:
2215                reg_tipg = DEFAULT_82542_TIPG_IPGT;
2216                reg_tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
2217                reg_tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
2218                break;
2219        default:
2220                if (adapter->hw.media_type == em_media_type_fiber)
2221                        reg_tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
2222                else
2223                        reg_tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
2224                reg_tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
2225                reg_tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
2226        }
2227
2228	E1000_WRITE_REG(&adapter->hw, TIPG, reg_tipg);
2229	E1000_WRITE_REG(&adapter->hw, TIDV, adapter->tx_int_delay.value);
2230	if(adapter->hw.mac_type >= em_82540)
2231		E1000_WRITE_REG(&adapter->hw, TADV,
2232		    adapter->tx_abs_int_delay.value);
2233
2234	/* Program the Transmit Control Register */
2235	reg_tctl = E1000_TCTL_PSP | E1000_TCTL_EN |
2236		   (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
2237	if (adapter->link_duplex == 1) {
2238		reg_tctl |= E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
2239	} else {
2240		reg_tctl |= E1000_HDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
2241	}
2242	E1000_WRITE_REG(&adapter->hw, TCTL, reg_tctl);
2243
2244	/* Setup Transmit Descriptor Settings for this adapter */
2245	adapter->txd_cmd = E1000_TXD_CMD_IFCS | E1000_TXD_CMD_RS;
2246
2247	if (adapter->tx_int_delay.value > 0)
2248		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
2249
2250	return;
2251}
2252
2253/*********************************************************************
2254 *
2255 *  Free all transmit related data structures.
2256 *
2257 **********************************************************************/
2258static void
2259em_free_transmit_structures(struct adapter * adapter)
2260{
2261        struct em_buffer   *tx_buffer;
2262        int             i;
2263
2264        INIT_DEBUGOUT("free_transmit_structures: begin");
2265
2266        if (adapter->tx_buffer_area != NULL) {
2267                tx_buffer = adapter->tx_buffer_area;
2268                for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
2269                        if (tx_buffer->m_head != NULL) {
2270                                bus_dmamap_unload(adapter->txtag, tx_buffer->map);
2271                                bus_dmamap_destroy(adapter->txtag, tx_buffer->map);
2272                                m_freem(tx_buffer->m_head);
2273                        }
2274                        tx_buffer->m_head = NULL;
2275                }
2276        }
2277        if (adapter->tx_buffer_area != NULL) {
2278                free(adapter->tx_buffer_area, M_DEVBUF);
2279                adapter->tx_buffer_area = NULL;
2280        }
2281        if (adapter->txtag != NULL) {
2282                bus_dma_tag_destroy(adapter->txtag);
2283                adapter->txtag = NULL;
2284        }
2285        return;
2286}
2287
2288/*********************************************************************
2289 *
2290 *  The offload context needs to be set when we transfer the first
2291 *  packet of a particular protocol (TCP/UDP). We change the
2292 *  context only if the protocol type changes.
2293 *
2294 **********************************************************************/
2295static void
2296em_transmit_checksum_setup(struct adapter * adapter,
2297			   struct mbuf *mp,
2298			   u_int32_t *txd_upper,
2299			   u_int32_t *txd_lower)
2300{
2301	struct em_context_desc *TXD;
2302	struct em_buffer *tx_buffer;
2303	int curr_txd;
2304
2305	if (mp->m_pkthdr.csum_flags) {
2306
2307		if (mp->m_pkthdr.csum_flags & CSUM_TCP) {
2308			*txd_upper = E1000_TXD_POPTS_TXSM << 8;
2309			*txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2310			if (adapter->active_checksum_context == OFFLOAD_TCP_IP)
2311				return;
2312			else
2313				adapter->active_checksum_context = OFFLOAD_TCP_IP;
2314
2315		} else if (mp->m_pkthdr.csum_flags & CSUM_UDP) {
2316			*txd_upper = E1000_TXD_POPTS_TXSM << 8;
2317			*txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2318			if (adapter->active_checksum_context == OFFLOAD_UDP_IP)
2319				return;
2320			else
2321				adapter->active_checksum_context = OFFLOAD_UDP_IP;
2322		} else {
2323			*txd_upper = 0;
2324			*txd_lower = 0;
2325			return;
2326		}
2327	} else {
2328		*txd_upper = 0;
2329		*txd_lower = 0;
2330		return;
2331	}
2332
2333	/* If we reach this point, the checksum offload context
2334	 * needs to be reset.
2335	 */
2336	curr_txd = adapter->next_avail_tx_desc;
2337	tx_buffer = &adapter->tx_buffer_area[curr_txd];
2338	TXD = (struct em_context_desc *) &adapter->tx_desc_base[curr_txd];
2339
2340	TXD->lower_setup.ip_fields.ipcss = ETHER_HDR_LEN;
2341	TXD->lower_setup.ip_fields.ipcso =
2342		ETHER_HDR_LEN + offsetof(struct ip, ip_sum);
2343	TXD->lower_setup.ip_fields.ipcse =
2344		htole16(ETHER_HDR_LEN + sizeof(struct ip) - 1);
2345
2346	TXD->upper_setup.tcp_fields.tucss =
2347		ETHER_HDR_LEN + sizeof(struct ip);
2348	TXD->upper_setup.tcp_fields.tucse = htole16(0);
2349
2350	if (adapter->active_checksum_context == OFFLOAD_TCP_IP) {
2351		TXD->upper_setup.tcp_fields.tucso =
2352			ETHER_HDR_LEN + sizeof(struct ip) +
2353			offsetof(struct tcphdr, th_sum);
2354	} else if (adapter->active_checksum_context == OFFLOAD_UDP_IP) {
2355		TXD->upper_setup.tcp_fields.tucso =
2356			ETHER_HDR_LEN + sizeof(struct ip) +
2357			offsetof(struct udphdr, uh_sum);
2358	}
2359
2360	TXD->tcp_seg_setup.data = htole32(0);
2361	TXD->cmd_and_length = htole32(adapter->txd_cmd | E1000_TXD_CMD_DEXT);
2362
2363	tx_buffer->m_head = NULL;
2364
2365	if (++curr_txd == adapter->num_tx_desc)
2366		curr_txd = 0;
2367
2368	adapter->num_tx_desc_avail--;
2369	adapter->next_avail_tx_desc = curr_txd;
2370
2371	return;
2372}
2373
2374/**********************************************************************
2375 *
2376 *  Examine each tx_buffer in the used queue. If the hardware is done
2377 *  processing the packet then free associated resources. The
2378 *  tx_buffer is put back on the free queue.
2379 *
2380 **********************************************************************/
2381static void
2382em_clean_transmit_interrupts(struct adapter * adapter)
2383{
2384        int i, num_avail;
2385        struct em_buffer *tx_buffer;
2386        struct em_tx_desc   *tx_desc;
2387	struct ifnet   *ifp = &adapter->interface_data.ac_if;
2388
2389	mtx_assert(&adapter->mtx, MA_OWNED);
2390
2391        if (adapter->num_tx_desc_avail == adapter->num_tx_desc)
2392                return;
2393
2394#ifdef DBG_STATS
2395        adapter->clean_tx_interrupts++;
2396#endif
2397        num_avail = adapter->num_tx_desc_avail;
2398        i = adapter->oldest_used_tx_desc;
2399
2400        tx_buffer = &adapter->tx_buffer_area[i];
2401        tx_desc = &adapter->tx_desc_base[i];
2402
2403        while (tx_desc->upper.fields.status & E1000_TXD_STAT_DD) {
2404
2405                tx_desc->upper.data = 0;
2406                num_avail++;
2407
2408                if (tx_buffer->m_head) {
2409			ifp->if_opackets++;
2410                        bus_dmamap_sync(adapter->txtag, tx_buffer->map,
2411                                        BUS_DMASYNC_POSTWRITE);
2412                        bus_dmamap_unload(adapter->txtag, tx_buffer->map);
2413                        bus_dmamap_destroy(adapter->txtag, tx_buffer->map);
2414
2415                        m_freem(tx_buffer->m_head);
2416                        tx_buffer->m_head = NULL;
2417                }
2418
2419                if (++i == adapter->num_tx_desc)
2420                        i = 0;
2421
2422                tx_buffer = &adapter->tx_buffer_area[i];
2423                tx_desc = &adapter->tx_desc_base[i];
2424        }
2425
2426        adapter->oldest_used_tx_desc = i;
2427
2428        /*
2429         * If we have enough room, clear IFF_OACTIVE to tell the stack
2430         * that it is OK to send packets.
2431         * If there are no pending descriptors, clear the timeout. Otherwise,
2432         * if some descriptors have been freed, restart the timeout.
2433         */
2434        if (num_avail > EM_TX_CLEANUP_THRESHOLD) {
2435                ifp->if_flags &= ~IFF_OACTIVE;
2436                if (num_avail == adapter->num_tx_desc)
2437                        ifp->if_timer = 0;
2438                else if (num_avail == adapter->num_tx_desc_avail)
2439                        ifp->if_timer = EM_TX_TIMEOUT;
2440        }
2441        adapter->num_tx_desc_avail = num_avail;
2442        return;
2443}
2444
2445/*********************************************************************
2446 *
2447 *  Get a buffer from system mbuf buffer pool.
2448 *
2449 **********************************************************************/
2450static int
2451em_get_buf(int i, struct adapter *adapter,
2452           struct mbuf *nmp)
2453{
2454        register struct mbuf    *mp = nmp;
2455        struct em_buffer *rx_buffer;
2456        struct ifnet   *ifp;
2457        bus_addr_t paddr;
2458        int error;
2459
2460        ifp = &adapter->interface_data.ac_if;
2461
2462        if (mp == NULL) {
2463                mp = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
2464                if (mp == NULL) {
2465                        adapter->mbuf_cluster_failed++;
2466                        return(ENOBUFS);
2467                }
2468                mp->m_len = mp->m_pkthdr.len = MCLBYTES;
2469        } else {
2470                mp->m_len = mp->m_pkthdr.len = MCLBYTES;
2471                mp->m_data = mp->m_ext.ext_buf;
2472                mp->m_next = NULL;
2473        }
2474
2475        if (ifp->if_mtu <= ETHERMTU) {
2476                m_adj(mp, ETHER_ALIGN);
2477        }
2478
2479        rx_buffer = &adapter->rx_buffer_area[i];
2480
2481        /*
2482         * Using memory from the mbuf cluster pool, invoke the
2483         * bus_dma machinery to arrange the memory mapping.
2484         */
2485        error = bus_dmamap_load(adapter->rxtag, rx_buffer->map,
2486                                mtod(mp, void *), mp->m_len,
2487                                em_dmamap_cb, &paddr, 0);
2488        if (error) {
2489                m_free(mp);
2490                return(error);
2491        }
2492        rx_buffer->m_head = mp;
2493        adapter->rx_desc_base[i].buffer_addr = htole64(paddr);
2494        bus_dmamap_sync(adapter->rxtag, rx_buffer->map, BUS_DMASYNC_PREREAD);
2495
2496        return(0);
2497}
2498
2499/*********************************************************************
2500 *
2501 *  Allocate memory for rx_buffer structures. Since we use one
2502 *  rx_buffer per received packet, the maximum number of rx_buffer's
2503 *  that we'll need is equal to the number of receive descriptors
2504 *  that we've allocated.
2505 *
2506 **********************************************************************/
2507static int
2508em_allocate_receive_structures(struct adapter * adapter)
2509{
2510        int             i, error;
2511        struct em_buffer *rx_buffer;
2512
2513        if (!(adapter->rx_buffer_area =
2514              (struct em_buffer *) malloc(sizeof(struct em_buffer) *
2515                                          adapter->num_rx_desc, M_DEVBUF,
2516                                          M_NOWAIT))) {
2517                printf("em%d: Unable to allocate rx_buffer memory\n",
2518                       adapter->unit);
2519                return(ENOMEM);
2520        }
2521
2522        bzero(adapter->rx_buffer_area,
2523              sizeof(struct em_buffer) * adapter->num_rx_desc);
2524
2525        error = bus_dma_tag_create(NULL,                /* parent */
2526                               PAGE_SIZE, 0,            /* alignment, bounds */
2527                               BUS_SPACE_MAXADDR,       /* lowaddr */
2528                               BUS_SPACE_MAXADDR,       /* highaddr */
2529                               NULL, NULL,              /* filter, filterarg */
2530                               MCLBYTES,                /* maxsize */
2531                               1,                       /* nsegments */
2532                               MCLBYTES,                /* maxsegsize */
2533                               BUS_DMA_ALLOCNOW,        /* flags */
2534			       NULL,			/* lockfunc */
2535			       NULL,			/* lockarg */
2536                               &adapter->rxtag);
2537        if (error != 0) {
2538                printf("em%d: em_allocate_receive_structures: "
2539                        "bus_dma_tag_create failed; error %u\n",
2540                       adapter->unit, error);
2541                goto fail_0;
2542        }
2543
2544        rx_buffer = adapter->rx_buffer_area;
2545        for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
2546                error = bus_dmamap_create(adapter->rxtag, BUS_DMA_NOWAIT,
2547                                          &rx_buffer->map);
2548                if (error != 0) {
2549                        printf("em%d: em_allocate_receive_structures: "
2550                                "bus_dmamap_create failed; error %u\n",
2551                                adapter->unit, error);
2552                        goto fail_1;
2553                }
2554        }
2555
2556        for (i = 0; i < adapter->num_rx_desc; i++) {
2557                error = em_get_buf(i, adapter, NULL);
2558                if (error != 0) {
2559                        adapter->rx_buffer_area[i].m_head = NULL;
2560                        adapter->rx_desc_base[i].buffer_addr = 0;
2561                        return(error);
2562                }
2563        }
2564
2565        return(0);
2566
2567fail_1:
2568        bus_dma_tag_destroy(adapter->rxtag);
2569fail_0:
2570        adapter->rxtag = NULL;
2571        free(adapter->rx_buffer_area, M_DEVBUF);
2572        adapter->rx_buffer_area = NULL;
2573        return (error);
2574}
2575
2576/*********************************************************************
2577 *
2578 *  Allocate and initialize receive structures.
2579 *
2580 **********************************************************************/
2581static int
2582em_setup_receive_structures(struct adapter * adapter)
2583{
2584	bzero((void *) adapter->rx_desc_base,
2585              (sizeof(struct em_rx_desc)) * adapter->num_rx_desc);
2586
2587	if (em_allocate_receive_structures(adapter))
2588		return ENOMEM;
2589
2590	/* Setup our descriptor pointers */
2591        adapter->next_rx_desc_to_check = 0;
2592	return(0);
2593}
2594
2595/*********************************************************************
2596 *
2597 *  Enable receive unit.
2598 *
2599 **********************************************************************/
2600static void
2601em_initialize_receive_unit(struct adapter * adapter)
2602{
2603	u_int32_t       reg_rctl;
2604	u_int32_t       reg_rxcsum;
2605	struct ifnet    *ifp;
2606	u_int64_t	bus_addr;
2607
2608        INIT_DEBUGOUT("em_initialize_receive_unit: begin");
2609	ifp = &adapter->interface_data.ac_if;
2610
2611	/* Make sure receives are disabled while setting up the descriptor ring */
2612	E1000_WRITE_REG(&adapter->hw, RCTL, 0);
2613
2614	/* Set the Receive Delay Timer Register */
2615	E1000_WRITE_REG(&adapter->hw, RDTR,
2616			adapter->rx_int_delay.value | E1000_RDT_FPDB);
2617
2618	if(adapter->hw.mac_type >= em_82540) {
2619		E1000_WRITE_REG(&adapter->hw, RADV,
2620		    adapter->rx_abs_int_delay.value);
2621
2622                /* Set the interrupt throttling rate.  Value is calculated
2623                 * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
2624#define MAX_INTS_PER_SEC        8000
2625#define DEFAULT_ITR             1000000000/(MAX_INTS_PER_SEC * 256)
2626                E1000_WRITE_REG(&adapter->hw, ITR, DEFAULT_ITR);
2627        }
2628
2629	/* Setup the Base and Length of the Rx Descriptor Ring */
2630	bus_addr = adapter->rxdma.dma_paddr;
2631	E1000_WRITE_REG(&adapter->hw, RDBAL, (u_int32_t)bus_addr);
2632	E1000_WRITE_REG(&adapter->hw, RDBAH, (u_int32_t)(bus_addr >> 32));
2633	E1000_WRITE_REG(&adapter->hw, RDLEN, adapter->num_rx_desc *
2634			sizeof(struct em_rx_desc));
2635
2636	/* Setup the HW Rx Head and Tail Descriptor Pointers */
2637	E1000_WRITE_REG(&adapter->hw, RDH, 0);
2638	E1000_WRITE_REG(&adapter->hw, RDT, adapter->num_rx_desc - 1);
2639
2640	/* Setup the Receive Control Register */
2641	reg_rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
2642		   E1000_RCTL_RDMTS_HALF |
2643		   (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
2644
2645	if (adapter->hw.tbi_compatibility_on == TRUE)
2646		reg_rctl |= E1000_RCTL_SBP;
2647
2648
2649	switch (adapter->rx_buffer_len) {
2650	default:
2651	case EM_RXBUFFER_2048:
2652		reg_rctl |= E1000_RCTL_SZ_2048;
2653		break;
2654	case EM_RXBUFFER_4096:
2655		reg_rctl |= E1000_RCTL_SZ_4096 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
2656		break;
2657	case EM_RXBUFFER_8192:
2658		reg_rctl |= E1000_RCTL_SZ_8192 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
2659		break;
2660	case EM_RXBUFFER_16384:
2661		reg_rctl |= E1000_RCTL_SZ_16384 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
2662		break;
2663	}
2664
2665	if (ifp->if_mtu > ETHERMTU)
2666		reg_rctl |= E1000_RCTL_LPE;
2667
2668	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
2669	if ((adapter->hw.mac_type >= em_82543) &&
2670	    (ifp->if_capenable & IFCAP_RXCSUM)) {
2671		reg_rxcsum = E1000_READ_REG(&adapter->hw, RXCSUM);
2672		reg_rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL);
2673		E1000_WRITE_REG(&adapter->hw, RXCSUM, reg_rxcsum);
2674	}
2675
2676	/* Enable Receives */
2677	E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
2678
2679	return;
2680}
2681
2682/*********************************************************************
2683 *
2684 *  Free receive related data structures.
2685 *
2686 **********************************************************************/
2687static void
2688em_free_receive_structures(struct adapter *adapter)
2689{
2690        struct em_buffer   *rx_buffer;
2691        int             i;
2692
2693        INIT_DEBUGOUT("free_receive_structures: begin");
2694
2695        if (adapter->rx_buffer_area != NULL) {
2696                rx_buffer = adapter->rx_buffer_area;
2697                for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
2698                        if (rx_buffer->map != NULL) {
2699                                bus_dmamap_unload(adapter->rxtag, rx_buffer->map);
2700                                bus_dmamap_destroy(adapter->rxtag, rx_buffer->map);
2701                        }
2702                        if (rx_buffer->m_head != NULL)
2703                                m_freem(rx_buffer->m_head);
2704                        rx_buffer->m_head = NULL;
2705                }
2706        }
2707        if (adapter->rx_buffer_area != NULL) {
2708                free(adapter->rx_buffer_area, M_DEVBUF);
2709                adapter->rx_buffer_area = NULL;
2710        }
2711        if (adapter->rxtag != NULL) {
2712                bus_dma_tag_destroy(adapter->rxtag);
2713                adapter->rxtag = NULL;
2714        }
2715        return;
2716}
2717
2718/*********************************************************************
2719 *
2720 *  This routine executes in interrupt context. It replenishes
2721 *  the mbufs in the descriptor and sends data which has been
2722 *  dma'ed into host memory to upper layer.
2723 *
2724 *  We loop at most count times if count is > 0, or until done if
2725 *  count < 0.
2726 *
2727 *********************************************************************/
2728static void
2729em_process_receive_interrupts(struct adapter * adapter, int count)
2730{
2731	struct ifnet        *ifp;
2732	struct mbuf         *mp;
2733#if __FreeBSD_version < 500000
2734        struct ether_header *eh;
2735#endif
2736	u_int8_t            accept_frame = 0;
2737 	u_int8_t            eop = 0;
2738	u_int16_t           len, desc_len, prev_len_adj;
2739	int                 i;
2740
2741	/* Pointer to the receive descriptor being examined. */
2742	struct em_rx_desc   *current_desc;
2743
2744	mtx_assert(&adapter->mtx, MA_OWNED);
2745
2746	ifp = &adapter->interface_data.ac_if;
2747	i = adapter->next_rx_desc_to_check;
2748        current_desc = &adapter->rx_desc_base[i];
2749
2750	if (!((current_desc->status) & E1000_RXD_STAT_DD)) {
2751#ifdef DBG_STATS
2752		adapter->no_pkts_avail++;
2753#endif
2754		return;
2755	}
2756
2757	while ((current_desc->status & E1000_RXD_STAT_DD) && (count != 0)) {
2758
2759		mp = adapter->rx_buffer_area[i].m_head;
2760		bus_dmamap_sync(adapter->rxtag, adapter->rx_buffer_area[i].map,
2761				BUS_DMASYNC_POSTREAD);
2762
2763		accept_frame = 1;
2764		prev_len_adj = 0;
2765                desc_len = le16toh(current_desc->length);
2766		if (current_desc->status & E1000_RXD_STAT_EOP) {
2767			count--;
2768			eop = 1;
2769			if (desc_len < ETHER_CRC_LEN) {
2770                                len = 0;
2771                                prev_len_adj = ETHER_CRC_LEN - desc_len;
2772                        }
2773                        else {
2774                                len = desc_len - ETHER_CRC_LEN;
2775                        }
2776		} else {
2777			eop = 0;
2778			len = desc_len;
2779		}
2780
2781		if (current_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
2782			u_int8_t            last_byte;
2783			u_int32_t           pkt_len = desc_len;
2784
2785			if (adapter->fmp != NULL)
2786				pkt_len += adapter->fmp->m_pkthdr.len;
2787
2788			last_byte = *(mtod(mp, caddr_t) + desc_len - 1);
2789
2790			if (TBI_ACCEPT(&adapter->hw, current_desc->status,
2791				       current_desc->errors,
2792				       pkt_len, last_byte)) {
2793				em_tbi_adjust_stats(&adapter->hw,
2794						    &adapter->stats,
2795						    pkt_len,
2796						    adapter->hw.mac_addr);
2797				if (len > 0) len--;
2798			}
2799			else {
2800				accept_frame = 0;
2801			}
2802		}
2803
2804		if (accept_frame) {
2805
2806			if (em_get_buf(i, adapter, NULL) == ENOBUFS) {
2807				adapter->dropped_pkts++;
2808				em_get_buf(i, adapter, mp);
2809				if (adapter->fmp != NULL)
2810					m_freem(adapter->fmp);
2811				adapter->fmp = NULL;
2812				adapter->lmp = NULL;
2813				break;
2814			}
2815
2816			/* Assign correct length to the current fragment */
2817			mp->m_len = len;
2818
2819			if (adapter->fmp == NULL) {
2820				mp->m_pkthdr.len = len;
2821				adapter->fmp = mp;	 /* Store the first mbuf */
2822				adapter->lmp = mp;
2823			} else {
2824				/* Chain mbuf's together */
2825				mp->m_flags &= ~M_PKTHDR;
2826				/*
2827                                 * Adjust length of previous mbuf in chain if we
2828                                 * received less than 4 bytes in the last descriptor.
2829                                 */
2830				if (prev_len_adj > 0) {
2831					adapter->lmp->m_len -= prev_len_adj;
2832					adapter->fmp->m_pkthdr.len -= prev_len_adj;
2833				}
2834				adapter->lmp->m_next = mp;
2835				adapter->lmp = adapter->lmp->m_next;
2836				adapter->fmp->m_pkthdr.len += len;
2837			}
2838
2839                        if (eop) {
2840                                adapter->fmp->m_pkthdr.rcvif = ifp;
2841                                 ifp->if_ipackets++;
2842
2843#if __FreeBSD_version < 500000
2844                                eh = mtod(adapter->fmp, struct ether_header *);
2845                                /* Remove ethernet header from mbuf */
2846                                m_adj(adapter->fmp, sizeof(struct ether_header));
2847                                em_receive_checksum(adapter, current_desc,
2848                                                    adapter->fmp);
2849                                if (current_desc->status & E1000_RXD_STAT_VP)
2850                                        VLAN_INPUT_TAG(eh, adapter->fmp,
2851                                                       (current_desc->special &
2852							E1000_RXD_SPC_VLAN_MASK));
2853                                else
2854                                        ether_input(ifp, eh, adapter->fmp);
2855#else
2856
2857                                em_receive_checksum(adapter, current_desc,
2858                                                    adapter->fmp);
2859                                if (current_desc->status & E1000_RXD_STAT_VP)
2860                                        VLAN_INPUT_TAG(ifp, adapter->fmp,
2861                                                       (current_desc->special &
2862							E1000_RXD_SPC_VLAN_MASK),
2863						       adapter->fmp = NULL);
2864
2865                                if (adapter->fmp != NULL) {
2866					EM_UNLOCK(adapter);
2867                                        (*ifp->if_input)(ifp, adapter->fmp);
2868					EM_LOCK(adapter);
2869				}
2870#endif
2871                                adapter->fmp = NULL;
2872                                adapter->lmp = NULL;
2873                        }
2874		} else {
2875			adapter->dropped_pkts++;
2876			em_get_buf(i, adapter, mp);
2877			if (adapter->fmp != NULL)
2878				m_freem(adapter->fmp);
2879			adapter->fmp = NULL;
2880			adapter->lmp = NULL;
2881		}
2882
2883		/* Zero out the receive descriptors status  */
2884		current_desc->status = 0;
2885
2886		/* Advance the E1000's Receive Queue #0  "Tail Pointer". */
2887                E1000_WRITE_REG(&adapter->hw, RDT, i);
2888
2889                /* Advance our pointers to the next descriptor */
2890                if (++i == adapter->num_rx_desc) {
2891                        i = 0;
2892                        current_desc = adapter->rx_desc_base;
2893                } else
2894			current_desc++;
2895	}
2896	adapter->next_rx_desc_to_check = i;
2897	return;
2898}
2899
2900/*********************************************************************
2901 *
2902 *  Verify that the hardware indicated that the checksum is valid.
2903 *  Inform the stack about the status of checksum so that stack
2904 *  doesn't spend time verifying the checksum.
2905 *
2906 *********************************************************************/
2907static void
2908em_receive_checksum(struct adapter *adapter,
2909		    struct em_rx_desc *rx_desc,
2910		    struct mbuf *mp)
2911{
2912	/* 82543 or newer only */
2913	if ((adapter->hw.mac_type < em_82543) ||
2914	    /* Ignore Checksum bit is set */
2915	    (rx_desc->status & E1000_RXD_STAT_IXSM)) {
2916		mp->m_pkthdr.csum_flags = 0;
2917		return;
2918	}
2919
2920	if (rx_desc->status & E1000_RXD_STAT_IPCS) {
2921		/* Did it pass? */
2922		if (!(rx_desc->errors & E1000_RXD_ERR_IPE)) {
2923			/* IP Checksum Good */
2924			mp->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
2925			mp->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2926
2927		} else {
2928			mp->m_pkthdr.csum_flags = 0;
2929		}
2930	}
2931
2932	if (rx_desc->status & E1000_RXD_STAT_TCPCS) {
2933		/* Did it pass? */
2934		if (!(rx_desc->errors & E1000_RXD_ERR_TCPE)) {
2935			mp->m_pkthdr.csum_flags |=
2936			(CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
2937			mp->m_pkthdr.csum_data = htons(0xffff);
2938		}
2939	}
2940
2941	return;
2942}
2943
2944
2945static void
2946em_enable_vlans(struct adapter *adapter)
2947{
2948	uint32_t ctrl;
2949
2950	E1000_WRITE_REG(&adapter->hw, VET, ETHERTYPE_VLAN);
2951
2952	ctrl = E1000_READ_REG(&adapter->hw, CTRL);
2953	ctrl |= E1000_CTRL_VME;
2954	E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
2955
2956	return;
2957}
2958
2959static void
2960em_enable_intr(struct adapter * adapter)
2961{
2962	E1000_WRITE_REG(&adapter->hw, IMS, (IMS_ENABLE_MASK));
2963	return;
2964}
2965
2966static void
2967em_disable_intr(struct adapter *adapter)
2968{
2969	E1000_WRITE_REG(&adapter->hw, IMC,
2970			(0xffffffff & ~E1000_IMC_RXSEQ));
2971	return;
2972}
2973
2974static int
2975em_is_valid_ether_addr(u_int8_t *addr)
2976{
2977        char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
2978
2979        if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) {
2980                return (FALSE);
2981        }
2982
2983        return(TRUE);
2984}
2985
2986void
2987em_write_pci_cfg(struct em_hw *hw,
2988		      uint32_t reg,
2989		      uint16_t *value)
2990{
2991	pci_write_config(((struct em_osdep *)hw->back)->dev, reg,
2992			 *value, 2);
2993}
2994
2995void
2996em_read_pci_cfg(struct em_hw *hw, uint32_t reg,
2997		     uint16_t *value)
2998{
2999	*value = pci_read_config(((struct em_osdep *)hw->back)->dev,
3000				 reg, 2);
3001	return;
3002}
3003
3004void
3005em_pci_set_mwi(struct em_hw *hw)
3006{
3007        pci_write_config(((struct em_osdep *)hw->back)->dev,
3008                         PCIR_COMMAND,
3009                         (hw->pci_cmd_word | CMD_MEM_WRT_INVALIDATE), 2);
3010        return;
3011}
3012
3013void
3014em_pci_clear_mwi(struct em_hw *hw)
3015{
3016        pci_write_config(((struct em_osdep *)hw->back)->dev,
3017                         PCIR_COMMAND,
3018                         (hw->pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE), 2);
3019        return;
3020}
3021
3022uint32_t
3023em_io_read(struct em_hw *hw, unsigned long port)
3024{
3025	return(inl(port));
3026}
3027
3028void
3029em_io_write(struct em_hw *hw, unsigned long port, uint32_t value)
3030{
3031	outl(port, value);
3032	return;
3033}
3034
3035/*********************************************************************
3036* 82544 Coexistence issue workaround.
3037*    There are 2 issues.
3038*       1. Transmit Hang issue.
3039*    To detect this issue, following equation can be used...
3040*          SIZE[3:0] + ADDR[2:0] = SUM[3:0].
3041*          If SUM[3:0] is in between 1 to 4, we will have this issue.
3042*
3043*       2. DAC issue.
3044*    To detect this issue, following equation can be used...
3045*          SIZE[3:0] + ADDR[2:0] = SUM[3:0].
3046*          If SUM[3:0] is in between 9 to c, we will have this issue.
3047*
3048*
3049*    WORKAROUND:
3050*          Make sure we do not have ending address as 1,2,3,4(Hang) or 9,a,b,c (DAC)
3051*
3052*** *********************************************************************/
3053static u_int32_t
3054em_fill_descriptors (u_int64_t address,
3055                              u_int32_t length,
3056                              PDESC_ARRAY desc_array)
3057{
3058        /* Since issue is sensitive to length and address.*/
3059        /* Let us first check the address...*/
3060        u_int32_t safe_terminator;
3061        if (length <= 4) {
3062                desc_array->descriptor[0].address = address;
3063                desc_array->descriptor[0].length = length;
3064                desc_array->elements = 1;
3065                return desc_array->elements;
3066        }
3067        safe_terminator = (u_int32_t)((((u_int32_t)address & 0x7) + (length & 0xF)) & 0xF);
3068        /* if it does not fall between 0x1 to 0x4 and 0x9 to 0xC then return */
3069        if (safe_terminator == 0   ||
3070        (safe_terminator > 4   &&
3071        safe_terminator < 9)   ||
3072        (safe_terminator > 0xC &&
3073        safe_terminator <= 0xF)) {
3074                desc_array->descriptor[0].address = address;
3075                desc_array->descriptor[0].length = length;
3076                desc_array->elements = 1;
3077                return desc_array->elements;
3078        }
3079
3080        desc_array->descriptor[0].address = address;
3081        desc_array->descriptor[0].length = length - 4;
3082        desc_array->descriptor[1].address = address + (length - 4);
3083        desc_array->descriptor[1].length = 4;
3084        desc_array->elements = 2;
3085        return desc_array->elements;
3086}
3087
3088/**********************************************************************
3089 *
3090 *  Update the board statistics counters.
3091 *
3092 **********************************************************************/
3093static void
3094em_update_stats_counters(struct adapter *adapter)
3095{
3096	struct ifnet   *ifp;
3097
3098	if(adapter->hw.media_type == em_media_type_copper ||
3099	   (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
3100		adapter->stats.symerrs += E1000_READ_REG(&adapter->hw, SYMERRS);
3101		adapter->stats.sec += E1000_READ_REG(&adapter->hw, SEC);
3102	}
3103	adapter->stats.crcerrs += E1000_READ_REG(&adapter->hw, CRCERRS);
3104	adapter->stats.mpc += E1000_READ_REG(&adapter->hw, MPC);
3105	adapter->stats.scc += E1000_READ_REG(&adapter->hw, SCC);
3106	adapter->stats.ecol += E1000_READ_REG(&adapter->hw, ECOL);
3107
3108	adapter->stats.mcc += E1000_READ_REG(&adapter->hw, MCC);
3109	adapter->stats.latecol += E1000_READ_REG(&adapter->hw, LATECOL);
3110	adapter->stats.colc += E1000_READ_REG(&adapter->hw, COLC);
3111	adapter->stats.dc += E1000_READ_REG(&adapter->hw, DC);
3112	adapter->stats.rlec += E1000_READ_REG(&adapter->hw, RLEC);
3113	adapter->stats.xonrxc += E1000_READ_REG(&adapter->hw, XONRXC);
3114	adapter->stats.xontxc += E1000_READ_REG(&adapter->hw, XONTXC);
3115	adapter->stats.xoffrxc += E1000_READ_REG(&adapter->hw, XOFFRXC);
3116	adapter->stats.xofftxc += E1000_READ_REG(&adapter->hw, XOFFTXC);
3117	adapter->stats.fcruc += E1000_READ_REG(&adapter->hw, FCRUC);
3118	adapter->stats.prc64 += E1000_READ_REG(&adapter->hw, PRC64);
3119	adapter->stats.prc127 += E1000_READ_REG(&adapter->hw, PRC127);
3120	adapter->stats.prc255 += E1000_READ_REG(&adapter->hw, PRC255);
3121	adapter->stats.prc511 += E1000_READ_REG(&adapter->hw, PRC511);
3122	adapter->stats.prc1023 += E1000_READ_REG(&adapter->hw, PRC1023);
3123	adapter->stats.prc1522 += E1000_READ_REG(&adapter->hw, PRC1522);
3124	adapter->stats.gprc += E1000_READ_REG(&adapter->hw, GPRC);
3125	adapter->stats.bprc += E1000_READ_REG(&adapter->hw, BPRC);
3126	adapter->stats.mprc += E1000_READ_REG(&adapter->hw, MPRC);
3127	adapter->stats.gptc += E1000_READ_REG(&adapter->hw, GPTC);
3128
3129	/* For the 64-bit byte counters the low dword must be read first. */
3130	/* Both registers clear on the read of the high dword */
3131
3132	adapter->stats.gorcl += E1000_READ_REG(&adapter->hw, GORCL);
3133	adapter->stats.gorch += E1000_READ_REG(&adapter->hw, GORCH);
3134	adapter->stats.gotcl += E1000_READ_REG(&adapter->hw, GOTCL);
3135	adapter->stats.gotch += E1000_READ_REG(&adapter->hw, GOTCH);
3136
3137	adapter->stats.rnbc += E1000_READ_REG(&adapter->hw, RNBC);
3138	adapter->stats.ruc += E1000_READ_REG(&adapter->hw, RUC);
3139	adapter->stats.rfc += E1000_READ_REG(&adapter->hw, RFC);
3140	adapter->stats.roc += E1000_READ_REG(&adapter->hw, ROC);
3141	adapter->stats.rjc += E1000_READ_REG(&adapter->hw, RJC);
3142
3143	adapter->stats.torl += E1000_READ_REG(&adapter->hw, TORL);
3144	adapter->stats.torh += E1000_READ_REG(&adapter->hw, TORH);
3145	adapter->stats.totl += E1000_READ_REG(&adapter->hw, TOTL);
3146	adapter->stats.toth += E1000_READ_REG(&adapter->hw, TOTH);
3147
3148	adapter->stats.tpr += E1000_READ_REG(&adapter->hw, TPR);
3149	adapter->stats.tpt += E1000_READ_REG(&adapter->hw, TPT);
3150	adapter->stats.ptc64 += E1000_READ_REG(&adapter->hw, PTC64);
3151	adapter->stats.ptc127 += E1000_READ_REG(&adapter->hw, PTC127);
3152	adapter->stats.ptc255 += E1000_READ_REG(&adapter->hw, PTC255);
3153	adapter->stats.ptc511 += E1000_READ_REG(&adapter->hw, PTC511);
3154	adapter->stats.ptc1023 += E1000_READ_REG(&adapter->hw, PTC1023);
3155	adapter->stats.ptc1522 += E1000_READ_REG(&adapter->hw, PTC1522);
3156	adapter->stats.mptc += E1000_READ_REG(&adapter->hw, MPTC);
3157	adapter->stats.bptc += E1000_READ_REG(&adapter->hw, BPTC);
3158
3159	if (adapter->hw.mac_type >= em_82543) {
3160		adapter->stats.algnerrc +=
3161		E1000_READ_REG(&adapter->hw, ALGNERRC);
3162		adapter->stats.rxerrc +=
3163		E1000_READ_REG(&adapter->hw, RXERRC);
3164		adapter->stats.tncrs +=
3165		E1000_READ_REG(&adapter->hw, TNCRS);
3166		adapter->stats.cexterr +=
3167		E1000_READ_REG(&adapter->hw, CEXTERR);
3168		adapter->stats.tsctc +=
3169		E1000_READ_REG(&adapter->hw, TSCTC);
3170		adapter->stats.tsctfc +=
3171		E1000_READ_REG(&adapter->hw, TSCTFC);
3172	}
3173	ifp = &adapter->interface_data.ac_if;
3174
3175	/* Fill out the OS statistics structure */
3176	ifp->if_ibytes = adapter->stats.gorcl;
3177	ifp->if_obytes = adapter->stats.gotcl;
3178	ifp->if_imcasts = adapter->stats.mprc;
3179	ifp->if_collisions = adapter->stats.colc;
3180
3181	/* Rx Errors */
3182	ifp->if_ierrors =
3183	adapter->dropped_pkts +
3184	adapter->stats.rxerrc +
3185	adapter->stats.crcerrs +
3186	adapter->stats.algnerrc +
3187	adapter->stats.rlec + adapter->stats.rnbc +
3188	adapter->stats.mpc + adapter->stats.cexterr;
3189
3190	/* Tx Errors */
3191	ifp->if_oerrors = adapter->stats.ecol + adapter->stats.latecol;
3192
3193}
3194
3195
3196/**********************************************************************
3197 *
3198 *  This routine is called only when em_display_debug_stats is enabled.
3199 *  This routine provides a way to take a look at important statistics
3200 *  maintained by the driver and hardware.
3201 *
3202 **********************************************************************/
3203static void
3204em_print_debug_info(struct adapter *adapter)
3205{
3206        int unit = adapter->unit;
3207	uint8_t *hw_addr = adapter->hw.hw_addr;
3208
3209	printf("em%d: Adapter hardware address = %p \n", unit, hw_addr);
3210	printf("em%d:CTRL  = 0x%x\n", unit,
3211		E1000_READ_REG(&adapter->hw, CTRL));
3212	printf("em%d:RCTL  = 0x%x PS=(0x8402)\n", unit,
3213		E1000_READ_REG(&adapter->hw, RCTL));
3214	printf("em%d:tx_int_delay = %d, tx_abs_int_delay = %d\n", unit,
3215              E1000_READ_REG(&adapter->hw, TIDV),
3216	      E1000_READ_REG(&adapter->hw, TADV));
3217	printf("em%d:rx_int_delay = %d, rx_abs_int_delay = %d\n", unit,
3218              E1000_READ_REG(&adapter->hw, RDTR),
3219	      E1000_READ_REG(&adapter->hw, RADV));
3220
3221#ifdef DBG_STATS
3222        printf("em%d: Packets not Avail = %ld\n", unit,
3223               adapter->no_pkts_avail);
3224        printf("em%d: CleanTxInterrupts = %ld\n", unit,
3225               adapter->clean_tx_interrupts);
3226#endif
3227        printf("em%d: fifo workaround = %lld, fifo_reset = %lld\n", unit,
3228               (long long)adapter->tx_fifo_wrk_cnt,
3229               (long long)adapter->tx_fifo_reset_cnt);
3230        printf("em%d: hw tdh = %d, hw tdt = %d\n", unit,
3231               E1000_READ_REG(&adapter->hw, TDH),
3232               E1000_READ_REG(&adapter->hw, TDT));
3233        printf("em%d: Num Tx descriptors avail = %d\n", unit,
3234               adapter->num_tx_desc_avail);
3235        printf("em%d: Tx Descriptors not avail1 = %ld\n", unit,
3236               adapter->no_tx_desc_avail1);
3237        printf("em%d: Tx Descriptors not avail2 = %ld\n", unit,
3238               adapter->no_tx_desc_avail2);
3239        printf("em%d: Std mbuf failed = %ld\n", unit,
3240               adapter->mbuf_alloc_failed);
3241        printf("em%d: Std mbuf cluster failed = %ld\n", unit,
3242               adapter->mbuf_cluster_failed);
3243        printf("em%d: Driver dropped packets = %ld\n", unit,
3244               adapter->dropped_pkts);
3245
3246        return;
3247}
3248
3249static void
3250em_print_hw_stats(struct adapter *adapter)
3251{
3252        int unit = adapter->unit;
3253
3254        printf("em%d: Excessive collisions = %lld\n", unit,
3255               (long long)adapter->stats.ecol);
3256        printf("em%d: Symbol errors = %lld\n", unit,
3257               (long long)adapter->stats.symerrs);
3258        printf("em%d: Sequence errors = %lld\n", unit,
3259               (long long)adapter->stats.sec);
3260        printf("em%d: Defer count = %lld\n", unit,
3261               (long long)adapter->stats.dc);
3262
3263        printf("em%d: Missed Packets = %lld\n", unit,
3264               (long long)adapter->stats.mpc);
3265        printf("em%d: Receive No Buffers = %lld\n", unit,
3266               (long long)adapter->stats.rnbc);
3267        printf("em%d: Receive length errors = %lld\n", unit,
3268               (long long)adapter->stats.rlec);
3269        printf("em%d: Receive errors = %lld\n", unit,
3270               (long long)adapter->stats.rxerrc);
3271        printf("em%d: Crc errors = %lld\n", unit,
3272               (long long)adapter->stats.crcerrs);
3273        printf("em%d: Alignment errors = %lld\n", unit,
3274               (long long)adapter->stats.algnerrc);
3275        printf("em%d: Carrier extension errors = %lld\n", unit,
3276               (long long)adapter->stats.cexterr);
3277
3278        printf("em%d: XON Rcvd = %lld\n", unit,
3279               (long long)adapter->stats.xonrxc);
3280        printf("em%d: XON Xmtd = %lld\n", unit,
3281               (long long)adapter->stats.xontxc);
3282        printf("em%d: XOFF Rcvd = %lld\n", unit,
3283               (long long)adapter->stats.xoffrxc);
3284        printf("em%d: XOFF Xmtd = %lld\n", unit,
3285               (long long)adapter->stats.xofftxc);
3286
3287        printf("em%d: Good Packets Rcvd = %lld\n", unit,
3288               (long long)adapter->stats.gprc);
3289        printf("em%d: Good Packets Xmtd = %lld\n", unit,
3290               (long long)adapter->stats.gptc);
3291
3292        return;
3293}
3294
3295static int
3296em_sysctl_debug_info(SYSCTL_HANDLER_ARGS)
3297{
3298        int error;
3299        int result;
3300        struct adapter *adapter;
3301
3302        result = -1;
3303        error = sysctl_handle_int(oidp, &result, 0, req);
3304
3305        if (error || !req->newptr)
3306                return (error);
3307
3308        if (result == 1) {
3309                adapter = (struct adapter *)arg1;
3310                em_print_debug_info(adapter);
3311        }
3312
3313        return error;
3314}
3315
3316
3317static int
3318em_sysctl_stats(SYSCTL_HANDLER_ARGS)
3319{
3320        int error;
3321        int result;
3322        struct adapter *adapter;
3323
3324        result = -1;
3325        error = sysctl_handle_int(oidp, &result, 0, req);
3326
3327        if (error || !req->newptr)
3328                return (error);
3329
3330        if (result == 1) {
3331                adapter = (struct adapter *)arg1;
3332                em_print_hw_stats(adapter);
3333        }
3334
3335        return error;
3336}
3337
3338static int
3339em_sysctl_int_delay(SYSCTL_HANDLER_ARGS)
3340{
3341	struct em_int_delay_info *info;
3342	struct adapter *adapter;
3343	u_int32_t regval;
3344	int error;
3345	int usecs;
3346	int ticks;
3347	int s;
3348
3349	info = (struct em_int_delay_info *)arg1;
3350	adapter = info->adapter;
3351	usecs = info->value;
3352	error = sysctl_handle_int(oidp, &usecs, 0, req);
3353	if (error != 0 || req->newptr == NULL)
3354		return error;
3355	if (usecs < 0 || usecs > E1000_TICKS_TO_USECS(65535))
3356		return EINVAL;
3357	info->value = usecs;
3358	ticks = E1000_USECS_TO_TICKS(usecs);
3359
3360	s = splimp();
3361	regval = E1000_READ_OFFSET(&adapter->hw, info->offset);
3362	regval = (regval & ~0xffff) | (ticks & 0xffff);
3363	/* Handle a few special cases. */
3364	switch (info->offset) {
3365	case E1000_RDTR:
3366	case E1000_82542_RDTR:
3367		regval |= E1000_RDT_FPDB;
3368		break;
3369	case E1000_TIDV:
3370	case E1000_82542_TIDV:
3371		if (ticks == 0) {
3372			adapter->txd_cmd &= ~E1000_TXD_CMD_IDE;
3373			/* Don't write 0 into the TIDV register. */
3374			regval++;
3375		} else
3376			adapter->txd_cmd |= E1000_TXD_CMD_IDE;
3377		break;
3378	}
3379	E1000_WRITE_OFFSET(&adapter->hw, info->offset, regval);
3380	splx(s);
3381	return 0;
3382}
3383
3384static void
3385em_add_int_delay_sysctl(struct adapter *adapter, const char *name,
3386    const char *description, struct em_int_delay_info *info,
3387    int offset, int value)
3388{
3389	info->adapter = adapter;
3390	info->offset = offset;
3391	info->value = value;
3392	SYSCTL_ADD_PROC(&adapter->sysctl_ctx,
3393	    SYSCTL_CHILDREN(adapter->sysctl_tree),
3394	    OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW,
3395	    info, 0, em_sysctl_int_delay, "I", description);
3396}
3397