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