From 6f6f03c6d39d5297e033aa457812d796b2756de7 Mon Sep 17 00:00:00 2001
From: Tom Barbette <barbette@kth.se>
Date: Thu, 4 Mar 2021 09:49:44 +0100
Subject: [PATCH] Remove old patches
These kernels are long dead. If you want speed, use DPDK
---
drivers/e1000-2.x/Makefile.orig | 67 -
drivers/e1000-2.x/e1000.h.orig | 1131 ------
drivers/e1000-2.x/e1000_main.c.orig | 4075 ----------------------
drivers/e1000-4.x/src/e1000.h.orig | 244 --
drivers/e1000-4.x/src/e1000_idiag.c.orig | 1048 ------
drivers/e1000-4.x/src/e1000_main.c.orig | 2536 --------------
drivers/e1000-4.x/src/e1000_param.c.orig | 657 ----
7 files changed, 9758 deletions(-)
delete mode 100644 drivers/e1000-2.x/Makefile.orig
delete mode 100644 drivers/e1000-2.x/e1000.h.orig
delete mode 100644 drivers/e1000-2.x/e1000_main.c.orig
delete mode 100644 drivers/e1000-4.x/src/e1000.h.orig
delete mode 100644 drivers/e1000-4.x/src/e1000_idiag.c.orig
delete mode 100644 drivers/e1000-4.x/src/e1000_main.c.orig
delete mode 100644 drivers/e1000-4.x/src/e1000_param.c.orig
diff --git a/drivers/e1000-2.x/Makefile.orig b/drivers/e1000-2.x/Makefile.orig
deleted file mode 100644
index 63632dc76..000000000
--- a/drivers/e1000-2.x/Makefile.orig
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# Makefile for Intel(R) PRO/1000 LAN Adapter driver for Linux
-# Copyright (C) 1999 - 2000 Intel
-#
-
-CC = gcc
-
-# Required Flags
-CFLAGS = -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -O2 -pipe -I. \
--I/usr/src/linux/include
-# Check for SMP
-CFLAGS += $(subst SMP, -D__SMP__, $(findstring SMP, $(shell uname -v)))
-# Check for Module Versioning
-CFLAGS += $(shell [ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS)
-
-TARGET = e1000.o
-CFILES = e1000_main.c e1000_fxhw.c e1000_phy.c e1000_proc.c
-
-# ANS, ia32 2.2.x only
-ARCH = $(shell uname -m | sed -e s/i.86/i386/)
-KVER = $(shell uname -r | sed -e s/2\.2.*/2.2/)
-ifeq ($(ARCH), i386)
-ifeq ($(KVER), 2.2)
-CFILES += ans.c ans_hw.c ans_os.c ans_driver.c
-CFLAGS += -DIANS -DIANS_BASE_ADAPTER_TEAMING
-IANS = y
-endif
-endif
-
-INSTDIR = /lib/modules/$(shell uname -r)/net
-
-.SILENT: all
-all: $(TARGET)
- echo; echo; \
- echo "**************************************************"; \
- echo "** $(TARGET) built for for $(shell uname -s -r)"; \
- if uname -v | grep SMP > /dev/null; then \
- echo "** SMP Enabled"; \
- else \
- echo "** SMP Disabled"; \
- fi; \
- if [ -f /usr/include/linux/modversions.h ]; then \
- echo "** Module Versioning Enabled"; \
- else \
- echo "** Module Versioning Disabled"; \
- fi; \
- if echo $(IANS) | grep y > /dev/null; then \
- echo "** iANS hooks enabled"; \
- fi;
- echo "**************************************************";
-
-$(TARGET): $(CFILES:.c=.o)
- $(LD) -r $^ -o $@
-
-install: $(TARGET)
- mkdir -p $(INSTDIR)
- install -m 644 $(TARGET) $(INSTDIR)
- depmod -a
-
-uninstall:
- if [ -f $(INSTDIR)/$(TARGET) ]; then \
- rm $(INSTDIR)/$(TARGET); \
- fi
-
-clean:
- rm -f *.o *~ core
-
diff --git a/drivers/e1000-2.x/e1000.h.orig b/drivers/e1000-2.x/e1000.h.orig
deleted file mode 100644
index fbec291d6..000000000
--- a/drivers/e1000-2.x/e1000.h.orig
+++ /dev/null
@@ -1,1131 +0,0 @@
-/*****************************************************************************
- *****************************************************************************
-Copyright (c) 1999 - 2000, Intel Corporation
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of Intel Corporation nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- *****************************************************************************
- ****************************************************************************/
-
-#ifndef _E1000_H_
-#define _E1000_H_
-
-
-/*
- *
- * e1000.h
- *
- */
-
-#include "e1000_kcompat.h"
-#include "e1000_fxhw.h"
-#include "e1000_phy.h"
-
-#ifdef IANS
-#include "ans_driver.h"
-#include "base_comm.h"
-#endif
-
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/delay.h>
-#include <linux/timer.h>
-#include <linux/malloc.h>
-#include <linux/interrupt.h>
-
-#include <linux/version.h>
-#include <linux/string.h>
-#include <linux/proc_fs.h>
-
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,3,18) )
-#include <asm/spinlock.h>
-#else
-#include <linux/spinlock.h>
-#endif
-
-#include <asm/bitops.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-
-
-#define MDI
-
-/* Unix Typedefs */
-typedef unsigned char uchar_t;
-typedef unsigned int uint_t;
-typedef unsigned short ushort_t;
-typedef unsigned long ulong_t;
-typedef unsigned long paddr_t;
-typedef ulong_t major_t;
-typedef unsigned char boolean_t;
-typedef unsigned long uintptr_t;
-
-#define B_TRUE 1
-#define B_FALSE 0
-#define TRUE 1
-#define FALSE 0
-
-typedef struct net_device device_t;
-typedef struct pci_dev pci_dev_t;
-typedef struct sk_buff sk_buff_t;
-typedef struct net_device_stats net_device_stats_t;
-
-
-/*
- * e1000_defines.h
- *
- */
-
-/* Supported RX Buffer Sizes */
-#define E1000_RXBUFFER_2048 2048
-#define E1000_RXBUFFER_4096 4096
-#define E1000_RXBUFFER_8192 8192
-#define E1000_RXBUFFER_16384 16384
-
-/* Max and Min Number of Supported TX and RX Descriptors */
-#define E1000_MAX_TXD 256
-#define E1000_MIN_TXD 80
-#define E1000_MAX_RXD 256
-#define E1000_MIN_RXD 80
-
-#define ETH_LENGTH_OF_ADDRESS 6
-
-/* The number of entries in the CAM. The CAM (Content Addressable
-* Memory) holds the directed and multicast addresses that we
-* monitor. We reserve one of these spots for our directed address,
-* allowing us E1000_CAM_ENTRIES - 1 multicast addresses.
-*/
-
-
-#define RET_STATUS_SUCCESS 0
-#define RET_STATUS_FAILURE 1
-
-/* E1000 specific hardware defines */
-#define e1000regs E1000_REGISTERS
-#define PE1000_ADAPTER bdd_t*
-
-#ifdef MDI
-#define DL_MAC_ADDR_LEN 6
-
-/*****************************************************************************
- * Structure for the Ethernet address ( 48 bits ) or 6 bytes
- *****************************************************************************/
-typedef union {
- uchar_t bytes[DL_MAC_ADDR_LEN];
- ushort_t words[DL_MAC_ADDR_LEN / 2];
-} DL_eaddr_t;
-
-#define DL_ID (ENETM_ID)
-#define ETHERNET_HEADER_SIZE 14
-
-#if defined(DL_STRLOG) && !defined(lint)
-#define DL_LOG(x) DLstrlog ? x : 0
-#else
-#define DL_LOG(x)
-#endif
-
-
-#endif /* MDI */
-
-/*
- * e1000_sw.h
- *
- * This file has all the defines for all the software defined structures
- * that are necessary for the hardware as well as the DLPI interface
- */
-#define E1000_PCI
-
-/* The size in bytes of a standard ethernet header */
-#define ENET_HEADER_SIZE 14
-#define MAX_INTS 256
-#define CRC_LENGTH 4
-
-#define MAXIMUM_ETHERNET_PACKET_SIZE 1514
-
-#define MAX_NUM_MULTICAST_ADDRESSES 128
-#define MAX_NUM_PHYS_FRAGS_PER_PACKET 16
-#define E1000_NUM_MTA_REGISTERS 128
-#define RCV_PKT_MUL 5
-
-/*
- * This structure is used to define the characterstics of the message that is
- * sent by the upper layers for transmission. It contains the physical/virtual
- * address mapping for the physical fragments of the packet and also the length
- * of the fragment.
- */
-typedef struct _PHYS_ADDRESS_UNIT {
- caddr_t FragPhysAddr;
- caddr_t FragVirtAddr;
- UINT Length;
-} PHYS_ADDRESS_UNIT, *PPHYS_ADDRESS_UNIT;
-
-
-/*-----------------------------------------------------------------------------
- A structure that points to the next entry in the queue.
-
------------------------------------------------------------------------------*/
-typedef struct _SINGLE_LIST_LINK {
- struct _SINGLE_LIST_LINK *Flink;
-} SINGLE_LIST_LINK, *PSINGLE_LIST_LINK;
-
-/* This structure stores the additional information that
- * is associated with every packet to be transmitted. It stores
- * the message block pointer and the TBD addresses associated with
- * the m_blk and also the link to the next tcb in the chain
- */
-typedef struct _TX_SW_PACKET_ {
- /* Link to the next TX_SW_PACKET in the list */
- SINGLE_LIST_LINK Link;
-
- sk_buff_t *Packet; /* Pointer to message to be transmitted */
-
- ulong_t TxDescriptorBufferAddr;
- /* First buffer descriptor address */
-
- PE1000_TRANSMIT_DESCRIPTOR FirstDescriptor;
- PE1000_TRANSMIT_DESCRIPTOR LastDescriptor;
- UINT TxSwPacketNumber;
-} TX_SW_PACKET, *PTX_SW_PACKET;
-
-
-
-/* -----------------------------------------------------------------------------
-* A "ListHead" structure that points to the head and tail of a queue
-* --------------------------------------------------------------------------- */
-typedef struct _LIST_DESCRIBER {
- struct _SINGLE_LIST_LINK *volatile Flink;
- struct _SINGLE_LIST_LINK *volatile Blink;
-} LIST_DESCRIBER, *PLIST_DESCRIBER;
-
-
-/* This structure is similar to the RX_SW_PACKET structure used for Ndis.
-* This structure stores information about the 2k aligned receive buffer
-* into which the E1000 DMA's frames. This structure is maintained as a
-* linked list of many receiver buffer pointers.
-*/
-typedef struct _RX_SW_PACKET {
- /* Link to the next RX_SW_PACKET in the list */
- SINGLE_LIST_LINK Link;
-
- struct sk_buff *skb; /* Pointer to the received packet */
-
- /* A virtual pointer to the actual aligned buffer. */
- PVOID VirtualAddress;
-
- /* Debug only fields */
-#if DBG
- PE1000_RECEIVE_DESCRIPTOR DescriptorVirtualAddress;
- UINT RxSwPacketNumber;
-#endif
-
-} RX_SW_PACKET, *PRX_SW_PACKET;
-
-/* MultiCast Command Block (MULTICAST_CB)
-* The multicast structure contains an array of multicast addresses and
-* also a count of the total number of addresses.
-*/
-typedef struct _multicast_cb_t {
- ushort mc_count; /* Number of multicast addresses */
- uchar_t MulticastBuffer[(ETH_LENGTH_OF_ADDRESS *
- MAX_NUM_MULTICAST_ADDRESSES)];
-} mltcst_cb_t, *pmltcst_cb_t;
-
-
-/* ----------------------------------------------------------------------------- QUEUE_INIT_LIST -- Macro which will initialize a queue to NULL.
----------------------------------------------------------------------------*/
-#define QUEUE_INIT_LIST(_LH) \
- (_LH)->Flink = (_LH)->Blink = (PSINGLE_LIST_LINK)0
-
-/*-----------------------------------------------------------------------------
-* IS_QUEUE_EMPTY -- Macro which checks to see if a queue is empty.
-*--------------------------------------------------------------------------- */
-#define IS_QUEUE_EMPTY(_LH) \
- ((_LH)->Flink == (PSINGLE_LIST_LINK)0)
-
-
-/* -------------------------------------------------------------------------
-* QUEUE_GET_HEAD -- Macro which returns the head of the queue, but does not
-* remove the head from the queue.
-*------------------------------------------------------------------------- */
-#define QUEUE_GET_HEAD(_LH) ((PSINGLE_LIST_LINK) ((_LH)->Flink))
-
-/*-----------------------------------------------------------------------------
-* QUEUE_REMOVE_HEAD -- Macro which removes the head of the head of a queue.
-*-------------------------------------------------------------------------- */
-#define QUEUE_REMOVE_HEAD(_LH) \
- { \
- PSINGLE_LIST_LINK ListElem; \
- if (ListElem = (_LH)->Flink) \
- { \
- if(!((_LH)->Flink = ListElem->Flink)) \
- (_LH)->Blink = (PSINGLE_LIST_LINK) 0; \
- } \
- }
-
-
-/*-----------------------------------------------------------------------------
-* QUEUE_POP_HEAD -- Macro which will pop the head off of a queue (list), and
-* return it (this differs from QUEUE_REMOVE_HEAD only in
-* the 1st line).
-*-----------------------------------------------------------------------------*/
-#define QUEUE_POP_HEAD(_LH) \
- (PSINGLE_LIST_LINK) (_LH)->Flink; \
- { \
- PSINGLE_LIST_LINK ListElem; \
- if ((ListElem = (_LH)->Flink)) \
- { \
- if(!((_LH)->Flink = ListElem->Flink)) \
- (_LH)->Blink = (PSINGLE_LIST_LINK) 0; \
- } \
- }
-
-
-/*-----------------------------------------------------------------------------
-* QUEUE_GET_TAIL -- Macro which returns the tail of the queue, but does not
-* remove the tail from the queue.
-*-------------------------------------------------------------------------- */
-#define QUEUE_GET_TAIL(_LH) ((PSINGLE_LIST_LINK)((_LH)->Blink))
-
-
-/*-----------------------------------------------------------------------------
-* QUEUE_PUSH_TAIL -- Macro which puts an element at the tail (end) of the queue
-*
-*--------------------------------------------------------------------------- */
-#define QUEUE_PUSH_TAIL(_LH,_E) \
- if ((_LH)->Blink) \
- { \
- ((PSINGLE_LIST_LINK)(_LH)->Blink)->Flink = (PSINGLE_LIST_LINK)(_E); \
- (_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \
- } else \
- { \
- (_LH)->Flink = \
- (_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \
- } \
- (_E)->Flink = (PSINGLE_LIST_LINK)0;
-
-
-
-/*-----------------------------------------------------------------------------
-* QUEUE_PUSH_HEAD -- Macro which puts an element at the head of the queue.
-*--------------------------------------------------------------------------- */
-#define QUEUE_PUSH_HEAD(_LH,_E) \
- if (!((_E)->Flink = (_LH)->Flink)) \
- { \
- (_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \
- } \
- (_LH)->Flink = (PSINGLE_LIST_LINK)(_E);
-
-
-/* Ethernet Frame Structure */
-/*- Ethernet 6-byte Address */
-typedef struct _eth_address_t {
- uchar_t eth_node_addr[ETH_LENGTH_OF_ADDRESS];
-} eth_address_t, *peth_address_t;
-
-typedef enum {
- ANE_ENABLED = 0,
- ANE_DISABLED,
- ANE_SUSPEND
-} ANE_state_t;
-
-/* This is the hardware dependant part of the board config structure called
- bdd_t structure, it is very similar to the Adapter structure in the
- driver. The bd_config structure defined by the DLPI interface has
- pointer to this structure
-*/
-#define TX_LOCKUP 0x01
-typedef struct _ADAPTER_STRUCT {
- /* Hardware defines for the E1000 */
- PE1000_REGISTERS HardwareVirtualAddress; /* e1000 registers */
-
- /* Node Ethernet address */
- uchar_t perm_node_address[ETH_LENGTH_OF_ADDRESS];
- UCHAR CurrentNetAddress[ETH_LENGTH_OF_ADDRESS];
-
- /* command line options */
- UCHAR AutoNeg;
- UCHAR ForcedSpeedDuplex;
- USHORT AutoNegAdvertised;
- UCHAR WaitAutoNegComplete;
-
- BOOLEAN GetLinkStatus;
-
- UCHAR MacType;
- UCHAR MediaType;
- UINT32 PhyId;
- UINT32 PhyAddress;
-
- /* PCI device info */
- UINT16 VendorId;
- UINT16 DeviceId;
- UINT16 SubSystemId;
- UINT16 SubVendorId;
-
- UCHAR DmaFairness;
-
- BOOLEAN LinkStatusChanged;
-
-
- /* Flags for various hardware-software defines */
- u_int e1000_flags; /* misc. flags */
- UINT32 AdapterStopped; /* Adapter has been reset */
- UINT32 FullDuplex; /* current duplex mode */
- UINT32 FlowControl; /* Enable/Disable flow control */
- UINT32 OriginalFlowControl;
- UINT RxPciPriority; /* Receive data priority */
- uint_t flags; /* Misc board flags */
-
- BOOLEAN LongPacket; /* Long Packet Enable Status */
- UINT RxBufferLen;
-
- UINT32 tag_mode; /* iANS tag mode (none, IEEE, ISL) */
-
- #ifdef IANS
- IANS_BD_LINK_STATUS ans_link;
- UINT32 ans_speed;
- UINT32 ans_duplex;
- #endif
-
- /* PCI configuration parameters */
- UINT PciCommandWord; /* Stores boot-up PCI command word */
- UINT DeviceNum; /* The bus+dev value for the card */
- UINT PciConfigMethod; /* CONFIG1 or 2 for scan */
- UINT RevID; /* Revision ID for the board */
- UINT32 LinkIsActive; /* Link status */
- UINT DoRxResetFlag;
- UINT AutoNegFailed; /* Auto-negotiation status flag */
- UINT TxcwRegValue; /* Original Transmit control word */
- UINT TxIntDelay; /* Transmit Interrupt delay */
- UINT RxIntDelay; /* Receive Interrupt delay */
- UINT MaxDpcCount; /* Interrupt optimization count */
-
- UCHAR ExternalSerDes;
-
- /* PCI information for the adapter */
- ulong_t io_base; /* IO base address */
- ulong_t mem_base; /* Memory base address */
- uchar_t irq; /* IRQ level */
- int irq_level;
-
- int bd_number; /* Board Number */
-
- /* Transmit descriptor definitions */
- PE1000_TRANSMIT_DESCRIPTOR FirstTxDescriptor;
- /* transmit descriptor ring start */
- PE1000_TRANSMIT_DESCRIPTOR LastTxDescriptor;
- /* transmit descriptor ring end */
- PE1000_TRANSMIT_DESCRIPTOR NextAvailTxDescriptor;
- /* next free tmd */
- PE1000_TRANSMIT_DESCRIPTOR OldestUsedTxDescriptor;
- /* next tmd to reclaim (used) */
- UINT NumTxDescriptorsAvail;
- UINT NumTxDescriptors;
- PE1000_TRANSMIT_DESCRIPTOR e1000_tbd_data;
- /* pointer to buffer descriptor area */
-
- /* Transmit software structure definitions */
- PTX_SW_PACKET e1000_TxSwPacketPtrArea;
- /* pointer to TxSwPacket Area */
-
- /* Define SwTxPacket structures */
- LIST_DESCRIBER FreeSwTxPacketList;
- /* Points to the head and tail of the "Free" packet list */
-
- LIST_DESCRIBER UsedSwTxPacketList;
- /* Points to the head and tail of the "Used" packet list */
-
- /* Receive definitions */
-
- UINT NumRxDescriptors;
- UINT MulticastFilterType;
-
- /* Receive descriptor definitions */
- PE1000_RECEIVE_DESCRIPTOR FirstRxDescriptor;
- /* receive descriptor ring 1 start */
-
- PE1000_RECEIVE_DESCRIPTOR LastRxDescriptor;
- /* receive descriptor ring 1 end */
-
- PE1000_RECEIVE_DESCRIPTOR NextRxDescriptorToCheck;
- /* next chip rmd ring 1 */
-
- PE1000_RECEIVE_DESCRIPTOR e1000_rlast1p;
- /* last free rmd ring 1 */
-
-
- /* Receive software defintions */
- PRX_SW_PACKET RxSwPacketPointerArea;
- /* Pointer to memory space allocated for RX_SW_PACKET structures */
-
- PE1000_RECEIVE_DESCRIPTOR e1000_rbd_data;
- /* pointer to rx buffer descriptor area */
-
- /* Points to the head and tail of the "RxSwPacketList" */
- LIST_DESCRIBER RxSwPacketList;
-
- pmltcst_cb_t pmc_buff;
- /* pointer to multi cast addrs */
- UINT NumberOfMcAddresses;
- UINT MaxNumReceivePackets;
- UINT MaxRcvPktMinThresh;
- UINT MaxRcvPktMaxThresh;
-
- /* Lock defintions for the driver */
- spinlock_t bd_intr_lock; /* Interrupt lock */
- spinlock_t bd_tx_lock; /* Transmit lock */
-
- UINT32 cur_line_speed; /* current line speed */
- uchar_t brdcst_dsbl; /* if set, disables broadcast */
- uchar_t TransmitTimeout; /* detects transmit lockup */
-
- uchar_t ReportTxEarly; /* 1 => RS bit, 0 => RPS bit */
-
- pci_dev_t *pci_dev; /* pci device struct pointer */
- /*************************************************************************
- * Hardware Statistics from the E1000 registers
- *************************************************************************/
- UINT RcvCrcErrors;
- /* Receive packets with CRC errors */
-
- UINT RcvSymbolErrors;
- /* Receive packets with symbol errors */
-
- UINT RcvMissedPacketsErrors;
- /* Packets missed due to receive FIFO full */
-
- UINT DeferCount;
- /* Packet not transmitted due to either of the
- * reasons- transmitter busy
- * IPG timer not expired
- * Xoff frame received
- * link not up
- */
-
- UINT RcvSequenceErrors;
- /* Receive sequence errors on the wire */
-
- UINT RcvLengthErrors;
- /* Counts undersized and oversized packets */
-
- UINT RcvXonFrame;
- /* Receive XON frame */
-
- UINT TxXonFrame;
- /* Transmit XON frame */
-
- UINT RcvXoffFrame;
- /* Receive XOFF frame */
-
- UINT TxXoffFrame;
- /* Transmit XOFF frame */
-
- UINT Rcv64;
- /* Received packets of size 64 */
-
- UINT Rcv65;
- /* Received packets of size 65-127 */
-
- UINT Rcv128;
- /* Received packets of size 128-255 */
-
- UINT Rcv256;
- /* Received packets of size 256-511 */
-
- UINT Rcv512;
- /* Received packets of size 512-1023 */
-
- UINT Rcv1024;
- /* Received packets of size 1024-1522 */
-
- UINT GoodReceives;
- /* Non-error legal length packets */
-
- UINT RcvBroadcastPkts;
- /* Received broadcast packets */
-
- UINT RcvMulticastPkts;
- /* Received multicast packets */
-
- UINT GoodTransmits;
- /* Good packets transmitted */
-
- UINT Rnbc;
- /* No Receive buffers available ( Receive queue full) */
-
- UINT RcvUndersizeCnt;
- /* Received packet is less than 64 bytes */
-
- UINT RcvOversizeCnt;
- /* Received packet greater than max ethernet packet */
-
- UINT RcvJabberCnt;
- /* Received packet > max size + bad CRC */
-
- UINT TotPktRcv;
- /* Total packets received */
-
- UINT TotPktTransmit;
- /* Total packets transmitted */
-
- UINT TrsPkt64;
- /* 64 byte packet transmitted */
-
- UINT TrsPkt65;
- /* Transmitted pkt 65-127 bytes */
-
- UINT TrsPkt128;
- /* Transmitted pkt 128-255 bytes */
-
- UINT TrsPkt256;
- /* Transmitted pkt 256-511 */
-
- UINT TrsPkt512;
- /* Transmitted pkt 512-1023 */
-
- UINT TrsPkt1024;
- /* Transmitted Pkt 1024-1522 */
-
- UINT TrsMulticastPkt;
- /* Transmitted Multicast Packet */
-
- UINT TrsBroadcastPkt;
- /* Transmitted broadcast packet */
-
- UINT TxAbortExcessCollisions;
- /* Excessive Coillision count */
-
- UINT TxLateCollisions;
- /* Late collision count */
-
- UINT TotalCollisions;
- /* Total collision count */
-
- UINT SingleCollisions;
- UINT MultiCollisions;
- UINT FCUnsupported;
- UINT RcvGoodOct;
- UINT TrsGoodOct;
- UINT RcvFragment;
- UINT RcvTotalOct;
- UINT TrsTotalOct;
-
- /* Livengood Statistics */
- UINT AlignmentErrors;
- UINT TotalRcvErrors;
- UINT TrsUnderRun;
- UINT TrsNoCRS;
- UINT CarrierExtErrors;
- UINT RcvDMATooEarly;
-
-} ADAPTER_STRUCT, *PADAPTER_STRUCT;
-
-/*- Ethernet 14-byte Header */
-typedef struct _eth_header_t {
- uchar_t eth_dest[ETH_LENGTH_OF_ADDRESS];
- uchar_t eth_src[ETH_LENGTH_OF_ADDRESS];
- ushort eth_typelen;
-} eth_header_t, *peth_header_t;
-
-
-
-
-
-
-/*
- * e1000_dlpi.h
- *
- * This file supports all the defines that are specific to the Streams
- * sturcture and the DLPI interface
- */
-
-/*
- * STREAMS structures
- */
-/*
- * All the DLPI functions that are global and have been pre-fixed with DL should
- * be given the prefix e1000
- */
-#define DL_NAME "e1000"
-#define DLdevflag e1000devflag
-#define DLinfo e1000info
-#define DLrminfo e1000rminfo
-#define DLwminfo e1000wminfo
-#define DLrinit e1000rinit
-#define DLwinit e1000winit
-#define DLstrlog e1000strlog
-#define DLifstats e1000ifstats
-#define DLboards e1000boards
-#define DLconfig e1000config
-#define DLid_string e1000id_string
-#define MBLK_LEN( X ) (X->b_wptr - X->b_rptr)
-#define PHYS_ADDR( X ) vtop((caddr_t)( X ), NULL )
-#define MBLK_NEXT( X ) ( X->b_cont )
-
-/*
- * Flow control definnitions for STREAMS
- */
-#define DL_MIN_PACKET 0
-#define DL_MAX_PACKET 1500
-#define DL_MAX_PACKET_LLC (DL_MAX_PACKET - 3)
-#define DL_MAX_PACKET_SNAP (DL_MAX_PACKET_LLC - 5)
-#define DL_HIWATER (64 * 1024)
-#define DL_LOWATER (20 * 1024) /* set to 20k */
-#define USER_MAX_SIZE DL_MAX_PACKET
-#define USER_MIN_SIZE 46
-
-#ifdef MDI
-/*
- * Flag definitions used for various states
- */
-#define DRV_LOADED 0x800
-#define BOARD_PRESENT 0x01
-#define BOARD_DISABLED 0x02
-#define PROMISCUOUS 0x100
-#define ALL_MULTI 0x200
-#define BOARD_OPEN 0x010
-/*
- * Board structure definition only necessary for a MDI driver. This structure
- * defines all the NOS related fields that would be associated with each board.
- * This definition is a part of the dlpi_ether header file for
- * the UW212 driver, so it is not defined for the UW212 driver
- */
-typedef struct bdconfig {
- #ifdef IANS
- void *iANSReserved;
- piANSsupport_t iANSdata;
- #endif
- struct bdconfig *bd_next; /* pointer to next bd in chain */
- struct bdconfig *bd_prev; /* pointer to prev bd in chain */
- uint unit; /* from mdi_get_unit */
- major_t major; /* major number for device */
- ulong_t io_start; /* start of I/O base address */
- ulong_t io_end; /* end of I/O base address */
- paddr_t mem_start; /* start of base mem address */
- paddr_t mem_end; /* start of base mem address */
- int irq_level; /* interrupt request level */
- int open_cnt;
- int bd_number; /* board number in multi-board setup */
- int flags; /* board management flags */
- int tx_flags; /* tx management flags */
- int rx_flags; /* rx management flags */
- int OutQlen; /* number of transmit pkts queued */
- struct timer_list timer_id; /* watchdog timer ID */
- int timer_val; /* watchdog timer value */
- int multicast_cnt; /* count of multicast address sets */
- DL_eaddr_t eaddr; /* Ethernet address storage */
-
- ADAPTER_STRUCT *bddp; /* board struct */
- mltcst_cb_t *mc_data; /* pointer to the mc addr for the bd */
-
- uint_t tx_count;
-
- /* these are linux only */
- struct sk_buff *last_mp_fail;
- device_t *device;
- uchar_t pci_bus;
- uchar_t pci_dev_fun;
- ushort_t vendor;
- int tx_out_res;
- void *base_tx_tbds;
- void *base_rx_rbds;
- struct net_device_stats net_stats;
-
-} bd_config_t;
-
-#endif /* MDI */
-
-/*************************************************************************
-* *
-* Module Name: *
-* e1000_pci.h *
-* Abstract: *
-* This header file contains PCI related constants and bit definitions. *
-* *
-* This driver runs on the following hardware: *
-* - E10001000 based PCI gigabit ethernet adapters (aka Kodiak) *
-* *
-* Environment: *
-* Kernel Mode - *
-* *
-* Source History: *
-* The contents of this file is based somewhat on code developed for *
-* Intel Pro/100 family (Speedo1 and Speedo3). *
-* *
-* March 7, 1997 *
-* 1st created - Ported from E100B pci.h file *
-* *
-*************************************************************************/
-
-/* typedefs for each NOS */
-#if defined LINUX
-
-/* PCI Device ID - for internal use */
-#define PCI_DEV_NO 0x00FF
-#define PCI_BUS_NO 0xFF00
-
-/* max number of pci buses */
-#define MAX_PCI_BUSES 0xFF
-
-/* number of PCI config bytes to access */
-#define PCI_BYTE 1
-#define PCI_WORD 2
-#define PCI_DWORD 4
-
-/* PCI access methods */
-#define P_CONF_T1 1
-#define P_CONF_T2 2
-#define P_TEST_PATN 0xCDEF
-
-#define PO_DEV_NO 11
-#define PO_BUS_NO 16
-#define P_CSPACE 0x80000000
-#endif
-
-
-/*----------------------------------------------------------------------*/
-
-#ifndef _PCI_H
-#define _PCI_H
-
-
-/* Maximum number of PCI devices */
-#define PCI_MAX_DEVICES 32
-
-/*-------------------------------------------------------------------------*/
-/* PCI configuration hardware ports */
-/*-------------------------------------------------------------------------*/
-#define CF1_CONFIG_ADDR_REGISTER 0x0CF8
-#define CF1_CONFIG_DATA_REGISTER 0x0CFC
-#define CF2_SPACE_ENABLE_REGISTER 0x0CF8
-#define CF2_FORWARD_REGISTER 0x0CFA
-#define CF2_BASE_ADDRESS 0xC000
-
-
-/*-------------------------------------------------------------------------*/
-/* Configuration Space Header */
-/*-------------------------------------------------------------------------*/
-typedef struct _PCI_CONFIG_STRUC {
- USHORT PciVendorId; /* PCI Vendor ID */
- USHORT PciDeviceId; /* PCI Device ID */
- USHORT PciCommand;
- USHORT PciStatus;
- UCHAR PciRevisionId;
- UCHAR PciClassCode[3];
- UCHAR PciCacheLineSize;
- UCHAR PciLatencyTimer;
- UCHAR PciHeaderType;
- UCHAR PciBIST;
- ULONG PciBaseReg0;
- ULONG PciBaseReg1;
- ULONG PciBaseReg2;
- ULONG PciBaseReg3;
- ULONG PciBaseReg4;
- ULONG PciBaseReg5;
- ULONG PciCardbusCISPtr;
- USHORT PciSubSysVendorId;
- USHORT PciSubSysDeviceId;
- ULONG PciExpROMAddress;
- ULONG PciReserved2;
- ULONG PciReserved3;
- UCHAR PciInterruptLine;
- UCHAR PciInterruptPin;
- UCHAR PciMinGnt;
- UCHAR PciMaxLat;
-} PCI_CONFIG_STRUC, *PPCI_CONFIG_STRUC;
-
-/*-------------------------------------------------------------------------*/
-/* PCI Configuration Space Register Offsets */
-/* Refer To The PCI Specification For Detailed Explanations */
-/*-------------------------------------------------------------------------*/
-#define PCI_VENDOR_ID_REGISTER 0x00 /* PCI Vendor ID Register */
-#define PCI_DEVICE_ID_REGISTER 0x02 /* PCI Device ID Register */
-#define PCI_CONFIG_ID_REGISTER 0x00 /* PCI Configuration ID Register */
-#define PCI_COMMAND_REGISTER 0x04 /* PCI Command Register */
-#define PCI_STATUS_REGISTER 0x06 /* PCI Status Register */
-#define PCI_REV_ID_REGISTER 0x08 /* PCI Revision ID Register */
-#define PCI_CLASS_CODE_REGISTER 0x09 /* PCI Class Code Register */
-#define PCI_CACHE_LINE_REGISTER 0x0C /* PCI Cache Line Register */
-
-#define PCI_BIST_REGISTER 0x0F /* PCI Built-In SelfTest Register */
-#define PCI_BAR_0_REGISTER 0x10 /* PCI Base Address Register 0 */
-#define PCI_BAR_1_REGISTER 0x14 /* PCI Base Address Register 1 */
-#define PCI_BAR_2_REGISTER 0x18 /* PCI Base Address Register 2 */
-#define PCI_BAR_3_REGISTER 0x1C /* PCI Base Address Register 3 */
-#define PCI_BAR_4_REGISTER 0x20 /* PCI Base Address Register 4 */
-#define PCI_BAR_5_REGISTER 0x24 /* PCI Base Address Register 5 */
-#define PCI_SUBVENDOR_ID_REGISTER 0x2C /* PCI SubVendor ID Register */
-#define PCI_SUBDEVICE_ID_REGISTER 0x2E /* PCI SubDevice ID Register */
-#define PCI_EXPANSION_ROM 0x30 /* PCI Expansion ROM Base Register */
-#define PCI_MIN_GNT_REGISTER 0x3E /* PCI Min-Gnt Register */
-#define PCI_MAX_LAT_REGISTER 0x3F /* PCI Max_Lat Register */
-#define PCI_TRDY_TIMEOUT_REGISTER 0x40 /* PCI TRDY Timeout Register */
-#define PCI_RETRY_TIMEOUT_REGISTER 0x41 /* PCI Retry Timeout Register */
-
-
-
-/*-------------------------------------------------------------------------*/
-/* PCI Class Code Definitions */
-/* Configuration Space Header */
-/*-------------------------------------------------------------------------*/
-#define PCI_BASE_CLASS 0x02 /* Base Class - Network Controller */
-#define PCI_SUB_CLASS 0x00 /* Sub Class - Ethernet Controller */
-#define PCI_PROG_INTERFACE 0x00 /* Prog I/F - Ethernet COntroller */
-
-/*-------------------------------------------------------------------------*/
-/* PCI Command Register Bit Definitions */
-/* Configuration Space Header */
-/*-------------------------------------------------------------------------*/
-#define CMD_IO_SPACE 0x0001 /* BIT_0 */
-#define CMD_MEMORY_SPACE 0x0002 /* BIT_1 */
-#define CMD_BUS_MASTER 0x0004 /* BIT_2 */
-#define CMD_SPECIAL_CYCLES 0x0008 /* BIT_3 */
-#define CMD_MEM_WRT_INVALIDATE 0x0010 /* BIT_4 */
-#define CMD_VGA_PALLETTE_SNOOP 0x0020 /* BIT_5 */
-#define CMD_PARITY_RESPONSE 0x0040 /* BIT_6 */
-#define CMD_WAIT_CYCLE_CONTROL 0x0080 /* BIT_7 */
-#define CMD_SERR_ENABLE 0x0100 /* BIT_8 */
-#define CMD_BACK_TO_BACK 0x0200 /* BIT_9 */
-
-/*-------------------------------------------------------------------------*/
-/* PCI Status Register Bit Definitions */
-/* Configuration Space Header */
-/*-------------------------------------------------------------------------*/
-#define STAT_BACK_TO_BACK 0x0080 /* BIT_7 */
-#define STAT_DATA_PARITY 0x0100 /* BIT_8 */
-#define STAT_DEVSEL_TIMING 0x0600 /* BIT_9_10 */
-#define STAT_SIGNAL_TARGET_ABORT 0x0800 /* BIT_11 */
-#define STAT_RCV_TARGET_ABORT 0x1000 /* BIT_12 */
-#define STAT_RCV_MASTER_ABORT 0x2000 /* BIT_13 */
-#define STAT_SIGNAL_MASTER_ABORT 0x4000 /* BIT_14 */
-#define STAT_DETECT_PARITY_ERROR 0x8000 /* BIT_15 */
-
-/*-------------------------------------------------------------------------*/
-/* PCI Base Address Register For Memory (BARM) Bit Definitions */
-/* Configuration Space Header */
-/*-------------------------------------------------------------------------*/
-#define BARM_LOCATE_BELOW_1_MEG 0x0002 /* BIT_1 */
-#define BARM_LOCATE_IN_64_SPACE 0x0004 /* BIT_2 */
-#define BARM_PREFETCHABLE 0x0008 /* BIT_3 */
-
-/*-------------------------------------------------------------------------*/
-/* PCI Base Address Register For I/O (BARIO) Bit Definitions */
-/* Configuration Space Header */
-/*-------------------------------------------------------------------------*/
-#define BARIO_SPACE_INDICATOR 0x0001 /* BIT_0 */
-
-/*-------------------------------------------------------------------------*/
-/* PCI BIOS Definitions */
-/* Refer To The PCI BIOS Specification */
-/*-------------------------------------------------------------------------*/
-/*- Function Code List */
-#define PCI_FUNCTION_ID 0xB1 /* AH Register */
-#define PCI_BIOS_PRESENT 0x01 /* AL Register */
-#define FIND_PCI_DEVICE 0x02 /* AL Register */
-#define FIND_PCI_CLASS_CODE 0x03 /* AL Register */
-#define GENERATE_SPECIAL_CYCLE 0x06 /* AL Register */
-#define READ_CONFIG_BYTE 0x08 /* AL Register */
-#define READ_CONFIG_WORD 0x09 /* AL Register */
-#define READ_CONFIG_DWORD 0x0A /* AL Register */
-#define WRITE_CONFIG_BYTE 0x0B /* AL Register */
-#define WRITE_CONFIG_WORD 0x0C /* AL Register */
-#define WRITE_CONFIG_DWORD 0x0D /* AL Register */
-
-/*- Function Return Code List */
-#define SUCCESSFUL 0x00
-#define FUNC_NOT_SUPPORTED 0x81
-#define BAD_VENDOR_ID 0x83
-#define DEVICE_NOT_FOUND 0x86
-#define BAD_REGISTER_NUMBER 0x87
-
-/*- PCI BIOS Calls */
-#define PCI_BIOS_INTERRUPT 0x1A /* PCI BIOS Int 1Ah Function Call */
-#define PCI_PRESENT_CODE 0x20494350 /* Hex Equivalent Of 'PCI ' */
-
-#define PCI_SERVICE_IDENTIFIER 0x49435024 /* ASCII Codes for 'ICP$' */
-
-/*-------------------------------------------------------------------------*/
-/* Device and Vendor IDs */
-/*-------------------------------------------------------------------------*/
-#define E1000_DEVICE_ID 0x1000
-#define WISEMAN_DEVICE_ID 0x1000
-#define LIVENGOOD_FIBER_DEVICE_ID 0x1001
-#define LIVENGOOD_COPPER_DEVICE_ID 0x1004
-#define E1000_VENDOR_ID 0x8086
-
-#define SPLASH_DEVICE_ID 0x1226
-#define SPLASH_VENDOR_ID 0x8086
-#define SPEEDO_DEVICE_ID 0x1227
-#define SPEEDO_VENDOR_ID 0x8086
-#define D100_DEVICE_ID 0x1229
-#define D100_VENDOR_ID 0x8086
-#define NITRO3_DEVICE_ID 0x5201
-#define NITRO3_VENDOR_ID 0x8086
-#define XXPS_BRIDGE_DEVICE_ID 0x1225
-#define XXPS_BRIDGE_VENDOR_ID 0x8086
-#define OPB0_BRIDGE_DEVICE_ID 0x84C4
-#define OPB0_BRIDGE_VENDOR_ID 0x8086
-
-
-#endif /* PCI_H */
-
-
-
-
-/*
- * e1000_externs.h
- *
- * This file has all the defines for the functions in various header files
- */
-#ifdef E1000_MAIN_STATIC
-static void e1000_print_brd_conf(bd_config_t *);
-static int e1000_init(bd_config_t *);
-static int e1000_runtime_init(bd_config_t *);
-
-static boolean_t e1000_sw_init(bd_config_t *);
-static void *malloc_contig(int);
-static void free_contig(void *);
-static void e1000_dealloc_space(bd_config_t *);
-static bd_config_t *e1000_alloc_space(void);
-
-static boolean_t e1000_find_pci_device(pci_dev_t *, PADAPTER_STRUCT);
-
-static void e1000_watchdog(device_t *);
-static void e1000_intr(int, void *, struct pt_regs *);
-
-static void SetupTransmitStructures(PADAPTER_STRUCT, boolean_t);
-static int SetupReceiveStructures(bd_config_t *, boolean_t, boolean_t);
-static int ReadNodeAddress(PADAPTER_STRUCT, PUCHAR);
-static int e1000_set_promisc(bd_config_t *, int flag);
-static void e1000DisableInterrupt(PADAPTER_STRUCT);
-static void e1000EnableInterrupt(PADAPTER_STRUCT);
-static void e1000DisableInterrupt(PADAPTER_STRUCT);
-static void ProcessTransmitInterrupts(bd_config_t *);
-static void ProcessReceiveInterrupts(bd_config_t *);
-static void UpdateStatsCounters(bd_config_t *);
-static uint_t SendBuffer(PTX_SW_PACKET, bd_config_t *);
-
-int e1000_probe(void);
-static int e1000_open(device_t *);
-static int e1000_close(device_t *);
-static int e1000_xmit_frame(struct sk_buff *, device_t *);
-static struct net_device_stats *e1000_get_stats(device_t *);
-static int e1000_change_mtu(device_t *, int);
-static int e1000_set_mac(device_t *, void *);
-static void e1000_set_multi(device_t *);
-static void e1000_check_options(int board);
-static boolean_t DetectKnownChipset(PADAPTER_STRUCT);
-static int e1000_GetBrandingMesg(uint16_t dev, uint16_t sub_ven, uint16_t sub_dev);
-#endif
-extern void AdapterStop(PADAPTER_STRUCT);
-extern ushort_t ReadEepromWord(PADAPTER_STRUCT, ushort_t);
-extern boolean_t ValidateEepromChecksum(PADAPTER_STRUCT);
-extern void CheckForLink(PADAPTER_STRUCT);
-extern BOOLEAN InitializeHardware(PADAPTER_STRUCT Adapter);
-extern BOOLEAN SetupFlowControlAndLink(PADAPTER_STRUCT Adapter);
-extern VOID GetSpeedAndDuplex(PADAPTER_STRUCT Adapter, PUINT16 Speed, PUINT16 Duplex);
-extern VOID ConfigFlowControlAfterLinkUp(PADAPTER_STRUCT Adapter);
-extern VOID ClearHwStatsCounters(PADAPTER_STRUCT Adapter);
-
-/*************************************************************************
-* *
-* Module Name: *
-* pci.h *
-* Abstract: *
-* This header file contains PCI related constants and bit definitions. *
-* *
-* This driver runs on the following hardware: *
-* - E10001000 based PCI gigabit ethernet adapters (aka Kodiak) *
-* *
-* Environment: *
-* Kernel Mode - *
-* *
-* Source History: *
-* The contents of this file is based somewhat on code developed for *
-* Intel Pro/100 family (Speedo1 and Speedo3). *
-* *
-* March 7, 1997 *
-* 1st created - Ported from E100B pci.h file *
-* *
-*************************************************************************/
-#ifndef _E1K_PCI_H
-#define _E1K_PCI_H
-
-/*-------------------------------------------------------------------------*/
-/* Device and Vendor IDs */
-/*-------------------------------------------------------------------------*/
-#define E1000_DEVICE_ID 0x1000
-#define E1000_VENDOR_ID 0x8086
-
-#define SPLASH_DEVICE_ID 0x1226
-#define SPLASH_VENDOR_ID 0x8086
-#define SPEEDO_DEVICE_ID 0x1227
-#define SPEEDO_VENDOR_ID 0x8086
-#define D100_DEVICE_ID 0x1229
-#define D100_VENDOR_ID 0x8086
-#define NITRO3_DEVICE_ID 0x5201
-#define NITRO3_VENDOR_ID 0x8086
-#define XXPS_BRIDGE_DEVICE_ID 0x1225
-#define XXPS_BRIDGE_VENDOR_ID 0x8086
-#define OPB0_BRIDGE_DEVICE_ID 0x84C4
-#define OPB0_BRIDGE_VENDOR_ID 0x8086
-
-#define INTEL_440BX_AGP 0x7192
-#define INTEL_440BX 0x7190
-#define INTEL_440GX 0x71A0
-#define INTEL_440LX_EX 0x7180
-#define INTEL_440FX 0x1237
-#define INTEL_430TX 0x7100
-#define INTEL_450NX_PXB 0x84CB
-#define INTEL_450KX_GX_PB 0x84C4
-
-
-/**********************************************************************
-** Other component's device number in PCI config space
-**********************************************************************/
-
-#define PXB_0A_DEVNO 0x12
-#define PXB_0B_DEVNO 0x13
-#define PXB_1A_DEVNO 0x14
-#define PXB_1B_DEVNO 0x15
-
-#define PB0_DEVNO 0x19
-#define PB1_DEVNO 0x1A
-
-#define PXB_C0_REV_ID 0x4
-
-
-#endif /* PCI_H */
-#endif /* _E1000_H_ */
diff --git a/drivers/e1000-2.x/e1000_main.c.orig b/drivers/e1000-2.x/e1000_main.c.orig
deleted file mode 100644
index 6e6fd9a2b..000000000
--- a/drivers/e1000-2.x/e1000_main.c.orig
+++ /dev/null
@@ -1,4075 +0,0 @@
-/*****************************************************************************
- *****************************************************************************
-Copyright (c) 1999 - 2000, Intel Corporation
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of Intel Corporation nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- *****************************************************************************
- ****************************************************************************/
-
-/**********************************************************************
-* *
-* INTEL CORPORATION *
-* *
-* This software is supplied under the terms of the license included *
-* above. All use of this driver must be in accordance with the terms *
-* of that license. *
-* *
-* Module Name: e1000.c *
-* *
-* Abstract: Functions for the driver entry points like load, *
-* unload, open and close. All board specific calls made *
-* by the network interface section of the driver. *
-* *
-* Environment: This file is intended to be specific to the Linux *
-* operating system. *
-* *
-**********************************************************************/
-
-
-/* This first section contains the setable parametes for configuring the
- * driver into the kernel.
- */
-
-#define E1000_DEBUG_DEFAULT 0
-static int e1000_debug_level = E1000_DEBUG_DEFAULT;
-
-/* global defines */
-#define MAX_TCB 80 /* number of transmit descriptors */
-#define MAX_RFD 80 /* number of receive descriptors */
-
-/* includes */
-#ifdef MODULE
-#ifdef MODVERSIONS
-#include <linux/modversions.h>
-#endif
-#include <linux/module.h>
-#endif
-#define E1000_MAIN_STATIC
-#ifdef IANS
-#define _IANS_MAIN_MODULE_C_
-#endif
-#include "e1000.h"
-#include "e1000_vendor_info.h"
-#include "e1000_proc.h"
-
-/* Global Data structures and variables */
-static const char *version =
-"Intel(R) PRO/1000 Gigabit Ethernet Adapter - Loadable driver, ver. 2.5.11\n";
-static char e1000_copyright[] = " Copyright (c) 1999-2000 Intel Corporation\n";
-static char e1000id_string[128] = "Intel(R) PRO/1000 Gigabit Server Adapter";
-static char e1000_driver[] = "e1000";
-static char e1000_version[] = "2.5.11";
-
-static bd_config_t *e1000first = NULL;
-static int e1000boards = 0;
-static int e1000_rxfree_cnt = 0;
-
-/* Driver performance tuning variables */
-static uint_t e1000_pcimlt_override = 0;
-static uint_t e1000_pcimwi_enable = 1;
-static uint_t e1000_txint_delay = 128;
-static uint_t e1000_rxint_delay = 0;
-
-static int e1000_flow_ctrl = 3;
-static int e1000_rxpci_priority = 0;
-static uint_t e1000_maxdpc_count = 5;
-
-static int TxDescriptors[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-static int RxDescriptors[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-
-/* Feature enable/disable */
-static int Jumbo[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-static int WaitForLink[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-static int SBP[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
-
-/* Speed and Duplex Settings */
-static int AutoNeg[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-static int Speed[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-static int ForceDuplex[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-
-/* This parameter determines whether the driver sets the RS bit or the
- * RPS bit in a transmit packet. These are the possible values for this
- * parameter:
- * e1000_ReportTxEarly = 0 ==> set the RPS bit
- * = 1 ==> set the RS bit
- * = 2 ==> (default) let the driver auto-detect
- *
- * If the RS bit is set in a packet, an interrupts is generated as soon
- * as the packet is DMAed from host memory to the FIFO. If the RPS bit
- * is set, an interrupt is generated after the packet has been transmitted
- * on the wire.
- */
-static uchar_t e1000_ReportTxEarly = 2; /* let the driver auto-detect */
-
-
-/* these next ones are for Linux specific things */
-static int probed = 0;
-
-/* The system interface routines */
-
-/****************************************************************************
-* Name: e1000_probe
-*
-* Description: This routine is called when the dynamic driver module
-* "e1000" is loaded using the command "insmod".
-*
-* This is a Linux required routine.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* NONE
-*
-* Returns:
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-int
-e1000_probe()
-{
- device_t *dev;
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
- pci_dev_t *pcid = NULL;
- int num_boards = 0;
- int first_time = 0, loop_cnt = 0;
-
- if (e1000_debug_level >= 1)
- printk("e1000_probe()\n");
-
- /* Has the probe routine been called before? The driver can be probed only
- * once.
- */
- if (probed)
- return (0);
- else
- probed++;
-
- /* does the system support pci? */
- if ((!CONFIG_PCI) || (!pci_present()))
- return (0);
-
-#ifdef CONFIG_PROC_FS
- {
- int len;
-
- /* first check if e1000_proc_dir already exists */
- len = strlen(ADAPTERS_PROC_DIR);
- for (e1000_proc_dir=proc_net->subdir;e1000_proc_dir;
- e1000_proc_dir=e1000_proc_dir->next) {
- if ((e1000_proc_dir->namelen == len) &&
- (!memcmp(e1000_proc_dir->name, ADAPTERS_PROC_DIR, len)))
- break;
- }
- if (!e1000_proc_dir)
- e1000_proc_dir =
- create_proc_entry(ADAPTERS_PROC_DIR, S_IFDIR, proc_net);
- if (!e1000_proc_dir) return -ENODEV;
- }
-#endif
-
- /* loop through all of the ethernet PCI devices looking for ours */
- while ((pcid = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pcid))) {
- dev = NULL;
-
- if (e1000_debug_level >= 2)
- printk("e1000_probe: vendor = 0x%x, device = 0x%x \n",
- pcid->vendor, pcid->device);
-
-
- /* is the device ours? */
- if ((pcid->vendor != E1000_VENDOR_ID) ||
- !((pcid->device == WISEMAN_DEVICE_ID) ||
- (pcid->device == LIVENGOOD_FIBER_DEVICE_ID) ||
- (pcid->device == LIVENGOOD_COPPER_DEVICE_ID))) continue; /* No, continue */
-
- if (!first_time) {
- /* only display the version message one time */
- first_time = 1;
-
- /* print out the version */
- printk("%s", version);
- printk("%s\n", e1000_copyright);
- }
-
- /* register the net device, but don't allocate a private structure yet */
- dev = init_etherdev(dev, 0);
-
- if (dev == NULL) {
- printk(KERN_ERR "Not able to alloc etherdev struct\n");
- break;
- }
-
- /* Allocate all the memory that the driver will need */
- if (!(bdp = e1000_alloc_space())) {
- printk("%s - Failed to allocate memory\n", e1000_driver);
- e1000_dealloc_space(bdp);
- return 0;
- }
- bdp->device = dev;
-
-#ifdef CONFIG_PROC_FS
- if (e1000_create_proc_dev(bdp) < 0) {
- e1000_remove_proc_dev(dev);
- e1000_dealloc_space(bdp);
- continue; /*return e100nics;*/
- }
-#endif
-
- /* init the timer */
- bdp->timer_val = -1;
-
- /* point the Adapter to the bddp */
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
-#ifdef IANS
- bdp->iANSdata = kmalloc(sizeof(iANSsupport_t), GFP_KERNEL);
- memset((PVOID) bdp->iANSdata, 0, sizeof(iANSsupport_t));
- bd_ans_drv_InitANS(bdp, bdp->iANSdata);
-#endif
-
- /*
- * Obtain the PCI specific information about the driver.
- */
- if (e1000_find_pci_device(pcid, Adapter) == 0) {
- printk("%s - Failed to find PCI device\n", e1000_driver);
- return (0);
- }
-
- /* range check the command line parameters for this board */
- if(!e1000_GetBrandingMesg(Adapter->DeviceId, Adapter->SubVendorId, Adapter->SubSystemId)) {
- continue;
- }
- printk("%s\n", e1000id_string);
- e1000_check_options(loop_cnt);
-
- switch (Speed[loop_cnt]) {
- case SPEED_10:
- switch(ForceDuplex[loop_cnt]) {
- case HALF_DUPLEX:
- Adapter->AutoNeg = 0;
- Adapter->ForcedSpeedDuplex = HALF_10;
- break;
- case FULL_DUPLEX:
- Adapter->AutoNeg = 0;
- Adapter->ForcedSpeedDuplex = FULL_10;
- break;
- default:
- Adapter->AutoNeg = 1;
- Adapter->AutoNegAdvertised =
- ADVERTISE_10_HALF | ADVERTISE_10_FULL;
- }
- break;
- case SPEED_100:
- switch(ForceDuplex[loop_cnt]) {
- case HALF_DUPLEX:
- Adapter->AutoNeg = 0;
- Adapter->ForcedSpeedDuplex = HALF_100;
- break;
- case FULL_DUPLEX:
- Adapter->AutoNeg = 0;
- Adapter->ForcedSpeedDuplex = FULL_100;
- break;
- default:
- Adapter->AutoNeg = 1;
- Adapter->AutoNegAdvertised =
- ADVERTISE_100_HALF | ADVERTISE_100_FULL;
- }
- break;
- case SPEED_1000:
- Adapter->AutoNeg = 1;
- Adapter->AutoNegAdvertised = ADVERTISE_1000_FULL;
- break;
- default:
- Adapter->AutoNeg = 1;
- switch(ForceDuplex[loop_cnt]) {
- case HALF_DUPLEX:
- Adapter->AutoNegAdvertised =
- ADVERTISE_10_HALF | ADVERTISE_100_HALF;
- break;
- case FULL_DUPLEX:
- Adapter->AutoNegAdvertised =
- ADVERTISE_10_FULL | ADVERTISE_100_FULL | ADVERTISE_1000_FULL;
- break;
- default:
- Adapter->AutoNegAdvertised = AutoNeg[loop_cnt];
- }
- }
-
-
- Adapter->WaitAutoNegComplete = WaitForLink[loop_cnt];
-
-
- /* Set Adapter->MacType */
- switch (pcid->device) {
- case WISEMAN_DEVICE_ID:
- if (Adapter->RevID == WISEMAN_2_0_REV_ID)
- Adapter->MacType = MAC_WISEMAN_2_0;
- else {
- if (Adapter->RevID == WISEMAN_2_1_REV_ID)
- Adapter->MacType = MAC_WISEMAN_2_1;
- else {
- Adapter->MacType = MAC_WISEMAN_2_0;
- printk(KERN_ERR
- "Could not identify hardware revision\n");
- }
- }
- break;
- case LIVENGOOD_FIBER_DEVICE_ID:
- case LIVENGOOD_COPPER_DEVICE_ID:
- Adapter->MacType = MAC_LIVENGOOD;
- break;
- default:
- Adapter->MacType = MAC_WISEMAN_2_0;
- printk(KERN_ERR "Could not identify hardware revision\n");
- break;
- }
-
- /* save off the needed information */
- bdp->device = dev;
- dev->priv = bdp;
- Adapter = bdp->bddp;
-
- /* save off the pci device structure pointer */
- Adapter->pci_dev = pcid;
- bdp->vendor = pcid->vendor;
-
- /* set the irq into the dev and bdp structures */
- dev->irq = pcid->irq;
- bdp->irq_level = pcid->irq;
-
-
- /* point to all of our entry point to let the system know where we are */
- dev->open = &e1000_open;
- dev->hard_start_xmit = &e1000_xmit_frame;
- dev->stop = &e1000_close;
- dev->get_stats = &e1000_get_stats;
- dev->set_multicast_list = &e1000_set_multi;
- dev->set_mac_address = &e1000_set_mac;
- dev->change_mtu = &e1000_change_mtu;
-#ifdef IANS
- dev->do_ioctl = &bd_ans_os_Ioctl;
-#endif
- /* set memory base addr */
- dev->base_addr = pci_resource_start(pcid, 0);
-
- /* now map the phys addr into system space... */
- /*
- * Map the PCI memory base address to a virtual address that can be used
- * for access by the driver. The amount of memory to be mapped will be
- * the E1000 register area.
- */
-
- Adapter->HardwareVirtualAddress =
- (PE1000_REGISTERS) ioremap(pci_resource_start(pcid, 0),
- sizeof(E1000_REGISTERS));
-
- if (Adapter->HardwareVirtualAddress == NULL) {
- /*
- * If the hardware register space can not be allocated, the driver
- * must fail to load.
- */
- printk("e1000_probe ioremap failed\n");
-
- /* this is a problem, if the first one inits OK but a secondary one
- * fails, what should you return? Now it will say the load was OK
- * but one or more boards may have failed to come up
- */
-
- break;
- }
-
- bdp->mem_start = pci_resource_start(pcid, 0);
-
- if (e1000_debug_level >= 2)
- printk("memstart = 0x%p, virt_addr = 0x%p\n",
- (void *) bdp->mem_start,
- (void *) Adapter->HardwareVirtualAddress);
-
- e1000_init(bdp);
-
- /* Printout the board configuration */
- e1000_print_brd_conf(bdp);
-
- /* init the basic stats stuff */
- ClearHwStatsCounters(Adapter);
- /* Update the statistics needed by the upper */
- UpdateStatsCounters(bdp);
-
- /* up the loop count( it's also the number of our boards found) */
- loop_cnt++;
-
- if (e1000_debug_level >= 2) {
- printk("dev = 0x%p ", dev);
- printk(" priv = 0x%p\n", dev->priv);
- printk(" irq = 0x%x ", dev->irq);
- printk(" next = 0x%p ", dev->next);
- printk(" flags = 0x%x\n", dev->flags);
- printk(" bdp = 0x%p\n", bdp);
- printk(" irq_level = 0x%x\n", bdp->irq_level);
- }
- } /* end of pci_find_class while loop */
-
- e1000boards = num_boards = loop_cnt;
-
- if (num_boards)
- return (0);
- else
- return (-ENODEV);
-}
-
-/* register e1000_probe as our initilization routine */
-module_init(e1000_probe);
-
-/* set some of the modules specific things here */
-#ifdef MODULE
-MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
-MODULE_DESCRIPTION("Intel(R) PRO/1000 Gigabit Ethernet driver");
-MODULE_PARM(TxDescriptors, "1-8i");
-MODULE_PARM(RxDescriptors, "1-8i");
-MODULE_PARM(Jumbo, "1-8i");
-MODULE_PARM(WaitForLink, "1-8i");
-MODULE_PARM(AutoNeg, "1-8i");
-MODULE_PARM(Speed, "1-8i");
-MODULE_PARM(ForceDuplex, "1-8i");
-MODULE_PARM(SBP, "1-8i");
-#endif
-
-/****************************************************************************
-* Name: cleanup_module
-*
-* Description: This routine is an entry point into the driver.
-*
-* This is a Linux required routine.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* NONE
-*
-* Returns:
-* It returns 0 and can not fail
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-int
-cleanup_module(void)
-{
- bd_config_t *bdp, *next_bdp;
- PADAPTER_STRUCT Adapter;
- device_t *dev, *next_dev;
-
- /* start looking at the first device */
- if (e1000first)
- dev = e1000first->device;
- else
- return 0;
- if (e1000_debug_level >= 1)
- printk("cleanup_module: SOR, dev = 0x%p \n\n\n", dev);
-
- while (dev) {
-#ifdef CONFIG_PROC_FS
- e1000_remove_proc_dev(dev);
-#endif
- bdp = (bd_config_t *) dev->priv;
- next_bdp = bdp->bd_next;
-
- if (next_bdp)
- next_dev = next_bdp->device;
- else
- next_dev = NULL;
- Adapter = bdp->bddp;
-
- /* unregister this instance of the module */
- if (e1000_debug_level >= 2)
- printk("--Cleanup, unreg_netdev\n");
- unregister_netdev(dev);
-
- /*
- * Free the memory mapped area that is allocated to the E1000 hardware
- * registers
- */
- if (e1000_debug_level >= 2)
- printk("--Cleanup, iounmap\n");
- iounmap(Adapter->HardwareVirtualAddress);
- /* free the irq back to the system */
-
-#ifdef IANS
- kfree(bdp->iANSdata);
-#endif
- /* free up any memory here */
- if (e1000_debug_level >= 2)
- printk("--Cleanup, e1000_dealloc_space\n");
- e1000_dealloc_space(bdp);
-
- dev = next_dev;
- }
-
-#ifdef CONFIG_PROC_FS
- {
- struct proc_dir_entry *de;
-
- /* check if the subdir list is empty before removing e1000_proc_dir */
- for (de = e1000_proc_dir->subdir; de; de = de->next) {
- /* ignore . and .. */
- if (*(de->name) == '.') continue;
- break;
- }
- if (de) return 0;
- remove_proc_entry(ADAPTERS_PROC_DIR, proc_net);
- }
-#endif
-
- return (0);
-}
-
-
-/****************************************************************************
-* Name: e1000_check_options
-*
-* Description: This routine does range checking on command line options.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 03/28/2000
-*
-* Arguments:
-* int board - board number to check values for
-*
-* Returns:
-* None
-*
-****************************************************************************/
-static void
-e1000_check_options(int board)
-{
-
- /* Transmit Descriptor Count */
- if (TxDescriptors[board] == -1) {
- TxDescriptors[board] = MAX_TCB;
- } else if ((TxDescriptors[board] > E1000_MAX_TXD) ||
- (TxDescriptors[board] < E1000_MIN_TXD)) {
- printk("Invalid TxDescriptor count specified (%i),"
- " using default of %i\n", TxDescriptors[board], MAX_TCB);
- TxDescriptors[board] = MAX_TCB;
- } else {
- printk("Using specified value of %i TxDescriptors\n",
- TxDescriptors[board]);
- }
-
- /* Receive Descriptor Count */
- if (RxDescriptors[board] == -1) {
- RxDescriptors[board] = MAX_RFD;
- } else if ((RxDescriptors[board] > E1000_MAX_RXD) ||
- (RxDescriptors[board] < E1000_MIN_RXD)) {
- printk("Invalid RxDescriptor count specified (%i),"
- " using default of %i\n", RxDescriptors[board], MAX_RFD);
- RxDescriptors[board] = MAX_RFD;
- } else {
- printk("Using specified value of %i RxDescriptors\n",
- RxDescriptors[board]);
- }
-
- /* Jumbo Frame Enable */
- if (Jumbo[board] == -1) {
- Jumbo[board] = 1;
- } else if ((Jumbo[board] > 1) || (Jumbo[board] < 0)) {
- printk("Invalid Jumbo specified (%i), using default of %i\n",
- Jumbo[board], 1);
- Jumbo[board] = 1;
- } else {
- printk("Jumbo Frames %s\n",
- Jumbo[board] == 1 ? "Enabled" : "Disabled");
- }
-
- /* Wait for link at driver load */
- if (WaitForLink[board] == -1) {
- WaitForLink[board] = 1;
- } else if ((WaitForLink[board] > 1) || (WaitForLink[board] < 0)) {
- printk("Invalid WaitForLink specified (%i), using default of %i\n",
- WaitForLink[board], 1);
- WaitForLink[board] = 1;
- } else {
- printk("WaitForLink %s\n",
- WaitForLink[board] == 1 ? "Enabled" : "Disabled");
- }
-
- /* Forced Speed and Duplex */
- switch (Speed[board]) {
- case -1:
- Speed[board] = 0;
- switch (ForceDuplex[board]) {
- case -1:
- ForceDuplex[board] = 0;
- break;
- case 0:
- printk("Speed and Duplex Autonegotiation Enabled\n");
- break;
- case 1:
- printk("Warning: Half Duplex specified without Speed\n");
- printk("Using Autonegotiation at Half Duplex only\n");
- break;
- case 2:
- printk("Warning: Full Duplex specified without Speed\n");
- printk("Using Autonegotiation at Full Duplex only\n");
- break;
- default:
- printk("Invalid Duplex Specified (%i), Parameter Ignored\n",
- ForceDuplex[board]);
- ForceDuplex[board] = 0;
- printk("Speed and Duplex Autonegotiation Enabled\n");
- }
- break;
- case 0:
- switch (ForceDuplex[board]) {
- case -1:
- case 0:
- printk("Speed and Duplex Autonegotiation Enabled\n");
- ForceDuplex[board] = 0;
- break;
- case 1:
- printk("Warning: Half Duplex specified without Speed\n");
- printk("Using Autonegotiation at Half Duplex only\n");
- break;
- case 2:
- printk("Warning: Full Duplex specified without Speed\n");
- printk("Using Autonegotiation at Full Duplex only\n");
- break;
- default:
- printk("Invalid Duplex Specified (%i), Parameter Ignored\n",
- ForceDuplex[board]);
- ForceDuplex[board] = 0;
- printk("Speed and Duplex Autonegotiation Enabled\n");
- }
- break;
- case 10:
- case 100:
- switch (ForceDuplex[board]) {
- case -1:
- case 0:
- printk("Warning: %i Mbps Speed specified without Duplex\n",
- Speed[board]);
- printk("Using Autonegotiation at %i Mbps only\n", Speed[board]);
- ForceDuplex[board] = 0;
- break;
- case 1:
- printk("Forcing to %i Mbps Half Duplex\n", Speed[board]);
- break;
- case 2:
- printk("Forcing to %i Mbps Full Duplex\n", Speed[board]);
- break;
- default:
- printk("Invalid Duplex Specified (%i), Parameter Ignored\n",
- ForceDuplex[board]);
- ForceDuplex[board] = 0;
- printk("Warning: %i Mbps Speed specified without Duplex\n",
- Speed[board]);
- printk("Using Autonegotiation at %i Mbps only\n", Speed[board]);
- }
- break;
- case 1000:
- switch (ForceDuplex[board]) {
- case -1:
- case 0:
- printk("Warning: 1000 Mbps Speed specified without Duplex\n");
- printk("Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- ForceDuplex[board] = 0;
- break;
- case 1:
- printk("Warning: Half Duplex is not supported at 1000 Mbps\n");
- printk("Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- break;
- case 2:
- printk("Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- break;
- default:
- printk("Invalid Duplex Specified (%i), Parameter Ignored\n",
- ForceDuplex[board]);
- ForceDuplex[board] = 0;
- printk("Warning: 1000 Mbps Speed specified without Duplex\n");
- printk("Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- }
- break;
- default:
- printk("Invalid Speed Specified (%i), Parameter Ignored\n",
- Speed[board]);
- Speed[board] = 0;
- switch (ForceDuplex[board]) {
- case -1:
- case 0:
- printk("Speed and Duplex Autonegotiation Enabled\n");
- ForceDuplex[board] = 0;
- break;
- case 1:
- printk("Warning: Half Duplex specified without Speed\n");
- printk("Using Autonegotiation at Half Duplex only\n");
- break;
- case 2:
- printk("Warning: Full Duplex specified without Speed\n");
- printk("Using Autonegotiation at Full Duplex only\n");
- break;
- default:
- printk("Invalid Duplex Specified (%i), Parameter Ignored\n",
- ForceDuplex[board]);
- ForceDuplex[board] = 0;
- printk("Speed and Duplex Autonegotiation Enabled\n");
- }
- }
-
- if (AutoNeg[board] == -1) {
- AutoNeg[board] = 0x2F;
- } else {
- if (AutoNeg[board] & ~0x2F) {
- printk("Invalid AutoNeg Specified (0x%X)\n", AutoNeg[board]);
- AutoNeg[board] = 0x2F;
- }
- printk("AutoNeg Advertising ");
- if(AutoNeg[board] & 0x20) {
- printk("1000/FD");
- if(AutoNeg[board] & 0x0F)
- printk(", ");
- }
- if(AutoNeg[board] & 0x08) {
- printk("100/FD");
- if(AutoNeg[board] & 0x07)
- printk(", ");
- }
- if(AutoNeg[board] & 0x04) {
- printk("100/HD");
- if(AutoNeg[board] & 0x03)
- printk(", ");
- }
- if(AutoNeg[board] & 0x02) {
- printk("10/FD");
- if(AutoNeg[board] & 0x01)
- printk(", ");
- }
- if(AutoNeg[board] & 0x01)
- printk("10/HD");
- printk("\n");
- }
-}
-
-/****************************************************************************
-* Name: e1000_open
-*
-* Description: This routine is the open call for the interface.
-*
-* This is a Linux required routine.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* NONE
-*
-* Returns:
-* It returns 0 on success
-* -EAGAIN on failure
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static int
-e1000_open(device_t * dev)
-{
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
- int ret_val;
-
- bdp = dev->priv;
- Adapter = bdp->bddp;
-
- if (e1000_debug_level >= 1)
- printk("open: SOR, bdp = 0x%p\n", bdp);
-
- /* make sure we have not already opened this interface */
- if(bdp->flags & BOARD_OPEN)
- return -EBUSY;
-
- if (e1000_init(bdp)) {
- return -ENOMEM;
- }
- if (e1000_runtime_init(bdp)) {
- return -ENOMEM;
- }
- Adapter->AdapterStopped = FALSE;
-
-#ifdef IANS_BASE_VLAN_TAGGING
- /* on a close a global reset is issued to the hardware,
- * so VLAN settings are lost and need to be re-set on open */
- if((IANS_BD_TAGGING_MODE)ANS_PRIVATE_DATA_FIELD(bdp)->tag_mode != IANS_BD_TAGGING_NONE)
- bd_ans_hw_EnableVLAN(bdp);
-#endif
-
- if (request_irq(dev->irq, &e1000_intr, SA_SHIRQ, "e1000", dev)) {
- if (e1000_debug_level >= 1)
- printk("open: request_irq failed");
-
- return (-EAGAIN);
- }
-
- /* Check to see if promiscuous mode needs to be turned on */
- if (dev->flags & IFF_PROMISC) {
- /* turn promisc mode on */
- ret_val = e1000_set_promisc(bdp, B_TRUE);
- bdp->flags |= PROMISCUOUS;
- } else {
- /* turn promisc mode off */
- ret_val = e1000_set_promisc(bdp, B_FALSE);
- bdp->flags &= ~PROMISCUOUS;
- }
-
-#ifdef MODULE
- /* up the mod use count used by the system */
- MOD_INC_USE_COUNT;
-#endif
-
- /* setup and start the watchdog timer */
- init_timer(&bdp->timer_id);
-
- /* set the timer value for 2 sec( i.e. 200 10msec tics )
- * jiffies are mesured in tics and is equiv. to LBOLTS in Unix
- */
- bdp->timer_id.expires = bdp->timer_val = jiffies + 200;
- bdp->timer_id.data = (ulong_t) dev;
- bdp->timer_id.function = (void *) &e1000_watchdog;
-
- /* start the timer */
- add_timer(&bdp->timer_id);
-
- /* set the device flags */
- netif_start_queue(dev);
-
- /* enable interrupts */
- e1000EnableInterrupt(Adapter);
-
- /* init the basic stats stuff */
- ClearHwStatsCounters(Adapter);
-
- bdp->flags |= BOARD_OPEN;
- return (0);
-}
-
-/****************************************************************************
-* Name: e1000_close
-*
-* Description: This routine is an entry point into the driver.
-*
-* This is a Linux required routine.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* device_t pointer
-*
-* Returns:
-* It returns 0 and can not fail.
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static int
-e1000_close(device_t * dev)
-{
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
- PRX_SW_PACKET RxSwPacket;
- ushort_t status;
- int j;
-
- bdp = dev->priv;
- Adapter = bdp->bddp;
-
- /* set the device to not started */
-
- netif_stop_queue(dev);
- /* stop the hardware */
-
- /* Disable all possible interrupts */
- E1000_WRITE_REG(Imc, (0xffffffff));
- status = E1000_READ_REG(Icr);
-
- /* Reset the chip */
- AdapterStop(Adapter);
-
- /* kill the timer */
- del_timer(&bdp->timer_id);
-
- /* free the irq back to the system */
- if (e1000_debug_level >= 1)
- printk("E1000: close: free_irq\n");
- free_irq(dev->irq, dev);
-
- /*
- * Free up the transmit descriptor area
- */
- if (e1000_debug_level >= 2)
- printk("--Cleanup, free tx descriptor area\n");
- free_contig(Adapter->e1000_TxSwPacketPtrArea);
- Adapter->e1000_TxSwPacketPtrArea = NULL;
- free_contig(bdp->base_tx_tbds);
- bdp->base_tx_tbds = NULL;
-
- /*
- * Free up the RX_SW_PACKET area also free any allocated
- * receive buffers
- */
- if (e1000_debug_level >= 2)
- printk("--Cleanup, free rx packet area + skbuffs\n");
- if (Adapter->RxSwPacketPointerArea != NULL) {
- for (j = 0, RxSwPacket = Adapter->RxSwPacketPointerArea;
- j < Adapter->NumRxDescriptors; j++, RxSwPacket++) {
- if (RxSwPacket != NULL && RxSwPacket->skb != NULL) {
- if (e1000_debug_level >= 2)
- printk(" -- kfree_skb\n");
- dev_kfree_skb(RxSwPacket->skb);
- RxSwPacket->skb = NULL;
- }
- }
- }
-
- /*
- * Free the receive descriptor area
- */
- if (e1000_debug_level >= 2)
- printk("--Cleanup, free rx descriptor area\n");
- /* free_contig( Adapter->e1000_rbd_data ); */
- free_contig(bdp->base_rx_rbds);
- bdp->base_rx_rbds = NULL;
- free_contig(Adapter->RxSwPacketPointerArea);
- Adapter->RxSwPacketPointerArea = NULL;
-
- bdp->flags &= ~BOARD_OPEN;
-
-#ifdef MODULE
- /* adjust the mod use count */
- MOD_DEC_USE_COUNT;
-#endif
-
- return (0);
-}
-
-/****************************************************************************
-* Name: e1000_xmit_frame
-*
-* Description: This routine is called to transmit a frame.
-*
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* sb_buff pointer
-* device_t pointer
-*
-* Returns:
-* It returns B_FALSE on success
-* B_TRUE on failure
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static int
-e1000_xmit_frame(struct sk_buff *skb, device_t * dev)
-{
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
- PTX_SW_PACKET TxSwPacket;
- int lock_flag;
-
- bdp = dev->priv;
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
- /* get the tx lock */
- spin_lock_irqsave(&Adapter->bd_tx_lock, lock_flag);
-
- if (e1000_debug_level >= 3)
- printk("e1000_tx_frame\n");
-
- /*******************************************************************
- * Check if any TxDescriptors are available, if not, back out of
- * this function.
- *******************************************************************/
- if ((Adapter->NumTxDescriptorsAvail) <= 1) {
- /* TxSwPacket->Packet = NULL; */
-
- if (e1000_debug_level >= 3)
- printk
- ("e1000_tx_frame No Tx descriptors available %d\n",
- Adapter->NumTxDescriptorsAvail);
-
- bdp->tx_out_res = 1;
-
-#ifdef IANS
- if(bdp->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
- ans_notify(dev, IANS_IND_XMIT_QUEUE_FULL);
- }
-#endif
- netif_stop_queue(dev);
- bdp->net_stats.tx_dropped += 1;
-
- /* release the tx_lock */
- spin_unlock_irqrestore(&Adapter->bd_tx_lock, lock_flag);
-
- /* fail the call */
- return (B_TRUE);
- }
-
- /* Get a "TxSwPacket" to hold miscellaneous information about the resources
- * that will be used to send this packet.
- */
-
- TxSwPacket =
- (PTX_SW_PACKET) QUEUE_GET_HEAD(&Adapter->FreeSwTxPacketList);
-
- if (!TxSwPacket) {
- if (e1000_debug_level >= 3) {
- printk("TxSwPacket 0x%p is NOT VALID!!!!!\n\n", TxSwPacket);
- }
-
- printk("!e1000_tx_frame no TxSwPackets left\n");
-
- bdp->tx_out_res = 1;
-
-#ifdef IANS
- if(bdp->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
- ans_notify(dev, IANS_IND_XMIT_QUEUE_FULL);
- }
-#endif
- netif_stop_queue(dev);
- bdp->net_stats.tx_dropped += 1;
-
- /* release the tx_lock */
- spin_unlock_irqrestore(&Adapter->bd_tx_lock, lock_flag);
-
- return (B_TRUE);
- }
-
- /* Initialize TxSwPacket structure. We'll have to reference this
- * structure when we do our transmit cleanup processing for this packet.
- */
- TxSwPacket->Packet = skb;
-
-
- if (e1000_debug_level >= 3)
- printk("tx_frame: calling SendBuffer, TxSwPacket = 0x%p\n",
- TxSwPacket);
-
- /* call the transmit routine */
- SendBuffer(TxSwPacket, bdp);
-
- /* set the xmit start time, it's only in tics so the res in not good */
- dev->trans_start = jiffies;
-
- /*
- * e1000_tx_frame could be called from the context of
- * e1000_tx_queued_frames. In that case, if the packet gets transmitted
- * successfully, the write queue length needs to be decremented.
- */
-
- if (bdp->OutQlen)
- bdp->OutQlen--;
-
- /* release the tx_lock */
- spin_unlock_irqrestore(&Adapter->bd_tx_lock, lock_flag);
-
- return (B_FALSE);
-}
-
-/****************************************************************************
-* Name: SendBuffer
-*
-* Description: This routine physically sends the packet to the nic controller.
-*
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* TX_SW_PACKET pointer
-* bd_config_t pointer
-*
-* Returns:
-* It returns B_TRUE always and can not fail.
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static UINT
-SendBuffer(PTX_SW_PACKET TxSwPacket, bd_config_t * bdp)
-{
- PADAPTER_STRUCT Adapter;
- PE1000_TRANSMIT_DESCRIPTOR CurrentTxDescriptor;
- sk_buff_t *skb;
- net_device_stats_t *stats;
-
- Adapter = bdp->bddp;
- skb = TxSwPacket->Packet;
- stats = &bdp->net_stats;
-
- CurrentTxDescriptor = Adapter->NextAvailTxDescriptor;
-
- CurrentTxDescriptor->BufferAddress = 0;
- CurrentTxDescriptor->BufferAddress += virt_to_bus(skb->data);
-
- CurrentTxDescriptor->Lower.DwordData = skb->len;
-
- /* zero out the status field in the descriptor. */
- CurrentTxDescriptor->Upper.DwordData = 0;
-
-#ifdef IANS
- if(bdp->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
- if(bd_ans_os_Transmit(bdp, CurrentTxDescriptor, &skb)==BD_ANS_FAILURE) {
- dev_kfree_skb(skb);
- return B_FALSE;
- }
- }
-#endif
-
- /* Check the wrap-around case */
- if (CurrentTxDescriptor == Adapter->LastTxDescriptor)
- Adapter->NextAvailTxDescriptor = Adapter->FirstTxDescriptor;
- else
- Adapter->NextAvailTxDescriptor++;
-
- Adapter->NumTxDescriptorsAvail--;
-
- TxSwPacket =
- (PTX_SW_PACKET) QUEUE_POP_HEAD(&Adapter->FreeSwTxPacketList);
-
- /* Last Descriptor of Packet needs End Of Packet (EOP),
- * Report Status (RS) and append Ethernet CRC (IFCS) bits set.
- */
- TxSwPacket->TxDescriptorBufferAddr =
- CurrentTxDescriptor->BufferAddress;
-
- /* Put this TxSwPacket at the end in the "in use" list */
- QUEUE_PUSH_TAIL(&Adapter->UsedSwTxPacketList, &TxSwPacket->Link);
-
- /*
- * If there is a valid value for the transmit interrupt delay, set up the
- * delay in the descriptor field
- */
- if (Adapter->TxIntDelay) {
- CurrentTxDescriptor->Lower.DwordData |=
- (E1000_TXD_CMD_EOP | E1000_TXD_CMD_IDE | E1000_TXD_CMD_IFCS);
- } else {
- CurrentTxDescriptor->Lower.DwordData |=
- (E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS);
- }
-
- /* Set the RS or the RPS bit by looking at the ReportTxEarly setting */
- if (Adapter->ReportTxEarly == 1)
- CurrentTxDescriptor->Lower.DwordData |= E1000_TXD_CMD_RS;
- else
- CurrentTxDescriptor->Lower.DwordData |= E1000_TXD_CMD_RPS;
-
- /* Advance the Transmit Descriptor Tail (Tdt), this tells the
- * E1000 that this frame is available to transmit.
- */
-
- E1000_WRITE_REG(Tdt, (((unsigned long) Adapter->NextAvailTxDescriptor -
- (unsigned long) Adapter->FirstTxDescriptor) >> 4));
-
- return (B_TRUE);
-}
-
-/****************************************************************************
-* Name: e1000_get_stats
-*
-* Description: This routine is called when the OS wants the nic stats returned
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/12/99
-*
-* Arguments:
-* device_t dev - the device stucture to return stats on
-*
-* Returns:
-* the address of the net_device_stats stucture for the device
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static struct net_device_stats *
-e1000_get_stats(device_t * dev)
-{
- bd_config_t *bdp = dev->priv;
-
- /* Statistics are updated from the watchdog - so just return them now */
- return (&bdp->net_stats);
-}
-
-
-/* this routine is to change the MTU size for jumbo frames */
-/****************************************************************************
-* Name: e1000_change_mtu
-*
-* Description: This routine is called when the OS would like the driver to
-* change the MTU size. This is used for jumbo frame support.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/12/98
-*
-* Arguments:
-* device_t pointer - pointer to the device
-* int - the new MTU size
-*
-* Returns:
-* ????
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static int
-e1000_change_mtu(device_t * dev, int new_mtu)
-{
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
-
- bdp = (bd_config_t *) dev->priv;
- Adapter = bdp->bddp;
-
- if ((new_mtu < MINIMUM_ETHERNET_PACKET_SIZE - ENET_HEADER_SIZE) ||
- (new_mtu > MAX_JUMBO_FRAME_SIZE - ENET_HEADER_SIZE))
- return -EINVAL;
-
- if (new_mtu <= MAXIMUM_ETHERNET_PACKET_SIZE - ENET_HEADER_SIZE) {
- /* 802.x legal frame sizes */
- Adapter->LongPacket = FALSE;
- if (Adapter->RxBufferLen != E1000_RXBUFFER_2048) {
- Adapter->RxBufferLen = E1000_RXBUFFER_2048;
- if (dev->flags & IFF_UP) {
- e1000_close(dev);
- e1000_open(dev);
- }
- }
- } else if (Adapter->MacType < MAC_LIVENGOOD) {
- /* Jumbo frames not supported on 82542 hardware */
- printk("e1000: Jumbo frames not supported on 82542\n");
- return -EINVAL;
- } else if (Jumbo[Adapter->bd_number] != 1) {
- printk("e1000: Jumbo frames disabled\n");
- return -EINVAL;
- } else if (new_mtu <= (4096 - 256) - ENET_HEADER_SIZE) {
- /* 4k buffers */
- Adapter->LongPacket = TRUE;
- if (Adapter->RxBufferLen != E1000_RXBUFFER_4096) {
- Adapter->RxBufferLen = E1000_RXBUFFER_4096;
- if (dev->flags & IFF_UP) {
- e1000_close(dev);
- e1000_open(dev);
-
- }
- }
- } else if (new_mtu <= (8192 - 256) - ENET_HEADER_SIZE) {
- /* 8k buffers */
- Adapter->LongPacket = TRUE;
- if (Adapter->RxBufferLen != E1000_RXBUFFER_8192) {
- Adapter->RxBufferLen = E1000_RXBUFFER_8192;
- if (dev->flags & IFF_UP) {
- e1000_close(dev);
- e1000_open(dev);
- }
- }
- } else {
- /* 16k buffers */
- Adapter->LongPacket = TRUE;
- if (Adapter->RxBufferLen != E1000_RXBUFFER_16384) {
- Adapter->RxBufferLen = E1000_RXBUFFER_16384;
- if (dev->flags & IFF_UP) {
- e1000_close(dev);
- e1000_open(dev);
- }
- }
- }
- dev->mtu = new_mtu;
- return 0;
-}
-
-/****************************************************************************
-* Name: e1000_init
-*
-* Description: This routine is called when this driver is loaded. This is
-* the initialization routine which allocates memory, starts the
-* watchdog, & configures the adapter, determines the system
-* resources.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 1/18/98
-*
-* Arguments:
-* NONE
-*
-* Returns:
-* NONE
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static int
-e1000_init(bd_config_t * bdp)
-{
- PADAPTER_STRUCT Adapter;
- device_t *dev;
- uint16_t LineSpeed, FullDuplex;
-
- if (e1000_debug_level >= 1)
- printk("e1000_init()\n");
-
- dev = bdp->device;
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
- /*
- * Disable interrupts on the E1000 card
- */
- e1000DisableInterrupt(Adapter);
-
- /**** Reset and Initialize the E1000 *******/
- AdapterStop(Adapter);
- Adapter->AdapterStopped = FALSE;
-
- /* Validate the EEPROM */
- if (!ValidateEepromChecksum(Adapter)) {
- printk("e1000: The EEPROM checksum is not valid \n");
- return (1);
- }
-
- /* read the ethernet address from the eprom */
- ReadNodeAddress(Adapter, &Adapter->perm_node_address[0]);
-
- if (e1000_debug_level >= 2) {
- printk("Node addr is: ");
- printk("%x:", Adapter->perm_node_address[0]);
- printk("%x:", Adapter->perm_node_address[1]);
- printk("%x:", Adapter->perm_node_address[2]);
- printk("%x:", Adapter->perm_node_address[3]);
- printk("%x:", Adapter->perm_node_address[4]);
- printk("%x\n ", Adapter->perm_node_address[5]);
- }
-
- /* save off the perm node addr in the bdp */
- memcpy(bdp->eaddr.bytes, &Adapter->perm_node_address[0],
- DL_MAC_ADDR_LEN);
-
- /* tell the system what the address is... */
- memcpy(&dev->dev_addr[0], &Adapter->perm_node_address[0],
- DL_MAC_ADDR_LEN);
-
- /* Scan the chipset and determine whether to set the RS bit or
- * the RPS bit during transmits. On some systems with a fast chipset
- * (450NX), setting the RS bit may cause data corruption. Check the
- * space.c paratemer to see if the user has forced this setting or
- * has let the software do the detection.
- */
-
- if ((e1000_ReportTxEarly == 0) || (e1000_ReportTxEarly == 1))
- Adapter->ReportTxEarly = e1000_ReportTxEarly; /* User setting */
- else { /* let the software setect the chipset */
- if(Adapter->MacType < MAC_LIVENGOOD) {
- if (DetectKnownChipset(Adapter) == B_TRUE)
- Adapter->ReportTxEarly = 1; /* Set the RS bit */
- else
- Adapter->ReportTxEarly = 0; /* Set the RPS bit */
- } else
- Adapter->ReportTxEarly = 1;
- }
-
-
- Adapter->FlowControl = e1000_flow_ctrl;
- Adapter->RxPciPriority = e1000_rxpci_priority;
-
- /* Do the adapter initialization */
- if (!InitializeHardware(Adapter)) {
- printk("InitializeHardware Failed\n");
- return (1);
- }
-
- /* all initialization done, mark board as present */
- bdp->flags = BOARD_PRESENT;
-
- CheckForLink(Adapter);
- if(E1000_READ_REG(Status) & E1000_STATUS_LU) {
- Adapter->LinkIsActive = TRUE;
- GetSpeedAndDuplex(Adapter, &LineSpeed, &FullDuplex);
- Adapter->cur_line_speed = (uint32_t) LineSpeed;
- Adapter->FullDuplex = (uint32_t) FullDuplex;
-#ifdef IANS
- Adapter->ans_link = IANS_STATUS_LINK_OK;
- Adapter->ans_speed = (uint32_t) LineSpeed;
- Adapter->ans_duplex = FullDuplex == FULL_DUPLEX ?
- BD_ANS_DUPLEX_FULL : BD_ANS_DUPLEX_HALF;
-#endif
- } else {
- Adapter->LinkIsActive = FALSE;
- Adapter->cur_line_speed = 0;
- Adapter->FullDuplex = 0;
-#ifdef IANS
- Adapter->ans_link = IANS_STATUS_LINK_FAIL;
- Adapter->ans_speed = 0;
- Adapter->ans_duplex = 0;
-#endif
- }
-
- if (e1000_debug_level >= 1)
- printk("e1000_init: end\n");
-
- return (0);
-}
-
-static int
-e1000_runtime_init(bd_config_t * bdp)
-{
- PADAPTER_STRUCT Adapter;
- device_t *dev;
-
- if (e1000_debug_level >= 1)
- printk("e1000_init()\n");
-
- dev = bdp->device;
-
- Adapter = (PADAPTER_STRUCT) bdp->bddp; /* Setup Shared Memory Structures */
-
- /* Make sure RxBufferLen is set to something */
- if (Adapter->RxBufferLen == 0) {
- Adapter->RxBufferLen = E1000_RXBUFFER_2048;
- Adapter->LongPacket = FALSE;
- }
-
- if (!e1000_sw_init(bdp)) {
- /* Board is disabled because all memory structures
- * could not be allocated
- */
- printk
- ("%s - Could not allocate the software mem structures\n",
- e1000_driver);
- bdp->flags = BOARD_DISABLED;
- return (1);
- }
-
- /* Setup and initialize the transmit structures. */
- SetupTransmitStructures(Adapter, B_TRUE);
-
- /* Setup and initialize the receive structures -- we can receive packets
- * off of the wire
- */
- SetupReceiveStructures(bdp, TRUE, TRUE);
-
- return 0;
-}
-
-/****************************************************************************
-* Name: e1000_set_mac
-*
-* Description: This routine sets the ethernet address of the board
-*
-* Author: IntelCorporation
-*
-* Born on Date: 07/11/99
-*
-* Arguments:
-* bdp - Ptr to this card's bd_config_t structure
-* eaddrp - Ptr to the new ethernet address
-*
-* Returns:
-* 1 - If successful
-* 0 - If not successful
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static int
-e1000_set_mac(device_t * dev, void *p)
-{
-
- bd_config_t *bdp;
- uint32_t HwLowAddress = 0;
- uint32_t HwHighAddress = 0;
- uint32_t RctlRegValue;
- uint16_t PciCommandWord;
- PADAPTER_STRUCT Adapter;
- uint32_t IntMask;
-
- struct sockaddr *addr = p;
-
- if (e1000_debug_level >= 1)
- printk("set_eaddr()\n");
-
- bdp = dev->priv;
- Adapter = bdp->bddp;
-
- RctlRegValue = E1000_READ_REG(Rctl);
-
- /*
- * setup the MAC address by writing to RAR0
- */
-
- if (Adapter->MacType == MAC_WISEMAN_2_0) {
-
- /* if MWI was enabled then dis able it before issueing the receive
- * reset to the hardware.
- */
- if (Adapter->PciCommandWord && CMD_MEM_WRT_INVALIDATE) {
- PciCommandWord =
- Adapter->PciCommandWord & ~CMD_MEM_WRT_INVALIDATE;
-
- WritePciConfigWord(PCI_COMMAND_REGISTER, &PciCommandWord);
- }
-
- /* reset receiver */
- E1000_WRITE_REG(Rctl, E1000_RCTL_RST);
-
- DelayInMilliseconds(5); /* Allow receiver time to go in to reset */
- }
-
- memcpy(Adapter->CurrentNetAddress, addr->sa_data, DL_MAC_ADDR_LEN);
-
- /******************************************************************
- ** Setup the receive address (individual/node/network address).
- ******************************************************************/
-
- if (e1000_debug_level >= 2)
- printk("Programming IA into RAR[0]\n");
-
- HwLowAddress = (Adapter->CurrentNetAddress[0] |
- (Adapter->CurrentNetAddress[1] << 8) |
- (Adapter->CurrentNetAddress[2] << 16) |
- (Adapter->CurrentNetAddress[3] << 24));
-
- HwHighAddress = (Adapter->CurrentNetAddress[4] |
- (Adapter->CurrentNetAddress[5] << 8) | E1000_RAH_AV);
-
- E1000_WRITE_REG(Rar[0].Low, HwLowAddress);
- E1000_WRITE_REG(Rar[0].High, HwHighAddress);
-
- memcpy(bdp->eaddr.bytes, addr->sa_data, DL_MAC_ADDR_LEN);
- memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
-
- if (Adapter->MacType == MAC_WISEMAN_2_0) {
-
- /******************************************************************
- ** Take the receiver out of reset.
- ******************************************************************/
-
- E1000_WRITE_REG(Rctl, 0);
-
- DelayInMilliseconds(1);
-
- /* if MWI was enabled then reenable it after issueing the global
- * or receive reset to the hardware.
- */
-
- if (Adapter->PciCommandWord && CMD_MEM_WRT_INVALIDATE) {
- WritePciConfigWord(PCI_COMMAND_REGISTER,
- &Adapter->PciCommandWord);
- }
-
- IntMask = E1000_READ_REG(Ims);
- e1000DisableInterrupt(Adapter);
-
- /* Enable receiver */
- SetupReceiveStructures(bdp, FALSE, FALSE);
-
- E1000_WRITE_REG(Ims, IntMask);
- /* e1000EnableInterrupt( Adapter ); */
- }
-
- return (0);
-}
-
-
-/****************************************************************************
-* Name: e1000_print_brd_conf
-*
-* Description: This routine printd the board configuration.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/24/97
-*
-* Arguments:
-* bdp - Ptr to this card's DL_bdconfig structure
-*
-* Returns:
-* NONE
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static void
-e1000_print_brd_conf(bd_config_t * bdp)
-{
-
- PADAPTER_STRUCT Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
- if(Adapter->LinkIsActive == TRUE)
- printk("%s: Mem:0x%p IRQ:%d Speed:%ld Mbps Dx:%s\n\n",
- bdp->device->name, (void *) bdp->mem_start,
- bdp->irq_level, Adapter->cur_line_speed,
- Adapter->FullDuplex == FULL_DUPLEX ? "Full" : "Half");
- else
- printk("%s: Mem:0x%p IRQ:%d Speed:N/A Dx:N/A\n\n",
- bdp->device->name, (void *) bdp->mem_start, bdp->irq_level);
-}
-
-/*****************************************************************************
-* Name: SetupTransmitStructures
-*
-* Description: This routine initializes all of the transmit related
-* structures. This includes the Transmit descriptors
-* and the TX_SW_PACKETs structures.
-*
-* NOTE -- The device must have been reset before this routine
-* is called.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 6/14/97
-*
-* Arguments:
-* Adapter - A pointer to our context sensitive "Adapter" structure.
-* DebugPrint - print debug or not. ( not used in this driver )
-*
-*
-* Returns:
-* (none)
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-
-static void
-SetupTransmitStructures(PADAPTER_STRUCT Adapter, boolean_t DebugPrint)
-{
-
- PTX_SW_PACKET TxSwPacketPtr;
- UINT i;
-
- if (e1000_debug_level >= 1)
- printk("SetupTransmitStructures\n");
-
- /*
- * Initialize the Free TX_SW_PACKET list, the used TX_SW_PACKET list.
- * Initialization involves mainly setting the
- * head and tail pointers of these lists to NULL
- */
- QUEUE_INIT_LIST(&Adapter->FreeSwTxPacketList);
- QUEUE_INIT_LIST(&Adapter->UsedSwTxPacketList);
-
- /**********************************************************************
- * Setup TxSwPackets
- **********************************************************************/
-
- /*
- * The transmit algorithm parameters like the append size
- * and copy size which are used for the transmit algorithm and
- * are configurable.
- */
- Adapter->TxIntDelay = e1000_txint_delay;
-
- /* Setup the initial pointers to the TxSwPacket data space */
- TxSwPacketPtr = Adapter->e1000_TxSwPacketPtrArea;
-
- /*
- * Setup the linked list of the TX_SW_PACKETS
- */
- for (i = 0; i < Adapter->NumTxDescriptors; i++, TxSwPacketPtr++) {
-
- /* Initialize this TX_SW_PACKET area to zeros */
- memset((PVOID) TxSwPacketPtr, 0, sizeof(TX_SW_PACKET));
-
- /* Add this TX_SW_PACKET to the free list */
- QUEUE_PUSH_TAIL(&Adapter->FreeSwTxPacketList,
- &TxSwPacketPtr->Link);
- }
-
- /**************************************************
- * Setup TX Descriptors
- ***************************************************/
-
- /* Initialize all of the Tx descriptors to zeros */
- memset((PVOID) Adapter->FirstTxDescriptor, 0,
- (sizeof(E1000_TRANSMIT_DESCRIPTOR)) *
- Adapter->NumTxDescriptors);
-
- /* Setup TX descriptor pointers */
- Adapter->NextAvailTxDescriptor = Adapter->FirstTxDescriptor;
- Adapter->OldestUsedTxDescriptor = Adapter->FirstTxDescriptor;
-
- /* Reset the number of descriptors that are available */
- Adapter->NumTxDescriptorsAvail = Adapter->NumTxDescriptors;
-
- /* Setup the Transmit Control Register (TCTL). */
- if (Adapter->FullDuplex) {
- E1000_WRITE_REG(Tctl, (E1000_TCTL_PSP | E1000_TCTL_EN |
- (E1000_COLLISION_THRESHOLD <<
- E1000_CT_SHIFT) |
- (E1000_FDX_COLLISION_DISTANCE <<
- E1000_COLD_SHIFT)));
- } else {
- E1000_WRITE_REG(Tctl, (E1000_TCTL_PSP | E1000_TCTL_EN |
- (E1000_COLLISION_THRESHOLD <<
- E1000_CT_SHIFT) |
- (E1000_HDX_COLLISION_DISTANCE <<
- E1000_COLD_SHIFT)));
- }
-
- /***********************************************************
- * Setup Hardware TX Registers
- ************************************************************/
-
- /* Setup HW Base and Length of Tx descriptor area */
- E1000_WRITE_REG(Tdbal,
- virt_to_bus((void *) Adapter->FirstTxDescriptor));
- E1000_WRITE_REG(Tdbah, 0);
-
- E1000_WRITE_REG(Tdl, (Adapter->NumTxDescriptors *
- sizeof(E1000_TRANSMIT_DESCRIPTOR)));
-
- /* Setup our HW Tx Head & Tail descriptor pointers */
- E1000_WRITE_REG(Tdh, 0);
- E1000_WRITE_REG(Tdt, 0);
-
-
- /* Zero out the Tx Queue State registers -- we don't use this mechanism. */
- if (Adapter->MacType < MAC_LIVENGOOD) {
- E1000_WRITE_REG(Tqsal, 0);
- E1000_WRITE_REG(Tqsah, 0);
- }
- /* Set the Transmit IPG register with default values.
- * Three values are used to determine when we transmit a packet on the
- * wire: IPGT, IPGR1, & IPGR2. IPGR1 & IPGR2 have no meaning in full
- * duplex. Due to the state machine implimentation all values are
- * effectivly 2 higher i.e. a setting of 10 causes the hardware to
- * behave is if it were set to 1
- * 2. These settigs are in "byte times". For example, an IPGT setting
- * of 10 plus the state machine delay of 2 is 12 byte time = 96 bit
- * times.
- */
-
- /* Set the Transmit IPG register with default values. */
- switch (Adapter->MacType) {
- case MAC_LIVENGOOD:
- if(Adapter->MediaType == MEDIA_TYPE_FIBER) {
- E1000_WRITE_REG(Tipg, DEFAULT_LVGD_TIPG_IPGT_FIBER |
- (DEFAULT_LVGD_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT) |
- (DEFAULT_LVGD_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT));
- } else {
- E1000_WRITE_REG(Tipg, DEFAULT_LVGD_TIPG_IPGT_COPPER |
- (DEFAULT_LVGD_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT) |
- (DEFAULT_LVGD_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT));
- }
- break;
- case MAC_WISEMAN_2_0:
- case MAC_WISEMAN_2_1:
- default:
- E1000_WRITE_REG(Tipg, DEFAULT_WSMN_TIPG_IPGT |
- (DEFAULT_WSMN_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT) |
- (DEFAULT_WSMN_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT));
- break;
- }
- /*
- * Set the Transmit Interrupt Delay register with the vaule for the
- * transmit interrupt delay
- */
- E1000_WRITE_REG(Tidv, Adapter->TxIntDelay);
-}
-
-/*****************************************************************************
-* Name: SetupReceiveStructures
-*
-* Description: This routine initializes all of the receive related
-* structures. This includes the receive descriptors, the
-* actual receive buffers, and the RX_SW_PACKET software structures.
-*
-* NOTE -- The device must have been reset before this routine
-* is called.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 6/27/97
-*
-* Arguments:
-* Adapter - A pointer to our context sensitive "Adapter" structure.
-*
-* DebugPrint - A variable that indicates whether a "debug" version of
-* the driver should print debug strings to the terminal.
-*
-* flag - indicates if the driver should indicate link
-* Returns:
-* (none)
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-static int
-SetupReceiveStructures(bd_config_t *bdp, boolean_t DebugPrint,
- boolean_t flag)
-{
- PRX_SW_PACKET RxSwPacket;
- PE1000_RECEIVE_DESCRIPTOR RxDescriptorPtr;
- UINT i;
- PADAPTER_STRUCT Adapter = bdp->bddp;
- uint32_t RegRctl = 0;
-
- if (e1000_debug_level >= 1)
- printk("SetupReceiveStructures\n");
-
- /* Init the list of "Receive Buffer Pointers" */
- QUEUE_INIT_LIST(&Adapter->RxSwPacketList);
-
- /*
- * Set the value of the maximum number of packets that will be processed
- * in the interrupt context from the file space.c
- */
- Adapter->MaxNumReceivePackets = RxDescriptors[Adapter->bd_number];;
-
- /*
- * Set the Receive interrupt delay and also the maximum number of times
- * the transmit and receive interrupt are going to be processed from the
- * space.c file
- */
- Adapter->RxIntDelay = e1000_rxint_delay;
- Adapter->MaxDpcCount = e1000_maxdpc_count;
-
- /* Setup the initial pointer to the first "RX_SW_PACKET" */
- RxSwPacket = (PRX_SW_PACKET) Adapter->RxSwPacketPointerArea;
-
- /* Initialize all of the Rx descriptors to zeros */
- memset((PVOID) Adapter->FirstRxDescriptor, 0,
- (sizeof(E1000_RECEIVE_DESCRIPTOR)) * Adapter->NumRxDescriptors);
-
- /* Go through and set up each RX_SW_PACKET. Since each RX_SW_PACKET already
- * has it virtual and physical address fields filled in (this was done
- * in e1000_sw_init), all we really need to do, is build our
- * "RxSwPacketList". Also, we need to go through and initialize/setup
- * each Receive Descriptor.
- */
-
- for (i = 0, RxDescriptorPtr = Adapter->FirstRxDescriptor;
- i < Adapter->NumRxDescriptors;
- i++, RxSwPacket++, RxDescriptorPtr++) {
-
- if (RxSwPacket->skb == NULL)
- printk
- ("SetupReceiveStructures rcv buffer memory not allocated");
- else {
- RxDescriptorPtr->BufferAddress = 0;
- RxDescriptorPtr->BufferAddress +=
- virt_to_bus(RxSwPacket->VirtualAddress);
- /* Add this RX_SW_PACKET to the list of RX_SW_PACKETs */
- QUEUE_PUSH_TAIL(&Adapter->RxSwPacketList, &RxSwPacket->Link);
- }
- }
-
-
- /* Setup our descriptor pointers */
- Adapter->NextRxDescriptorToCheck = Adapter->FirstRxDescriptor;
-
- /*
- * Set up all the RCTL fields
- */
- E1000_WRITE_REG(Rctl, 0);
-
- E1000_WRITE_REG(Rdtr0, (Adapter->RxIntDelay | E1000_RDT0_FPDB));
-
- /* Setup HW Base and Length of Rx descriptor area */
- E1000_WRITE_REG(Rdbal0,
- virt_to_bus((void *) Adapter->FirstRxDescriptor));
- E1000_WRITE_REG(Rdbah0, 0);
-
- E1000_WRITE_REG(Rdlen0, (Adapter->NumRxDescriptors *
- sizeof(E1000_RECEIVE_DESCRIPTOR)));
-
- /* Setup our HW Rx Head & Tail descriptor pointers */
- E1000_WRITE_REG(Rdh0, 0);
- E1000_WRITE_REG(Rdt0,
- (((unsigned long) Adapter->LastRxDescriptor -
- (unsigned long) Adapter->FirstRxDescriptor) >> 4));
-
- /* Zero out the registers associated with the second receive descriptor
- * ring, because we don't use that ring.
- */
- if (Adapter->MacType < MAC_LIVENGOOD) {
- E1000_WRITE_REG(Rdbal1, 0);
- E1000_WRITE_REG(Rdbah1, 0);
- E1000_WRITE_REG(Rdlen1, 0);
- E1000_WRITE_REG(Rdh1, 0);
- E1000_WRITE_REG(Rdt1, 0);
- }
- /* Setup the Receive Control Register (RCTL), and ENABLE the receiver.
- * The initial configuration is to: Enable the receiver, accept
- * broadcasts, discard bad packets (and long packets), disable VLAN filter
- * checking, set the receive descriptor minimum threshold size to 1/2,
- * and the receive buffer size to 2k. */
-
- RegRctl = E1000_RCTL_EN | /* Enable Receive Unit */
- E1000_RCTL_BAM | /* Accept Broadcast Packets */
- (Adapter->MulticastFilterType << E1000_RCTL_MO_SHIFT) |
- E1000_RCTL_RDMTS0_HALF |
- E1000_RCTL_LBM_NO; /* Loopback Mode = none */
-
- switch (Adapter->RxBufferLen) {
- case E1000_RXBUFFER_2048:
- default:
- RegRctl |= E1000_RCTL_SZ_2048;
- break;
- case E1000_RXBUFFER_4096:
- RegRctl |= E1000_RCTL_SZ_4096 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
- break;
- case E1000_RXBUFFER_8192:
- RegRctl |= E1000_RCTL_SZ_8192 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
- break;
- case E1000_RXBUFFER_16384:
- RegRctl |= E1000_RCTL_SZ_16384 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
- break;
- }
-
- if(SBP[Adapter->bd_number] > 0) {
- RegRctl |= E1000_RCTL_SBP;
- }
- E1000_WRITE_REG(Rctl, RegRctl);
-
- /*
- * Check and report the status of the link
- */
- if (!(E1000_READ_REG(Status) & E1000_STATUS_LU) && (flag == TRUE))
- printk("e1000: %s Link is Down\n", bdp->device->name);
-
- Adapter->DoRxResetFlag = B_FALSE;
-
- return (0);
-}
-
-/*****************************************************************************
-* Name: UpdateStatsCounters
-*
-* Description: This routine will dump and reset the E10001000's internal
-* Statistics counters. The current stats dump values will be
-* added to the "Adapter's" overall statistics.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 6/13/97
-*
-* Arguments:
-* Adapter - A pointer to our context sensitive "Adapter" structure.
-*
-* Returns:
-* (none)
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-
-static VOID
-UpdateStatsCounters(bd_config_t * bdp)
-{
-
- PADAPTER_STRUCT Adapter;
- net_device_stats_t *stats;
-
- Adapter = bdp->bddp;
- stats = &bdp->net_stats;
-
- /* Add the values from the chip's statistics registers to the total values
- * that we keep in software. These registers clear on read.
- */
- Adapter->RcvCrcErrors += E1000_READ_REG(Crcerrs);
- Adapter->RcvSymbolErrors += E1000_READ_REG(Symerrs);
- Adapter->RcvMissedPacketsErrors += E1000_READ_REG(Mpc);
- Adapter->DeferCount += E1000_READ_REG(Dc);
- Adapter->RcvSequenceErrors += E1000_READ_REG(Sec);
- Adapter->RcvLengthErrors += E1000_READ_REG(Rlec);
- Adapter->RcvXonFrame += E1000_READ_REG(Xonrxc);
- Adapter->TxXonFrame += E1000_READ_REG(Xontxc);
- Adapter->RcvXoffFrame += E1000_READ_REG(Xoffrxc);
- Adapter->TxXoffFrame += E1000_READ_REG(Xofftxc);
- Adapter->Rcv64 += E1000_READ_REG(Prc64);
- Adapter->Rcv65 += E1000_READ_REG(Prc127);
- Adapter->Rcv128 += E1000_READ_REG(Prc255);
- Adapter->Rcv256 += E1000_READ_REG(Prc511);
- Adapter->Rcv512 += E1000_READ_REG(Prc1023);
- Adapter->Rcv1024 += E1000_READ_REG(Prc1522);
- Adapter->GoodReceives += E1000_READ_REG(Gprc);
- Adapter->RcvBroadcastPkts += E1000_READ_REG(Bprc);
- Adapter->RcvMulticastPkts += E1000_READ_REG(Mprc);
- Adapter->GoodTransmits += E1000_READ_REG(Gptc);
- Adapter->Rnbc += E1000_READ_REG(Rnbc);
- Adapter->RcvUndersizeCnt += E1000_READ_REG(Ruc);
- Adapter->RcvFragment += E1000_READ_REG(Rfc);
- Adapter->RcvOversizeCnt += E1000_READ_REG(Roc);
- Adapter->RcvJabberCnt += E1000_READ_REG(Rjc);
- Adapter->TotPktRcv += E1000_READ_REG(Tpr);
- Adapter->TotPktTransmit += E1000_READ_REG(Tpt);
- Adapter->TrsPkt64 += E1000_READ_REG(Ptc64);
- Adapter->TrsPkt65 += E1000_READ_REG(Ptc127);
- Adapter->TrsPkt128 += E1000_READ_REG(Ptc255);
- Adapter->TrsPkt256 += E1000_READ_REG(Ptc511);
- Adapter->TrsPkt512 += E1000_READ_REG(Ptc1023);
- Adapter->TrsPkt1024 += E1000_READ_REG(Ptc1522);
- Adapter->TrsMulticastPkt += E1000_READ_REG(Mptc);
- Adapter->TrsBroadcastPkt += E1000_READ_REG(Bptc);
- Adapter->TxAbortExcessCollisions += E1000_READ_REG(Ecol);
- Adapter->TxLateCollisions += E1000_READ_REG(Latecol);
- Adapter->TotalCollisions += E1000_READ_REG(Colc);
- Adapter->SingleCollisions += E1000_READ_REG(Scc);
- Adapter->MultiCollisions += E1000_READ_REG(Mcc);
- Adapter->FCUnsupported += E1000_READ_REG(Fcruc);
-
- /* The byte count registers are 64-bits, to reduce the chance of overflow
- * The entire 64-bit register clears when the high 32-bits are read, so the
- * lower half must be read first
- */
- Adapter->RcvGoodOct += E1000_READ_REG(Gorl);
- Adapter->RcvGoodOct += ((uint64_t) E1000_READ_REG(Gorh) << 32);
- Adapter->TrsGoodOct += E1000_READ_REG(Gotl);
- Adapter->TrsGoodOct += ((uint64_t) E1000_READ_REG(Goth) << 32);
- Adapter->RcvTotalOct += E1000_READ_REG(Torl);
- Adapter->RcvTotalOct += ((uint64_t) E1000_READ_REG(Torh) << 32);
- Adapter->TrsTotalOct += E1000_READ_REG(Totl);
- Adapter->TrsTotalOct += ((uint64_t) E1000_READ_REG(Toth) << 32);
-
- /* New statistics registers in the 82543 */
- if (Adapter->MacType >= MAC_LIVENGOOD) {
- Adapter->AlignmentErrors += E1000_READ_REG(Algnerrc);
- Adapter->TotalRcvErrors += E1000_READ_REG(Rxerrc);
- Adapter->TrsUnderRun += E1000_READ_REG(Tuc);
- Adapter->TrsNoCRS += E1000_READ_REG(Tncrs);
- Adapter->CarrierExtErrors += E1000_READ_REG(Cexterr);
- Adapter->RcvDMATooEarly += E1000_READ_REG(Rutec);
- }
-
- /* Fill out the OS statistics structure */
- stats->rx_packets = Adapter->GoodReceives; /* total pkts received */
- stats->tx_packets = Adapter->GoodTransmits; /* total pkts transmitted */
- stats->rx_bytes = Adapter->RcvGoodOct; /* total bytes reveived */
- stats->tx_bytes = Adapter->TrsGoodOct; /* total bytes transmitted */
- stats->multicast = Adapter->RcvMulticastPkts; /* multicast pkts received */
- stats->collisions = Adapter->TotalCollisions; /* total collision count */
- /* Rx Errors */
- stats->rx_errors = Adapter->TotalRcvErrors + Adapter->RcvCrcErrors +
- Adapter->AlignmentErrors +
- Adapter->RcvLengthErrors +
- Adapter->Rnbc + Adapter->RcvMissedPacketsErrors +
- Adapter->CarrierExtErrors;
- stats->rx_dropped = Adapter->Rnbc;
- stats->rx_length_errors = Adapter->RcvLengthErrors;
- stats->rx_crc_errors = Adapter->RcvCrcErrors;
- stats->rx_frame_errors = Adapter->AlignmentErrors;
- stats->rx_fifo_errors = Adapter->RcvMissedPacketsErrors;
- stats->rx_missed_errors = Adapter->RcvMissedPacketsErrors;
- /* Tx Errors */
- stats->tx_errors = Adapter->TxAbortExcessCollisions +
- Adapter->TrsUnderRun +
- Adapter->TxLateCollisions;
- stats->tx_aborted_errors = Adapter->TxAbortExcessCollisions;
- stats->tx_fifo_errors = Adapter->TrsUnderRun;
- stats->tx_window_errors = Adapter->TxLateCollisions;
- /* Tx Dropped needs to be maintained elsewhere */
-}
-
-/****************************************************************************
-*
-* Name: ReadNodeAddress
-*
-* Description: Gets the node/Ethernet/Individual Address for this NIC
-* from the EEPROM.
-*
-* Example EEPROM map:
-* Word 0 = AA00
-* Word 1 = 1100
-* Word 2 = 3322
-*
-* Author: IntelCorporation
-*
-* Born on Date: 3/30/98
-*
-* Arguments:
-* Adapter Ptr to this card's adapter data structure
-*
-* Returns:
-* Status RET_STATUS_SUCCESS = read valid address
-* RET_STATUS_FAILURE = unable to read address
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-***************************************************************************/
-static int
-ReadNodeAddress(IN PADAPTER_STRUCT Adapter, OUT PUCHAR NodeAddress)
-{
- UINT i;
- USHORT EepromWordValue;
-
- DL_LOG(strlog(DL_ID, 0, 3, SL_TRACE, "ReadNodeAddress"));
-
- /* Read our node address from the EEPROM. */
- for (i = 0; i < NODE_ADDRESS_SIZE; i += 2) {
- /* Get word i from EEPROM */
- EepromWordValue = ReadEepromWord(IN Adapter, IN(USHORT)
-
- (EEPROM_NODE_ADDRESS_BYTE_0
- + (i / 2)));
-
- /* Save byte i */
- NodeAddress[i] = (UCHAR) EepromWordValue;
-
- /* Save byte i+1 */
- NodeAddress[i + 1] = (UCHAR) (EepromWordValue >> 8);
- }
-
-
- /* Our IA should not have the Multicast bit set */
- if (NodeAddress[0] & 0x1) {
- return (RET_STATUS_FAILURE);
- }
-
- memcpy(&Adapter->CurrentNetAddress[0],
- &Adapter->perm_node_address[0], DL_MAC_ADDR_LEN);
- return (RET_STATUS_SUCCESS);
-
-}
-
-/*****************************************************************************
-* Name: e1000_set_promisc
-*
-* Description: This routine sets the promiscous mode for receiving packets
-* that it is passed.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/7/97
-*
-* Arguments:
-* bd_config_t - board struct
-* flag - turn it on( B_TRUE ) or off ( B_FALSE )
-*
-* Returns:
-* B_FALSE - if successful
-* B_TRUE - if not
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-static int
-e1000_set_promisc(bd_config_t * bdp, int flag)
-{
- uint32_t RctlRegValue;
- uint32_t TempRctlReg;
- uint32_t NewRctlReg;
- PADAPTER_STRUCT Adapter;
-
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
- /*
- * Save the original value in the RCTL register
- */
- RctlRegValue = E1000_READ_REG(Rctl);
- TempRctlReg = RctlRegValue;
-
-
- if (e1000_debug_level >= 1)
- printk("e1000_set_promiscuous, SOR");
-
- /* Check to see if we should set/clear the "Unicast Promiscuous" bit. */
- if (flag == B_TRUE) {
- /*
- * Since the promiscuous flag is set to TRUE, set both the unicast as
- * well as the multicast promiscuous mode on the RCTL
- */
- TempRctlReg |= (E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_BAM);
- E1000_WRITE_REG(Rctl, TempRctlReg);
- if (e1000_debug_level >= 1)
- printk("Promiscuous mode ON");
- } else {
- /*
- * Turn off both the unicast as well as the multicast promiscuous mode
- */
- TempRctlReg &= (~E1000_RCTL_UPE);
- TempRctlReg &= (~E1000_RCTL_MPE);
- E1000_WRITE_REG(Rctl, TempRctlReg);
- if (e1000_debug_level >= 1)
- printk("Promiscuous mode OFF");
- }
-
-
- /* Write the new filter back to the adapter, if it has changed */
- if (TempRctlReg != RctlRegValue) {
- E1000_WRITE_REG(Rctl, TempRctlReg);
- }
-
- NewRctlReg = E1000_READ_REG(Rctl);
-
- if (NewRctlReg != TempRctlReg)
- return (B_FALSE);
- else
- return (B_TRUE);
-}
-
-/*****************************************************************************
-* Name: e1000DisableInterrupt
-*
-* Description: This routine disables (masks) all interrupts on our adapter.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 8/25/97
-*
-* Arguments:
-* pointer to our "Adapter" structure.
-*
-* Returns:
-* (none)
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-
-static void
-e1000DisableInterrupt(PADAPTER_STRUCT Adapter)
-{
- if (e1000_debug_level >= 1)
- printk("DisableInterrupts: SOR\n");
-
- /*
- * Mask all adapter interrupts.
- */
- E1000_WRITE_REG(Imc, (0xffffffff & ~E1000_IMC_RXSEQ));
-
-}
-
-
-/*****************************************************************************
-* Name: e1000EnableInterrupt
-*
-* Description: This routine enables (un-masks) all interrupts on our adapter.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 8/25/97
-*
-* Arguments:
-* pointer to our "Adapter" structure.
-*
-* Returns:
-* (none)
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-
-static void
-e1000EnableInterrupt(PADAPTER_STRUCT Adapter)
-{
- if (e1000_debug_level >= 1)
- printk("EnableInterrupts: SOR\n");
-
- /* Enable interrupts (SBL -- may want to enable different int bits..) */
- E1000_WRITE_REG(Ims, IMS_ENABLE_MASK);
-}
-
-/*****************************************************************************
-* Name: e1000_intr
-*
-* Description: This routine is the ISR for the e1000 board. It services
-* the RX & TX queues & starts the RU if it has stopped due
-* to no resources.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 8/25/97
-*
-* Arguments:
-* ivec - The interrupt vector for this board.
-*
-* Returns:
-* (none)
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-
-static void
-e1000_intr(int irq, void *dev_inst, struct pt_regs *regs)
-{
- /* note - regs is not used but required by the system */
- uint32_t IcrContents;
- PADAPTER_STRUCT Adapter;
- uint32_t CtrlRegValue, TxcwRegValue, RxcwRegValue;
- UINT DpcCount;
- device_t *dev;
- bd_config_t *bdp;
-
- dev = (device_t *) dev_inst;
- bdp = dev->priv;
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
- if (e1000_debug_level >= 1)
- printk("e1000_intr: bdp = 0x%p\n ", bdp);
-
- if (!Adapter)
- return;
-
- /*
- * The board is present but not yet initialized. Since the board is not
- * initialized we do not process the interrupt
- */
- if (!bdp->flags || (bdp->flags & BOARD_DISABLED)) {
- return;
- }
-
-
- /* get board status */
- if ((IcrContents = E1000_READ_REG(Icr))) {
-
- /* This card actually has interrupts to process */
-
- /* Disable Interrupts from this card */
- e1000DisableInterrupt(Adapter);
-
- /*
- * The Receive Sequence errors RXSEQ and the link status change LSC
- * are checked to detect that the cable has been pulled out. For
- * the 82542 silicon, the receive sequence errors interrupt
- * are an indication that cable is not connected. If there are
- * sequence errors or if link status has changed, proceed to the
- * cable disconnect workaround
- */
-
- if (IcrContents & (E1000_ICR_RXSEQ|E1000_ICR_LSC|E1000_ICR_GPI_EN1)) {
- Adapter->GetLinkStatus =
- Adapter->LinkStatusChanged = TRUE;
- /* run the watchdog ASAP */
- mod_timer(&bdp->timer_id, jiffies);
- }
- if(IcrContents & E1000_ICR_GPI_EN1) {
- ReadPhyRegister(Adapter, PXN_INT_STATUS_REG, Adapter->PhyAddress);
- }
- if(Adapter->LinkStatusChanged &&
- Adapter->MediaType == MEDIA_TYPE_FIBER) {
- CtrlRegValue = E1000_READ_REG(Ctrl);
- TxcwRegValue = E1000_READ_REG(Txcw);
- RxcwRegValue = E1000_READ_REG(Rxcw);
- if((CtrlRegValue & E1000_CTRL_SWDPIN1) ||
- ((RxcwRegValue & E1000_RXCW_C) &&
- (TxcwRegValue & E1000_TXCW_ANE))) {
-
- E1000_WRITE_REG(Txcw, Adapter->TxcwRegValue);
- E1000_WRITE_REG(Ctrl, CtrlRegValue & ~E1000_CTRL_SLU);
- Adapter->AutoNegFailed = 0;
- }
- Adapter->LinkStatusChanged = FALSE;
- }
- if(Adapter->LinkStatusChanged &&
- Adapter->MediaType == MEDIA_TYPE_COPPER) {
- CheckForLink(Adapter);
- }
-
- DpcCount = Adapter->MaxDpcCount;
-
- /*
- * Since we are already in the interrupt context, we want to clean up
- * as many transmit and receive packets that have been processed by
- * E1000 since taking interrupts is expensive. We keep a count called
- * the DpcCount which is the maximum number of times that we will try
- * to clean up interrupts from within this interrupt context. If the
- * count is too high, it can lead to interrupt starvation
- */
- while (DpcCount) {
- /* Process the receive interrupts to clean receive descriptors */
- if (e1000_debug_level >= 3)
- printk("intr: DpcCount = 0x%x\n ", DpcCount);
-
- ProcessReceiveInterrupts(bdp);
-
- /*
- * Process and clean up transmit interrupts
- */
- ProcessTransmitInterrupts(bdp);
-
- DpcCount--;
-
- if (DpcCount) {
- if (!(E1000_READ_REG(Icr))) {
- break;
- }
- }
- }
-
- /* Enable Interrupts */
- e1000EnableInterrupt(Adapter);
-
-
- /*
- * If there are any frames that have been queued, they are also
- * Processed from this context. ??? We need to verify if there is
- * any benefit of doing this
- */
- }
- return;
-}
-
-/****************************************************************************
-* Name: ProcessTransmitInterrupts
-*
-* Description: This routine services the TX queues. It reclaims the
-* TCB's & TBD's & other resources used during the transmit
-* of this buffer. It is called from the ISR.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 8/7/97
-*
-* Arguments:
-* bdp - Ptr to this card's DL_bdconfig structure
-*
-* Returns:
-* NONE
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-
-static void
-ProcessTransmitInterrupts(bd_config_t * bdp)
-{
- PTX_SW_PACKET TxSwPacket;
- PE1000_TRANSMIT_DESCRIPTOR TransmitDescriptor;
-
- PADAPTER_STRUCT Adapter;
- UINT NumTxSwPacketsCleaned = 0;
- device_t *dev;
- int lock_flag_tx;
-
-
- if (e1000_debug_level >= 3)
- printk("ProcessTransmitInterrupts, SOR\n");
-
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
- dev = bdp->device;
-
- spin_lock_irqsave(&Adapter->bd_tx_lock, lock_flag_tx);
-
- /* This function will examine each TxSwPacket in the 'used' queue
- * if the E1000 is done with it then the associated resources
- * (Tx Descriptors and Map Registers)
- * will be "freed" and the TxSwPacket will be returned to the 'free'
- * queue.
- */
-
-
- for (TxSwPacket =
- (PTX_SW_PACKET) QUEUE_GET_HEAD(&Adapter->UsedSwTxPacketList);
- /* While there are still TxSwPackets in the used queue check them */
- TxSwPacket;
- /* Look at the next TxSwPacket in the USED queue */
- TxSwPacket =
- (PTX_SW_PACKET) QUEUE_GET_HEAD(&Adapter->UsedSwTxPacketList)) {
-
- if (e1000_debug_level >= 3)
- printk("Examining TxSwPacket 0x%p\n", TxSwPacket);
-
- /* Get hold of the next descriptor that the E1000 will report status
- * back to (this will be the last descriptor of a given TxSwPacket).
- * We only want to free the TxSwPacket (and it resources) if the E1000
- * is done with ALL of the descriptors. If the E1000 is done with the
- * last one then it is done with all of them.
- */
- TransmitDescriptor = Adapter->OldestUsedTxDescriptor;
-
- /* Check for wrap case */
- if (TransmitDescriptor > Adapter->LastTxDescriptor)
- TransmitDescriptor -= Adapter->NumTxDescriptors;
-
- if (e1000_debug_level >= 3) {
- printk("First descriptor 0x%p \n",
- TxSwPacket->FirstDescriptor);
- printk("Last descriptor 0x%p \n", TxSwPacket->LastDescriptor);
- }
-
- /* If the descriptor done bit is set free TxSwPacket and associated
- * resources
- */
-
- if (TransmitDescriptor->Upper.Fields.
- TransmitStatus & E1000_TXD_STAT_DD) {
- /* Free descriptors used by this TxSwPacket. */
- if (TransmitDescriptor == Adapter->LastTxDescriptor)
- Adapter->OldestUsedTxDescriptor =
- Adapter->FirstTxDescriptor;
- else
- Adapter->OldestUsedTxDescriptor = (TransmitDescriptor + 1);
-
-
- /* Make available the descriptors that were previously used */
- Adapter->NumTxDescriptorsAvail += 1;
-
- if (TxSwPacket->Packet) {
- dev_kfree_skb_irq(TxSwPacket->Packet);
- TxSwPacket->Packet = NULL;
- NumTxSwPacketsCleaned++;
- }
-
- /* Remove the TxSwPacket that we just cleaned-up from the "Used"
- * list
- */
- QUEUE_POP_HEAD(&Adapter->UsedSwTxPacketList);
-
- /* Return this "Software packet" back to the "free" list */
- QUEUE_PUSH_TAIL(&Adapter->FreeSwTxPacketList,
- &TxSwPacket->Link);
-
- /* clear the out of resource condition */
- if (bdp->tx_out_res && netif_queue_stopped(dev)) {
- bdp->tx_out_res = 0;
-#ifdef IANS
- if(bdp->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
- ans_notify(dev, IANS_IND_XMIT_QUEUE_READY);
- }
-#endif
- netif_wake_queue(dev);
- }
-
- } else {
-
- if (e1000_debug_level >= 3)
- printk
- ("Last descriptor 0x%p NOT complete\n",
- TransmitDescriptor);
-
- /* Found a TxSwPacket that the E1000 is not done with
- * then there is no reason to check the rest of the queue.
- */
- break;
- }
-
- } /* end for each TxSwPacket */
-
- spin_unlock_irqrestore(&Adapter->bd_tx_lock, lock_flag_tx);
-
- if (e1000_debug_level >= 3)
- printk("Freed %d TxSwPackets\n", NumTxSwPacketsCleaned);
-
- if (!NumTxSwPacketsCleaned && e1000_debug_level >= 3)
- printk("TxSwPacket = 0x%p\n", TxSwPacket);
-
- return;
-}
-
-/****************************************************************************
-* Name: e1000_set_multicast
-*
-* Description: This routine sets a list of multicast addresses
-* as requested by the DLPI module in the 128 * 32 MTA
-* vector table. It also calculates the appropriate hash
-* value and sets the bit in the vector table
-*
-* Author: IntelCorporation
-*
-* Born on Date: 1/12/98
-*
-* Arguments:
-* dev - Ptr to this card's dev structure
-*
-* Returns:
-* NONE
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static void
-e1000_set_multi(device_t * dev)
-{
-
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
- uint32_t TempRctlReg = 0;
- uint32_t HwLowAddress;
- uint32_t HwHighAddress;
- USHORT i, j;
- UINT HashValue = 0, HashReg, HashBit;
- UINT TempUint;
- int ret_val;
- PUCHAR MulticastBuffer;
- uint16_t PciCommandWord;
- uint32_t IntMask;
- struct dev_mc_list *mc_list;
- uchar_t *mc_buff;
-
-
- /* The data must be a multiple of the Ethernet address size. */
-
- if (e1000_debug_level >= 1)
- printk("e1000_set_multicast\n");
-
- bdp = dev->priv;
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
- MulticastBuffer = Adapter->pmc_buff->MulticastBuffer;
-
- /* check to see if promiscuous mode should be enabled */
- if ((dev->flags & IFF_PROMISC) && !(bdp->flags & PROMISCUOUS)) {
- /* turn promisc mode on */
- ret_val = e1000_set_promisc(bdp, B_TRUE);
- bdp->flags |= PROMISCUOUS;
- } else {
- /* turn promisc mode off */
- ret_val = e1000_set_promisc(bdp, B_FALSE);
- bdp->flags &= ~PROMISCUOUS;
- }
-
-#if 0 /* we should try to enable this feature... */
- /* this is how you turn on receiving ALL multicast addrs */
- if ((dev->flags & IFF_ALLMULTI) && !(bdp->flags & ALL_MULTI)) {
- /* turn on recv all multi addrs */
- TempRctlReg |= E1000_RCTL_MPE;
- E1000_WRITE_REG(Rctl, TempRctlReg);
- bdp->flags |= ALL_MULTI;
- } else {
- /* turn off recv all multi addrs */
- TempRctlReg &= ~E1000_RCTL_MPE;
-/* this next line with hang the load, so be careful... */
- E1000_WRITE_REG(Rctl, TempRctlReg);
- bdp->flags &= ~ALL_MULTI;
- }
-#endif
-
- mc_buff = Adapter->pmc_buff->MulticastBuffer;
- /* Fill in the multicast addresses. */
- for (i = 0, mc_list = dev->mc_list; i < dev->mc_count;
- i++, mc_list = mc_list->next) {
- memcpy(mc_buff, (u8 *) & mc_list->dmi_addr, DL_MAC_ADDR_LEN);
- mc_buff += DL_MAC_ADDR_LEN;
- }
- /* reset the MulticastBuffer pointer */
-
- /* set the count in the Adapter struct */
- Adapter->NumberOfMcAddresses = dev->mc_count;
-
-
- /* adjust the count on addrs to bytes */
- Adapter->pmc_buff->mc_count = dev->mc_count * DL_MAC_ADDR_LEN;
-
- /* The E1000 has the ability to do perfect filtering of 16 addresses.
- * The driver uses one of the E1000's 16 receive address registers
- * for its node/network/mac/individual address. So, we have room
- * for up to 15 multicast addresses in the CAM, additional MC
- * addresses are handled by the MTA (Multicast Table Array)
- */
-
- /* this just needs to be the count of how many addrs
- * there are in the table
- */
- TempUint = dev->mc_count;
-
-
- /* If we were using the MTA then it must be cleared */
- if (Adapter->NumberOfMcAddresses > E1000_RAR_ENTRIES - 1) {
- for (i = 0; i < E1000_NUM_MTA_REGISTERS; i++) {
- E1000_WRITE_REG(Mta[i], 0);
- }
- }
-
- /* If we are given more MC addresses than we can handle, then we'll
- * notify the OS that we can't accept any more MC addresses
- */
-
- if (TempUint > MAX_NUM_MULTICAST_ADDRESSES) {
- Adapter->NumberOfMcAddresses = MAX_NUM_MULTICAST_ADDRESSES;
- } else {
- /* Set the number of MC addresses that we are being requested to use */
- Adapter->NumberOfMcAddresses = TempUint;
- }
-
- /* Store the Rctl values to use for restoring */
- TempRctlReg = E1000_READ_REG(Rctl);
-
- if (Adapter->MacType == MAC_WISEMAN_2_0) {
-
- /* if MWI was enabled then disable it before issueing the global
- * reset to the hardware.
- */
- if (Adapter->PciCommandWord && CMD_MEM_WRT_INVALIDATE) {
- PciCommandWord =
- Adapter->PciCommandWord & ~CMD_MEM_WRT_INVALIDATE;
-
- WritePciConfigWord(PCI_COMMAND_REGISTER, &PciCommandWord);
- }
-
- /* The E1000 must be in reset before changing any RA registers.
- * Reset receive unit. The chip will remain in the reset state
- * until software explicitly restarts it.
- */
- E1000_WRITE_REG(Rctl, E1000_RCTL_RST);
-
- DelayInMilliseconds(5); /* Allow receiver time to go in to reset */
- }
-
- /**********************************************************************
- * Copy up to 15 MC addresses into the E1000's receive address
- * registers pairs (Ral Rah). The first pair (Ral0 Rah0) is used
- * for our MAC/Node/Network address/IA. If there are more than 15
- * multicast addresses then the additional addresses will be hashed
- * and the Multicast Table Array (MTA) will be used.
- **********************************************************************/
- for (i = 0, j = 1;
- (i < Adapter->NumberOfMcAddresses && j < E1000_RAR_ENTRIES);
- i++, j++) {
-
- /* HW expcets these in big endian so we reverse the byte order */
- HwLowAddress =
- (MulticastBuffer[i * ETH_LENGTH_OF_ADDRESS] |
- (MulticastBuffer[i * ETH_LENGTH_OF_ADDRESS + 1] << 8)
- | (MulticastBuffer[i * ETH_LENGTH_OF_ADDRESS + 2] <<
- 16) |
- (MulticastBuffer[i * ETH_LENGTH_OF_ADDRESS + 3] << 24));
-
- /* HW expcets these in big endian so we reverse the byte order */
- HwHighAddress =
- (MulticastBuffer[i * ETH_LENGTH_OF_ADDRESS + 4] |
- (MulticastBuffer[i * ETH_LENGTH_OF_ADDRESS +
- 5] << 8) | E1000_RAH_AV);
-
- E1000_WRITE_REG(Rar[j].Low, HwLowAddress);
- E1000_WRITE_REG(Rar[j].High, HwHighAddress);
-
- }
-
- /* if the Receive Addresses Registers are not full then
- * Clear the E1000_RAH_AV bit in other Receive Address Registers
- * NOTE: 'j' must be unchanged from the RAL/RAH loop
- */
-
- while (j < E1000_RAR_ENTRIES) {
- E1000_WRITE_REG(Rar[j].Low, 0);
- E1000_WRITE_REG(Rar[j].High, 0);
- j++;
- }
-
- /* hash each remaining (if any) MC address into the E1000's receive
- * multicast hash table. NOTE: 'i' must be unchanged from the RAL/RAH loop
- */
-
- while (i < Adapter->NumberOfMcAddresses) {
-
- /* The portion of the address that is used for the hash table is
- * determined by the MulticastFilterType setting.
- */
-
- switch (Adapter->MulticastFilterType) {
- /* [0] [1] [2] [3] [4] [5]
- * 01 AA 00 12 34 56
- * LSB MSB - According to H/W docs
- */
-
- case 0: /* [47:36] i.e. 0x563 for above example address */
- HashValue =
- ((MulticastBuffer
- [i * ETH_LENGTH_OF_ADDRESS +
- 4] >> 4) | (((USHORT) MulticastBuffer[i *
- ETH_LENGTH_OF_ADDRESS
- + 5]) << 4));
- break;
-
- case 1: /* [46:35] i.e. 0xAC6 for above example address */
- HashValue =
- ((MulticastBuffer
- [i * ETH_LENGTH_OF_ADDRESS +
- 4] >> 3) | (((USHORT) MulticastBuffer[i *
- ETH_LENGTH_OF_ADDRESS
- + 5]) << 5));
- break;
-
- case 2: /* [45:34] i.e. 0x5D8 for above example address */
- HashValue =
- ((MulticastBuffer
- [i * ETH_LENGTH_OF_ADDRESS +
- 4] >> 2) | (((USHORT) MulticastBuffer[i *
- ETH_LENGTH_OF_ADDRESS
- + 5]) << 6));
- break;
-
- case 3: /* [43:32] i.e. 0x634 for above example address */
- HashValue =
- ((MulticastBuffer
- [i * ETH_LENGTH_OF_ADDRESS + 4]) | (((USHORT)
- MulticastBuffer
- [i *
- ETH_LENGTH_OF_ADDRESS
- + 5]) << 8));
- break;
-
- }
-
- /**********************************************************
- * Set the corresponding bit in the Multicast Table Array.
- * Mta is treated like a bit vector of 4096 bit split in
- * to 128 registers of 32 bits each. The Register to set
- * is in bits 11:5 of HashValue and the Bit within the
- * register to set is bits 4:0.
- ************************************************************/
-
- /* Bit number to set is in lower 5 bits */
- HashBit = HashValue & 0x1F;
-
- /* MTA register number is bits 11:5 */
- HashReg = (HashValue >> 5) & 0x7F;
-
- /* Read MTA entry */
- TempUint = E1000_READ_REG(Mta[(HashReg)]);
-
- /* Set hashed bit */
- TempUint |= (1 << HashBit);
-
- /* Write new value */
- E1000_WRITE_REG(Mta[HashReg], TempUint);
-
- i++;
- }
-
- if (Adapter->MacType == MAC_WISEMAN_2_0) {
-
- /* if WMI was enabled then reenable it after issueing the global
- * or receive reset to the hardware.
- */
- if (Adapter->PciCommandWord && CMD_MEM_WRT_INVALIDATE) {
- WritePciConfigWord(PCI_COMMAND_REGISTER,
- &Adapter->PciCommandWord);
- }
-
- DelayInMilliseconds(5);
-
- /* Take receiver out of reset */
- E1000_WRITE_REG(Rctl, 0);
- /* clear E1000_RCTL_RST bit (and all others) */
- IntMask = E1000_READ_REG(Ims);
- e1000DisableInterrupt(Adapter);
-
- /* Enable receiver */
- SetupReceiveStructures(bdp, FALSE, FALSE);
-
- /* e1000EnableInterrupt( Adapter ); */
- E1000_WRITE_REG(Ims, IntMask);
-
- /* Restore Receive Control to state it was in prior to MC add request */
- E1000_WRITE_REG(Rctl, TempRctlReg);
- }
-
-
- return;
-}
-
-
-
-/****************************************************************************
-* Name: ProcessReceiveInterrupts
-*
-* Description: This routine processes the RX interrupt & services the
-* RX queues. For each successful RFD, it allocates a
-* msg block & sends the msg upstream. The freed RFD is then
-* put at the end of the free list of RFD's.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/19/97
-*
-* Arguments:
-* bdp - Ptr to this card's DL_bdconfig structure
-*
-* Returns:
-* NONE
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-
-static void
-ProcessReceiveInterrupts(bd_config_t * bdp)
-{
- PADAPTER_STRUCT Adapter;
- device_t *dev;
- int bytes_srvcd; /* # of bytes serviced */
- sk_buff_t *skb, *new_skb;
- /* Pointer to the receive descriptor being examined. */
- PE1000_RECEIVE_DESCRIPTOR CurrentDescriptor;
- PE1000_RECEIVE_DESCRIPTOR LastDescriptorProcessed;
- PRX_SW_PACKET RxSwPacket;
- /* The amount of data received in the RBA (will be PacketSize +
- * 4 for the CRC).
- */
- USHORT Length;
- UINT Count = 0;
- BOOLEAN Status = FALSE;
- net_device_stats_t *stats;
-
- if (e1000_debug_level >= 3)
- printk("ProcessReceiveInterrupts, SOR\n");
-
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
- dev = bdp->device;
- stats = &bdp->net_stats;
-
- bytes_srvcd = 0;
-
- CurrentDescriptor = Adapter->NextRxDescriptorToCheck;
-
- if (!((CurrentDescriptor->ReceiveStatus) & E1000_RXD_STAT_DD)) {
- if (e1000_debug_level >= 3)
- printk("Proc_rx_ints: Nothing to do!\n");
- /* don't send anything up. just clear the RFD */
- return;
- }
-
- /* Loop through the receive descriptors starting at the last known
- * descriptor owned by the hardware that begins a packet.
- */
- while ((CurrentDescriptor->ReceiveStatus & E1000_RXD_STAT_DD) &&
- (Count < Adapter->MaxNumReceivePackets)) {
-
- /* Get a pointer to the actual receive buffer */
- RxSwPacket =
- (PRX_SW_PACKET) QUEUE_GET_HEAD(&Adapter->RxSwPacketList);
-
- /* Make sure this is also the last descriptor in the packet. */
- if (!(CurrentDescriptor->ReceiveStatus & E1000_RXD_STAT_EOP)) {
- /*
- * If the received packet has spanned multiple descriptors, ignore
- * and discard all the packets that do not have EOP set and proceed
- * to the next packet.
- */
- printk("Receive packet consumed mult buffers\n");
-
- new_skb = RxSwPacket->skb;
-
- } else { /* packet has EOP set - begin */
- /*
- * Store the packet length. Take the CRC lenght out of the length
- * calculation.
- */
- Length = CurrentDescriptor->Length - CRC_LENGTH;
-
- /*
- * Only the packets that are valid ethernet packets are processed and
- * sent up the stack.Normally, hardware will discard bad packets .
- */
-#ifdef IANS_BASE_VLAN_TAGGING
- if ((Length <= (Adapter->LongPacket == TRUE ? MAX_JUMBO_FRAME_SIZE :
- MAXIMUM_ETHERNET_PACKET_SIZE))
- && (Length >=
- (bdp->iANSdata->tag_mode == IANS_BD_TAGGING_802_3AC ?
- MINIMUM_ETHERNET_PACKET_SIZE - QTAG_SIZE :
- MINIMUM_ETHERNET_PACKET_SIZE))
- && ((CurrentDescriptor->Errors == 0) ||
- (SBP[Adapter->bd_number] > 0 &&
- CurrentDescriptor->Errors == E1000_RXD_ERR_CE))) {
-#else
- if ((Length <= (Adapter->LongPacket == TRUE ? MAX_JUMBO_FRAME_SIZE :
- MAXIMUM_ETHERNET_PACKET_SIZE))
- && (Length >= MINIMUM_ETHERNET_PACKET_SIZE)
- && ((CurrentDescriptor->Errors == 0) ||
- (SBP[Adapter->bd_number] > 0 &&
- CurrentDescriptor->Errors == E1000_RXD_ERR_CE))) {
-#endif
- Status = TRUE;
-
- /* allocate a mesg buff to copy the msg in */
- skb = RxSwPacket->skb;
- if (skb == NULL) {
- printk("ProcessReceiveInterrupts found a NULL skb\n");
-
- break;
- }
-
-
- if (e1000_debug_level >= 3)
- printk
- ("ProcRecInts: skb = 0x%p, skb_data = 0x%p, len = 0x%x\n",
- skb, skb->data, skb->len);
- /*
- * Allocate a new receive buffer to replace the receive buffer that
- * is being sent up the stack.
- */
-#ifdef IANS
- new_skb = alloc_skb(Adapter->RxBufferLen + BD_ANS_INFO_SIZE,
- GFP_ATOMIC);
-#else
- new_skb = alloc_skb(Adapter->RxBufferLen + 2, GFP_ATOMIC);
-#endif
- if (new_skb == NULL) {
-
- /*
- * If the allob_physreq fails, we then try to copy the received
- * packet into a message block that is allocated using the call
- * allocb.
- */
- printk("!Proc_Rec_Ints cannot alloc_skb memory\n");
-
- return;
- }
-
-#ifdef IANS
- skb_reserve(new_skb, BD_ANS_INFO_SIZE);
-#else
- skb_reserve(new_skb, 2);
-#endif
- /*
- * Adjust the skb and send the received packet up the stack
- */
-
- /* adjust the skb internal pointers */
- /* Modifies skb->tail and skb->len */
- skb_put(skb, Length);
-
- /* CHECKSUM */
- /* set the checksum info */
- skb->ip_summed = CHECKSUM_NONE;
-
-#ifdef IANS
- if(bdp->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
- if(bd_ans_os_Receive(bdp, CurrentDescriptor, skb) ==
- BD_ANS_FAILURE) {
- dev_kfree_skb_irq(skb);
- } else {
- /* pass the packet up the stack */
- netif_rx(skb);
- }
- } else {
- /* set the protocol */
- skb->protocol = eth_type_trans(skb, dev);
- /* pass the packet up the stack */
- netif_rx(skb);
- }
-#else
- /* set the protocol */
- skb->protocol = eth_type_trans(skb, dev);
- /* pass the packet up the stack */
- netif_rx(skb);
-
- if (e1000_debug_level >= 3)
- printk
- ("ProcRecInts: After skb_put, new_skb = 0x%p\n",
- new_skb);
-
-#endif
- } else {
- printk("e1000: Bad Packet Length\n");
- skb = RxSwPacket->skb;
- new_skb = skb; /* Reuse the same old skb */
-
- if (e1000_debug_level >= 3)
- printk("e1000: re-using same skb\n");
-
- } /* packet len is good/bad if */
- } /* packet has EOP set - end */
-
- /* Zero out the receive descriptors status */
- CurrentDescriptor->ReceiveStatus = 0;
-
- CurrentDescriptor->BufferAddress = 0;
- RxSwPacket->skb = NULL;
-
- /* set who this is from */
- new_skb->dev = dev;
-
- RxSwPacket->skb = new_skb;
-
- if (RxSwPacket->skb == NULL) {
- RxSwPacket->VirtualAddress = NULL;
- CurrentDescriptor->BufferAddress = 0;
- } else {
- e1000_rxfree_cnt++;
-
- RxSwPacket->VirtualAddress = RxSwPacket->skb->tail;
- CurrentDescriptor->BufferAddress = 0;
- CurrentDescriptor->BufferAddress +=
- virt_to_bus(RxSwPacket->skb->tail);
-
-
- if (e1000_debug_level >= 3)
- printk
- ("ProcRecInts: virt_addr = 0x%p, phys_addr = 0x%lx\n",
- RxSwPacket->VirtualAddress,
- (uintptr_t)CurrentDescriptor->BufferAddress);
- }
-
- /* Advance our pointers to the next descriptor (checking for wrap). */
- if (CurrentDescriptor == Adapter->LastRxDescriptor)
- Adapter->NextRxDescriptorToCheck = Adapter->FirstRxDescriptor;
- else
- Adapter->NextRxDescriptorToCheck++;
-
- LastDescriptorProcessed = CurrentDescriptor;
- CurrentDescriptor = Adapter->NextRxDescriptorToCheck;
-
- if (e1000_debug_level >= 3)
- printk("Next RX Desc to check is 0x%p\n", CurrentDescriptor);
-
- /* Put the buffer that we just indicated back at the end of our list */
- QUEUE_POP_HEAD(&Adapter->RxSwPacketList);
- QUEUE_PUSH_TAIL(&Adapter->RxSwPacketList, &RxSwPacket->Link);
-
- Count++;
-
- /* Advance the E1000's Receive Queue #0 "Tail Pointer". */
- E1000_WRITE_REG(Rdt0, (((uintptr_t) LastDescriptorProcessed -
- (uintptr_t) Adapter->FirstRxDescriptor) >> 4));
-
- if (e1000_debug_level >= 3)
- printk("Rx Tail pointer is now 0x%lX\n",
- (((uintptr_t) CurrentDescriptor -
- (uintptr_t) Adapter->FirstRxDescriptor) >> 4));
-
- } /* while loop for all packets with DD set */
-
- if (e1000_debug_level >= 3)
- printk("ProcessReceiveInterrupts: done\n");
- return;
-}
-
-/****************************************************************************
-* Name: e1000_watchdog
-*
-* Description: This routine monitors the board activity. It also updates the
-* statistics that are used by some tools.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 8/2/97
-*
-* Arguments: NONE
-*
-* Returns: NONE
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-
-
-static void
-e1000_watchdog(device_t * dev)
-{
- uint16_t LineSpeed, FullDuplex;
- bd_config_t *bdp;
- PADAPTER_STRUCT Adapter;
-
- bdp = dev->priv;
- Adapter = (PADAPTER_STRUCT) bdp->bddp;
-
- /*
- * the routines in the watchdog should only be executed if the board pointer
- * is valid, i.e the adapter is actually present.
- */
- if (bdp->flags & BOARD_PRESENT) {
-
- if(!Adapter->AdapterStopped) {
- CheckForLink(Adapter);
- }
- if(E1000_READ_REG(Status) & E1000_STATUS_LU) {
- GetSpeedAndDuplex(Adapter, &LineSpeed, &FullDuplex);
- Adapter->cur_line_speed = (uint32_t) LineSpeed;
- Adapter->FullDuplex = (uint32_t) FullDuplex;
-#ifdef IANS
- Adapter->ans_link = IANS_STATUS_LINK_OK;
- Adapter->ans_speed = (uint32_t) LineSpeed;
- Adapter->ans_duplex = FullDuplex == FULL_DUPLEX ?
- BD_ANS_DUPLEX_FULL : BD_ANS_DUPLEX_HALF;
-#endif
- if(Adapter->LinkIsActive == FALSE) {
- printk("e1000: %s %ld Mbps %s Link is Up\n", dev->name,
- Adapter->cur_line_speed,
- Adapter->FullDuplex == FULL_DUPLEX ?
- "Full Duplex" : "Half Duplex");
- Adapter->LinkIsActive = TRUE;
- }
- } else {
- Adapter->cur_line_speed = 0;
- Adapter->FullDuplex = 0;
-#ifdef IANS
- Adapter->ans_link = IANS_STATUS_LINK_FAIL;
- Adapter->ans_speed = 0;
- Adapter->ans_duplex = 0;
-#endif
- if(Adapter->LinkIsActive == TRUE) {
- printk("e1000: %s Link is Down\n", dev->name);
- Adapter->LinkIsActive = FALSE;
- }
- }
-
- /* Update the statistics needed by the upper */
- UpdateStatsCounters(bdp);
-
- }
-#ifdef IANS
- if (bdp->iANSdata->reporting_mode == IANS_STATUS_REPORTING_ON) {
- bd_ans_os_Watchdog(dev, bdp);
- }
-#endif
- /* reset the timer to 2 sec */
- mod_timer(&bdp->timer_id, jiffies + (2 * HZ));
-
- return;
-}
-
-
-/* pci.c */
-
-/*****************************************************************************
-* Name: e1000_find_pci_device
-*
-* Description: This routine finds all PCI adapters that have the given Device
-* ID and Vendor ID. It will store the IRQ, I/O, mem address,
-* node address, and slot information for each adapter in the
-* CardsFound structure. This routine will also enable the bus
-* master bit on any of our adapters (some BIOS don't do this).
-*
-*
-* Author: IntelCorporation
-*
-* Born on Date: 2/1/98
-*
-* Arguments:
-* vendor_id - Vendor ID of our 82557 based adapter.
-* device_id - Device ID of our 82557 based adapter.
-*
-* Returns:
-* B_TRUE - if found pci devices successfully
-* B_FALSE - if no pci devices found
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-*****************************************************************************/
-static boolean_t
-e1000_find_pci_device(pci_dev_t * pcid, PADAPTER_STRUCT Adapter)
-{
- ulong_t PciTrdyTimeOut = 0;
- ulong_t PciRetryTimeOut = 0;
- int status = 0;
- uint_t PciCommandWord = 0;
-
- if (e1000_debug_level >= 1)
- printk("e1000_find_pci_device\n");
-
- if ((((ushort_t) pcid->vendor) == E1000_VENDOR_ID) &&
- ((((ushort_t) pcid->device) == WISEMAN_DEVICE_ID) ||
- (((ushort_t) pcid->device) == LIVENGOOD_FIBER_DEVICE_ID) ||
- (((ushort_t) pcid->device) == LIVENGOOD_COPPER_DEVICE_ID))) {
-
- if (e1000_debug_level >= 2)
- printk
- ("pcid is ours, vendor = 0x%x, device = 0x%x\n",
- pcid->vendor, pcid->device);
-
- /* Read the values of the Trdy timeout and
- * also the retry count register
- */
-
- pci_read_config_byte(pcid,
- PCI_TRDY_TIMEOUT_REGISTER,
- (uchar_t *) & PciTrdyTimeOut);
-
- pci_read_config_byte(pcid,
- PCI_RETRY_TIMEOUT_REGISTER,
- (uchar_t *) & PciRetryTimeOut);
-
- pci_read_config_byte(pcid,
- PCI_REVISION_ID,
- (uchar_t *) & (Adapter->RevID));
-
- pci_read_config_word(pcid, PCI_SUBSYSTEM_ID,
- (ushort_t *) & (Adapter->SubSystemId));
-
- pci_read_config_word(pcid,
- PCI_SUBSYSTEM_VENDOR_ID,
- (ushort_t *) & (Adapter->SubVendorId));
-
- pci_read_config_word(pcid,
- PCI_COMMAND,
- (ushort_t *) & (Adapter->PciCommandWord));
-
- PciCommandWord = Adapter->PciCommandWord;
- Adapter->DeviceNum = pcid->devfn;
-
- Adapter->VendorId = pcid->vendor;
- Adapter->DeviceId = pcid->device;
-
- if (e1000_debug_level >= 2) {
- printk("PciTrdyTimeOut = 0x%x\n", (uchar_t) PciTrdyTimeOut);
- printk("PciRetryTimeOut = 0x%x\n", (uchar_t) PciRetryTimeOut);
- printk("RevID = 0x%x\n", (uchar_t) Adapter->RevID);
- printk("SUBSYSTEM_ID = 0x%x\n", Adapter->SubSystemId);
- printk("SUBSYSTEM_VENDOR_ID = 0x%x\n", Adapter->SubVendorId);
- printk("PciCommandWord = 0x%x\n",
- (ushort_t) Adapter->PciCommandWord);
- printk("DeviceNum = 0x%x\n", Adapter->DeviceNum);
- }
- if (e1000_pcimlt_override)
- pci_write_config_byte(pcid,
- PCI_LATENCY_TIMER,
- e1000_pcimlt_override);
-
- /* code insp #2 */
- if (!(e1000_pcimwi_enable)) {
- if (Adapter->PciCommandWord & CMD_MEM_WRT_INVALIDATE) {
- PciCommandWord =
- Adapter->PciCommandWord & ~CMD_MEM_WRT_INVALIDATE;
- pci_write_config_word(pcid,
- PCI_COMMAND_REGISTER,
- PciCommandWord);
- }
- }
-
- /* Set the Trdy timeout to zero if it is not
- * already so
- */
- if (PciTrdyTimeOut) {
- PciTrdyTimeOut = 0;
- pci_write_config_byte(pcid,
- PCI_TRDY_TIMEOUT_REGISTER,
- PciTrdyTimeOut);
-
- pci_read_config_byte(pcid,
- PCI_TRDY_TIMEOUT_REGISTER,
- (uchar_t *) & PciTrdyTimeOut);
-
- if (PciTrdyTimeOut)
- status = B_FALSE;
- else
- status = B_TRUE;
-
- } else
- status = B_TRUE;
-
- /* Set the retry timeout to zero if it is not
- * already so
- */
- if (PciRetryTimeOut) {
- PciRetryTimeOut = 0;
- pci_write_config_byte(pcid,
- PCI_RETRY_TIMEOUT_REGISTER,
- PciRetryTimeOut);
-
- pci_read_config_byte(pcid,
- PCI_RETRY_TIMEOUT_REGISTER,
- (uchar_t *) & PciRetryTimeOut);
-
- if (PciRetryTimeOut)
- status = B_FALSE;
- else
- status = B_TRUE;
- } else
- status = B_TRUE;
- }
-
- if (e1000_debug_level >= 1)
- printk("find_pci: end, status = 0x%x\n", status);
-
- return (status);
-
-}
-
-
-/****************************************************************************
-* Name: e1000_sw_init
-*
-* Description : This routine initializes all software structures needed by the
-* driver. Allocates the per board structure for storing adapter
-* information. This routine also allocates all the transmit and
-* and receive related data structures for the driver. The memory-
-* mapped PCI BAR address space is also allocated in this routine.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/21/97
-*
-* Arguments:
-* bdp - Pointer to the DLPI board structure.
-*
-* Returns:
-* B_TRUE - if successfully initialized
-* B_FALSE - if S/W initialization failed
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-
-static boolean_t
-e1000_sw_init(bd_config_t * bdp)
-{
- PADAPTER_STRUCT Adapter; /* stores all adapter specific info */
- ulong_t mem_base; /* Memory base address */
- uint_t bd_no;
- int i;
- PRX_SW_PACKET RxSwPacket;
-
- if (e1000_debug_level >= 1)
- printk("e1000_sw_init: [brd %d] begin\n", bdp->bd_number);
-
- Adapter = bdp->bddp;
-
- mem_base = bdp->mem_start;
- bd_no = bdp->bd_number;
-
- spin_lock_init(&(Adapter->bd_tx_lock));
-
- /*
- * The board specific information like the memory base address, the IO base
- * address and the board number are also stored in the Adapter structure
- */
- Adapter->mem_base = mem_base;
- Adapter->bd_number = bd_no;
-
- if (e1000_debug_level >= 2)
- printk
- ("e1000 - PR0/1000 board located at memory address 0x%lx\n",
- mem_base);
-
- /* First we have to check our "NumTxDescriptors" and make sure it is
- * a multiple of 8, because the E1000 requires this...
- */
- TxDescriptors[Adapter->bd_number] += (REQ_TX_DESCRIPTOR_MULTIPLE - 1);
- TxDescriptors[Adapter->bd_number] &=
- (~(REQ_TX_DESCRIPTOR_MULTIPLE - 1));
-
- Adapter->NumTxDescriptors = TxDescriptors[Adapter->bd_number];
-
- /*
- * Allocate memory for the TXSwPacket. The TxSwPacket stores all the
- * information needed to transmit a packet on the wire. It stores the
- * address of the message to be sent, the number of descriptors used by
- * the packet and other miscellaneous information.
- */
- if (!(Adapter->e1000_TxSwPacketPtrArea =
- (PTX_SW_PACKET) malloc_contig(sizeof(TX_SW_PACKET) *
- TxDescriptors
- [Adapter->bd_number]))) {
- printk("e1000_sw_init TxSwPacketArea alloc failed\n");
- return 0;
- }
-
- if (e1000_debug_level >= 2)
- printk("TxSwPacketPtrArea = 0x%p\n",
- Adapter->e1000_TxSwPacketPtrArea);
-
- /*
- * Allocate memory for the transmit buffer descriptors that are shared
- * between the driver and the E1000. The driver uses these descriptors to
- * give packets to the hardware for transmission and the hardware returns
- * status information in this memory area once the packet has been
- * transmitted.
- */
- bdp->base_tx_tbds = (void *) kmalloc(
- (sizeof
- (E1000_TRANSMIT_DESCRIPTOR) *
- TxDescriptors
- [Adapter->bd_number]) + 4096,
- GFP_KERNEL);
- if (bdp->base_tx_tbds == NULL) {
- printk("e1000_sw_init e1000_rbd_data alloc failed\n");
- return 0;
- }
- Adapter->e1000_tbd_data = (PE1000_TRANSMIT_DESCRIPTOR)
- (((unsigned long) bdp->base_tx_tbds + 4096) & ~4096);
-
- if (e1000_debug_level >= 2)
- printk("tbd_data = 0x%p\n", Adapter->e1000_tbd_data);
-
- /*
- * Set the first transmit descriptor to the beginning of the allocated
- * memory area and the last descriptor to the end of the memory area
- */
- Adapter->FirstTxDescriptor = Adapter->e1000_tbd_data;
-
- Adapter->LastTxDescriptor =
- Adapter->FirstTxDescriptor + (Adapter->NumTxDescriptors - 1);
-
- /* First we have to check our "NumRxDescriptors" and make sure it is
- * a multiple of 8, because the E10001000 requires this...
- */
- RxDescriptors[Adapter->bd_number] += (REQ_RX_DESCRIPTOR_MULTIPLE - 1);
- RxDescriptors[Adapter->bd_number] &=
- (~(REQ_RX_DESCRIPTOR_MULTIPLE - 1));
-
- Adapter->NumRxDescriptors = RxDescriptors[Adapter->bd_number];
-
- /*------------------------------------------------------------------------
- * Allocate memory for the RX_SW_PACKET structures. Each one of these
- * structures will contain a virtual and physical address to an actual
- * receive buffer in host memory. Since we use one RX_SW_PACKET per received
- * packet, the maximum number of RX_SW_PACKETs that we'll need is equal
- * to the number of receive descriptors that that we've allocated.
- *--------------------------------------------------------------------
- */
-
- if (!
- (Adapter->RxSwPacketPointerArea =
- kmalloc(sizeof(RX_SW_PACKET) *
- (RxDescriptors[Adapter->bd_number]), GFP_KERNEL))) {
- printk("e1000_sw_init RxSwPacketPointerArea alloc failed\n");
- return 0;
- }
-
- if (e1000_debug_level >= 2)
- printk("RxSwPacketPointerArea = 0x%p\n",
- Adapter->RxSwPacketPointerArea);
-
- /*------------------------------------------------------------------------
- * Allocate memory for the receive descriptors (in shared memory), with
- * enough room left over to make sure that we can properly align the
- * structures.
- *----------------------------------------------------------------------
- */
-
- bdp->base_rx_rbds = (void *) kmalloc(
- (sizeof
- (E1000_RECEIVE_DESCRIPTOR) *
- RxDescriptors
- [Adapter->bd_number]) + 4096,
- GFP_KERNEL);
- if (bdp->base_rx_rbds == 0) {
- printk("e1000_sw_init e1000_rbd_data alloc failed\n");
- return 0;
- }
- Adapter->e1000_rbd_data = (PE1000_RECEIVE_DESCRIPTOR)
- (((unsigned long) bdp->base_rx_rbds + 4096) & ~4096);
-
- if (e1000_debug_level >= 2)
- printk("rbd_data = 0x%p\n", Adapter->e1000_rbd_data);
-
- Adapter->FirstRxDescriptor =
- (PE1000_RECEIVE_DESCRIPTOR) Adapter->e1000_rbd_data;
-
- Adapter->LastRxDescriptor =
- Adapter->FirstRxDescriptor + (Adapter->NumRxDescriptors - 1);
-
- /*------------------------------------------------------------------------
- * We've allocated receive buffer pointers, and receive descriptors. Now
- * Allocate a buffer for each descriptor, and zero the buffer.
- *----------------------------------------------------------------------
- */
-
- /*------------------------------------------------------------------------
- * For each receive buffer, the Physical address will be stored
- * in the RX_SW_PACKET's "PhysicalAddress" field, while the
- * virtual address will be stored in the "VirtualAddress" field.
- *-----------------------------------------------------------------------
- */
-
- /* allocate a physreq structure for specifying receive buffer DMA
- * requirements.
- */
-
- /*
- * For each RxSwPacket, allocate a receive buffer 2048 bytes in size. The
- * RxSwPacket has a pointer to the virtual address of receive buffer. There
- * is a one to one correspondance between the RxSwPacket, receive buffer and
- * the receive descriptor.
- */
- for (i = 0, RxSwPacket = Adapter->RxSwPacketPointerArea;
- i < Adapter->NumRxDescriptors; i++, RxSwPacket++) {
-
-#ifdef IANS
- RxSwPacket->skb = alloc_skb(Adapter->RxBufferLen + BD_ANS_INFO_SIZE,
- GFP_ATOMIC);
-#else
- RxSwPacket->skb = alloc_skb(Adapter->RxBufferLen + 2, GFP_ATOMIC);
-#endif
- if (RxSwPacket->skb == NULL) {
- printk("e1000_sw_init SetupReceiveStructures BIG PROBLEM\n");
- return 0;
- } else {
- /* make the 14 byte mac header align to 16 */
-#ifdef IANS
- skb_reserve(RxSwPacket->skb, BD_ANS_INFO_SIZE);
-#else
- skb_reserve(RxSwPacket->skb, 2);
-#endif
- /* set who this is from - JR 9/10/99 */
- RxSwPacket->skb->dev = bdp->device;
-
- RxSwPacket->VirtualAddress = RxSwPacket->skb->tail;
-
- if (!RxSwPacket->VirtualAddress) {
- return RET_STATUS_FAILURE;
- }
-
- /* Zero the [cached] receive buffer. */
- memset((PVOID) RxSwPacket->VirtualAddress, 0,
- E1000_SIZE_OF_RECEIVE_BUFFERS);
- }
-
- } /* end of RxSwPacket for loop */
-
-
- /*
- * Set up the multicast table data area
- */
-/*
- Adapter->pmc_buff->MulticastBuffer =
- ((mltcst_cb_t *)&bdp->mc_data)->MulticastBuffer;
-*/
- Adapter->pmc_buff = (mltcst_cb_t *) bdp->mc_data;
-
- if (e1000_debug_level >= 1)
- printk("pmc_buff = 0x%p\n", Adapter->pmc_buff);
-
- return 1;
-}
-
-/****************************************************************************
-* Name: e1000_alloc_space
-*
-* Description : This routine allocates paragraph ( 16 bit ) aligned memory for
-* the driver. Memory allocated is for the following structures
-* - BDP ( the main interface struct between dlpi and the driver )
-* - error count structure for adapter statistics
-*
-* For the MP_VERSION of this driver, each sap structure returned
-* by this routine has a pre allocated synchornize var. Ditto for
-* BDP's allocated ( they have a spin lock in them ).
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/11/97
-*
-* Arguments:
-* None
-*
-* Returns:
-* TRUE - if successfully allocated
-* FALSE - if S/W allocation failed
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static bd_config_t *
-e1000_alloc_space(void)
-{
- bd_config_t *bdp, *temp_bd;
- PADAPTER_STRUCT Adapter; /* stores all adapter specific info */
-
- if (e1000_debug_level >= 1)
- printk("e1000_alloc_space: begin\n");
-
- /* allocate space for the DL_board_t structures */
- bdp = (bd_config_t *) kmalloc(sizeof(bd_config_t), GFP_KERNEL);
-
- if (bdp == NULL) {
- if (e1000_debug_level >= 2)
- printk("e1000_alloc_space e1000_config alloc failed\n");
- return NULL;
- }
-
- /* fill the bdp with zero */
- memset(bdp, 0x00, sizeof(*bdp));
-
- if (e1000_debug_level >= 2)
- printk("bdp = 0x%p\n", bdp);
-
- /* if first one, save it, else link it into the chain of bdp's */
- if (e1000first == NULL) {
- e1000first = bdp;
- bdp->bd_number = 0;
- bdp->bd_next = NULL;
- bdp->bd_prev = NULL;
-
- if (e1000_debug_level >= 2)
- printk("First one\n");
-
- } else {
- /* No, so find last in list and link the new one in */
- temp_bd = e1000first;
- bdp->bd_number = 1; /* it is at least 1 */
- while (temp_bd->bd_next != NULL) {
- temp_bd = (bd_config_t *) temp_bd->bd_next;
- bdp->bd_number++; /* set the board number */
- }
- temp_bd->bd_next = bdp;
- bdp->bd_next = NULL;
- bdp->bd_prev = temp_bd;
- if (e1000_debug_level >= 2)
- printk("Not first one\n");
-
- }
-
- /*
- * Allocate the Adapter sturcuture. The Adapter structure contains all the
- * information that is specific to that board instance. It contains pointers
- * to all the transmit and receive data structures for the board, all the
- * PCI related information for the board, and all the statistical counters
- * associated with the board.
- */
- Adapter =
- (PADAPTER_STRUCT) kmalloc(sizeof(ADAPTER_STRUCT), GFP_KERNEL);
- if (Adapter == NULL) {
- if (e1000_debug_level >= 2)
- printk("e1000_sw_init Adapter structure alloc failed\n");
- return (NULL);
- }
-
- memset(Adapter, 0x00, sizeof(ADAPTER_STRUCT));
-
- /*
- * The Adapter pointer is made to point to the bddp ( Board dependent
- * pointer) that is referenced off the bdp ( board ) structure.
- */
- bdp->bddp = Adapter;
-
- if (e1000_debug_level >= 2)
- printk("bdp->bddp = 0x%p\n", bdp->bddp);
-
- /* allocate space for multi-cast address space */
- if (!
- (bdp->mc_data =
- (pmltcst_cb_t) malloc_contig(sizeof(mltcst_cb_t)))) {
- if (e1000_debug_level >= 2)
- printk("e1000_alloc_space mc_data alloc failed\n");
- return NULL;
- }
- memset(bdp->mc_data, 0x00, sizeof(mltcst_cb_t));
-
- if (e1000_debug_level >= 2)
- printk("bdp->mc_data = 0x%p\n", bdp->mc_data);
-
- if (e1000_debug_level >= 1)
- printk("e1000_alloc_space: end\n");
-
- return (bdp);
-}
-
-/****************************************************************************
-* Name: e1000_dealloc_space
-*
-* Description : This routine frees all the memory allocated by "alloc_space".
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/17/97
-*
-* Arguments:
-* None
-*
-* Returns:
-* none
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static void
-e1000_dealloc_space(bd_config_t * bdp)
-{
- if (e1000_debug_level >= 1)
- printk("e1000_dealloc_space, bdp = 0x%p\n", bdp);
- if (bdp) {
- free_contig(bdp->mc_data);
- bdp->mc_data = NULL;
-
- free_contig(bdp->bddp);
- bdp->bddp = NULL;
-
- /* unlink the bdp from the linked list */
- if (bdp == e1000first) {
- e1000first = (bd_config_t *) bdp->bd_next;
- if (bdp->bd_next)
- ((bd_config_t *) bdp->bd_next)->bd_prev = NULL;
- } else {
- if (bdp->bd_next)
- ((bd_config_t *) bdp->bd_next)->bd_prev = bdp->bd_prev;
- if (bdp->bd_prev)
- ((bd_config_t *) bdp->bd_prev)->bd_next = bdp->bd_next;
- }
- }
-
- free_contig(bdp);
- bdp = NULL;
-
- return;
-}
-
-/****************************************************************************
-* Name: malloc_contig
-*
-* Description : This routine allocates a contigious chunk of memory of
-* specified size.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 7/18/97
-*
-* Arguments:
-* size - Size of contigious memory required.
-*
-* Returns:
-* void ptr - if successfully allocated
-* NULL - if allocation failed
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static void *
-malloc_contig(int size)
-{
- void *mem;
-
- /* allocate memory */
- mem = kmalloc(size, GFP_KERNEL);
- if (!mem)
- return (NULL);
-
- return (mem);
-}
-
-/****************************************************************************
-* Name: free_contig
-*
-* Description : This routine frees up space previously allocated by
-* malloc_contig.
-*
-* Author: IntelCorporation
-*
-* Born on Date: 1/18/98
-*
-* Arguments:
-* ptr - Pointer to the memory to free.
-* size - Size of memory to free.
-*
-* Returns:
-* TRUE - if successfully initialized
-* FALSE - if S/W initialization failed
-*
-* Modification log:
-* Date Who Description
-* -------- --- --------------------------------------------------------
-*
-****************************************************************************/
-static void
-free_contig(void *ptr)
-{
- if (ptr)
- kfree(ptr);
-
- ptr = NULL;
-}
-
-static int
-e1000_GetBrandingMesg(uint16_t dev, uint16_t sub_ven, uint16_t sub_dev)
-{
- char *mesg = NULL;
- int i = 0;
-
- /* Go through the list of all valid subsystem IDs */
- while (e1000_vendor_info_array[i].idstr != NULL) {
- /* Look for exact match on sub_dev and sub_ven */
- if ((e1000_vendor_info_array[i].dev == dev) &&
- (e1000_vendor_info_array[i].sub_ven == sub_ven) &&
- (e1000_vendor_info_array[i].sub_dev == sub_dev)) {
- mesg = e1000_vendor_info_array[i].idstr;
- break;
- } else if ((e1000_vendor_info_array[i].dev == dev) &&
- (e1000_vendor_info_array[i].sub_ven == sub_ven) &&
- (e1000_vendor_info_array[i].sub_dev == CATCHALL)) {
- mesg = e1000_vendor_info_array[i].idstr;
- } else if ((e1000_vendor_info_array[i].dev == dev) &&
- (e1000_vendor_info_array[i].sub_ven == CATCHALL) &&
- (mesg == NULL)) {
- mesg = e1000_vendor_info_array[i].idstr;
- }
- i++;
- }
- if (mesg != NULL) {
- strcpy(e1000id_string, mesg);
- return 1;
- } else
- return 0;
-}
-
-/* fxhw.c */
-static boolean_t
-DetectKnownChipset(PADAPTER_STRUCT Adapter)
-{
- pci_dev_t *pcid;
- ulong_t DataPort;
- uchar_t SaveConfig;
- uchar_t TestConfig;
-
- SaveConfig = inb(CF2_SPACE_ENABLE_REGISTER);
-
- outb((uchar_t) CF2_SPACE_ENABLE_REGISTER, 0x0E);
-
- TestConfig = inb(CF2_SPACE_ENABLE_REGISTER);
-
- if (TestConfig == 0x0E) {
-
- outb((uchar_t) CF2_SPACE_ENABLE_REGISTER, SaveConfig);
-
- return FALSE;
- }
-
-
- if (
- (pcid =
- pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_440BX_AGP, NULL))
- || (pcid = pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_440BX, NULL))
- || (pcid = pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_440GX, NULL))
- || (pcid = pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_440FX, NULL))
- || (pcid =
- pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_430TX, NULL))) {
-
- outb((uchar_t) CF2_SPACE_ENABLE_REGISTER, SaveConfig);
-
- if (e1000_debug_level >= 3)
- printk
- ("Found a known member of the 430 or 440 chipset family");
-
- return TRUE;
- }
-
-
- if (
- (pcid =
- pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_450NX_PXB, NULL))) {
-
- pci_read_config_byte(pcid, PCI_REV_ID_REGISTER, (u8 *) & DataPort);
-
- if (e1000_debug_level >= 3)
- printk
- ("Found a 450NX chipset with PXB rev ID 0x%x\n",
- (uchar_t) DataPort);
-
- outb((uchar_t) CF2_SPACE_ENABLE_REGISTER, SaveConfig);
-
- if (((uchar_t) DataPort) >= PXB_C0_REV_ID) {
- if (e1000_debug_level >= 3)
- printk("Found a 450NX chipset with C0 or later PXB");
- return FALSE;
- } else {
- if (e1000_debug_level >= 3)
- printk("Found a 450NX chipset with B1 or earlier PXB");
- return TRUE;
- }
- }
-
- if (
- (pcid =
- pci_find_device(PCI_VENDOR_ID_INTEL, INTEL_450KX_GX_PB, NULL))) {
-
- outb((uchar_t) CF2_SPACE_ENABLE_REGISTER, SaveConfig);
-
- if (e1000_debug_level >= 3)
- printk("Found a 450KX or 450GX chipset");
-
- return TRUE;
- }
-
- outb((uchar_t) CF2_SPACE_ENABLE_REGISTER, SaveConfig);
-
- if (e1000_debug_level >= 3)
- printk("Did not find a known chipset");
-
- return FALSE;
-}
-
-#ifdef MODULE
-/* ENTRY POINTS */
-EXPORT_SYMBOL(e1000_open);
-EXPORT_SYMBOL(e1000_close);
-EXPORT_SYMBOL(e1000_xmit_frame);
-EXPORT_SYMBOL(e1000_probe);
-EXPORT_SYMBOL(e1000_change_mtu);
-EXPORT_SYMBOL(e1000_intr);
-/* DEBUG */
-#endif
diff --git a/drivers/e1000-4.x/src/e1000.h.orig b/drivers/e1000-4.x/src/e1000.h.orig
deleted file mode 100644
index 77f9d07dd..000000000
--- a/drivers/e1000-4.x/src/e1000.h.orig
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
-
-
- Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- The full GNU General Public License is included in this distribution in the
- file called LICENSE.
-
- Contact Information:
- Linux NICS <linux.nics@intel.com>
- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-*******************************************************************************/
-
-
-/* Linux PRO/1000 Ethernet Driver main header file */
-
-#ifndef _E1000_H_
-#define _E1000_H_
-#ifndef __E1000_MAIN__
-#define __NO_VERSION__
-#endif
-
-#include <linux/stddef.h>
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <asm/byteorder.h>
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/delay.h>
-#include <linux/timer.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/string.h>
-#include <linux/pagemap.h>
-#include <asm/bitops.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <linux/capability.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/tcp.h>
-#include <linux/udp.h>
-#include <net/pkt_sched.h>
-#include <linux/list.h>
-#include <linux/reboot.h>
-#ifdef SIOCETHTOOL
-#include <linux/ethtool.h>
-#endif
-#ifdef NETIF_F_HW_VLAN_TX
-#include <linux/if_vlan.h>
-#endif
-
-#define BAR_0 0
-#define BAR_1 1
-#define BAR_5 5
-#define PCI_DMA_64BIT 0xffffffffffffffffULL
-#define PCI_DMA_32BIT 0x00000000ffffffffULL
-
-#include "kcompat.h"
-
-struct e1000_adapter;
-
-#include "e1000_hw.h"
-#ifdef IANS
-#include "base_comm.h"
-#include "ans_driver.h"
-#include "ans.h"
-#endif
-#ifdef IDIAG
-#include "idiag_pro.h"
-#endif
-
-#if DBG
-#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
-#else
-#define E1000_DBG(args...)
-#endif
-
-#define E1000_ERR(args...) printk(KERN_ERR "e1000: " args)
-
-#define E1000_MAX_INTR 10
-
-/* Supported Rx Buffer Sizes */
-#define E1000_RXBUFFER_2048 2048
-#define E1000_RXBUFFER_4096 4096
-#define E1000_RXBUFFER_8192 8192
-#define E1000_RXBUFFER_16384 16384
-
-/* How many Tx Descriptors do we need to call netif_wake_queue ? */
-#define E1000_TX_QUEUE_WAKE 16
-/* How many Rx Buffers do we bundle into one write to the hardware ? */
-#define E1000_RX_BUFFER_WRITE 16
-
-#define E1000_JUMBO_PBA 0x00000028
-#define E1000_DEFAULT_PBA 0x00000030
-
-#define AUTO_ALL_MODES 0
-
-/* only works for sizes that are powers of 2 */
-#define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1)))
-
-/* wrapper around a pointer to a socket buffer,
- * so a DMA handle can be stored along with the buffer */
-struct e1000_buffer {
- struct sk_buff *skb;
- uint64_t dma;
- unsigned long length;
- unsigned long time_stamp;
-};
-
-struct e1000_desc_ring {
- /* pointer to the descriptor ring memory */
- void *desc;
- /* physical address of the descriptor ring */
- dma_addr_t dma;
- /* length of descriptor ring in bytes */
- unsigned int size;
- /* number of descriptors in the ring */
- unsigned int count;
- /* next descriptor to associate a buffer with */
- unsigned int next_to_use;
- /* next descriptor to check for DD status bit */
- unsigned int next_to_clean;
- /* array of buffer information structs */
- struct e1000_buffer *buffer_info;
-};
-
-#define E1000_DESC_UNUSED(R) \
-((((R)->next_to_clean + (R)->count) - ((R)->next_to_use + 1)) % ((R)->count))
-
-#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))
-#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc)
-#define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc)
-#define E1000_CONTEXT_DESC(R, i) E1000_GET_DESC(R, i, e1000_context_desc)
-
-/* board specific private data structure */
-
-struct e1000_adapter {
-#ifdef IANS
- void *iANSReserved;
- piANSsupport_t iANSdata;
- uint32_t ans_link;
- uint32_t ans_speed;
- uint32_t ans_duplex;
- uint32_t ans_suspend;
- IANS_BD_TAGGING_MODE tag_mode;
-#endif
- struct timer_list watchdog_timer;
- struct timer_list phy_info_timer;
-#ifdef CONFIG_PROC_FS
- struct list_head proc_list_head;
-#endif
-#ifdef NETIF_F_HW_VLAN_TX
- struct vlan_group *vlgrp;
-#endif
- char *id_string;
- uint32_t bd_number;
- uint32_t rx_buffer_len;
- uint32_t part_num;
- uint32_t wol;
- uint16_t link_speed;
- uint16_t link_duplex;
- spinlock_t stats_lock;
- atomic_t irq_sem;
-
-#ifdef ETHTOOL_PHYS_ID
- struct timer_list blink_timer;
- unsigned long led_status;
-#endif
-
- /* TX */
- struct e1000_desc_ring tx_ring;
- uint32_t txd_cmd;
- uint32_t tx_int_delay;
- uint32_t tx_abs_int_delay;
- int max_data_per_txd;
-
- /* RX */
- struct e1000_desc_ring rx_ring;
- uint64_t hw_csum_err;
- uint64_t hw_csum_good;
- uint32_t rx_int_delay;
- uint32_t rx_abs_int_delay;
- boolean_t rx_csum;
-
- /* OS defined structs */
- struct net_device *netdev;
- struct pci_dev *pdev;
- struct net_device_stats net_stats;
-
- /* structs defined in e1000_hw.h */
- struct e1000_hw hw;
- struct e1000_hw_stats stats;
- struct e1000_phy_info phy_info;
- struct e1000_phy_stats phy_stats;
-
-#ifdef IDIAG
- uint32_t diag_icr;
- struct e1000_desc_ring diag_tx_ring;
- struct e1000_desc_ring diag_rx_ring;
-#endif
-
-#ifdef E1000_COUNT_ICR
- uint64_t icr_txdw;
- uint64_t icr_txqe;
- uint64_t icr_lsc;
- uint64_t icr_rxseq;
- uint64_t icr_rxdmt;
- uint64_t icr_rxo;
- uint64_t icr_rxt;
- uint64_t icr_mdac;
- uint64_t icr_rxcfg;
- uint64_t icr_gpi;
-#endif
-
- uint32_t pci_state[16];
-
- /* Semaphore for locking HW access vs. i2c-i8254x SMBUS driver */
- struct semaphore smbus_lock;
-};
-#endif /* _E1000_H_ */
diff --git a/drivers/e1000-4.x/src/e1000_idiag.c.orig b/drivers/e1000-4.x/src/e1000_idiag.c.orig
deleted file mode 100644
index edc02d07c..000000000
--- a/drivers/e1000-4.x/src/e1000_idiag.c.orig
+++ /dev/null
@@ -1,1048 +0,0 @@
-/*******************************************************************************
-
-
- Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- The full GNU General Public License is included in this distribution in the
- file called LICENSE.
-
- Contact Information:
- Linux NICS <linux.nics@intel.com>
- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-*******************************************************************************/
-
-/*
- * Intel PRO diagnostics
- */
-
-#include "e1000.h"
-#include "idiag_pro.h"
-#include "idiag_e1000.h"
-
-extern int e1000_up(struct e1000_adapter *adapter);
-extern void e1000_down(struct e1000_adapter *adapter);
-extern void e1000_reset(struct e1000_adapter *adapter);
-
-#define REG_PATTERN_TEST(R, M, W) \
-{ \
- uint32_t pat, value; \
- uint32_t test[] = \
- {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; \
- for(pat = 0; pat < sizeof(test)/sizeof(test[0]); pat++) { \
- E1000_WRITE_REG(&adapter->hw, R, (test[pat] & W)); \
- value = E1000_READ_REG(&adapter->hw, R); \
- if(value != (test[pat] & W & M)) { \
- param->reg = \
- (adapter->hw.mac_type < e1000_82543) ? \
- E1000_82542_##R : E1000_##R; \
- param->write_value = test[pat] & W; \
- param->read_value = value; \
- return IDIAG_PRO_STAT_TEST_FAILED; \
- } \
- } \
-}
-
-#define REG_SET_AND_CHECK(R, M, W) \
-{ \
- uint32_t value; \
- E1000_WRITE_REG(&adapter->hw, R, W & M); \
- value = E1000_READ_REG(&adapter->hw, R); \
- if ((W & M) != (value & M)) { \
- param->reg = (adapter->hw.mac_type < e1000_82543) ? \
- E1000_82542_##R : E1000_##R; \
- param->write_value = W & M; \
- param->read_value = value & M; \
- return IDIAG_PRO_STAT_TEST_FAILED; \
- } \
-}
-
-static enum idiag_pro_stat
-e1000_diag_reg_test(struct e1000_adapter *adapter,
- uint8_t *diag_param)
-{
- struct idiag_e1000_diag_reg_test_param *param =
- (struct idiag_e1000_diag_reg_test_param *) diag_param;
- uint32_t value;
- uint32_t i;
-
- /* The status register is Read Only, so a write should fail.
- * Some bits that get toggled are ignored.
- */
- value = (E1000_READ_REG(&adapter->hw, STATUS) & (0xFFFFF833));
- E1000_WRITE_REG(&adapter->hw, STATUS, (0xFFFFFFFF));
- if(value != (E1000_READ_REG(&adapter->hw, STATUS) & (0xFFFFF833))) {
- param->reg = E1000_STATUS;
- param->write_value = 0xFFFFFFFF;
- param->read_value = value;
- return IDIAG_PRO_STAT_TEST_FAILED;
- }
-
- REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(RDLEN, 0x000FFF80, 0x000FFFFF);
- REG_PATTERN_TEST(RDH, 0x0000FFFF, 0x0000FFFF);
- REG_PATTERN_TEST(RDT, 0x0000FFFF, 0x0000FFFF);
- REG_PATTERN_TEST(FCRTH, 0x0000FFF8, 0x0000FFF8);
- REG_PATTERN_TEST(FCTTV, 0x0000FFFF, 0x0000FFFF);
- REG_PATTERN_TEST(TIPG, 0x3FFFFFFF, 0x3FFFFFFF);
- REG_PATTERN_TEST(TDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
- REG_PATTERN_TEST(TDLEN, 0x000FFF80, 0x000FFFFF);
-
- REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000);
- REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0x003FFFFB);
- REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000);
-
- if(adapter->hw.mac_type >= e1000_82543) {
-
- REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0xFFFFFFFF);
- REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
- REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
- REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
- REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF);
-
- for(i = 0; i < E1000_RAR_ENTRIES; i++) {
- REG_PATTERN_TEST(RA + ((i << 1) << 2), 0xFFFFFFFF,
- 0xFFFFFFFF);
- REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF,
- 0xFFFFFFFF);
- }
-
- } else {
-
- REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x01FFFFFF);
- REG_PATTERN_TEST(RDBAL, 0xFFFFF000, 0xFFFFFFFF);
- REG_PATTERN_TEST(TXCW, 0x0000FFFF, 0x0000FFFF);
- REG_PATTERN_TEST(TDBAL, 0xFFFFF000, 0xFFFFFFFF);
-
- }
-
- for(i = 0; i < E1000_MC_TBL_SIZE; i++)
- REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF);
-
- return IDIAG_PRO_STAT_OK;
-}
-
-
-static enum idiag_pro_stat
-e1000_diag_eeprom_test(struct e1000_adapter *adapter,
- uint8_t *diag_param)
-{
- struct idiag_e1000_diag_eeprom_test_param *param =
- (struct idiag_e1000_diag_eeprom_test_param *) diag_param;
- uint16_t temp;
- uint16_t checksum = 0;
- uint16_t i;
-
- /* Read and add up the contents of the EEPROM */
- for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
- if((e1000_read_eeprom(&adapter->hw, i, &temp)) < 0) {
- param->actual_checksum = checksum;
- param->expected_checksum = EEPROM_SUM;
- return IDIAG_PRO_STAT_TEST_FATAL;
- }
- checksum += temp;
- }
-
- /* If Checksum is not Correct return error else test passed */
- if(checksum != (uint16_t) EEPROM_SUM) {
- param->actual_checksum = checksum;
- param->expected_checksum = EEPROM_SUM;
- return IDIAG_PRO_STAT_TEST_FAILED;
- }
-
- return IDIAG_PRO_STAT_OK;
-}
-
-static void
-e1000_diag_intr(int irq,
- void *data,
- struct pt_regs *regs)
-{
- struct net_device *netdev = (struct net_device *) data;
- struct e1000_adapter *adapter = netdev->priv;
-
- adapter->diag_icr |= E1000_READ_REG(&adapter->hw, ICR);
-
- return;
-}
-
-static enum idiag_pro_stat
-e1000_diag_intr_test(struct e1000_adapter *adapter,
- uint8_t *diag_param)
-{
- struct net_device *netdev = adapter->netdev;
- enum idiag_e1000_diag_intr_test_param *param =
- (enum idiag_e1000_diag_intr_test_param *) diag_param;
- uint32_t icr, i, mask;
-
- *param = IDIAG_E1000_INTR_TEST_OK;
-
- /* Hook up diag interrupt handler just for this test */
- if(request_irq
- (netdev->irq, &e1000_diag_intr, SA_SHIRQ, netdev->name, netdev))
- return IDIAG_PRO_STAT_TEST_FATAL;
-
- /* Disable all the interrupts */
- E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
- msec_delay(10);
-
- /* Interrupts are disabled, so read interrupt cause
- * register (icr) twice to verify that there are no interrupts
- * pending. icr is clear on read.
- */
- icr = E1000_READ_REG(&adapter->hw, ICR);
- icr = E1000_READ_REG(&adapter->hw, ICR);
-
- if(icr != 0) {
- /* if icr is non-zero, there is no point
- * running other interrupt tests.
- */
- *param = IDIAG_E1000_INTR_TEST_NOT_EXEC;
- return IDIAG_PRO_STAT_TEST_FAILED;
- }
-
- /* Test each interrupt */
- for(i = 0; i < 10; i++) {
-
- /* Interrupt to test */
- mask = 1 << i;
-
- /* Disable the interrupt to be reported in
- * the cause register and then force the same
- * interrupt and see if one gets posted. If
- * an interrupt was posted to the bus, the
- * test failed.
- */
- adapter->diag_icr = 0;
- E1000_WRITE_REG(&adapter->hw, IMC, mask);
- E1000_WRITE_REG(&adapter->hw, ICS, mask);
- msec_delay(10);
-
- if(adapter->diag_icr & mask) {
- *param = IDIAG_E1000_INTR_TEST_FAILED_WHILE_DISABLED;
- break;
- }
-
- /* Enable the interrupt to be reported in
- * the cause register and then force the same
- * interrupt and see if one gets posted. If
- * an interrupt was not posted to the bus, the
- * test failed.
- */
- adapter->diag_icr = 0;
- E1000_WRITE_REG(&adapter->hw, IMS, mask);
- E1000_WRITE_REG(&adapter->hw, ICS, mask);
- msec_delay(10);
-
- if(!(adapter->diag_icr & mask)) {
- *param = IDIAG_E1000_INTR_TEST_FAILED_WHILE_ENABLED;
- break;
- }
-
- /* Disable the other interrupts to be reported in
- * the cause register and then force the other
- * interrupts and see if any get posted. If
- * an interrupt was posted to the bus, the
- * test failed.
- */
- adapter->diag_icr = 0;
- E1000_WRITE_REG(&adapter->hw, IMC, ~mask);
- E1000_WRITE_REG(&adapter->hw, ICS, ~mask);
- msec_delay(10);
-
- if(adapter->diag_icr) {
- *param = IDIAG_E1000_INTR_TEST_FAILED_MASKED_ENABLED;
- break;
- }
- }
-
- /* Disable all the interrupts */
- E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
- msec_delay(10);
-
- /* Unhook diag interrupt handler */
- free_irq(netdev->irq, netdev);
-
- return (*param ==
- IDIAG_E1000_INTR_TEST_OK) ? IDIAG_PRO_STAT_OK :
- IDIAG_PRO_STAT_TEST_FAILED;
-}
-
-static void
-e1000_free_desc_rings(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *txdr = &adapter->diag_tx_ring;
- struct e1000_desc_ring *rxdr = &adapter->diag_rx_ring;
- struct pci_dev *pdev = adapter->pdev;
- int i;
-
- if(txdr->desc && txdr->buffer_info) {
- for(i = 0; i < txdr->count; i++) {
- if(txdr->buffer_info[i].dma)
- pci_unmap_single(pdev, txdr->buffer_info[i].dma,
- txdr->buffer_info[i].length,
- PCI_DMA_TODEVICE);
- if(txdr->buffer_info[i].skb)
- dev_kfree_skb(txdr->buffer_info[i].skb);
- }
- }
-
- if(rxdr->desc && rxdr->buffer_info) {
- for(i = 0; i < rxdr->count; i++) {
- if(rxdr->buffer_info[i].dma)
- pci_unmap_single(pdev, rxdr->buffer_info[i].dma,
- rxdr->buffer_info[i].length,
- PCI_DMA_FROMDEVICE);
- if(rxdr->buffer_info[i].skb)
- dev_kfree_skb(rxdr->buffer_info[i].skb);
- }
- }
-
- if(txdr->desc)
- pci_free_consistent(pdev, txdr->size, txdr->desc, txdr->dma);
- if(rxdr->desc)
- pci_free_consistent(pdev, rxdr->size, rxdr->desc, rxdr->dma);
-
- if(txdr->buffer_info)
- kfree(txdr->buffer_info);
- if(rxdr->buffer_info)
- kfree(rxdr->buffer_info);
-
- return;
-}
-
-static int
-e1000_setup_desc_rings(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *txdr = &adapter->diag_tx_ring;
- struct e1000_desc_ring *rxdr = &adapter->diag_rx_ring;
- struct pci_dev *pdev = adapter->pdev;
- uint32_t rctl;
- int size, i;
-
- /* Setup Tx descriptor ring and Tx buffers */
-
- txdr->count = 80;
-
- size = txdr->count * sizeof(struct e1000_buffer);
- if(!(txdr->buffer_info = kmalloc(size, GFP_KERNEL)))
- goto err_nomem;
- memset(txdr->buffer_info, 0, size);
-
- txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
- E1000_ROUNDUP(txdr->size, 4096);
- if(!(txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma)))
- goto err_nomem;
- memset(txdr->desc, 0, txdr->size);
- txdr->next_to_use = txdr->next_to_clean = 0;
-
- E1000_WRITE_REG(&adapter->hw, TDBAL,
- ((uint64_t) txdr->dma & 0x00000000FFFFFFFF));
- E1000_WRITE_REG(&adapter->hw, TDBAH, ((uint64_t) txdr->dma >> 32));
- E1000_WRITE_REG(&adapter->hw, TDLEN,
- txdr->count * sizeof(struct e1000_tx_desc));
- E1000_WRITE_REG(&adapter->hw, TDH, 0);
- E1000_WRITE_REG(&adapter->hw, TDT, 0);
- E1000_WRITE_REG(&adapter->hw, TCTL,
- E1000_TCTL_PSP | E1000_TCTL_EN |
- E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT |
- E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT);
-
- for(i = 0; i < txdr->count; i++) {
- struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*txdr, i);
- struct sk_buff *skb;
- unsigned int size = 1024;
-
- if(!(skb = alloc_skb(size, GFP_KERNEL)))
- goto err_nomem;
- skb_put(skb, size);
- txdr->buffer_info[i].skb = skb;
- txdr->buffer_info[i].length = skb->len;
- txdr->buffer_info[i].dma =
- pci_map_single(pdev, skb->data, skb->len,
- PCI_DMA_TODEVICE);
- tx_desc->buffer_addr = cpu_to_le64(txdr->buffer_info[i].dma);
- tx_desc->lower.data = cpu_to_le32(skb->len);
- tx_desc->lower.data |= E1000_TXD_CMD_EOP;
- tx_desc->lower.data |= E1000_TXD_CMD_IFCS;
- tx_desc->lower.data |= E1000_TXD_CMD_RPS;
- tx_desc->upper.data = 0;
- }
-
- /* Setup Rx descriptor ring and Rx buffers */
-
- rxdr->count = 80;
-
- size = rxdr->count * sizeof(struct e1000_buffer);
- if(!(rxdr->buffer_info = kmalloc(size, GFP_KERNEL)))
- goto err_nomem;
- memset(rxdr->buffer_info, 0, size);
-
- rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc);
- if(!(rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma)))
- goto err_nomem;
- memset(rxdr->desc, 0, rxdr->size);
- rxdr->next_to_use = rxdr->next_to_clean = 0;
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl & ~E1000_RCTL_EN);
- E1000_WRITE_REG(&adapter->hw, RDBAL,
- ((uint64_t) rxdr->dma & 0xFFFFFFFF));
- E1000_WRITE_REG(&adapter->hw, RDBAH, ((uint64_t) rxdr->dma >> 32));
- E1000_WRITE_REG(&adapter->hw, RDLEN, rxdr->size);
- E1000_WRITE_REG(&adapter->hw, RDH, 0);
- E1000_WRITE_REG(&adapter->hw, RDT, 0);
- rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 |
- E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
- (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
-
- for(i = 0; i < rxdr->count; i++) {
- struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i);
- struct sk_buff *skb;
-
- if(!(skb = alloc_skb(E1000_RXBUFFER_2048 + 2, GFP_KERNEL)))
- goto err_nomem;
- skb_reserve(skb, 2);
- rxdr->buffer_info[i].skb = skb;
- rxdr->buffer_info[i].length = E1000_RXBUFFER_2048;
- rxdr->buffer_info[i].dma =
- pci_map_single(pdev, skb->data, E1000_RXBUFFER_2048,
- PCI_DMA_FROMDEVICE);
- rx_desc->buffer_addr = cpu_to_le64(rxdr->buffer_info[i].dma);
- memset(skb->data, 0x00, skb->len);
- }
-
- return 0;
-
- err_nomem:
- e1000_free_desc_rings(adapter);
- return -ENOMEM;
-}
-
-/**
- * e1000_phy_disable_receiver - This routine disables the receiver
- * during loopback testing to insure that if, in the middle of a
- * loopback test, a link partner is connected, it won't change the
- * speed or link status and thus cause a failure.
- *
- * @adapter: board private structure
- **/
-
-static void
-e1000_phy_disable_receiver(struct e1000_adapter *adapter)
-{
- /* Write out to PHY registers 29 and 30 to disable the Receiver. */
- e1000_write_phy_reg(&adapter->hw, 29, 0x001F);
- e1000_write_phy_reg(&adapter->hw, 30, 0x8FFC);
- e1000_write_phy_reg(&adapter->hw, 29, 0x001A);
- e1000_write_phy_reg(&adapter->hw, 30, 0x8FF0);
-
- return;
-}
-
-/**
- * e1000_phy_reset_clk_and_crs - This routine resets the TX_CLK and
- * TX_CRS registers on the non-integrated PHY.
- *
- * @adapter: board private structure
- **/
-
-static void
-e1000_phy_reset_clk_and_crs(struct e1000_adapter *adapter)
-{
- uint16_t phy_reg;
-
- /* Because we reset the PHY above, we need to re-force TX_CLK in the
- * Extended PHY Specific Control Register to 25MHz clock. This
- * value defaults back to a 2.5MHz clock when the PHY is reset.
- */
- e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg);
- phy_reg |= M88E1000_EPSCR_TX_CLK_25;
- e1000_write_phy_reg(&adapter->hw,
- M88E1000_EXT_PHY_SPEC_CTRL, phy_reg);
-
- /* In addition, because of the s/w reset above, we need to enable
- * CRS on TX. This must be set for both full and half duplex
- * operation.
- */
- e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg);
- phy_reg |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
- e1000_write_phy_reg(&adapter->hw,
- M88E1000_PHY_SPEC_CTRL, phy_reg);
-}
-
-/**
- * e1000_nonintegrated_phy_loopback - This routine enables the PHY
- * loopback circuit to work on the non-integrated PHY, under *any* link
- * condition.
- *
- * @adapter: board private structure
- *
- * Returns 0 on success, 1 on failure
- **/
-
-static int
-e1000_nonintegrated_phy_loopback(struct e1000_adapter *adapter)
-{
- uint32_t ctrl_reg;
- uint16_t phy_reg;
- int status = 1;
-
- /* Setup the Device Control Register for PHY loopback test. */
-
- ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl_reg |= (E1000_CTRL_ILOS | /* Invert Loss-Of-Signal */
- E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
- E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
- E1000_CTRL_SPD_1000 | /* Force Speed to 1000 */
- E1000_CTRL_FD); /* Force Duplex to FULL */
-
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg);
-
- /* Read the PHY Specific Control Register (0x10) */
- e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg);
-
- /* Clear Auto-Crossover bits in PHY Specific Control Register
- * (bits 6:5).
- */
- phy_reg &= ~M88E1000_PSCR_AUTO_X_MODE;
- e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, phy_reg);
-
- /* Perform software reset on the PHY */
- e1000_phy_reset(&adapter->hw);
-
- /* Have to setup TX_CLK and TX_CRS after software reset */
- e1000_phy_reset_clk_and_crs(adapter);
-
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8100);
-
- /* Wait for reset to complete. */
- usec_delay(500);
-
- /* Have to setup TX_CLK and TX_CRS after software reset */
- e1000_phy_reset_clk_and_crs(adapter);
-
- /* Write out to PHY registers 29 and 30 to disable the Receiver. */
- e1000_phy_disable_receiver(adapter);
-
- /* Set the loopback bit in the PHY control register. */
- e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
- phy_reg |= MII_CR_LOOPBACK;
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_reg);
-
- /* Setup TX_CLK and TX_CRS one more time. */
- e1000_phy_reset_clk_and_crs(adapter);
-
- status = 0;
-
- /* Check Phy Configuration */
- e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
- if(phy_reg != 0x4100) {
- status = 1;
- }
-
- e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg);
- if(phy_reg != 0x0070) {
- status = 1;
- }
-
- e1000_read_phy_reg(&adapter->hw, 29, &phy_reg);
- if(phy_reg != 0x001A) {
- status = 1;
- }
-
- return status;
-}
-
-/**
- * e1000_integrated_phy_loopback - This routine is used by diagnostic
- * software to put the 82544, 82540, 82545, and 82546 MAC based network
- * cards into loopback mode.
- *
- * @adapter: board private structure
- * @speed: speed
- *
- * Current procedure is to:
- * 1) Disable auto-MDI/MDIX
- * 2) Perform SW phy reset (bit 15 of PHY_CTRL)
- * 3) Disable autoneg and reset
- * 4) For the specified speed, set the loopback
- * mode for that speed. Also force the MAC
- * to the correct speed and duplex for the
- * specified operation.
- * 5) If this is an 82543, setup the TX_CLK and
- * TX_CRS again.
- * 6) Disable the receiver so a cable disconnect
- * and reconnect will not cause autoneg to
- * begin.
- *
- * Returns 0 on success, 1 on failure
- **/
-
-static int
-e1000_integrated_phy_loopback(struct e1000_adapter *adapter,
- uint16_t speed)
-{
- uint32_t ctrl_reg = 0;
- uint32_t stat_reg = 0;
- boolean_t loopback_mode_set = FALSE;
-
- adapter->hw.autoneg = FALSE;
-
- /* Set up desired loopback speed and duplex depending on input
- * into this function.
- */
- switch (speed) {
- case SPEED_1000:
- /* Set up the MII control reg to the desired loopback speed. */
-
- /* Auto-MDI/MDIX Off */
- e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL,
- 0x0808);
- /* reset to update Auto-MDI/MDIX */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
- /* autoneg off */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140);
- /* force 1000, set loopback */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140);
-
- /* Now set up the MAC to the same speed/duplex as the PHY. */
- ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
- ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
- E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
- E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */
- E1000_CTRL_FD); /* Force Duplex to FULL */
-
- if(adapter->hw.media_type == e1000_media_type_copper) {
- ctrl_reg |= E1000_CTRL_ILOS; /* Invert Loss of Signal */
- } else {
- /* Set the ILOS bit on the fiber Nic is half
- * duplex link is detected. */
- stat_reg = E1000_READ_REG(&adapter->hw, STATUS);
- if((stat_reg & E1000_STATUS_FD) == 0)
- ctrl_reg |= (E1000_CTRL_ILOS | E1000_CTRL_SLU);
- }
-
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg);
- loopback_mode_set = TRUE;
- break;
-
- case SPEED_100:
- /* Set up the MII control reg to the desired loopback speed. */
-
- /* Auto-MDI/MDIX Off */
- e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL,
- 0x0808);
- /* reset to update Auto-MDI/MDIX */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
- /* autoneg off */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140);
- /* reset to update autoneg */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8100);
- /* MAC interface speed to 100Mbps */
- e1000_write_phy_reg(&adapter->hw,
- M88E1000_EXT_PHY_SPEC_CTRL, 0x0c14);
- /* reset to update MAC interface speed */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0xe100);
- /* force 100, set loopback */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x6100);
-
- /* Now set up the MAC to the same speed/duplex as the PHY. */
- ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
- ctrl_reg |= (E1000_CTRL_ILOS | /* Invert Loss-Of-Signal */
- E1000_CTRL_SLU | /* Set the Force Link Bit */
- E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
- E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
- E1000_CTRL_SPD_100 |/* Force Speed to 100 */
- E1000_CTRL_FD); /* Force Duplex to FULL */
-
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg);
- loopback_mode_set = TRUE;
- break;
-
- case SPEED_10:
- /* Set up the MII control reg to the desired loopback speed. */
-
- /* Auto-MDI/MDIX Off */
- e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL,
- 0x0808);
- /* reset to update Auto-MDI/MDIX */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
- /* autoneg off */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140);
- /* reset to update autoneg */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8100);
- /* MAC interface speed to 10Mbps */
- e1000_write_phy_reg(&adapter->hw,
- M88E1000_EXT_PHY_SPEC_CTRL, 0x0c04);
- /* reset to update MAC interface speed */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8100);
- /* force 10, set loopback */
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4100);
-
- /* Now set up the MAC to the same speed/duplex as the PHY. */
- ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
- ctrl_reg |= (E1000_CTRL_SLU | /* Set the Force Link Bit */
- E1000_CTRL_FRCSPD |/* Set the Force Speed Bit */
- E1000_CTRL_FRCDPX |/* Set the Force Duplex Bit */
- E1000_CTRL_SPD_10 |/* Force Speed to 10 */
- E1000_CTRL_FD); /* Force Duplex to FULL */
-
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg);
- loopback_mode_set = TRUE;
- break;
-
- default:
- loopback_mode_set = FALSE;
- break;
- }
-
- /* Disable the receiver on the PHY so when a cable is plugged
- * in, the PHY does not begin to autoneg when a cable is
- * reconnected to the NIC.
- */
- e1000_phy_disable_receiver(adapter);
-
- usec_delay(500);
-
- return loopback_mode_set ? 0 : 1;
-}
-
-/**
- * e1000_set_phy_loopback - Set the PHY into loopback mode.
- * @adapter: board private structure
- *
- * Returns 0 on success, 1 on failure
- **/
-
-static int
-e1000_set_phy_loopback(struct e1000_adapter *adapter)
-{
- uint16_t phy_reg = 0;
- uint16_t speed = 0;
- uint16_t duplex = 0;
- int status = 1;
- int count;
-
- switch (adapter->hw.mac_type) {
- case e1000_82543:
- if(adapter->hw.media_type == e1000_media_type_copper) {
- /* Attempt to setup Loopback mode on Non-
- * integrated PHY. Some PHY registers get
- * corrupted at random, so attempt this
- * 10 times.
- */
- for(count = 0; count < 10; count++)
- if(!e1000_nonintegrated_phy_loopback(adapter))
- break;
- status = 0;
- }
- break;
-
- case e1000_82544:
- if(adapter->hw.media_type == e1000_media_type_copper)
- e1000_get_speed_and_duplex(&adapter->hw, &speed,
- &duplex);
- status = e1000_integrated_phy_loopback(adapter, speed);
- break;
-
- case e1000_82540:
- case e1000_82545:
- case e1000_82546:
- e1000_get_speed_and_duplex(&adapter->hw, &speed, &duplex);
- status = e1000_integrated_phy_loopback(adapter, speed);
- break;
-
- default:
- /* Default PHY loopback work is to read the MII
- * control register and assert bit 14 (loopback mode).
- */
- e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
- phy_reg |= MII_CR_LOOPBACK;
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL,
- phy_reg);
- status = 0;
- break;
- }
-
- return status;
-}
-
-static int
-e1000_set_loopback_mode(struct e1000_adapter *adapter,
- enum idiag_e1000_diag_loopback_mode mode)
-{
- uint32_t rctl;
- uint16_t phy_reg;
- int status = 1;
-
- switch (mode) {
-
- case IDIAG_E1000_DIAG_NONE_LB:
- /* Clear bits 7:6 to turn off loopback mode */
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC);
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- /* Only modify the GMII/MII PHY device if the
- * media type is copper.
- */
- if(adapter->hw.media_type == e1000_media_type_copper ||
- (adapter->hw.media_type == e1000_media_type_fiber &&
- (adapter->hw.mac_type == e1000_82545 ||
- adapter->hw.mac_type == e1000_82546))) {
- adapter->hw.autoneg = TRUE;
- /* De-assert bit 14 (loopback mode) in PHY */
- e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
- /* Only turn off PHY loopback if enabled */
- if(phy_reg & MII_CR_LOOPBACK) {
- phy_reg &= ~MII_CR_LOOPBACK;
- e1000_write_phy_reg(&adapter->hw, PHY_CTRL,
- phy_reg);
- /* Reset the PHY to make sure we
- * regain link */
- e1000_phy_reset(&adapter->hw);
- }
- }
- status = 0;
- break;
-
-
- case IDIAG_E1000_DIAG_MAC_LB:
- /* Not supported */
- break;
-
- case IDIAG_E1000_DIAG_PHY_TCVR_LB:
- if(adapter->hw.media_type == e1000_media_type_fiber) {
- if(adapter->hw.mac_type == e1000_82545 ||
- adapter->hw.mac_type == e1000_82546) {
- status = e1000_set_phy_loopback(adapter);
- } else {
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl |= E1000_RCTL_LBM_TCVR;
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- status = 0;
- }
- }
- if(adapter->hw.media_type == e1000_media_type_copper) {
- status = e1000_set_phy_loopback(adapter);
- }
- break;
- }
-
- return status;
-}
-
-static void
-e1000_create_lbtest_frame(struct sk_buff *skb,
- unsigned int frame_size)
-{
- memset(skb->data, 0xFF, frame_size);
- frame_size = (frame_size % 2) ? (frame_size - 1) : frame_size;
- memset(&skb->data[frame_size / 2], 0xAA, frame_size / 2 - 1);
- memset(&skb->data[frame_size / 2 + 10], 0xBE, 1);
- memset(&skb->data[frame_size / 2 + 12], 0xAF, 1);
-}
-
-static int
-e1000_check_lbtest_frame(struct sk_buff *skb,
- unsigned int frame_size)
-{
- frame_size = (frame_size % 2) ? (frame_size - 1) : frame_size;
- if(*(skb->data + 3) == 0xFF) {
- if((*(skb->data + frame_size / 2 + 10) == 0xBE) &&
- (*(skb->data + frame_size / 2 + 12) == 0xAF)) {
- return 1;
- }
- }
- return 0;
-}
-
-static enum idiag_e1000_diag_loopback_result
-e1000_loopback_test(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *txdr = &adapter->diag_tx_ring;
- struct e1000_desc_ring *rxdr = &adapter->diag_rx_ring;
- struct pci_dev *pdev = adapter->pdev;
- int i;
-
- E1000_WRITE_REG(&adapter->hw, RDT, rxdr->count - 1);
-
- for(i = 0; i < 64; i++) {
- e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 1024);
- pci_dma_sync_single(pdev, txdr->buffer_info[i].dma,
- txdr->buffer_info[i].length,
- PCI_DMA_TODEVICE);
- }
- E1000_WRITE_REG(&adapter->hw, TDT, i);
-
- msec_delay(200);
-
- pci_dma_sync_single(pdev, rxdr->buffer_info[0].dma,
- rxdr->buffer_info[0].length, PCI_DMA_FROMDEVICE);
- if(e1000_check_lbtest_frame(rxdr->buffer_info[0].skb, 1024))
- return IDIAG_E1000_LOOPBACK_TEST_OK;
- else
- return IDIAG_E1000_LOOPBACK_TEST_FAILED;
-}
-
-static enum idiag_pro_stat
-e1000_diag_loopback_test(struct e1000_adapter *adapter,
- uint8_t *diag_param)
-{
- struct idiag_e1000_diag_loopback_test_param *param =
- (struct idiag_e1000_diag_loopback_test_param *) diag_param;
-
- if(param->mode == IDIAG_E1000_DIAG_MAC_LB) {
- /* Loopback test not support */
- param->result = IDIAG_E1000_LOOPBACK_TEST_NOT_EXEC;
- return IDIAG_PRO_STAT_NOT_SUPPORTED;
- }
-
- if(e1000_setup_desc_rings(adapter)) {
- param->result = IDIAG_E1000_LOOPBACK_TEST_NOT_EXEC;
- return IDIAG_PRO_STAT_TEST_FAILED;
- }
-
- if(e1000_set_loopback_mode(adapter, param->mode)) {
- param->result = IDIAG_E1000_LOOPBACK_TEST_NOT_EXEC;
- e1000_free_desc_rings(adapter);
- return IDIAG_PRO_STAT_TEST_FAILED;
- }
- param->result = e1000_loopback_test(adapter);
- e1000_set_loopback_mode(adapter, IDIAG_E1000_DIAG_NONE_LB);
-
- e1000_free_desc_rings(adapter);
-
- return (param->result ==
- IDIAG_E1000_LOOPBACK_TEST_OK) ? IDIAG_PRO_STAT_OK :
- IDIAG_PRO_STAT_TEST_FAILED;
-}
-
-static enum idiag_pro_stat
-e1000_diag_link_test(struct e1000_adapter *adapter,
- uint8_t *diag_param)
-{
- e1000_check_for_link(&adapter->hw);
-
- if(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)
- return IDIAG_PRO_STAT_OK;
- else
- return IDIAG_PRO_STAT_TEST_FAILED;
-}
-
-int
-e1000_diag_ioctl(struct net_device *netdev,
- struct ifreq *ifr)
-{
- struct e1000_adapter *adapter = netdev->priv;
- struct idiag_pro_data *diag_data =
- (struct idiag_pro_data *) ifr->ifr_data;
- boolean_t run_offline;
- boolean_t interface_up = netif_running(netdev);
-
- diag_data->status = IDIAG_PRO_STAT_NOT_SUPPORTED;
-
- if(!capable(CAP_NET_ADMIN))
- /* must have admin capabilities */
- return -EPERM;
-
- if(diag_data->interface_ver != IDIAG_PRO_VERSION)
- /* incorrect diagnostics interface version */
- return -EFAULT;
-
- if(diag_data->cmd != IDIAG_PRO_IDENTIFY_DRIVER &&
- diag_data->driver_id != IDIAG_E1000_DRIVER)
- /* incorrect driver identifier */
- return -EFAULT;
-
- /* Some test requring exclusive access to hardware, so
- * we need to teardown the hardware setup, run the test,
- * and restore the hardware to resume the network
- * connection.
- */
- run_offline = (diag_data->cmd == IDIAG_E1000_DIAG_REG_TEST ||
- diag_data->cmd == IDIAG_E1000_DIAG_INTR_TEST ||
- diag_data->cmd == IDIAG_E1000_DIAG_LOOPBACK_TEST);
-
- if(run_offline) {
- if(interface_up)
- e1000_down(adapter);
- else
- e1000_reset(adapter);
- }
-
- /* Run the diagnotic test */
- switch (diag_data->cmd) {
-
- case IDIAG_PRO_IDENTIFY_DRIVER:
- diag_data->driver_id = IDIAG_E1000_DRIVER;
- diag_data->status = IDIAG_PRO_STAT_OK;
- break;
-
- case IDIAG_E1000_DIAG_REG_TEST:
- diag_data->status =
- e1000_diag_reg_test(adapter, diag_data->diag_param);
- break;
-
- case IDIAG_E1000_DIAG_XSUM_TEST:
- diag_data->status =
- e1000_diag_eeprom_test(adapter, diag_data->diag_param);
- break;
-
- case IDIAG_E1000_DIAG_INTR_TEST:
- diag_data->status =
- e1000_diag_intr_test(adapter, diag_data->diag_param);
- break;
-
- case IDIAG_E1000_DIAG_LOOPBACK_TEST:
- diag_data->status =
- e1000_diag_loopback_test(adapter,
- diag_data->diag_param);
- break;
-
- case IDIAG_E1000_DIAG_LINK_TEST:
- diag_data->status =
- e1000_diag_link_test(adapter, diag_data->diag_param);
- break;
-
- default:
- diag_data->status = IDIAG_PRO_STAT_NOT_SUPPORTED;
- break;
- }
-
- if(run_offline) {
- e1000_reset(adapter);
- if(interface_up) {
- if(e1000_up(adapter)) {
- diag_data->status = IDIAG_PRO_STAT_TEST_FATAL;
- return -EFAULT;
- }
- }
- }
-
- return 0;
-}
-
diff --git a/drivers/e1000-4.x/src/e1000_main.c.orig b/drivers/e1000-4.x/src/e1000_main.c.orig
deleted file mode 100644
index 98d01a959..000000000
--- a/drivers/e1000-4.x/src/e1000_main.c.orig
+++ /dev/null
@@ -1,2536 +0,0 @@
-/*******************************************************************************
-
-
- Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- The full GNU General Public License is included in this distribution in the
- file called LICENSE.
-
- Contact Information:
- Linux NICS <linux.nics@intel.com>
- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-*******************************************************************************/
-
-#define __E1000_MAIN__
-#ifdef IANS
-#define _IANS_MAIN_MODULE_C_
-#endif
-#include "e1000.h"
-
-/* Change Log
- *
- * 4.3.15 8/9/02
- * o Clean up: prepended a shortened version of the license that references
- * the full license in LICENSE.
- * o Clean up: copied small packets to small socket buffers for truesize
- * bug that is exposed with the NFS mount daemon.
- * o Clean up: added pci reads for pci posting issues.
- * o Bug fix: added memory barriers for IA64.
- * o Feature: added locking mechanism for asf functionality.
- *
- * 4.3.2 7/5/02
- * o Bug fix: perform controller reset using I/O rather than mmio because
- * some chipsets try to perform a 64-bit write, but the controller ignores
- * the upper 32-bit write once the reset is intiated by the lower 32-bit
- * write, causing a master abort.
- * o Bug fix: fixed jumbo frames sized from 1514 to 2048.
- * o ASF support: disable ARP when driver is loaded or resumed; enable when
- * driver is removed or suspended.
- * o Bug fix: changed default setting for RxIntDelay to 0 for 82542/3/4
- * controllers to workaround h/w errata where controller will hang when
- * RxIntDelay <> 0 under certian network conditions.
- * o Clean up: removed unused and undocumented user-settable settings for
- * PHY.
- * o Bug fix: ethtool GEEPROM was using byte address rather than word
- * addressing.
- * o Feature: added support for ethtool SEEPROM.
- * o Feature: added support for entropy pool.
- *
- * 4.2.17 5/30/02
- */
-
-char e1000_driver_name[] = "e1000";
-char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
-char e1000_driver_version[] = "4.3.15";
-char e1000_copyright[] = "Copyright (c) 1999-2002 Intel Corporation.";
-
-/* e1000_pci_tbl - PCI Device ID Table
- *
- * Private driver_data field (last one) stores an index into e1000_strings
- * Wildcard entries (PCI_ANY_ID) should come last
- * Last entry must be all 0s
- *
- * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
- * Class, Class Mask, String Index }
- */
-static struct pci_device_id e1000_pci_tbl[] __devinitdata = {
- /* Intel(R) PRO/1000 Network Connection */
- {0x8086, 0x1000, 0x8086, 0x1000, 0, 0, 0},
- {0x8086, 0x1001, 0x8086, 0x1003, 0, 0, 0},
- {0x8086, 0x1004, 0x8086, 0x1004, 0, 0, 0},
- {0x8086, 0x1008, 0x8086, 0x1107, 0, 0, 0},
- {0x8086, 0x1009, 0x8086, 0x1109, 0, 0, 0},
- {0x8086, 0x100C, 0x8086, 0x1112, 0, 0, 0},
- {0x8086, 0x100E, 0x8086, 0x001E, 0, 0, 0},
- /* Compaq Gigabit Ethernet Server Adapter */
- {0x8086, 0x1000, 0x0E11, PCI_ANY_ID, 0, 0, 1},
- {0x8086, 0x1001, 0x0E11, PCI_ANY_ID, 0, 0, 1},
- {0x8086, 0x1004, 0x0E11, PCI_ANY_ID, 0, 0, 1},
- /* IBM Mobile, Desktop & Server Adapters */
- {0x8086, 0x1000, 0x1014, PCI_ANY_ID, 0, 0, 2},
- {0x8086, 0x1001, 0x1014, PCI_ANY_ID, 0, 0, 2},
- {0x8086, 0x1004, 0x1014, PCI_ANY_ID, 0, 0, 2},
- /* Generic */
- {0x8086, 0x1000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x100C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x100D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x100E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x100F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0x8086, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- /* required last entry */
- {0,}
-};
-
-MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
-
-static char *e1000_strings[] = {
- "Intel(R) PRO/1000 Network Connection",
- "Compaq Gigabit Ethernet Server Adapter",
- "IBM Mobile, Desktop & Server Adapters"
-};
-
-/* Local Function Prototypes */
-
-int e1000_up(struct e1000_adapter *adapter);
-void e1000_down(struct e1000_adapter *adapter);
-void e1000_reset(struct e1000_adapter *adapter);
-void e1000_smbus_lock(struct pci_dev *pdev, boolean_t lock);
-
-static int e1000_init_module(void);
-static void e1000_exit_module(void);
-static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
-static void e1000_remove(struct pci_dev *pdev);
-static void e1000_sw_init(struct e1000_adapter *adapter);
-static int e1000_open(struct net_device *netdev);
-static int e1000_close(struct net_device *netdev);
-static int e1000_setup_tx_resources(struct e1000_adapter *adapter);
-static int e1000_setup_rx_resources(struct e1000_adapter *adapter);
-static void e1000_configure_tx(struct e1000_adapter *adapter);
-static void e1000_configure_rx(struct e1000_adapter *adapter);
-static void e1000_setup_rctl(struct e1000_adapter *adapter);
-static void e1000_clean_tx_ring(struct e1000_adapter *adapter);
-static void e1000_clean_rx_ring(struct e1000_adapter *adapter);
-static void e1000_free_tx_resources(struct e1000_adapter *adapter);
-static void e1000_free_rx_resources(struct e1000_adapter *adapter);
-static void e1000_set_multi(struct net_device *netdev);
-static void e1000_update_phy_info(unsigned long data);
-static void e1000_watchdog(unsigned long data);
-static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
-static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
-static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
-static int e1000_set_mac(struct net_device *netdev, void *p);
-static void e1000_update_stats(struct e1000_adapter *adapter);
-static inline void e1000_irq_disable(struct e1000_adapter *adapter);
-static inline void e1000_irq_enable(struct e1000_adapter *adapter);
-static void e1000_intr(int irq, void *data, struct pt_regs *regs);
-static void e1000_clean_tx_irq(struct e1000_adapter *adapter);
-static void e1000_clean_rx_irq(struct e1000_adapter *adapter);
-static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter);
-static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
-static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
-static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
-static inline void e1000_rx_checksum(struct e1000_adapter *adapter,
- struct e1000_rx_desc *rx_desc,
- struct sk_buff *skb);
-static boolean_t e1000_smbus_arp_enable(struct e1000_adapter *adapter,
- boolean_t arp_enable);
-#ifdef HAVE_TX_TIMEOUT
-static void e1000_tx_timeout(struct net_device *dev);
-#endif
-
-#ifdef NETIF_F_HW_VLAN_TX
-static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
-static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
-static void e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
-#endif
-
-static int e1000_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
-static int e1000_suspend(struct pci_dev *pdev, uint32_t state);
-#ifdef CONFIG_PM
-static int e1000_resume(struct pci_dev *pdev);
-#endif
-
-struct notifier_block e1000_notifier = {
- notifier_call: e1000_notify_reboot,
- next: NULL,
- priority: 0
-};
-
-/* Exported from other modules */
-
-extern void e1000_check_options(struct e1000_adapter *adapter);
-extern void e1000_proc_dev_setup(struct e1000_adapter *adapter);
-extern void e1000_proc_dev_free(struct e1000_adapter *adapter);
-extern int e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr);
-#ifdef IDIAG
-extern int e1000_diag_ioctl(struct net_device *netdev, struct ifreq *ifr);
-#endif
-
-static struct pci_driver e1000_driver = {
- name: e1000_driver_name,
- id_table: e1000_pci_tbl,
- probe: e1000_probe,
- remove: __devexit_p(e1000_remove),
- /* Power Managment Hooks */
-#ifdef CONFIG_PM
- suspend: e1000_suspend,
- resume: e1000_resume
-#endif
-};
-
-MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
-MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
-MODULE_LICENSE("GPL");
-
-#ifdef EXPORT_SYMTAB
-EXPORT_SYMBOL(e1000_smbus_lock);
-#endif
-
-/**
- * e1000_init_module - Driver Registration Routine
- *
- * e1000_init_module is the first routine called when the driver is
- * loaded. All it does is register with the PCI subsystem.
- **/
-
-static int __init
-e1000_init_module(void)
-{
- int ret;
- printk(KERN_INFO "%s - version %s\n",
- e1000_driver_string, e1000_driver_version);
-
- printk(KERN_INFO "%s\n", e1000_copyright);
-
- ret = pci_module_init(&e1000_driver);
- if(ret >= 0)
- register_reboot_notifier(&e1000_notifier);
- return ret;
-}
-
-module_init(e1000_init_module);
-
-/**
- * e1000_exit_module - Driver Exit Cleanup Routine
- *
- * e1000_exit_module is called just before the driver is removed
- * from memory.
- **/
-
-static void __exit
-e1000_exit_module(void)
-{
- unregister_reboot_notifier(&e1000_notifier);
- pci_unregister_driver(&e1000_driver);
-}
-
-module_exit(e1000_exit_module);
-
-
-int
-e1000_up(struct e1000_adapter *adapter)
-{
- struct net_device *netdev = adapter->netdev;
-
- if(request_irq(netdev->irq, &e1000_intr, SA_SHIRQ | SA_SAMPLE_RANDOM,
- netdev->name, netdev))
- return -1;
-
- /* hardware has been reset, we need to reload some things */
-
- e1000_set_multi(netdev);
-#ifdef IANS
- if((ANS_PRIVATE_DATA_FIELD(adapter)->tag_mode) != IANS_BD_TAGGING_NONE)
- bd_ans_hw_EnableVLAN(adapter);
-#endif
-
- e1000_configure_tx(adapter);
- e1000_setup_rctl(adapter);
- e1000_configure_rx(adapter);
- e1000_alloc_rx_buffers(adapter);
-
- mod_timer(&adapter->watchdog_timer, jiffies);
- e1000_irq_enable(adapter);
-
- return 0;
-}
-
-void
-e1000_down(struct e1000_adapter *adapter)
-{
- struct net_device *netdev = adapter->netdev;
-
- e1000_irq_disable(adapter);
- free_irq(netdev->irq, netdev);
- del_timer_sync(&adapter->watchdog_timer);
- del_timer_sync(&adapter->phy_info_timer);
- adapter->link_speed = 0;
- adapter->link_duplex = 0;
- netif_carrier_off(netdev);
- netif_stop_queue(netdev);
-
- e1000_reset(adapter);
- e1000_clean_tx_ring(adapter);
- e1000_clean_rx_ring(adapter);
-}
-
-void
-e1000_reset(struct e1000_adapter *adapter)
-{
- /* Repartition Pba for greater than 9k mtu
- * To take effect CTRL.RST is required.
- */
-
- if(adapter->rx_buffer_len > E1000_RXBUFFER_8192)
- E1000_WRITE_REG(&adapter->hw, PBA, E1000_JUMBO_PBA);
- else
- E1000_WRITE_REG(&adapter->hw, PBA, E1000_DEFAULT_PBA);
-
- adapter->hw.fc = adapter->hw.original_fc;
- down(&adapter->smbus_lock);
- e1000_reset_hw(&adapter->hw);
- up(&adapter->smbus_lock);
- if(adapter->hw.mac_type >= e1000_82544)
- E1000_WRITE_REG(&adapter->hw, WUC, 0);
- e1000_init_hw(&adapter->hw);
- e1000_reset_adaptive(&adapter->hw);
- e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
-}
-
-/**
- * e1000_probe - Device Initialization Routine
- * @pdev: PCI device information struct
- * @ent: entry in e1000_pci_tbl
- *
- * Returns 0 on success, negative on failure
- *
- * e1000_probe initializes an adapter identified by a pci_dev structure.
- * The OS initialization, configuring of the adapter private structure,
- * and a hardware reset occur.
- **/
-
-static int __devinit
-e1000_probe(struct pci_dev *pdev,
- const struct pci_device_id *ent)
-{
- struct net_device *netdev;
- struct e1000_adapter *adapter;
- static int cards_found = 0;
- unsigned long mmio_start;
- int mmio_len;
- int pci_using_dac;
- int i;
-
- if((i = pci_enable_device(pdev)))
- return i;
-
- if(!(i = pci_set_dma_mask(pdev, PCI_DMA_64BIT))) {
- pci_using_dac = 1;
- } else {
- if((i = pci_set_dma_mask(pdev, PCI_DMA_32BIT))) {
- E1000_ERR("No usable DMA configuration, aborting\n");
- return i;
- }
- pci_using_dac = 0;
- }
-
- if((i = pci_request_regions(pdev, e1000_driver_name)))
- return i;
-
- pci_set_master(pdev);
-
- netdev = alloc_etherdev(sizeof(struct e1000_adapter));
- if(!netdev)
- goto err_alloc_etherdev;
-
- SET_MODULE_OWNER(netdev);
-
- pci_set_drvdata(pdev, netdev);
- adapter = netdev->priv;
- adapter->netdev = netdev;
- adapter->pdev = pdev;
- adapter->hw.back = adapter;
-
- mmio_start = pci_resource_start(pdev, BAR_0);
- mmio_len = pci_resource_len(pdev, BAR_0);
-
- adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
- if(!adapter->hw.hw_addr)
- goto err_ioremap;
-
- for(i = BAR_1; i <= BAR_5; i++) {
- if(pci_resource_len(pdev, i) == 0)
- continue;
- if(pci_resource_flags(pdev, i) & IORESOURCE_IO) {
- adapter->hw.io_base = pci_resource_start(pdev, i);
- break;
- }
- }
-
- netdev->open = &e1000_open;
- netdev->stop = &e1000_close;
- netdev->hard_start_xmit = &e1000_xmit_frame;
- netdev->get_stats = &e1000_get_stats;
- netdev->set_multicast_list = &e1000_set_multi;
- netdev->set_mac_address = &e1000_set_mac;
- netdev->change_mtu = &e1000_change_mtu;
- netdev->do_ioctl = &e1000_ioctl;
-#ifdef HAVE_TX_TIMEOUT
- netdev->tx_timeout = &e1000_tx_timeout;
- netdev->watchdog_timeo = HZ;
-#endif
-#ifdef NETIF_F_HW_VLAN_TX
- netdev->vlan_rx_register = e1000_vlan_rx_register;
- netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;
- netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;
-#endif
-
- netdev->irq = pdev->irq;
- netdev->mem_start = mmio_start;
- netdev->base_addr = adapter->hw.io_base;
-
- adapter->bd_number = cards_found;
- adapter->id_string = e1000_strings[ent->driver_data];
-
- /* setup the private structure */
-
- e1000_sw_init(adapter);
-
-#ifdef MAX_SKB_FRAGS
- if(adapter->hw.mac_type >= e1000_82543) {
-#ifdef NETIF_F_HW_VLAN_TX
- netdev->features = NETIF_F_SG |
- NETIF_F_HW_CSUM |
- NETIF_F_HW_VLAN_TX |
- NETIF_F_HW_VLAN_RX |
- NETIF_F_HW_VLAN_FILTER;
-#else
- netdev->features = NETIF_F_SG | NETIF_F_HW_CSUM;
-#endif
- } else {
- netdev->features = NETIF_F_SG;
- }
-
- if(pci_using_dac)
- netdev->features |= NETIF_F_HIGHDMA;
-#endif
-
- /* make sure the EEPROM is good */
-
- if(e1000_validate_eeprom_checksum(&adapter->hw) < 0) {
- printk(KERN_ERR "The EEPROM Checksum Is Not Valid\n");
- goto err_eeprom;
- }
-
- /* copy the MAC address out of the EEPROM */
-
- e1000_read_mac_addr(&adapter->hw);
- memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
-
- if(!is_valid_ether_addr(netdev->dev_addr))
- goto err_eeprom;
-
- e1000_read_part_num(&adapter->hw, &(adapter->part_num));
-
- e1000_get_bus_info(&adapter->hw);
-
- if((adapter->hw.mac_type == e1000_82544) &&
- (adapter->hw.bus_type == e1000_bus_type_pcix))
-
- adapter->max_data_per_txd = 4096;
- else
- adapter->max_data_per_txd = MAX_JUMBO_FRAME_SIZE;
-
-#ifdef IANS
- adapter->iANSdata = kmalloc(sizeof(iANSsupport_t), GFP_KERNEL);
-
- if(!adapter->iANSdata)
- goto err_eeprom;
-
- memset(adapter->iANSdata, 0, sizeof(iANSsupport_t));
- bd_ans_drv_InitANS(adapter, adapter->iANSdata);
-#endif
-
- init_timer(&adapter->watchdog_timer);
- adapter->watchdog_timer.function = &e1000_watchdog;
- adapter->watchdog_timer.data = (unsigned long) adapter;
-
- init_timer(&adapter->phy_info_timer);
- adapter->phy_info_timer.function = &e1000_update_phy_info;
- adapter->phy_info_timer.data = (unsigned long) adapter;
-
- register_netdev(netdev);
-
- /* we're going to reset, so assume we have no link for now */
-
- netif_carrier_off(netdev);
- netif_stop_queue(netdev);
-
- printk(KERN_INFO "%s: %s\n", netdev->name, adapter->id_string);
- e1000_check_options(adapter);
- e1000_proc_dev_setup(adapter);
-
- /* Initial Wake on LAN setting
- * If APM wake is enabled in the EEPROM,
- * enable the ACPI Magic Packet filter
- */
-
- if((adapter->hw.mac_type >= e1000_82544) &&
- (E1000_READ_REG(&adapter->hw, WUC) & E1000_WUC_APME))
- adapter->wol |= E1000_WUFC_MAG;
-
- /* reset the hardware with the new settings */
-
- e1000_reset(adapter);
-
- cards_found++;
- return 0;
-
-err_eeprom:
- iounmap(adapter->hw.hw_addr);
-err_ioremap:
- pci_release_regions(pdev);
- kfree(netdev);
-err_alloc_etherdev:
- return -ENOMEM;
-}
-
-/**
- * e1000_remove - Device Removal Routine
- * @pdev: PCI device information struct
- *
- * e1000_remove is called by the PCI subsystem to alert the driver
- * that it should release a PCI device. The could be caused by a
- * Hot-Plug event, or because the driver is going to be removed from
- * memory.
- **/
-
-static void __devexit
-e1000_remove(struct pci_dev *pdev)
-{
- struct net_device *netdev = pci_get_drvdata(pdev);
- struct e1000_adapter *adapter = netdev->priv;
-
- e1000_smbus_arp_enable(adapter, TRUE);
-
- unregister_netdev(netdev);
-
- e1000_phy_hw_reset(&adapter->hw);
-
- e1000_proc_dev_free(adapter);
-
-#ifdef IANS
- if(adapter->iANSdata)
- kfree(adapter->iANSdata);
-#endif
- iounmap(adapter->hw.hw_addr);
- pci_release_regions(pdev);
-
- kfree(netdev);
-}
-
-/**
- * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
- * @adapter: board private structure to initialize
- *
- * e1000_sw_init initializes the Adapter private data structure.
- * Fields are initialized based on PCI device information and
- * OS network device settings (MTU size).
- **/
-
-static void __devinit
-e1000_sw_init(struct e1000_adapter *adapter)
-{
- struct e1000_hw *hw = &adapter->hw;
- struct net_device *netdev = adapter->netdev;
- struct pci_dev *pdev = adapter->pdev;
-
- /* PCI config space info */
-
- pci_read_config_word(pdev, PCI_VENDOR_ID, &hw->vendor_id);
- pci_read_config_word(pdev, PCI_DEVICE_ID, &hw->device_id);
- pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id);
- pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID,
- &hw->subsystem_vendor_id);
- pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &hw->subsystem_id);
-
- pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
-
- adapter->rx_buffer_len = E1000_RXBUFFER_2048;
- hw->max_frame_size = netdev->mtu +
- ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
- hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
-
- /* identify the MAC */
-
- if (e1000_set_mac_type(hw)) {
- E1000_ERR("Unknown MAC Type\n");
- BUG();
- }
-
- /* flow control settings */
-
- hw->fc_high_water = FC_DEFAULT_HI_THRESH;
- hw->fc_low_water = FC_DEFAULT_LO_THRESH;
- hw->fc_pause_time = FC_DEFAULT_TX_TIMER;
- hw->fc_send_xon = 1;
-
- /* Media type - copper or fiber */
-
- if(hw->mac_type >= e1000_82543) {
- uint32_t status = E1000_READ_REG(hw, STATUS);
-
- if(status & E1000_STATUS_TBIMODE)
- hw->media_type = e1000_media_type_fiber;
- else
- hw->media_type = e1000_media_type_copper;
- } else {
- hw->media_type = e1000_media_type_fiber;
- }
-
- if(hw->mac_type < e1000_82543)
- hw->report_tx_early = 0;
- else
- hw->report_tx_early = 1;
-
- hw->wait_autoneg_complete = FALSE;
- hw->tbi_compatibility_en = TRUE;
- hw->adaptive_ifs = TRUE;
-
- /* Copper options */
-
- if(hw->media_type == e1000_media_type_copper) {
- hw->mdix = AUTO_ALL_MODES;
- hw->disable_polarity_correction = FALSE;
- }
-
- atomic_set(&adapter->irq_sem, 1);
- spin_lock_init(&adapter->stats_lock);
- init_MUTEX(&adapter->smbus_lock);
-}
-
-/**
- * e1000_open - Called when a network interface is made active
- * @netdev: network interface device structure
- *
- * Returns 0 on success, negative value on failure
- *
- * The open entry point is called when a network interface is made
- * active by the system (IFF_UP). At this point all resources needed
- * for transmit and receive operations are allocated, the interrupt
- * handler is registered with the OS, the watchdog timer is started,
- * and the stack is notified that the interface is ready.
- **/
-
-static int
-e1000_open(struct net_device *netdev)
-{
- struct e1000_adapter *adapter = netdev->priv;
-
- /* allocate transmit descriptors */
-
- if(e1000_setup_tx_resources(adapter))
- goto err_setup_tx;
-
- /* allocate receive descriptors */
-
- if(e1000_setup_rx_resources(adapter))
- goto err_setup_rx;
-
- if(e1000_up(adapter))
- goto err_up;
-
- MOD_INC_USE_COUNT;
- return 0;
-
-err_up:
- e1000_free_rx_resources(adapter);
-err_setup_rx:
- e1000_free_tx_resources(adapter);
-err_setup_tx:
- e1000_reset(adapter);
-
- return -EBUSY;
-}
-
-/**
- * e1000_close - Disables a network interface
- * @netdev: network interface device structure
- *
- * Returns 0, this is not allowed to fail
- *
- * The close entry point is called when an interface is de-activated
- * by the OS. The hardware is still under the drivers control, but
- * needs to be disabled. A global MAC reset is issued to stop the
- * hardware, and all transmit and receive resources are freed.
- **/
-
-static int
-e1000_close(struct net_device *netdev)
-{
- struct e1000_adapter *adapter = netdev->priv;
-
- e1000_down(adapter);
-
- e1000_free_tx_resources(adapter);
- e1000_free_rx_resources(adapter);
-
- MOD_DEC_USE_COUNT;
- return 0;
-}
-
-/**
- * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
- * @adapter: board private structure
- *
- * Return 0 on success, negative on failure
- **/
-
-static int
-e1000_setup_tx_resources(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *txdr = &adapter->tx_ring;
- struct pci_dev *pdev = adapter->pdev;
- int size;
-
- size = sizeof(struct e1000_buffer) * txdr->count;
- txdr->buffer_info = kmalloc(size, GFP_KERNEL);
- if(!txdr->buffer_info) {
- return -ENOMEM;
- }
- memset(txdr->buffer_info, 0, size);
-
- /* round up to nearest 4K */
-
- txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
- E1000_ROUNDUP(txdr->size, 4096);
-
- txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
- if(!txdr->desc) {
- kfree(txdr->buffer_info);
- return -ENOMEM;
- }
- memset(txdr->desc, 0, txdr->size);
-
- txdr->next_to_use = 0;
- txdr->next_to_clean = 0;
-
- return 0;
-}
-
-/**
- * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
- * @adapter: board private structure
- *
- * Configure the Tx unit of the MAC after a reset.
- **/
-
-static void
-e1000_configure_tx(struct e1000_adapter *adapter)
-{
- uint64_t tdba = adapter->tx_ring.dma;
- uint32_t tdlen = adapter->tx_ring.count * sizeof(struct e1000_tx_desc);
- uint32_t tctl, tipg;
-
- E1000_WRITE_REG(&adapter->hw, TDBAL, (tdba & 0x00000000ffffffffULL));
- E1000_WRITE_REG(&adapter->hw, TDBAH, (tdba >> 32));
-
- E1000_WRITE_REG(&adapter->hw, TDLEN, tdlen);
-
- /* Setup the HW Tx Head and Tail descriptor pointers */
-
- E1000_WRITE_REG(&adapter->hw, TDH, 0);
- E1000_WRITE_REG(&adapter->hw, TDT, 0);
-
- /* Set the default values for the Tx Inter Packet Gap timer */
-
- switch (adapter->hw.mac_type) {
- case e1000_82542_rev2_0:
- case e1000_82542_rev2_1:
- tipg = DEFAULT_82542_TIPG_IPGT;
- tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
- tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
- break;
- default:
- if(adapter->hw.media_type == e1000_media_type_fiber)
- tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
- else
- tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
- tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
- tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
- }
- E1000_WRITE_REG(&adapter->hw, TIPG, tipg);
-
- /* Set the Tx Interrupt Delay register */
-
- E1000_WRITE_REG(&adapter->hw, TIDV, adapter->tx_int_delay);
- if(adapter->hw.mac_type >= e1000_82540)
- E1000_WRITE_REG(&adapter->hw, TADV, adapter->tx_abs_int_delay);
-
- /* Program the Transmit Control Register */
-
- tctl = E1000_READ_REG(&adapter->hw, TCTL);
-
- tctl &= ~E1000_TCTL_CT;
- tctl |= E1000_TCTL_EN | E1000_TCTL_PSP |
- (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
-
- E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
-
- e1000_config_collision_dist(&adapter->hw);
-
- /* Setup Transmit Descriptor Settings for this adapter */
- adapter->txd_cmd = E1000_TXD_CMD_IFCS | E1000_TXD_CMD_IDE;
-
- if(adapter->hw.report_tx_early == 1)
- adapter->txd_cmd |= E1000_TXD_CMD_RS;
- else
- adapter->txd_cmd |= E1000_TXD_CMD_RPS;
-}
-
-/**
- * e1000_setup_rx_resources - allocate Rx resources (Descriptors)
- * @adapter: board private structure
- *
- * Returns 0 on success, negative on failure
- **/
-
-static int
-e1000_setup_rx_resources(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *rxdr = &adapter->rx_ring;
- struct pci_dev *pdev = adapter->pdev;
- int size;
-
- size = sizeof(struct e1000_buffer) * rxdr->count;
- rxdr->buffer_info = kmalloc(size, GFP_KERNEL);
- if(!rxdr->buffer_info) {
- return -ENOMEM;
- }
- memset(rxdr->buffer_info, 0, size);
-
- /* Round up to nearest 4K */
-
- rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc);
- E1000_ROUNDUP(rxdr->size, 4096);
-
- rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
-
- if(!rxdr->desc) {
- kfree(rxdr->buffer_info);
- return -ENOMEM;
- }
- memset(rxdr->desc, 0, rxdr->size);
-
- rxdr->next_to_clean = 0;
- rxdr->next_to_use = 0;
-
- return 0;
-}
-
-/**
- * e1000_setup_rctl - configure the receive control register
- * @adapter: Board private structure
- **/
-
-static void
-e1000_setup_rctl(struct e1000_adapter *adapter)
-{
- uint32_t rctl;
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
-
- rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
-
- rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
- E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
- (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
-
- if(adapter->hw.tbi_compatibility_on == 1)
- rctl |= E1000_RCTL_SBP;
- else
- rctl &= ~E1000_RCTL_SBP;
-
- rctl &= ~(E1000_RCTL_SZ_4096);
- switch (adapter->rx_buffer_len) {
- case E1000_RXBUFFER_2048:
- default:
- rctl |= E1000_RCTL_SZ_2048;
- rctl &= ~(E1000_RCTL_BSEX | E1000_RCTL_LPE);
- break;
- case E1000_RXBUFFER_4096:
- rctl |= E1000_RCTL_SZ_4096 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
- break;
- case E1000_RXBUFFER_8192:
- rctl |= E1000_RCTL_SZ_8192 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
- break;
- case E1000_RXBUFFER_16384:
- rctl |= E1000_RCTL_SZ_16384 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
- break;
- }
-
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
-}
-
-/**
- * e1000_configure_rx - Configure 8254x Receive Unit after Reset
- * @adapter: board private structure
- *
- * Configure the Rx unit of the MAC after a reset.
- **/
-
-static void
-e1000_configure_rx(struct e1000_adapter *adapter)
-{
- uint64_t rdba = adapter->rx_ring.dma;
- uint32_t rdlen = adapter->rx_ring.count * sizeof(struct e1000_rx_desc);
- uint32_t rctl;
- uint32_t rxcsum;
-
- /* make sure receives are disabled while setting up the descriptors */
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl & ~E1000_RCTL_EN);
-
- /* set the Receive Delay Timer Register */
-
- if(adapter->hw.mac_type >= e1000_82540) {
- E1000_WRITE_REG(&adapter->hw, RDTR, adapter->rx_int_delay);
- E1000_WRITE_REG(&adapter->hw, RADV, adapter->rx_abs_int_delay);
-
- /* Set the interrupt throttling rate. Value is calculated
- * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
-#define MAX_INTS_PER_SEC 8000
-#define DEFAULT_ITR 1000000000/(MAX_INTS_PER_SEC * 256)
- E1000_WRITE_REG(&adapter->hw, ITR, DEFAULT_ITR);
-
-#ifdef HAVE_TX_TIMEOUT
- } else {
- E1000_WRITE_REG(&adapter->hw, RDTR, adapter->rx_int_delay);
-#endif
- }
-
- /* Setup the Base and Length of the Rx Descriptor Ring */
-
- E1000_WRITE_REG(&adapter->hw, RDBAL, (rdba & 0x00000000ffffffffULL));
- E1000_WRITE_REG(&adapter->hw, RDBAH, (rdba >> 32));
-
- E1000_WRITE_REG(&adapter->hw, RDLEN, rdlen);
-
- /* Setup the HW Rx Head and Tail Descriptor Pointers */
- E1000_WRITE_REG(&adapter->hw, RDH, 0);
- E1000_WRITE_REG(&adapter->hw, RDT, 0);
-
- /* Enable 82543 Receive Checksum Offload for TCP and UDP */
- if((adapter->hw.mac_type >= e1000_82543) &&
- (adapter->rx_csum == TRUE)) {
- rxcsum = E1000_READ_REG(&adapter->hw, RXCSUM);
- rxcsum |= E1000_RXCSUM_TUOFL;
- E1000_WRITE_REG(&adapter->hw, RXCSUM, rxcsum);
- }
-
- /* Enable Receives */
-
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
-}
-
-/**
- * e1000_free_tx_resources - Free Tx Resources
- * @adapter: board private structure
- *
- * Free all transmit software resources
- **/
-
-static void
-e1000_free_tx_resources(struct e1000_adapter *adapter)
-{
- struct pci_dev *pdev = adapter->pdev;
-
- e1000_clean_tx_ring(adapter);
-
- kfree(adapter->tx_ring.buffer_info);
- adapter->tx_ring.buffer_info = NULL;
-
- pci_free_consistent(pdev, adapter->tx_ring.size,
- adapter->tx_ring.desc, adapter->tx_ring.dma);
-
- adapter->tx_ring.desc = NULL;
-}
-
-/**
- * e1000_clean_tx_ring - Free Tx Buffers
- * @adapter: board private structure
- **/
-
-static void
-e1000_clean_tx_ring(struct e1000_adapter *adapter)
-{
- struct pci_dev *pdev = adapter->pdev;
- unsigned long size;
- int i;
-
- /* Free all the Tx ring sk_buffs */
-
- for(i = 0; i < adapter->tx_ring.count; i++) {
- if(adapter->tx_ring.buffer_info[i].skb) {
-
- pci_unmap_page(pdev,
- adapter->tx_ring.buffer_info[i].dma,
- adapter->tx_ring.buffer_info[i].length,
- PCI_DMA_TODEVICE);
-
- dev_kfree_skb(adapter->tx_ring.buffer_info[i].skb);
-
- adapter->tx_ring.buffer_info[i].skb = NULL;
- }
- }
-
- size = sizeof(struct e1000_buffer) * adapter->tx_ring.count;
- memset(adapter->tx_ring.buffer_info, 0, size);
-
- /* Zero out the descriptor ring */
-
- memset(adapter->tx_ring.desc, 0, adapter->tx_ring.size);
-
- adapter->tx_ring.next_to_use = 0;
- adapter->tx_ring.next_to_clean = 0;
-
- E1000_WRITE_REG(&adapter->hw, TDH, 0);
- E1000_WRITE_REG(&adapter->hw, TDT, 0);
-}
-
-/**
- * e1000_free_rx_resources - Free Rx Resources
- * @adapter: board private structure
- *
- * Free all receive software resources
- **/
-
-static void
-e1000_free_rx_resources(struct e1000_adapter *adapter)
-{
- struct pci_dev *pdev = adapter->pdev;
-
- e1000_clean_rx_ring(adapter);
-
- kfree(adapter->rx_ring.buffer_info);
- adapter->rx_ring.buffer_info = NULL;
-
- pci_free_consistent(pdev, adapter->rx_ring.size,
- adapter->rx_ring.desc, adapter->rx_ring.dma);
-
- adapter->rx_ring.desc = NULL;
-}
-
-/**
- * e1000_clean_rx_ring - Free Rx Buffers
- * @adapter: board private structure
- **/
-
-static void
-e1000_clean_rx_ring(struct e1000_adapter *adapter)
-{
- struct pci_dev *pdev = adapter->pdev;
- unsigned long size;
- int i;
-
- /* Free all the Rx ring sk_buffs */
-
- for(i = 0; i < adapter->rx_ring.count; i++) {
- if(adapter->rx_ring.buffer_info[i].skb) {
-
- pci_unmap_single(pdev,
- adapter->rx_ring.buffer_info[i].dma,
- adapter->rx_ring.buffer_info[i].length,
- PCI_DMA_FROMDEVICE);
-
- dev_kfree_skb(adapter->rx_ring.buffer_info[i].skb);
-
- adapter->rx_ring.buffer_info[i].skb = NULL;
- }
- }
-
- size = sizeof(struct e1000_buffer) * adapter->rx_ring.count;
- memset(adapter->rx_ring.buffer_info, 0, size);
-
- /* Zero out the descriptor ring */
-
- memset(adapter->rx_ring.desc, 0, adapter->rx_ring.size);
-
- adapter->rx_ring.next_to_clean = 0;
- adapter->rx_ring.next_to_use = 0;
-
- E1000_WRITE_REG(&adapter->hw, RDH, 0);
- E1000_WRITE_REG(&adapter->hw, RDT, 0);
-}
-
-/* The 82542 2.0 (revision 2) needs to have the receive unit in reset
- * and memory write and invalidate disabled for certain operations
- */
-static void
-e1000_enter_82542_rst(struct e1000_adapter *adapter)
-{
- struct net_device *netdev = adapter->netdev;
- uint32_t rctl;
-
- e1000_pci_clear_mwi(&adapter->hw);
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl |= E1000_RCTL_RST;
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- E1000_WRITE_FLUSH(&adapter->hw);
- mdelay(5);
-
- if(netif_running(netdev))
- e1000_clean_rx_ring(adapter);
-}
-
-static void
-e1000_leave_82542_rst(struct e1000_adapter *adapter)
-{
- struct net_device *netdev = adapter->netdev;
- uint32_t rctl;
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl &= ~E1000_RCTL_RST;
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- E1000_WRITE_FLUSH(&adapter->hw);
- mdelay(5);
-
- if(adapter->hw.pci_cmd_word & PCI_COMMAND_INVALIDATE)
- e1000_pci_set_mwi(&adapter->hw);
-
- if(netif_running(netdev)) {
- e1000_configure_rx(adapter);
- e1000_alloc_rx_buffers(adapter);
- }
-}
-
-/**
- * e1000_set_mac - Change the Ethernet Address of the NIC
- * @netdev: network interface device structure
- * @p: pointer to an address structure
- *
- * Returns 0 on success, negative on failure
- **/
-
-static int
-e1000_set_mac(struct net_device *netdev, void *p)
-{
- struct e1000_adapter *adapter = netdev->priv;
- struct sockaddr *addr = p;
-
- /* 82542 2.0 needs to be in reset to write receive address registers */
-
- if(adapter->hw.mac_type == e1000_82542_rev2_0)
- e1000_enter_82542_rst(adapter);
-
- memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
- memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
-
- e1000_rar_set(&adapter->hw, adapter->hw.mac_addr, 0);
-
- if(adapter->hw.mac_type == e1000_82542_rev2_0)
- e1000_leave_82542_rst(adapter);
-
- return 0;
-}
-
-/**
- * e1000_set_multi - Multicast and Promiscuous mode set
- * @netdev: network interface device structure
- *
- * The set_multi entry point is called whenever the multicast address
- * list or the network interface flags are updated. This routine is
- * resposible for configuring the hardware for proper multicast,
- * promiscuous mode, and all-multi behavior.
- **/
-
-static void
-e1000_set_multi(struct net_device *netdev)
-{
- struct e1000_adapter *adapter = netdev->priv;
- struct e1000_hw *hw = &adapter->hw;
- struct dev_mc_list *mc_ptr;
- uint32_t rctl;
- uint32_t hash_value;
- int i;
-
- /* Check for Promiscuous and All Multicast modes */
-
- rctl = E1000_READ_REG(hw, RCTL);
-
- if(netdev->flags & IFF_PROMISC) {
- rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
- } else if(netdev->flags & IFF_ALLMULTI) {
- rctl |= E1000_RCTL_MPE;
- rctl &= ~E1000_RCTL_UPE;
- } else {
- rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
- }
-
- E1000_WRITE_REG(hw, RCTL, rctl);
-
- /* 82542 2.0 needs to be in reset to write receive address registers */
-
- if(hw->mac_type == e1000_82542_rev2_0)
- e1000_enter_82542_rst(adapter);
-
- /* load the first 15 multicast address into the exact filters 1-15
- * RAR 0 is used for the station MAC adddress
- * if there are not 15 addresses, go ahead and clear the filters
- */
- mc_ptr = netdev->mc_list;
-
- for(i = 1; i < E1000_RAR_ENTRIES; i++) {
- if(mc_ptr) {
- e1000_rar_set(hw, mc_ptr->dmi_addr, i);
- mc_ptr = mc_ptr->next;
- } else {
- E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
- E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
- }
- }
-
- /* clear the old settings from the multicast hash table */
-
- for(i = 0; i < E1000_NUM_MTA_REGISTERS; i++)
- E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
-
- /* load any remaining addresses into the hash table */
-
- for(; mc_ptr; mc_ptr = mc_ptr->next) {
- hash_value = e1000_hash_mc_addr(hw, mc_ptr->dmi_addr);
- e1000_mta_set(hw, hash_value);
- }
-
- if(hw->mac_type == e1000_82542_rev2_0)
- e1000_leave_82542_rst(adapter);
-}
-
-#ifdef IANS
-
-static void
-e1000_tx_flush(struct e1000_adapter *adapter)
-{
- uint32_t ctrl, tctl, txcw, icr;
-
- e1000_irq_disable(adapter);
-
- /* TODO , does the ILOS trick work for 82542 also? */
-
- if(adapter->hw.mac_type < e1000_82543) {
- /* Transmit Unit Reset */
-
- tctl = E1000_READ_REG(&adapter->hw, TCTL);
- E1000_WRITE_REG(&adapter->hw, TCTL, tctl | E1000_TCTL_RST);
- E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
- e1000_clean_tx_ring(adapter);
- e1000_configure_tx(adapter);
-
- } else {
- /* turn off autoneg, set link up, and invert loss of signal */
-
- txcw = E1000_READ_REG(&adapter->hw, TXCW);
- E1000_WRITE_REG(&adapter->hw, TXCW, txcw & ~E1000_TXCW_ANE);
-
- ctrl = E1000_READ_REG(&adapter->hw, CTRL);
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl | E1000_CTRL_SLU | E1000_CTRL_ILOS);
-
- /* delay to flush queue, then clean up */
-
- mdelay(10);
-
- e1000_clean_tx_irq(adapter);
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
- E1000_WRITE_REG(&adapter->hw, TXCW, txcw);
-
- /* clear the link status change interrupts this caused */
-
- icr = E1000_READ_REG(&adapter->hw, ICR);
- }
-
- e1000_irq_enable(adapter);
-}
-
-#endif
-
-/* need to wait a few seconds after link up to get diagnostic information from the phy */
-
-static void
-e1000_update_phy_info(unsigned long data)
-{
- struct e1000_adapter *adapter = (struct e1000_adapter *) data;
- e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
-}
-
-/**
- * e1000_watchdog - Timer Call-back
- * @data: pointer to netdev cast into an unsigned long
- **/
-
-static void
-e1000_watchdog(unsigned long data)
-{
- struct e1000_adapter *adapter = (struct e1000_adapter *) data;
- struct net_device *netdev = adapter->netdev;
- struct e1000_desc_ring *txdr = &adapter->tx_ring;
- int i;
-
- e1000_check_for_link(&adapter->hw);
-
- if(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
- if(!netif_carrier_ok(netdev)) {
-#ifdef IANS
- if((adapter->iANSdata->iANS_status == IANS_COMMUNICATION_UP) &&
- (adapter->iANSdata->reporting_mode == IANS_STATUS_REPORTING_ON))
- if(ans_notify)
- ans_notify(netdev, IANS_IND_XMIT_QUEUE_READY);
-#endif
- e1000_get_speed_and_duplex(&adapter->hw,
- &adapter->link_speed,
- &adapter->link_duplex);
-
- printk(KERN_INFO
- "e1000: %s NIC Link is Up %d Mbps %s\n",
- netdev->name, adapter->link_speed,
- adapter->link_duplex == FULL_DUPLEX ?
- "Full Duplex" : "Half Duplex");
-
- netif_carrier_on(netdev);
- netif_wake_queue(netdev);
- mod_timer(&adapter->phy_info_timer, jiffies + 2 * HZ);
- }
- } else {
- if(netif_carrier_ok(netdev)) {
- adapter->link_speed = 0;
- adapter->link_duplex = 0;
- printk(KERN_INFO
- "e1000: %s NIC Link is Down\n",
- netdev->name);
- netif_carrier_off(netdev);
- netif_stop_queue(netdev);
- mod_timer(&adapter->phy_info_timer, jiffies + 2 * HZ);
- }
- }
-
- e1000_update_stats(adapter);
- e1000_update_adaptive(&adapter->hw);
-
-#ifdef IANS
-{
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
- unsigned long flags;
-#endif
- if(adapter->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
-
- if(adapter->iANSdata->reporting_mode == IANS_STATUS_REPORTING_ON)
- bd_ans_os_Watchdog(netdev, adapter);
-
- if(!netif_carrier_ok(netdev)) {
- /* don't sit on SKBs while link is down */
-
- if(E1000_DESC_UNUSED(&adapter->tx_ring) + 1 < adapter->tx_ring.count) {
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
- spin_lock_irqsave(&netdev->xmit_lock, flags);
- e1000_tx_flush(adapter);
- spin_unlock_irqrestore(&netdev->xmit_lock, flags);
-#else
- e1000_tx_flush(adapter);
-#endif
- }
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
- spin_lock_irqsave(&netdev->queue_lock, flags);
- qdisc_reset(netdev->qdisc);
- spin_unlock_irqrestore(&netdev->queue_lock, flags);
-#else
- qdisc_reset(netdev->qdisc);
-#endif
- }
- }
-}
-#endif
- /* Early detection of hung controller */
- i = txdr->next_to_clean;
- if(txdr->buffer_info[i].dma &&
- time_after(jiffies, txdr->buffer_info[i].time_stamp + HZ) &&
- !(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF))
- netif_stop_queue(netdev);
-
- /* Reset the timer */
- mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
-}
-
-#define E1000_TX_FLAGS_CSUM 0x00000001
-#define E1000_TX_FLAGS_VLAN 0x00000002
-#define E1000_TX_FLAGS_VLAN_MASK 0xffff0000
-#define E1000_TX_FLAGS_VLAN_SHIFT 16
-
-static inline boolean_t
-e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
-{
- struct e1000_context_desc *context_desc;
- int i;
- uint8_t css, cso;
-
- if(skb->ip_summed == CHECKSUM_HW) {
- css = skb->h.raw - skb->data;
- cso = (skb->h.raw + skb->csum) - skb->data;
-
- i = adapter->tx_ring.next_to_use;
- context_desc = E1000_CONTEXT_DESC(adapter->tx_ring, i);
-
- context_desc->upper_setup.tcp_fields.tucss = css;
- context_desc->upper_setup.tcp_fields.tucso = cso;
- context_desc->upper_setup.tcp_fields.tucse = 0;
- context_desc->tcp_seg_setup.data = 0;
- context_desc->cmd_and_length =
- cpu_to_le32(adapter->txd_cmd | E1000_TXD_CMD_DEXT);
-
- i = (i + 1) % adapter->tx_ring.count;
- adapter->tx_ring.next_to_use = i;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static inline int
-e1000_tx_map(struct e1000_adapter *adapter, struct sk_buff *skb)
-{
- struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
- int len, offset, size, count, i;
-
-#ifdef MAX_SKB_FRAGS
- int f;
- len = skb->len - skb->data_len;
-#else
- len = skb->len;
-#endif
-
- i = (tx_ring->next_to_use + tx_ring->count - 1) % tx_ring->count;
- count = 0;
-
- offset = 0;
-
- while(len) {
- i = (i + 1) % tx_ring->count;
- size = min(len, adapter->max_data_per_txd);
- tx_ring->buffer_info[i].length = size;
- tx_ring->buffer_info[i].dma =
- pci_map_single(adapter->pdev,
- skb->data + offset,
- size,
- PCI_DMA_TODEVICE);
- tx_ring->buffer_info[i].time_stamp = jiffies;
-
- len -= size;
- offset += size;
- count++;
- }
-
-#ifdef MAX_SKB_FRAGS
- for(f = 0; f < skb_shinfo(skb)->nr_frags; f++) {
- struct skb_frag_struct *frag;
-
- frag = &skb_shinfo(skb)->frags[f];
- len = frag->size;
- offset = 0;
-
- while(len) {
- i = (i + 1) % tx_ring->count;
- size = min(len, adapter->max_data_per_txd);
- tx_ring->buffer_info[i].length = size;
- tx_ring->buffer_info[i].dma =
- pci_map_page(adapter->pdev,
- frag->page,
- frag->page_offset + offset,
- size,
- PCI_DMA_TODEVICE);
-
- len -= size;
- offset += size;
- count++;
- }
- }
-#endif
- tx_ring->buffer_info[i].skb = skb;
-
- return count;
-}
-
-static inline void
-e1000_tx_queue(struct e1000_adapter *adapter, int count, int tx_flags)
-{
- struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
- struct e1000_tx_desc *tx_desc = NULL;
- uint32_t txd_upper, txd_lower;
- int i;
-
- txd_upper = 0;
- txd_lower = adapter->txd_cmd;
-
- if(tx_flags & E1000_TX_FLAGS_CSUM) {
- txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
- txd_upper |= E1000_TXD_POPTS_TXSM << 8;
- }
-
- if(tx_flags & E1000_TX_FLAGS_VLAN) {
- txd_lower |= E1000_TXD_CMD_VLE;
- txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
- }
-
- i = tx_ring->next_to_use;
-
- while(count--) {
- tx_desc = E1000_TX_DESC(*tx_ring, i);
- tx_desc->buffer_addr = cpu_to_le64(tx_ring->buffer_info[i].dma);
- tx_desc->lower.data =
- cpu_to_le32(txd_lower | tx_ring->buffer_info[i].length);
- tx_desc->upper.data = cpu_to_le32(txd_upper);
- i = (i + 1) % tx_ring->count;
- }
-
- tx_desc->lower.data |= cpu_to_le32(E1000_TXD_CMD_EOP);
-
- /* Force memory writes to complete before letting h/w
- * know there are new descriptors to fetch. (Only
- * applicable for weak-ordered memory model archs,
- * such as IA-64). */
- wmb();
-
- tx_ring->next_to_use = i;
- E1000_WRITE_REG(&adapter->hw, TDT, i);
-}
-
-#define TXD_USE_COUNT(S, X) (((S) / (X)) + (((S) % (X)) ? 1 : 0))
-#ifdef IANS
-#define ANS_XMIT_FULL() do { \
- iANSsupport_t *ans = adapter->iANSdata; \
- if((ans->iANS_status == IANS_COMMUNICATION_UP) && \
- (ans->reporting_mode == IANS_STATUS_REPORTING_ON) && \
- (ans_notify)) \
- ans_notify(netdev, IANS_IND_XMIT_QUEUE_FULL); \
-} while (0)
-#endif
-
-static int
-e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
-{
- struct e1000_adapter *adapter = netdev->priv;
- int tx_flags = 0, count;
-
-#ifdef MAX_SKB_FRAGS
- int f;
-#endif
-
- if(!netif_carrier_ok(netdev)) {
- netif_stop_queue(netdev);
-#ifdef IANS
- ANS_XMIT_FULL();
-#endif
- return 1;
- }
-
-#ifdef MAX_SKB_FRAGS
- count = TXD_USE_COUNT(skb->len - skb->data_len,
- adapter->max_data_per_txd);
- for(f = 0; f < skb_shinfo(skb)->nr_frags; f++)
- count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
- adapter->max_data_per_txd);
- if(skb->ip_summed == CHECKSUM_HW)
- count++;
-#else
- count = TXD_USE_COUNT(skb->len, adapter->max_data_per_txd);
-#endif
-
- if(E1000_DESC_UNUSED(&adapter->tx_ring) < count) {
- netif_stop_queue(netdev);
-#ifdef IANS
- ANS_XMIT_FULL();
-#endif
- return 1;
- }
-
- if(e1000_tx_csum(adapter, skb))
- tx_flags |= E1000_TX_FLAGS_CSUM;
-
-#ifdef IANS
-if(adapter->iANSdata->iANS_status == IANS_COMMUNICATION_UP) {
- struct e1000_tx_desc *tx_desc;
- tx_desc = E1000_TX_DESC(adapter->tx_ring, adapter->tx_ring.next_to_use);
-
- if(bd_ans_os_Transmit(adapter, tx_desc, &skb) == BD_ANS_FAILURE)
- return 1;
-
- if(tx_desc->lower.data & E1000_TXD_CMD_VLE) {
- tx_flags |= E1000_TX_FLAGS_VLAN;
- tx_flags |= (tx_desc->upper.data & E1000_TX_FLAGS_VLAN_MASK);
- }
-}
-#endif
-#ifdef NETIF_F_HW_VLAN_TX
- if(adapter->vlgrp && vlan_tx_tag_present(skb)) {
- tx_flags |= E1000_TX_FLAGS_VLAN;
- tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
- }
-#endif
-
- count = e1000_tx_map(adapter, skb);
-
- e1000_tx_queue(adapter, count, tx_flags);
-
- netdev->trans_start = jiffies;
-
- return 0;
-}
-
-#ifdef HAVE_TX_TIMEOUT
-/**
- * e1000_tx_timeout - Respond to a Tx Hang
- * @netdev: network interface device structure
- **/
-
-static void
-e1000_tx_timeout(struct net_device *netdev)
-{
- struct e1000_adapter *adapter = netdev->priv;
-
- e1000_down(adapter);
-#ifdef IANS
- if((adapter->iANSdata->iANS_status == IANS_COMMUNICATION_UP) &&
- (adapter->iANSdata->reporting_mode == IANS_STATUS_REPORTING_ON)) {
- netif_carrier_off(netdev);
- bd_ans_os_Watchdog(netdev, adapter);
- netif_carrier_on(netdev);
- }
-#endif
- e1000_up(adapter);
-}
-#endif
-
-/**
- * e1000_get_stats - Get System Network Statistics
- * @netdev: network interface device structure
- *
- * Returns the address of the device statistics structure.
- * The statistics are actually updated from the timer callback.
- **/
-
-static struct net_device_stats *
-e1000_get_stats(struct net_device *netdev)
-{
- struct e1000_adapter *adapter = netdev->priv;
-
- return &adapter->net_stats;
-}
-
-/**
- * e1000_change_mtu - Change the Maximum Transfer Unit
- * @netdev: network interface device structure
- * @new_mtu: new value for maximum frame size
- *
- * Returns 0 on success, negative on failure
- **/
-
-static int
-e1000_change_mtu(struct net_device *netdev, int new_mtu)
-{
- struct e1000_adapter *adapter = netdev->priv;
- int old_mtu = adapter->rx_buffer_len;
- int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
-
- if((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
- (max_frame > MAX_JUMBO_FRAME_SIZE)) {
- E1000_ERR("Invalid MTU setting\n");
- return -EINVAL;
- }
-
- if(max_frame <= MAXIMUM_ETHERNET_FRAME_SIZE) {
- adapter->rx_buffer_len = E1000_RXBUFFER_2048;
-
- } else if(adapter->hw.mac_type < e1000_82543) {
- E1000_ERR("Jumbo Frames not supported on 82542\n");
- return -EINVAL;
-
- } else if(max_frame <= E1000_RXBUFFER_4096) {
- adapter->rx_buffer_len = E1000_RXBUFFER_4096;
-
- } else if(max_frame <= E1000_RXBUFFER_8192) {
- adapter->rx_buffer_len = E1000_RXBUFFER_8192;
-
- } else {
- adapter->rx_buffer_len = E1000_RXBUFFER_16384;
- }
-
- if(old_mtu != adapter->rx_buffer_len && netif_running(netdev)) {
-
- e1000_down(adapter);
- e1000_up(adapter);
- }
-
- netdev->mtu = new_mtu;
- adapter->hw.max_frame_size = max_frame;
-
- return 0;
-}
-
-/**
- * e1000_update_stats - Update the board statistics counters
- * @adapter: board private structure
- **/
-
-static void
-e1000_update_stats(struct e1000_adapter *adapter)
-{
- struct e1000_hw *hw = &adapter->hw;
- unsigned long flags;
- uint16_t phy_tmp;
-
-#define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
-
- spin_lock_irqsave(&adapter->stats_lock, flags);
-
- /* these counters are modified from e1000_adjust_tbi_stats,
- * called from the interrupt context, so they must only
- * be written while holding adapter->stats_lock
- */
-
- adapter->stats.crcerrs += E1000_READ_REG(hw, CRCERRS);
- adapter->stats.gprc += E1000_READ_REG(hw, GPRC);
- adapter->stats.gorcl += E1000_READ_REG(hw, GORCL);
- adapter->stats.gorch += E1000_READ_REG(hw, GORCH);
- adapter->stats.bprc += E1000_READ_REG(hw, BPRC);
- adapter->stats.mprc += E1000_READ_REG(hw, MPRC);
- adapter->stats.roc += E1000_READ_REG(hw, ROC);
- adapter->stats.prc64 += E1000_READ_REG(hw, PRC64);
- adapter->stats.prc127 += E1000_READ_REG(hw, PRC127);
- adapter->stats.prc255 += E1000_READ_REG(hw, PRC255);
- adapter->stats.prc511 += E1000_READ_REG(hw, PRC511);
- adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023);
- adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522);
-
- spin_unlock_irqrestore(&adapter->stats_lock, flags);
-
- /* the rest of the counters are only modified here */
-
- adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS);
- adapter->stats.mpc += E1000_READ_REG(hw, MPC);
- adapter->stats.scc += E1000_READ_REG(hw, SCC);
- adapter->stats.ecol += E1000_READ_REG(hw, ECOL);
- adapter->stats.mcc += E1000_READ_REG(hw, MCC);
- adapter->stats.latecol += E1000_READ_REG(hw, LATECOL);
- adapter->stats.dc += E1000_READ_REG(hw, DC);
- adapter->stats.sec += E1000_READ_REG(hw, SEC);
- adapter->stats.rlec += E1000_READ_REG(hw, RLEC);
- adapter->stats.xonrxc += E1000_READ_REG(hw, XONRXC);
- adapter->stats.xontxc += E1000_READ_REG(hw, XONTXC);
- adapter->stats.xoffrxc += E1000_READ_REG(hw, XOFFRXC);
- adapter->stats.xofftxc += E1000_READ_REG(hw, XOFFTXC);
- adapter->stats.fcruc += E1000_READ_REG(hw, FCRUC);
- adapter->stats.gptc += E1000_READ_REG(hw, GPTC);
- adapter->stats.gotcl += E1000_READ_REG(hw, GOTCL);
- adapter->stats.gotch += E1000_READ_REG(hw, GOTCH);
- adapter->stats.rnbc += E1000_READ_REG(hw, RNBC);
- adapter->stats.ruc += E1000_READ_REG(hw, RUC);
- adapter->stats.rfc += E1000_READ_REG(hw, RFC);
- adapter->stats.rjc += E1000_READ_REG(hw, RJC);
- adapter->stats.torl += E1000_READ_REG(hw, TORL);
- adapter->stats.torh += E1000_READ_REG(hw, TORH);
- adapter->stats.totl += E1000_READ_REG(hw, TOTL);
- adapter->stats.toth += E1000_READ_REG(hw, TOTH);
- adapter->stats.tpr += E1000_READ_REG(hw, TPR);
- adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64);
- adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127);
- adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255);
- adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511);
- adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023);
- adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522);
- adapter->stats.mptc += E1000_READ_REG(hw, MPTC);
- adapter->stats.bptc += E1000_READ_REG(hw, BPTC);
-
- /* used for adaptive IFS */
-
- hw->tx_packet_delta = E1000_READ_REG(hw, TPT);
- adapter->stats.tpt += hw->tx_packet_delta;
- hw->collision_delta = E1000_READ_REG(hw, COLC);
- adapter->stats.colc += hw->collision_delta;
-
- if(hw->mac_type >= e1000_82543) {
- adapter->stats.algnerrc += E1000_READ_REG(hw, ALGNERRC);
- adapter->stats.rxerrc += E1000_READ_REG(hw, RXERRC);
- adapter->stats.tncrs += E1000_READ_REG(hw, TNCRS);
- adapter->stats.cexterr += E1000_READ_REG(hw, CEXTERR);
- adapter->stats.tsctc += E1000_READ_REG(hw, TSCTC);
- adapter->stats.tsctfc += E1000_READ_REG(hw, TSCTFC);
- }
-
- /* Fill out the OS statistics structure */
-
- adapter->net_stats.rx_packets = adapter->stats.gprc;
- adapter->net_stats.tx_packets = adapter->stats.gptc;
- adapter->net_stats.rx_bytes = adapter->stats.gorcl;
- adapter->net_stats.tx_bytes = adapter->stats.gotcl;
- adapter->net_stats.multicast = adapter->stats.mprc;
- adapter->net_stats.collisions = adapter->stats.colc;
-
- /* Rx Errors */
-
- adapter->net_stats.rx_errors = adapter->stats.rxerrc +
- adapter->stats.crcerrs + adapter->stats.algnerrc +
- adapter->stats.rlec + adapter->stats.rnbc +
- adapter->stats.mpc + adapter->stats.cexterr;
- adapter->net_stats.rx_dropped = adapter->stats.rnbc;
- adapter->net_stats.rx_length_errors = adapter->stats.rlec;
- adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
- adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;
- adapter->net_stats.rx_fifo_errors = adapter->stats.mpc;
- adapter->net_stats.rx_missed_errors = adapter->stats.mpc;
-
- /* Tx Errors */
-
- adapter->net_stats.tx_errors = adapter->stats.ecol +
- adapter->stats.latecol;
- adapter->net_stats.tx_aborted_errors = adapter->stats.ecol;
- adapter->net_stats.tx_window_errors = adapter->stats.latecol;
-
- /* Tx Dropped needs to be maintained elsewhere */
-
- /* Phy Stats */
-
- if(hw->media_type == e1000_media_type_copper) {
- if((adapter->link_speed == SPEED_1000) &&
- (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) {
- phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK;
- adapter->phy_stats.idle_errors += phy_tmp;
- }
-
- if(!e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp))
- adapter->phy_stats.receive_errors += phy_tmp;
- }
-}
-
-/**
- * e1000_irq_disable - Mask off interrupt generation on the NIC
- * @adapter: board private structure
- **/
-
-static inline void
-e1000_irq_disable(struct e1000_adapter *adapter)
-{
- atomic_inc(&adapter->irq_sem);
- E1000_WRITE_REG(&adapter->hw, IMC, ~0);
- E1000_WRITE_FLUSH(&adapter->hw);
- synchronize_irq();
-}
-
-/**
- * e1000_irq_enable - Enable default interrupt generation settings
- * @adapter: board private structure
- **/
-
-static inline void
-e1000_irq_enable(struct e1000_adapter *adapter)
-{
- if(atomic_dec_and_test(&adapter->irq_sem)) {
- E1000_WRITE_REG(&adapter->hw, IMS, IMS_ENABLE_MASK);
- E1000_WRITE_FLUSH(&adapter->hw);
- }
-}
-
-/**
- * e1000_intr - Interrupt Handler
- * @irq: interrupt number
- * @data: pointer to a network interface device structure
- * @pt_regs: CPU registers structure
- **/
-
-static void
-e1000_intr(int irq, void *data, struct pt_regs *regs)
-{
- struct net_device *netdev = data;
- struct e1000_adapter *adapter = netdev->priv;
- uint32_t icr;
- int i = E1000_MAX_INTR;
-
- while(i && (icr = E1000_READ_REG(&adapter->hw, ICR))) {
-
- if(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
- adapter->hw.get_link_status = 1;
- mod_timer(&adapter->watchdog_timer, jiffies);
- }
-
- e1000_clean_rx_irq(adapter);
- e1000_clean_tx_irq(adapter);
- i--;
-
-#ifdef E1000_COUNT_ICR
- adapter->icr_txdw += icr & 0x01;
- icr >>= 1;
- adapter->icr_txqe += icr & 0x01;
- icr >>= 1;
- adapter->icr_lsc += icr & 0x01;
- icr >>= 1;
- adapter->icr_rxseq += icr & 0x01;
- icr >>= 1;
- adapter->icr_rxdmt += icr & 0x01;
- icr >>= 2;
- adapter->icr_rxo += icr & 0x01;
- icr >>= 1;
- adapter->icr_rxt += icr & 0x01;
- icr >>= 2;
- adapter->icr_mdac += icr & 0x01;
- icr >>= 1;
- adpater->icr_rxcfg += icr & 0x01;
- icr >>= 1;
- adpater->icr_gpi += icr & 0x01;
-#endif
- }
-}
-
-/**
- * e1000_clean_tx_irq - Reclaim resources after transmit completes
- * @adapter: board private structure
- **/
-
-static void
-e1000_clean_tx_irq(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
- struct net_device *netdev = adapter->netdev;
- struct pci_dev *pdev = adapter->pdev;
- struct e1000_tx_desc *tx_desc;
- int i;
-
- i = tx_ring->next_to_clean;
- tx_desc = E1000_TX_DESC(*tx_ring, i);
-
- while(tx_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) {
-
- if(tx_ring->buffer_info[i].dma) {
-
- pci_unmap_page(pdev,
- tx_ring->buffer_info[i].dma,
- tx_ring->buffer_info[i].length,
- PCI_DMA_TODEVICE);
-
- tx_ring->buffer_info[i].dma = 0;
- }
-
- if(tx_ring->buffer_info[i].skb) {
-
- dev_kfree_skb_any(tx_ring->buffer_info[i].skb);
-
- tx_ring->buffer_info[i].skb = NULL;
- }
-
- tx_desc->upper.data = 0;
-
- i = (i + 1) % tx_ring->count;
- tx_desc = E1000_TX_DESC(*tx_ring, i);
- }
-
- tx_ring->next_to_clean = i;
-
- if(netif_queue_stopped(netdev) && netif_carrier_ok(netdev) &&
- (E1000_DESC_UNUSED(tx_ring) > E1000_TX_QUEUE_WAKE)) {
-
-#ifdef IANS
-{
- iANSsupport_t *ans = adapter->iANSdata;
-
- if((ans->iANS_status == IANS_COMMUNICATION_UP) &&
- (ans->reporting_mode == IANS_STATUS_REPORTING_ON) &&
- (ans_notify))
- ans_notify(netdev, IANS_IND_XMIT_QUEUE_READY);
-}
-#endif
- netif_wake_queue(netdev);
- }
-}
-
-/**
- * e1000_clean_rx_irq - Send received data up the network stack,
- * @adapter: board private structure
- **/
-
-static void
-e1000_clean_rx_irq(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
- struct net_device *netdev = adapter->netdev;
- struct pci_dev *pdev = adapter->pdev;
- struct e1000_rx_desc *rx_desc;
- struct sk_buff *skb;
- unsigned long flags;
- uint32_t length;
- uint8_t last_byte;
- int i;
-
- i = rx_ring->next_to_clean;
- rx_desc = E1000_RX_DESC(*rx_ring, i);
-
- while(rx_desc->status & E1000_RXD_STAT_DD) {
-
- pci_unmap_single(pdev,
- rx_ring->buffer_info[i].dma,
- rx_ring->buffer_info[i].length,
- PCI_DMA_FROMDEVICE);
-
- skb = rx_ring->buffer_info[i].skb;
- length = le16_to_cpu(rx_desc->length);
-
- if(!(rx_desc->status & E1000_RXD_STAT_EOP)) {
-
- /* All receives must fit into a single buffer */
-
- E1000_DBG("Receive packet consumed multiple buffers\n");
-
- dev_kfree_skb_irq(skb);
- rx_desc->status = 0;
- rx_ring->buffer_info[i].skb = NULL;
-
- i = (i + 1) % rx_ring->count;
-
- rx_desc = E1000_RX_DESC(*rx_ring, i);
- continue;
- }
-
- if(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
-
- last_byte = *(skb->data + length - 1);
-
- if(TBI_ACCEPT(&adapter->hw, rx_desc->status,
- rx_desc->errors, length, last_byte)) {
-
- spin_lock_irqsave(&adapter->stats_lock, flags);
-
- e1000_tbi_adjust_stats(&adapter->hw,
- &adapter->stats,
- length, skb->data);
-
- spin_unlock_irqrestore(&adapter->stats_lock,
- flags);
- length--;
- } else {
-
- dev_kfree_skb_irq(skb);
- rx_desc->status = 0;
- rx_ring->buffer_info[i].skb = NULL;
-
- i = (i + 1) % rx_ring->count;
-
- rx_desc = E1000_RX_DESC(*rx_ring, i);
- continue;
- }
- }
-
- /* Good Receive */
- skb_put(skb, length - ETHERNET_FCS_SIZE);
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
- /* NFS mountd workaround on 2.2.x */
- if(length < 512) {
- struct sk_buff *tmp_skb;
- tmp_skb = alloc_skb(E1000_RXBUFFER_2048>>1, GFP_ATOMIC);
- if(tmp_skb != NULL) {
- tmp_skb->dev = skb->dev;
- skb_reserve(tmp_skb, skb->data - skb->head);
- skb_put(tmp_skb, skb->len);
- memcpy(tmp_skb->head, skb->head,
- tmp_skb->end - tmp_skb->head);
- dev_kfree_skb(skb);
- skb = tmp_skb;
- }
- }
-#endif
-
- /* Receive Checksum Offload */
- e1000_rx_checksum(adapter, rx_desc, skb);
-
-#ifdef IANS
-{
- iANSsupport_t *ans = adapter->iANSdata;
-
- if(ans->iANS_status == IANS_COMMUNICATION_UP) {
- if(bd_ans_os_Receive(adapter, rx_desc, skb) == BD_ANS_FAILURE)
- dev_kfree_skb_irq(skb);
- else
- netif_rx(skb);
- } else {
-#endif
- skb->protocol = eth_type_trans(skb, netdev);
-#ifdef NETIF_F_HW_VLAN_TX
- if(adapter->vlgrp && (rx_desc->status & E1000_RXD_STAT_VP)) {
- vlan_hwaccel_rx(skb, adapter->vlgrp,
- (rx_desc->special & E1000_RXD_SPC_VLAN_MASK));
- } else {
- netif_rx(skb);
- }
-#else
- netif_rx(skb);
-#endif
-#ifdef IANS
- }
-}
-#endif
- netdev->last_rx = jiffies;
-
- rx_desc->status = 0;
- rx_ring->buffer_info[i].skb = NULL;
-
- i = (i + 1) % rx_ring->count;
-
- rx_desc = E1000_RX_DESC(*rx_ring, i);
- }
-
- rx_ring->next_to_clean = i;
-
- e1000_alloc_rx_buffers(adapter);
-}
-
-/**
- * e1000_alloc_rx_buffers - Replace used receive buffers
- * @data: address of board private structure
- **/
-
-static void
-e1000_alloc_rx_buffers(struct e1000_adapter *adapter)
-{
- struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
- struct net_device *netdev = adapter->netdev;
- struct pci_dev *pdev = adapter->pdev;
- struct e1000_rx_desc *rx_desc;
- struct sk_buff *skb;
- int reserve_len;
- int i;
-
-#ifdef IANS
- reserve_len = BD_ANS_INFO_SIZE;
- E1000_ROUNDUP(reserve_len, 16);
- reserve_len += 2;
-#else
- reserve_len = 2;
-#endif
-
- i = rx_ring->next_to_use;
-
- while(!rx_ring->buffer_info[i].skb) {
- rx_desc = E1000_RX_DESC(*rx_ring, i);
-
- skb = alloc_skb(adapter->rx_buffer_len + reserve_len,
- GFP_ATOMIC);
-
- if(!skb) {
- /* Better luck next round */
- break;
- }
-
- /* Make buffer alignment 2 beyond a 16 byte boundary
- * this will result in a 16 byte aligned IP header after
- * the 14 byte MAC header is removed
- */
- skb_reserve(skb, reserve_len);
-
- skb->dev = netdev;
-
- rx_ring->buffer_info[i].skb = skb;
- rx_ring->buffer_info[i].length = adapter->rx_buffer_len;
- rx_ring->buffer_info[i].dma =
- pci_map_single(pdev,
- skb->data,
- adapter->rx_buffer_len,
- PCI_DMA_FROMDEVICE);
-
- rx_desc->buffer_addr = cpu_to_le64(rx_ring->buffer_info[i].dma);
-
- if(!(i % E1000_RX_BUFFER_WRITE)) {
- /* Force memory writes to complete before letting h/w
- * know there are new descriptors to fetch. (Only
- * applicable for weak-ordered memory model archs,
- * such as IA-64). */
- wmb();
-
- E1000_WRITE_REG(&adapter->hw, RDT, i);
- }
-
- i = (i + 1) % rx_ring->count;
- }
-
- rx_ring->next_to_use = i;
-}
-
-/**
- * e1000_ioctl -
- * @netdev:
- * @ifreq:
- * @cmd:
- **/
-
-static int
-e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
-{
- switch (cmd) {
-#ifdef IANS
- case IANS_BASE_SIOC: {
- IANS_BD_PARAM_HEADER *header;
-
- header = (IANS_BD_PARAM_HEADER *) ifr->ifr_data;
- if((header->Opcode != IANS_OP_EXT_GET_STATUS) &&
- (!capable(CAP_NET_ADMIN)))
- return -EPERM;
-
- return bd_ans_os_Ioctl(netdev, ifr, cmd);
- }
-#endif
-#ifdef IDIAG
- case IDIAG_PRO_BASE_SIOC:
- return e1000_diag_ioctl(netdev, ifr);
-#endif
-#ifdef SIOCETHTOOL
- case SIOCETHTOOL:
- return e1000_ethtool_ioctl(netdev, ifr);
-#endif
- default:
- return -EOPNOTSUPP;
- }
-}
-
-/**
- * e1000_rx_checksum - Receive Checksum Offload for 82543
- * @adapter: board private structure
- * @rx_desc: receive descriptor
- * @sk_buff: socket buffer with received data
- **/
-
-static inline void
-e1000_rx_checksum(struct e1000_adapter *adapter,
- struct e1000_rx_desc *rx_desc,
- struct sk_buff *skb)
-{
- /* 82543 or newer only */
- if((adapter->hw.mac_type < e1000_82543) ||
- /* Ignore Checksum bit is set */
- (rx_desc->status & E1000_RXD_STAT_IXSM) ||
- /* TCP Checksum has not been calculated */
- (!(rx_desc->status & E1000_RXD_STAT_TCPCS))) {
- skb->ip_summed = CHECKSUM_NONE;
- return;
- }
-
- /* At this point we know the hardware did the TCP checksum */
- /* now look at the TCP checksum error bit */
- if(rx_desc->errors & E1000_RXD_ERR_TCPE) {
- /* let the stack verify checksum errors */
- skb->ip_summed = CHECKSUM_NONE;
- adapter->hw_csum_err++;
- } else {
- /* TCP checksum is good */
- skb->ip_summed = CHECKSUM_UNNECESSARY;
- adapter->hw_csum_good++;
- }
-}
-
-void
-e1000_pci_set_mwi(struct e1000_hw *hw)
-{
- struct e1000_adapter *adapter = hw->back;
-
-#ifdef HAVE_PCI_SET_MWI
- pci_set_mwi(adapter->pdev);
-#else
- pci_write_config_word(adapter->pdev, PCI_COMMAND,
- adapter->hw.pci_cmd_word |
- PCI_COMMAND_INVALIDATE);
-#endif
-}
-
-void
-e1000_pci_clear_mwi(struct e1000_hw *hw)
-{
- struct e1000_adapter *adapter = hw->back;
-
-#ifdef HAVE_PCI_SET_MWI
- pci_clear_mwi(adapter->pdev);
-#else
- pci_write_config_word(adapter->pdev, PCI_COMMAND,
- adapter->hw.pci_cmd_word &
- ~PCI_COMMAND_INVALIDATE);
-#endif
-}
-
-void
-e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
-{
- struct e1000_adapter *adapter = hw->back;
-
- pci_read_config_word(adapter->pdev, reg, value);
-}
-
-void
-e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
-{
- struct e1000_adapter *adapter = hw->back;
-
- pci_write_config_word(adapter->pdev, reg, *value);
-}
-
-uint32_t
-e1000_io_read(struct e1000_hw *hw, uint32_t port)
-{
- return inl(port);
-}
-
-void
-e1000_io_write(struct e1000_hw *hw, uint32_t port, uint32_t value)
-{
- outl(value, port);
-}
-
-#ifdef NETIF_F_HW_VLAN_TX
-static void
-e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
-{
- struct e1000_adapter *adapter = netdev->priv;
- uint32_t ctrl, rctl;
-
- e1000_irq_disable(adapter);
- adapter->vlgrp = grp;
-
- if(grp) {
- /* enable VLAN tag insert/strip */
-
- E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE);
-
- ctrl = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl |= E1000_CTRL_VME;
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
-
- /* enable VLAN receive filtering */
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl |= E1000_RCTL_VFE;
- rctl &= ~E1000_RCTL_CFIEN;
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- } else {
- /* disable VLAN tag insert/strip */
-
- ctrl = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl &= ~E1000_CTRL_VME;
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
-
- /* disable VLAN filtering */
-
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl &= ~E1000_RCTL_VFE;
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- }
-
- e1000_irq_enable(adapter);
-}
-
-static void
-e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid)
-{
- struct e1000_adapter *adapter = netdev->priv;
- uint32_t vfta, index;
-
- /* add VID to filter table */
-
- index = (vid >> 5) & 0x7F;
- vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
- vfta |= (1 << (vid & 0x1F));
- e1000_write_vfta(&adapter->hw, index, vfta);
-}
-
-static void
-e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid)
-{
- struct e1000_adapter *adapter = netdev->priv;
- uint32_t vfta, index;
-
- e1000_irq_disable(adapter);
-
- if(adapter->vlgrp)
- adapter->vlgrp->vlan_devices[vid] = NULL;
-
- e1000_irq_enable(adapter);
-
- /* remove VID from filter table*/
-
- index = (vid >> 5) & 0x7F;
- vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
- vfta &= ~(1 << (vid & 0x1F));
- e1000_write_vfta(&adapter->hw, index, vfta);
-}
-#endif
-
-static int
-e1000_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
-{
- struct pci_dev *pdev = NULL;
-
- switch(event) {
- case SYS_DOWN:
- case SYS_HALT:
- case SYS_POWER_OFF:
- pci_for_each_dev(pdev) {
- if(pci_dev_driver(pdev) == &e1000_driver)
- e1000_suspend(pdev, 3);
- }
- }
- return NOTIFY_DONE;
-}
-
-static int
-e1000_suspend(struct pci_dev *pdev, uint32_t state)
-{
- struct net_device *netdev = pci_get_drvdata(pdev);
- struct e1000_adapter *adapter = netdev->priv;
- uint32_t ctrl, ctrl_ext, rctl;
-
- netif_device_detach(netdev);
-
- if(netif_running(netdev))
- e1000_down(adapter);
-
- if(adapter->wol) {
- e1000_setup_rctl(adapter);
- e1000_set_multi(netdev);
-
- if(adapter->wol & E1000_WUFC_MC) {
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
- rctl |= E1000_RCTL_MPE;
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
- }
-
- if(adapter->hw.media_type == e1000_media_type_fiber) {
- #define E1000_CTRL_ADVD3WUC 0x00100000
- ctrl = E1000_READ_REG(&adapter->hw, CTRL);
- ctrl |= E1000_CTRL_ADVD3WUC;
- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
-
- ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
- ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
- E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext);
- }
-
- E1000_WRITE_REG(&adapter->hw, WUC, 0);
- E1000_WRITE_REG(&adapter->hw, WUFC, adapter->wol);
- pci_enable_wake(pdev, 3, 1);
- } else {
- E1000_WRITE_REG(&adapter->hw, WUC, 0);
- E1000_WRITE_REG(&adapter->hw, WUFC, 0);
- pci_enable_wake(pdev, 3, 0);
- }
-
- pci_save_state(pdev, adapter->pci_state);
-
- if(!e1000_smbus_arp_enable(adapter, TRUE))
- pci_set_power_state(pdev, 3);
-
- return 0;
-}
-
-#ifdef CONFIG_PM
-static int
-e1000_resume(struct pci_dev *pdev)
-{
- struct net_device *netdev = pci_get_drvdata(pdev);
- struct e1000_adapter *adapter = netdev->priv;
-
- pci_set_power_state(pdev, 0);
- pci_restore_state(pdev, adapter->pci_state);
- pci_enable_wake(pdev, 0, 0);
-
- /* Clear the wakeup status bits */
-
- E1000_WRITE_REG(&adapter->hw, WUS, ~0);
-
- if(netif_running(netdev))
- e1000_up(adapter);
-
- netif_device_attach(netdev);
-
- e1000_smbus_arp_enable(adapter, FALSE);
-
- return 0;
-}
-#endif
-
-/**
- * e1000_smbus_lock - Exported for lock/unlock external smbus hw access
- * @pdev: PCI device information struct
- * @lock: TRUE to lock hw access; FALSE to unlock
- *
- * e1000_smbus_lock is designed to allow synchronization between e1000
- * driver and i2c-i8254x SMBUS bus driver when accessing e1000 hardware
- **/
-void
-e1000_smbus_lock(struct pci_dev *pdev, boolean_t lock)
-{
- struct net_device *netdev = pci_get_drvdata(pdev);
- struct e1000_adapter *adapter = netdev->priv;
-
- if (lock)
- down(&adapter->smbus_lock);
- else
- up(&adapter->smbus_lock);
-}
-
-static boolean_t
-e1000_smbus_arp_enable(struct e1000_adapter *adapter, boolean_t arp_enable)
-{
- uint32_t manc;
- boolean_t ret_val = FALSE;
-
- if(adapter->hw.mac_type < e1000_82540)
- return ret_val;
-
- down(&adapter->smbus_lock);
- manc = E1000_READ_REG(&adapter->hw, MANC);
- if(!arp_enable) {
- manc &= ~(E1000_MANC_ARP_EN);
- } else if(manc & E1000_MANC_SMBUS_EN) {
- manc |= E1000_MANC_ARP_EN;
- ret_val = TRUE;
- }
- E1000_WRITE_REG(&adapter->hw, MANC, manc);
- up(&adapter->smbus_lock);
-
- return ret_val;
-}
-
-/* e1000_main.c */
diff --git a/drivers/e1000-4.x/src/e1000_param.c.orig b/drivers/e1000-4.x/src/e1000_param.c.orig
deleted file mode 100644
index 02b3e8f72..000000000
--- a/drivers/e1000-4.x/src/e1000_param.c.orig
+++ /dev/null
@@ -1,657 +0,0 @@
-/*******************************************************************************
-
-
- Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- The full GNU General Public License is included in this distribution in the
- file called LICENSE.
-
- Contact Information:
- Linux NICS <linux.nics@intel.com>
- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-*******************************************************************************/
-
-#include "e1000.h"
-
-/* This is the only thing that needs to be changed to adjust the
- * maximum number of ports that the driver can manage.
- */
-
-#define E1000_MAX_NIC 32
-
-#define OPTION_UNSET -1
-#define OPTION_DISABLED 0
-#define OPTION_ENABLED 1
-
-/* Module Parameters are always initialized to -1, so that the driver
- * can tell the difference between no user specified value or the
- * user asking for the default value.
- * The true default values are loaded in when e1000_check_options is called.
- *
- * This is a GCC extension to ANSI C.
- * See the item "Labeled Elements in Initializers" in the section
- * "Extensions to the C Language Family" of the GCC documentation.
- */
-
-#define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET }
-
-/* All parameters are treated the same, as an integer array of values.
- * This macro just reduces the need to repeat the same declaration code
- * over and over (plus this helps to avoid typo bugs).
- */
-
-#define E1000_PARAM(X, S) \
-static const int __devinitdata X[E1000_MAX_NIC + 1] = E1000_PARAM_INIT; \
-MODULE_PARM(X, "1-" __MODULE_STRING(E1000_MAX_NIC) "i"); \
-MODULE_PARM_DESC(X, S);
-
-/* Transmit Descriptor Count
- *
- * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers
- * Valid Range: 80-4096 for 82544
- *
- * Default Value: 256
- */
-
-E1000_PARAM(TxDescriptors, "Number of transmit descriptors");
-
-/* Receive Descriptor Count
- *
- * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers
- * Valid Range: 80-4096 for 82544
- *
- * Default Value: 80
- */
-
-E1000_PARAM(RxDescriptors, "Number of receive descriptors");
-
-/* User Specified Speed Override
- *
- * Valid Range: 0, 10, 100, 1000
- * - 0 - auto-negotiate at all supported speeds
- * - 10 - only link at 10 Mbps
- * - 100 - only link at 100 Mbps
- * - 1000 - only link at 1000 Mbps
- *
- * Default Value: 0
- */
-
-E1000_PARAM(Speed, "Speed setting");
-
-/* User Specified Duplex Override
- *
- * Valid Range: 0-2
- * - 0 - auto-negotiate for duplex
- * - 1 - only link at half duplex
- * - 2 - only link at full duplex
- *
- * Default Value: 0
- */
-
-E1000_PARAM(Duplex, "Duplex setting");
-
-/* Auto-negotiation Advertisement Override
- *
- * Valid Range: 0x01-0x0F, 0x20-0x2F
- *
- * The AutoNeg value is a bit mask describing which speed and duplex
- * combinations should be advertised during auto-negotiation.
- * The supported speed and duplex modes are listed below
- *
- * Bit 7 6 5 4 3 2 1 0
- * Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10
- * Duplex Full Full Half Full Half
- *
- * Default Value: 0x2F
- */
-
-E1000_PARAM(AutoNeg, "Advertised auto-negotiation setting");
-
-/* User Specified Flow Control Override
- *
- * Valid Range: 0-3
- * - 0 - No Flow Control
- * - 1 - Rx only, respond to PAUSE frames but do not generate them
- * - 2 - Tx only, generate PAUSE frames but ignore them on receive
- * - 3 - Full Flow Control Support
- *
- * Default Value: Read flow control settings from the EEPROM
- */
-
-E1000_PARAM(FlowControl, "Flow Control setting");
-
-/* XsumRX - Receive Checksum Offload Enable/Disable
- *
- * Valid Range: 0, 1
- * - 0 - disables all checksum offload
- * - 1 - enables receive IP/TCP/UDP checksum offload
- * on 82543 based NICs
- *
- * Default Value: 1
- */
-
-E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
-
-/* Transmit Interrupt Delay in units of 1.024 microseconds
- *
- * Valid Range: 0-65535
- *
- * Default Value: 64
- */
-
-E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay");
-
-/* Transmit Absolute Interrupt Delay in units of 1.024 microseconds
- *
- * Valid Range: 0-65535
- *
- * Default Value: 0
- */
-
-E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");
-
-/* Receive Interrupt Delay in units of 1.024 microseconds
- *
- * Valid Range: 0-65535
- *
- * Default Value: 0/128
- */
-
-E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
-
-/* Receive Absolute Interrupt Delay in units of 1.024 microseconds
- *
- * Valid Range: 0-65535
- *
- * Default Value: 128
- */
-
-E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
-
-#define AUTONEG_ADV_DEFAULT 0x2F
-#define AUTONEG_ADV_MASK 0x2F
-#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
-
-#define DEFAULT_TXD 256
-#define MAX_TXD 256
-#define MIN_TXD 80
-#define MAX_82544_TXD 4096
-
-#define DEFAULT_RXD 80
-#define MAX_RXD 256
-#define MIN_RXD 80
-#define MAX_82544_RXD 4096
-
-#define DEFAULT_RDTR 128
-#define DEFAULT_RDTR_82544 0
-#define MAX_RXDELAY 0xFFFF
-#define MIN_RXDELAY 0
-
-#define DEFAULT_RADV 128
-#define MAX_RXABSDELAY 0xFFFF
-#define MIN_RXABSDELAY 0
-
-#define DEFAULT_TIDV 64
-#define MAX_TXDELAY 0xFFFF
-#define MIN_TXDELAY 0
-
-#define DEFAULT_TADV 64
-#define MAX_TXABSDELAY 0xFFFF
-#define MIN_TXABSDELAY 0
-
-struct e1000_option {
- enum { enable_option, range_option, list_option } type;
- char *name;
- char *err;
- int def;
- union {
- struct { /* range_option info */
- int min;
- int max;
- } r;
- struct { /* list_option info */
- int nr;
- struct e1000_opt_list { int i; char *str; } *p;
- } l;
- } arg;
-};
-
-
-static int __devinit
-e1000_validate_option(int *value, struct e1000_option *opt)
-{
- if(*value == OPTION_UNSET) {
- *value = opt->def;
- return 0;
- }
-
- switch (opt->type) {
- case enable_option:
- switch (*value) {
- case OPTION_ENABLED:
- printk(KERN_INFO "%s Enabled\n", opt->name);
- return 0;
- case OPTION_DISABLED:
- printk(KERN_INFO "%s Disabled\n", opt->name);
- return 0;
- }
- break;
- case range_option:
- if(*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
- printk(KERN_INFO "%s set to %i\n", opt->name, *value);
- return 0;
- }
- break;
- case list_option: {
- int i;
- struct e1000_opt_list *ent;
-
- for(i = 0; i < opt->arg.l.nr; i++) {
- ent = &opt->arg.l.p[i];
- if(*value == ent->i) {
- if(ent->str[0] != '\0')
- printk(KERN_INFO "%s\n", ent->str);
- return 0;
- }
- }
- }
- break;
- default:
- BUG();
- }
-
- printk(KERN_INFO "Invalid %s specified (%i) %s\n",
- opt->name, *value, opt->err);
- *value = opt->def;
- return -1;
-}
-
-static void e1000_check_fiber_options(struct e1000_adapter *adapter);
-static void e1000_check_copper_options(struct e1000_adapter *adapter);
-
-/**
- * e1000_check_options - Range Checking for Command Line Parameters
- * @adapter: board private structure
- *
- * This routine checks all command line paramters for valid user
- * input. If an invalid value is given, or if no user specified
- * value exists, a default value is used. The final value is stored
- * in a variable in the adapter structure.
- **/
-
-void __devinit
-e1000_check_options(struct e1000_adapter *adapter)
-{
- int bd = adapter->bd_number;
- if(bd >= E1000_MAX_NIC) {
- printk(KERN_NOTICE
- "Warning: no configuration for board #%i\n", bd);
- printk(KERN_NOTICE "Using defaults for all values\n");
- bd = E1000_MAX_NIC;
- }
-
- { /* Transmit Descriptor Count */
- struct e1000_option opt = {
- type: range_option,
- name: "Transmit Descriptors",
- err: "using default of " __MODULE_STRING(DEFAULT_TXD),
- def: DEFAULT_TXD,
- arg: { r: { min: MIN_TXD }}
- };
- struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
- e1000_mac_type mac_type = adapter->hw.mac_type;
- opt.arg.r.max = mac_type < e1000_82544 ? MAX_TXD : MAX_82544_TXD;
-
- tx_ring->count = TxDescriptors[bd];
- e1000_validate_option(&tx_ring->count, &opt);
- E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE);
- }
- { /* Receive Descriptor Count */
- struct e1000_option opt = {
- type: range_option,
- name: "Receive Descriptors",
- err: "using default of " __MODULE_STRING(DEFAULT_RXD),
- def: DEFAULT_RXD,
- arg: { r: { min: MIN_RXD }}
- };
- struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
- e1000_mac_type mac_type = adapter->hw.mac_type;
- opt.arg.r.max = mac_type < e1000_82544 ? MAX_RXD : MAX_82544_RXD;
-
- rx_ring->count = RxDescriptors[bd];
- e1000_validate_option(&rx_ring->count, &opt);
- E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE);
- }
- { /* Checksum Offload Enable/Disable */
- struct e1000_option opt = {
- type: enable_option,
- name: "Checksum Offload",
- err: "defaulting to Enabled",
- def: OPTION_ENABLED
- };
-
- int rx_csum = XsumRX[bd];
- e1000_validate_option(&rx_csum, &opt);
- adapter->rx_csum = rx_csum;
- }
- { /* Flow Control */
-
- struct e1000_opt_list fc_list[] =
- {{ e1000_fc_none, "Flow Control Disabled" },
- { e1000_fc_rx_pause,"Flow Control Receive Only" },
- { e1000_fc_tx_pause,"Flow Control Transmit Only" },
- { e1000_fc_full, "Flow Control Enabled" },
- { e1000_fc_default, "Flow Control Hardware Default" }};
-
- struct e1000_option opt = {
- type: list_option,
- name: "Flow Control",
- err: "reading default settings from EEPROM",
- def: e1000_fc_default,
- arg: { l: { nr: ARRAY_SIZE(fc_list), p: fc_list }}
- };
-
- int fc = FlowControl[bd];
- e1000_validate_option(&fc, &opt);
- adapter->hw.fc = adapter->hw.original_fc = fc;
- }
- { /* Transmit Interrupt Delay */
- char *tidv = "using default of " __MODULE_STRING(DEFAULT_TIDV);
- struct e1000_option opt = {
- type: range_option,
- name: "Transmit Interrupt Delay",
- arg: { r: { min: MIN_TXDELAY, max: MAX_TXDELAY }}
- };
- opt.def = DEFAULT_TIDV;
- opt.err = tidv;
-
- adapter->tx_int_delay = TxIntDelay[bd];
- e1000_validate_option(&adapter->tx_int_delay, &opt);
- }
- { /* Transmit Absolute Interrupt Delay */
- char *tadv = "using default of " __MODULE_STRING(DEFAULT_TADV);
- struct e1000_option opt = {
- type: range_option,
- name: "Transmit Absolute Interrupt Delay",
- arg: { r: { min: MIN_TXABSDELAY, max: MAX_TXABSDELAY }}
- };
- opt.def = DEFAULT_TADV;
- opt.err = tadv;
-
- adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
- e1000_validate_option(&adapter->tx_abs_int_delay, &opt);
- }
- { /* Receive Interrupt Delay */
- char *rdtr = "using default of " __MODULE_STRING(DEFAULT_RDTR);
- char *rdtr_82544 = "using default of "
- __MODULE_STRING(DEFAULT_RDTR_82544);
- struct e1000_option opt = {
- type: range_option,
- name: "Receive Interrupt Delay",
- arg: { r: { min: MIN_RXDELAY, max: MAX_RXDELAY }}
- };
- e1000_mac_type mac_type = adapter->hw.mac_type;
- opt.def = mac_type > e1000_82544 ? DEFAULT_RDTR : 0;
- opt.err = mac_type > e1000_82544 ? rdtr : rdtr_82544;
-
- adapter->rx_int_delay = RxIntDelay[bd];
- e1000_validate_option(&adapter->rx_int_delay, &opt);
- }
- { /* Receive Absolute Interrupt Delay */
- char *radv = "using default of " __MODULE_STRING(DEFAULT_RADV);
- struct e1000_option opt = {
- type: range_option,
- name: "Receive Absolute Interrupt Delay",
- arg: { r: { min: MIN_RXABSDELAY, max: MAX_RXABSDELAY }}
- };
- opt.def = DEFAULT_RADV;
- opt.err = radv;
-
- adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
- e1000_validate_option(&adapter->rx_abs_int_delay, &opt);
- }
-
- switch(adapter->hw.media_type) {
- case e1000_media_type_fiber:
- e1000_check_fiber_options(adapter);
- break;
- case e1000_media_type_copper:
- e1000_check_copper_options(adapter);
- break;
- default:
- BUG();
- }
-}
-
-/**
- * e1000_check_fiber_options - Range Checking for Link Options, Fiber Version
- * @adapter: board private structure
- *
- * Handles speed and duplex options on fiber adapters
- **/
-
-static void __devinit
-e1000_check_fiber_options(struct e1000_adapter *adapter)
-{
- int bd = adapter->bd_number;
- bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd;
-
- if((Speed[bd] != OPTION_UNSET)) {
- printk(KERN_INFO "Speed not valid for fiber adapters, "
- "parameter ignored\n");
- }
- if((Duplex[bd] != OPTION_UNSET)) {
- printk(KERN_INFO "Duplex not valid for fiber adapters, "
- "parameter ignored\n");
- }
- if((AutoNeg[bd] != OPTION_UNSET)) {
- printk(KERN_INFO "AutoNeg not valid for fiber adapters, "
- "parameter ignored\n");
- }
-}
-
-/**
- * e1000_check_copper_options - Range Checking for Link Options, Copper Version
- * @adapter: board private structure
- *
- * Handles speed and duplex options on copper adapters
- **/
-
-static void __devinit
-e1000_check_copper_options(struct e1000_adapter *adapter)
-{
- int speed, dplx;
- int bd = adapter->bd_number;
- bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd;
-
- { /* Speed */
- struct e1000_opt_list speed_list[] = {{ 0, "" },
- { SPEED_10, "" },
- { SPEED_100, "" },
- { SPEED_1000, "" }};
- struct e1000_option opt = {
- type: list_option,
- name: "Speed",
- err: "parameter ignored",
- def: 0,
- arg: { l: { nr: ARRAY_SIZE(speed_list), p: speed_list }}
- };
-
- speed = Speed[bd];
- e1000_validate_option(&speed, &opt);
- }
- { /* Duplex */
- struct e1000_opt_list dplx_list[] = {{ 0, "" },
- { HALF_DUPLEX, "" },
- { FULL_DUPLEX, "" }};
- struct e1000_option opt = {
- type: list_option,
- name: "Duplex",
- err: "parameter ignored",
- def: 0,
- arg: { l: { nr: ARRAY_SIZE(dplx_list), p: dplx_list }}
- };
-
- dplx = Duplex[bd];
- e1000_validate_option(&dplx, &opt);
- }
-
- if(AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) {
- printk(KERN_INFO
- "AutoNeg specified along with Speed or Duplex, "
- "parameter ignored\n");
- adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
- } else { /* Autoneg */
- struct e1000_opt_list an_list[] =
- #define AA "AutoNeg advertising "
- {{ 0x01, AA "10/HD" },
- { 0x02, AA "10/FD" },
- { 0x03, AA "10/FD, 10/HD" },
- { 0x04, AA "100/HD" },
- { 0x05, AA "100/HD, 10/HD" },
- { 0x06, AA "100/HD, 10/FD" },
- { 0x07, AA "100/HD, 10/FD, 10/HD" },
- { 0x08, AA "100/FD" },
- { 0x09, AA "100/FD, 10/HD" },
- { 0x0a, AA "100/FD, 10/FD" },
- { 0x0b, AA "100/FD, 10/FD, 10/HD" },
- { 0x0c, AA "100/FD, 100/HD" },
- { 0x0d, AA "100/FD, 100/HD, 10/HD" },
- { 0x0e, AA "100/FD, 100/HD, 10/FD" },
- { 0x0f, AA "100/FD, 100/HD, 10/FD, 10/HD" },
- { 0x20, AA "1000/FD" },
- { 0x21, AA "1000/FD, 10/HD" },
- { 0x22, AA "1000/FD, 10/FD" },
- { 0x23, AA "1000/FD, 10/FD, 10/HD" },
- { 0x24, AA "1000/FD, 100/HD" },
- { 0x25, AA "1000/FD, 100/HD, 10/HD" },
- { 0x26, AA "1000/FD, 100/HD, 10/FD" },
- { 0x27, AA "1000/FD, 100/HD, 10/FD, 10/HD" },
- { 0x28, AA "1000/FD, 100/FD" },
- { 0x29, AA "1000/FD, 100/FD, 10/HD" },
- { 0x2a, AA "1000/FD, 100/FD, 10/FD" },
- { 0x2b, AA "1000/FD, 100/FD, 10/FD, 10/HD" },
- { 0x2c, AA "1000/FD, 100/FD, 100/HD" },
- { 0x2d, AA "1000/FD, 100/FD, 100/HD, 10/HD" },
- { 0x2e, AA "1000/FD, 100/FD, 100/HD, 10/FD" },
- { 0x2f, AA "1000/FD, 100/FD, 100/HD, 10/FD, 10/HD" }};
-
- struct e1000_option opt = {
- type: list_option,
- name: "AutoNeg",
- err: "parameter ignored",
- def: AUTONEG_ADV_DEFAULT,
- arg: { l: { nr: ARRAY_SIZE(an_list), p: an_list }}
- };
-
- int an = AutoNeg[bd];
- e1000_validate_option(&an, &opt);
- adapter->hw.autoneg_advertised = an;
- }
-
- switch (speed + dplx) {
- case 0:
- adapter->hw.autoneg = 1;
- if(Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET)
- printk(KERN_INFO
- "Speed and duplex autonegotiation enabled\n");
- break;
- case HALF_DUPLEX:
- printk(KERN_INFO "Half Duplex specified without Speed\n");
- printk(KERN_INFO "Using Autonegotiation at Half Duplex only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_10_HALF |
- ADVERTISE_100_HALF;
- break;
- case FULL_DUPLEX:
- printk(KERN_INFO "Full Duplex specified without Speed\n");
- printk(KERN_INFO "Using Autonegotiation at Full Duplex only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_10_FULL |
- ADVERTISE_100_FULL |
- ADVERTISE_1000_FULL;
- break;
- case SPEED_10:
- printk(KERN_INFO "10 Mbps Speed specified without Duplex\n");
- printk(KERN_INFO "Using Autonegotiation at 10 Mbps only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_10_HALF |
- ADVERTISE_10_FULL;
- break;
- case SPEED_10 + HALF_DUPLEX:
- printk(KERN_INFO "Forcing to 10 Mbps Half Duplex\n");
- adapter->hw.autoneg = 0;
- adapter->hw.forced_speed_duplex = e1000_10_half;
- adapter->hw.autoneg_advertised = 0;
- break;
- case SPEED_10 + FULL_DUPLEX:
- printk(KERN_INFO "Forcing to 10 Mbps Full Duplex\n");
- adapter->hw.autoneg = 0;
- adapter->hw.forced_speed_duplex = e1000_10_full;
- adapter->hw.autoneg_advertised = 0;
- break;
- case SPEED_100:
- printk(KERN_INFO "100 Mbps Speed specified without Duplex\n");
- printk(KERN_INFO "Using Autonegotiation at 100 Mbps only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_100_HALF |
- ADVERTISE_100_FULL;
- break;
- case SPEED_100 + HALF_DUPLEX:
- printk(KERN_INFO "Forcing to 100 Mbps Half Duplex\n");
- adapter->hw.autoneg = 0;
- adapter->hw.forced_speed_duplex = e1000_100_half;
- adapter->hw.autoneg_advertised = 0;
- break;
- case SPEED_100 + FULL_DUPLEX:
- printk(KERN_INFO "Forcing to 100 Mbps Full Duplex\n");
- adapter->hw.autoneg = 0;
- adapter->hw.forced_speed_duplex = e1000_100_full;
- adapter->hw.autoneg_advertised = 0;
- break;
- case SPEED_1000:
- printk(KERN_INFO "1000 Mbps Speed specified without Duplex\n");
- printk(KERN_INFO
- "Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
- break;
- case SPEED_1000 + HALF_DUPLEX:
- printk(KERN_INFO "Half Duplex is not supported at 1000 Mbps\n");
- printk(KERN_INFO
- "Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
- break;
- case SPEED_1000 + FULL_DUPLEX:
- printk(KERN_INFO
- "Using Autonegotiation at 1000 Mbps Full Duplex only\n");
- adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
- break;
- default:
- BUG();
- }
-
- /* Speed, AutoNeg and MDI/MDI-X must all play nice */
- if (e1000_validate_mdi_setting(&(adapter->hw)) < 0) {
- printk(KERN_INFO "Speed, AutoNeg and MDI-X specifications are "
- "incompatible. Setting MDI-X to a compatible value.\n");
- }
-}
-
--
GitLab