devices/e100-2.6.24-ethercat.c
author Florian Pose <fp@igh-essen.com>
Wed, 02 Jun 2010 22:54:08 +0200
changeset 1939 1ba48f78a0a5
parent 1506 41ca84fb6bb2
child 2421 bc2d4bf9cbe5
child 2589 2b9c78543663
permissions -rw-r--r--
Fixed bug that caused the configuration not to be cleared when reserved but
not activated and then releasing.
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
     5
 *  Copyright (C) 2007-2008  Florian Pose, Ingenieurgemeinschaft IgH
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    11
 *  published by the Free Software Foundation.
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    12
 *
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    16
 *  Public License for more details.
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    17
 *
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1317
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *
1363
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    22
 *  ---
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    23
 *
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    27
 *
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    28
 *  ---
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 *  vim: noexpandtab
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 *****************************************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
/**
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
   \file
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
   EtherCAT driver for e100-compatible NICs.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
*/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
/* Former documentation: */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
/*******************************************************************************
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
  Intel PRO/100 Linux driver
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
  Copyright(c) 1999 - 2006 Intel Corporation.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
  This program is free software; you can redistribute it and/or modify it
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
  under the terms and conditions of the GNU General Public License,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
  version 2, as published by the Free Software Foundation.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
  This program is distributed in the hope it will be useful, but WITHOUT
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
  more details.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
  You should have received a copy of the GNU General Public License along with
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
  this program; if not, write to the Free Software Foundation, Inc.,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
  The full GNU General Public License is included in this distribution in
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
  the file called "COPYING".
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
  Contact Information:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
  Linux NICS <linux.nics@intel.com>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
*******************************************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
/*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
 *	e100.c: Intel(R) PRO/100 ethernet driver
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
 *	(Re)written 2003 by scott.feldman@intel.com.  Based loosely on
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
 *	original e100 driver, but better described as a munging of
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
 *	e100, e1000, eepro100, tg3, 8139cp, and other drivers.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
 *	References:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
 *		Intel 8255x 10/100 Mbps Ethernet Controller Family,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
 *		Open Source Software Developers Manual,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
 *		http://sourceforge.net/projects/e1000
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
 *	                      Theory of Operation
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
 *	I.   General
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
 *	The driver supports Intel(R) 10/100 Mbps PCI Fast Ethernet
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
 *	controller family, which includes the 82557, 82558, 82559, 82550,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
 *	82551, and 82562 devices.  82558 and greater controllers
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
 *	integrate the Intel 82555 PHY.  The controllers are used in
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
 *	server and client network interface cards, as well as in
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
 *	LAN-On-Motherboard (LOM), CardBus, MiniPCI, and ICHx
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
 *	configurations.  8255x supports a 32-bit linear addressing
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
 *	mode and operates at 33Mhz PCI clock rate.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
 *	II.  Driver Operation
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
 *	Memory-mapped mode is used exclusively to access the device's
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
 *	shared-memory structure, the Control/Status Registers (CSR). All
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
 *	setup, configuration, and control of the device, including queuing
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
 *	of Tx, Rx, and configuration commands is through the CSR.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
 *	cmd_lock serializes accesses to the CSR command register.  cb_lock
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
 *	protects the shared Command Block List (CBL).
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
 *	8255x is highly MII-compliant and all access to the PHY go
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
 *	through the Management Data Interface (MDI).  Consequently, the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
 *	driver leverages the mii.c library shared with other MII-compliant
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
 *	devices.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
 *	Big- and Little-Endian byte order as well as 32- and 64-bit
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
 *	archs are supported.  Weak-ordered memory and non-cache-coherent
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
 *	archs are supported.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
 *	III. Transmit
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
 *	A Tx skb is mapped and hangs off of a TCB.  TCBs are linked
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
 *	together in a fixed-size ring (CBL) thus forming the flexible mode
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
 *	memory structure.  A TCB marked with the suspend-bit indicates
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
 *	the end of the ring.  The last TCB processed suspends the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
 *	controller, and the controller can be restarted by issue a CU
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
 *	resume command to continue from the suspend point, or a CU start
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
 *	command to start at a given position in the ring.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
 *	Non-Tx commands (config, multicast setup, etc) are linked
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
 *	into the CBL ring along with Tx commands.  The common structure
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
 *	used for both Tx and non-Tx commands is the Command Block (CB).
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
 *	cb_to_use is the next CB to use for queuing a command; cb_to_clean
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
 *	is the next CB to check for completion; cb_to_send is the first
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
 *	CB to start on in case of a previous failure to resume.  CB clean
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
 *	up happens in interrupt context in response to a CU interrupt.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
 *	cbs_avail keeps track of number of free CB resources available.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
 * 	Hardware padding of short packets to minimum packet size is
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
 * 	enabled.  82557 pads with 7Eh, while the later controllers pad
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
 * 	with 00h.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
 *	IV.  Recieve
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
 *	The Receive Frame Area (RFA) comprises a ring of Receive Frame
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
 *	Descriptors (RFD) + data buffer, thus forming the simplified mode
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
 *	memory structure.  Rx skbs are allocated to contain both the RFD
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
 *	and the data buffer, but the RFD is pulled off before the skb is
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
 *	indicated.  The data buffer is aligned such that encapsulated
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
 *	protocol headers are u32-aligned.  Since the RFD is part of the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
 *	mapped shared memory, and completion status is contained within
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
 *	the RFD, the RFD must be dma_sync'ed to maintain a consistent
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
 *	view from software and hardware.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
 *	Under typical operation, the  receive unit (RU) is start once,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
 *	and the controller happily fills RFDs as frames arrive.  If
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
 *	replacement RFDs cannot be allocated, or the RU goes non-active,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
 *	the RU must be restarted.  Frame arrival generates an interrupt,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
 *	and Rx indication and re-allocation happen in the same context,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
 *	therefore no locking is required.  A software-generated interrupt
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
 *	is generated from the watchdog to recover from a failed allocation
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
 *	senario where all Rx resources have been indicated and none re-
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
 *	placed.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
 *	V.   Miscellaneous
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
 * 	VLAN offloading of tagging, stripping and filtering is not
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
 * 	supported, but driver will accommodate the extra 4-byte VLAN tag
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
 * 	for processing by upper layers.  Tx/Rx Checksum offloading is not
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
 * 	supported.  Tx Scatter/Gather is not supported.  Jumbo Frames is
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
 * 	not supported (hardware limitation).
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
 * 	MagicPacket(tm) WoL support is enabled/disabled via ethtool.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
 * 	Thanks to JC (jchapman@katalix.com) for helping with
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
 * 	testing/troubleshooting the development driver.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
 * 	TODO:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
 * 	o several entry points race with dev->close
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
 * 	o check for tx-no-resources/stop Q races with tx clean/wake Q
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
 *	FIXES:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
 * 2005/12/02 - Michael O'Donnell <Michael.ODonnell at stratus dot com>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
 *	- Stratus87247: protect MDI control register manipulations
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
#include <linux/module.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
#include <linux/moduleparam.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
#include <linux/kernel.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
#include <linux/types.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
#include <linux/slab.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
#include <linux/delay.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
#include <linux/init.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
#include <linux/pci.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
#include <linux/dma-mapping.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
#include <linux/netdevice.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
#include <linux/etherdevice.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
#include <linux/mii.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
#include <linux/if_vlan.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
#include <linux/skbuff.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
#include <linux/ethtool.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
#include <linux/string.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
#include <asm/unaligned.h>
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
// EtherCAT includes
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
#include "../globals.h"
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
#include "ecdev.h"
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
#define DRV_NAME		"ec_e100"
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
#define DRV_EXT			"-NAPI"
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
#define DRV_VERSION		"3.5.23-k4"DRV_EXT
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
#define DRV_DESCRIPTION		"Intel(R) PRO/100 Network Driver"
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
#define DRV_COPYRIGHT		"Copyright(c) 1999-2006 Intel Corporation"
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
#define PFX			DRV_NAME ": "
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
#define E100_WATCHDOG_PERIOD	(2 * HZ)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
#define E100_NAPI_WEIGHT	16
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
MODULE_DESCRIPTION(DRV_DESCRIPTION);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
MODULE_AUTHOR(DRV_COPYRIGHT);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
MODULE_LICENSE("GPL");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
MODULE_VERSION(DRV_VERSION);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
MODULE_DESCRIPTION(DRV_DESCRIPTION);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
MODULE_AUTHOR("Mario Witkowski <mario.witkowski@w4systems.de>");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
MODULE_LICENSE("GPL");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
MODULE_VERSION(DRV_VERSION ", master " EC_MASTER_VERSION);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
void e100_ec_poll(struct net_device *);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
static int debug = 3;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
static int eeprom_bad_csum_allow = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
static int use_io = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
module_param(debug, int, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
module_param(eeprom_bad_csum_allow, int, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
module_param(use_io, int, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
MODULE_PARM_DESC(use_io, "Force use of i/o access mode");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
#define DPRINTK(nlevel, klevel, fmt, args...) \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	(void)((NETIF_MSG_##nlevel & nic->msg_enable) && \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
		__FUNCTION__ , ## args))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
#define INTEL_8255X_ETHERNET_DEVICE(device_id, ich) {\
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	PCI_VENDOR_ID_INTEL, device_id, PCI_ANY_ID, PCI_ANY_ID, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	PCI_CLASS_NETWORK_ETHERNET << 8, 0xFFFF00, ich }
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
static struct pci_device_id e100_id_table[] = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	INTEL_8255X_ETHERNET_DEVICE(0x1029, 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	INTEL_8255X_ETHERNET_DEVICE(0x1030, 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	INTEL_8255X_ETHERNET_DEVICE(0x1031, 3),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	INTEL_8255X_ETHERNET_DEVICE(0x1032, 3),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	INTEL_8255X_ETHERNET_DEVICE(0x1033, 3),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	INTEL_8255X_ETHERNET_DEVICE(0x1034, 3),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	INTEL_8255X_ETHERNET_DEVICE(0x1038, 3),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	INTEL_8255X_ETHERNET_DEVICE(0x1039, 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	INTEL_8255X_ETHERNET_DEVICE(0x103A, 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	INTEL_8255X_ETHERNET_DEVICE(0x103B, 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	INTEL_8255X_ETHERNET_DEVICE(0x103C, 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	INTEL_8255X_ETHERNET_DEVICE(0x103D, 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	INTEL_8255X_ETHERNET_DEVICE(0x103E, 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	INTEL_8255X_ETHERNET_DEVICE(0x1050, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	INTEL_8255X_ETHERNET_DEVICE(0x1051, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	INTEL_8255X_ETHERNET_DEVICE(0x1052, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	INTEL_8255X_ETHERNET_DEVICE(0x1067, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	INTEL_8255X_ETHERNET_DEVICE(0x1068, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	{ 0, }
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
// prevent from being loaded automatically
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
//MODULE_DEVICE_TABLE(pci, e100_id_table);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
enum mac {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	mac_82557_D100_A  = 0,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	mac_82557_D100_B  = 1,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	mac_82557_D100_C  = 2,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	mac_82558_D101_A4 = 4,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	mac_82558_D101_B0 = 5,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	mac_82559_D101M   = 8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	mac_82559_D101S   = 9,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	mac_82550_D102    = 12,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	mac_82550_D102_C  = 13,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	mac_82551_E       = 14,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	mac_82551_F       = 15,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	mac_82551_10      = 16,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	mac_unknown       = 0xFF,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
enum phy {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	phy_100a     = 0x000003E0,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	phy_100c     = 0x035002A8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	phy_82555_tx = 0x015002A8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	phy_nsc_tx   = 0x5C002000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	phy_82562_et = 0x033002A8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	phy_82562_em = 0x032002A8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	phy_82562_ek = 0x031002A8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	phy_82562_eh = 0x017002A8,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	phy_unknown  = 0xFFFFFFFF,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
/* CSR (Control/Status Registers) */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
struct csr {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	struct {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
		u8 status;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
		u8 stat_ack;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
		u8 cmd_lo;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
		u8 cmd_hi;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
		u32 gen_ptr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	} scb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	u32 port;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	u16 flash_ctrl;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	u8 eeprom_ctrl_lo;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	u8 eeprom_ctrl_hi;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	u32 mdi_ctrl;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	u32 rx_dma_count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
enum scb_status {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	rus_ready        = 0x10,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	rus_mask         = 0x3C,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
enum ru_state  {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	RU_SUSPENDED = 0,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	RU_RUNNING	 = 1,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	RU_UNINITIALIZED = -1,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
enum scb_stat_ack {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	stat_ack_not_ours    = 0x00,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	stat_ack_sw_gen      = 0x04,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	stat_ack_rnr         = 0x10,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	stat_ack_cu_idle     = 0x20,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	stat_ack_frame_rx    = 0x40,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	stat_ack_cu_cmd_done = 0x80,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	stat_ack_not_present = 0xFF,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
enum scb_cmd_hi {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	irq_mask_none = 0x00,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	irq_mask_all  = 0x01,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	irq_sw_gen    = 0x02,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
enum scb_cmd_lo {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	cuc_nop        = 0x00,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	ruc_start      = 0x01,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	ruc_load_base  = 0x06,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	cuc_start      = 0x10,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	cuc_resume     = 0x20,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	cuc_dump_addr  = 0x40,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	cuc_dump_stats = 0x50,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	cuc_load_base  = 0x60,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	cuc_dump_reset = 0x70,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
enum cuc_dump {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	cuc_dump_complete       = 0x0000A005,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	cuc_dump_reset_complete = 0x0000A007,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
enum port {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	software_reset  = 0x0000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	selftest        = 0x0001,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	selective_reset = 0x0002,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
enum eeprom_ctrl_lo {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	eesk = 0x01,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	eecs = 0x02,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	eedi = 0x04,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	eedo = 0x08,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
enum mdi_ctrl {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	mdi_write = 0x04000000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	mdi_read  = 0x08000000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	mdi_ready = 0x10000000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
enum eeprom_op {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	op_write = 0x05,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	op_read  = 0x06,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	op_ewds  = 0x10,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	op_ewen  = 0x13,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
enum eeprom_offsets {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	eeprom_cnfg_mdix  = 0x03,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	eeprom_id         = 0x0A,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	eeprom_config_asf = 0x0D,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	eeprom_smbus_addr = 0x90,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
enum eeprom_cnfg_mdix {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	eeprom_mdix_enabled = 0x0080,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
enum eeprom_id {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	eeprom_id_wol = 0x0020,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
enum eeprom_config_asf {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	eeprom_asf = 0x8000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	eeprom_gcl = 0x4000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
enum cb_status {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	cb_complete = 0x8000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	cb_ok       = 0x2000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
enum cb_command {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	cb_nop    = 0x0000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	cb_iaaddr = 0x0001,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	cb_config = 0x0002,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	cb_multi  = 0x0003,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	cb_tx     = 0x0004,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	cb_ucode  = 0x0005,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	cb_dump   = 0x0006,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	cb_tx_sf  = 0x0008,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	cb_cid    = 0x1f00,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	cb_i      = 0x2000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	cb_s      = 0x4000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	cb_el     = 0x8000,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
struct rfd {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	u16 status;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	u16 command;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	u32 link;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	u32 rbd;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	u16 actual_size;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	u16 size;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
struct rx {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	struct rx *next, *prev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	struct sk_buff *skb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	dma_addr_t dma_addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
#if defined(__BIG_ENDIAN_BITFIELD)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
#define X(a,b)	b,a
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
#else
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
#define X(a,b)	a,b
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
#endif
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
struct config {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
/*0*/	u8 X(byte_count:6, pad0:2);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
/*1*/	u8 X(X(rx_fifo_limit:4, tx_fifo_limit:3), pad1:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
/*2*/	u8 adaptive_ifs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
/*3*/	u8 X(X(X(X(mwi_enable:1, type_enable:1), read_align_enable:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	   term_write_cache_line:1), pad3:4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
/*4*/	u8 X(rx_dma_max_count:7, pad4:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
/*5*/	u8 X(tx_dma_max_count:7, dma_max_count_enable:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
/*6*/	u8 X(X(X(X(X(X(X(late_scb_update:1, direct_rx_dma:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	   tno_intr:1), cna_intr:1), standard_tcb:1), standard_stat_counter:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	   rx_discard_overruns:1), rx_save_bad_frames:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
/*7*/	u8 X(X(X(X(X(rx_discard_short_frames:1, tx_underrun_retry:2),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	   pad7:2), rx_extended_rfd:1), tx_two_frames_in_fifo:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	   tx_dynamic_tbd:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
/*8*/	u8 X(X(mii_mode:1, pad8:6), csma_disabled:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
/*9*/	u8 X(X(X(X(X(rx_tcpudp_checksum:1, pad9:3), vlan_arp_tco:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	   link_status_wake:1), arp_wake:1), mcmatch_wake:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
/*10*/	u8 X(X(X(pad10:3, no_source_addr_insertion:1), preamble_length:2),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	   loopback:2);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
/*11*/	u8 X(linear_priority:3, pad11:5);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
/*12*/	u8 X(X(linear_priority_mode:1, pad12:3), ifs:4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
/*13*/	u8 ip_addr_lo;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
/*14*/	u8 ip_addr_hi;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
/*15*/	u8 X(X(X(X(X(X(X(promiscuous_mode:1, broadcast_disabled:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	   wait_after_win:1), pad15_1:1), ignore_ul_bit:1), crc_16_bit:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	   pad15_2:1), crs_or_cdt:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
/*16*/	u8 fc_delay_lo;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
/*17*/	u8 fc_delay_hi;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
/*18*/	u8 X(X(X(X(X(rx_stripping:1, tx_padding:1), rx_crc_transfer:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	   rx_long_ok:1), fc_priority_threshold:3), pad18:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
/*19*/	u8 X(X(X(X(X(X(X(addr_wake:1, magic_packet_disable:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	   fc_disable:1), fc_restop:1), fc_restart:1), fc_reject:1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	   full_duplex_force:1), full_duplex_pin:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
/*20*/	u8 X(X(X(pad20_1:5, fc_priority_location:1), multi_ia:1), pad20_2:1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
/*21*/	u8 X(X(pad21_1:3, multicast_all:1), pad21_2:4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
/*22*/	u8 X(X(rx_d102_mode:1, rx_vlan_drop:1), pad22:6);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	u8 pad_d102[9];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
#define E100_MAX_MULTICAST_ADDRS	64
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
struct multi {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	u16 count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	u8 addr[E100_MAX_MULTICAST_ADDRS * ETH_ALEN + 2/*pad*/];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
/* Important: keep total struct u32-aligned */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
#define UCODE_SIZE			134
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
struct cb {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	u16 status;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	u16 command;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	u32 link;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	union {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
		u8 iaaddr[ETH_ALEN];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
		u32 ucode[UCODE_SIZE];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
		struct config config;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		struct multi multi;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		struct {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
			u32 tbd_array;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
			u16 tcb_byte_count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
			u8 threshold;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
			u8 tbd_count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
			struct {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
				u32 buf_addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
				u16 size;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
				u16 eol;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
			} tbd;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
		} tcb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		u32 dump_buffer_addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	} u;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
	struct cb *next, *prev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	dma_addr_t dma_addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	struct sk_buff *skb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
enum loopback {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	lb_none = 0, lb_mac = 1, lb_phy = 3,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
struct stats {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	u32 tx_good_frames, tx_max_collisions, tx_late_collisions,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		tx_multiple_collisions, tx_total_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	u32 rx_good_frames, rx_crc_errors, rx_alignment_errors,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		rx_short_frame_errors;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	u32 fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	u16 xmt_tco_frames, rcv_tco_frames;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	u32 complete;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
struct mem {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	struct {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
		u32 signature;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		u32 result;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	} selftest;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	struct stats stats;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	u8 dump_buf[596];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
struct param_range {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	u32 min;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	u32 max;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	u32 count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
struct params {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	struct param_range rfds;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	struct param_range cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
struct nic {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	/* Begin: frequently used values: keep adjacent for cache effect */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	u32 msg_enable				____cacheline_aligned;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	struct net_device *netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	struct pci_dev *pdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	struct rx *rxs				____cacheline_aligned;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	struct rx *rx_to_use;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	struct rx *rx_to_clean;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	struct rfd blank_rfd;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	enum ru_state ru_running;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	spinlock_t cb_lock			____cacheline_aligned;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	spinlock_t cmd_lock;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	struct csr __iomem *csr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	enum scb_cmd_lo cuc_cmd;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	unsigned int cbs_avail;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	struct napi_struct napi;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	struct cb *cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	struct cb *cb_to_use;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	struct cb *cb_to_send;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	struct cb *cb_to_clean;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	u16 tx_command;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	/* End: frequently used values: keep adjacent for cache effect */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	enum {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
		ich                = (1 << 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
		promiscuous        = (1 << 1),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
		multicast_all      = (1 << 2),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
		wol_magic          = (1 << 3),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
		ich_10h_workaround = (1 << 4),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	} flags					____cacheline_aligned;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	enum mac mac;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	enum phy phy;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	struct params params;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	struct timer_list watchdog;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	struct timer_list blink_timer;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	struct mii_if_info mii;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	struct work_struct tx_timeout_task;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	enum loopback loopback;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	struct mem *mem;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	dma_addr_t dma_addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	dma_addr_t cbs_dma_addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	u8 adaptive_ifs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	u8 tx_threshold;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	u32 tx_frames;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	u32 tx_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	u32 tx_deferred;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	u32 tx_single_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	u32 tx_multiple_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	u32 tx_fc_pause;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	u32 tx_tco_frames;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	u32 rx_fc_pause;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	u32 rx_fc_unsupported;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	u32 rx_tco_frames;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	u32 rx_over_length_errors;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	u16 leds;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	u16 eeprom_wc;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	u16 eeprom[256];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	spinlock_t mdio_lock;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	ec_device_t *ecdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	unsigned long ec_watchdog_jiffies;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
static inline void e100_write_flush(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	/* Flush previous PCI writes through intermediate bridges
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	 * by doing a benign read */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	(void)ioread8(&nic->csr->scb.status);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
static void e100_enable_irq(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	unsigned long flags;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	if (nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
		return;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
	spin_lock_irqsave(&nic->cmd_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
	iowrite8(irq_mask_none, &nic->csr->scb.cmd_hi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	e100_write_flush(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	spin_unlock_irqrestore(&nic->cmd_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
static void e100_disable_irq(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
{
1317
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   670
	unsigned long flags = 0;
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   671
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   672
	if (!nic->ecdev)
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   673
		spin_lock_irqsave(&nic->cmd_lock, flags);
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	iowrite8(irq_mask_all, &nic->csr->scb.cmd_hi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	e100_write_flush(nic);
1317
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   676
	if (!nic->ecdev)
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   677
		spin_unlock_irqrestore(&nic->cmd_lock, flags);
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
static void e100_hw_reset(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	/* Put CU and RU into idle with a selective reset to get
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	 * device off of PCI bus */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	iowrite32(selective_reset, &nic->csr->port);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	e100_write_flush(nic); udelay(20);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	/* Now fully reset device */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	iowrite32(software_reset, &nic->csr->port);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	e100_write_flush(nic); udelay(20);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	/* Mask off our interrupt line - it's unmasked after reset */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	e100_disable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
static int e100_self_test(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	u32 dma_addr = nic->dma_addr + offsetof(struct mem, selftest);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	/* Passing the self-test is a pretty good indication
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	 * that the device can DMA to/from host memory */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
	nic->mem->selftest.signature = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	nic->mem->selftest.result = 0xFFFFFFFF;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	iowrite32(selftest | dma_addr, &nic->csr->port);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	e100_write_flush(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
	/* Wait 10 msec for self-test to complete */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	msleep(10);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	/* Interrupts are enabled after self-test */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	e100_disable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
	/* Check results of self-test */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	if(nic->mem->selftest.result != 0) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
		DPRINTK(HW, ERR, "Self-test failed: result=0x%08X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
			nic->mem->selftest.result);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
		return -ETIMEDOUT;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	if(nic->mem->selftest.signature == 0) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
		DPRINTK(HW, ERR, "Self-test failed: timed out\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
		return -ETIMEDOUT;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
static void e100_eeprom_write(struct nic *nic, u16 addr_len, u16 addr, u16 data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	u32 cmd_addr_data[3];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	u8 ctrl;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	int i, j;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	/* Three cmds: write/erase enable, write data, write/erase disable */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	cmd_addr_data[0] = op_ewen << (addr_len - 2);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
	cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) |
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		cpu_to_le16(data);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	cmd_addr_data[2] = op_ewds << (addr_len - 2);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	/* Bit-bang cmds to write word to eeprom */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	for(j = 0; j < 3; j++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		/* Chip select */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		iowrite8(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		for(i = 31; i >= 0; i--) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
			ctrl = (cmd_addr_data[j] & (1 << i)) ?
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
				eecs | eedi : eecs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
			iowrite8(ctrl, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
			e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
			iowrite8(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
			e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
		/* Wait 10 msec for cmd to complete */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
		msleep(10);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		/* Chip deselect */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
		iowrite8(0, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
/* General technique stolen from the eepro100 driver - very clever */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
static u16 e100_eeprom_read(struct nic *nic, u16 *addr_len, u16 addr)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	u32 cmd_addr_data;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	u16 data = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	u8 ctrl;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	int i;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
	cmd_addr_data = ((op_read << *addr_len) | addr) << 16;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	/* Chip select */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	iowrite8(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
	/* Bit-bang to read word from eeprom */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
	for(i = 31; i >= 0; i--) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		ctrl = (cmd_addr_data & (1 << i)) ? eecs | eedi : eecs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		iowrite8(ctrl, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
		e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
		iowrite8(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		/* Eeprom drives a dummy zero to EEDO after receiving
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		 * complete address.  Use this to adjust addr_len. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		ctrl = ioread8(&nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
		if(!(ctrl & eedo) && i > 16) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
			*addr_len -= (i - 16);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
			i = 17;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		data = (data << 1) | (ctrl & eedo ? 1 : 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	/* Chip deselect */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	iowrite8(0, &nic->csr->eeprom_ctrl_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	e100_write_flush(nic); udelay(4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	return le16_to_cpu(data);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
/* Load entire EEPROM image into driver cache and validate checksum */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
static int e100_eeprom_load(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	u16 addr, addr_len = 8, checksum = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	/* Try reading with an 8-bit addr len to discover actual addr len */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	e100_eeprom_read(nic, &addr_len, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	nic->eeprom_wc = 1 << addr_len;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	for(addr = 0; addr < nic->eeprom_wc; addr++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		nic->eeprom[addr] = e100_eeprom_read(nic, &addr_len, addr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
		if(addr < nic->eeprom_wc - 1)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			checksum += cpu_to_le16(nic->eeprom[addr]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	/* The checksum, stored in the last word, is calculated such that
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	 * the sum of words should be 0xBABA */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	checksum = le16_to_cpu(0xBABA - checksum);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	if(checksum != nic->eeprom[nic->eeprom_wc - 1]) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
		DPRINTK(PROBE, ERR, "EEPROM corrupted\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
		if (!eeprom_bad_csum_allow)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			return -EAGAIN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
/* Save (portion of) driver EEPROM cache to device and update checksum */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
static int e100_eeprom_save(struct nic *nic, u16 start, u16 count)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	u16 addr, addr_len = 8, checksum = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	/* Try reading with an 8-bit addr len to discover actual addr len */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	e100_eeprom_read(nic, &addr_len, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	nic->eeprom_wc = 1 << addr_len;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	if(start + count >= nic->eeprom_wc)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		return -EINVAL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	for(addr = start; addr < start + count; addr++)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		e100_eeprom_write(nic, addr_len, addr, nic->eeprom[addr]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	/* The checksum, stored in the last word, is calculated such that
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	 * the sum of words should be 0xBABA */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	for(addr = 0; addr < nic->eeprom_wc - 1; addr++)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		checksum += cpu_to_le16(nic->eeprom[addr]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
	nic->eeprom[nic->eeprom_wc - 1] = le16_to_cpu(0xBABA - checksum);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		nic->eeprom[nic->eeprom_wc - 1]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
#define E100_WAIT_SCB_TIMEOUT 20000 /* we might have to wait 100ms!!! */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
#define E100_WAIT_SCB_FAST 20       /* delay like the old code */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
static int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	unsigned long flags = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	unsigned int i;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	int err = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
		spin_lock_irqsave(&nic->cmd_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
	/* Previous command is accepted when SCB clears */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	for(i = 0; i < E100_WAIT_SCB_TIMEOUT; i++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		if(likely(!ioread8(&nic->csr->scb.cmd_lo)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
			break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		cpu_relax();
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		if(unlikely(i > E100_WAIT_SCB_FAST))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
			udelay(5);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	if(unlikely(i == E100_WAIT_SCB_TIMEOUT)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		err = -EAGAIN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
		goto err_unlock;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	if(unlikely(cmd != cuc_resume))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		iowrite32(dma_addr, &nic->csr->scb.gen_ptr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	iowrite8(cmd, &nic->csr->scb.cmd_lo);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
err_unlock:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
		spin_unlock_irqrestore(&nic->cmd_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
static int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	struct cb *cb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	unsigned long flags = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	int err = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
		spin_lock_irqsave(&nic->cb_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	if(unlikely(!nic->cbs_avail)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
		err = -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		goto err_unlock;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	cb = nic->cb_to_use;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	nic->cb_to_use = cb->next;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	nic->cbs_avail--;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	cb->skb = skb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	if(unlikely(!nic->cbs_avail))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
		err = -ENOSPC;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	cb_prepare(nic, cb, skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	/* Order is important otherwise we'll be in a race with h/w:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	 * set S-bit in current first, then clear S-bit in previous. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	cb->command |= cpu_to_le16(cb_s);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	wmb();
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	cb->prev->command &= cpu_to_le16(~cb_s);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	while(nic->cb_to_send != nic->cb_to_use) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
		if(unlikely(e100_exec_cmd(nic, nic->cuc_cmd,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
			nic->cb_to_send->dma_addr))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
			/* Ok, here's where things get sticky.  It's
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
			 * possible that we can't schedule the command
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
			 * because the controller is too busy, so
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
			 * let's just queue the command and try again
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
			 * when another command is scheduled. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
			if(err == -ENOSPC) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
				//request a reset
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
				schedule_work(&nic->tx_timeout_task);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
			}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
			break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
			nic->cuc_cmd = cuc_resume;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
			nic->cb_to_send = nic->cb_to_send->next;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
err_unlock:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
		spin_unlock_irqrestore(&nic->cb_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
static u16 mdio_ctrl(struct nic *nic, u32 addr, u32 dir, u32 reg, u16 data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	u32 data_out = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	unsigned int i;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	unsigned long flags = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	/*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	 * Stratus87247: we shouldn't be writing the MDI control
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	 * register until the Ready bit shows True.  Also, since
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	 * manipulation of the MDI control registers is a multi-step
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	 * procedure it should be done under lock.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
		spin_lock_irqsave(&nic->mdio_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
	for (i = 100; i; --i) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
		if (ioread32(&nic->csr->mdi_ctrl) & mdi_ready)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
			break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		udelay(20);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	if (unlikely(!i)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
		printk("e100.mdio_ctrl(%s) won't go Ready\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
			nic->netdev->name );
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
		if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
			spin_unlock_irqrestore(&nic->mdio_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
		return 0;		/* No way to indicate timeout error */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	iowrite32((reg << 16) | (addr << 21) | dir | data, &nic->csr->mdi_ctrl);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	for (i = 0; i < 100; i++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		udelay(20);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
		if ((data_out = ioread32(&nic->csr->mdi_ctrl)) & mdi_ready)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
		spin_unlock_irqrestore(&nic->mdio_lock, flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	DPRINTK(HW, DEBUG,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
		"%s:addr=%d, reg=%d, data_in=0x%04X, data_out=0x%04X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
		dir == mdi_read ? "READ" : "WRITE", addr, reg, data, data_out);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	return (u16)data_out;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
static int mdio_read(struct net_device *netdev, int addr, int reg)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	return mdio_ctrl(netdev_priv(netdev), addr, mdi_read, reg, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	mdio_ctrl(netdev_priv(netdev), addr, mdi_write, reg, data);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
static void e100_get_defaults(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	struct param_range rfds = { .min = 16, .max = 256, .count = 256 };
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	struct param_range cbs  = { .min = 64, .max = 256, .count = 128 };
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	/* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
	nic->mac = (nic->flags & ich) ? mac_82559_D101M : nic->pdev->revision;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	if(nic->mac == mac_unknown)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		nic->mac = mac_82557_D100_A;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	nic->params.rfds = rfds;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	nic->params.cbs = cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	/* Quadwords to DMA into FIFO before starting frame transmit */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	nic->tx_threshold = 0xE0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	/* no interrupt for every tx completion, delay = 256us if not 557*/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	nic->tx_command = cpu_to_le16(cb_tx | cb_tx_sf |
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
		((nic->mac >= mac_82558_D101_A4) ? cb_cid : cb_i));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	/* Template for a freshly allocated RFD */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	nic->blank_rfd.command = cpu_to_le16(cb_el);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	nic->blank_rfd.rbd = 0xFFFFFFFF;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	/* MII setup */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	nic->mii.phy_id_mask = 0x1F;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	nic->mii.reg_num_mask = 0x1F;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	nic->mii.dev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	nic->mii.mdio_read = mdio_read;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	nic->mii.mdio_write = mdio_write;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	struct config *config = &cb->u.config;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	u8 *c = (u8 *)config;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	cb->command = cpu_to_le16(cb_config);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	memset(config, 0, sizeof(struct config));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	config->byte_count = 0x16;		/* bytes in this struct */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	config->rx_fifo_limit = 0x8;		/* bytes in FIFO before DMA */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	config->direct_rx_dma = 0x1;		/* reserved */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	config->standard_tcb = 0x1;		/* 1=standard, 0=extended */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	config->standard_stat_counter = 0x1;	/* 1=standard, 0=extended */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	config->rx_discard_short_frames = 0x1;	/* 1=discard, 0=pass */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	config->tx_underrun_retry = 0x3;	/* # of underrun retries */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	config->mii_mode = 0x1;			/* 1=MII mode, 0=503 mode */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	config->pad10 = 0x6;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	config->no_source_addr_insertion = 0x1;	/* 1=no, 0=yes */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
	config->preamble_length = 0x2;		/* 0=1, 1=3, 2=7, 3=15 bytes */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	config->ifs = 0x6;			/* x16 = inter frame spacing */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	config->ip_addr_hi = 0xF2;		/* ARP IP filter - not used */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	config->pad15_1 = 0x1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	config->pad15_2 = 0x1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
	config->crs_or_cdt = 0x0;		/* 0=CRS only, 1=CRS or CDT */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	config->fc_delay_hi = 0x40;		/* time delay for fc frame */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	config->tx_padding = 0x1;		/* 1=pad short frames */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	config->fc_priority_threshold = 0x7;	/* 7=priority fc disabled */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	config->pad18 = 0x1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	config->full_duplex_pin = 0x1;		/* 1=examine FDX# pin */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	config->pad20_1 = 0x1F;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	config->fc_priority_location = 0x1;	/* 1=byte#31, 0=byte#19 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	config->pad21_1 = 0x5;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	config->adaptive_ifs = nic->adaptive_ifs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	config->loopback = nic->loopback;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	if(nic->mii.force_media && nic->mii.full_duplex)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
		config->full_duplex_force = 0x1;	/* 1=force, 0=auto */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	if(nic->flags & promiscuous || nic->loopback) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
		config->rx_save_bad_frames = 0x1;	/* 1=save, 0=discard */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
		config->rx_discard_short_frames = 0x0;	/* 1=discard, 0=save */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
		config->promiscuous_mode = 0x1;		/* 1=on, 0=off */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	if(nic->flags & multicast_all)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
		config->multicast_all = 0x1;		/* 1=accept, 0=no */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	/* disable WoL when up */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	if (nic->ecdev ||
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
			(netif_running(nic->netdev) || !(nic->flags & wol_magic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
		config->magic_packet_disable = 0x1;	/* 1=off, 0=on */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	if(nic->mac >= mac_82558_D101_A4) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		config->fc_disable = 0x1;	/* 1=Tx fc off, 0=Tx fc on */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
		config->mwi_enable = 0x1;	/* 1=enable, 0=disable */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		config->standard_tcb = 0x0;	/* 1=standard, 0=extended */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
		config->rx_long_ok = 0x1;	/* 1=VLANs ok, 0=standard */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		if (nic->mac >= mac_82559_D101M) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
			config->tno_intr = 0x1;		/* TCO stats enable */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
			/* Enable TCO in extended config */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
			if (nic->mac >= mac_82551_10) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
				config->byte_count = 0x20; /* extended bytes */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
				config->rx_d102_mode = 0x1; /* GMRC for TCO */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
			}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
		} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
			config->standard_stat_counter = 0x0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	DPRINTK(HW, DEBUG, "[00-07]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
		c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
	DPRINTK(HW, DEBUG, "[08-15]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
		c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	DPRINTK(HW, DEBUG, "[16-23]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
		c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
/********************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
/*  Micro code for 8086:1229 Rev 8                      */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
/********************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
/*  Parameter values for the D101M B-step  */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
#define D101M_CPUSAVER_TIMER_DWORD		78
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
#define D101M_CPUSAVER_BUNDLE_DWORD		65
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
#define D101M_CPUSAVER_MIN_SIZE_DWORD		126
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
#define D101M_B_RCVBUNDLE_UCODE \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
{\
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
0x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
0x000C0001, 0x00101312, 0x000C0008, 0x00380216, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
0x0010009C, 0x00204056, 0x002380CC, 0x00380056, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
0x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
0x00380438, 0x00000000, 0x00140000, 0x00380555, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
0x00308000, 0x00100662, 0x00100561, 0x000E0408, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
0x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
0x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
0x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
0x003A0437, 0x00044010, 0x0038078A, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
0x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
0x00130824, 0x000C0001, 0x00101213, 0x00260C75, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
0x00041000, 0x00010004, 0x00130826, 0x000C0006, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
0x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
0x00101210, 0x00380C34, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
0x0021155B, 0x00100099, 0x00206559, 0x0010009C, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
0x00244559, 0x00130836, 0x000C0000, 0x00220C62, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
0x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
0x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
0x00214C0E, 0x00380555, 0x00010004, 0x00041000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
0x00278C67, 0x00040800, 0x00018100, 0x003A0437, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
0x00130826, 0x000C0001, 0x00220559, 0x00101313, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
0x00380559, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
0x00000000, 0x00130831, 0x0010090B, 0x00124813, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
0x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
0x003806A8, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
/********************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
/*  Micro code for 8086:1229 Rev 9                      */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
/********************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
/*  Parameter values for the D101S  */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
#define D101S_CPUSAVER_TIMER_DWORD		78
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
#define D101S_CPUSAVER_BUNDLE_DWORD		67
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
#define D101S_CPUSAVER_MIN_SIZE_DWORD		128
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
#define D101S_RCVBUNDLE_UCODE \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
{\
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
0x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
0x000C0001, 0x00101312, 0x000C0008, 0x00380243, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
0x0010009C, 0x00204056, 0x002380D0, 0x00380056, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
0x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
0x0038047F, 0x00000000, 0x00140000, 0x003805A3, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
0x00308000, 0x00100610, 0x00100561, 0x000E0408, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
0x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
0x00380F90, 0x00080000, 0x00103090, 0x00380F90, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
0x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
0x003A047E, 0x00044010, 0x00380819, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
0x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
0x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
0x00101213, 0x00260FF7, 0x00041000, 0x00010004, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
0x00130826, 0x000C0006, 0x00220700, 0x0013C926, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
0x00101313, 0x00380700, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
0x00101210, 0x00380FB6, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
0x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
0x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
0x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
0x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
0x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
0x00010004, 0x00041000, 0x00278FE9, 0x00040800, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
0x00018100, 0x003A047E, 0x00130826, 0x000C0001, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
0x002205A7, 0x00101313, 0x003805A7, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
0x00000000, 0x00000000, 0x00000000, 0x00130831, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
0x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
0x00041000, 0x00010004, 0x00380700  \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
/********************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
/*  Micro code for the 8086:1229 Rev F/10               */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
/********************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
/*  Parameter values for the D102 E-step  */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
#define D102_E_CPUSAVER_TIMER_DWORD		42
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
#define D102_E_CPUSAVER_BUNDLE_DWORD		54
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
#define D102_E_CPUSAVER_MIN_SIZE_DWORD		46
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
#define     D102_E_RCVBUNDLE_UCODE \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
{\
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
0x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x0EF70E36, 0x1FFF1FFF, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
0x00E014B9, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
0x00E014BD, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
0x00E014D5, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
0x00E014C1, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
0x00E014C8, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
0x00200600, 0x00E014EE, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
0x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
0x00E00E43, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
0x00300006, 0x00E014FB, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
0x00906EFD, 0x00900EFD, 0x00E00EF8, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
static void e100_setup_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
/* *INDENT-OFF* */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	static struct {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
		u32 ucode[UCODE_SIZE + 1];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		u8 mac;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		u8 timer_dword;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		u8 bundle_dword;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		u8 min_size_dword;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	} ucode_opts[] = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		{ D101M_B_RCVBUNDLE_UCODE,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		  mac_82559_D101M,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		  D101M_CPUSAVER_TIMER_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		  D101M_CPUSAVER_BUNDLE_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		  D101M_CPUSAVER_MIN_SIZE_DWORD },
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		{ D101S_RCVBUNDLE_UCODE,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		  mac_82559_D101S,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		  D101S_CPUSAVER_TIMER_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		  D101S_CPUSAVER_BUNDLE_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		  D101S_CPUSAVER_MIN_SIZE_DWORD },
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		{ D102_E_RCVBUNDLE_UCODE,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		  mac_82551_F,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		  D102_E_CPUSAVER_TIMER_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		  D102_E_CPUSAVER_BUNDLE_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		  D102_E_CPUSAVER_MIN_SIZE_DWORD },
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ D102_E_RCVBUNDLE_UCODE,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		  mac_82551_10,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		  D102_E_CPUSAVER_TIMER_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		  D102_E_CPUSAVER_BUNDLE_DWORD,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		  D102_E_CPUSAVER_MIN_SIZE_DWORD },
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		{ {0}, 0, 0, 0, 0}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
	}, *opts;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
/* *INDENT-ON* */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
/*************************************************************************
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
*  CPUSaver parameters
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
*  All CPUSaver parameters are 16-bit literals that are part of a
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
*  "move immediate value" instruction.  By changing the value of
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
*  the literal in the instruction before the code is loaded, the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
*  driver can change the algorithm.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
*  INTDELAY - This loads the dead-man timer with its initial value.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
*    When this timer expires the interrupt is asserted, and the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
*    timer is reset each time a new packet is received.  (see
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
*    BUNDLEMAX below to set the limit on number of chained packets)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
*    The current default is 0x600 or 1536.  Experiments show that
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
*    the value should probably stay within the 0x200 - 0x1000.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
*  BUNDLEMAX -
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
*    This sets the maximum number of frames that will be bundled.  In
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
*    some situations, such as the TCP windowing algorithm, it may be
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
*    better to limit the growth of the bundle size than let it go as
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
*    high as it can, because that could cause too much added latency.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
*    The default is six, because this is the number of packets in the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
*    default TCP window size.  A value of 1 would make CPUSaver indicate
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
*    an interrupt for every frame received.  If you do not want to put
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
*    a limit on the bundle size, set this value to xFFFF.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
*  BUNDLESMALL -
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
*    This contains a bit-mask describing the minimum size frame that
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
*    will be bundled.  The default masks the lower 7 bits, which means
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
*    that any frame less than 128 bytes in length will not be bundled,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
*    but will instead immediately generate an interrupt.  This does
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
*    not affect the current bundle in any way.  Any frame that is 128
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
*    bytes or large will be bundled normally.  This feature is meant
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
*    to provide immediate indication of ACK frames in a TCP environment.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
*    Customers were seeing poor performance when a machine with CPUSaver
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
*    enabled was sending but not receiving.  The delay introduced when
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
*    the ACKs were received was enough to reduce total throughput, because
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
*    the sender would sit idle until the ACK was finally seen.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
*
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
*    The current default is 0xFF80, which masks out the lower 7 bits.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
*    This means that any frame which is x7F (127) bytes or smaller
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
*    will cause an immediate interrupt.  Because this value must be a
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
*    bit mask, there are only a few valid values that can be used.  To
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
*    turn this feature off, the driver can write the value xFFFF to the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
*    lower word of this instruction (in the same way that the other
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
*    parameters are used).  Likewise, a value of 0xF800 (2047) would
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
*    cause an interrupt to be generated for every frame, because all
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
*    standard Ethernet frames are <= 2047 bytes in length.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
*************************************************************************/
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
/* if you wish to disable the ucode functionality, while maintaining the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
 * workarounds it provides, set the following defines to:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
 * BUNDLESMALL 0
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
 * BUNDLEMAX 1
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
 * INTDELAY 1
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
#define BUNDLESMALL 1
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
#define BUNDLEMAX (u16)6
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
#define INTDELAY (u16)1536 /* 0x600 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	/* do not load u-code for ICH devices */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
	if (nic->flags & ich)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		goto noloaducode;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
	/* Search for ucode match against h/w revision */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
	for (opts = ucode_opts; opts->mac; opts++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		int i;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		u32 *ucode = opts->ucode;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		if (nic->mac != opts->mac)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
			continue;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		/* Insert user-tunable settings */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		ucode[opts->timer_dword] &= 0xFFFF0000;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		ucode[opts->timer_dword] |= INTDELAY;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		ucode[opts->bundle_dword] &= 0xFFFF0000;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		ucode[opts->bundle_dword] |= BUNDLEMAX;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		ucode[opts->min_size_dword] &= 0xFFFF0000;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		ucode[opts->min_size_dword] |= (BUNDLESMALL) ? 0xFFFF : 0xFF80;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		for (i = 0; i < UCODE_SIZE; i++)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
			cb->u.ucode[i] = cpu_to_le32(ucode[i]);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		cb->command = cpu_to_le16(cb_ucode | cb_el);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		return;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
noloaducode:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	cb->command = cpu_to_le16(cb_nop | cb_el);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
static inline int e100_exec_cb_wait(struct nic *nic, struct sk_buff *skb,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	int err = 0, counter = 50;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	struct cb *cb = nic->cb_to_clean;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	if ((err = e100_exec_cb(nic, NULL, e100_setup_ucode)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		DPRINTK(PROBE,ERR, "ucode cmd failed with error %d\n", err);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	/* must restart cuc */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	nic->cuc_cmd = cuc_start;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	/* wait for completion */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	e100_write_flush(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
	udelay(10);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
	/* wait for possibly (ouch) 500ms */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	while (!(cb->status & cpu_to_le16(cb_complete))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		msleep(10);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		if (!--counter) break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	/* ack any interrupts, something could have been set */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	iowrite8(~0, &nic->csr->scb.stat_ack);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	/* if the command failed, or is not OK, notify and return */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	if (!counter || !(cb->status & cpu_to_le16(cb_ok))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		DPRINTK(PROBE,ERR, "ucode load failed\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		err = -EPERM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	struct sk_buff *skb)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	cb->command = cpu_to_le16(cb_iaaddr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	memcpy(cb->u.iaaddr, nic->netdev->dev_addr, ETH_ALEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
static void e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	cb->command = cpu_to_le16(cb_dump);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
	cb->u.dump_buffer_addr = cpu_to_le32(nic->dma_addr +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		offsetof(struct mem, dump_buf));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
#define NCONFIG_AUTO_SWITCH	0x0080
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
#define MII_NSC_CONG		MII_RESV1
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
#define NSC_CONG_ENABLE		0x0100
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
#define NSC_CONG_TXREADY	0x0400
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
#define ADVERTISE_FC_SUPPORTED	0x0400
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
static int e100_phy_init(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	struct net_device *netdev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	u32 addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	u16 bmcr, stat, id_lo, id_hi, cong;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
	/* Discover phy addr by searching addrs in order {1,0,2,..., 31} */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	for(addr = 0; addr < 32; addr++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		nic->mii.phy_id = (addr == 0) ? 1 : (addr == 1) ? 0 : addr;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		bmcr = mdio_read(netdev, nic->mii.phy_id, MII_BMCR);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		if(!((bmcr == 0xFFFF) || ((stat == 0) && (bmcr == 0))))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
			break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	if(addr == 32)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		return -EAGAIN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	/* Selected the phy and isolate the rest */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	for(addr = 0; addr < 32; addr++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		if(addr != nic->mii.phy_id) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
			mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
			bmcr = mdio_read(netdev, addr, MII_BMCR);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
			mdio_write(netdev, addr, MII_BMCR,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
				bmcr & ~BMCR_ISOLATE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	/* Get phy ID */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	nic->phy = (u32)id_hi << 16 | (u32)id_lo;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	/* Handle National tx phys */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
#define NCS_PHY_MODEL_MASK	0xFFF0FFFF
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	if((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		/* Disable congestion control */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		cong = mdio_read(netdev, nic->mii.phy_id, MII_NSC_CONG);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		cong |= NSC_CONG_TXREADY;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		cong &= ~NSC_CONG_ENABLE;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
	if((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		!(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		/* enable/disable MDI/MDI-X auto-switching. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
				nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
static int e100_hw_init(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
	int err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	e100_hw_reset(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	DPRINTK(HW, ERR, "e100_hw_init\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	if(!in_interrupt() && (err = e100_self_test(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	if((err = e100_phy_init(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	if((err = e100_exec_cmd(nic, cuc_load_base, 0)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	if((err = e100_exec_cmd(nic, ruc_load_base, 0)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	if ((err = e100_exec_cb_wait(nic, NULL, e100_setup_ucode)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	if((err = e100_exec_cb(nic, NULL, e100_configure)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	if((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	if((err = e100_exec_cmd(nic, cuc_dump_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		nic->dma_addr + offsetof(struct mem, stats))))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	if((err = e100_exec_cmd(nic, cuc_dump_reset, 0)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	e100_disable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	struct net_device *netdev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	struct dev_mc_list *list = netdev->mc_list;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	u16 i, count = min(netdev->mc_count, E100_MAX_MULTICAST_ADDRS);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
	cb->command = cpu_to_le16(cb_multi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
	for(i = 0; list && i < count; i++, list = list->next)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		memcpy(&cb->u.multi.addr[i*ETH_ALEN], &list->dmi_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
			ETH_ALEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
static void e100_set_multicast_list(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	DPRINTK(HW, DEBUG, "mc_count=%d, flags=0x%04X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
		netdev->mc_count, netdev->flags);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
	if(netdev->flags & IFF_PROMISC)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
		nic->flags |= promiscuous;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	else
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
		nic->flags &= ~promiscuous;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	if(netdev->flags & IFF_ALLMULTI ||
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		netdev->mc_count > E100_MAX_MULTICAST_ADDRS)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		nic->flags |= multicast_all;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	else
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		nic->flags &= ~multicast_all;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	e100_exec_cb(nic, NULL, e100_configure);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
	e100_exec_cb(nic, NULL, e100_multi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
static void e100_update_stats(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
	struct net_device *dev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
	struct net_device_stats *ns = &dev->stats;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
	struct stats *s = &nic->mem->stats;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
	u32 *complete = (nic->mac < mac_82558_D101_A4) ? &s->fc_xmt_pause :
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		(nic->mac < mac_82559_D101M) ? (u32 *)&s->xmt_tco_frames :
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		&s->complete;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
	/* Device's stats reporting may take several microseconds to
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	 * complete, so where always waiting for results of the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	 * previous command. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
	if(*complete == le32_to_cpu(cuc_dump_reset_complete)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		*complete = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		nic->tx_frames = le32_to_cpu(s->tx_good_frames);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		nic->tx_collisions = le32_to_cpu(s->tx_total_collisions);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		ns->tx_aborted_errors += le32_to_cpu(s->tx_max_collisions);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		ns->tx_window_errors += le32_to_cpu(s->tx_late_collisions);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		ns->tx_carrier_errors += le32_to_cpu(s->tx_lost_crs);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		ns->tx_fifo_errors += le32_to_cpu(s->tx_underruns);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		ns->collisions += nic->tx_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
			le32_to_cpu(s->tx_lost_crs);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			nic->rx_over_length_errors;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		ns->rx_missed_errors += le32_to_cpu(s->rx_resource_errors);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
			le32_to_cpu(s->rx_alignment_errors) +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			le32_to_cpu(s->rx_short_frame_errors) +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
			le32_to_cpu(s->rx_cdt_errors);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		nic->tx_deferred += le32_to_cpu(s->tx_deferred);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		nic->tx_single_collisions +=
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			le32_to_cpu(s->tx_single_collisions);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
		nic->tx_multiple_collisions +=
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
			le32_to_cpu(s->tx_multiple_collisions);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
		if(nic->mac >= mac_82558_D101_A4) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
			nic->tx_fc_pause += le32_to_cpu(s->fc_xmt_pause);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
			nic->rx_fc_pause += le32_to_cpu(s->fc_rcv_pause);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
			nic->rx_fc_unsupported +=
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
				le32_to_cpu(s->fc_rcv_unsupported);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
			if(nic->mac >= mac_82559_D101M) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
				nic->tx_tco_frames +=
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
					le16_to_cpu(s->xmt_tco_frames);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
				nic->rx_tco_frames +=
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
					le16_to_cpu(s->rcv_tco_frames);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
			}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	if(e100_exec_cmd(nic, cuc_dump_reset, 0))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
		DPRINTK(TX_ERR, DEBUG, "exec cuc_dump_reset failed\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	/* Adjust inter-frame-spacing (IFS) between two transmits if
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	 * we're getting collisions on a half-duplex connection. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	if(duplex == DUPLEX_HALF) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
		u32 prev = nic->adaptive_ifs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
		u32 min_frames = (speed == SPEED_100) ? 1000 : 100;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
		if((nic->tx_frames / 32 < nic->tx_collisions) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
		   (nic->tx_frames > min_frames)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
			if(nic->adaptive_ifs < 60)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
				nic->adaptive_ifs += 5;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		} else if (nic->tx_frames < min_frames) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
			if(nic->adaptive_ifs >= 5)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
				nic->adaptive_ifs -= 5;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		if(nic->adaptive_ifs != prev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
			e100_exec_cb(nic, NULL, e100_configure);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
static void e100_watchdog(unsigned long data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	struct nic *nic = (struct nic *)data;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	struct ethtool_cmd cmd;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	DPRINTK(TIMER, DEBUG, "right now = %ld\n", jiffies);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	/* mii library handles link maintenance tasks */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	if (nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		ecdev_set_link(nic->ecdev, mii_link_ok(&nic->mii) ? 1 : 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		mii_ethtool_gset(&nic->mii, &cmd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		if(mii_link_ok(&nic->mii) && !netif_carrier_ok(nic->netdev)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
			DPRINTK(LINK, INFO, "link up, %sMbps, %s-duplex\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
					cmd.speed == SPEED_100 ? "100" : "10",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
					cmd.duplex == DUPLEX_FULL ? "full" : "half");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
		} else if(!mii_link_ok(&nic->mii) && netif_carrier_ok(nic->netdev)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
			DPRINTK(LINK, INFO, "link down\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		}
1502
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1654
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1655
		mii_check_link(&nic->mii);
1504
e02f3344a748 Minor: Removed unnecessary condition.
Florian Pose <fp@igh-essen.com>
parents: 1502
diff changeset
  1656
1311
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1657
		/* Software generated interrupt to recover from (rare) Rx
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1658
		 * allocation failure.
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1659
		 * Unfortunately have to use a spinlock to not re-enable interrupts
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1660
		 * accidentally, due to hardware that shares a register between the
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1661
		 * interrupt mask bit and the SW Interrupt generation bit */
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		spin_lock_irq(&nic->cmd_lock);
1311
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1663
		iowrite8(ioread8(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi);
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1664
		e100_write_flush(nic);
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		spin_unlock_irq(&nic->cmd_lock);
1502
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1666
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1667
		e100_update_stats(nic);
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1668
		e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex);
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1669
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1670
		if(nic->mac <= mac_82557_D100_C)
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1671
			/* Issue a multicast command to workaround a 557 lock up */
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1672
			e100_set_multicast_list(nic->netdev);
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1673
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1674
		if(nic->flags & ich && cmd.speed==SPEED_10 && cmd.duplex==DUPLEX_HALF)
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1675
			/* Need SW workaround for ICH[x] 10Mbps/half duplex Tx hang. */
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1676
			nic->flags |= ich_10h_workaround;
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1677
		else
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1678
			nic->flags &= ~ich_10h_workaround;
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1679
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		mod_timer(&nic->watchdog,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
				round_jiffies(jiffies + E100_WATCHDOG_PERIOD));
1502
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1682
	}
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
static void e100_xmit_prepare(struct nic *nic, struct cb *cb,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
	struct sk_buff *skb)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
	cb->command = nic->tx_command;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	/* interrupt every 16 packets regardless of delay */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	if((nic->cbs_avail & ~15) == nic->cbs_avail)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		cb->command |= cpu_to_le16(cb_i);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	cb->u.tcb.tcb_byte_count = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
	cb->u.tcb.threshold = nic->tx_threshold;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	cb->u.tcb.tbd_count = 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
	cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		skb->data, skb->len, PCI_DMA_TODEVICE));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	/* check for mapping failure? */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	cb->u.tcb.tbd.size = cpu_to_le16(skb->len);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	int err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	if(nic->flags & ich_10h_workaround) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
		/* SW workaround for ICH[x] 10Mbps/half duplex Tx hang.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		   Issue a NOP command followed by a 1us delay before
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		   issuing the Tx command. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		if(e100_exec_cmd(nic, cuc_nop, 0))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
			DPRINTK(TX_ERR, DEBUG, "exec cuc_nop failed\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		udelay(1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	err = e100_exec_cb(nic, skb, e100_xmit_prepare);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	switch(err) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	case -ENOSPC:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
		/* We queued the skb, but now we're out of space. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		DPRINTK(TX_ERR, DEBUG, "No space for CB\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
			netif_stop_queue(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	case -ENOMEM:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		/* This is a hard error - log it. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
		DPRINTK(TX_ERR, DEBUG, "Out of Tx resources, returning skb\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
			netif_stop_queue(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
		return 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	netdev->trans_start = jiffies;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
static int e100_tx_clean(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	struct net_device *dev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	struct cb *cb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	int tx_cleaned = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		spin_lock(&nic->cb_lock);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	/* Clean CBs marked complete */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	for(cb = nic->cb_to_clean;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	    cb->status & cpu_to_le16(cb_complete);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	    cb = nic->cb_to_clean = cb->next) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		DPRINTK(TX_DONE, DEBUG, "cb[%d]->status = 0x%04X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
		        (int)(((void*)cb - (void*)nic->cbs)/sizeof(struct cb)),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		        cb->status);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		if(likely(cb->skb != NULL)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
			dev->stats.tx_packets++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
			dev->stats.tx_bytes += cb->skb->len;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
			pci_unmap_single(nic->pdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
				le32_to_cpu(cb->u.tcb.tbd.buf_addr),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
				le16_to_cpu(cb->u.tcb.tbd.size),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
				PCI_DMA_TODEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
			if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
				dev_kfree_skb_any(cb->skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
			cb->skb = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
			tx_cleaned = 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		cb->status = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		nic->cbs_avail++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		spin_unlock(&nic->cb_lock);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		/* Recover from running out of Tx resources in xmit_frame */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		if(unlikely(tx_cleaned && netif_queue_stopped(nic->netdev)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
			netif_wake_queue(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	return tx_cleaned;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
static void e100_clean_cbs(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	if(nic->cbs) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		while(nic->cbs_avail != nic->params.cbs.count) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
			struct cb *cb = nic->cb_to_clean;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
			if(cb->skb) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
				pci_unmap_single(nic->pdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
					le32_to_cpu(cb->u.tcb.tbd.buf_addr),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
					le16_to_cpu(cb->u.tcb.tbd.size),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
					PCI_DMA_TODEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
				if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
					dev_kfree_skb(cb->skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
			}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
			nic->cb_to_clean = nic->cb_to_clean->next;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
			nic->cbs_avail++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		pci_free_consistent(nic->pdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
			sizeof(struct cb) * nic->params.cbs.count,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
			nic->cbs, nic->cbs_dma_addr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		nic->cbs = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		nic->cbs_avail = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	nic->cuc_cmd = cuc_start;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean =
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		nic->cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
static int e100_alloc_cbs(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
	struct cb *cb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	unsigned int i, count = nic->params.cbs.count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
	nic->cuc_cmd = cuc_start;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	nic->cbs_avail = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	nic->cbs = pci_alloc_consistent(nic->pdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		sizeof(struct cb) * count, &nic->cbs_dma_addr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	if(!nic->cbs)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		return -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	for(cb = nic->cbs, i = 0; i < count; cb++, i++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		cb->next = (i + 1 < count) ? cb + 1 : nic->cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		cb->prev = (i == 0) ? nic->cbs + count - 1 : cb - 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		cb->link = cpu_to_le32(nic->cbs_dma_addr +
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
			((i+1) % count) * sizeof(struct cb));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		cb->skb = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	nic->cbs_avail = count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	if(!nic->rxs) return;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	if(RU_SUSPENDED != nic->ru_running) return;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	/* handle init time starts */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	if(!rx) rx = nic->rxs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	/* (Re)start RU if suspended or idle and RFA is non-NULL */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	if(rx->skb) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		e100_exec_cmd(nic, ruc_start, rx->dma_addr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		nic->ru_running = RU_RUNNING;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	if(!(rx->skb = netdev_alloc_skb(nic->netdev, RFD_BUF_LEN + NET_IP_ALIGN)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		return -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	/* Align, init, and map the RFD. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
	skb_reserve(rx->skb, NET_IP_ALIGN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
	skb_copy_to_linear_data(rx->skb, &nic->blank_rfd, sizeof(struct rfd));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	if(pci_dma_mapping_error(rx->dma_addr)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		dev_kfree_skb_any(rx->skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		rx->skb = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		rx->dma_addr = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		return -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	/* Link the RFD to end of RFA by linking previous RFD to
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	 * this one, and clearing EL bit of previous.  */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	if(rx->prev->skb) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		put_unaligned(cpu_to_le32(rx->dma_addr),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
			(u32 *)&prev_rfd->link);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		wmb();
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		prev_rfd->command &= ~cpu_to_le16(cb_el);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
			sizeof(struct rfd), PCI_DMA_TODEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
static int e100_rx_indicate(struct nic *nic, struct rx *rx,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	unsigned int *work_done, unsigned int work_to_do)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	struct net_device *dev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
	struct sk_buff *skb = rx->skb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
	struct rfd *rfd = (struct rfd *)skb->data;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	u16 rfd_status, actual_size;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	if(unlikely(work_done && *work_done >= work_to_do))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		return -EAGAIN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	/* Need to sync before taking a peek at cb_complete bit */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		sizeof(struct rfd), PCI_DMA_FROMDEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	rfd_status = le16_to_cpu(rfd->status);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	/* If data isn't ready, nothing to indicate */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	if(unlikely(!(rfd_status & cb_complete)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		return -ENODATA;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
	/* Get actual data size */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
	actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	if(unlikely(actual_size > RFD_BUF_LEN - sizeof(struct rfd)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		actual_size = RFD_BUF_LEN - sizeof(struct rfd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	/* Get data */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	pci_unmap_single(nic->pdev, rx->dma_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
	/* this allows for a fast restart without re-enabling interrupts */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
	if(le16_to_cpu(rfd->command) & cb_el)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		nic->ru_running = RU_SUSPENDED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		/* Pull off the RFD and put the actual data (minus eth hdr) */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		skb_reserve(skb, sizeof(struct rfd));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		skb_put(skb, actual_size);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		skb->protocol = eth_type_trans(skb, nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
	if(unlikely(!(rfd_status & cb_ok))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
			/* Don't indicate if hardware indicates errors */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
			dev_kfree_skb_any(skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
	} else if(actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		/* Don't indicate oversized frames */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		nic->rx_over_length_errors++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
			dev_kfree_skb_any(skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		dev->stats.rx_packets++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		dev->stats.rx_bytes += actual_size;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		nic->netdev->last_rx = jiffies;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		if (nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
			ecdev_receive(nic->ecdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
					skb->data + sizeof(struct rfd), actual_size);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
			// No need to detect link status as
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
			// long as frames are received: Reset watchdog.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
			nic->ec_watchdog_jiffies = jiffies;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
			netif_receive_skb(skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		if(work_done)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
			(*work_done)++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	if (nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		// make receive frame descriptior usable again
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		memcpy(skb->data, &nic->blank_rfd, sizeof(struct rfd));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		rx->dma_addr = pci_map_single(nic->pdev, skb->data,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
				RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		if(pci_dma_mapping_error(rx->dma_addr)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
			rx->dma_addr = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		/* Link the RFD to end of RFA by linking previous RFD to
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		 * this one, and clearing EL bit of previous.  */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		if(rx->prev->skb) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
			struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
			put_unaligned(cpu_to_le32(rx->dma_addr),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
					(u32 *)&prev_rfd->link);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
			wmb();
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
			prev_rfd->command &= ~cpu_to_le16(cb_el);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
			pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
					sizeof(struct rfd), PCI_DMA_TODEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		rx->skb = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	unsigned int work_to_do)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
	struct rx *rx;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	int restart_required = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
	struct rx *rx_to_start = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	/* are we already rnr? then pay attention!!! this ensures that
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	 * the state machine progression never allows a start with a
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
	 * partially cleaned list, avoiding a race between hardware
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	 * and rx_to_clean when in NAPI mode */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	if(RU_SUSPENDED == nic->ru_running)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		restart_required = 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	/* Indicate newly arrived packets */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	for(rx = nic->rx_to_clean; rx->skb; rx = nic->rx_to_clean = rx->next) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		int err = e100_rx_indicate(nic, rx, work_done, work_to_do);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		if(-EAGAIN == err) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
			/* hit quota so have more work to do, restart once
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
			 * cleanup is complete */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
			restart_required = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
			break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		} else if(-ENODATA == err)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
			break; /* No more to clean */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
	/* save our starting point as the place we'll restart the receiver */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	if(restart_required)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		rx_to_start = nic->rx_to_clean;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		/* Alloc new skbs to refill list */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		for(rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
			if(unlikely(e100_rx_alloc_skb(nic, rx)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
				break; /* Better luck next time (see watchdog) */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	if(restart_required) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		// ack the rnr?
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		writeb(stat_ack_rnr, &nic->csr->scb.stat_ack);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		e100_start_receiver(nic, rx_to_start);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		if(work_done)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
			(*work_done)++;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
static void e100_rx_clean_list(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	struct rx *rx;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	unsigned int i, count = nic->params.rfds.count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	nic->ru_running = RU_UNINITIALIZED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
	if(nic->rxs) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
			if(rx->skb) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
				pci_unmap_single(nic->pdev, rx->dma_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
					RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
				dev_kfree_skb(rx->skb);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
			}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		kfree(nic->rxs);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		nic->rxs = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	nic->rx_to_use = nic->rx_to_clean = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
static int e100_rx_alloc_list(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	struct rx *rx;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	unsigned int i, count = nic->params.rfds.count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	nic->rx_to_use = nic->rx_to_clean = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	nic->ru_running = RU_UNINITIALIZED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	if(!(nic->rxs = kcalloc(count, sizeof(struct rx), GFP_ATOMIC)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		return -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		rx->next = (i + 1 < count) ? rx + 1 : nic->rxs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		rx->prev = (i == 0) ? nic->rxs + count - 1 : rx - 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		if(e100_rx_alloc_skb(nic, rx)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
			e100_rx_clean_list(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
			return -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	nic->rx_to_use = nic->rx_to_clean = nic->rxs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	nic->ru_running = RU_SUSPENDED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
static irqreturn_t e100_intr(int irq, void *dev_id)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	struct net_device *netdev = dev_id;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
	u8 stat_ack = ioread8(&nic->csr->scb.stat_ack);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	DPRINTK(INTR, DEBUG, "stat_ack = 0x%02X\n", stat_ack);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	if(stat_ack == stat_ack_not_ours ||	/* Not our interrupt */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
	   stat_ack == stat_ack_not_present)	/* Hardware is ejected */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		return IRQ_NONE;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	/* Ack interrupt(s) */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	iowrite8(stat_ack, &nic->csr->scb.stat_ack);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	/* We hit Receive No Resource (RNR); restart RU after cleaning */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	if(stat_ack & stat_ack_rnr)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		nic->ru_running = RU_SUSPENDED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	if(!nic->ecdev && likely(netif_rx_schedule_prep(netdev, &nic->napi))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		e100_disable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		__netif_rx_schedule(netdev, &nic->napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
	return IRQ_HANDLED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
void e100_ec_poll(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
1317
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
  2111
	e100_rx_clean(nic, NULL, 100);
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	e100_tx_clean(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
    if (jiffies - nic->ec_watchdog_jiffies >= 2 * HZ) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
        e100_watchdog((unsigned long) nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
        nic->ec_watchdog_jiffies = jiffies;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
    }
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
static int e100_poll(struct napi_struct *napi, int budget)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	struct nic *nic = container_of(napi, struct nic, napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	struct net_device *netdev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	unsigned int work_done = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	e100_rx_clean(nic, &work_done, budget);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	e100_tx_clean(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	/* If budget not fully consumed, exit the polling mode */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	if (work_done < budget) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
		netif_rx_complete(netdev, napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		e100_enable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	return work_done;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
#ifdef CONFIG_NET_POLL_CONTROLLER
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
static void e100_netpoll(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	e100_disable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	e100_intr(nic->pdev->irq, netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	e100_tx_clean(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
	e100_enable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
#endif
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
static int e100_set_mac_address(struct net_device *netdev, void *p)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
	struct sockaddr *addr = p;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
	if (!is_valid_ether_addr(addr->sa_data))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		return -EADDRNOTAVAIL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	e100_exec_cb(nic, NULL, e100_setup_iaaddr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
static int e100_change_mtu(struct net_device *netdev, int new_mtu)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	if(new_mtu < ETH_ZLEN || new_mtu > ETH_DATA_LEN)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
		return -EINVAL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	netdev->mtu = new_mtu;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
static int e100_asf(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	/* ASF can be enabled from eeprom */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	   (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	   !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	   ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
static int e100_up(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	int err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
	if((err = e100_rx_alloc_list(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
	if((err = e100_alloc_cbs(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		goto err_rx_clean_list;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	if((err = e100_hw_init(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
		goto err_clean_cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	e100_set_multicast_list(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	e100_start_receiver(nic, NULL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		mod_timer(&nic->watchdog, jiffies);
1316
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2196
	}
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2197
	if((err = request_irq(nic->pdev->irq, e100_intr, IRQF_SHARED,
1506
41ca84fb6bb2 Fixed IRQ freeing bug in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1504
diff changeset
  2198
		nic->netdev->name, nic->netdev)))
1316
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2199
		goto err_no_irq;
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2200
	if (!nic->ecdev) {
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		netif_wake_queue(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		napi_enable(&nic->napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		/* enable ints _after_ enabling poll, preventing a race between
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		 * disable ints+schedule */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		e100_enable_irq(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
err_no_irq:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		del_timer_sync(&nic->watchdog);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
err_clean_cbs:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
	e100_clean_cbs(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
err_rx_clean_list:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	e100_rx_clean_list(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
static void e100_down(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		/* wait here for poll to complete */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
		napi_disable(&nic->napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		netif_stop_queue(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	e100_hw_reset(nic);
1506
41ca84fb6bb2 Fixed IRQ freeing bug in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1504
diff changeset
  2227
	free_irq(nic->pdev->irq, nic->netdev);
1262
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		del_timer_sync(&nic->watchdog);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		netif_carrier_off(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	e100_clean_cbs(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	e100_rx_clean_list(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
static void e100_tx_timeout(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	/* Reset outside of interrupt context, to avoid request_irq
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	 * in interrupt context */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	schedule_work(&nic->tx_timeout_task);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
static void e100_tx_timeout_task(struct work_struct *work)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	struct nic *nic = container_of(work, struct nic, tx_timeout_task);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	struct net_device *netdev = nic->netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		ioread8(&nic->csr->scb.status));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	e100_down(netdev_priv(netdev));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	e100_up(netdev_priv(netdev));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	int err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	struct sk_buff *skb;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	/* Use driver resources to perform internal MAC or PHY
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	 * loopback test.  A single packet is prepared and transmitted
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	 * in loopback mode, and the test passes if the received
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	 * packet compares byte-for-byte to the transmitted packet. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	if((err = e100_rx_alloc_list(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
	if((err = e100_alloc_cbs(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		goto err_clean_rx;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	/* ICH PHY loopback is broken so do MAC loopback instead */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	if(nic->flags & ich && loopback_mode == lb_phy)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		loopback_mode = lb_mac;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	nic->loopback = loopback_mode;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	if((err = e100_hw_init(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		goto err_loopback_none;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	if(loopback_mode == lb_phy)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
		mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
			BMCR_LOOPBACK);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	e100_start_receiver(nic, NULL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	if(!(skb = netdev_alloc_skb(nic->netdev, ETH_DATA_LEN))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		err = -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		goto err_loopback_none;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
	skb_put(skb, ETH_DATA_LEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	memset(skb->data, 0xFF, ETH_DATA_LEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	e100_xmit_frame(skb, nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	msleep(10);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
			RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	   skb->data, ETH_DATA_LEN))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		err = -EAGAIN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
err_loopback_none:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	nic->loopback = lb_none;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	e100_clean_cbs(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	e100_hw_reset(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
err_clean_rx:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	e100_rx_clean_list(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
#define MII_LED_CONTROL	0x1B
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
static void e100_blink_led(unsigned long data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
	struct nic *nic = (struct nic *)data;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	enum led_state {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		led_on     = 0x01,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		led_off    = 0x04,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		led_on_559 = 0x05,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		led_on_557 = 0x07,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	nic->leds = (nic->leds & led_on) ? led_off :
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		(nic->mac < mac_82559_D101M) ? led_on_557 : led_on_559;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	mdio_write(nic->netdev, nic->mii.phy_id, MII_LED_CONTROL, nic->leds);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	mod_timer(&nic->blink_timer, jiffies + HZ / 4);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	return mii_ethtool_gset(&nic->mii, cmd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
static int e100_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	int err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
	mdio_write(netdev, nic->mii.phy_id, MII_BMCR, BMCR_RESET);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	err = mii_ethtool_sset(&nic->mii, cmd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	e100_exec_cb(nic, NULL, e100_configure);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
static void e100_get_drvinfo(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	struct ethtool_drvinfo *info)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
	strcpy(info->driver, DRV_NAME);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	strcpy(info->version, DRV_VERSION);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	strcpy(info->fw_version, "N/A");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	strcpy(info->bus_info, pci_name(nic->pdev));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
#define E100_PHY_REGS 0x1C
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
static int e100_get_regs_len(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	return 1 + E100_PHY_REGS + sizeof(nic->mem->dump_buf);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
static void e100_get_regs(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	struct ethtool_regs *regs, void *p)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	u32 *buff = p;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
	int i;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	regs->version = (1 << 24) | nic->pdev->revision;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	buff[0] = ioread8(&nic->csr->scb.cmd_hi) << 24 |
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		ioread8(&nic->csr->scb.cmd_lo) << 16 |
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		ioread16(&nic->csr->scb.status);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	for(i = E100_PHY_REGS; i >= 0; i--)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		buff[1 + E100_PHY_REGS - i] =
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
			mdio_read(netdev, nic->mii.phy_id, i);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	e100_exec_cb(nic, NULL, e100_dump);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	msleep(10);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		sizeof(nic->mem->dump_buf));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	wol->supported = (nic->mac >= mac_82558_D101_A4) ?  WAKE_MAGIC : 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	wol->wolopts = (nic->flags & wol_magic) ? WAKE_MAGIC : 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
static int e100_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
	if(wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		return -EOPNOTSUPP;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	if(wol->wolopts)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		nic->flags |= wol_magic;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	else
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		nic->flags &= ~wol_magic;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	e100_exec_cb(nic, NULL, e100_configure);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
static u32 e100_get_msglevel(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	return nic->msg_enable;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
static void e100_set_msglevel(struct net_device *netdev, u32 value)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	nic->msg_enable = value;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
static int e100_nway_reset(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	return mii_nway_restart(&nic->mii);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
static u32 e100_get_link(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	return mii_link_ok(&nic->mii);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
static int e100_get_eeprom_len(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	return nic->eeprom_wc << 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
#define E100_EEPROM_MAGIC	0x1234
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
static int e100_get_eeprom(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	struct ethtool_eeprom *eeprom, u8 *bytes)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	eeprom->magic = E100_EEPROM_MAGIC;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	memcpy(bytes, &((u8 *)nic->eeprom)[eeprom->offset], eeprom->len);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
static int e100_set_eeprom(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
	struct ethtool_eeprom *eeprom, u8 *bytes)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	if(eeprom->magic != E100_EEPROM_MAGIC)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		return -EINVAL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	memcpy(&((u8 *)nic->eeprom)[eeprom->offset], bytes, eeprom->len);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	return e100_eeprom_save(nic, eeprom->offset >> 1,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		(eeprom->len >> 1) + 1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
static void e100_get_ringparam(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	struct ethtool_ringparam *ring)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	struct param_range *rfds = &nic->params.rfds;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	struct param_range *cbs = &nic->params.cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	ring->rx_max_pending = rfds->max;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
	ring->tx_max_pending = cbs->max;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
	ring->rx_mini_max_pending = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	ring->rx_jumbo_max_pending = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	ring->rx_pending = rfds->count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	ring->tx_pending = cbs->count;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	ring->rx_mini_pending = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
	ring->rx_jumbo_pending = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
static int e100_set_ringparam(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	struct ethtool_ringparam *ring)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	struct param_range *rfds = &nic->params.rfds;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	struct param_range *cbs = &nic->params.cbs;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		return -EINVAL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	if(netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		e100_down(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	rfds->count = max(ring->rx_pending, rfds->min);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	rfds->count = min(rfds->count, rfds->max);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
	cbs->count = max(ring->tx_pending, cbs->min);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	cbs->count = min(cbs->count, cbs->max);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
	DPRINTK(DRV, INFO, "Ring Param settings: rx: %d, tx %d\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	        rfds->count, cbs->count);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	if(netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		e100_up(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
static const char e100_gstrings_test[][ETH_GSTRING_LEN] = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	"Link test     (on/offline)",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	"Eeprom test   (on/offline)",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	"Self test        (offline)",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	"Mac loopback     (offline)",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	"Phy loopback     (offline)",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
#define E100_TEST_LEN	sizeof(e100_gstrings_test) / ETH_GSTRING_LEN
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
static void e100_diag_test(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	struct ethtool_test *test, u64 *data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
	struct ethtool_cmd cmd;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
	int i, err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	memset(data, 0, E100_TEST_LEN * sizeof(u64));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	data[0] = !mii_link_ok(&nic->mii);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	data[1] = e100_eeprom_load(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	if(test->flags & ETH_TEST_FL_OFFLINE) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
		/* save speed, duplex & autoneg settings */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
		err = mii_ethtool_gset(&nic->mii, &cmd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		if(netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
			e100_down(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
		data[2] = e100_self_test(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
		data[3] = e100_loopback_test(nic, lb_mac);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
		data[4] = e100_loopback_test(nic, lb_phy);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		/* restore speed, duplex & autoneg settings */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
		err = mii_ethtool_sset(&nic->mii, &cmd);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
		if(netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
			e100_up(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
	for(i = 0; i < E100_TEST_LEN; i++)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
		test->flags |= data[i] ? ETH_TEST_FL_FAILED : 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
	msleep_interruptible(4 * 1000);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
static int e100_phys_id(struct net_device *netdev, u32 data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
	mod_timer(&nic->blink_timer, jiffies);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	msleep_interruptible(data * 1000);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	del_timer_sync(&nic->blink_timer);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	mdio_write(netdev, nic->mii.phy_id, MII_LED_CONTROL, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
static const char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	"rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	"tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	"rx_length_errors", "rx_over_errors", "rx_crc_errors",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	"rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	"tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	"tx_heartbeat_errors", "tx_window_errors",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	/* device-specific stats */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	"tx_deferred", "tx_single_collisions", "tx_multi_collisions",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	"tx_flow_control_pause", "rx_flow_control_pause",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	"rx_flow_control_unsupported", "tx_tco_packets", "rx_tco_packets",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
#define E100_NET_STATS_LEN	21
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
#define E100_STATS_LEN	sizeof(e100_gstrings_stats) / ETH_GSTRING_LEN
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
static int e100_get_sset_count(struct net_device *netdev, int sset)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	switch (sset) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	case ETH_SS_TEST:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		return E100_TEST_LEN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	case ETH_SS_STATS:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		return E100_STATS_LEN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	default:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		return -EOPNOTSUPP;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
static void e100_get_ethtool_stats(struct net_device *netdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	struct ethtool_stats *stats, u64 *data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	int i;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	for(i = 0; i < E100_NET_STATS_LEN; i++)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		data[i] = ((unsigned long *)&netdev->stats)[i];
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	data[i++] = nic->tx_deferred;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
	data[i++] = nic->tx_single_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	data[i++] = nic->tx_multiple_collisions;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	data[i++] = nic->tx_fc_pause;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	data[i++] = nic->rx_fc_pause;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
	data[i++] = nic->rx_fc_unsupported;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
	data[i++] = nic->tx_tco_frames;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	data[i++] = nic->rx_tco_frames;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
static void e100_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	switch(stringset) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
	case ETH_SS_TEST:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		memcpy(data, *e100_gstrings_test, sizeof(e100_gstrings_test));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	case ETH_SS_STATS:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
		memcpy(data, *e100_gstrings_stats, sizeof(e100_gstrings_stats));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		break;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
static const struct ethtool_ops e100_ethtool_ops = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
	.get_settings		= e100_get_settings,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	.set_settings		= e100_set_settings,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	.get_drvinfo		= e100_get_drvinfo,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	.get_regs_len		= e100_get_regs_len,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	.get_regs		= e100_get_regs,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	.get_wol		= e100_get_wol,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	.set_wol		= e100_set_wol,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	.get_msglevel		= e100_get_msglevel,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	.set_msglevel		= e100_set_msglevel,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	.nway_reset		= e100_nway_reset,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	.get_link		= e100_get_link,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	.get_eeprom_len		= e100_get_eeprom_len,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	.get_eeprom		= e100_get_eeprom,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	.set_eeprom		= e100_set_eeprom,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	.get_ringparam		= e100_get_ringparam,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	.set_ringparam		= e100_set_ringparam,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	.self_test		= e100_diag_test,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	.get_strings		= e100_get_strings,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	.phys_id		= e100_phys_id,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	.get_ethtool_stats	= e100_get_ethtool_stats,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	.get_sset_count		= e100_get_sset_count,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	return generic_mii_ioctl(&nic->mii, if_mii(ifr), cmd, NULL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
static int e100_alloc(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	nic->mem = pci_alloc_consistent(nic->pdev, sizeof(struct mem),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
		&nic->dma_addr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	return nic->mem ? 0 : -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
static void e100_free(struct nic *nic)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	if(nic->mem) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		pci_free_consistent(nic->pdev, sizeof(struct mem),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
			nic->mem, nic->dma_addr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
		nic->mem = NULL;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
static int e100_open(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	int err = 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		netif_carrier_off(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	if((err = e100_up(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
		DPRINTK(IFUP, ERR, "Cannot open interface, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
static int e100_close(struct net_device *netdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	e100_down(netdev_priv(netdev));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
static int __devinit e100_probe(struct pci_dev *pdev,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	const struct pci_device_id *ent)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	struct net_device *netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	struct nic *nic;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
	int err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	DECLARE_MAC_BUF(mac);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		if(((1 << debug) - 1) & NETIF_MSG_PROBE)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		return -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	netdev->open = e100_open;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	netdev->stop = e100_close;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	netdev->hard_start_xmit = e100_xmit_frame;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	netdev->set_multicast_list = e100_set_multicast_list;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	netdev->set_mac_address = e100_set_mac_address;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	netdev->change_mtu = e100_change_mtu;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	netdev->do_ioctl = e100_do_ioctl;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	netdev->tx_timeout = e100_tx_timeout;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
#ifdef CONFIG_NET_POLL_CONTROLLER
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	netdev->poll_controller = e100_netpoll;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
#endif
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	netif_napi_add(netdev, &nic->napi, e100_poll, E100_NAPI_WEIGHT);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	nic->netdev = netdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	nic->pdev = pdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	nic->msg_enable = (1 << debug) - 1;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	pci_set_drvdata(pdev, netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	if((err = pci_enable_device(pdev))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
		goto err_out_free_dev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
			"base address, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		err = -ENODEV;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
		goto err_out_disable_pdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	if((err = pci_request_regions(pdev, DRV_NAME))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		goto err_out_disable_pdev;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		goto err_out_free_res;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	SET_NETDEV_DEV(netdev, &pdev->dev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	if (use_io)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		DPRINTK(PROBE, INFO, "using i/o access mode\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	nic->csr = pci_iomap(pdev, (use_io ? 1 : 0), sizeof(struct csr));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	if(!nic->csr) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		err = -ENOMEM;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
		goto err_out_free_res;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	if(ent->driver_data)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		nic->flags |= ich;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	else
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		nic->flags &= ~ich;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
	e100_get_defaults(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	/* locks must be initialized before calling hw_reset */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
	spin_lock_init(&nic->cb_lock);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	spin_lock_init(&nic->cmd_lock);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	spin_lock_init(&nic->mdio_lock);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	/* Reset the device before pci_set_master() in case device is in some
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	 * funky state and has an interrupt pending - hint: we don't have the
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	 * interrupt handler registered yet. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
	e100_hw_reset(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	pci_set_master(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	init_timer(&nic->watchdog);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	nic->watchdog.function = e100_watchdog;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	nic->watchdog.data = (unsigned long)nic;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	init_timer(&nic->blink_timer);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	nic->blink_timer.function = e100_blink_led;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	nic->blink_timer.data = (unsigned long)nic;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	INIT_WORK(&nic->tx_timeout_task, e100_tx_timeout_task);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	if((err = e100_alloc(nic))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
		DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
		goto err_out_iounmap;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	if((err = e100_eeprom_load(nic)))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
		goto err_out_free;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	e100_phy_init(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
	memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	if (!is_valid_ether_addr(netdev->perm_addr)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
		if (!eeprom_bad_csum_allow) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
			DPRINTK(PROBE, ERR, "Invalid MAC address from "
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
			        "EEPROM, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
			err = -EAGAIN;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
			goto err_out_free;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
		} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
			DPRINTK(PROBE, ERR, "Invalid MAC address from EEPROM, "
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
			        "you MUST configure one.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	/* Wol magic packet can be enabled from eeprom */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	if((nic->mac >= mac_82558_D101_A4) &&
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	   (nic->eeprom[eeprom_id] & eeprom_id_wol))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
		nic->flags |= wol_magic;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	/* ack any pending wake events, disable PME */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	err = pci_enable_wake(pdev, 0, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	if (err)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
		DPRINTK(PROBE, ERR, "Error clearing wake event\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
	// offer device to EtherCAT master module
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	nic->ecdev = ecdev_offer(netdev, e100_ec_poll, THIS_MODULE);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
	if (nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
		if (ecdev_open(nic->ecdev)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
			ecdev_withdraw(nic->ecdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
			goto err_out_free;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		strcpy(netdev->name, "eth%d");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		if((err = register_netdev(netdev))) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
			DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
			goto err_out_free;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %s\n",
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		(unsigned long long)pci_resource_start(pdev, use_io ? 1 : 0),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
		pdev->irq, print_mac(mac, netdev->dev_addr));
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
err_out_free:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	e100_free(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
err_out_iounmap:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	pci_iounmap(pdev, nic->csr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
err_out_free_res:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	pci_release_regions(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
err_out_disable_pdev:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	pci_disable_device(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
err_out_free_dev:
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	pci_set_drvdata(pdev, NULL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	free_netdev(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	return err;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
static void __devexit e100_remove(struct pci_dev *pdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	if(netdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
		struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
		if (nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
			ecdev_close(nic->ecdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
			ecdev_withdraw(nic->ecdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
		} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
			unregister_netdev(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
		}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		e100_free(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
		iounmap(nic->csr);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
		free_netdev(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
		pci_release_regions(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
		pci_disable_device(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
		pci_set_drvdata(pdev, NULL);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
#ifdef CONFIG_PM
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	if (nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	if (netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
		napi_disable(&nic->napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	del_timer_sync(&nic->watchdog);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	netif_carrier_off(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	netif_device_detach(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	pci_save_state(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	if ((nic->flags & wol_magic) | e100_asf(nic)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
		pci_enable_wake(pdev, PCI_D3hot, 1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
		pci_enable_wake(pdev, PCI_D3cold, 1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
		pci_enable_wake(pdev, PCI_D3hot, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
		pci_enable_wake(pdev, PCI_D3cold, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
	free_irq(pdev->irq, netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	pci_disable_device(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	pci_set_power_state(pdev, PCI_D3hot);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
static int e100_resume(struct pci_dev *pdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	if (nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
		return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	pci_set_power_state(pdev, PCI_D0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
	pci_restore_state(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	/* ack any pending wake events, disable PME */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	pci_enable_wake(pdev, 0, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	netif_device_attach(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	if (netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
		e100_up(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	return 0;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
#endif /* CONFIG_PM */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
static void e100_shutdown(struct pci_dev *pdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	if (nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
		return;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	if (netif_running(netdev))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
		napi_disable(&nic->napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	del_timer_sync(&nic->watchdog);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	netif_carrier_off(nic->netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	if ((nic->flags & wol_magic) | e100_asf(nic)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
		pci_enable_wake(pdev, PCI_D3hot, 1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
		pci_enable_wake(pdev, PCI_D3cold, 1);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	} else {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		pci_enable_wake(pdev, PCI_D3hot, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
		pci_enable_wake(pdev, PCI_D3cold, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	free_irq(pdev->irq, netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	pci_disable_device(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	pci_set_power_state(pdev, PCI_D3hot);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
/* ------------------ PCI Error Recovery infrastructure  -------------- */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
/**
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
 * e100_io_error_detected - called when PCI error is detected.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
 * @pdev: Pointer to PCI device
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
 * @state: The current pci conneection state
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
static pci_ers_result_t e100_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	/* Similar to calling e100_down(), but avoids adpater I/O. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	netdev->stop(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
    
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
    if (!nic->ecdev) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
    	/* Detach; put netif into state similar to hotplug unplug. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
	    napi_enable(&nic->napi);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
    	netif_device_detach(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
    }
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
	pci_disable_device(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	/* Request a slot reset. */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	return PCI_ERS_RESULT_NEED_RESET;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
/**
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
 * e100_io_slot_reset - called after the pci bus has been reset.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
 * @pdev: Pointer to PCI device
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
 * Restart the card from scratch.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
static pci_ers_result_t e100_io_slot_reset(struct pci_dev *pdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
	if (pci_enable_device(pdev)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
		printk(KERN_ERR "e100: Cannot re-enable PCI device after reset.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		return PCI_ERS_RESULT_DISCONNECT;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	pci_set_master(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	/* Only one device per card can do a reset */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	if (0 != PCI_FUNC(pdev->devfn))
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
		return PCI_ERS_RESULT_RECOVERED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	e100_hw_reset(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	e100_phy_init(nic);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	return PCI_ERS_RESULT_RECOVERED;
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
/**
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
 * e100_io_resume - resume normal operations
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
 * @pdev: Pointer to PCI device
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
 *
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
 * Resume normal operations after an error recovery
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
 * sequence has been completed.
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
 */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
static void e100_io_resume(struct pci_dev *pdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	struct net_device *netdev = pci_get_drvdata(pdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	struct nic *nic = netdev_priv(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	/* ack any pending wake events, disable PME */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	pci_enable_wake(pdev, 0, 0);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		netif_device_attach(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	if (nic->ecdev || netif_running(netdev)) {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
		e100_open(netdev);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
		if (!nic->ecdev)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
			mod_timer(&nic->watchdog, jiffies);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
static struct pci_error_handlers e100_err_handler = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	.error_detected = e100_io_error_detected,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	.slot_reset = e100_io_slot_reset,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	.resume = e100_io_resume,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
static struct pci_driver e100_driver = {
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	.name =         DRV_NAME,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	.id_table =     e100_id_table,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	.probe =        e100_probe,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
	.remove =       __devexit_p(e100_remove),
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
#ifdef CONFIG_PM
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	/* Power Management hooks */
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
	.suspend =      e100_suspend,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	.resume =       e100_resume,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
#endif
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
	.shutdown =     e100_shutdown,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	.err_handler = &e100_err_handler,
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
};
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
static int __init e100_init_module(void)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
    printk(KERN_INFO DRV_NAME " " DRV_DESCRIPTION " " DRV_VERSION
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
            ", master " EC_MASTER_VERSION "\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	return pci_register_driver(&e100_driver);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
static void __exit e100_cleanup_module(void)
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
{
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
	printk(KERN_INFO DRV_NAME " cleaning up module...\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
	pci_unregister_driver(&e100_driver);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	printk(KERN_INFO DRV_NAME " module cleaned up.\n");
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
}
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
module_init(e100_init_module);
3c462a0dbf3c Added e100 for kernel 2.6.24, provided by Mathias Weber.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
module_exit(e100_cleanup_module);