if_em.c revision 139548
14Srgrimes/**************************************************************************
24Srgrimes
34SrgrimesCopyright (c) 2001-2003, Intel Corporation
44SrgrimesAll rights reserved.
54Srgrimes
64SrgrimesRedistribution and use in source and binary forms, with or without
74Srgrimesmodification, are permitted provided that the following conditions are met:
84Srgrimes
94Srgrimes 1. Redistributions of source code must retain the above copyright notice,
104Srgrimes    this list of conditions and the following disclaimer.
114Srgrimes
124Srgrimes 2. Redistributions in binary form must reproduce the above copyright
134Srgrimes    notice, this list of conditions and the following disclaimer in the
144Srgrimes    documentation and/or other materials provided with the distribution.
154Srgrimes
164Srgrimes 3. Neither the name of the Intel Corporation nor the names of its
174Srgrimes    contributors may be used to endorse or promote products derived from
184Srgrimes    this software without specific prior written permission.
194Srgrimes
204SrgrimesTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
214SrgrimesAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
224SrgrimesIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
234SrgrimesARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
244SrgrimesLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
254SrgrimesCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
264SrgrimesSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
274SrgrimesINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
284SrgrimesCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
294SrgrimesARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
304SrgrimesPOSSIBILITY OF SUCH DAMAGE.
314Srgrimes
324Srgrimes***************************************************************************/
334Srgrimes
344Srgrimes/*$FreeBSD: head/sys/dev/em/if_em.c 139548 2005-01-01 19:54:39Z tackerman $*/
354Srgrimes
364Srgrimes#include <dev/em/if_em.h>
374Srgrimes
38620Srgrimes/*********************************************************************
3950477Speter *  Set this to one to display debug statistics
404Srgrimes *********************************************************************/
414Srgrimesint             em_display_debug_stats = 0;
4287649Sguido
4387649Sguido/*********************************************************************
442056Swollman *  Linked list of board private structures for all NICs found
451549Srgrimes *********************************************************************/
465764Sbde
4756525Sbdestruct adapter *em_adapter_list = NULL;
4885448Sjlemon
4912675Sjulian
5085373Sjlemon/*********************************************************************
5185373Sjlemon *  Driver version
5269929Sobrien *********************************************************************/
5385373Sjlemon
5418951Sjulianchar em_driver_version[] = "1.7.35";
5512701Sphk
562056Swollman
5734924Sbde/*********************************************************************
5885373Sjlemon *  PCI Device ID Table
594Srgrimes *
6087620Sguido *  Used by probe to select devices to load on
6187620Sguido *  Last field stores an index into em_strings
6212701Sphk *  Last entry must be all 0s
634Srgrimes *
6412675Sjulian *  { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
6512675Sjulian *********************************************************************/
6612675Sjulian
6712675Sjulianstatic em_vendor_info_t em_vendor_info_array[] =
6812675Sjulian{
6929368Speter        /* Intel(R) PRO/1000 Network Connection */
7072521Sjlemon        { 0x8086, 0x1000, PCI_ANY_ID, PCI_ANY_ID, 0},
7112675Sjulian        { 0x8086, 0x1001, PCI_ANY_ID, PCI_ANY_ID, 0},
7238485Sbde        { 0x8086, 0x1004, PCI_ANY_ID, PCI_ANY_ID, 0},
7347625Sphk        { 0x8086, 0x1008, PCI_ANY_ID, PCI_ANY_ID, 0},
7447625Sphk        { 0x8086, 0x1009, PCI_ANY_ID, PCI_ANY_ID, 0},
7547625Sphk        { 0x8086, 0x100C, PCI_ANY_ID, PCI_ANY_ID, 0},
7647625Sphk        { 0x8086, 0x100D, PCI_ANY_ID, PCI_ANY_ID, 0},
7747625Sphk        { 0x8086, 0x100E, PCI_ANY_ID, PCI_ANY_ID, 0},
7847625Sphk        { 0x8086, 0x100F, PCI_ANY_ID, PCI_ANY_ID, 0},
7947625Sphk        { 0x8086, 0x1010, PCI_ANY_ID, PCI_ANY_ID, 0},
8047625Sphk        { 0x8086, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0},
8147625Sphk        { 0x8086, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0},
8247625Sphk        { 0x8086, 0x1013, PCI_ANY_ID, PCI_ANY_ID, 0},
8347625Sphk        { 0x8086, 0x1014, PCI_ANY_ID, PCI_ANY_ID, 0},
8447625Sphk        { 0x8086, 0x1015, PCI_ANY_ID, PCI_ANY_ID, 0},
8547625Sphk        { 0x8086, 0x1016, PCI_ANY_ID, PCI_ANY_ID, 0},
8672521Sjlemon        { 0x8086, 0x1017, PCI_ANY_ID, PCI_ANY_ID, 0},
8772521Sjlemon        { 0x8086, 0x1018, PCI_ANY_ID, PCI_ANY_ID, 0},
8838485Sbde        { 0x8086, 0x1019, PCI_ANY_ID, PCI_ANY_ID, 0},
8912675Sjulian        { 0x8086, 0x101A, PCI_ANY_ID, PCI_ANY_ID, 0},
9085373Sjlemon	{ 0x8086, 0x101D, PCI_ANY_ID, PCI_ANY_ID, 0},
9185373Sjlemon	{ 0x8086, 0x101E, PCI_ANY_ID, PCI_ANY_ID, 0},
9285373Sjlemon	{ 0x8086, 0x1026, PCI_ANY_ID, PCI_ANY_ID, 0},
9385373Sjlemon        { 0x8086, 0x1027, PCI_ANY_ID, PCI_ANY_ID, 0},
9485373Sjlemon        { 0x8086, 0x1028, PCI_ANY_ID, PCI_ANY_ID, 0},
9585373Sjlemon        { 0x8086, 0x1075, PCI_ANY_ID, PCI_ANY_ID, 0},
9685373Sjlemon        { 0x8086, 0x1076, PCI_ANY_ID, PCI_ANY_ID, 0},
9785373Sjlemon        { 0x8086, 0x1077, PCI_ANY_ID, PCI_ANY_ID, 0},
9885373Sjlemon        { 0x8086, 0x1078, PCI_ANY_ID, PCI_ANY_ID, 0},
9985373Sjlemon        { 0x8086, 0x1079, PCI_ANY_ID, PCI_ANY_ID, 0},
10085373Sjlemon        { 0x8086, 0x107A, PCI_ANY_ID, PCI_ANY_ID, 0},
10185373Sjlemon        { 0x8086, 0x107B, PCI_ANY_ID, PCI_ANY_ID, 0},
10285373Sjlemon        { 0x8086, 0x107C, PCI_ANY_ID, PCI_ANY_ID, 0},
10385373Sjlemon        { 0x8086, 0x108A, PCI_ANY_ID, PCI_ANY_ID, 0},
10485373Sjlemon        /* required last entry */
10585373Sjlemon        { 0, 0, 0, 0, 0}
10685373Sjlemon};
10749049Syokota
10841612Seivind/*********************************************************************
10949049Syokota *  Table of branding strings for all supported NICs.
11027982Sjulian *********************************************************************/
1117680Sjoerg
1127680Sjoergstatic char *em_strings[] = {
1137680Sjoerg	"Intel(R) PRO/1000 Network Connection"
1147680Sjoerg};
11585373Sjlemon
11685373Sjlemon/*********************************************************************
11785373Sjlemon *  Function prototypes
11856525Sbde *********************************************************************/
11987620Sguidostatic int  em_probe(device_t);
12087620Sguidostatic int  em_attach(device_t);
12187620Sguidostatic int  em_detach(device_t);
1225764Sbdestatic int  em_shutdown(device_t);
12385448Sjlemonstatic void em_intr(void *);
12485448Sjlemonstatic void em_start(struct ifnet *);
12555823Syokotastatic int  em_ioctl(struct ifnet *, u_long, caddr_t);
12678161Speterstatic void em_watchdog(struct ifnet *);
12742373Syokotastatic void em_init(void *);
128798Swollmanstatic void em_init_locked(struct adapter *);
12985373Sjlemonstatic void em_stop(void *);
1304Srgrimesstatic void em_media_status(struct ifnet *, struct ifmediareq *);
13185373Sjlemonstatic int  em_media_change(struct ifnet *);
1324Srgrimesstatic void em_identify_hardware(struct adapter *);
1334Srgrimesstatic int  em_allocate_pci_resources(struct adapter *);
13418951Sjulianstatic void em_free_pci_resources(struct adapter *);
13518951Sjulianstatic void em_local_timer(void *);
13618951Sjulianstatic int  em_hardware_init(struct adapter *);
13718951Sjulianstatic void em_setup_interface(device_t, struct adapter *);
13818951Sjulianstatic int  em_setup_transmit_structures(struct adapter *);
13918951Sjulianstatic void em_initialize_transmit_unit(struct adapter *);
14018951Sjulianstatic int  em_setup_receive_structures(struct adapter *);
14118951Sjulianstatic void em_initialize_receive_unit(struct adapter *);
14218951Sjulianstatic void em_enable_intr(struct adapter *);
14318951Sjulianstatic void em_disable_intr(struct adapter *);
14485373Sjlemonstatic void em_free_transmit_structures(struct adapter *);
14518951Sjulianstatic void em_free_receive_structures(struct adapter *);
14685373Sjlemonstatic void em_update_stats_counters(struct adapter *);
1474Srgrimesstatic void em_clean_transmit_interrupts(struct adapter *);
14885373Sjlemonstatic int  em_allocate_receive_structures(struct adapter *);
14985373Sjlemonstatic int  em_allocate_transmit_structures(struct adapter *);
15085373Sjlemonstatic void em_process_receive_interrupts(struct adapter *, int);
151101436Sjakestatic void em_receive_checksum(struct adapter *,
15285373Sjlemon				struct em_rx_desc *,
15385373Sjlemon				struct mbuf *);
15485373Sjlemonstatic void em_transmit_checksum_setup(struct adapter *,
15585373Sjlemon				       struct mbuf *,
15685373Sjlemon				       u_int32_t *,
15785373Sjlemon				       u_int32_t *);
15885373Sjlemonstatic void em_set_promisc(struct adapter *);
15985373Sjlemonstatic void em_disable_promisc(struct adapter *);
16085373Sjlemonstatic void em_set_multi(struct adapter *);
16185373Sjlemonstatic void em_print_hw_stats(struct adapter *);
16285373Sjlemonstatic void em_print_link_status(struct adapter *);
16385373Sjlemonstatic int  em_get_buf(int i, struct adapter *,
16485373Sjlemon		       struct mbuf *);
16585373Sjlemonstatic void em_enable_vlans(struct adapter *);
16685373Sjlemonstatic int  em_encap(struct adapter *, struct mbuf **);
16785373Sjlemonstatic void em_smartspeed(struct adapter *);
1684Srgrimesstatic int  em_82547_fifo_workaround(struct adapter *, int);
16985373Sjlemonstatic void em_82547_update_fifo_head(struct adapter *, int);
17085373Sjlemonstatic int  em_82547_tx_fifo_reset(struct adapter *);
17185373Sjlemonstatic void em_82547_move_tail(void *arg);
17210665Sbdestatic void em_82547_move_tail_locked(struct adapter *);
17387620Sguidostatic int  em_dma_malloc(struct adapter *, bus_size_t,
17487620Sguido			  struct em_dma_alloc *, int);
1754Srgrimesstatic void em_dma_free(struct adapter *, struct em_dma_alloc *);
17685373Sjlemonstatic void em_print_debug_info(struct adapter *);
17710665Sbdestatic int  em_is_valid_ether_addr(u_int8_t *);
17885373Sjlemonstatic int  em_sysctl_stats(SYSCTL_HANDLER_ARGS);
17985373Sjlemonstatic int  em_sysctl_debug_info(SYSCTL_HANDLER_ARGS);
18085373Sjlemonstatic u_int32_t em_fill_descriptors (u_int64_t address,
18187620Sguido				      u_int32_t length,
18287620Sguido				      PDESC_ARRAY desc_array);
18387620Sguidostatic int  em_sysctl_int_delay(SYSCTL_HANDLER_ARGS);
18487620Sguidostatic void em_add_int_delay_sysctl(struct adapter *, const char *,
18587620Sguido				    const char *, struct em_int_delay_info *,
18687620Sguido				    int, int);
18785373Sjlemon
18885373Sjlemon/*********************************************************************
18985373Sjlemon *  FreeBSD Device Interface Entry Points
19085373Sjlemon *********************************************************************/
19185373Sjlemon
19285373Sjlemonstatic device_method_t em_methods[] = {
19385373Sjlemon	/* Device interface */
19485373Sjlemon	DEVMETHOD(device_probe, em_probe),
19585373Sjlemon	DEVMETHOD(device_attach, em_attach),
19685373Sjlemon	DEVMETHOD(device_detach, em_detach),
19785373Sjlemon	DEVMETHOD(device_shutdown, em_shutdown),
19885373Sjlemon	{0, 0}
19985373Sjlemon};
20085373Sjlemon
20148104Syokotastatic driver_t em_driver = {
20285373Sjlemon	"em", em_methods, sizeof(struct adapter ),
20385373Sjlemon};
20485373Sjlemon
20585373Sjlemonstatic devclass_t em_devclass;
20685373SjlemonDRIVER_MODULE(em, pci, em_driver, em_devclass, 0, 0);
20710665SbdeMODULE_DEPEND(em, pci, 1, 1, 1);
20810665SbdeMODULE_DEPEND(em, ether, 1, 1, 1);
20910665Sbde
21085373Sjlemon/*********************************************************************
21110665Sbde *  Tunable default values.
21285373Sjlemon *********************************************************************/
21310665Sbde
21485373Sjlemon#define E1000_TICKS_TO_USECS(ticks)	((1024 * (ticks) + 500) / 1000)
21585373Sjlemon#define E1000_USECS_TO_TICKS(usecs)	((1000 * (usecs) + 512) / 1024)
21685373Sjlemon
21785373Sjlemonstatic int em_tx_int_delay_dflt = E1000_TICKS_TO_USECS(EM_TIDV);
21885373Sjlemonstatic int em_rx_int_delay_dflt = E1000_TICKS_TO_USECS(EM_RDTR);
21985373Sjlemonstatic int em_tx_abs_int_delay_dflt = E1000_TICKS_TO_USECS(EM_TADV);
22085373Sjlemonstatic int em_rx_abs_int_delay_dflt = E1000_TICKS_TO_USECS(EM_RADV);
22185373Sjlemon
22285373SjlemonTUNABLE_INT("hw.em.tx_int_delay", &em_tx_int_delay_dflt);
22385373SjlemonTUNABLE_INT("hw.em.rx_int_delay", &em_rx_int_delay_dflt);
22485373SjlemonTUNABLE_INT("hw.em.tx_abs_int_delay", &em_tx_abs_int_delay_dflt);
22585373SjlemonTUNABLE_INT("hw.em.rx_abs_int_delay", &em_rx_abs_int_delay_dflt);
22685373Sjlemon
22785373Sjlemon/*********************************************************************
22885373Sjlemon *  Device identification routine
22985373Sjlemon *
23085373Sjlemon *  em_probe determines if the driver should be loaded on
23185373Sjlemon *  adapter based on PCI vendor/device id of the adapter.
23210665Sbde *
23356582Sbde *  return 0 on success, positive on failure
2344Srgrimes *********************************************************************/
2354Srgrimes
23685373Sjlemonstatic int
23785373Sjlemonem_probe(device_t dev)
23827982Sjulian{
23985373Sjlemon	em_vendor_info_t *ent;
24027982Sjulian
24185373Sjlemon	u_int16_t       pci_vendor_id = 0;
24285373Sjlemon	u_int16_t       pci_device_id = 0;
24385373Sjlemon	u_int16_t       pci_subvendor_id = 0;
24485373Sjlemon	u_int16_t       pci_subdevice_id = 0;
24585373Sjlemon	char            adapter_name[60];
24685373Sjlemon
24785373Sjlemon	INIT_DEBUGOUT("em_probe: begin");
24827982Sjulian
24985373Sjlemon	pci_vendor_id = pci_get_vendor(dev);
25085373Sjlemon	if (pci_vendor_id != EM_VENDOR_ID)
25127982Sjulian		return(ENXIO);
25285373Sjlemon
25385373Sjlemon	pci_device_id = pci_get_device(dev);
25485373Sjlemon	pci_subvendor_id = pci_get_subvendor(dev);
25585373Sjlemon	pci_subdevice_id = pci_get_subdevice(dev);
25685373Sjlemon
25785373Sjlemon	ent = em_vendor_info_array;
25885373Sjlemon	while (ent->vendor_id != 0) {
25985373Sjlemon		if ((pci_vendor_id == ent->vendor_id) &&
26085373Sjlemon		    (pci_device_id == ent->device_id) &&
26185373Sjlemon
26285373Sjlemon		    ((pci_subvendor_id == ent->subvendor_id) ||
26385373Sjlemon		     (ent->subvendor_id == PCI_ANY_ID)) &&
26485373Sjlemon
26585373Sjlemon		    ((pci_subdevice_id == ent->subdevice_id) ||
26685373Sjlemon		     (ent->subdevice_id == PCI_ANY_ID))) {
26785373Sjlemon			sprintf(adapter_name, "%s, Version - %s",
26885373Sjlemon				em_strings[ent->index],
26985373Sjlemon				em_driver_version);
27085373Sjlemon			device_set_desc_copy(dev, adapter_name);
27185373Sjlemon			return(0);
27285373Sjlemon		}
27385373Sjlemon		ent++;
27485373Sjlemon	}
27585373Sjlemon
27685373Sjlemon	return(ENXIO);
27756582Sbde}
27885373Sjlemon
27985373Sjlemon/*********************************************************************
28085373Sjlemon *  Device initialization routine
28185373Sjlemon *
28285373Sjlemon *  The attach entry point is called when the driver is being loaded.
28385373Sjlemon *  This routine identifies the type of hardware, allocates all resources
28485373Sjlemon *  and initializes the hardware.
28585373Sjlemon *
28685373Sjlemon *  return 0 on success, positive on failure
28785373Sjlemon *********************************************************************/
28885373Sjlemon
28985373Sjlemonstatic int
29085373Sjlemonem_attach(device_t dev)
29185373Sjlemon{
29285373Sjlemon	struct adapter * adapter;
29385373Sjlemon	int             tsize, rsize;
29485373Sjlemon	int		error = 0;
29585373Sjlemon
29685373Sjlemon	INIT_DEBUGOUT("em_attach: begin");
29785373Sjlemon
29885373Sjlemon	/* Allocate, clear, and link in our adapter structure */
29985373Sjlemon	if (!(adapter = device_get_softc(dev))) {
30085373Sjlemon		printf("em: adapter structure allocation failed\n");
30185373Sjlemon		return(ENOMEM);
30285373Sjlemon	}
30385373Sjlemon	bzero(adapter, sizeof(struct adapter ));
30485373Sjlemon	adapter->dev = dev;
30585373Sjlemon	adapter->osdep.dev = dev;
30685373Sjlemon	adapter->unit = device_get_unit(dev);
30785373Sjlemon	EM_LOCK_INIT(adapter, device_get_nameunit(dev));
30885373Sjlemon
30985373Sjlemon	if (em_adapter_list != NULL)
31085373Sjlemon		em_adapter_list->prev = adapter;
31185373Sjlemon	adapter->next = em_adapter_list;
31285373Sjlemon	em_adapter_list = adapter;
31385373Sjlemon
31485373Sjlemon	/* SYSCTL stuff */
31585373Sjlemon        SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
31685373Sjlemon                        SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
31785373Sjlemon                        OID_AUTO, "debug_info", CTLTYPE_INT|CTLFLAG_RW,
31827982Sjulian                        (void *)adapter, 0,
31927982Sjulian                        em_sysctl_debug_info, "I", "Debug Information");
32085373Sjlemon
32185373Sjlemon        SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
32285373Sjlemon                        SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
32327982Sjulian                        OID_AUTO, "stats", CTLTYPE_INT|CTLFLAG_RW,
32427982Sjulian                        (void *)adapter, 0,
32527982Sjulian                        em_sysctl_stats, "I", "Statistics");
32627982Sjulian
32712675Sjulian	callout_init(&adapter->timer, CALLOUT_MPSAFE);
32862573Sphk	callout_init(&adapter->tx_fifo_timer, CALLOUT_MPSAFE);
32927982Sjulian
33027982Sjulian	/* Determine hardware revision */
33127982Sjulian	em_identify_hardware(adapter);
33227982Sjulian
33327982Sjulian	/* Set up some sysctls for the tunable interrupt delays */
33427982Sjulian	em_add_int_delay_sysctl(adapter, "rx_int_delay",
33585373Sjlemon	    "receive interrupt delay in usecs", &adapter->rx_int_delay,
33685373Sjlemon	    E1000_REG_OFFSET(&adapter->hw, RDTR), em_rx_int_delay_dflt);
33785373Sjlemon	em_add_int_delay_sysctl(adapter, "tx_int_delay",
33885373Sjlemon	    "transmit interrupt delay in usecs", &adapter->tx_int_delay,
33985373Sjlemon	    E1000_REG_OFFSET(&adapter->hw, TIDV), em_tx_int_delay_dflt);
34085373Sjlemon	if (adapter->hw.mac_type >= em_82540) {
34185373Sjlemon		em_add_int_delay_sysctl(adapter, "rx_abs_int_delay",
34227982Sjulian		    "receive interrupt delay limit in usecs",
34327982Sjulian		    &adapter->rx_abs_int_delay,
34427982Sjulian		    E1000_REG_OFFSET(&adapter->hw, RADV),
34527982Sjulian		    em_rx_abs_int_delay_dflt);
34627982Sjulian		em_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
34785373Sjlemon		    "transmit interrupt delay limit in usecs",
34827982Sjulian		    &adapter->tx_abs_int_delay,
34927982Sjulian		    E1000_REG_OFFSET(&adapter->hw, TADV),
35085373Sjlemon		    em_tx_abs_int_delay_dflt);
35185373Sjlemon	}
35285373Sjlemon
35385884Sjlemon	/* Parameters (to be read from user) */
35485884Sjlemon        adapter->num_tx_desc = EM_MAX_TXD;
3554Srgrimes        adapter->num_rx_desc = EM_MAX_RXD;
35685373Sjlemon        adapter->hw.autoneg = DO_AUTO_NEG;
3571007Sdg        adapter->hw.wait_autoneg_complete = WAIT_FOR_AUTO_NEG_DEFAULT;
35885884Sjlemon        adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
35985884Sjlemon        adapter->hw.tbi_compatibility_en = TRUE;
36085884Sjlemon        adapter->rx_buffer_len = EM_RXBUFFER_2048;
36185373Sjlemon
36227982Sjulian	/*
36385373Sjlemon         * These parameters control the automatic generation(Tx) and
36491406Sjhb         * response(Rx) to Ethernet PAUSE frames.
3655764Sbde         */
36685373Sjlemon        adapter->hw.fc_high_water = FC_DEFAULT_HI_THRESH;
36785373Sjlemon        adapter->hw.fc_low_water  = FC_DEFAULT_LO_THRESH;
36885373Sjlemon        adapter->hw.fc_pause_time = FC_DEFAULT_TX_TIMER;
36985373Sjlemon        adapter->hw.fc_send_xon   = TRUE;
37085373Sjlemon        adapter->hw.fc = em_fc_full;
37185373Sjlemon
37285373Sjlemon	adapter->hw.phy_init_script = 1;
37385373Sjlemon	adapter->hw.phy_reset_disable = FALSE;
37485373Sjlemon
37585373Sjlemon#ifndef EM_MASTER_SLAVE
37685373Sjlemon	adapter->hw.master_slave = em_ms_hw_default;
37785373Sjlemon#else
37891406Sjhb	adapter->hw.master_slave = EM_MASTER_SLAVE;
37985373Sjlemon#endif
38085373Sjlemon	/*
3814Srgrimes	 * Set the max frame size assuming standard ethernet
3828876Srgrimes	 * sized frames
38312675Sjulian	 */
38485373Sjlemon	adapter->hw.max_frame_size =
3854Srgrimes		ETHERMTU + ETHER_HDR_LEN + ETHER_CRC_LEN;
38685373Sjlemon
3871007Sdg	adapter->hw.min_frame_size =
38885448Sjlemon		MINIMUM_ETHERNET_PACKET_SIZE + ETHER_CRC_LEN;
38985373Sjlemon
39085373Sjlemon	/*
3914Srgrimes	 * This controls when hardware reports transmit completion
39285373Sjlemon	 * status.
39385373Sjlemon	 */
39485373Sjlemon	adapter->hw.report_tx_early = 1;
39585373Sjlemon
39685373Sjlemon
39785373Sjlemon	if (em_allocate_pci_resources(adapter)) {
39885373Sjlemon		printf("em%d: Allocation of PCI resources failed\n",
39985373Sjlemon		       adapter->unit);
40085373Sjlemon                error = ENXIO;
40185458Sjlemon                goto err_pci;
40285373Sjlemon	}
40385373Sjlemon
40485458Sjlemon
40585373Sjlemon	/* Initialize eeprom parameters */
40685373Sjlemon        em_init_eeprom_params(&adapter->hw);
40791406Sjhb
4085764Sbde	tsize = EM_ROUNDUP(adapter->num_tx_desc *
40985373Sjlemon			   sizeof(struct em_tx_desc), 4096);
41027982Sjulian
4114Srgrimes	/* Allocate Transmit Descriptor ring */
4128876Srgrimes        if (em_dma_malloc(adapter, tsize, &adapter->txdma, BUS_DMA_NOWAIT)) {
41312675Sjulian                printf("em%d: Unable to allocate tx_desc memory\n",
41485373Sjlemon                       adapter->unit);
4154Srgrimes		error = ENOMEM;
41685373Sjlemon                goto err_tx_desc;
41756582Sbde        }
41885373Sjlemon        adapter->tx_desc_base = (struct em_tx_desc *) adapter->txdma.dma_vaddr;
41985373Sjlemon
4204Srgrimes	rsize = EM_ROUNDUP(adapter->num_rx_desc *
42185373Sjlemon			   sizeof(struct em_rx_desc), 4096);
42246676Sphk
4234Srgrimes	/* Allocate Receive Descriptor ring */
4248876Srgrimes        if (em_dma_malloc(adapter, rsize, &adapter->rxdma, BUS_DMA_NOWAIT)) {
42512675Sjulian                printf("em%d: Unable to allocate rx_desc memory\n",
42685373Sjlemon                        adapter->unit);
4274Srgrimes		error = ENOMEM;
42885373Sjlemon                goto err_rx_desc;
42956582Sbde        }
43085373Sjlemon        adapter->rx_desc_base = (struct em_rx_desc *) adapter->rxdma.dma_vaddr;
43185373Sjlemon
43285373Sjlemon	/* Initialize the hardware */
4331021Sdg	if (em_hardware_init(adapter)) {
4344Srgrimes		printf("em%d: Unable to initialize the hardware\n",
4354Srgrimes		       adapter->unit);
43685373Sjlemon		error = EIO;
43785373Sjlemon                goto err_hw_init;
43885373Sjlemon	}
43985373Sjlemon
44085373Sjlemon	/* Copy the permanent MAC address out of the EEPROM */
44185373Sjlemon	if (em_read_mac_addr(&adapter->hw) < 0) {
44285373Sjlemon		printf("em%d: EEPROM read error while reading mac address\n",
44385373Sjlemon		       adapter->unit);
4444Srgrimes		error = EIO;
4458876Srgrimes                goto err_mac_addr;
44612675Sjulian	}
44785373Sjlemon
4484Srgrimes	if (!em_is_valid_ether_addr(adapter->hw.mac_addr)) {
44985373Sjlemon                printf("em%d: Invalid mac address\n", adapter->unit);
4504Srgrimes                error = EIO;
4514Srgrimes                goto err_mac_addr;
45285373Sjlemon        }
45385373Sjlemon
4544Srgrimes	bcopy(adapter->hw.mac_addr, adapter->interface_data.ac_enaddr,
4554Srgrimes	      ETHER_ADDR_LEN);
4564Srgrimes
4574Srgrimes	/* Setup OS specific network interface */
4584Srgrimes	em_setup_interface(dev, adapter);
4594Srgrimes
46093593Sjhb	/* Initialize statistics */
4614Srgrimes	em_clear_hw_cntrs(&adapter->hw);
4624Srgrimes	em_update_stats_counters(adapter);
4634Srgrimes	adapter->hw.get_link_status = 1;
4644Srgrimes	em_check_for_link(&adapter->hw);
4654Srgrimes
46685373Sjlemon	/* Print the link status */
46785373Sjlemon	if (adapter->link_active == 1) {
46885373Sjlemon		em_get_speed_and_duplex(&adapter->hw, &adapter->link_speed,
46985373Sjlemon					&adapter->link_duplex);
4704Srgrimes		printf("em%d:  Speed:%d Mbps  Duplex:%s\n",
4714Srgrimes		       adapter->unit,
47285373Sjlemon		       adapter->link_speed,
47385373Sjlemon		       adapter->link_duplex == FULL_DUPLEX ? "Full" : "Half");
47485373Sjlemon	} else
47585373Sjlemon		printf("em%d:  Speed:N/A  Duplex:N/A\n", adapter->unit);
47612675Sjulian
47785373Sjlemon	/* Identify 82544 on PCIX */
4784Srgrimes        em_get_bus_info(&adapter->hw);
47985373Sjlemon        if(adapter->hw.bus_type == em_bus_type_pcix &&
4806712Spst           adapter->hw.mac_type == em_82544) {
48185373Sjlemon                adapter->pcix_82544 = TRUE;
48285373Sjlemon        }
48385373Sjlemon        else {
48485373Sjlemon                adapter->pcix_82544 = FALSE;
48585373Sjlemon        }
48685373Sjlemon	INIT_DEBUGOUT("em_attach: end");
48785373Sjlemon	return(0);
4884Srgrimes
4894Srgrimeserr_mac_addr:
49072521Sjlemonerr_hw_init:
49185373Sjlemon        em_dma_free(adapter, &adapter->rxdma);
49272521Sjlemonerr_rx_desc:
49385373Sjlemon        em_dma_free(adapter, &adapter->txdma);
49485373Sjlemonerr_tx_desc:
49585373Sjlemonerr_pci:
49685373Sjlemon        em_free_pci_resources(adapter);
49772521Sjlemon        return(error);
49885373Sjlemon
49985373Sjlemon}
50072521Sjlemon
50172521Sjlemon/*********************************************************************
50272521Sjlemon *  Device removal routine
50372521Sjlemon *
50485373Sjlemon *  The detach entry point is called when the driver is being removed.
50585373Sjlemon *  This routine stops the adapter and deallocates all the resources
50685373Sjlemon *  that were allocated for driver operation.
507798Swollman *
50885373Sjlemon *  return 0 on success, positive on failure
5094Srgrimes *********************************************************************/
5105160Sjoerg
51185373Sjlemonstatic int
51285373Sjlemonem_detach(device_t dev)
51319268Sjulian{
51485373Sjlemon	struct adapter * adapter = device_get_softc(dev);
51585373Sjlemon	struct ifnet   *ifp = &adapter->interface_data.ac_if;
51685373Sjlemon
51785373Sjlemon	INIT_DEBUGOUT("em_detach: begin");
5185160Sjoerg
5194Srgrimes	EM_LOCK(adapter);
5204Srgrimes	adapter->in_detach = 1;
5213728Sphk	em_stop(adapter);
52285373Sjlemon	em_phy_hw_reset(&adapter->hw);
5233728Sphk	EM_UNLOCK(adapter);
52485373Sjlemon#if __FreeBSD_version < 500000
52585373Sjlemon        ether_ifdetach(&adapter->interface_data.ac_if, ETHER_BPF_SUPPORTED);
52685373Sjlemon#else
52785373Sjlemon        ether_ifdetach(&adapter->interface_data.ac_if);
52885373Sjlemon#endif
52918287Sbde	em_free_pci_resources(adapter);
53085373Sjlemon	bus_generic_detach(dev);
53185373Sjlemon
53285373Sjlemon	/* Free Transmit Descriptor ring */
53385373Sjlemon        if (adapter->tx_desc_base) {
53485373Sjlemon                em_dma_free(adapter, &adapter->txdma);
53585373Sjlemon                adapter->tx_desc_base = NULL;
53685373Sjlemon        }
53785373Sjlemon
5383728Sphk        /* Free Receive Descriptor ring */
5393728Sphk        if (adapter->rx_desc_base) {
540798Swollman                em_dma_free(adapter, &adapter->rxdma);
54185373Sjlemon                adapter->rx_desc_base = NULL;
5424Srgrimes        }
54385373Sjlemon
54485373Sjlemon	/* Remove from the adapter list */
54587620Sguido	if (em_adapter_list == adapter)
54685373Sjlemon		em_adapter_list = adapter->next;
54785373Sjlemon	if (adapter->next != NULL)
5484Srgrimes		adapter->next->prev = adapter->prev;
54985373Sjlemon	if (adapter->prev != NULL)
55085373Sjlemon		adapter->prev->next = adapter->next;
5514Srgrimes
55285373Sjlemon	EM_LOCK_DESTROY(adapter);
55385373Sjlemon
5544Srgrimes	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
55587649Sguido	ifp->if_timer = 0;
55687620Sguido
55787649Sguido	return(0);
55887649Sguido}
55987649Sguido
56087620Sguido/*********************************************************************
56187620Sguido *
56287620Sguido *  Shutdown entry point
56387620Sguido *
56487620Sguido **********************************************************************/
56587620Sguido
56687620Sguidostatic int
56787620Sguidoem_shutdown(device_t dev)
56887620Sguido{
5694Srgrimes	struct adapter *adapter = device_get_softc(dev);
5704Srgrimes	EM_LOCK(adapter);
57155823Syokota	em_stop(adapter);
57285373Sjlemon	EM_UNLOCK(adapter);
57355823Syokota	return(0);
57485373Sjlemon}
57585373Sjlemon
57655823Syokota
57755823Syokota/*********************************************************************
57855823Syokota *  Transmit entry point
57955823Syokota *
58085373Sjlemon *  em_start is called by the stack to initiate a transmit.
58185373Sjlemon *  The driver will remain in this routine as long as there are
58285373Sjlemon *  packets to transmit and transmit resources are available.
58385373Sjlemon *  In case resources are not available stack is notified and
58485373Sjlemon *  the packet is requeued.
58585373Sjlemon **********************************************************************/
58655823Syokota
58755823Syokotastatic void
58855823Syokotaem_start_locked(struct ifnet *ifp)
58955823Syokota{
59012675Sjulian        struct mbuf    *m_head;
59112675Sjulian        struct adapter *adapter = ifp->if_softc;
59212517Sjulian
59312517Sjulian	mtx_assert(&adapter->mtx, MA_OWNED);
59456525Sbde
59556525Sbde        if (!adapter->link_active)
59612517Sjulian                return;
59712517Sjulian
59812517Sjulian        while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
599
600                IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
601
602                if (m_head == NULL) break;
603
604		/*
605		 * em_encap() can modify our pointer, and or make it NULL on
606		 * failure.  In that event, we can't requeue.
607		 */
608		if (em_encap(adapter, &m_head)) {
609			if (m_head == NULL)
610				break;
611			ifp->if_flags |= IFF_OACTIVE;
612			IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
613			break;
614                }
615
616		/* Send a copy of the frame to the BPF listener */
617#if __FreeBSD_version < 500000
618                if (ifp->if_bpf)
619                        bpf_mtap(ifp, m_head);
620#else
621		BPF_MTAP(ifp, m_head);
622#endif
623
624                /* Set timeout in case hardware has problems transmitting */
625                ifp->if_timer = EM_TX_TIMEOUT;
626
627        }
628        return;
629}
630
631static void
632em_start(struct ifnet *ifp)
633{
634	struct adapter *adapter = ifp->if_softc;
635
636	EM_LOCK(adapter);
637	em_start_locked(ifp);
638	EM_UNLOCK(adapter);
639	return;
640}
641
642/*********************************************************************
643 *  Ioctl entry point
644 *
645 *  em_ioctl is called when the user wants to configure the
646 *  interface.
647 *
648 *  return 0 on success, positive on failure
649 **********************************************************************/
650
651static int
652em_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
653{
654	int             mask, reinit, error = 0;
655	struct ifreq   *ifr = (struct ifreq *) data;
656	struct adapter * adapter = ifp->if_softc;
657
658	if (adapter->in_detach) return(error);
659
660	switch (command) {
661	case SIOCSIFADDR:
662	case SIOCGIFADDR:
663		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFADDR (Get/Set Interface Addr)");
664		ether_ioctl(ifp, command, data);
665		break;
666	case SIOCSIFMTU:
667		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
668		if (ifr->ifr_mtu > MAX_JUMBO_FRAME_SIZE - ETHER_HDR_LEN) {
669			error = EINVAL;
670		} else {
671			EM_LOCK(adapter);
672			ifp->if_mtu = ifr->ifr_mtu;
673			adapter->hw.max_frame_size =
674			ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
675			em_init_locked(adapter);
676			EM_UNLOCK(adapter);
677		}
678		break;
679	case SIOCSIFFLAGS:
680		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)");
681		EM_LOCK(adapter);
682		if (ifp->if_flags & IFF_UP) {
683			if (!(ifp->if_flags & IFF_RUNNING)) {
684				em_init_locked(adapter);
685			}
686
687			em_disable_promisc(adapter);
688			em_set_promisc(adapter);
689		} else {
690			if (ifp->if_flags & IFF_RUNNING) {
691				em_stop(adapter);
692			}
693		}
694		EM_UNLOCK(adapter);
695		break;
696	case SIOCADDMULTI:
697	case SIOCDELMULTI:
698		IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI");
699		if (ifp->if_flags & IFF_RUNNING) {
700			EM_LOCK(adapter);
701			em_disable_intr(adapter);
702			em_set_multi(adapter);
703			if (adapter->hw.mac_type == em_82542_rev2_0) {
704				em_initialize_receive_unit(adapter);
705			}
706#ifdef DEVICE_POLLING
707                        if (!(ifp->if_flags & IFF_POLLING))
708#endif
709				em_enable_intr(adapter);
710			EM_UNLOCK(adapter);
711		}
712		break;
713	case SIOCSIFMEDIA:
714	case SIOCGIFMEDIA:
715		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFMEDIA (Get/Set Interface Media)");
716		error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
717		break;
718	case SIOCSIFCAP:
719		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)");
720		reinit = 0;
721		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
722		if (mask & IFCAP_POLLING)
723			ifp->if_capenable ^= IFCAP_POLLING;
724		if (mask & IFCAP_HWCSUM) {
725			ifp->if_capenable ^= IFCAP_HWCSUM;
726			reinit = 1;
727		}
728		if (mask & IFCAP_VLAN_HWTAGGING) {
729			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
730			reinit = 1;
731		}
732		if (reinit && (ifp->if_flags & IFF_RUNNING))
733			em_init(adapter);
734		break;
735	default:
736		IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%x)", (int)command);
737		error = EINVAL;
738	}
739
740	return(error);
741}
742
743/*********************************************************************
744 *  Watchdog entry point
745 *
746 *  This routine is called whenever hardware quits transmitting.
747 *
748 **********************************************************************/
749
750static void
751em_watchdog(struct ifnet *ifp)
752{
753	struct adapter * adapter;
754	adapter = ifp->if_softc;
755
756	/* If we are in this routine because of pause frames, then
757	 * don't reset the hardware.
758	 */
759	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF) {
760		ifp->if_timer = EM_TX_TIMEOUT;
761		return;
762	}
763
764	if (em_check_for_link(&adapter->hw))
765		printf("em%d: watchdog timeout -- resetting\n", adapter->unit);
766
767	ifp->if_flags &= ~IFF_RUNNING;
768
769	em_init(adapter);
770
771	ifp->if_oerrors++;
772	return;
773}
774
775/*********************************************************************
776 *  Init entry point
777 *
778 *  This routine is used in two ways. It is used by the stack as
779 *  init entry point in network interface structure. It is also used
780 *  by the driver as a hw/sw initialization routine to get to a
781 *  consistent state.
782 *
783 *  return 0 on success, positive on failure
784 **********************************************************************/
785
786static void
787em_init_locked(struct adapter * adapter)
788{
789	struct ifnet   *ifp;
790
791	uint32_t	pba;
792	ifp = &adapter->interface_data.ac_if;
793
794	INIT_DEBUGOUT("em_init: begin");
795
796	mtx_assert(&adapter->mtx, MA_OWNED);
797
798	em_stop(adapter);
799
800	/* Packet Buffer Allocation (PBA)
801	 * Writing PBA sets the receive portion of the buffer
802	 * the remainder is used for the transmit buffer.
803	 *
804	 * Devices before the 82547 had a Packet Buffer of 64K.
805	 *   Default allocation: PBA=48K for Rx, leaving 16K for Tx.
806	 * After the 82547 the buffer was reduced to 40K.
807	 *   Default allocation: PBA=30K for Rx, leaving 10K for Tx.
808	 *   Note: default does not leave enough room for Jumbo Frame >10k.
809	 */
810	if(adapter->hw.mac_type < em_82547) {
811		/* Total FIFO is 64K */
812		if(adapter->rx_buffer_len > EM_RXBUFFER_8192)
813			pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */
814		else
815			pba = E1000_PBA_48K; /* 48K for Rx, 16K for Tx */
816	} else {
817		/* Total FIFO is 40K */
818		if(adapter->hw.max_frame_size > EM_RXBUFFER_8192) {
819			pba = E1000_PBA_22K; /* 22K for Rx, 18K for Tx */
820		} else {
821		        pba = E1000_PBA_30K; /* 30K for Rx, 10K for Tx */
822		}
823		adapter->tx_fifo_head = 0;
824		adapter->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT;
825		adapter->tx_fifo_size = (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT;
826	}
827	INIT_DEBUGOUT1("em_init: pba=%dK",pba);
828	E1000_WRITE_REG(&adapter->hw, PBA, pba);
829
830	/* Get the latest mac address, User can use a LAA */
831        bcopy(adapter->interface_data.ac_enaddr, adapter->hw.mac_addr,
832              ETHER_ADDR_LEN);
833
834	/* Initialize the hardware */
835	if (em_hardware_init(adapter)) {
836		printf("em%d: Unable to initialize the hardware\n",
837		       adapter->unit);
838		return;
839	}
840
841	if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING)
842		em_enable_vlans(adapter);
843
844	/* Prepare transmit descriptors and buffers */
845	if (em_setup_transmit_structures(adapter)) {
846		printf("em%d: Could not setup transmit structures\n",
847		       adapter->unit);
848		em_stop(adapter);
849		return;
850	}
851	em_initialize_transmit_unit(adapter);
852
853	/* Setup Multicast table */
854	em_set_multi(adapter);
855
856	/* Prepare receive descriptors and buffers */
857	if (em_setup_receive_structures(adapter)) {
858		printf("em%d: Could not setup receive structures\n",
859		       adapter->unit);
860		em_stop(adapter);
861		return;
862	}
863	em_initialize_receive_unit(adapter);
864
865	/* Don't loose promiscuous settings */
866	em_set_promisc(adapter);
867
868	ifp->if_flags |= IFF_RUNNING;
869	ifp->if_flags &= ~IFF_OACTIVE;
870
871	if (adapter->hw.mac_type >= em_82543) {
872		if (ifp->if_capenable & IFCAP_TXCSUM)
873			ifp->if_hwassist = EM_CHECKSUM_FEATURES;
874		else
875			ifp->if_hwassist = 0;
876	}
877
878	callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
879	em_clear_hw_cntrs(&adapter->hw);
880#ifdef DEVICE_POLLING
881        /*
882         * Only enable interrupts if we are not polling, make sure
883         * they are off otherwise.
884         */
885        if (ifp->if_flags & IFF_POLLING)
886                em_disable_intr(adapter);
887        else
888#endif /* DEVICE_POLLING */
889		em_enable_intr(adapter);
890
891	/* Don't reset the phy next time init gets called */
892	adapter->hw.phy_reset_disable = TRUE;
893
894	return;
895}
896
897static void
898em_init(void *arg)
899{
900	struct adapter * adapter = arg;
901
902	EM_LOCK(adapter);
903	em_init_locked(adapter);
904	EM_UNLOCK(adapter);
905	return;
906}
907
908
909#ifdef DEVICE_POLLING
910static poll_handler_t em_poll;
911
912static void
913em_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
914{
915        struct adapter *adapter = ifp->if_softc;
916        u_int32_t reg_icr;
917
918	mtx_assert(&adapter->mtx, MA_OWNED);
919
920	if (!(ifp->if_capenable & IFCAP_POLLING)) {
921		ether_poll_deregister(ifp);
922		cmd = POLL_DEREGISTER;
923	}
924        if (cmd == POLL_DEREGISTER) {       /* final call, enable interrupts */
925                em_enable_intr(adapter);
926                return;
927        }
928        if (cmd == POLL_AND_CHECK_STATUS) {
929                reg_icr = E1000_READ_REG(&adapter->hw, ICR);
930                if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
931			callout_stop(&adapter->timer);
932                        adapter->hw.get_link_status = 1;
933                        em_check_for_link(&adapter->hw);
934                        em_print_link_status(adapter);
935			callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
936                }
937        }
938        if (ifp->if_flags & IFF_RUNNING) {
939                em_process_receive_interrupts(adapter, count);
940                em_clean_transmit_interrupts(adapter);
941        }
942
943        if (ifp->if_flags & IFF_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
944                em_start_locked(ifp);
945}
946
947static void
948em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
949{
950        struct adapter *adapter = ifp->if_softc;
951
952	EM_LOCK(adapter);
953	em_poll_locked(ifp, cmd, count);
954	EM_UNLOCK(adapter);
955}
956#endif /* DEVICE_POLLING */
957
958/*********************************************************************
959 *
960 *  Interrupt Service routine
961 *
962 **********************************************************************/
963static void
964em_intr(void *arg)
965{
966        u_int32_t       loop_cnt = EM_MAX_INTR;
967        u_int32_t       reg_icr;
968        struct ifnet    *ifp;
969        struct adapter  *adapter = arg;
970
971	EM_LOCK(adapter);
972
973        ifp = &adapter->interface_data.ac_if;
974
975#ifdef DEVICE_POLLING
976        if (ifp->if_flags & IFF_POLLING) {
977		EM_UNLOCK(adapter);
978                return;
979	}
980
981	if ((ifp->if_capenable & IFCAP_POLLING) &&
982	    ether_poll_register(em_poll, ifp)) {
983                em_disable_intr(adapter);
984                em_poll_locked(ifp, 0, 1);
985		EM_UNLOCK(adapter);
986                return;
987        }
988#endif /* DEVICE_POLLING */
989
990	reg_icr = E1000_READ_REG(&adapter->hw, ICR);
991        if (!reg_icr) {
992		EM_UNLOCK(adapter);
993                return;
994        }
995
996        /* Link status change */
997        if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
998		callout_stop(&adapter->timer);
999                adapter->hw.get_link_status = 1;
1000                em_check_for_link(&adapter->hw);
1001                em_print_link_status(adapter);
1002		callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
1003        }
1004
1005        while (loop_cnt > 0) {
1006                if (ifp->if_flags & IFF_RUNNING) {
1007                        em_process_receive_interrupts(adapter, -1);
1008                        em_clean_transmit_interrupts(adapter);
1009                }
1010                loop_cnt--;
1011        }
1012
1013        if (ifp->if_flags & IFF_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1014                em_start_locked(ifp);
1015
1016	EM_UNLOCK(adapter);
1017        return;
1018}
1019
1020
1021
1022/*********************************************************************
1023 *
1024 *  Media Ioctl callback
1025 *
1026 *  This routine is called whenever the user queries the status of
1027 *  the interface using ifconfig.
1028 *
1029 **********************************************************************/
1030static void
1031em_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1032{
1033	struct adapter * adapter = ifp->if_softc;
1034
1035	INIT_DEBUGOUT("em_media_status: begin");
1036
1037	em_check_for_link(&adapter->hw);
1038	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
1039		if (adapter->link_active == 0) {
1040			em_get_speed_and_duplex(&adapter->hw,
1041						&adapter->link_speed,
1042						&adapter->link_duplex);
1043			adapter->link_active = 1;
1044		}
1045	} else {
1046		if (adapter->link_active == 1) {
1047			adapter->link_speed = 0;
1048			adapter->link_duplex = 0;
1049			adapter->link_active = 0;
1050		}
1051	}
1052
1053	ifmr->ifm_status = IFM_AVALID;
1054	ifmr->ifm_active = IFM_ETHER;
1055
1056	if (!adapter->link_active)
1057		return;
1058
1059	ifmr->ifm_status |= IFM_ACTIVE;
1060
1061	if (adapter->hw.media_type == em_media_type_fiber) {
1062		ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
1063	} else {
1064		switch (adapter->link_speed) {
1065		case 10:
1066			ifmr->ifm_active |= IFM_10_T;
1067			break;
1068		case 100:
1069			ifmr->ifm_active |= IFM_100_TX;
1070			break;
1071		case 1000:
1072#if __FreeBSD_version < 500000
1073			ifmr->ifm_active |= IFM_1000_TX;
1074#else
1075			ifmr->ifm_active |= IFM_1000_T;
1076#endif
1077			break;
1078		}
1079		if (adapter->link_duplex == FULL_DUPLEX)
1080			ifmr->ifm_active |= IFM_FDX;
1081		else
1082			ifmr->ifm_active |= IFM_HDX;
1083	}
1084	return;
1085}
1086
1087/*********************************************************************
1088 *
1089 *  Media Ioctl callback
1090 *
1091 *  This routine is called when the user changes speed/duplex using
1092 *  media/mediopt option with ifconfig.
1093 *
1094 **********************************************************************/
1095static int
1096em_media_change(struct ifnet *ifp)
1097{
1098	struct adapter * adapter = ifp->if_softc;
1099	struct ifmedia  *ifm = &adapter->media;
1100
1101	INIT_DEBUGOUT("em_media_change: begin");
1102
1103	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1104		return(EINVAL);
1105
1106	switch (IFM_SUBTYPE(ifm->ifm_media)) {
1107	case IFM_AUTO:
1108		adapter->hw.autoneg = DO_AUTO_NEG;
1109		adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
1110		break;
1111	case IFM_1000_SX:
1112#if __FreeBSD_version < 500000
1113	case IFM_1000_TX:
1114#else
1115	case IFM_1000_T:
1116#endif
1117		adapter->hw.autoneg = DO_AUTO_NEG;
1118		adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
1119		break;
1120	case IFM_100_TX:
1121		adapter->hw.autoneg = FALSE;
1122		adapter->hw.autoneg_advertised = 0;
1123		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1124			adapter->hw.forced_speed_duplex = em_100_full;
1125		else
1126			adapter->hw.forced_speed_duplex	= em_100_half;
1127		break;
1128	case IFM_10_T:
1129		adapter->hw.autoneg = FALSE;
1130		adapter->hw.autoneg_advertised = 0;
1131		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1132			adapter->hw.forced_speed_duplex = em_10_full;
1133		else
1134			adapter->hw.forced_speed_duplex	= em_10_half;
1135		break;
1136	default:
1137		printf("em%d: Unsupported media type\n", adapter->unit);
1138	}
1139
1140	/* As the speed/duplex settings my have changed we need to
1141	 * reset the PHY.
1142	 */
1143	adapter->hw.phy_reset_disable = FALSE;
1144
1145	em_init(adapter);
1146
1147	return(0);
1148}
1149
1150static void
1151em_tx_cb(void *arg, bus_dma_segment_t *seg, int nsegs, bus_size_t mapsize, int error)
1152{
1153        struct em_q *q = arg;
1154
1155        if (error)
1156                return;
1157        KASSERT(nsegs <= EM_MAX_SCATTER,
1158                ("Too many DMA segments returned when mapping tx packet"));
1159        q->nsegs = nsegs;
1160        bcopy(seg, q->segs, nsegs * sizeof(seg[0]));
1161}
1162
1163/*********************************************************************
1164 *
1165 *  This routine maps the mbufs to tx descriptors.
1166 *
1167 *  return 0 on success, positive on failure
1168 **********************************************************************/
1169static int
1170em_encap(struct adapter *adapter, struct mbuf **m_headp)
1171{
1172        u_int32_t       txd_upper;
1173        u_int32_t       txd_lower, txd_used = 0, txd_saved = 0;
1174        int             i, j, error;
1175        u_int64_t       address;
1176
1177	struct mbuf	*m_head;
1178
1179	/* For 82544 Workaround */
1180	DESC_ARRAY              desc_array;
1181	u_int32_t               array_elements;
1182	u_int32_t               counter;
1183
1184#if __FreeBSD_version < 500000
1185        struct ifvlan *ifv = NULL;
1186#else
1187        struct m_tag    *mtag;
1188#endif
1189        struct em_q      q;
1190        struct em_buffer   *tx_buffer = NULL;
1191        struct em_tx_desc *current_tx_desc = NULL;
1192        struct ifnet   *ifp = &adapter->interface_data.ac_if;
1193
1194	m_head = *m_headp;
1195
1196        /*
1197         * Force a cleanup if number of TX descriptors
1198         * available hits the threshold
1199         */
1200        if (adapter->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
1201                em_clean_transmit_interrupts(adapter);
1202                if (adapter->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
1203                        adapter->no_tx_desc_avail1++;
1204                        return(ENOBUFS);
1205                }
1206        }
1207
1208        /*
1209         * Map the packet for DMA.
1210         */
1211        if (bus_dmamap_create(adapter->txtag, BUS_DMA_NOWAIT, &q.map)) {
1212                adapter->no_tx_map_avail++;
1213                return (ENOMEM);
1214        }
1215        error = bus_dmamap_load_mbuf(adapter->txtag, q.map,
1216                                     m_head, em_tx_cb, &q, BUS_DMA_NOWAIT);
1217        if (error != 0) {
1218                adapter->no_tx_dma_setup++;
1219                bus_dmamap_destroy(adapter->txtag, q.map);
1220                return (error);
1221        }
1222        KASSERT(q.nsegs != 0, ("em_encap: empty packet"));
1223
1224        if (q.nsegs > adapter->num_tx_desc_avail) {
1225                adapter->no_tx_desc_avail2++;
1226                bus_dmamap_destroy(adapter->txtag, q.map);
1227                return (ENOBUFS);
1228        }
1229
1230
1231        if (ifp->if_hwassist > 0) {
1232                em_transmit_checksum_setup(adapter,  m_head,
1233                                           &txd_upper, &txd_lower);
1234        } else
1235                txd_upper = txd_lower = 0;
1236
1237
1238        /* Find out if we are in vlan mode */
1239#if __FreeBSD_version < 500000
1240        if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
1241            m_head->m_pkthdr.rcvif != NULL &&
1242            m_head->m_pkthdr.rcvif->if_type == IFT_L2VLAN)
1243                ifv = m_head->m_pkthdr.rcvif->if_softc;
1244#else
1245        mtag = VLAN_OUTPUT_TAG(ifp, m_head);
1246#endif
1247
1248	/*
1249	 * When operating in promiscuous mode, hardware encapsulation for
1250	 * packets is disabled.  This means we have to add the vlan
1251	 * encapsulation in the driver, since it will have come down from the
1252	 * VLAN layer with a tag instead of a VLAN header.
1253	 */
1254	if (mtag != NULL && adapter->em_insert_vlan_header) {
1255		struct ether_vlan_header *evl;
1256		struct ether_header eh;
1257
1258		m_head = m_pullup(m_head, sizeof(eh));
1259		if (m_head == NULL) {
1260			*m_headp = NULL;
1261                	bus_dmamap_destroy(adapter->txtag, q.map);
1262			return (ENOBUFS);
1263		}
1264		eh = *mtod(m_head, struct ether_header *);
1265		M_PREPEND(m_head, sizeof(*evl), M_DONTWAIT);
1266		if (m_head == NULL) {
1267			*m_headp = NULL;
1268                	bus_dmamap_destroy(adapter->txtag, q.map);
1269			return (ENOBUFS);
1270		}
1271		m_head = m_pullup(m_head, sizeof(*evl));
1272		if (m_head == NULL) {
1273			*m_headp = NULL;
1274                	bus_dmamap_destroy(adapter->txtag, q.map);
1275			return (ENOBUFS);
1276		}
1277		evl = mtod(m_head, struct ether_vlan_header *);
1278		bcopy(&eh, evl, sizeof(*evl));
1279		evl->evl_proto = evl->evl_encap_proto;
1280		evl->evl_encap_proto = htons(ETHERTYPE_VLAN);
1281		evl->evl_tag = htons(VLAN_TAG_VALUE(mtag));
1282		m_tag_delete(m_head, mtag);
1283		mtag = NULL;
1284		*m_headp = m_head;
1285	}
1286
1287        i = adapter->next_avail_tx_desc;
1288	if (adapter->pcix_82544) {
1289		txd_saved = i;
1290		txd_used = 0;
1291	}
1292        for (j = 0; j < q.nsegs; j++) {
1293		/* If adapter is 82544 and on PCIX bus */
1294		if(adapter->pcix_82544) {
1295			array_elements = 0;
1296			address = htole64(q.segs[j].ds_addr);
1297			/*
1298			 * Check the Address and Length combination and
1299			 * split the data accordingly
1300			 */
1301                        array_elements = em_fill_descriptors(address,
1302							     htole32(q.segs[j].ds_len),
1303							     &desc_array);
1304			for (counter = 0; counter < array_elements; counter++) {
1305                                if (txd_used == adapter->num_tx_desc_avail) {
1306                                         adapter->next_avail_tx_desc = txd_saved;
1307                                          adapter->no_tx_desc_avail2++;
1308					  bus_dmamap_destroy(adapter->txtag, q.map);
1309                                          return (ENOBUFS);
1310                                }
1311                                tx_buffer = &adapter->tx_buffer_area[i];
1312                                current_tx_desc = &adapter->tx_desc_base[i];
1313                                current_tx_desc->buffer_addr = htole64(
1314					desc_array.descriptor[counter].address);
1315                                current_tx_desc->lower.data = htole32(
1316					(adapter->txd_cmd | txd_lower |
1317					 (u_int16_t)desc_array.descriptor[counter].length));
1318                                current_tx_desc->upper.data = htole32((txd_upper));
1319                                if (++i == adapter->num_tx_desc)
1320                                         i = 0;
1321
1322                                tx_buffer->m_head = NULL;
1323                                txd_used++;
1324                        }
1325		} else {
1326			tx_buffer = &adapter->tx_buffer_area[i];
1327			current_tx_desc = &adapter->tx_desc_base[i];
1328
1329			current_tx_desc->buffer_addr = htole64(q.segs[j].ds_addr);
1330			current_tx_desc->lower.data = htole32(
1331				adapter->txd_cmd | txd_lower | q.segs[j].ds_len);
1332			current_tx_desc->upper.data = htole32(txd_upper);
1333
1334			if (++i == adapter->num_tx_desc)
1335				i = 0;
1336
1337			tx_buffer->m_head = NULL;
1338		}
1339        }
1340
1341	adapter->next_avail_tx_desc = i;
1342	if (adapter->pcix_82544) {
1343		adapter->num_tx_desc_avail -= txd_used;
1344	}
1345	else {
1346		adapter->num_tx_desc_avail -= q.nsegs;
1347	}
1348
1349#if __FreeBSD_version < 500000
1350        if (ifv != NULL) {
1351                /* Set the vlan id */
1352                current_tx_desc->upper.fields.special = htole16(ifv->ifv_tag);
1353#else
1354        if (mtag != NULL) {
1355                /* Set the vlan id */
1356                current_tx_desc->upper.fields.special = htole16(VLAN_TAG_VALUE(mtag));
1357#endif
1358
1359                /* Tell hardware to add tag */
1360                current_tx_desc->lower.data |= htole32(E1000_TXD_CMD_VLE);
1361        }
1362
1363        tx_buffer->m_head = m_head;
1364        tx_buffer->map = q.map;
1365        bus_dmamap_sync(adapter->txtag, q.map, BUS_DMASYNC_PREWRITE);
1366
1367        /*
1368         * Last Descriptor of Packet needs End Of Packet (EOP)
1369         */
1370        current_tx_desc->lower.data |= htole32(E1000_TXD_CMD_EOP);
1371
1372        /*
1373         * Advance the Transmit Descriptor Tail (Tdt), this tells the E1000
1374         * that this frame is available to transmit.
1375         */
1376        bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
1377            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1378        if (adapter->hw.mac_type == em_82547 &&
1379            adapter->link_duplex == HALF_DUPLEX) {
1380                em_82547_move_tail_locked(adapter);
1381        } else {
1382                E1000_WRITE_REG(&adapter->hw, TDT, i);
1383                if (adapter->hw.mac_type == em_82547) {
1384                        em_82547_update_fifo_head(adapter, m_head->m_pkthdr.len);
1385                }
1386        }
1387
1388        return(0);
1389}
1390
1391/*********************************************************************
1392 *
1393 * 82547 workaround to avoid controller hang in half-duplex environment.
1394 * The workaround is to avoid queuing a large packet that would span
1395 * the internal Tx FIFO ring boundary. We need to reset the FIFO pointers
1396 * in this case. We do that only when FIFO is quiescent.
1397 *
1398 **********************************************************************/
1399static void
1400em_82547_move_tail_locked(struct adapter *adapter)
1401{
1402	uint16_t hw_tdt;
1403	uint16_t sw_tdt;
1404	struct em_tx_desc *tx_desc;
1405	uint16_t length = 0;
1406	boolean_t eop = 0;
1407
1408	EM_LOCK_ASSERT(adapter);
1409
1410	hw_tdt = E1000_READ_REG(&adapter->hw, TDT);
1411	sw_tdt = adapter->next_avail_tx_desc;
1412
1413	while (hw_tdt != sw_tdt) {
1414		tx_desc = &adapter->tx_desc_base[hw_tdt];
1415		length += tx_desc->lower.flags.length;
1416		eop = tx_desc->lower.data & E1000_TXD_CMD_EOP;
1417		if(++hw_tdt == adapter->num_tx_desc)
1418			hw_tdt = 0;
1419
1420		if(eop) {
1421			if (em_82547_fifo_workaround(adapter, length)) {
1422				adapter->tx_fifo_wrk_cnt++;
1423				callout_reset(&adapter->tx_fifo_timer, 1,
1424					em_82547_move_tail, adapter);
1425				break;
1426			}
1427			E1000_WRITE_REG(&adapter->hw, TDT, hw_tdt);
1428			em_82547_update_fifo_head(adapter, length);
1429			length = 0;
1430		}
1431	}
1432	return;
1433}
1434
1435static void
1436em_82547_move_tail(void *arg)
1437{
1438        struct adapter *adapter = arg;
1439
1440        EM_LOCK(adapter);
1441        em_82547_move_tail_locked(adapter);
1442        EM_UNLOCK(adapter);
1443}
1444
1445static int
1446em_82547_fifo_workaround(struct adapter *adapter, int len)
1447{
1448	int fifo_space, fifo_pkt_len;
1449
1450	fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
1451
1452	if (adapter->link_duplex == HALF_DUPLEX) {
1453		fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
1454
1455		if (fifo_pkt_len >= (EM_82547_PKT_THRESH + fifo_space)) {
1456			if (em_82547_tx_fifo_reset(adapter)) {
1457				return(0);
1458			}
1459			else {
1460				return(1);
1461			}
1462		}
1463	}
1464
1465	return(0);
1466}
1467
1468static void
1469em_82547_update_fifo_head(struct adapter *adapter, int len)
1470{
1471	int fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
1472
1473	/* tx_fifo_head is always 16 byte aligned */
1474	adapter->tx_fifo_head += fifo_pkt_len;
1475	if (adapter->tx_fifo_head >= adapter->tx_fifo_size) {
1476		adapter->tx_fifo_head -= adapter->tx_fifo_size;
1477	}
1478
1479	return;
1480}
1481
1482
1483static int
1484em_82547_tx_fifo_reset(struct adapter *adapter)
1485{
1486	uint32_t tctl;
1487
1488	if ( (E1000_READ_REG(&adapter->hw, TDT) ==
1489	      E1000_READ_REG(&adapter->hw, TDH)) &&
1490	     (E1000_READ_REG(&adapter->hw, TDFT) ==
1491	      E1000_READ_REG(&adapter->hw, TDFH)) &&
1492	     (E1000_READ_REG(&adapter->hw, TDFTS) ==
1493	      E1000_READ_REG(&adapter->hw, TDFHS)) &&
1494	     (E1000_READ_REG(&adapter->hw, TDFPC) == 0)) {
1495
1496		/* Disable TX unit */
1497		tctl = E1000_READ_REG(&adapter->hw, TCTL);
1498		E1000_WRITE_REG(&adapter->hw, TCTL, tctl & ~E1000_TCTL_EN);
1499
1500		/* Reset FIFO pointers */
1501		E1000_WRITE_REG(&adapter->hw, TDFT,  adapter->tx_head_addr);
1502		E1000_WRITE_REG(&adapter->hw, TDFH,  adapter->tx_head_addr);
1503		E1000_WRITE_REG(&adapter->hw, TDFTS, adapter->tx_head_addr);
1504		E1000_WRITE_REG(&adapter->hw, TDFHS, adapter->tx_head_addr);
1505
1506		/* Re-enable TX unit */
1507		E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
1508		E1000_WRITE_FLUSH(&adapter->hw);
1509
1510		adapter->tx_fifo_head = 0;
1511		adapter->tx_fifo_reset_cnt++;
1512
1513		return(TRUE);
1514	}
1515	else {
1516		return(FALSE);
1517	}
1518}
1519
1520static void
1521em_set_promisc(struct adapter * adapter)
1522{
1523
1524	u_int32_t       reg_rctl;
1525	u_int32_t       ctrl;
1526	struct ifnet   *ifp = &adapter->interface_data.ac_if;
1527
1528	reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1529	ctrl = E1000_READ_REG(&adapter->hw, CTRL);
1530
1531	if (ifp->if_flags & IFF_PROMISC) {
1532		reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
1533		E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1534		/* Disable VLAN stripping in promiscous mode
1535		 * This enables bridging of vlan tagged frames to occur
1536		 * and also allows vlan tags to be seen in tcpdump
1537		 */
1538		ctrl &= ~E1000_CTRL_VME;
1539		E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
1540		adapter->em_insert_vlan_header = 1;
1541	} else if (ifp->if_flags & IFF_ALLMULTI) {
1542		reg_rctl |= E1000_RCTL_MPE;
1543		reg_rctl &= ~E1000_RCTL_UPE;
1544		E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1545		adapter->em_insert_vlan_header = 0;
1546	} else
1547		adapter->em_insert_vlan_header = 0;
1548
1549	return;
1550}
1551
1552static void
1553em_disable_promisc(struct adapter * adapter)
1554{
1555	u_int32_t       reg_rctl;
1556
1557	reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1558
1559	reg_rctl &=  (~E1000_RCTL_UPE);
1560	reg_rctl &=  (~E1000_RCTL_MPE);
1561	E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1562
1563	em_enable_vlans(adapter);
1564	adapter->em_insert_vlan_header = 0;
1565
1566	return;
1567}
1568
1569
1570/*********************************************************************
1571 *  Multicast Update
1572 *
1573 *  This routine is called whenever multicast address list is updated.
1574 *
1575 **********************************************************************/
1576
1577static void
1578em_set_multi(struct adapter * adapter)
1579{
1580        u_int32_t reg_rctl = 0;
1581        u_int8_t  mta[MAX_NUM_MULTICAST_ADDRESSES * ETH_LENGTH_OF_ADDRESS];
1582        struct ifmultiaddr  *ifma;
1583        int mcnt = 0;
1584        struct ifnet   *ifp = &adapter->interface_data.ac_if;
1585
1586        IOCTL_DEBUGOUT("em_set_multi: begin");
1587
1588        if (adapter->hw.mac_type == em_82542_rev2_0) {
1589                reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1590                if (adapter->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE) {
1591                        em_pci_clear_mwi(&adapter->hw);
1592                }
1593                reg_rctl |= E1000_RCTL_RST;
1594                E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1595                msec_delay(5);
1596        }
1597
1598#if __FreeBSD_version < 500000
1599        LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1600#else
1601        TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1602#endif
1603                if (ifma->ifma_addr->sa_family != AF_LINK)
1604                        continue;
1605
1606		if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) break;
1607
1608                bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
1609                      &mta[mcnt*ETH_LENGTH_OF_ADDRESS], ETH_LENGTH_OF_ADDRESS);
1610                mcnt++;
1611        }
1612
1613        if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
1614                reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1615                reg_rctl |= E1000_RCTL_MPE;
1616                E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1617        } else
1618                em_mc_addr_list_update(&adapter->hw, mta, mcnt, 0, 1);
1619
1620        if (adapter->hw.mac_type == em_82542_rev2_0) {
1621                reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
1622                reg_rctl &= ~E1000_RCTL_RST;
1623                E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
1624                msec_delay(5);
1625                if (adapter->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE) {
1626                        em_pci_set_mwi(&adapter->hw);
1627                }
1628        }
1629
1630        return;
1631}
1632
1633
1634/*********************************************************************
1635 *  Timer routine
1636 *
1637 *  This routine checks for link status and updates statistics.
1638 *
1639 **********************************************************************/
1640
1641static void
1642em_local_timer(void *arg)
1643{
1644	struct ifnet   *ifp;
1645	struct adapter * adapter = arg;
1646	ifp = &adapter->interface_data.ac_if;
1647
1648	EM_LOCK(adapter);
1649
1650	em_check_for_link(&adapter->hw);
1651	em_print_link_status(adapter);
1652	em_update_stats_counters(adapter);
1653	if (em_display_debug_stats && ifp->if_flags & IFF_RUNNING) {
1654		em_print_hw_stats(adapter);
1655	}
1656	em_smartspeed(adapter);
1657
1658	callout_reset(&adapter->timer, 2*hz, em_local_timer, adapter);
1659
1660	EM_UNLOCK(adapter);
1661	return;
1662}
1663
1664static void
1665em_print_link_status(struct adapter * adapter)
1666{
1667	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
1668		if (adapter->link_active == 0) {
1669			em_get_speed_and_duplex(&adapter->hw,
1670						&adapter->link_speed,
1671						&adapter->link_duplex);
1672			if (bootverbose)
1673				printf("em%d: Link is up %d Mbps %s\n",
1674				       adapter->unit,
1675				       adapter->link_speed,
1676				       ((adapter->link_duplex == FULL_DUPLEX) ?
1677					"Full Duplex" : "Half Duplex"));
1678			adapter->link_active = 1;
1679			adapter->smartspeed = 0;
1680		}
1681	} else {
1682		if (adapter->link_active == 1) {
1683			adapter->link_speed = 0;
1684			adapter->link_duplex = 0;
1685			if (bootverbose)
1686				printf("em%d: Link is Down\n", adapter->unit);
1687			adapter->link_active = 0;
1688		}
1689	}
1690
1691	return;
1692}
1693
1694/*********************************************************************
1695 *
1696 *  This routine disables all traffic on the adapter by issuing a
1697 *  global reset on the MAC and deallocates TX/RX buffers.
1698 *
1699 **********************************************************************/
1700
1701static void
1702em_stop(void *arg)
1703{
1704	struct ifnet   *ifp;
1705	struct adapter * adapter = arg;
1706	ifp = &adapter->interface_data.ac_if;
1707
1708	mtx_assert(&adapter->mtx, MA_OWNED);
1709
1710	INIT_DEBUGOUT("em_stop: begin");
1711	em_disable_intr(adapter);
1712	em_reset_hw(&adapter->hw);
1713	callout_stop(&adapter->timer);
1714	callout_stop(&adapter->tx_fifo_timer);
1715	em_free_transmit_structures(adapter);
1716	em_free_receive_structures(adapter);
1717
1718
1719	/* Tell the stack that the interface is no longer active */
1720	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1721
1722	return;
1723}
1724
1725
1726/*********************************************************************
1727 *
1728 *  Determine hardware revision.
1729 *
1730 **********************************************************************/
1731static void
1732em_identify_hardware(struct adapter * adapter)
1733{
1734	device_t dev = adapter->dev;
1735
1736	/* Make sure our PCI config space has the necessary stuff set */
1737	adapter->hw.pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2);
1738	if (!((adapter->hw.pci_cmd_word & PCIM_CMD_BUSMASTEREN) &&
1739	      (adapter->hw.pci_cmd_word & PCIM_CMD_MEMEN))) {
1740		printf("em%d: Memory Access and/or Bus Master bits were not set!\n",
1741		       adapter->unit);
1742		adapter->hw.pci_cmd_word |=
1743		(PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN);
1744		pci_write_config(dev, PCIR_COMMAND, adapter->hw.pci_cmd_word, 2);
1745	}
1746
1747	/* Save off the information about this board */
1748	adapter->hw.vendor_id = pci_get_vendor(dev);
1749	adapter->hw.device_id = pci_get_device(dev);
1750	adapter->hw.revision_id = pci_read_config(dev, PCIR_REVID, 1);
1751	adapter->hw.subsystem_vendor_id = pci_read_config(dev, PCIR_SUBVEND_0, 2);
1752	adapter->hw.subsystem_id = pci_read_config(dev, PCIR_SUBDEV_0, 2);
1753
1754	/* Identify the MAC */
1755        if (em_set_mac_type(&adapter->hw))
1756                printf("em%d: Unknown MAC Type\n", adapter->unit);
1757
1758	if(adapter->hw.mac_type == em_82541 ||
1759	   adapter->hw.mac_type == em_82541_rev_2 ||
1760	   adapter->hw.mac_type == em_82547 ||
1761	   adapter->hw.mac_type == em_82547_rev_2)
1762		adapter->hw.phy_init_script = TRUE;
1763
1764        return;
1765}
1766
1767static int
1768em_allocate_pci_resources(struct adapter * adapter)
1769{
1770	int             i, val, rid;
1771	device_t        dev = adapter->dev;
1772
1773	rid = EM_MMBA;
1774	adapter->res_memory = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
1775						     &rid, RF_ACTIVE);
1776	if (!(adapter->res_memory)) {
1777		printf("em%d: Unable to allocate bus resource: memory\n",
1778		       adapter->unit);
1779		return(ENXIO);
1780	}
1781	adapter->osdep.mem_bus_space_tag =
1782	rman_get_bustag(adapter->res_memory);
1783	adapter->osdep.mem_bus_space_handle =
1784	rman_get_bushandle(adapter->res_memory);
1785	adapter->hw.hw_addr = (uint8_t *)&adapter->osdep.mem_bus_space_handle;
1786
1787
1788	if (adapter->hw.mac_type > em_82543) {
1789		/* Figure our where our IO BAR is ? */
1790		rid = EM_MMBA;
1791		for (i = 0; i < 5; i++) {
1792			val = pci_read_config(dev, rid, 4);
1793			if (val & 0x00000001) {
1794				adapter->io_rid = rid;
1795				break;
1796			}
1797			rid += 4;
1798		}
1799
1800		adapter->res_ioport = bus_alloc_resource_any(dev,
1801							     SYS_RES_IOPORT,
1802							     &adapter->io_rid,
1803							     RF_ACTIVE);
1804		if (!(adapter->res_ioport)) {
1805			printf("em%d: Unable to allocate bus resource: ioport\n",
1806			       adapter->unit);
1807			return(ENXIO);
1808		}
1809
1810		adapter->hw.io_base =
1811		rman_get_start(adapter->res_ioport);
1812	}
1813
1814	rid = 0x0;
1815	adapter->res_interrupt = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1816						        RF_SHAREABLE |
1817							RF_ACTIVE);
1818	if (!(adapter->res_interrupt)) {
1819		printf("em%d: Unable to allocate bus resource: interrupt\n",
1820		       adapter->unit);
1821		return(ENXIO);
1822	}
1823	if (bus_setup_intr(dev, adapter->res_interrupt,
1824			   INTR_TYPE_NET | INTR_MPSAFE,
1825			   (void (*)(void *)) em_intr, adapter,
1826			   &adapter->int_handler_tag)) {
1827		printf("em%d: Error registering interrupt handler!\n",
1828		       adapter->unit);
1829		return(ENXIO);
1830	}
1831
1832	adapter->hw.back = &adapter->osdep;
1833
1834	return(0);
1835}
1836
1837static void
1838em_free_pci_resources(struct adapter * adapter)
1839{
1840	device_t dev = adapter->dev;
1841
1842	if (adapter->res_interrupt != NULL) {
1843		bus_teardown_intr(dev, adapter->res_interrupt,
1844				  adapter->int_handler_tag);
1845		bus_release_resource(dev, SYS_RES_IRQ, 0,
1846				     adapter->res_interrupt);
1847	}
1848	if (adapter->res_memory != NULL) {
1849		bus_release_resource(dev, SYS_RES_MEMORY, EM_MMBA,
1850				     adapter->res_memory);
1851	}
1852
1853	if (adapter->res_ioport != NULL) {
1854		bus_release_resource(dev, SYS_RES_IOPORT, adapter->io_rid,
1855				     adapter->res_ioport);
1856	}
1857	return;
1858}
1859
1860/*********************************************************************
1861 *
1862 *  Initialize the hardware to a configuration as specified by the
1863 *  adapter structure. The controller is reset, the EEPROM is
1864 *  verified, the MAC address is set, then the shared initialization
1865 *  routines are called.
1866 *
1867 **********************************************************************/
1868static int
1869em_hardware_init(struct adapter * adapter)
1870{
1871        INIT_DEBUGOUT("em_hardware_init: begin");
1872	/* Issue a global reset */
1873	em_reset_hw(&adapter->hw);
1874
1875	/* When hardware is reset, fifo_head is also reset */
1876	adapter->tx_fifo_head = 0;
1877
1878	/* Make sure we have a good EEPROM before we read from it */
1879	if (em_validate_eeprom_checksum(&adapter->hw) < 0) {
1880		printf("em%d: The EEPROM Checksum Is Not Valid\n",
1881		       adapter->unit);
1882		return(EIO);
1883	}
1884
1885	if (em_read_part_num(&adapter->hw, &(adapter->part_num)) < 0) {
1886		printf("em%d: EEPROM read error while reading part number\n",
1887		       adapter->unit);
1888		return(EIO);
1889	}
1890
1891	if (em_init_hw(&adapter->hw) < 0) {
1892		printf("em%d: Hardware Initialization Failed",
1893		       adapter->unit);
1894		return(EIO);
1895	}
1896
1897	em_check_for_link(&adapter->hw);
1898	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)
1899		adapter->link_active = 1;
1900	else
1901		adapter->link_active = 0;
1902
1903	if (adapter->link_active) {
1904		em_get_speed_and_duplex(&adapter->hw,
1905					&adapter->link_speed,
1906					&adapter->link_duplex);
1907	} else {
1908		adapter->link_speed = 0;
1909		adapter->link_duplex = 0;
1910	}
1911
1912	return(0);
1913}
1914
1915/*********************************************************************
1916 *
1917 *  Setup networking device structure and register an interface.
1918 *
1919 **********************************************************************/
1920static void
1921em_setup_interface(device_t dev, struct adapter * adapter)
1922{
1923	struct ifnet   *ifp;
1924	INIT_DEBUGOUT("em_setup_interface: begin");
1925
1926	ifp = &adapter->interface_data.ac_if;
1927	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1928	ifp->if_mtu = ETHERMTU;
1929	ifp->if_baudrate = 1000000000;
1930	ifp->if_init =  em_init;
1931	ifp->if_softc = adapter;
1932	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1933	ifp->if_ioctl = em_ioctl;
1934	ifp->if_start = em_start;
1935	ifp->if_watchdog = em_watchdog;
1936	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1);
1937	ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1;
1938	IFQ_SET_READY(&ifp->if_snd);
1939
1940#if __FreeBSD_version < 500000
1941        ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
1942#else
1943        ether_ifattach(ifp, adapter->interface_data.ac_enaddr);
1944#endif
1945
1946	ifp->if_capabilities = ifp->if_capenable = 0;
1947
1948	if (adapter->hw.mac_type >= em_82543) {
1949		ifp->if_capabilities |= IFCAP_HWCSUM;
1950		ifp->if_capenable |= IFCAP_HWCSUM;
1951	}
1952
1953	/*
1954	 * Tell the upper layer(s) we support long frames.
1955	 */
1956	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
1957#if __FreeBSD_version >= 500000
1958	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
1959	ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
1960#endif
1961
1962#ifdef DEVICE_POLLING
1963	ifp->if_capabilities |= IFCAP_POLLING;
1964	ifp->if_capenable |= IFCAP_POLLING;
1965#endif
1966
1967	/*
1968	 * Specify the media types supported by this adapter and register
1969	 * callbacks to update media and link information
1970	 */
1971	ifmedia_init(&adapter->media, IFM_IMASK, em_media_change,
1972		     em_media_status);
1973	if (adapter->hw.media_type == em_media_type_fiber) {
1974		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX | IFM_FDX,
1975			    0, NULL);
1976		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX,
1977			    0, NULL);
1978	} else {
1979		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
1980		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T | IFM_FDX,
1981			    0, NULL);
1982		ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX,
1983			    0, NULL);
1984		ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
1985			    0, NULL);
1986#if __FreeBSD_version < 500000
1987		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_TX | IFM_FDX,
1988			    0, NULL);
1989		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_TX, 0, NULL);
1990#else
1991		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1992			    0, NULL);
1993		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1994#endif
1995	}
1996	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1997	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1998
1999	return;
2000}
2001
2002
2003/*********************************************************************
2004 *
2005 *  Workaround for SmartSpeed on 82541 and 82547 controllers
2006 *
2007 **********************************************************************/
2008static void
2009em_smartspeed(struct adapter *adapter)
2010{
2011        uint16_t phy_tmp;
2012
2013	if(adapter->link_active || (adapter->hw.phy_type != em_phy_igp) ||
2014	   !adapter->hw.autoneg || !(adapter->hw.autoneg_advertised & ADVERTISE_1000_FULL))
2015		return;
2016
2017        if(adapter->smartspeed == 0) {
2018                /* If Master/Slave config fault is asserted twice,
2019                 * we assume back-to-back */
2020                em_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_tmp);
2021                if(!(phy_tmp & SR_1000T_MS_CONFIG_FAULT)) return;
2022                em_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_tmp);
2023                if(phy_tmp & SR_1000T_MS_CONFIG_FAULT) {
2024                        em_read_phy_reg(&adapter->hw, PHY_1000T_CTRL,
2025					&phy_tmp);
2026                        if(phy_tmp & CR_1000T_MS_ENABLE) {
2027                                phy_tmp &= ~CR_1000T_MS_ENABLE;
2028                                em_write_phy_reg(&adapter->hw,
2029                                                    PHY_1000T_CTRL, phy_tmp);
2030                                adapter->smartspeed++;
2031                                if(adapter->hw.autoneg &&
2032                                   !em_phy_setup_autoneg(&adapter->hw) &&
2033				   !em_read_phy_reg(&adapter->hw, PHY_CTRL,
2034                                                       &phy_tmp)) {
2035                                        phy_tmp |= (MII_CR_AUTO_NEG_EN |
2036                                                    MII_CR_RESTART_AUTO_NEG);
2037                                        em_write_phy_reg(&adapter->hw,
2038							 PHY_CTRL, phy_tmp);
2039                                }
2040                        }
2041                }
2042                return;
2043        } else if(adapter->smartspeed == EM_SMARTSPEED_DOWNSHIFT) {
2044                /* If still no link, perhaps using 2/3 pair cable */
2045                em_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_tmp);
2046                phy_tmp |= CR_1000T_MS_ENABLE;
2047                em_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_tmp);
2048                if(adapter->hw.autoneg &&
2049                   !em_phy_setup_autoneg(&adapter->hw) &&
2050                   !em_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_tmp)) {
2051                        phy_tmp |= (MII_CR_AUTO_NEG_EN |
2052                                    MII_CR_RESTART_AUTO_NEG);
2053                        em_write_phy_reg(&adapter->hw, PHY_CTRL, phy_tmp);
2054                }
2055        }
2056        /* Restart process after EM_SMARTSPEED_MAX iterations */
2057        if(adapter->smartspeed++ == EM_SMARTSPEED_MAX)
2058                adapter->smartspeed = 0;
2059
2060	return;
2061}
2062
2063
2064/*
2065 * Manage DMA'able memory.
2066 */
2067static void
2068em_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2069{
2070        if (error)
2071                return;
2072        *(bus_addr_t*) arg = segs->ds_addr;
2073        return;
2074}
2075
2076static int
2077em_dma_malloc(struct adapter *adapter, bus_size_t size,
2078        struct em_dma_alloc *dma, int mapflags)
2079{
2080        int r;
2081
2082        r = bus_dma_tag_create(NULL,                    /* parent */
2083                               PAGE_SIZE, 0,            /* alignment, bounds */
2084                               BUS_SPACE_MAXADDR,       /* lowaddr */
2085                               BUS_SPACE_MAXADDR,       /* highaddr */
2086                               NULL, NULL,              /* filter, filterarg */
2087                               size,                    /* maxsize */
2088                               1,                       /* nsegments */
2089                               size,                    /* maxsegsize */
2090                               BUS_DMA_ALLOCNOW,        /* flags */
2091			       NULL,			/* lockfunc */
2092			       NULL,			/* lockarg */
2093                               &dma->dma_tag);
2094        if (r != 0) {
2095                printf("em%d: em_dma_malloc: bus_dma_tag_create failed; "
2096                        "error %u\n", adapter->unit, r);
2097                goto fail_0;
2098        }
2099
2100        r = bus_dmamem_alloc(dma->dma_tag, (void**) &dma->dma_vaddr,
2101                             BUS_DMA_NOWAIT, &dma->dma_map);
2102        if (r != 0) {
2103                printf("em%d: em_dma_malloc: bus_dmammem_alloc failed; "
2104                        "size %ju, error %d\n", adapter->unit,
2105			(uintmax_t)size, r);
2106                goto fail_2;
2107        }
2108
2109        r = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr,
2110                            size,
2111                            em_dmamap_cb,
2112                            &dma->dma_paddr,
2113                            mapflags | BUS_DMA_NOWAIT);
2114        if (r != 0) {
2115                printf("em%d: em_dma_malloc: bus_dmamap_load failed; "
2116                        "error %u\n", adapter->unit, r);
2117                goto fail_3;
2118        }
2119
2120        dma->dma_size = size;
2121        return (0);
2122
2123fail_3:
2124        bus_dmamap_unload(dma->dma_tag, dma->dma_map);
2125fail_2:
2126        bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
2127        bus_dma_tag_destroy(dma->dma_tag);
2128fail_0:
2129        dma->dma_map = NULL;
2130        dma->dma_tag = NULL;
2131        return (r);
2132}
2133
2134static void
2135em_dma_free(struct adapter *adapter, struct em_dma_alloc *dma)
2136{
2137        bus_dmamap_unload(dma->dma_tag, dma->dma_map);
2138        bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
2139        bus_dma_tag_destroy(dma->dma_tag);
2140}
2141
2142
2143/*********************************************************************
2144 *
2145 *  Allocate memory for tx_buffer structures. The tx_buffer stores all
2146 *  the information needed to transmit a packet on the wire.
2147 *
2148 **********************************************************************/
2149static int
2150em_allocate_transmit_structures(struct adapter * adapter)
2151{
2152	if (!(adapter->tx_buffer_area =
2153	      (struct em_buffer *) malloc(sizeof(struct em_buffer) *
2154					     adapter->num_tx_desc, M_DEVBUF,
2155					     M_NOWAIT))) {
2156		printf("em%d: Unable to allocate tx_buffer memory\n",
2157		       adapter->unit);
2158		return ENOMEM;
2159	}
2160
2161	bzero(adapter->tx_buffer_area,
2162	      sizeof(struct em_buffer) * adapter->num_tx_desc);
2163
2164	return 0;
2165}
2166
2167/*********************************************************************
2168 *
2169 *  Allocate and initialize transmit structures.
2170 *
2171 **********************************************************************/
2172static int
2173em_setup_transmit_structures(struct adapter * adapter)
2174{
2175        /*
2176         * Setup DMA descriptor areas.
2177         */
2178        if (bus_dma_tag_create(NULL,                    /* parent */
2179                               1, 0,                    /* alignment, bounds */
2180                               BUS_SPACE_MAXADDR,       /* lowaddr */
2181                               BUS_SPACE_MAXADDR,       /* highaddr */
2182                               NULL, NULL,              /* filter, filterarg */
2183                               MCLBYTES * 8,            /* maxsize */
2184                               EM_MAX_SCATTER,          /* nsegments */
2185                               MCLBYTES * 8,            /* maxsegsize */
2186                               BUS_DMA_ALLOCNOW,        /* flags */
2187			       NULL,			/* lockfunc */
2188			       NULL,			/* lockarg */
2189                               &adapter->txtag)) {
2190                printf("em%d: Unable to allocate TX DMA tag\n", adapter->unit);
2191                return (ENOMEM);
2192        }
2193
2194        if (em_allocate_transmit_structures(adapter))
2195                return (ENOMEM);
2196
2197        bzero((void *) adapter->tx_desc_base,
2198              (sizeof(struct em_tx_desc)) * adapter->num_tx_desc);
2199
2200        adapter->next_avail_tx_desc = 0;
2201        adapter->oldest_used_tx_desc = 0;
2202
2203        /* Set number of descriptors available */
2204        adapter->num_tx_desc_avail = adapter->num_tx_desc;
2205
2206        /* Set checksum context */
2207        adapter->active_checksum_context = OFFLOAD_NONE;
2208
2209        return (0);
2210}
2211
2212/*********************************************************************
2213 *
2214 *  Enable transmit unit.
2215 *
2216 **********************************************************************/
2217static void
2218em_initialize_transmit_unit(struct adapter * adapter)
2219{
2220	u_int32_t       reg_tctl;
2221	u_int32_t       reg_tipg = 0;
2222	u_int64_t	bus_addr;
2223
2224         INIT_DEBUGOUT("em_initialize_transmit_unit: begin");
2225	/* Setup the Base and Length of the Tx Descriptor Ring */
2226	bus_addr = adapter->txdma.dma_paddr;
2227	E1000_WRITE_REG(&adapter->hw, TDBAL, (u_int32_t)bus_addr);
2228	E1000_WRITE_REG(&adapter->hw, TDBAH, (u_int32_t)(bus_addr >> 32));
2229	E1000_WRITE_REG(&adapter->hw, TDLEN,
2230			adapter->num_tx_desc *
2231			sizeof(struct em_tx_desc));
2232
2233	/* Setup the HW Tx Head and Tail descriptor pointers */
2234	E1000_WRITE_REG(&adapter->hw, TDH, 0);
2235	E1000_WRITE_REG(&adapter->hw, TDT, 0);
2236
2237
2238	HW_DEBUGOUT2("Base = %x, Length = %x\n",
2239		     E1000_READ_REG(&adapter->hw, TDBAL),
2240		     E1000_READ_REG(&adapter->hw, TDLEN));
2241
2242	/* Set the default values for the Tx Inter Packet Gap timer */
2243	switch (adapter->hw.mac_type) {
2244	case em_82542_rev2_0:
2245        case em_82542_rev2_1:
2246                reg_tipg = DEFAULT_82542_TIPG_IPGT;
2247                reg_tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
2248                reg_tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
2249                break;
2250        default:
2251                if (adapter->hw.media_type == em_media_type_fiber)
2252                        reg_tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
2253                else
2254                        reg_tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
2255                reg_tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
2256                reg_tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
2257        }
2258
2259	E1000_WRITE_REG(&adapter->hw, TIPG, reg_tipg);
2260	E1000_WRITE_REG(&adapter->hw, TIDV, adapter->tx_int_delay.value);
2261	if(adapter->hw.mac_type >= em_82540)
2262		E1000_WRITE_REG(&adapter->hw, TADV,
2263		    adapter->tx_abs_int_delay.value);
2264
2265	/* Program the Transmit Control Register */
2266	reg_tctl = E1000_TCTL_PSP | E1000_TCTL_EN |
2267		   (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
2268	if (adapter->link_duplex == 1) {
2269		reg_tctl |= E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
2270	} else {
2271		reg_tctl |= E1000_HDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
2272	}
2273	E1000_WRITE_REG(&adapter->hw, TCTL, reg_tctl);
2274
2275	/* Setup Transmit Descriptor Settings for this adapter */
2276	adapter->txd_cmd = E1000_TXD_CMD_IFCS | E1000_TXD_CMD_RS;
2277
2278	if (adapter->tx_int_delay.value > 0)
2279		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
2280
2281	return;
2282}
2283
2284/*********************************************************************
2285 *
2286 *  Free all transmit related data structures.
2287 *
2288 **********************************************************************/
2289static void
2290em_free_transmit_structures(struct adapter * adapter)
2291{
2292        struct em_buffer   *tx_buffer;
2293        int             i;
2294
2295        INIT_DEBUGOUT("free_transmit_structures: begin");
2296
2297        if (adapter->tx_buffer_area != NULL) {
2298                tx_buffer = adapter->tx_buffer_area;
2299                for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
2300                        if (tx_buffer->m_head != NULL) {
2301                                bus_dmamap_unload(adapter->txtag, tx_buffer->map);
2302                                bus_dmamap_destroy(adapter->txtag, tx_buffer->map);
2303                                m_freem(tx_buffer->m_head);
2304                        }
2305                        tx_buffer->m_head = NULL;
2306                }
2307        }
2308        if (adapter->tx_buffer_area != NULL) {
2309                free(adapter->tx_buffer_area, M_DEVBUF);
2310                adapter->tx_buffer_area = NULL;
2311        }
2312        if (adapter->txtag != NULL) {
2313                bus_dma_tag_destroy(adapter->txtag);
2314                adapter->txtag = NULL;
2315        }
2316        return;
2317}
2318
2319/*********************************************************************
2320 *
2321 *  The offload context needs to be set when we transfer the first
2322 *  packet of a particular protocol (TCP/UDP). We change the
2323 *  context only if the protocol type changes.
2324 *
2325 **********************************************************************/
2326static void
2327em_transmit_checksum_setup(struct adapter * adapter,
2328			   struct mbuf *mp,
2329			   u_int32_t *txd_upper,
2330			   u_int32_t *txd_lower)
2331{
2332	struct em_context_desc *TXD;
2333	struct em_buffer *tx_buffer;
2334	int curr_txd;
2335
2336	if (mp->m_pkthdr.csum_flags) {
2337
2338		if (mp->m_pkthdr.csum_flags & CSUM_TCP) {
2339			*txd_upper = E1000_TXD_POPTS_TXSM << 8;
2340			*txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2341			if (adapter->active_checksum_context == OFFLOAD_TCP_IP)
2342				return;
2343			else
2344				adapter->active_checksum_context = OFFLOAD_TCP_IP;
2345
2346		} else if (mp->m_pkthdr.csum_flags & CSUM_UDP) {
2347			*txd_upper = E1000_TXD_POPTS_TXSM << 8;
2348			*txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2349			if (adapter->active_checksum_context == OFFLOAD_UDP_IP)
2350				return;
2351			else
2352				adapter->active_checksum_context = OFFLOAD_UDP_IP;
2353		} else {
2354			*txd_upper = 0;
2355			*txd_lower = 0;
2356			return;
2357		}
2358	} else {
2359		*txd_upper = 0;
2360		*txd_lower = 0;
2361		return;
2362	}
2363
2364	/* If we reach this point, the checksum offload context
2365	 * needs to be reset.
2366	 */
2367	curr_txd = adapter->next_avail_tx_desc;
2368	tx_buffer = &adapter->tx_buffer_area[curr_txd];
2369	TXD = (struct em_context_desc *) &adapter->tx_desc_base[curr_txd];
2370
2371	TXD->lower_setup.ip_fields.ipcss = ETHER_HDR_LEN;
2372	TXD->lower_setup.ip_fields.ipcso =
2373		ETHER_HDR_LEN + offsetof(struct ip, ip_sum);
2374	TXD->lower_setup.ip_fields.ipcse =
2375		htole16(ETHER_HDR_LEN + sizeof(struct ip) - 1);
2376
2377	TXD->upper_setup.tcp_fields.tucss =
2378		ETHER_HDR_LEN + sizeof(struct ip);
2379	TXD->upper_setup.tcp_fields.tucse = htole16(0);
2380
2381	if (adapter->active_checksum_context == OFFLOAD_TCP_IP) {
2382		TXD->upper_setup.tcp_fields.tucso =
2383			ETHER_HDR_LEN + sizeof(struct ip) +
2384			offsetof(struct tcphdr, th_sum);
2385	} else if (adapter->active_checksum_context == OFFLOAD_UDP_IP) {
2386		TXD->upper_setup.tcp_fields.tucso =
2387			ETHER_HDR_LEN + sizeof(struct ip) +
2388			offsetof(struct udphdr, uh_sum);
2389	}
2390
2391	TXD->tcp_seg_setup.data = htole32(0);
2392	TXD->cmd_and_length = htole32(adapter->txd_cmd | E1000_TXD_CMD_DEXT);
2393
2394	tx_buffer->m_head = NULL;
2395
2396	if (++curr_txd == adapter->num_tx_desc)
2397		curr_txd = 0;
2398
2399	adapter->num_tx_desc_avail--;
2400	adapter->next_avail_tx_desc = curr_txd;
2401
2402	return;
2403}
2404
2405/**********************************************************************
2406 *
2407 *  Examine each tx_buffer in the used queue. If the hardware is done
2408 *  processing the packet then free associated resources. The
2409 *  tx_buffer is put back on the free queue.
2410 *
2411 **********************************************************************/
2412static void
2413em_clean_transmit_interrupts(struct adapter * adapter)
2414{
2415        int i, num_avail;
2416        struct em_buffer *tx_buffer;
2417        struct em_tx_desc   *tx_desc;
2418	struct ifnet   *ifp = &adapter->interface_data.ac_if;
2419
2420	mtx_assert(&adapter->mtx, MA_OWNED);
2421
2422        if (adapter->num_tx_desc_avail == adapter->num_tx_desc)
2423                return;
2424
2425#ifdef DBG_STATS
2426        adapter->clean_tx_interrupts++;
2427#endif
2428        num_avail = adapter->num_tx_desc_avail;
2429        i = adapter->oldest_used_tx_desc;
2430
2431        tx_buffer = &adapter->tx_buffer_area[i];
2432        tx_desc = &adapter->tx_desc_base[i];
2433
2434        bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
2435            BUS_DMASYNC_POSTREAD);
2436        while (tx_desc->upper.fields.status & E1000_TXD_STAT_DD) {
2437
2438                tx_desc->upper.data = 0;
2439                num_avail++;
2440
2441                if (tx_buffer->m_head) {
2442			ifp->if_opackets++;
2443                        bus_dmamap_unload(adapter->txtag, tx_buffer->map);
2444                        bus_dmamap_destroy(adapter->txtag, tx_buffer->map);
2445
2446                        m_freem(tx_buffer->m_head);
2447                        tx_buffer->m_head = NULL;
2448                }
2449
2450                if (++i == adapter->num_tx_desc)
2451                        i = 0;
2452
2453                tx_buffer = &adapter->tx_buffer_area[i];
2454                tx_desc = &adapter->tx_desc_base[i];
2455        }
2456        bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map,
2457            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2458
2459        adapter->oldest_used_tx_desc = i;
2460
2461        /*
2462         * If we have enough room, clear IFF_OACTIVE to tell the stack
2463         * that it is OK to send packets.
2464         * If there are no pending descriptors, clear the timeout. Otherwise,
2465         * if some descriptors have been freed, restart the timeout.
2466         */
2467        if (num_avail > EM_TX_CLEANUP_THRESHOLD) {
2468                ifp->if_flags &= ~IFF_OACTIVE;
2469                if (num_avail == adapter->num_tx_desc)
2470                        ifp->if_timer = 0;
2471                else if (num_avail == adapter->num_tx_desc_avail)
2472                        ifp->if_timer = EM_TX_TIMEOUT;
2473        }
2474        adapter->num_tx_desc_avail = num_avail;
2475        return;
2476}
2477
2478/*********************************************************************
2479 *
2480 *  Get a buffer from system mbuf buffer pool.
2481 *
2482 **********************************************************************/
2483static int
2484em_get_buf(int i, struct adapter *adapter,
2485           struct mbuf *nmp)
2486{
2487        register struct mbuf    *mp = nmp;
2488        struct em_buffer *rx_buffer;
2489        struct ifnet   *ifp;
2490        bus_addr_t paddr;
2491        int error;
2492
2493        ifp = &adapter->interface_data.ac_if;
2494
2495        if (mp == NULL) {
2496                mp = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
2497                if (mp == NULL) {
2498                        adapter->mbuf_cluster_failed++;
2499                        return(ENOBUFS);
2500                }
2501                mp->m_len = mp->m_pkthdr.len = MCLBYTES;
2502        } else {
2503                mp->m_len = mp->m_pkthdr.len = MCLBYTES;
2504                mp->m_data = mp->m_ext.ext_buf;
2505                mp->m_next = NULL;
2506        }
2507
2508        if (ifp->if_mtu <= ETHERMTU) {
2509                m_adj(mp, ETHER_ALIGN);
2510        }
2511
2512        rx_buffer = &adapter->rx_buffer_area[i];
2513
2514        /*
2515         * Using memory from the mbuf cluster pool, invoke the
2516         * bus_dma machinery to arrange the memory mapping.
2517         */
2518        error = bus_dmamap_load(adapter->rxtag, rx_buffer->map,
2519                                mtod(mp, void *), mp->m_len,
2520                                em_dmamap_cb, &paddr, 0);
2521        if (error) {
2522                m_free(mp);
2523                return(error);
2524        }
2525        rx_buffer->m_head = mp;
2526        adapter->rx_desc_base[i].buffer_addr = htole64(paddr);
2527        bus_dmamap_sync(adapter->rxtag, rx_buffer->map, BUS_DMASYNC_PREREAD);
2528
2529        return(0);
2530}
2531
2532/*********************************************************************
2533 *
2534 *  Allocate memory for rx_buffer structures. Since we use one
2535 *  rx_buffer per received packet, the maximum number of rx_buffer's
2536 *  that we'll need is equal to the number of receive descriptors
2537 *  that we've allocated.
2538 *
2539 **********************************************************************/
2540static int
2541em_allocate_receive_structures(struct adapter * adapter)
2542{
2543        int             i, error;
2544        struct em_buffer *rx_buffer;
2545
2546        if (!(adapter->rx_buffer_area =
2547              (struct em_buffer *) malloc(sizeof(struct em_buffer) *
2548                                          adapter->num_rx_desc, M_DEVBUF,
2549                                          M_NOWAIT))) {
2550                printf("em%d: Unable to allocate rx_buffer memory\n",
2551                       adapter->unit);
2552                return(ENOMEM);
2553        }
2554
2555        bzero(adapter->rx_buffer_area,
2556              sizeof(struct em_buffer) * adapter->num_rx_desc);
2557
2558        error = bus_dma_tag_create(NULL,                /* parent */
2559                               1, 0,                    /* alignment, bounds */
2560                               BUS_SPACE_MAXADDR,       /* lowaddr */
2561                               BUS_SPACE_MAXADDR,       /* highaddr */
2562                               NULL, NULL,              /* filter, filterarg */
2563                               MCLBYTES,                /* maxsize */
2564                               1,                       /* nsegments */
2565                               MCLBYTES,                /* maxsegsize */
2566                               BUS_DMA_ALLOCNOW,        /* flags */
2567			       NULL,			/* lockfunc */
2568			       NULL,			/* lockarg */
2569                               &adapter->rxtag);
2570        if (error != 0) {
2571                printf("em%d: em_allocate_receive_structures: "
2572                        "bus_dma_tag_create failed; error %u\n",
2573                       adapter->unit, error);
2574                goto fail_0;
2575        }
2576
2577        rx_buffer = adapter->rx_buffer_area;
2578        for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
2579                error = bus_dmamap_create(adapter->rxtag, BUS_DMA_NOWAIT,
2580                                          &rx_buffer->map);
2581                if (error != 0) {
2582                        printf("em%d: em_allocate_receive_structures: "
2583                                "bus_dmamap_create failed; error %u\n",
2584                                adapter->unit, error);
2585                        goto fail_1;
2586                }
2587        }
2588
2589        for (i = 0; i < adapter->num_rx_desc; i++) {
2590                error = em_get_buf(i, adapter, NULL);
2591                if (error != 0) {
2592                        adapter->rx_buffer_area[i].m_head = NULL;
2593                        adapter->rx_desc_base[i].buffer_addr = 0;
2594                        return(error);
2595                }
2596        }
2597        bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
2598            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2599
2600        return(0);
2601
2602fail_1:
2603        bus_dma_tag_destroy(adapter->rxtag);
2604fail_0:
2605        adapter->rxtag = NULL;
2606        free(adapter->rx_buffer_area, M_DEVBUF);
2607        adapter->rx_buffer_area = NULL;
2608        return (error);
2609}
2610
2611/*********************************************************************
2612 *
2613 *  Allocate and initialize receive structures.
2614 *
2615 **********************************************************************/
2616static int
2617em_setup_receive_structures(struct adapter * adapter)
2618{
2619	bzero((void *) adapter->rx_desc_base,
2620              (sizeof(struct em_rx_desc)) * adapter->num_rx_desc);
2621
2622	if (em_allocate_receive_structures(adapter))
2623		return ENOMEM;
2624
2625	/* Setup our descriptor pointers */
2626        adapter->next_rx_desc_to_check = 0;
2627	return(0);
2628}
2629
2630/*********************************************************************
2631 *
2632 *  Enable receive unit.
2633 *
2634 **********************************************************************/
2635static void
2636em_initialize_receive_unit(struct adapter * adapter)
2637{
2638	u_int32_t       reg_rctl;
2639	u_int32_t       reg_rxcsum;
2640	struct ifnet    *ifp;
2641	u_int64_t	bus_addr;
2642
2643        INIT_DEBUGOUT("em_initialize_receive_unit: begin");
2644	ifp = &adapter->interface_data.ac_if;
2645
2646	/* Make sure receives are disabled while setting up the descriptor ring */
2647	E1000_WRITE_REG(&adapter->hw, RCTL, 0);
2648
2649	/* Set the Receive Delay Timer Register */
2650	E1000_WRITE_REG(&adapter->hw, RDTR,
2651			adapter->rx_int_delay.value | E1000_RDT_FPDB);
2652
2653	if(adapter->hw.mac_type >= em_82540) {
2654		E1000_WRITE_REG(&adapter->hw, RADV,
2655		    adapter->rx_abs_int_delay.value);
2656
2657                /* Set the interrupt throttling rate.  Value is calculated
2658                 * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
2659#define MAX_INTS_PER_SEC        8000
2660#define DEFAULT_ITR             1000000000/(MAX_INTS_PER_SEC * 256)
2661                E1000_WRITE_REG(&adapter->hw, ITR, DEFAULT_ITR);
2662        }
2663
2664	/* Setup the Base and Length of the Rx Descriptor Ring */
2665	bus_addr = adapter->rxdma.dma_paddr;
2666	E1000_WRITE_REG(&adapter->hw, RDBAL, (u_int32_t)bus_addr);
2667	E1000_WRITE_REG(&adapter->hw, RDBAH, (u_int32_t)(bus_addr >> 32));
2668	E1000_WRITE_REG(&adapter->hw, RDLEN, adapter->num_rx_desc *
2669			sizeof(struct em_rx_desc));
2670
2671	/* Setup the HW Rx Head and Tail Descriptor Pointers */
2672	E1000_WRITE_REG(&adapter->hw, RDH, 0);
2673	E1000_WRITE_REG(&adapter->hw, RDT, adapter->num_rx_desc - 1);
2674
2675	/* Setup the Receive Control Register */
2676	reg_rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
2677		   E1000_RCTL_RDMTS_HALF |
2678		   (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
2679
2680	if (adapter->hw.tbi_compatibility_on == TRUE)
2681		reg_rctl |= E1000_RCTL_SBP;
2682
2683
2684	switch (adapter->rx_buffer_len) {
2685	default:
2686	case EM_RXBUFFER_2048:
2687		reg_rctl |= E1000_RCTL_SZ_2048;
2688		break;
2689	case EM_RXBUFFER_4096:
2690		reg_rctl |= E1000_RCTL_SZ_4096 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
2691		break;
2692	case EM_RXBUFFER_8192:
2693		reg_rctl |= E1000_RCTL_SZ_8192 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
2694		break;
2695	case EM_RXBUFFER_16384:
2696		reg_rctl |= E1000_RCTL_SZ_16384 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
2697		break;
2698	}
2699
2700	if (ifp->if_mtu > ETHERMTU)
2701		reg_rctl |= E1000_RCTL_LPE;
2702
2703	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
2704	if ((adapter->hw.mac_type >= em_82543) &&
2705	    (ifp->if_capenable & IFCAP_RXCSUM)) {
2706		reg_rxcsum = E1000_READ_REG(&adapter->hw, RXCSUM);
2707		reg_rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL);
2708		E1000_WRITE_REG(&adapter->hw, RXCSUM, reg_rxcsum);
2709	}
2710
2711	/* Enable Receives */
2712	E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
2713
2714	return;
2715}
2716
2717/*********************************************************************
2718 *
2719 *  Free receive related data structures.
2720 *
2721 **********************************************************************/
2722static void
2723em_free_receive_structures(struct adapter *adapter)
2724{
2725        struct em_buffer   *rx_buffer;
2726        int             i;
2727
2728        INIT_DEBUGOUT("free_receive_structures: begin");
2729
2730        if (adapter->rx_buffer_area != NULL) {
2731                rx_buffer = adapter->rx_buffer_area;
2732                for (i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) {
2733                        if (rx_buffer->map != NULL) {
2734                                bus_dmamap_unload(adapter->rxtag, rx_buffer->map);
2735                                bus_dmamap_destroy(adapter->rxtag, rx_buffer->map);
2736                        }
2737                        if (rx_buffer->m_head != NULL)
2738                                m_freem(rx_buffer->m_head);
2739                        rx_buffer->m_head = NULL;
2740                }
2741        }
2742        if (adapter->rx_buffer_area != NULL) {
2743                free(adapter->rx_buffer_area, M_DEVBUF);
2744                adapter->rx_buffer_area = NULL;
2745        }
2746        if (adapter->rxtag != NULL) {
2747                bus_dma_tag_destroy(adapter->rxtag);
2748                adapter->rxtag = NULL;
2749        }
2750        return;
2751}
2752
2753/*********************************************************************
2754 *
2755 *  This routine executes in interrupt context. It replenishes
2756 *  the mbufs in the descriptor and sends data which has been
2757 *  dma'ed into host memory to upper layer.
2758 *
2759 *  We loop at most count times if count is > 0, or until done if
2760 *  count < 0.
2761 *
2762 *********************************************************************/
2763static void
2764em_process_receive_interrupts(struct adapter * adapter, int count)
2765{
2766	struct ifnet        *ifp;
2767	struct mbuf         *mp;
2768#if __FreeBSD_version < 500000
2769        struct ether_header *eh;
2770#endif
2771	u_int8_t            accept_frame = 0;
2772 	u_int8_t            eop = 0;
2773	u_int16_t           len, desc_len, prev_len_adj;
2774	int                 i;
2775
2776	/* Pointer to the receive descriptor being examined. */
2777	struct em_rx_desc   *current_desc;
2778
2779	mtx_assert(&adapter->mtx, MA_OWNED);
2780
2781	ifp = &adapter->interface_data.ac_if;
2782	i = adapter->next_rx_desc_to_check;
2783        current_desc = &adapter->rx_desc_base[i];
2784	bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
2785	    BUS_DMASYNC_POSTREAD);
2786
2787	if (!((current_desc->status) & E1000_RXD_STAT_DD)) {
2788#ifdef DBG_STATS
2789		adapter->no_pkts_avail++;
2790#endif
2791		return;
2792	}
2793
2794	while ((current_desc->status & E1000_RXD_STAT_DD) && (count != 0)) {
2795
2796		mp = adapter->rx_buffer_area[i].m_head;
2797		bus_dmamap_sync(adapter->rxtag, adapter->rx_buffer_area[i].map,
2798				BUS_DMASYNC_POSTREAD);
2799
2800		accept_frame = 1;
2801		prev_len_adj = 0;
2802                desc_len = le16toh(current_desc->length);
2803		if (current_desc->status & E1000_RXD_STAT_EOP) {
2804			count--;
2805			eop = 1;
2806			if (desc_len < ETHER_CRC_LEN) {
2807                                len = 0;
2808                                prev_len_adj = ETHER_CRC_LEN - desc_len;
2809                        }
2810                        else {
2811                                len = desc_len - ETHER_CRC_LEN;
2812                        }
2813		} else {
2814			eop = 0;
2815			len = desc_len;
2816		}
2817
2818		if (current_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
2819			u_int8_t            last_byte;
2820			u_int32_t           pkt_len = desc_len;
2821
2822			if (adapter->fmp != NULL)
2823				pkt_len += adapter->fmp->m_pkthdr.len;
2824
2825			last_byte = *(mtod(mp, caddr_t) + desc_len - 1);
2826
2827			if (TBI_ACCEPT(&adapter->hw, current_desc->status,
2828				       current_desc->errors,
2829				       pkt_len, last_byte)) {
2830				em_tbi_adjust_stats(&adapter->hw,
2831						    &adapter->stats,
2832						    pkt_len,
2833						    adapter->hw.mac_addr);
2834				if (len > 0) len--;
2835			}
2836			else {
2837				accept_frame = 0;
2838			}
2839		}
2840
2841		if (accept_frame) {
2842
2843			if (em_get_buf(i, adapter, NULL) == ENOBUFS) {
2844				adapter->dropped_pkts++;
2845				em_get_buf(i, adapter, mp);
2846				if (adapter->fmp != NULL)
2847					m_freem(adapter->fmp);
2848				adapter->fmp = NULL;
2849				adapter->lmp = NULL;
2850				break;
2851			}
2852
2853			/* Assign correct length to the current fragment */
2854			mp->m_len = len;
2855
2856			if (adapter->fmp == NULL) {
2857				mp->m_pkthdr.len = len;
2858				adapter->fmp = mp;	 /* Store the first mbuf */
2859				adapter->lmp = mp;
2860			} else {
2861				/* Chain mbuf's together */
2862				mp->m_flags &= ~M_PKTHDR;
2863				/*
2864                                 * Adjust length of previous mbuf in chain if we
2865                                 * received less than 4 bytes in the last descriptor.
2866                                 */
2867				if (prev_len_adj > 0) {
2868					adapter->lmp->m_len -= prev_len_adj;
2869					adapter->fmp->m_pkthdr.len -= prev_len_adj;
2870				}
2871				adapter->lmp->m_next = mp;
2872				adapter->lmp = adapter->lmp->m_next;
2873				adapter->fmp->m_pkthdr.len += len;
2874			}
2875
2876                        if (eop) {
2877                                adapter->fmp->m_pkthdr.rcvif = ifp;
2878                                 ifp->if_ipackets++;
2879
2880#if __FreeBSD_version < 500000
2881                                eh = mtod(adapter->fmp, struct ether_header *);
2882                                /* Remove ethernet header from mbuf */
2883                                m_adj(adapter->fmp, sizeof(struct ether_header));
2884                                em_receive_checksum(adapter, current_desc,
2885                                                    adapter->fmp);
2886                                if (current_desc->status & E1000_RXD_STAT_VP)
2887                                        VLAN_INPUT_TAG(eh, adapter->fmp,
2888                                                       (current_desc->special &
2889							E1000_RXD_SPC_VLAN_MASK));
2890                                else
2891                                        ether_input(ifp, eh, adapter->fmp);
2892#else
2893
2894                                em_receive_checksum(adapter, current_desc,
2895                                                    adapter->fmp);
2896                                if (current_desc->status & E1000_RXD_STAT_VP)
2897                                        VLAN_INPUT_TAG(ifp, adapter->fmp,
2898                                                       (current_desc->special &
2899							E1000_RXD_SPC_VLAN_MASK),
2900						       adapter->fmp = NULL);
2901
2902                                if (adapter->fmp != NULL) {
2903					EM_UNLOCK(adapter);
2904                                        (*ifp->if_input)(ifp, adapter->fmp);
2905					EM_LOCK(adapter);
2906				}
2907#endif
2908                                adapter->fmp = NULL;
2909                                adapter->lmp = NULL;
2910                        }
2911		} else {
2912			adapter->dropped_pkts++;
2913			em_get_buf(i, adapter, mp);
2914			if (adapter->fmp != NULL)
2915				m_freem(adapter->fmp);
2916			adapter->fmp = NULL;
2917			adapter->lmp = NULL;
2918		}
2919
2920		/* Zero out the receive descriptors status  */
2921		current_desc->status = 0;
2922
2923		/* Advance the E1000's Receive Queue #0  "Tail Pointer". */
2924                E1000_WRITE_REG(&adapter->hw, RDT, i);
2925
2926                /* Advance our pointers to the next descriptor */
2927                if (++i == adapter->num_rx_desc) {
2928                        i = 0;
2929                        current_desc = adapter->rx_desc_base;
2930                } else
2931			current_desc++;
2932	}
2933	bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
2934	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2935	adapter->next_rx_desc_to_check = i;
2936	return;
2937}
2938
2939/*********************************************************************
2940 *
2941 *  Verify that the hardware indicated that the checksum is valid.
2942 *  Inform the stack about the status of checksum so that stack
2943 *  doesn't spend time verifying the checksum.
2944 *
2945 *********************************************************************/
2946static void
2947em_receive_checksum(struct adapter *adapter,
2948		    struct em_rx_desc *rx_desc,
2949		    struct mbuf *mp)
2950{
2951	/* 82543 or newer only */
2952	if ((adapter->hw.mac_type < em_82543) ||
2953	    /* Ignore Checksum bit is set */
2954	    (rx_desc->status & E1000_RXD_STAT_IXSM)) {
2955		mp->m_pkthdr.csum_flags = 0;
2956		return;
2957	}
2958
2959	if (rx_desc->status & E1000_RXD_STAT_IPCS) {
2960		/* Did it pass? */
2961		if (!(rx_desc->errors & E1000_RXD_ERR_IPE)) {
2962			/* IP Checksum Good */
2963			mp->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
2964			mp->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2965
2966		} else {
2967			mp->m_pkthdr.csum_flags = 0;
2968		}
2969	}
2970
2971	if (rx_desc->status & E1000_RXD_STAT_TCPCS) {
2972		/* Did it pass? */
2973		if (!(rx_desc->errors & E1000_RXD_ERR_TCPE)) {
2974			mp->m_pkthdr.csum_flags |=
2975			(CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
2976			mp->m_pkthdr.csum_data = htons(0xffff);
2977		}
2978	}
2979
2980	return;
2981}
2982
2983
2984static void
2985em_enable_vlans(struct adapter *adapter)
2986{
2987	uint32_t ctrl;
2988
2989	E1000_WRITE_REG(&adapter->hw, VET, ETHERTYPE_VLAN);
2990
2991	ctrl = E1000_READ_REG(&adapter->hw, CTRL);
2992	ctrl |= E1000_CTRL_VME;
2993	E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
2994
2995	return;
2996}
2997
2998static void
2999em_enable_intr(struct adapter * adapter)
3000{
3001	E1000_WRITE_REG(&adapter->hw, IMS, (IMS_ENABLE_MASK));
3002	return;
3003}
3004
3005static void
3006em_disable_intr(struct adapter *adapter)
3007{
3008	E1000_WRITE_REG(&adapter->hw, IMC,
3009			(0xffffffff & ~E1000_IMC_RXSEQ));
3010	return;
3011}
3012
3013static int
3014em_is_valid_ether_addr(u_int8_t *addr)
3015{
3016        char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
3017
3018        if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) {
3019                return (FALSE);
3020        }
3021
3022        return(TRUE);
3023}
3024
3025void
3026em_write_pci_cfg(struct em_hw *hw,
3027		      uint32_t reg,
3028		      uint16_t *value)
3029{
3030	pci_write_config(((struct em_osdep *)hw->back)->dev, reg,
3031			 *value, 2);
3032}
3033
3034void
3035em_read_pci_cfg(struct em_hw *hw, uint32_t reg,
3036		     uint16_t *value)
3037{
3038	*value = pci_read_config(((struct em_osdep *)hw->back)->dev,
3039				 reg, 2);
3040	return;
3041}
3042
3043void
3044em_pci_set_mwi(struct em_hw *hw)
3045{
3046        pci_write_config(((struct em_osdep *)hw->back)->dev,
3047                         PCIR_COMMAND,
3048                         (hw->pci_cmd_word | CMD_MEM_WRT_INVALIDATE), 2);
3049        return;
3050}
3051
3052void
3053em_pci_clear_mwi(struct em_hw *hw)
3054{
3055        pci_write_config(((struct em_osdep *)hw->back)->dev,
3056                         PCIR_COMMAND,
3057                         (hw->pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE), 2);
3058        return;
3059}
3060
3061uint32_t
3062em_io_read(struct em_hw *hw, unsigned long port)
3063{
3064	return(inl(port));
3065}
3066
3067void
3068em_io_write(struct em_hw *hw, unsigned long port, uint32_t value)
3069{
3070	outl(port, value);
3071	return;
3072}
3073
3074/*********************************************************************
3075* 82544 Coexistence issue workaround.
3076*    There are 2 issues.
3077*       1. Transmit Hang issue.
3078*    To detect this issue, following equation can be used...
3079*          SIZE[3:0] + ADDR[2:0] = SUM[3:0].
3080*          If SUM[3:0] is in between 1 to 4, we will have this issue.
3081*
3082*       2. DAC issue.
3083*    To detect this issue, following equation can be used...
3084*          SIZE[3:0] + ADDR[2:0] = SUM[3:0].
3085*          If SUM[3:0] is in between 9 to c, we will have this issue.
3086*
3087*
3088*    WORKAROUND:
3089*          Make sure we do not have ending address as 1,2,3,4(Hang) or 9,a,b,c (DAC)
3090*
3091*** *********************************************************************/
3092static u_int32_t
3093em_fill_descriptors (u_int64_t address,
3094                              u_int32_t length,
3095                              PDESC_ARRAY desc_array)
3096{
3097        /* Since issue is sensitive to length and address.*/
3098        /* Let us first check the address...*/
3099        u_int32_t safe_terminator;
3100        if (length <= 4) {
3101                desc_array->descriptor[0].address = address;
3102                desc_array->descriptor[0].length = length;
3103                desc_array->elements = 1;
3104                return desc_array->elements;
3105        }
3106        safe_terminator = (u_int32_t)((((u_int32_t)address & 0x7) + (length & 0xF)) & 0xF);
3107        /* if it does not fall between 0x1 to 0x4 and 0x9 to 0xC then return */
3108        if (safe_terminator == 0   ||
3109        (safe_terminator > 4   &&
3110        safe_terminator < 9)   ||
3111        (safe_terminator > 0xC &&
3112        safe_terminator <= 0xF)) {
3113                desc_array->descriptor[0].address = address;
3114                desc_array->descriptor[0].length = length;
3115                desc_array->elements = 1;
3116                return desc_array->elements;
3117        }
3118
3119        desc_array->descriptor[0].address = address;
3120        desc_array->descriptor[0].length = length - 4;
3121        desc_array->descriptor[1].address = address + (length - 4);
3122        desc_array->descriptor[1].length = 4;
3123        desc_array->elements = 2;
3124        return desc_array->elements;
3125}
3126
3127/**********************************************************************
3128 *
3129 *  Update the board statistics counters.
3130 *
3131 **********************************************************************/
3132static void
3133em_update_stats_counters(struct adapter *adapter)
3134{
3135	struct ifnet   *ifp;
3136
3137	if(adapter->hw.media_type == em_media_type_copper ||
3138	   (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
3139		adapter->stats.symerrs += E1000_READ_REG(&adapter->hw, SYMERRS);
3140		adapter->stats.sec += E1000_READ_REG(&adapter->hw, SEC);
3141	}
3142	adapter->stats.crcerrs += E1000_READ_REG(&adapter->hw, CRCERRS);
3143	adapter->stats.mpc += E1000_READ_REG(&adapter->hw, MPC);
3144	adapter->stats.scc += E1000_READ_REG(&adapter->hw, SCC);
3145	adapter->stats.ecol += E1000_READ_REG(&adapter->hw, ECOL);
3146
3147	adapter->stats.mcc += E1000_READ_REG(&adapter->hw, MCC);
3148	adapter->stats.latecol += E1000_READ_REG(&adapter->hw, LATECOL);
3149	adapter->stats.colc += E1000_READ_REG(&adapter->hw, COLC);
3150	adapter->stats.dc += E1000_READ_REG(&adapter->hw, DC);
3151	adapter->stats.rlec += E1000_READ_REG(&adapter->hw, RLEC);
3152	adapter->stats.xonrxc += E1000_READ_REG(&adapter->hw, XONRXC);
3153	adapter->stats.xontxc += E1000_READ_REG(&adapter->hw, XONTXC);
3154	adapter->stats.xoffrxc += E1000_READ_REG(&adapter->hw, XOFFRXC);
3155	adapter->stats.xofftxc += E1000_READ_REG(&adapter->hw, XOFFTXC);
3156	adapter->stats.fcruc += E1000_READ_REG(&adapter->hw, FCRUC);
3157	adapter->stats.prc64 += E1000_READ_REG(&adapter->hw, PRC64);
3158	adapter->stats.prc127 += E1000_READ_REG(&adapter->hw, PRC127);
3159	adapter->stats.prc255 += E1000_READ_REG(&adapter->hw, PRC255);
3160	adapter->stats.prc511 += E1000_READ_REG(&adapter->hw, PRC511);
3161	adapter->stats.prc1023 += E1000_READ_REG(&adapter->hw, PRC1023);
3162	adapter->stats.prc1522 += E1000_READ_REG(&adapter->hw, PRC1522);
3163	adapter->stats.gprc += E1000_READ_REG(&adapter->hw, GPRC);
3164	adapter->stats.bprc += E1000_READ_REG(&adapter->hw, BPRC);
3165	adapter->stats.mprc += E1000_READ_REG(&adapter->hw, MPRC);
3166	adapter->stats.gptc += E1000_READ_REG(&adapter->hw, GPTC);
3167
3168	/* For the 64-bit byte counters the low dword must be read first. */
3169	/* Both registers clear on the read of the high dword */
3170
3171	adapter->stats.gorcl += E1000_READ_REG(&adapter->hw, GORCL);
3172	adapter->stats.gorch += E1000_READ_REG(&adapter->hw, GORCH);
3173	adapter->stats.gotcl += E1000_READ_REG(&adapter->hw, GOTCL);
3174	adapter->stats.gotch += E1000_READ_REG(&adapter->hw, GOTCH);
3175
3176	adapter->stats.rnbc += E1000_READ_REG(&adapter->hw, RNBC);
3177	adapter->stats.ruc += E1000_READ_REG(&adapter->hw, RUC);
3178	adapter->stats.rfc += E1000_READ_REG(&adapter->hw, RFC);
3179	adapter->stats.roc += E1000_READ_REG(&adapter->hw, ROC);
3180	adapter->stats.rjc += E1000_READ_REG(&adapter->hw, RJC);
3181
3182	adapter->stats.torl += E1000_READ_REG(&adapter->hw, TORL);
3183	adapter->stats.torh += E1000_READ_REG(&adapter->hw, TORH);
3184	adapter->stats.totl += E1000_READ_REG(&adapter->hw, TOTL);
3185	adapter->stats.toth += E1000_READ_REG(&adapter->hw, TOTH);
3186
3187	adapter->stats.tpr += E1000_READ_REG(&adapter->hw, TPR);
3188	adapter->stats.tpt += E1000_READ_REG(&adapter->hw, TPT);
3189	adapter->stats.ptc64 += E1000_READ_REG(&adapter->hw, PTC64);
3190	adapter->stats.ptc127 += E1000_READ_REG(&adapter->hw, PTC127);
3191	adapter->stats.ptc255 += E1000_READ_REG(&adapter->hw, PTC255);
3192	adapter->stats.ptc511 += E1000_READ_REG(&adapter->hw, PTC511);
3193	adapter->stats.ptc1023 += E1000_READ_REG(&adapter->hw, PTC1023);
3194	adapter->stats.ptc1522 += E1000_READ_REG(&adapter->hw, PTC1522);
3195	adapter->stats.mptc += E1000_READ_REG(&adapter->hw, MPTC);
3196	adapter->stats.bptc += E1000_READ_REG(&adapter->hw, BPTC);
3197
3198	if (adapter->hw.mac_type >= em_82543) {
3199		adapter->stats.algnerrc +=
3200		E1000_READ_REG(&adapter->hw, ALGNERRC);
3201		adapter->stats.rxerrc +=
3202		E1000_READ_REG(&adapter->hw, RXERRC);
3203		adapter->stats.tncrs +=
3204		E1000_READ_REG(&adapter->hw, TNCRS);
3205		adapter->stats.cexterr +=
3206		E1000_READ_REG(&adapter->hw, CEXTERR);
3207		adapter->stats.tsctc +=
3208		E1000_READ_REG(&adapter->hw, TSCTC);
3209		adapter->stats.tsctfc +=
3210		E1000_READ_REG(&adapter->hw, TSCTFC);
3211	}
3212	ifp = &adapter->interface_data.ac_if;
3213
3214	/* Fill out the OS statistics structure */
3215	ifp->if_ibytes = adapter->stats.gorcl;
3216	ifp->if_obytes = adapter->stats.gotcl;
3217	ifp->if_imcasts = adapter->stats.mprc;
3218	ifp->if_collisions = adapter->stats.colc;
3219
3220	/* Rx Errors */
3221	ifp->if_ierrors =
3222	adapter->dropped_pkts +
3223	adapter->stats.rxerrc +
3224	adapter->stats.crcerrs +
3225	adapter->stats.algnerrc +
3226	adapter->stats.rlec +
3227	adapter->stats.mpc + adapter->stats.cexterr;
3228
3229	/* Tx Errors */
3230	ifp->if_oerrors = adapter->stats.ecol + adapter->stats.latecol;
3231
3232}
3233
3234
3235/**********************************************************************
3236 *
3237 *  This routine is called only when em_display_debug_stats is enabled.
3238 *  This routine provides a way to take a look at important statistics
3239 *  maintained by the driver and hardware.
3240 *
3241 **********************************************************************/
3242static void
3243em_print_debug_info(struct adapter *adapter)
3244{
3245        int unit = adapter->unit;
3246	uint8_t *hw_addr = adapter->hw.hw_addr;
3247
3248	printf("em%d: Adapter hardware address = %p \n", unit, hw_addr);
3249	printf("em%d:CTRL  = 0x%x\n", unit,
3250		E1000_READ_REG(&adapter->hw, CTRL));
3251	printf("em%d:RCTL  = 0x%x PS=(0x8402)\n", unit,
3252		E1000_READ_REG(&adapter->hw, RCTL));
3253	printf("em%d:tx_int_delay = %d, tx_abs_int_delay = %d\n", unit,
3254              E1000_READ_REG(&adapter->hw, TIDV),
3255	      E1000_READ_REG(&adapter->hw, TADV));
3256	printf("em%d:rx_int_delay = %d, rx_abs_int_delay = %d\n", unit,
3257              E1000_READ_REG(&adapter->hw, RDTR),
3258	      E1000_READ_REG(&adapter->hw, RADV));
3259
3260#ifdef DBG_STATS
3261        printf("em%d: Packets not Avail = %ld\n", unit,
3262               adapter->no_pkts_avail);
3263        printf("em%d: CleanTxInterrupts = %ld\n", unit,
3264               adapter->clean_tx_interrupts);
3265#endif
3266        printf("em%d: fifo workaround = %lld, fifo_reset = %lld\n", unit,
3267               (long long)adapter->tx_fifo_wrk_cnt,
3268               (long long)adapter->tx_fifo_reset_cnt);
3269        printf("em%d: hw tdh = %d, hw tdt = %d\n", unit,
3270               E1000_READ_REG(&adapter->hw, TDH),
3271               E1000_READ_REG(&adapter->hw, TDT));
3272        printf("em%d: Num Tx descriptors avail = %d\n", unit,
3273               adapter->num_tx_desc_avail);
3274        printf("em%d: Tx Descriptors not avail1 = %ld\n", unit,
3275               adapter->no_tx_desc_avail1);
3276        printf("em%d: Tx Descriptors not avail2 = %ld\n", unit,
3277               adapter->no_tx_desc_avail2);
3278        printf("em%d: Std mbuf failed = %ld\n", unit,
3279               adapter->mbuf_alloc_failed);
3280        printf("em%d: Std mbuf cluster failed = %ld\n", unit,
3281               adapter->mbuf_cluster_failed);
3282        printf("em%d: Driver dropped packets = %ld\n", unit,
3283               adapter->dropped_pkts);
3284
3285        return;
3286}
3287
3288static void
3289em_print_hw_stats(struct adapter *adapter)
3290{
3291        int unit = adapter->unit;
3292
3293        printf("em%d: Excessive collisions = %lld\n", unit,
3294               (long long)adapter->stats.ecol);
3295        printf("em%d: Symbol errors = %lld\n", unit,
3296               (long long)adapter->stats.symerrs);
3297        printf("em%d: Sequence errors = %lld\n", unit,
3298               (long long)adapter->stats.sec);
3299        printf("em%d: Defer count = %lld\n", unit,
3300               (long long)adapter->stats.dc);
3301
3302        printf("em%d: Missed Packets = %lld\n", unit,
3303               (long long)adapter->stats.mpc);
3304        printf("em%d: Receive No Buffers = %lld\n", unit,
3305               (long long)adapter->stats.rnbc);
3306        printf("em%d: Receive length errors = %lld\n", unit,
3307               (long long)adapter->stats.rlec);
3308        printf("em%d: Receive errors = %lld\n", unit,
3309               (long long)adapter->stats.rxerrc);
3310        printf("em%d: Crc errors = %lld\n", unit,
3311               (long long)adapter->stats.crcerrs);
3312        printf("em%d: Alignment errors = %lld\n", unit,
3313               (long long)adapter->stats.algnerrc);
3314        printf("em%d: Carrier extension errors = %lld\n", unit,
3315               (long long)adapter->stats.cexterr);
3316
3317        printf("em%d: XON Rcvd = %lld\n", unit,
3318               (long long)adapter->stats.xonrxc);
3319        printf("em%d: XON Xmtd = %lld\n", unit,
3320               (long long)adapter->stats.xontxc);
3321        printf("em%d: XOFF Rcvd = %lld\n", unit,
3322               (long long)adapter->stats.xoffrxc);
3323        printf("em%d: XOFF Xmtd = %lld\n", unit,
3324               (long long)adapter->stats.xofftxc);
3325
3326        printf("em%d: Good Packets Rcvd = %lld\n", unit,
3327               (long long)adapter->stats.gprc);
3328        printf("em%d: Good Packets Xmtd = %lld\n", unit,
3329               (long long)adapter->stats.gptc);
3330
3331        return;
3332}
3333
3334static int
3335em_sysctl_debug_info(SYSCTL_HANDLER_ARGS)
3336{
3337        int error;
3338        int result;
3339        struct adapter *adapter;
3340
3341        result = -1;
3342        error = sysctl_handle_int(oidp, &result, 0, req);
3343
3344        if (error || !req->newptr)
3345                return (error);
3346
3347        if (result == 1) {
3348                adapter = (struct adapter *)arg1;
3349                em_print_debug_info(adapter);
3350        }
3351
3352        return error;
3353}
3354
3355
3356static int
3357em_sysctl_stats(SYSCTL_HANDLER_ARGS)
3358{
3359        int error;
3360        int result;
3361        struct adapter *adapter;
3362
3363        result = -1;
3364        error = sysctl_handle_int(oidp, &result, 0, req);
3365
3366        if (error || !req->newptr)
3367                return (error);
3368
3369        if (result == 1) {
3370                adapter = (struct adapter *)arg1;
3371                em_print_hw_stats(adapter);
3372        }
3373
3374        return error;
3375}
3376
3377static int
3378em_sysctl_int_delay(SYSCTL_HANDLER_ARGS)
3379{
3380	struct em_int_delay_info *info;
3381	struct adapter *adapter;
3382	u_int32_t regval;
3383	int error;
3384	int usecs;
3385	int ticks;
3386	int s;
3387
3388	info = (struct em_int_delay_info *)arg1;
3389	adapter = info->adapter;
3390	usecs = info->value;
3391	error = sysctl_handle_int(oidp, &usecs, 0, req);
3392	if (error != 0 || req->newptr == NULL)
3393		return error;
3394	if (usecs < 0 || usecs > E1000_TICKS_TO_USECS(65535))
3395		return EINVAL;
3396	info->value = usecs;
3397	ticks = E1000_USECS_TO_TICKS(usecs);
3398
3399	s = splimp();
3400	regval = E1000_READ_OFFSET(&adapter->hw, info->offset);
3401	regval = (regval & ~0xffff) | (ticks & 0xffff);
3402	/* Handle a few special cases. */
3403	switch (info->offset) {
3404	case E1000_RDTR:
3405	case E1000_82542_RDTR:
3406		regval |= E1000_RDT_FPDB;
3407		break;
3408	case E1000_TIDV:
3409	case E1000_82542_TIDV:
3410		if (ticks == 0) {
3411			adapter->txd_cmd &= ~E1000_TXD_CMD_IDE;
3412			/* Don't write 0 into the TIDV register. */
3413			regval++;
3414		} else
3415			adapter->txd_cmd |= E1000_TXD_CMD_IDE;
3416		break;
3417	}
3418	E1000_WRITE_OFFSET(&adapter->hw, info->offset, regval);
3419	splx(s);
3420	return 0;
3421}
3422
3423static void
3424em_add_int_delay_sysctl(struct adapter *adapter, const char *name,
3425    const char *description, struct em_int_delay_info *info,
3426    int offset, int value)
3427{
3428	info->adapter = adapter;
3429	info->offset = offset;
3430	info->value = value;
3431	SYSCTL_ADD_PROC(device_get_sysctl_ctx(adapter->dev),
3432	    SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
3433	    OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW,
3434	    info, 0, em_sysctl_int_delay, "I", description);
3435}
3436