devices/e100-2.6.27-orig.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 1546 f60cf2500bf8
permissions -rw-r--r--
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
1546
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/100 Linux driver
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
/*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 *	e100.c: Intel(R) PRO/100 ethernet driver
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 *	(Re)written 2003 by scott.feldman@intel.com.  Based loosely on
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
 *	original e100 driver, but better described as a munging of
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
 *	e100, e1000, eepro100, tg3, 8139cp, and other drivers.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
 *	References:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
 *		Intel 8255x 10/100 Mbps Ethernet Controller Family,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
 *		Open Source Software Developers Manual,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
 *		http://sourceforge.net/projects/e1000
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
 *	                      Theory of Operation
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
 *	I.   General
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
 *	The driver supports Intel(R) 10/100 Mbps PCI Fast Ethernet
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
 *	controller family, which includes the 82557, 82558, 82559, 82550,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
 *	82551, and 82562 devices.  82558 and greater controllers
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
 *	integrate the Intel 82555 PHY.  The controllers are used in
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
 *	server and client network interface cards, as well as in
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
 *	LAN-On-Motherboard (LOM), CardBus, MiniPCI, and ICHx
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
 *	configurations.  8255x supports a 32-bit linear addressing
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
 *	mode and operates at 33Mhz PCI clock rate.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
 *	II.  Driver Operation
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
 *	Memory-mapped mode is used exclusively to access the device's
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
 *	shared-memory structure, the Control/Status Registers (CSR). All
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
 *	setup, configuration, and control of the device, including queuing
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
 *	of Tx, Rx, and configuration commands is through the CSR.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
 *	cmd_lock serializes accesses to the CSR command register.  cb_lock
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
 *	protects the shared Command Block List (CBL).
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
 *	8255x is highly MII-compliant and all access to the PHY go
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
 *	through the Management Data Interface (MDI).  Consequently, the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
 *	driver leverages the mii.c library shared with other MII-compliant
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
 *	devices.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
 *	Big- and Little-Endian byte order as well as 32- and 64-bit
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
 *	archs are supported.  Weak-ordered memory and non-cache-coherent
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
 *	archs are supported.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
 *	III. Transmit
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
 *	A Tx skb is mapped and hangs off of a TCB.  TCBs are linked
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
 *	together in a fixed-size ring (CBL) thus forming the flexible mode
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
 *	memory structure.  A TCB marked with the suspend-bit indicates
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
 *	the end of the ring.  The last TCB processed suspends the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
 *	controller, and the controller can be restarted by issue a CU
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
 *	resume command to continue from the suspend point, or a CU start
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 *	command to start at a given position in the ring.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
 *	Non-Tx commands (config, multicast setup, etc) are linked
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
 *	into the CBL ring along with Tx commands.  The common structure
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
 *	used for both Tx and non-Tx commands is the Command Block (CB).
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
 *	cb_to_use is the next CB to use for queuing a command; cb_to_clean
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
 *	is the next CB to check for completion; cb_to_send is the first
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
 *	CB to start on in case of a previous failure to resume.  CB clean
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
 *	up happens in interrupt context in response to a CU interrupt.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
 *	cbs_avail keeps track of number of free CB resources available.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
 * 	Hardware padding of short packets to minimum packet size is
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
 * 	enabled.  82557 pads with 7Eh, while the later controllers pad
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
 * 	with 00h.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
 *	IV.  Receive
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
 *	The Receive Frame Area (RFA) comprises a ring of Receive Frame
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
 *	Descriptors (RFD) + data buffer, thus forming the simplified mode
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
 *	memory structure.  Rx skbs are allocated to contain both the RFD
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
 *	and the data buffer, but the RFD is pulled off before the skb is
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
 *	indicated.  The data buffer is aligned such that encapsulated
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
 *	protocol headers are u32-aligned.  Since the RFD is part of the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
 *	mapped shared memory, and completion status is contained within
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
 *	the RFD, the RFD must be dma_sync'ed to maintain a consistent
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
 *	view from software and hardware.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
 *	In order to keep updates to the RFD link field from colliding with
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
 *	hardware writes to mark packets complete, we use the feature that
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
 *	hardware will not write to a size 0 descriptor and mark the previous
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
 *	packet as end-of-list (EL).   After updating the link, we remove EL
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
 *	and only then restore the size such that hardware may use the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
 *	previous-to-end RFD.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
 *	Under typical operation, the  receive unit (RU) is start once,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
 *	and the controller happily fills RFDs as frames arrive.  If
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
 *	replacement RFDs cannot be allocated, or the RU goes non-active,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
 *	the RU must be restarted.  Frame arrival generates an interrupt,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
 *	and Rx indication and re-allocation happen in the same context,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
 *	therefore no locking is required.  A software-generated interrupt
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
 *	is generated from the watchdog to recover from a failed allocation
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
 *	scenario where all Rx resources have been indicated and none re-
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
 *	placed.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
 *	V.   Miscellaneous
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
 * 	VLAN offloading of tagging, stripping and filtering is not
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
 * 	supported, but driver will accommodate the extra 4-byte VLAN tag
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
 * 	for processing by upper layers.  Tx/Rx Checksum offloading is not
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
 * 	supported.  Tx Scatter/Gather is not supported.  Jumbo Frames is
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
 * 	not supported (hardware limitation).
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
 * 	MagicPacket(tm) WoL support is enabled/disabled via ethtool.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
 * 	Thanks to JC (jchapman@katalix.com) for helping with
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
 * 	testing/troubleshooting the development driver.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
 * 	TODO:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
 * 	o several entry points race with dev->close
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
 * 	o check for tx-no-resources/stop Q races with tx clean/wake Q
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
 *	FIXES:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
 * 2005/12/02 - Michael O'Donnell <Michael.ODonnell at stratus dot com>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
 *	- Stratus87247: protect MDI control register manipulations
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
#include <linux/module.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
#include <linux/moduleparam.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
#include <linux/kernel.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
#include <linux/types.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
#include <linux/slab.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
#include <linux/delay.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
#include <linux/init.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
#include <linux/pci.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
#include <linux/dma-mapping.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
#include <linux/netdevice.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
#include <linux/etherdevice.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
#include <linux/mii.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
#include <linux/if_vlan.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
#include <linux/skbuff.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
#include <linux/ethtool.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
#include <linux/string.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
#include <asm/unaligned.h>
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
#define DRV_NAME		"e100"
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
#define DRV_EXT			"-NAPI"
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
#define DRV_VERSION		"3.5.23-k4"DRV_EXT
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
#define DRV_DESCRIPTION		"Intel(R) PRO/100 Network Driver"
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
#define DRV_COPYRIGHT		"Copyright(c) 1999-2006 Intel Corporation"
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
#define PFX			DRV_NAME ": "
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
#define E100_WATCHDOG_PERIOD	(2 * HZ)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
#define E100_NAPI_WEIGHT	16
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
MODULE_DESCRIPTION(DRV_DESCRIPTION);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
MODULE_AUTHOR(DRV_COPYRIGHT);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
MODULE_LICENSE("GPL");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
MODULE_VERSION(DRV_VERSION);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
static int debug = 3;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
static int eeprom_bad_csum_allow = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
static int use_io = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
module_param(debug, int, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
module_param(eeprom_bad_csum_allow, int, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
module_param(use_io, int, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
MODULE_PARM_DESC(use_io, "Force use of i/o access mode");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
#define DPRINTK(nlevel, klevel, fmt, args...) \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
	(void)((NETIF_MSG_##nlevel & nic->msg_enable) && \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
	printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		__FUNCTION__ , ## args))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
#define INTEL_8255X_ETHERNET_DEVICE(device_id, ich) {\
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	PCI_VENDOR_ID_INTEL, device_id, PCI_ANY_ID, PCI_ANY_ID, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	PCI_CLASS_NETWORK_ETHERNET << 8, 0xFFFF00, ich }
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
static struct pci_device_id e100_id_table[] = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	INTEL_8255X_ETHERNET_DEVICE(0x1029, 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	INTEL_8255X_ETHERNET_DEVICE(0x1030, 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	INTEL_8255X_ETHERNET_DEVICE(0x1031, 3),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	INTEL_8255X_ETHERNET_DEVICE(0x1032, 3),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	INTEL_8255X_ETHERNET_DEVICE(0x1033, 3),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	INTEL_8255X_ETHERNET_DEVICE(0x1034, 3),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	INTEL_8255X_ETHERNET_DEVICE(0x1038, 3),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	INTEL_8255X_ETHERNET_DEVICE(0x1039, 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	INTEL_8255X_ETHERNET_DEVICE(0x103A, 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	INTEL_8255X_ETHERNET_DEVICE(0x103B, 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	INTEL_8255X_ETHERNET_DEVICE(0x103C, 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	INTEL_8255X_ETHERNET_DEVICE(0x103D, 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	INTEL_8255X_ETHERNET_DEVICE(0x103E, 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	INTEL_8255X_ETHERNET_DEVICE(0x1050, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	INTEL_8255X_ETHERNET_DEVICE(0x1051, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	INTEL_8255X_ETHERNET_DEVICE(0x1052, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	INTEL_8255X_ETHERNET_DEVICE(0x1067, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	INTEL_8255X_ETHERNET_DEVICE(0x1068, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	{ 0, }
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
MODULE_DEVICE_TABLE(pci, e100_id_table);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
enum mac {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	mac_82557_D100_A  = 0,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	mac_82557_D100_B  = 1,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	mac_82557_D100_C  = 2,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	mac_82558_D101_A4 = 4,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	mac_82558_D101_B0 = 5,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	mac_82559_D101M   = 8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	mac_82559_D101S   = 9,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	mac_82550_D102    = 12,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	mac_82550_D102_C  = 13,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	mac_82551_E       = 14,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	mac_82551_F       = 15,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	mac_82551_10      = 16,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	mac_unknown       = 0xFF,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
enum phy {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	phy_100a     = 0x000003E0,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	phy_100c     = 0x035002A8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	phy_82555_tx = 0x015002A8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	phy_nsc_tx   = 0x5C002000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	phy_82562_et = 0x033002A8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	phy_82562_em = 0x032002A8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	phy_82562_ek = 0x031002A8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	phy_82562_eh = 0x017002A8,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	phy_unknown  = 0xFFFFFFFF,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
/* CSR (Control/Status Registers) */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
struct csr {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	struct {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
		u8 status;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
		u8 stat_ack;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
		u8 cmd_lo;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
		u8 cmd_hi;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
		u32 gen_ptr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	} scb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	u32 port;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	u16 flash_ctrl;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	u8 eeprom_ctrl_lo;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	u8 eeprom_ctrl_hi;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	u32 mdi_ctrl;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	u32 rx_dma_count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
enum scb_status {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	rus_no_res       = 0x08,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	rus_ready        = 0x10,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	rus_mask         = 0x3C,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
enum ru_state  {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	RU_SUSPENDED = 0,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	RU_RUNNING	 = 1,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	RU_UNINITIALIZED = -1,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
enum scb_stat_ack {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	stat_ack_not_ours    = 0x00,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	stat_ack_sw_gen      = 0x04,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	stat_ack_rnr         = 0x10,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	stat_ack_cu_idle     = 0x20,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	stat_ack_frame_rx    = 0x40,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	stat_ack_cu_cmd_done = 0x80,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	stat_ack_not_present = 0xFF,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
enum scb_cmd_hi {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	irq_mask_none = 0x00,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	irq_mask_all  = 0x01,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	irq_sw_gen    = 0x02,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
enum scb_cmd_lo {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	cuc_nop        = 0x00,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	ruc_start      = 0x01,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	ruc_load_base  = 0x06,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	cuc_start      = 0x10,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	cuc_resume     = 0x20,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	cuc_dump_addr  = 0x40,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	cuc_dump_stats = 0x50,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	cuc_load_base  = 0x60,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	cuc_dump_reset = 0x70,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
enum cuc_dump {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	cuc_dump_complete       = 0x0000A005,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	cuc_dump_reset_complete = 0x0000A007,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
enum port {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	software_reset  = 0x0000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	selftest        = 0x0001,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	selective_reset = 0x0002,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
enum eeprom_ctrl_lo {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	eesk = 0x01,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	eecs = 0x02,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	eedi = 0x04,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	eedo = 0x08,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
enum mdi_ctrl {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	mdi_write = 0x04000000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	mdi_read  = 0x08000000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	mdi_ready = 0x10000000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
enum eeprom_op {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	op_write = 0x05,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	op_read  = 0x06,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	op_ewds  = 0x10,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	op_ewen  = 0x13,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
enum eeprom_offsets {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	eeprom_cnfg_mdix  = 0x03,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	eeprom_id         = 0x0A,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	eeprom_config_asf = 0x0D,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	eeprom_smbus_addr = 0x90,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
enum eeprom_cnfg_mdix {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	eeprom_mdix_enabled = 0x0080,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
enum eeprom_id {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	eeprom_id_wol = 0x0020,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
enum eeprom_config_asf {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	eeprom_asf = 0x8000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	eeprom_gcl = 0x4000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
enum cb_status {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	cb_complete = 0x8000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	cb_ok       = 0x2000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
enum cb_command {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	cb_nop    = 0x0000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	cb_iaaddr = 0x0001,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	cb_config = 0x0002,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	cb_multi  = 0x0003,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	cb_tx     = 0x0004,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	cb_ucode  = 0x0005,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	cb_dump   = 0x0006,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	cb_tx_sf  = 0x0008,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	cb_cid    = 0x1f00,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	cb_i      = 0x2000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	cb_s      = 0x4000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	cb_el     = 0x8000,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
struct rfd {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	__le16 status;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	__le16 command;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	__le32 link;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	__le32 rbd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	__le16 actual_size;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	__le16 size;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
struct rx {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	struct rx *next, *prev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	struct sk_buff *skb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	dma_addr_t dma_addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
#if defined(__BIG_ENDIAN_BITFIELD)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
#define X(a,b)	b,a
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
#else
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
#define X(a,b)	a,b
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
#endif
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
struct config {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
/*0*/	u8 X(byte_count:6, pad0:2);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
/*1*/	u8 X(X(rx_fifo_limit:4, tx_fifo_limit:3), pad1:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
/*2*/	u8 adaptive_ifs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
/*3*/	u8 X(X(X(X(mwi_enable:1, type_enable:1), read_align_enable:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	   term_write_cache_line:1), pad3:4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
/*4*/	u8 X(rx_dma_max_count:7, pad4:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
/*5*/	u8 X(tx_dma_max_count:7, dma_max_count_enable:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
/*6*/	u8 X(X(X(X(X(X(X(late_scb_update:1, direct_rx_dma:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	   tno_intr:1), cna_intr:1), standard_tcb:1), standard_stat_counter:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	   rx_discard_overruns:1), rx_save_bad_frames:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
/*7*/	u8 X(X(X(X(X(rx_discard_short_frames:1, tx_underrun_retry:2),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	   pad7:2), rx_extended_rfd:1), tx_two_frames_in_fifo:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	   tx_dynamic_tbd:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
/*8*/	u8 X(X(mii_mode:1, pad8:6), csma_disabled:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
/*9*/	u8 X(X(X(X(X(rx_tcpudp_checksum:1, pad9:3), vlan_arp_tco:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	   link_status_wake:1), arp_wake:1), mcmatch_wake:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
/*10*/	u8 X(X(X(pad10:3, no_source_addr_insertion:1), preamble_length:2),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	   loopback:2);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
/*11*/	u8 X(linear_priority:3, pad11:5);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
/*12*/	u8 X(X(linear_priority_mode:1, pad12:3), ifs:4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
/*13*/	u8 ip_addr_lo;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
/*14*/	u8 ip_addr_hi;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
/*15*/	u8 X(X(X(X(X(X(X(promiscuous_mode:1, broadcast_disabled:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	   wait_after_win:1), pad15_1:1), ignore_ul_bit:1), crc_16_bit:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	   pad15_2:1), crs_or_cdt:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
/*16*/	u8 fc_delay_lo;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
/*17*/	u8 fc_delay_hi;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
/*18*/	u8 X(X(X(X(X(rx_stripping:1, tx_padding:1), rx_crc_transfer:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	   rx_long_ok:1), fc_priority_threshold:3), pad18:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
/*19*/	u8 X(X(X(X(X(X(X(addr_wake:1, magic_packet_disable:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	   fc_disable:1), fc_restop:1), fc_restart:1), fc_reject:1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	   full_duplex_force:1), full_duplex_pin:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
/*20*/	u8 X(X(X(pad20_1:5, fc_priority_location:1), multi_ia:1), pad20_2:1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
/*21*/	u8 X(X(pad21_1:3, multicast_all:1), pad21_2:4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
/*22*/	u8 X(X(rx_d102_mode:1, rx_vlan_drop:1), pad22:6);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	u8 pad_d102[9];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
#define E100_MAX_MULTICAST_ADDRS	64
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
struct multi {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	__le16 count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	u8 addr[E100_MAX_MULTICAST_ADDRS * ETH_ALEN + 2/*pad*/];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
/* Important: keep total struct u32-aligned */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
#define UCODE_SIZE			134
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
struct cb {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	__le16 status;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	__le16 command;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	__le32 link;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	union {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
		u8 iaaddr[ETH_ALEN];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
		__le32 ucode[UCODE_SIZE];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
		struct config config;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
		struct multi multi;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
		struct {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
			u32 tbd_array;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
			u16 tcb_byte_count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
			u8 threshold;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
			u8 tbd_count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
			struct {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
				__le32 buf_addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
				__le16 size;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
				u16 eol;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
			} tbd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
		} tcb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		__le32 dump_buffer_addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	} u;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	struct cb *next, *prev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	dma_addr_t dma_addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	struct sk_buff *skb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
enum loopback {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	lb_none = 0, lb_mac = 1, lb_phy = 3,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
struct stats {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	__le32 tx_good_frames, tx_max_collisions, tx_late_collisions,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
		tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
		tx_multiple_collisions, tx_total_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	__le32 rx_good_frames, rx_crc_errors, rx_alignment_errors,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
		rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
		rx_short_frame_errors;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	__le32 fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	__le16 xmt_tco_frames, rcv_tco_frames;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	__le32 complete;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
struct mem {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	struct {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
		u32 signature;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
		u32 result;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	} selftest;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	struct stats stats;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	u8 dump_buf[596];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
struct param_range {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	u32 min;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	u32 max;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	u32 count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
struct params {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
	struct param_range rfds;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	struct param_range cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
struct nic {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	/* Begin: frequently used values: keep adjacent for cache effect */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	u32 msg_enable				____cacheline_aligned;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	struct net_device *netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
	struct pci_dev *pdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	struct rx *rxs				____cacheline_aligned;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	struct rx *rx_to_use;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	struct rx *rx_to_clean;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	struct rfd blank_rfd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	enum ru_state ru_running;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	spinlock_t cb_lock			____cacheline_aligned;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
	spinlock_t cmd_lock;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	struct csr __iomem *csr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	enum scb_cmd_lo cuc_cmd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
	unsigned int cbs_avail;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	struct napi_struct napi;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	struct cb *cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	struct cb *cb_to_use;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	struct cb *cb_to_send;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	struct cb *cb_to_clean;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	__le16 tx_command;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	/* End: frequently used values: keep adjacent for cache effect */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	enum {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		ich                = (1 << 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
		promiscuous        = (1 << 1),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		multicast_all      = (1 << 2),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		wol_magic          = (1 << 3),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		ich_10h_workaround = (1 << 4),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	} flags					____cacheline_aligned;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	enum mac mac;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	enum phy phy;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	struct params params;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	struct timer_list watchdog;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	struct timer_list blink_timer;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	struct mii_if_info mii;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	struct work_struct tx_timeout_task;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	enum loopback loopback;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	struct mem *mem;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	dma_addr_t dma_addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	dma_addr_t cbs_dma_addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	u8 adaptive_ifs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	u8 tx_threshold;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	u32 tx_frames;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	u32 tx_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	u32 tx_deferred;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	u32 tx_single_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	u32 tx_multiple_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	u32 tx_fc_pause;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	u32 tx_tco_frames;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	u32 rx_fc_pause;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	u32 rx_fc_unsupported;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	u32 rx_tco_frames;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	u32 rx_over_length_errors;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	u16 leds;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	u16 eeprom_wc;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	__le16 eeprom[256];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	spinlock_t mdio_lock;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
static inline void e100_write_flush(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	/* Flush previous PCI writes through intermediate bridges
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	 * by doing a benign read */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	(void)ioread8(&nic->csr->scb.status);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
static void e100_enable_irq(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	unsigned long flags;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	spin_lock_irqsave(&nic->cmd_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	iowrite8(irq_mask_none, &nic->csr->scb.cmd_hi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	e100_write_flush(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	spin_unlock_irqrestore(&nic->cmd_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
static void e100_disable_irq(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	unsigned long flags;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	spin_lock_irqsave(&nic->cmd_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
	iowrite8(irq_mask_all, &nic->csr->scb.cmd_hi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	e100_write_flush(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	spin_unlock_irqrestore(&nic->cmd_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
static void e100_hw_reset(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	/* Put CU and RU into idle with a selective reset to get
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	 * device off of PCI bus */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	iowrite32(selective_reset, &nic->csr->port);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	e100_write_flush(nic); udelay(20);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	/* Now fully reset device */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	iowrite32(software_reset, &nic->csr->port);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	e100_write_flush(nic); udelay(20);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	/* Mask off our interrupt line - it's unmasked after reset */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	e100_disable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
static int e100_self_test(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	u32 dma_addr = nic->dma_addr + offsetof(struct mem, selftest);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	/* Passing the self-test is a pretty good indication
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	 * that the device can DMA to/from host memory */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
	nic->mem->selftest.signature = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	nic->mem->selftest.result = 0xFFFFFFFF;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	iowrite32(selftest | dma_addr, &nic->csr->port);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	e100_write_flush(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	/* Wait 10 msec for self-test to complete */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	msleep(10);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	/* Interrupts are enabled after self-test */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	e100_disable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	/* Check results of self-test */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	if(nic->mem->selftest.result != 0) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
		DPRINTK(HW, ERR, "Self-test failed: result=0x%08X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
			nic->mem->selftest.result);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
		return -ETIMEDOUT;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	if(nic->mem->selftest.signature == 0) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
		DPRINTK(HW, ERR, "Self-test failed: timed out\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
		return -ETIMEDOUT;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
static void e100_eeprom_write(struct nic *nic, u16 addr_len, u16 addr, __le16 data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	u32 cmd_addr_data[3];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	u8 ctrl;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	int i, j;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	/* Three cmds: write/erase enable, write data, write/erase disable */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	cmd_addr_data[0] = op_ewen << (addr_len - 2);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) |
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
		le16_to_cpu(data);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	cmd_addr_data[2] = op_ewds << (addr_len - 2);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	/* Bit-bang cmds to write word to eeprom */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	for(j = 0; j < 3; j++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
		/* Chip select */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
		iowrite8(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
		for(i = 31; i >= 0; i--) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
			ctrl = (cmd_addr_data[j] & (1 << i)) ?
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
				eecs | eedi : eecs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
			iowrite8(ctrl, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
			e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
			iowrite8(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
			e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		/* Wait 10 msec for cmd to complete */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		msleep(10);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		/* Chip deselect */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
		iowrite8(0, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
		e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
/* General technique stolen from the eepro100 driver - very clever */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
static __le16 e100_eeprom_read(struct nic *nic, u16 *addr_len, u16 addr)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	u32 cmd_addr_data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
	u16 data = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	u8 ctrl;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	int i;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	cmd_addr_data = ((op_read << *addr_len) | addr) << 16;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	/* Chip select */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	iowrite8(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	/* Bit-bang to read word from eeprom */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	for(i = 31; i >= 0; i--) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
		ctrl = (cmd_addr_data & (1 << i)) ? eecs | eedi : eecs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
		iowrite8(ctrl, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
		e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
		iowrite8(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
		/* Eeprom drives a dummy zero to EEDO after receiving
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		 * complete address.  Use this to adjust addr_len. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		ctrl = ioread8(&nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		if(!(ctrl & eedo) && i > 16) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
			*addr_len -= (i - 16);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
			i = 17;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		data = (data << 1) | (ctrl & eedo ? 1 : 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	/* Chip deselect */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	iowrite8(0, &nic->csr->eeprom_ctrl_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	e100_write_flush(nic); udelay(4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	return cpu_to_le16(data);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
/* Load entire EEPROM image into driver cache and validate checksum */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
static int e100_eeprom_load(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	u16 addr, addr_len = 8, checksum = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	/* Try reading with an 8-bit addr len to discover actual addr len */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	e100_eeprom_read(nic, &addr_len, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	nic->eeprom_wc = 1 << addr_len;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	for(addr = 0; addr < nic->eeprom_wc; addr++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		nic->eeprom[addr] = e100_eeprom_read(nic, &addr_len, addr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
		if(addr < nic->eeprom_wc - 1)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
			checksum += le16_to_cpu(nic->eeprom[addr]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	/* The checksum, stored in the last word, is calculated such that
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	 * the sum of words should be 0xBABA */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	if (cpu_to_le16(0xBABA - checksum) != nic->eeprom[nic->eeprom_wc - 1]) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		DPRINTK(PROBE, ERR, "EEPROM corrupted\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		if (!eeprom_bad_csum_allow)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
			return -EAGAIN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
/* Save (portion of) driver EEPROM cache to device and update checksum */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
static int e100_eeprom_save(struct nic *nic, u16 start, u16 count)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	u16 addr, addr_len = 8, checksum = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	/* Try reading with an 8-bit addr len to discover actual addr len */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	e100_eeprom_read(nic, &addr_len, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	nic->eeprom_wc = 1 << addr_len;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	if(start + count >= nic->eeprom_wc)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		return -EINVAL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	for(addr = start; addr < start + count; addr++)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		e100_eeprom_write(nic, addr_len, addr, nic->eeprom[addr]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	/* The checksum, stored in the last word, is calculated such that
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	 * the sum of words should be 0xBABA */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	for(addr = 0; addr < nic->eeprom_wc - 1; addr++)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
		checksum += le16_to_cpu(nic->eeprom[addr]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	nic->eeprom[nic->eeprom_wc - 1] = cpu_to_le16(0xBABA - checksum);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		nic->eeprom[nic->eeprom_wc - 1]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
#define E100_WAIT_SCB_TIMEOUT 20000 /* we might have to wait 100ms!!! */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
#define E100_WAIT_SCB_FAST 20       /* delay like the old code */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
static int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	unsigned long flags;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	unsigned int i;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	int err = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	spin_lock_irqsave(&nic->cmd_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	/* Previous command is accepted when SCB clears */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	for(i = 0; i < E100_WAIT_SCB_TIMEOUT; i++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
		if(likely(!ioread8(&nic->csr->scb.cmd_lo)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
		cpu_relax();
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
		if(unlikely(i > E100_WAIT_SCB_FAST))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
			udelay(5);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	if(unlikely(i == E100_WAIT_SCB_TIMEOUT)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
		err = -EAGAIN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
		goto err_unlock;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	if(unlikely(cmd != cuc_resume))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
		iowrite32(dma_addr, &nic->csr->scb.gen_ptr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	iowrite8(cmd, &nic->csr->scb.cmd_lo);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
err_unlock:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	spin_unlock_irqrestore(&nic->cmd_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
static int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	struct cb *cb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	unsigned long flags;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	int err = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	spin_lock_irqsave(&nic->cb_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
	if(unlikely(!nic->cbs_avail)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		err = -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
		goto err_unlock;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
	cb = nic->cb_to_use;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	nic->cb_to_use = cb->next;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	nic->cbs_avail--;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	cb->skb = skb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	if(unlikely(!nic->cbs_avail))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		err = -ENOSPC;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	cb_prepare(nic, cb, skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	/* Order is important otherwise we'll be in a race with h/w:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	 * set S-bit in current first, then clear S-bit in previous. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	cb->command |= cpu_to_le16(cb_s);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	wmb();
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	cb->prev->command &= cpu_to_le16(~cb_s);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	while(nic->cb_to_send != nic->cb_to_use) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		if(unlikely(e100_exec_cmd(nic, nic->cuc_cmd,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
			nic->cb_to_send->dma_addr))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
			/* Ok, here's where things get sticky.  It's
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
			 * possible that we can't schedule the command
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
			 * because the controller is too busy, so
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			 * let's just queue the command and try again
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
			 * when another command is scheduled. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
			if(err == -ENOSPC) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
				//request a reset
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
				schedule_work(&nic->tx_timeout_task);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
			}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
		} else {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			nic->cuc_cmd = cuc_resume;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
			nic->cb_to_send = nic->cb_to_send->next;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
err_unlock:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	spin_unlock_irqrestore(&nic->cb_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
static u16 mdio_ctrl(struct nic *nic, u32 addr, u32 dir, u32 reg, u16 data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	u32 data_out = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	unsigned int i;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	unsigned long flags;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
	/*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	 * Stratus87247: we shouldn't be writing the MDI control
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	 * register until the Ready bit shows True.  Also, since
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	 * manipulation of the MDI control registers is a multi-step
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	 * procedure it should be done under lock.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	spin_lock_irqsave(&nic->mdio_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	for (i = 100; i; --i) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
		if (ioread32(&nic->csr->mdi_ctrl) & mdi_ready)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
			break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
		udelay(20);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	if (unlikely(!i)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
		printk("e100.mdio_ctrl(%s) won't go Ready\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
			nic->netdev->name );
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
		spin_unlock_irqrestore(&nic->mdio_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
		return 0;		/* No way to indicate timeout error */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	iowrite32((reg << 16) | (addr << 21) | dir | data, &nic->csr->mdi_ctrl);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	for (i = 0; i < 100; i++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
		udelay(20);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
		if ((data_out = ioread32(&nic->csr->mdi_ctrl)) & mdi_ready)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
			break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	spin_unlock_irqrestore(&nic->mdio_lock, flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	DPRINTK(HW, DEBUG,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
		"%s:addr=%d, reg=%d, data_in=0x%04X, data_out=0x%04X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
		dir == mdi_read ? "READ" : "WRITE", addr, reg, data, data_out);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	return (u16)data_out;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
static int mdio_read(struct net_device *netdev, int addr, int reg)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	return mdio_ctrl(netdev_priv(netdev), addr, mdi_read, reg, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	mdio_ctrl(netdev_priv(netdev), addr, mdi_write, reg, data);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
static void e100_get_defaults(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	struct param_range rfds = { .min = 16, .max = 256, .count = 256 };
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	struct param_range cbs  = { .min = 64, .max = 256, .count = 128 };
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	/* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	nic->mac = (nic->flags & ich) ? mac_82559_D101M : nic->pdev->revision;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	if(nic->mac == mac_unknown)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		nic->mac = mac_82557_D100_A;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	nic->params.rfds = rfds;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	nic->params.cbs = cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	/* Quadwords to DMA into FIFO before starting frame transmit */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	nic->tx_threshold = 0xE0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	/* no interrupt for every tx completion, delay = 256us if not 557 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	nic->tx_command = cpu_to_le16(cb_tx | cb_tx_sf |
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
		((nic->mac >= mac_82558_D101_A4) ? cb_cid : cb_i));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	/* Template for a freshly allocated RFD */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	nic->blank_rfd.command = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	nic->blank_rfd.rbd = cpu_to_le32(0xFFFFFFFF);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	/* MII setup */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	nic->mii.phy_id_mask = 0x1F;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	nic->mii.reg_num_mask = 0x1F;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	nic->mii.dev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	nic->mii.mdio_read = mdio_read;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	nic->mii.mdio_write = mdio_write;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	struct config *config = &cb->u.config;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	u8 *c = (u8 *)config;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	cb->command = cpu_to_le16(cb_config);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
	memset(config, 0, sizeof(struct config));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	config->byte_count = 0x16;		/* bytes in this struct */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	config->rx_fifo_limit = 0x8;		/* bytes in FIFO before DMA */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	config->direct_rx_dma = 0x1;		/* reserved */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	config->standard_tcb = 0x1;		/* 1=standard, 0=extended */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	config->standard_stat_counter = 0x1;	/* 1=standard, 0=extended */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	config->rx_discard_short_frames = 0x1;	/* 1=discard, 0=pass */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	config->tx_underrun_retry = 0x3;	/* # of underrun retries */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
	config->mii_mode = 0x1;			/* 1=MII mode, 0=503 mode */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	config->pad10 = 0x6;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	config->no_source_addr_insertion = 0x1;	/* 1=no, 0=yes */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	config->preamble_length = 0x2;		/* 0=1, 1=3, 2=7, 3=15 bytes */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	config->ifs = 0x6;			/* x16 = inter frame spacing */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	config->ip_addr_hi = 0xF2;		/* ARP IP filter - not used */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	config->pad15_1 = 0x1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	config->pad15_2 = 0x1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	config->crs_or_cdt = 0x0;		/* 0=CRS only, 1=CRS or CDT */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	config->fc_delay_hi = 0x40;		/* time delay for fc frame */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	config->tx_padding = 0x1;		/* 1=pad short frames */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	config->fc_priority_threshold = 0x7;	/* 7=priority fc disabled */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	config->pad18 = 0x1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	config->full_duplex_pin = 0x1;		/* 1=examine FDX# pin */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	config->pad20_1 = 0x1F;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	config->fc_priority_location = 0x1;	/* 1=byte#31, 0=byte#19 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	config->pad21_1 = 0x5;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
	config->adaptive_ifs = nic->adaptive_ifs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	config->loopback = nic->loopback;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	if(nic->mii.force_media && nic->mii.full_duplex)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
		config->full_duplex_force = 0x1;	/* 1=force, 0=auto */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	if(nic->flags & promiscuous || nic->loopback) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
		config->rx_save_bad_frames = 0x1;	/* 1=save, 0=discard */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
		config->rx_discard_short_frames = 0x0;	/* 1=discard, 0=save */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
		config->promiscuous_mode = 0x1;		/* 1=on, 0=off */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	if(nic->flags & multicast_all)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
		config->multicast_all = 0x1;		/* 1=accept, 0=no */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	/* disable WoL when up */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	if(netif_running(nic->netdev) || !(nic->flags & wol_magic))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
		config->magic_packet_disable = 0x1;	/* 1=off, 0=on */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	if(nic->mac >= mac_82558_D101_A4) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
		config->fc_disable = 0x1;	/* 1=Tx fc off, 0=Tx fc on */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
		config->mwi_enable = 0x1;	/* 1=enable, 0=disable */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
		config->standard_tcb = 0x0;	/* 1=standard, 0=extended */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		config->rx_long_ok = 0x1;	/* 1=VLANs ok, 0=standard */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		if (nic->mac >= mac_82559_D101M) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
			config->tno_intr = 0x1;		/* TCO stats enable */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
			/* Enable TCO in extended config */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
			if (nic->mac >= mac_82551_10) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
				config->byte_count = 0x20; /* extended bytes */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
				config->rx_d102_mode = 0x1; /* GMRC for TCO */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
			}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
		} else {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
			config->standard_stat_counter = 0x0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	DPRINTK(HW, DEBUG, "[00-07]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
		c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	DPRINTK(HW, DEBUG, "[08-15]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
		c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	DPRINTK(HW, DEBUG, "[16-23]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
		c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
/********************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
/*  Micro code for 8086:1229 Rev 8                      */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
/********************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
/*  Parameter values for the D101M B-step  */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
#define D101M_CPUSAVER_TIMER_DWORD		78
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
#define D101M_CPUSAVER_BUNDLE_DWORD		65
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
#define D101M_CPUSAVER_MIN_SIZE_DWORD		126
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
#define D101M_B_RCVBUNDLE_UCODE \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
{\
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
0x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
0x000C0001, 0x00101312, 0x000C0008, 0x00380216, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
0x0010009C, 0x00204056, 0x002380CC, 0x00380056, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
0x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
0x00380438, 0x00000000, 0x00140000, 0x00380555, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
0x00308000, 0x00100662, 0x00100561, 0x000E0408, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
0x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
0x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
0x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
0x003A0437, 0x00044010, 0x0038078A, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
0x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
0x00130824, 0x000C0001, 0x00101213, 0x00260C75, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
0x00041000, 0x00010004, 0x00130826, 0x000C0006, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
0x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
0x00101210, 0x00380C34, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
0x0021155B, 0x00100099, 0x00206559, 0x0010009C, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
0x00244559, 0x00130836, 0x000C0000, 0x00220C62, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
0x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
0x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
0x00214C0E, 0x00380555, 0x00010004, 0x00041000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
0x00278C67, 0x00040800, 0x00018100, 0x003A0437, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
0x00130826, 0x000C0001, 0x00220559, 0x00101313, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
0x00380559, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
0x00000000, 0x00130831, 0x0010090B, 0x00124813, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
0x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
0x003806A8, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
/********************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
/*  Micro code for 8086:1229 Rev 9                      */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
/********************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
/*  Parameter values for the D101S  */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
#define D101S_CPUSAVER_TIMER_DWORD		78
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
#define D101S_CPUSAVER_BUNDLE_DWORD		67
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
#define D101S_CPUSAVER_MIN_SIZE_DWORD		128
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
#define D101S_RCVBUNDLE_UCODE \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
{\
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
0x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
0x000C0001, 0x00101312, 0x000C0008, 0x00380243, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
0x0010009C, 0x00204056, 0x002380D0, 0x00380056, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
0x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
0x0038047F, 0x00000000, 0x00140000, 0x003805A3, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
0x00308000, 0x00100610, 0x00100561, 0x000E0408, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
0x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
0x00380F90, 0x00080000, 0x00103090, 0x00380F90, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
0x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
0x003A047E, 0x00044010, 0x00380819, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
0x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
0x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
0x00101213, 0x00260FF7, 0x00041000, 0x00010004, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
0x00130826, 0x000C0006, 0x00220700, 0x0013C926, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
0x00101313, 0x00380700, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
0x00101210, 0x00380FB6, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
0x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
0x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
0x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
0x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
0x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
0x00010004, 0x00041000, 0x00278FE9, 0x00040800, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
0x00018100, 0x003A047E, 0x00130826, 0x000C0001, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
0x002205A7, 0x00101313, 0x003805A7, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
0x00000000, 0x00000000, 0x00000000, 0x00130831, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
0x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
0x00041000, 0x00010004, 0x00380700  \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
/********************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
/*  Micro code for the 8086:1229 Rev F/10               */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
/********************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
/*  Parameter values for the D102 E-step  */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
#define D102_E_CPUSAVER_TIMER_DWORD		42
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
#define D102_E_CPUSAVER_BUNDLE_DWORD		54
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
#define D102_E_CPUSAVER_MIN_SIZE_DWORD		46
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
#define     D102_E_RCVBUNDLE_UCODE \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
{\
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
0x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x0EF70E36, 0x1FFF1FFF, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
0x00E014B9, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
0x00E014BD, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
0x00E014D5, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
0x00E014C1, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
0x00E014C8, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
0x00200600, 0x00E014EE, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
0x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
0x00E00E43, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
0x00300006, 0x00E014FB, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
0x00906EFD, 0x00900EFD, 0x00E00EF8, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
static void e100_setup_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
/* *INDENT-OFF* */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	static struct {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
		u32 ucode[UCODE_SIZE + 1];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
		u8 mac;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
		u8 timer_dword;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
		u8 bundle_dword;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		u8 min_size_dword;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	} ucode_opts[] = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
		{ D101M_B_RCVBUNDLE_UCODE,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		  mac_82559_D101M,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
		  D101M_CPUSAVER_TIMER_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		  D101M_CPUSAVER_BUNDLE_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
		  D101M_CPUSAVER_MIN_SIZE_DWORD },
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
		{ D101S_RCVBUNDLE_UCODE,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
		  mac_82559_D101S,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
		  D101S_CPUSAVER_TIMER_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
		  D101S_CPUSAVER_BUNDLE_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
		  D101S_CPUSAVER_MIN_SIZE_DWORD },
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
		{ D102_E_RCVBUNDLE_UCODE,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
		  mac_82551_F,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
		  D102_E_CPUSAVER_TIMER_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		  D102_E_CPUSAVER_BUNDLE_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
		  D102_E_CPUSAVER_MIN_SIZE_DWORD },
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
		{ D102_E_RCVBUNDLE_UCODE,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
		  mac_82551_10,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
		  D102_E_CPUSAVER_TIMER_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
		  D102_E_CPUSAVER_BUNDLE_DWORD,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
		  D102_E_CPUSAVER_MIN_SIZE_DWORD },
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
		{ {0}, 0, 0, 0, 0}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	}, *opts;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
/* *INDENT-ON* */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
/*************************************************************************
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
*  CPUSaver parameters
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
*  All CPUSaver parameters are 16-bit literals that are part of a
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
*  "move immediate value" instruction.  By changing the value of
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
*  the literal in the instruction before the code is loaded, the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
*  driver can change the algorithm.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
*  INTDELAY - This loads the dead-man timer with its initial value.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
*    When this timer expires the interrupt is asserted, and the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
*    timer is reset each time a new packet is received.  (see
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
*    BUNDLEMAX below to set the limit on number of chained packets)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
*    The current default is 0x600 or 1536.  Experiments show that
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
*    the value should probably stay within the 0x200 - 0x1000.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
*  BUNDLEMAX -
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
*    This sets the maximum number of frames that will be bundled.  In
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
*    some situations, such as the TCP windowing algorithm, it may be
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
*    better to limit the growth of the bundle size than let it go as
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
*    high as it can, because that could cause too much added latency.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
*    The default is six, because this is the number of packets in the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
*    default TCP window size.  A value of 1 would make CPUSaver indicate
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
*    an interrupt for every frame received.  If you do not want to put
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
*    a limit on the bundle size, set this value to xFFFF.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
*  BUNDLESMALL -
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
*    This contains a bit-mask describing the minimum size frame that
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
*    will be bundled.  The default masks the lower 7 bits, which means
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
*    that any frame less than 128 bytes in length will not be bundled,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
*    but will instead immediately generate an interrupt.  This does
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
*    not affect the current bundle in any way.  Any frame that is 128
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
*    bytes or large will be bundled normally.  This feature is meant
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
*    to provide immediate indication of ACK frames in a TCP environment.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
*    Customers were seeing poor performance when a machine with CPUSaver
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
*    enabled was sending but not receiving.  The delay introduced when
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
*    the ACKs were received was enough to reduce total throughput, because
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
*    the sender would sit idle until the ACK was finally seen.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
*
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
*    The current default is 0xFF80, which masks out the lower 7 bits.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
*    This means that any frame which is x7F (127) bytes or smaller
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
*    will cause an immediate interrupt.  Because this value must be a
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
*    bit mask, there are only a few valid values that can be used.  To
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
*    turn this feature off, the driver can write the value xFFFF to the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
*    lower word of this instruction (in the same way that the other
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
*    parameters are used).  Likewise, a value of 0xF800 (2047) would
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
*    cause an interrupt to be generated for every frame, because all
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
*    standard Ethernet frames are <= 2047 bytes in length.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
*************************************************************************/
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
/* if you wish to disable the ucode functionality, while maintaining the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
 * workarounds it provides, set the following defines to:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
 * BUNDLESMALL 0
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
 * BUNDLEMAX 1
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
 * INTDELAY 1
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
#define BUNDLESMALL 1
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
#define BUNDLEMAX (u16)6
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
#define INTDELAY (u16)1536 /* 0x600 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
	/* do not load u-code for ICH devices */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
	if (nic->flags & ich)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		goto noloaducode;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	/* Search for ucode match against h/w revision */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	for (opts = ucode_opts; opts->mac; opts++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		int i;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
		u32 *ucode = opts->ucode;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		if (nic->mac != opts->mac)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
			continue;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		/* Insert user-tunable settings */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		ucode[opts->timer_dword] &= 0xFFFF0000;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		ucode[opts->timer_dword] |= INTDELAY;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
		ucode[opts->bundle_dword] &= 0xFFFF0000;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
		ucode[opts->bundle_dword] |= BUNDLEMAX;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		ucode[opts->min_size_dword] &= 0xFFFF0000;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
		ucode[opts->min_size_dword] |= (BUNDLESMALL) ? 0xFFFF : 0xFF80;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
		for (i = 0; i < UCODE_SIZE; i++)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
			cb->u.ucode[i] = cpu_to_le32(ucode[i]);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
		cb->command = cpu_to_le16(cb_ucode | cb_el);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
		return;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
noloaducode:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	cb->command = cpu_to_le16(cb_nop | cb_el);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
static inline int e100_exec_cb_wait(struct nic *nic, struct sk_buff *skb,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	int err = 0, counter = 50;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	struct cb *cb = nic->cb_to_clean;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	if ((err = e100_exec_cb(nic, NULL, e100_setup_ucode)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		DPRINTK(PROBE,ERR, "ucode cmd failed with error %d\n", err);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	/* must restart cuc */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	nic->cuc_cmd = cuc_start;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
	/* wait for completion */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
	e100_write_flush(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
	udelay(10);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	/* wait for possibly (ouch) 500ms */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	while (!(cb->status & cpu_to_le16(cb_complete))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		msleep(10);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		if (!--counter) break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
	/* ack any interrupts, something could have been set */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	iowrite8(~0, &nic->csr->scb.stat_ack);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	/* if the command failed, or is not OK, notify and return */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
	if (!counter || !(cb->status & cpu_to_le16(cb_ok))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		DPRINTK(PROBE,ERR, "ucode load failed\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		err = -EPERM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
	struct sk_buff *skb)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
	cb->command = cpu_to_le16(cb_iaaddr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
	memcpy(cb->u.iaaddr, nic->netdev->dev_addr, ETH_ALEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
static void e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
	cb->command = cpu_to_le16(cb_dump);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	cb->u.dump_buffer_addr = cpu_to_le32(nic->dma_addr +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		offsetof(struct mem, dump_buf));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
#define NCONFIG_AUTO_SWITCH	0x0080
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
#define MII_NSC_CONG		MII_RESV1
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
#define NSC_CONG_ENABLE		0x0100
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
#define NSC_CONG_TXREADY	0x0400
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
#define ADVERTISE_FC_SUPPORTED	0x0400
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
static int e100_phy_init(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
	struct net_device *netdev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	u32 addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	u16 bmcr, stat, id_lo, id_hi, cong;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	/* Discover phy addr by searching addrs in order {1,0,2,..., 31} */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	for(addr = 0; addr < 32; addr++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		nic->mii.phy_id = (addr == 0) ? 1 : (addr == 1) ? 0 : addr;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
		bmcr = mdio_read(netdev, nic->mii.phy_id, MII_BMCR);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		if(!((bmcr == 0xFFFF) || ((stat == 0) && (bmcr == 0))))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
			break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	if(addr == 32)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		return -EAGAIN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	/* Selected the phy and isolate the rest */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
	for(addr = 0; addr < 32; addr++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		if(addr != nic->mii.phy_id) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
			mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		} else {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
			bmcr = mdio_read(netdev, addr, MII_BMCR);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
			mdio_write(netdev, addr, MII_BMCR,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
				bmcr & ~BMCR_ISOLATE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	/* Get phy ID */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	nic->phy = (u32)id_hi << 16 | (u32)id_lo;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	/* Handle National tx phys */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
#define NCS_PHY_MODEL_MASK	0xFFF0FFFF
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	if((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		/* Disable congestion control */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		cong = mdio_read(netdev, nic->mii.phy_id, MII_NSC_CONG);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		cong |= NSC_CONG_TXREADY;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		cong &= ~NSC_CONG_ENABLE;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
		mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	if((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		!(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		/* enable/disable MDI/MDI-X auto-switching. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
				nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
static int e100_hw_init(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	int err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
	e100_hw_reset(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	DPRINTK(HW, ERR, "e100_hw_init\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	if(!in_interrupt() && (err = e100_self_test(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
	if((err = e100_phy_init(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	if((err = e100_exec_cmd(nic, cuc_load_base, 0)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	if((err = e100_exec_cmd(nic, ruc_load_base, 0)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	if ((err = e100_exec_cb_wait(nic, NULL, e100_setup_ucode)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	if((err = e100_exec_cb(nic, NULL, e100_configure)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	if((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	if((err = e100_exec_cmd(nic, cuc_dump_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		nic->dma_addr + offsetof(struct mem, stats))))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	if((err = e100_exec_cmd(nic, cuc_dump_reset, 0)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	e100_disable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	struct net_device *netdev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	struct dev_mc_list *list = netdev->mc_list;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	u16 i, count = min(netdev->mc_count, E100_MAX_MULTICAST_ADDRS);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	cb->command = cpu_to_le16(cb_multi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	for(i = 0; list && i < count; i++, list = list->next)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		memcpy(&cb->u.multi.addr[i*ETH_ALEN], &list->dmi_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
			ETH_ALEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
static void e100_set_multicast_list(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	DPRINTK(HW, DEBUG, "mc_count=%d, flags=0x%04X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		netdev->mc_count, netdev->flags);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
	if(netdev->flags & IFF_PROMISC)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		nic->flags |= promiscuous;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
	else
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		nic->flags &= ~promiscuous;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	if(netdev->flags & IFF_ALLMULTI ||
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		netdev->mc_count > E100_MAX_MULTICAST_ADDRS)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		nic->flags |= multicast_all;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	else
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		nic->flags &= ~multicast_all;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
	e100_exec_cb(nic, NULL, e100_configure);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
	e100_exec_cb(nic, NULL, e100_multi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
static void e100_update_stats(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	struct net_device *dev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	struct net_device_stats *ns = &dev->stats;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	struct stats *s = &nic->mem->stats;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	__le32 *complete = (nic->mac < mac_82558_D101_A4) ? &s->fc_xmt_pause :
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		(nic->mac < mac_82559_D101M) ? (__le32 *)&s->xmt_tco_frames :
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		&s->complete;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	/* Device's stats reporting may take several microseconds to
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	 * complete, so we're always waiting for results of the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	 * previous command. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	if(*complete == cpu_to_le32(cuc_dump_reset_complete)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		*complete = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		nic->tx_frames = le32_to_cpu(s->tx_good_frames);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
		nic->tx_collisions = le32_to_cpu(s->tx_total_collisions);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		ns->tx_aborted_errors += le32_to_cpu(s->tx_max_collisions);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		ns->tx_window_errors += le32_to_cpu(s->tx_late_collisions);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		ns->tx_carrier_errors += le32_to_cpu(s->tx_lost_crs);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		ns->tx_fifo_errors += le32_to_cpu(s->tx_underruns);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		ns->collisions += nic->tx_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
			le32_to_cpu(s->tx_lost_crs);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
			nic->rx_over_length_errors;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		ns->rx_missed_errors += le32_to_cpu(s->rx_resource_errors);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
			le32_to_cpu(s->rx_alignment_errors) +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
			le32_to_cpu(s->rx_short_frame_errors) +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
			le32_to_cpu(s->rx_cdt_errors);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		nic->tx_deferred += le32_to_cpu(s->tx_deferred);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		nic->tx_single_collisions +=
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
			le32_to_cpu(s->tx_single_collisions);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		nic->tx_multiple_collisions +=
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
			le32_to_cpu(s->tx_multiple_collisions);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		if(nic->mac >= mac_82558_D101_A4) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
			nic->tx_fc_pause += le32_to_cpu(s->fc_xmt_pause);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
			nic->rx_fc_pause += le32_to_cpu(s->fc_rcv_pause);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
			nic->rx_fc_unsupported +=
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
				le32_to_cpu(s->fc_rcv_unsupported);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
			if(nic->mac >= mac_82559_D101M) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
				nic->tx_tco_frames +=
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
					le16_to_cpu(s->xmt_tco_frames);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
				nic->rx_tco_frames +=
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
					le16_to_cpu(s->rcv_tco_frames);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
			}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	if(e100_exec_cmd(nic, cuc_dump_reset, 0))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		DPRINTK(TX_ERR, DEBUG, "exec cuc_dump_reset failed\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
	/* Adjust inter-frame-spacing (IFS) between two transmits if
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
	 * we're getting collisions on a half-duplex connection. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
	if(duplex == DUPLEX_HALF) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		u32 prev = nic->adaptive_ifs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		u32 min_frames = (speed == SPEED_100) ? 1000 : 100;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		if((nic->tx_frames / 32 < nic->tx_collisions) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		   (nic->tx_frames > min_frames)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
			if(nic->adaptive_ifs < 60)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
				nic->adaptive_ifs += 5;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		} else if (nic->tx_frames < min_frames) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
			if(nic->adaptive_ifs >= 5)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
				nic->adaptive_ifs -= 5;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		if(nic->adaptive_ifs != prev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
			e100_exec_cb(nic, NULL, e100_configure);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
static void e100_watchdog(unsigned long data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
	struct nic *nic = (struct nic *)data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	struct ethtool_cmd cmd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
	DPRINTK(TIMER, DEBUG, "right now = %ld\n", jiffies);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
	/* mii library handles link maintenance tasks */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
	mii_ethtool_gset(&nic->mii, &cmd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
	if(mii_link_ok(&nic->mii) && !netif_carrier_ok(nic->netdev)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		DPRINTK(LINK, INFO, "link up, %sMbps, %s-duplex\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
			cmd.speed == SPEED_100 ? "100" : "10",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			cmd.duplex == DUPLEX_FULL ? "full" : "half");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
	} else if(!mii_link_ok(&nic->mii) && netif_carrier_ok(nic->netdev)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		DPRINTK(LINK, INFO, "link down\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	mii_check_link(&nic->mii);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	/* Software generated interrupt to recover from (rare) Rx
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
	 * allocation failure.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
	 * Unfortunately have to use a spinlock to not re-enable interrupts
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	 * accidentally, due to hardware that shares a register between the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
	 * interrupt mask bit and the SW Interrupt generation bit */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	spin_lock_irq(&nic->cmd_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	iowrite8(ioread8(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	e100_write_flush(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	spin_unlock_irq(&nic->cmd_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	e100_update_stats(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	if(nic->mac <= mac_82557_D100_C)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
		/* Issue a multicast command to workaround a 557 lock up */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
		e100_set_multicast_list(nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	if(nic->flags & ich && cmd.speed==SPEED_10 && cmd.duplex==DUPLEX_HALF)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		/* Need SW workaround for ICH[x] 10Mbps/half duplex Tx hang. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		nic->flags |= ich_10h_workaround;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	else
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
		nic->flags &= ~ich_10h_workaround;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	mod_timer(&nic->watchdog,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
		  round_jiffies(jiffies + E100_WATCHDOG_PERIOD));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
static void e100_xmit_prepare(struct nic *nic, struct cb *cb,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	struct sk_buff *skb)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	cb->command = nic->tx_command;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	/* interrupt every 16 packets regardless of delay */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	if((nic->cbs_avail & ~15) == nic->cbs_avail)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		cb->command |= cpu_to_le16(cb_i);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	cb->u.tcb.tcb_byte_count = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
	cb->u.tcb.threshold = nic->tx_threshold;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	cb->u.tcb.tbd_count = 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		skb->data, skb->len, PCI_DMA_TODEVICE));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
	/* check for mapping failure? */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	cb->u.tcb.tbd.size = cpu_to_le16(skb->len);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	int err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
	if(nic->flags & ich_10h_workaround) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
		/* SW workaround for ICH[x] 10Mbps/half duplex Tx hang.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		   Issue a NOP command followed by a 1us delay before
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		   issuing the Tx command. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		if(e100_exec_cmd(nic, cuc_nop, 0))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
			DPRINTK(TX_ERR, DEBUG, "exec cuc_nop failed\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		udelay(1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	err = e100_exec_cb(nic, skb, e100_xmit_prepare);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	switch(err) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	case -ENOSPC:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		/* We queued the skb, but now we're out of space. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		DPRINTK(TX_ERR, DEBUG, "No space for CB\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		netif_stop_queue(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	case -ENOMEM:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		/* This is a hard error - log it. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		DPRINTK(TX_ERR, DEBUG, "Out of Tx resources, returning skb\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		netif_stop_queue(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		return 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	netdev->trans_start = jiffies;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
static int e100_tx_clean(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	struct net_device *dev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	struct cb *cb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	int tx_cleaned = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	spin_lock(&nic->cb_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	/* Clean CBs marked complete */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	for(cb = nic->cb_to_clean;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	    cb->status & cpu_to_le16(cb_complete);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	    cb = nic->cb_to_clean = cb->next) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		DPRINTK(TX_DONE, DEBUG, "cb[%d]->status = 0x%04X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
		        (int)(((void*)cb - (void*)nic->cbs)/sizeof(struct cb)),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		        cb->status);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		if(likely(cb->skb != NULL)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
			dev->stats.tx_packets++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
			dev->stats.tx_bytes += cb->skb->len;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
			pci_unmap_single(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
				le32_to_cpu(cb->u.tcb.tbd.buf_addr),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
				le16_to_cpu(cb->u.tcb.tbd.size),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
				PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
			dev_kfree_skb_any(cb->skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
			cb->skb = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
			tx_cleaned = 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		cb->status = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		nic->cbs_avail++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	spin_unlock(&nic->cb_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	/* Recover from running out of Tx resources in xmit_frame */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	if(unlikely(tx_cleaned && netif_queue_stopped(nic->netdev)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		netif_wake_queue(nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	return tx_cleaned;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
static void e100_clean_cbs(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	if(nic->cbs) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		while(nic->cbs_avail != nic->params.cbs.count) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
			struct cb *cb = nic->cb_to_clean;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
			if(cb->skb) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
				pci_unmap_single(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
					le32_to_cpu(cb->u.tcb.tbd.buf_addr),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
					le16_to_cpu(cb->u.tcb.tbd.size),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
					PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
				dev_kfree_skb(cb->skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
			}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
			nic->cb_to_clean = nic->cb_to_clean->next;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
			nic->cbs_avail++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		pci_free_consistent(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
			sizeof(struct cb) * nic->params.cbs.count,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
			nic->cbs, nic->cbs_dma_addr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		nic->cbs = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		nic->cbs_avail = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	nic->cuc_cmd = cuc_start;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean =
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		nic->cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
static int e100_alloc_cbs(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	struct cb *cb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	unsigned int i, count = nic->params.cbs.count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	nic->cuc_cmd = cuc_start;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
	nic->cbs_avail = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	nic->cbs = pci_alloc_consistent(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		sizeof(struct cb) * count, &nic->cbs_dma_addr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	if(!nic->cbs)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		return -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	for(cb = nic->cbs, i = 0; i < count; cb++, i++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
		cb->next = (i + 1 < count) ? cb + 1 : nic->cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		cb->prev = (i == 0) ? nic->cbs + count - 1 : cb - 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		cb->link = cpu_to_le32(nic->cbs_dma_addr +
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
			((i+1) % count) * sizeof(struct cb));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
		cb->skb = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	nic->cbs_avail = count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	if(!nic->rxs) return;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	if(RU_SUSPENDED != nic->ru_running) return;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	/* handle init time starts */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	if(!rx) rx = nic->rxs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	/* (Re)start RU if suspended or idle and RFA is non-NULL */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	if(rx->skb) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		e100_exec_cmd(nic, ruc_start, rx->dma_addr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		nic->ru_running = RU_RUNNING;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	if(!(rx->skb = netdev_alloc_skb(nic->netdev, RFD_BUF_LEN + NET_IP_ALIGN)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		return -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	/* Align, init, and map the RFD. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	skb_reserve(rx->skb, NET_IP_ALIGN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	skb_copy_to_linear_data(rx->skb, &nic->blank_rfd, sizeof(struct rfd));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	if (pci_dma_mapping_error(nic->pdev, rx->dma_addr)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		dev_kfree_skb_any(rx->skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		rx->skb = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		rx->dma_addr = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		return -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	/* Link the RFD to end of RFA by linking previous RFD to
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	 * this one.  We are safe to touch the previous RFD because
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	 * it is protected by the before last buffer's el bit being set */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	if (rx->prev->skb) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
		put_unaligned_le32(rx->dma_addr, &prev_rfd->link);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
			sizeof(struct rfd), PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
static int e100_rx_indicate(struct nic *nic, struct rx *rx,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
	unsigned int *work_done, unsigned int work_to_do)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	struct net_device *dev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	struct sk_buff *skb = rx->skb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	struct rfd *rfd = (struct rfd *)skb->data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	u16 rfd_status, actual_size;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	if(unlikely(work_done && *work_done >= work_to_do))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		return -EAGAIN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	/* Need to sync before taking a peek at cb_complete bit */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		sizeof(struct rfd), PCI_DMA_FROMDEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
	rfd_status = le16_to_cpu(rfd->status);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
	DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	/* If data isn't ready, nothing to indicate */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
	if (unlikely(!(rfd_status & cb_complete))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		/* If the next buffer has the el bit, but we think the receiver
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		 * is still running, check to see if it really stopped while
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		 * we had interrupts off.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		 * This allows for a fast restart without re-enabling
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		 * interrupts */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		if ((le16_to_cpu(rfd->command) & cb_el) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		    (RU_RUNNING == nic->ru_running))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
			if (ioread8(&nic->csr->scb.status) & rus_no_res)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
				nic->ru_running = RU_SUSPENDED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
					       sizeof(struct rfd),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
					       PCI_DMA_BIDIRECTIONAL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		return -ENODATA;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	/* Get actual data size */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
	actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	if(unlikely(actual_size > RFD_BUF_LEN - sizeof(struct rfd)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		actual_size = RFD_BUF_LEN - sizeof(struct rfd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
	/* Get data */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
	pci_unmap_single(nic->pdev, rx->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
	/* If this buffer has the el bit, but we think the receiver
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
	 * is still running, check to see if it really stopped while
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	 * we had interrupts off.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
	 * This allows for a fast restart without re-enabling interrupts.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
	 * This can happen when the RU sees the size change but also sees
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	 * the el bit set. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	if ((le16_to_cpu(rfd->command) & cb_el) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
	    (RU_RUNNING == nic->ru_running)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
	    if (ioread8(&nic->csr->scb.status) & rus_no_res)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		nic->ru_running = RU_SUSPENDED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	/* Pull off the RFD and put the actual data (minus eth hdr) */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	skb_reserve(skb, sizeof(struct rfd));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	skb_put(skb, actual_size);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	skb->protocol = eth_type_trans(skb, nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	if(unlikely(!(rfd_status & cb_ok))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		/* Don't indicate if hardware indicates errors */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		dev_kfree_skb_any(skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
	} else if(actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		/* Don't indicate oversized frames */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		nic->rx_over_length_errors++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		dev_kfree_skb_any(skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	} else {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		dev->stats.rx_packets++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		dev->stats.rx_bytes += actual_size;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		nic->netdev->last_rx = jiffies;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		netif_receive_skb(skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		if(work_done)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
			(*work_done)++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
	rx->skb = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
	unsigned int work_to_do)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	struct rx *rx;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	int restart_required = 0, err = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	struct rx *old_before_last_rx, *new_before_last_rx;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
	struct rfd *old_before_last_rfd, *new_before_last_rfd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
	/* Indicate newly arrived packets */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	for(rx = nic->rx_to_clean; rx->skb; rx = nic->rx_to_clean = rx->next) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		err = e100_rx_indicate(nic, rx, work_done, work_to_do);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		/* Hit quota or no more to clean */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		if (-EAGAIN == err || -ENODATA == err)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
			break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	/* On EAGAIN, hit quota so have more work to do, restart once
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	 * cleanup is complete.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	 * Else, are we already rnr? then pay attention!!! this ensures that
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
	 * the state machine progression never allows a start with a
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	 * partially cleaned list, avoiding a race between hardware
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
	 * and rx_to_clean when in NAPI mode */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
	if (-EAGAIN != err && RU_SUSPENDED == nic->ru_running)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		restart_required = 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	old_before_last_rx = nic->rx_to_use->prev->prev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	old_before_last_rfd = (struct rfd *)old_before_last_rx->skb->data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	/* Alloc new skbs to refill list */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	for(rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		if(unlikely(e100_rx_alloc_skb(nic, rx)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
			break; /* Better luck next time (see watchdog) */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	new_before_last_rx = nic->rx_to_use->prev->prev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
	if (new_before_last_rx != old_before_last_rx) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		/* Set the el-bit on the buffer that is before the last buffer.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		 * This lets us update the next pointer on the last buffer
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		 * without worrying about hardware touching it.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		 * We set the size to 0 to prevent hardware from touching this
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		 * buffer.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		 * When the hardware hits the before last buffer with el-bit
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		 * and size of 0, it will RNR interrupt, the RUS will go into
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		 * the No Resources state.  It will not complete nor write to
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		 * this buffer. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		new_before_last_rfd =
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
			(struct rfd *)new_before_last_rx->skb->data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		new_before_last_rfd->size = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		new_before_last_rfd->command |= cpu_to_le16(cb_el);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		pci_dma_sync_single_for_device(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
			new_before_last_rx->dma_addr, sizeof(struct rfd),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
			PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		/* Now that we have a new stopping point, we can clear the old
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		 * stopping point.  We must sync twice to get the proper
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		 * ordering on the hardware side of things. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		old_before_last_rfd->command &= ~cpu_to_le16(cb_el);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		pci_dma_sync_single_for_device(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
			old_before_last_rx->dma_addr, sizeof(struct rfd),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
			PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		pci_dma_sync_single_for_device(nic->pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
			old_before_last_rx->dma_addr, sizeof(struct rfd),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
			PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	if(restart_required) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		// ack the rnr?
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		iowrite8(stat_ack_rnr, &nic->csr->scb.stat_ack);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		e100_start_receiver(nic, nic->rx_to_clean);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		if(work_done)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
			(*work_done)++;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
static void e100_rx_clean_list(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	struct rx *rx;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	unsigned int i, count = nic->params.rfds.count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	nic->ru_running = RU_UNINITIALIZED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	if(nic->rxs) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
			if(rx->skb) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
				pci_unmap_single(nic->pdev, rx->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
					RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
				dev_kfree_skb(rx->skb);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
			}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		kfree(nic->rxs);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		nic->rxs = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	nic->rx_to_use = nic->rx_to_clean = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
static int e100_rx_alloc_list(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
	struct rx *rx;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
	unsigned int i, count = nic->params.rfds.count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	struct rfd *before_last;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	nic->rx_to_use = nic->rx_to_clean = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	nic->ru_running = RU_UNINITIALIZED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	if(!(nic->rxs = kcalloc(count, sizeof(struct rx), GFP_ATOMIC)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		return -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		rx->next = (i + 1 < count) ? rx + 1 : nic->rxs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		rx->prev = (i == 0) ? nic->rxs + count - 1 : rx - 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		if(e100_rx_alloc_skb(nic, rx)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
			e100_rx_clean_list(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
			return -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	/* Set the el-bit on the buffer that is before the last buffer.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	 * This lets us update the next pointer on the last buffer without
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	 * worrying about hardware touching it.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	 * We set the size to 0 to prevent hardware from touching this buffer.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	 * When the hardware hits the before last buffer with el-bit and size
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	 * of 0, it will RNR interrupt, the RU will go into the No Resources
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	 * state.  It will not complete nor write to this buffer. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	rx = nic->rxs->prev->prev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	before_last = (struct rfd *)rx->skb->data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
	before_last->command |= cpu_to_le16(cb_el);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	before_last->size = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
	pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		sizeof(struct rfd), PCI_DMA_TODEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	nic->rx_to_use = nic->rx_to_clean = nic->rxs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	nic->ru_running = RU_SUSPENDED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
static irqreturn_t e100_intr(int irq, void *dev_id)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	struct net_device *netdev = dev_id;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
	u8 stat_ack = ioread8(&nic->csr->scb.stat_ack);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
	DPRINTK(INTR, DEBUG, "stat_ack = 0x%02X\n", stat_ack);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	if(stat_ack == stat_ack_not_ours ||	/* Not our interrupt */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	   stat_ack == stat_ack_not_present)	/* Hardware is ejected */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		return IRQ_NONE;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	/* Ack interrupt(s) */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	iowrite8(stat_ack, &nic->csr->scb.stat_ack);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
	/* We hit Receive No Resource (RNR); restart RU after cleaning */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	if(stat_ack & stat_ack_rnr)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		nic->ru_running = RU_SUSPENDED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	if(likely(netif_rx_schedule_prep(netdev, &nic->napi))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		e100_disable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		__netif_rx_schedule(netdev, &nic->napi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	return IRQ_HANDLED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
static int e100_poll(struct napi_struct *napi, int budget)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	struct nic *nic = container_of(napi, struct nic, napi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	struct net_device *netdev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	unsigned int work_done = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
	e100_rx_clean(nic, &work_done, budget);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	e100_tx_clean(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	/* If budget not fully consumed, exit the polling mode */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
	if (work_done < budget) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		netif_rx_complete(netdev, napi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		e100_enable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	return work_done;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
#ifdef CONFIG_NET_POLL_CONTROLLER
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
static void e100_netpoll(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	e100_disable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	e100_intr(nic->pdev->irq, netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
	e100_tx_clean(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	e100_enable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
#endif
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
static int e100_set_mac_address(struct net_device *netdev, void *p)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	struct sockaddr *addr = p;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	if (!is_valid_ether_addr(addr->sa_data))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		return -EADDRNOTAVAIL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
	e100_exec_cb(nic, NULL, e100_setup_iaaddr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
static int e100_change_mtu(struct net_device *netdev, int new_mtu)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	if(new_mtu < ETH_ZLEN || new_mtu > ETH_DATA_LEN)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
		return -EINVAL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	netdev->mtu = new_mtu;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
static int e100_asf(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	/* ASF can be enabled from eeprom */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	   (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	   !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	   ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
static int e100_up(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	int err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	if((err = e100_rx_alloc_list(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	if((err = e100_alloc_cbs(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
		goto err_rx_clean_list;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	if((err = e100_hw_init(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
		goto err_clean_cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	e100_set_multicast_list(nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	e100_start_receiver(nic, NULL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	mod_timer(&nic->watchdog, jiffies);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	if((err = request_irq(nic->pdev->irq, e100_intr, IRQF_SHARED,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
		nic->netdev->name, nic->netdev)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
		goto err_no_irq;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	netif_wake_queue(nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
	napi_enable(&nic->napi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	/* enable ints _after_ enabling poll, preventing a race between
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	 * disable ints+schedule */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	e100_enable_irq(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
err_no_irq:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
	del_timer_sync(&nic->watchdog);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
err_clean_cbs:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
	e100_clean_cbs(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
err_rx_clean_list:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	e100_rx_clean_list(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
static void e100_down(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
	/* wait here for poll to complete */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	napi_disable(&nic->napi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	netif_stop_queue(nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	e100_hw_reset(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	free_irq(nic->pdev->irq, nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	del_timer_sync(&nic->watchdog);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	netif_carrier_off(nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	e100_clean_cbs(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	e100_rx_clean_list(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
static void e100_tx_timeout(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	/* Reset outside of interrupt context, to avoid request_irq
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
	 * in interrupt context */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
	schedule_work(&nic->tx_timeout_task);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
static void e100_tx_timeout_task(struct work_struct *work)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	struct nic *nic = container_of(work, struct nic, tx_timeout_task);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	struct net_device *netdev = nic->netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
		ioread8(&nic->csr->scb.status));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	e100_down(netdev_priv(netdev));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	e100_up(netdev_priv(netdev));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	int err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	struct sk_buff *skb;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	/* Use driver resources to perform internal MAC or PHY
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	 * loopback test.  A single packet is prepared and transmitted
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	 * in loopback mode, and the test passes if the received
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	 * packet compares byte-for-byte to the transmitted packet. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	if((err = e100_rx_alloc_list(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
	if((err = e100_alloc_cbs(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		goto err_clean_rx;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	/* ICH PHY loopback is broken so do MAC loopback instead */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	if(nic->flags & ich && loopback_mode == lb_phy)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		loopback_mode = lb_mac;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	nic->loopback = loopback_mode;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	if((err = e100_hw_init(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		goto err_loopback_none;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
	if(loopback_mode == lb_phy)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
			BMCR_LOOPBACK);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	e100_start_receiver(nic, NULL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	if(!(skb = netdev_alloc_skb(nic->netdev, ETH_DATA_LEN))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		err = -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		goto err_loopback_none;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	skb_put(skb, ETH_DATA_LEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	memset(skb->data, 0xFF, ETH_DATA_LEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	e100_xmit_frame(skb, nic->netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	msleep(10);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
			RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	   skb->data, ETH_DATA_LEN))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		err = -EAGAIN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
err_loopback_none:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
	nic->loopback = lb_none;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	e100_clean_cbs(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	e100_hw_reset(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
err_clean_rx:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	e100_rx_clean_list(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
#define MII_LED_CONTROL	0x1B
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
static void e100_blink_led(unsigned long data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	struct nic *nic = (struct nic *)data;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	enum led_state {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		led_on     = 0x01,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		led_off    = 0x04,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		led_on_559 = 0x05,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		led_on_557 = 0x07,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	nic->leds = (nic->leds & led_on) ? led_off :
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		(nic->mac < mac_82559_D101M) ? led_on_557 : led_on_559;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	mdio_write(nic->netdev, nic->mii.phy_id, MII_LED_CONTROL, nic->leds);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	mod_timer(&nic->blink_timer, jiffies + HZ / 4);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	return mii_ethtool_gset(&nic->mii, cmd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
static int e100_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	int err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	mdio_write(netdev, nic->mii.phy_id, MII_BMCR, BMCR_RESET);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	err = mii_ethtool_sset(&nic->mii, cmd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	e100_exec_cb(nic, NULL, e100_configure);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
static void e100_get_drvinfo(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	struct ethtool_drvinfo *info)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	strcpy(info->driver, DRV_NAME);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	strcpy(info->version, DRV_VERSION);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	strcpy(info->fw_version, "N/A");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	strcpy(info->bus_info, pci_name(nic->pdev));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
#define E100_PHY_REGS 0x1C
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
static int e100_get_regs_len(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	return 1 + E100_PHY_REGS + sizeof(nic->mem->dump_buf);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
static void e100_get_regs(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	struct ethtool_regs *regs, void *p)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
	u32 *buff = p;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	int i;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	regs->version = (1 << 24) | nic->pdev->revision;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	buff[0] = ioread8(&nic->csr->scb.cmd_hi) << 24 |
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		ioread8(&nic->csr->scb.cmd_lo) << 16 |
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		ioread16(&nic->csr->scb.status);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	for(i = E100_PHY_REGS; i >= 0; i--)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		buff[1 + E100_PHY_REGS - i] =
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
			mdio_read(netdev, nic->mii.phy_id, i);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
	memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
	e100_exec_cb(nic, NULL, e100_dump);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
	msleep(10);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		sizeof(nic->mem->dump_buf));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
	wol->supported = (nic->mac >= mac_82558_D101_A4) ?  WAKE_MAGIC : 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	wol->wolopts = (nic->flags & wol_magic) ? WAKE_MAGIC : 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
static int e100_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
	if ((wol->wolopts && wol->wolopts != WAKE_MAGIC) ||
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	    !device_can_wakeup(&nic->pdev->dev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		return -EOPNOTSUPP;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	if(wol->wolopts)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		nic->flags |= wol_magic;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	else
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		nic->flags &= ~wol_magic;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	device_set_wakeup_enable(&nic->pdev->dev, wol->wolopts);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	e100_exec_cb(nic, NULL, e100_configure);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
static u32 e100_get_msglevel(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	return nic->msg_enable;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
static void e100_set_msglevel(struct net_device *netdev, u32 value)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	nic->msg_enable = value;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
static int e100_nway_reset(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	return mii_nway_restart(&nic->mii);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
static u32 e100_get_link(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	return mii_link_ok(&nic->mii);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
static int e100_get_eeprom_len(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	return nic->eeprom_wc << 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
#define E100_EEPROM_MAGIC	0x1234
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
static int e100_get_eeprom(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	struct ethtool_eeprom *eeprom, u8 *bytes)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	eeprom->magic = E100_EEPROM_MAGIC;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	memcpy(bytes, &((u8 *)nic->eeprom)[eeprom->offset], eeprom->len);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
static int e100_set_eeprom(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	struct ethtool_eeprom *eeprom, u8 *bytes)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
	if(eeprom->magic != E100_EEPROM_MAGIC)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		return -EINVAL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	memcpy(&((u8 *)nic->eeprom)[eeprom->offset], bytes, eeprom->len);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
	return e100_eeprom_save(nic, eeprom->offset >> 1,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		(eeprom->len >> 1) + 1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
static void e100_get_ringparam(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	struct ethtool_ringparam *ring)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	struct param_range *rfds = &nic->params.rfds;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	struct param_range *cbs = &nic->params.cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
	ring->rx_max_pending = rfds->max;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
	ring->tx_max_pending = cbs->max;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
	ring->rx_mini_max_pending = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	ring->rx_jumbo_max_pending = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
	ring->rx_pending = rfds->count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	ring->tx_pending = cbs->count;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
	ring->rx_mini_pending = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	ring->rx_jumbo_pending = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
static int e100_set_ringparam(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	struct ethtool_ringparam *ring)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	struct param_range *rfds = &nic->params.rfds;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	struct param_range *cbs = &nic->params.cbs;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		return -EINVAL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	if(netif_running(netdev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		e100_down(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	rfds->count = max(ring->rx_pending, rfds->min);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	rfds->count = min(rfds->count, rfds->max);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	cbs->count = max(ring->tx_pending, cbs->min);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	cbs->count = min(cbs->count, cbs->max);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	DPRINTK(DRV, INFO, "Ring Param settings: rx: %d, tx %d\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	        rfds->count, cbs->count);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	if(netif_running(netdev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		e100_up(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
static const char e100_gstrings_test[][ETH_GSTRING_LEN] = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	"Link test     (on/offline)",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	"Eeprom test   (on/offline)",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	"Self test        (offline)",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	"Mac loopback     (offline)",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	"Phy loopback     (offline)",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
#define E100_TEST_LEN	ARRAY_SIZE(e100_gstrings_test)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
static void e100_diag_test(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	struct ethtool_test *test, u64 *data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
	struct ethtool_cmd cmd;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	int i, err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	memset(data, 0, E100_TEST_LEN * sizeof(u64));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	data[0] = !mii_link_ok(&nic->mii);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	data[1] = e100_eeprom_load(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	if(test->flags & ETH_TEST_FL_OFFLINE) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		/* save speed, duplex & autoneg settings */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		err = mii_ethtool_gset(&nic->mii, &cmd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		if(netif_running(netdev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
			e100_down(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		data[2] = e100_self_test(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		data[3] = e100_loopback_test(nic, lb_mac);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		data[4] = e100_loopback_test(nic, lb_phy);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		/* restore speed, duplex & autoneg settings */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		err = mii_ethtool_sset(&nic->mii, &cmd);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		if(netif_running(netdev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
			e100_up(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	for(i = 0; i < E100_TEST_LEN; i++)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		test->flags |= data[i] ? ETH_TEST_FL_FAILED : 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	msleep_interruptible(4 * 1000);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
static int e100_phys_id(struct net_device *netdev, u32 data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	mod_timer(&nic->blink_timer, jiffies);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	msleep_interruptible(data * 1000);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	del_timer_sync(&nic->blink_timer);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	mdio_write(netdev, nic->mii.phy_id, MII_LED_CONTROL, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
static const char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
	"rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	"tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	"rx_length_errors", "rx_over_errors", "rx_crc_errors",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
	"rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
	"tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	"tx_heartbeat_errors", "tx_window_errors",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
	/* device-specific stats */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
	"tx_deferred", "tx_single_collisions", "tx_multi_collisions",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
	"tx_flow_control_pause", "rx_flow_control_pause",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	"rx_flow_control_unsupported", "tx_tco_packets", "rx_tco_packets",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
#define E100_NET_STATS_LEN	21
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
#define E100_STATS_LEN	ARRAY_SIZE(e100_gstrings_stats)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
static int e100_get_sset_count(struct net_device *netdev, int sset)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	switch (sset) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	case ETH_SS_TEST:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
		return E100_TEST_LEN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	case ETH_SS_STATS:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		return E100_STATS_LEN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	default:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		return -EOPNOTSUPP;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
static void e100_get_ethtool_stats(struct net_device *netdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	struct ethtool_stats *stats, u64 *data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	int i;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
	for(i = 0; i < E100_NET_STATS_LEN; i++)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
		data[i] = ((unsigned long *)&netdev->stats)[i];
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	data[i++] = nic->tx_deferred;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	data[i++] = nic->tx_single_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
	data[i++] = nic->tx_multiple_collisions;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
	data[i++] = nic->tx_fc_pause;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
	data[i++] = nic->rx_fc_pause;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
	data[i++] = nic->rx_fc_unsupported;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	data[i++] = nic->tx_tco_frames;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
	data[i++] = nic->rx_tco_frames;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
static void e100_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
	switch(stringset) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	case ETH_SS_TEST:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
		memcpy(data, *e100_gstrings_test, sizeof(e100_gstrings_test));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
		break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
	case ETH_SS_STATS:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		memcpy(data, *e100_gstrings_stats, sizeof(e100_gstrings_stats));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
		break;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
static const struct ethtool_ops e100_ethtool_ops = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	.get_settings		= e100_get_settings,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	.set_settings		= e100_set_settings,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
	.get_drvinfo		= e100_get_drvinfo,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	.get_regs_len		= e100_get_regs_len,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	.get_regs		= e100_get_regs,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	.get_wol		= e100_get_wol,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	.set_wol		= e100_set_wol,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	.get_msglevel		= e100_get_msglevel,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	.set_msglevel		= e100_set_msglevel,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	.nway_reset		= e100_nway_reset,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	.get_link		= e100_get_link,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	.get_eeprom_len		= e100_get_eeprom_len,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	.get_eeprom		= e100_get_eeprom,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	.set_eeprom		= e100_set_eeprom,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	.get_ringparam		= e100_get_ringparam,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	.set_ringparam		= e100_set_ringparam,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	.self_test		= e100_diag_test,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	.get_strings		= e100_get_strings,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	.phys_id		= e100_phys_id,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	.get_ethtool_stats	= e100_get_ethtool_stats,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	.get_sset_count		= e100_get_sset_count,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
	return generic_mii_ioctl(&nic->mii, if_mii(ifr), cmd, NULL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
static int e100_alloc(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
	nic->mem = pci_alloc_consistent(nic->pdev, sizeof(struct mem),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		&nic->dma_addr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	return nic->mem ? 0 : -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
static void e100_free(struct nic *nic)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	if(nic->mem) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		pci_free_consistent(nic->pdev, sizeof(struct mem),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
			nic->mem, nic->dma_addr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		nic->mem = NULL;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
static int e100_open(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	int err = 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	netif_carrier_off(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	if((err = e100_up(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		DPRINTK(IFUP, ERR, "Cannot open interface, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
static int e100_close(struct net_device *netdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	e100_down(netdev_priv(netdev));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
static int __devinit e100_probe(struct pci_dev *pdev,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
	const struct pci_device_id *ent)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	struct net_device *netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	struct nic *nic;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	int err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	DECLARE_MAC_BUF(mac);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
		if(((1 << debug) - 1) & NETIF_MSG_PROBE)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
		return -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	netdev->open = e100_open;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	netdev->stop = e100_close;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	netdev->hard_start_xmit = e100_xmit_frame;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	netdev->set_multicast_list = e100_set_multicast_list;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	netdev->set_mac_address = e100_set_mac_address;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	netdev->change_mtu = e100_change_mtu;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	netdev->do_ioctl = e100_do_ioctl;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	netdev->tx_timeout = e100_tx_timeout;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
	netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
#ifdef CONFIG_NET_POLL_CONTROLLER
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
	netdev->poll_controller = e100_netpoll;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
#endif
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
	netif_napi_add(netdev, &nic->napi, e100_poll, E100_NAPI_WEIGHT);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	nic->netdev = netdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	nic->pdev = pdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	nic->msg_enable = (1 << debug) - 1;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	pci_set_drvdata(pdev, netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	if((err = pci_enable_device(pdev))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		goto err_out_free_dev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
			"base address, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
		err = -ENODEV;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
		goto err_out_disable_pdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
	if((err = pci_request_regions(pdev, DRV_NAME))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
		goto err_out_disable_pdev;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
		goto err_out_free_res;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	SET_NETDEV_DEV(netdev, &pdev->dev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	if (use_io)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
		DPRINTK(PROBE, INFO, "using i/o access mode\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	nic->csr = pci_iomap(pdev, (use_io ? 1 : 0), sizeof(struct csr));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	if(!nic->csr) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		err = -ENOMEM;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
		goto err_out_free_res;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	if(ent->driver_data)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		nic->flags |= ich;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	else
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
		nic->flags &= ~ich;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	e100_get_defaults(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	/* locks must be initialized before calling hw_reset */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	spin_lock_init(&nic->cb_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	spin_lock_init(&nic->cmd_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	spin_lock_init(&nic->mdio_lock);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	/* Reset the device before pci_set_master() in case device is in some
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	 * funky state and has an interrupt pending - hint: we don't have the
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	 * interrupt handler registered yet. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	e100_hw_reset(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	pci_set_master(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	init_timer(&nic->watchdog);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	nic->watchdog.function = e100_watchdog;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	nic->watchdog.data = (unsigned long)nic;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	init_timer(&nic->blink_timer);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	nic->blink_timer.function = e100_blink_led;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	nic->blink_timer.data = (unsigned long)nic;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	INIT_WORK(&nic->tx_timeout_task, e100_tx_timeout_task);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	if((err = e100_alloc(nic))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
		DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
		goto err_out_iounmap;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	if((err = e100_eeprom_load(nic)))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
		goto err_out_free;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	e100_phy_init(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	if (!is_valid_ether_addr(netdev->perm_addr)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
		if (!eeprom_bad_csum_allow) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
			DPRINTK(PROBE, ERR, "Invalid MAC address from "
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
			        "EEPROM, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
			err = -EAGAIN;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
			goto err_out_free;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		} else {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
			DPRINTK(PROBE, ERR, "Invalid MAC address from EEPROM, "
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
			        "you MUST configure one.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	/* Wol magic packet can be enabled from eeprom */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	if((nic->mac >= mac_82558_D101_A4) &&
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	   (nic->eeprom[eeprom_id] & eeprom_id_wol)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		nic->flags |= wol_magic;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		device_set_wakeup_enable(&pdev->dev, true);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	/* ack any pending wake events, disable PME */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	pci_pme_active(pdev, false);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	strcpy(netdev->name, "eth%d");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	if((err = register_netdev(netdev))) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
		DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		goto err_out_free;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %s\n",
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		(unsigned long long)pci_resource_start(pdev, use_io ? 1 : 0),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
		pdev->irq, print_mac(mac, netdev->dev_addr));
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
err_out_free:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	e100_free(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
err_out_iounmap:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	pci_iounmap(pdev, nic->csr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
err_out_free_res:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	pci_release_regions(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
err_out_disable_pdev:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
	pci_disable_device(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
err_out_free_dev:
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	pci_set_drvdata(pdev, NULL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	free_netdev(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	return err;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
static void __devexit e100_remove(struct pci_dev *pdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	struct net_device *netdev = pci_get_drvdata(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	if(netdev) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
		struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		unregister_netdev(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
		e100_free(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
		pci_iounmap(pdev, nic->csr);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		free_netdev(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
		pci_release_regions(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		pci_disable_device(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
		pci_set_drvdata(pdev, NULL);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	struct net_device *netdev = pci_get_drvdata(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	if (netif_running(netdev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		e100_down(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	netif_device_detach(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	pci_save_state(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	if ((nic->flags & wol_magic) | e100_asf(nic)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
		if (pci_enable_wake(pdev, PCI_D3cold, true))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
			pci_enable_wake(pdev, PCI_D3hot, true);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	} else {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
		pci_enable_wake(pdev, PCI_D3hot, false);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	pci_disable_device(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	pci_set_power_state(pdev, PCI_D3hot);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
#ifdef CONFIG_PM
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
static int e100_resume(struct pci_dev *pdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	struct net_device *netdev = pci_get_drvdata(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	pci_set_power_state(pdev, PCI_D0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	pci_restore_state(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	/* ack any pending wake events, disable PME */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	pci_enable_wake(pdev, 0, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	netif_device_attach(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	if (netif_running(netdev))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		e100_up(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	return 0;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
#endif /* CONFIG_PM */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
static void e100_shutdown(struct pci_dev *pdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	e100_suspend(pdev, PMSG_SUSPEND);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
/* ------------------ PCI Error Recovery infrastructure  -------------- */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
/**
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
 * e100_io_error_detected - called when PCI error is detected.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
 * @pdev: Pointer to PCI device
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
 * @state: The current pci connection state
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
static pci_ers_result_t e100_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	struct net_device *netdev = pci_get_drvdata(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	/* Similar to calling e100_down(), but avoids adapter I/O. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	netdev->stop(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	/* Detach; put netif into a state similar to hotplug unplug. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	napi_enable(&nic->napi);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	netif_device_detach(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	pci_disable_device(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	/* Request a slot reset. */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	return PCI_ERS_RESULT_NEED_RESET;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
/**
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
 * e100_io_slot_reset - called after the pci bus has been reset.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
 * @pdev: Pointer to PCI device
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
 * Restart the card from scratch.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
static pci_ers_result_t e100_io_slot_reset(struct pci_dev *pdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	struct net_device *netdev = pci_get_drvdata(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	if (pci_enable_device(pdev)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
		printk(KERN_ERR "e100: Cannot re-enable PCI device after reset.\n");
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
		return PCI_ERS_RESULT_DISCONNECT;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	pci_set_master(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
	/* Only one device per card can do a reset */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	if (0 != PCI_FUNC(pdev->devfn))
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		return PCI_ERS_RESULT_RECOVERED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	e100_hw_reset(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	e100_phy_init(nic);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	return PCI_ERS_RESULT_RECOVERED;
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
/**
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
 * e100_io_resume - resume normal operations
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
 * @pdev: Pointer to PCI device
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
 *
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
 * Resume normal operations after an error recovery
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
 * sequence has been completed.
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
 */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
static void e100_io_resume(struct pci_dev *pdev)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
	struct net_device *netdev = pci_get_drvdata(pdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	struct nic *nic = netdev_priv(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	/* ack any pending wake events, disable PME */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	pci_enable_wake(pdev, 0, 0);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	netif_device_attach(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
	if (netif_running(netdev)) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
		e100_open(netdev);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
		mod_timer(&nic->watchdog, jiffies);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
static struct pci_error_handlers e100_err_handler = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	.error_detected = e100_io_error_detected,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	.slot_reset = e100_io_slot_reset,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	.resume = e100_io_resume,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
static struct pci_driver e100_driver = {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	.name =         DRV_NAME,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	.id_table =     e100_id_table,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	.probe =        e100_probe,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	.remove =       __devexit_p(e100_remove),
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
#ifdef CONFIG_PM
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	/* Power Management hooks */
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	.suspend =      e100_suspend,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	.resume =       e100_resume,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
#endif
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	.shutdown =     e100_shutdown,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	.err_handler = &e100_err_handler,
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
};
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
static int __init e100_init_module(void)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	if(((1 << debug) - 1) & NETIF_MSG_DRV) {
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
		printk(KERN_INFO PFX "%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
		printk(KERN_INFO PFX "%s\n", DRV_COPYRIGHT);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	return pci_register_driver(&e100_driver);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
static void __exit e100_cleanup_module(void)
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
{
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
	pci_unregister_driver(&e100_driver);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
}
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
module_init(e100_init_module);
f60cf2500bf8 Added e100 driver for 2.6.27.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
module_exit(e100_cleanup_module);