devices/e100-2.6.20-ethercat.c
author Florian Pose <fp@igh-essen.com>
Wed, 02 Jun 2010 22:54:08 +0200
changeset 1939 1ba48f78a0a5
parent 1506 41ca84fb6bb2
child 2582 87e502828b3f
permissions -rw-r--r--
Fixed bug that caused the configuration not to be cleared when reserved but
not activated and then releasing.
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
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
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
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
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
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
 *  ---
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 *  vim: noexpandtab
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 *****************************************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
/**
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
   \file
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
   EtherCAT driver for e100-compatible NICs.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
*/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
/* Former documentation: */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
/*******************************************************************************
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
  Intel PRO/100 Linux driver
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
  Copyright(c) 1999 - 2006 Intel Corporation.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
  This program is free software; you can redistribute it and/or modify it
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
  under the terms and conditions of the GNU General Public License,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
  version 2, as published by the Free Software Foundation.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
  This program is distributed in the hope it will be useful, but WITHOUT
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
  more details.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
  You should have received a copy of the GNU General Public License along with
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
  this program; if not, write to the Free Software Foundation, Inc.,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
  The full GNU General Public License is included in this distribution in
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
  the file called "COPYING".
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
  Contact Information:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
  Linux NICS <linux.nics@intel.com>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
*******************************************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
/*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
 *	e100.c: Intel(R) PRO/100 ethernet driver
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
 *	(Re)written 2003 by scott.feldman@intel.com.  Based loosely on
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
 *	original e100 driver, but better described as a munging of
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
 *	e100, e1000, eepro100, tg3, 8139cp, and other drivers.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
 *	References:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
 *		Intel 8255x 10/100 Mbps Ethernet Controller Family,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
 *		Open Source Software Developers Manual,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
 *		http://sourceforge.net/projects/e1000
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 *	                      Theory of Operation
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
 *	I.   General
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
 *	The driver supports Intel(R) 10/100 Mbps PCI Fast Ethernet
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
 *	controller family, which includes the 82557, 82558, 82559, 82550,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
 *	82551, and 82562 devices.  82558 and greater controllers
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
 *	integrate the Intel 82555 PHY.  The controllers are used in
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
 *	server and client network interface cards, as well as in
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
 *	LAN-On-Motherboard (LOM), CardBus, MiniPCI, and ICHx
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
 *	configurations.  8255x supports a 32-bit linear addressing
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
 *	mode and operates at 33Mhz PCI clock rate.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
 *	II.  Driver Operation
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
 *	Memory-mapped mode is used exclusively to access the device's
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
 *	shared-memory structure, the Control/Status Registers (CSR). All
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
 *	setup, configuration, and control of the device, including queuing
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
 *	of Tx, Rx, and configuration commands is through the CSR.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
 *	cmd_lock serializes accesses to the CSR command register.  cb_lock
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
 *	protects the shared Command Block List (CBL).
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
 *	8255x is highly MII-compliant and all access to the PHY go
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
 *	through the Management Data Interface (MDI).  Consequently, the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
 *	driver leverages the mii.c library shared with other MII-compliant
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
 *	devices.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
 *	Big- and Little-Endian byte order as well as 32- and 64-bit
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
 *	archs are supported.  Weak-ordered memory and non-cache-coherent
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
 *	archs are supported.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
 *	III. Transmit
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
 *	A Tx skb is mapped and hangs off of a TCB.  TCBs are linked
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
 *	together in a fixed-size ring (CBL) thus forming the flexible mode
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
 *	memory structure.  A TCB marked with the suspend-bit indicates
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
 *	the end of the ring.  The last TCB processed suspends the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
 *	controller, and the controller can be restarted by issue a CU
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
 *	resume command to continue from the suspend point, or a CU start
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
 *	command to start at a given position in the ring.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
 *	Non-Tx commands (config, multicast setup, etc) are linked
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
 *	into the CBL ring along with Tx commands.  The common structure
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
 *	used for both Tx and non-Tx commands is the Command Block (CB).
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
 *	cb_to_use is the next CB to use for queuing a command; cb_to_clean
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
 *	is the next CB to check for completion; cb_to_send is the first
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
 *	CB to start on in case of a previous failure to resume.  CB clean
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
 *	up happens in interrupt context in response to a CU interrupt.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
 *	cbs_avail keeps track of number of free CB resources available.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
 * 	Hardware padding of short packets to minimum packet size is
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
 * 	enabled.  82557 pads with 7Eh, while the later controllers pad
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
 * 	with 00h.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
 *	IV.  Recieve
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
 *	The Receive Frame Area (RFA) comprises a ring of Receive Frame
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
 *	Descriptors (RFD) + data buffer, thus forming the simplified mode
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
 *	memory structure.  Rx skbs are allocated to contain both the RFD
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
 *	and the data buffer, but the RFD is pulled off before the skb is
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
 *	indicated.  The data buffer is aligned such that encapsulated
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
 *	protocol headers are u32-aligned.  Since the RFD is part of the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
 *	mapped shared memory, and completion status is contained within
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
 *	the RFD, the RFD must be dma_sync'ed to maintain a consistent
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
 *	view from software and hardware.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
 *	Under typical operation, the  receive unit (RU) is start once,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
 *	and the controller happily fills RFDs as frames arrive.  If
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
 *	replacement RFDs cannot be allocated, or the RU goes non-active,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
 *	the RU must be restarted.  Frame arrival generates an interrupt,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
 *	and Rx indication and re-allocation happen in the same context,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
 *	therefore no locking is required.  A software-generated interrupt
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
 *	is generated from the watchdog to recover from a failed allocation
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
 *	senario where all Rx resources have been indicated and none re-
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
 *	placed.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
 *	V.   Miscellaneous
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
 * 	VLAN offloading of tagging, stripping and filtering is not
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
 * 	supported, but driver will accommodate the extra 4-byte VLAN tag
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
 * 	for processing by upper layers.  Tx/Rx Checksum offloading is not
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
 * 	supported.  Tx Scatter/Gather is not supported.  Jumbo Frames is
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
 * 	not supported (hardware limitation).
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
 * 	MagicPacket(tm) WoL support is enabled/disabled via ethtool.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
 * 	Thanks to JC (jchapman@katalix.com) for helping with
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
 * 	testing/troubleshooting the development driver.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
 * 	TODO:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
 * 	o several entry points race with dev->close
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
 * 	o check for tx-no-resources/stop Q races with tx clean/wake Q
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
 *	FIXES:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
 * 2005/12/02 - Michael O'Donnell <Michael.ODonnell at stratus dot com>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
 *	- Stratus87247: protect MDI control register manipulations
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
#include <linux/module.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
#include <linux/moduleparam.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
#include <linux/kernel.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
#include <linux/types.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
#include <linux/slab.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
#include <linux/delay.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
#include <linux/init.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
#include <linux/pci.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
#include <linux/dma-mapping.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
#include <linux/netdevice.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
#include <linux/etherdevice.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
#include <linux/mii.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
#include <linux/if_vlan.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
#include <linux/skbuff.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
#include <linux/ethtool.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
#include <linux/string.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
#include <asm/unaligned.h>
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
// EtherCAT includes
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
#include "../globals.h"
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
#include "ecdev.h"
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
#define DRV_NAME		"ec_e100"
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
#define DRV_EXT			"-NAPI"
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
#define DRV_VERSION		"3.5.17-k2"DRV_EXT
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
#define DRV_DESCRIPTION		"Intel(R) PRO/100 Network Driver"
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
#define DRV_COPYRIGHT		"Copyright(c) 1999-2006 Intel Corporation"
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
#define PFX			DRV_NAME ": "
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
#define E100_WATCHDOG_PERIOD	(2 * HZ)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
#define E100_NAPI_WEIGHT	16
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
MODULE_DESCRIPTION(DRV_DESCRIPTION);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
MODULE_LICENSE("GPL");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
MODULE_VERSION(DRV_VERSION ", master " EC_MASTER_VERSION);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
void e100_ec_poll(struct net_device *);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
static int debug = 3;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
static int eeprom_bad_csum_allow = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
module_param(debug, int, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
module_param(eeprom_bad_csum_allow, int, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
#define DPRINTK(nlevel, klevel, fmt, args...) \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	(void)((NETIF_MSG_##nlevel & nic->msg_enable) && \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
		__FUNCTION__ , ## args))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
#define INTEL_8255X_ETHERNET_DEVICE(device_id, ich) {\
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	PCI_VENDOR_ID_INTEL, device_id, PCI_ANY_ID, PCI_ANY_ID, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	PCI_CLASS_NETWORK_ETHERNET << 8, 0xFFFF00, ich }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
static struct pci_device_id e100_id_table[] = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	INTEL_8255X_ETHERNET_DEVICE(0x1029, 0),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	INTEL_8255X_ETHERNET_DEVICE(0x1030, 0),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	INTEL_8255X_ETHERNET_DEVICE(0x1031, 3),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	INTEL_8255X_ETHERNET_DEVICE(0x1032, 3),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	INTEL_8255X_ETHERNET_DEVICE(0x1033, 3),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	INTEL_8255X_ETHERNET_DEVICE(0x1034, 3),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	INTEL_8255X_ETHERNET_DEVICE(0x1038, 3),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	INTEL_8255X_ETHERNET_DEVICE(0x1039, 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	INTEL_8255X_ETHERNET_DEVICE(0x103A, 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	INTEL_8255X_ETHERNET_DEVICE(0x103B, 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	INTEL_8255X_ETHERNET_DEVICE(0x103C, 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	INTEL_8255X_ETHERNET_DEVICE(0x103D, 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	INTEL_8255X_ETHERNET_DEVICE(0x103E, 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	INTEL_8255X_ETHERNET_DEVICE(0x1050, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	INTEL_8255X_ETHERNET_DEVICE(0x1051, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	INTEL_8255X_ETHERNET_DEVICE(0x1052, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	INTEL_8255X_ETHERNET_DEVICE(0x1067, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	INTEL_8255X_ETHERNET_DEVICE(0x1068, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	{ 0, }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
// prevent from being loaded automatically
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
//MODULE_DEVICE_TABLE(pci, e100_id_table);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
enum mac {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	mac_82557_D100_A  = 0,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	mac_82557_D100_B  = 1,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	mac_82557_D100_C  = 2,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	mac_82558_D101_A4 = 4,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	mac_82558_D101_B0 = 5,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	mac_82559_D101M   = 8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	mac_82559_D101S   = 9,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	mac_82550_D102    = 12,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	mac_82550_D102_C  = 13,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	mac_82551_E       = 14,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	mac_82551_F       = 15,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	mac_82551_10      = 16,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	mac_unknown       = 0xFF,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
enum phy {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	phy_100a     = 0x000003E0,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	phy_100c     = 0x035002A8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	phy_82555_tx = 0x015002A8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	phy_nsc_tx   = 0x5C002000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	phy_82562_et = 0x033002A8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	phy_82562_em = 0x032002A8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	phy_82562_ek = 0x031002A8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	phy_82562_eh = 0x017002A8,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	phy_unknown  = 0xFFFFFFFF,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
/* CSR (Control/Status Registers) */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
struct csr {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	struct {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
		u8 status;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
		u8 stat_ack;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
		u8 cmd_lo;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
		u8 cmd_hi;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		u32 gen_ptr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	} scb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	u32 port;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	u16 flash_ctrl;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	u8 eeprom_ctrl_lo;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	u8 eeprom_ctrl_hi;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	u32 mdi_ctrl;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	u32 rx_dma_count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
enum scb_status {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	rus_ready        = 0x10,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	rus_mask         = 0x3C,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
enum ru_state  {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	RU_SUSPENDED = 0,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	RU_RUNNING	 = 1,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	RU_UNINITIALIZED = -1,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
enum scb_stat_ack {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	stat_ack_not_ours    = 0x00,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	stat_ack_sw_gen      = 0x04,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	stat_ack_rnr         = 0x10,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	stat_ack_cu_idle     = 0x20,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	stat_ack_frame_rx    = 0x40,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	stat_ack_cu_cmd_done = 0x80,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	stat_ack_not_present = 0xFF,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
enum scb_cmd_hi {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	irq_mask_none = 0x00,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	irq_mask_all  = 0x01,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	irq_sw_gen    = 0x02,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
enum scb_cmd_lo {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	cuc_nop        = 0x00,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	ruc_start      = 0x01,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	ruc_load_base  = 0x06,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	cuc_start      = 0x10,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	cuc_resume     = 0x20,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	cuc_dump_addr  = 0x40,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	cuc_dump_stats = 0x50,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	cuc_load_base  = 0x60,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	cuc_dump_reset = 0x70,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
enum cuc_dump {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	cuc_dump_complete       = 0x0000A005,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	cuc_dump_reset_complete = 0x0000A007,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
enum port {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	software_reset  = 0x0000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	selftest        = 0x0001,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	selective_reset = 0x0002,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
enum eeprom_ctrl_lo {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	eesk = 0x01,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	eecs = 0x02,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	eedi = 0x04,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	eedo = 0x08,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
enum mdi_ctrl {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	mdi_write = 0x04000000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	mdi_read  = 0x08000000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	mdi_ready = 0x10000000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
enum eeprom_op {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	op_write = 0x05,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	op_read  = 0x06,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	op_ewds  = 0x10,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	op_ewen  = 0x13,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
enum eeprom_offsets {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	eeprom_cnfg_mdix  = 0x03,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	eeprom_id         = 0x0A,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	eeprom_config_asf = 0x0D,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	eeprom_smbus_addr = 0x90,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
enum eeprom_cnfg_mdix {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	eeprom_mdix_enabled = 0x0080,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
enum eeprom_id {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	eeprom_id_wol = 0x0020,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
enum eeprom_config_asf {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	eeprom_asf = 0x8000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	eeprom_gcl = 0x4000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
enum cb_status {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	cb_complete = 0x8000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	cb_ok       = 0x2000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
enum cb_command {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	cb_nop    = 0x0000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	cb_iaaddr = 0x0001,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	cb_config = 0x0002,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	cb_multi  = 0x0003,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	cb_tx     = 0x0004,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	cb_ucode  = 0x0005,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	cb_dump   = 0x0006,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	cb_tx_sf  = 0x0008,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	cb_cid    = 0x1f00,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	cb_i      = 0x2000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	cb_s      = 0x4000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	cb_el     = 0x8000,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
struct rfd {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	u16 status;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	u16 command;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	u32 link;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	u32 rbd;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	u16 actual_size;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	u16 size;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
struct rx {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	struct rx *next, *prev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	struct sk_buff *skb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	dma_addr_t dma_addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
#if defined(__BIG_ENDIAN_BITFIELD)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
#define X(a,b)	b,a
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
#else
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
#define X(a,b)	a,b
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
#endif
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
struct config {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
/*0*/	u8 X(byte_count:6, pad0:2);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
/*1*/	u8 X(X(rx_fifo_limit:4, tx_fifo_limit:3), pad1:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
/*2*/	u8 adaptive_ifs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
/*3*/	u8 X(X(X(X(mwi_enable:1, type_enable:1), read_align_enable:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	   term_write_cache_line:1), pad3:4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
/*4*/	u8 X(rx_dma_max_count:7, pad4:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
/*5*/	u8 X(tx_dma_max_count:7, dma_max_count_enable:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
/*6*/	u8 X(X(X(X(X(X(X(late_scb_update:1, direct_rx_dma:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	   tno_intr:1), cna_intr:1), standard_tcb:1), standard_stat_counter:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	   rx_discard_overruns:1), rx_save_bad_frames:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
/*7*/	u8 X(X(X(X(X(rx_discard_short_frames:1, tx_underrun_retry:2),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	   pad7:2), rx_extended_rfd:1), tx_two_frames_in_fifo:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	   tx_dynamic_tbd:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
/*8*/	u8 X(X(mii_mode:1, pad8:6), csma_disabled:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
/*9*/	u8 X(X(X(X(X(rx_tcpudp_checksum:1, pad9:3), vlan_arp_tco:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	   link_status_wake:1), arp_wake:1), mcmatch_wake:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
/*10*/	u8 X(X(X(pad10:3, no_source_addr_insertion:1), preamble_length:2),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	   loopback:2);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
/*11*/	u8 X(linear_priority:3, pad11:5);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
/*12*/	u8 X(X(linear_priority_mode:1, pad12:3), ifs:4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
/*13*/	u8 ip_addr_lo;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
/*14*/	u8 ip_addr_hi;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
/*15*/	u8 X(X(X(X(X(X(X(promiscuous_mode:1, broadcast_disabled:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	   wait_after_win:1), pad15_1:1), ignore_ul_bit:1), crc_16_bit:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	   pad15_2:1), crs_or_cdt:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
/*16*/	u8 fc_delay_lo;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
/*17*/	u8 fc_delay_hi;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
/*18*/	u8 X(X(X(X(X(rx_stripping:1, tx_padding:1), rx_crc_transfer:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	   rx_long_ok:1), fc_priority_threshold:3), pad18:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
/*19*/	u8 X(X(X(X(X(X(X(addr_wake:1, magic_packet_disable:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	   fc_disable:1), fc_restop:1), fc_restart:1), fc_reject:1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	   full_duplex_force:1), full_duplex_pin:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
/*20*/	u8 X(X(X(pad20_1:5, fc_priority_location:1), multi_ia:1), pad20_2:1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
/*21*/	u8 X(X(pad21_1:3, multicast_all:1), pad21_2:4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
/*22*/	u8 X(X(rx_d102_mode:1, rx_vlan_drop:1), pad22:6);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	u8 pad_d102[9];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
#define E100_MAX_MULTICAST_ADDRS	64
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
struct multi {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	u16 count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	u8 addr[E100_MAX_MULTICAST_ADDRS * ETH_ALEN + 2/*pad*/];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
/* Important: keep total struct u32-aligned */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
#define UCODE_SIZE			134
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
struct cb {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	u16 status;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	u16 command;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	u32 link;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	union {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
		u8 iaaddr[ETH_ALEN];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
		u32 ucode[UCODE_SIZE];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
		struct config config;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
		struct multi multi;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
		struct {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
			u32 tbd_array;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
			u16 tcb_byte_count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
			u8 threshold;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
			u8 tbd_count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
			struct {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
				u32 buf_addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
				u16 size;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
				u16 eol;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
			} tbd;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		} tcb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		u32 dump_buffer_addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	} u;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	struct cb *next, *prev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
	dma_addr_t dma_addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	struct sk_buff *skb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
enum loopback {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	lb_none = 0, lb_mac = 1, lb_phy = 3,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
struct stats {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	u32 tx_good_frames, tx_max_collisions, tx_late_collisions,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
		tx_multiple_collisions, tx_total_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	u32 rx_good_frames, rx_crc_errors, rx_alignment_errors,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
		rx_short_frame_errors;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	u32 fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	u16 xmt_tco_frames, rcv_tco_frames;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	u32 complete;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
struct mem {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	struct {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		u32 signature;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		u32 result;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	} selftest;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	struct stats stats;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	u8 dump_buf[596];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
struct param_range {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	u32 min;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	u32 max;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	u32 count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
struct params {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	struct param_range rfds;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	struct param_range cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
struct nic {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	/* Begin: frequently used values: keep adjacent for cache effect */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	u32 msg_enable				____cacheline_aligned;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	struct net_device *netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	struct pci_dev *pdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	struct rx *rxs				____cacheline_aligned;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	struct rx *rx_to_use;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	struct rx *rx_to_clean;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	struct rfd blank_rfd;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	enum ru_state ru_running;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	spinlock_t cb_lock			____cacheline_aligned;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	spinlock_t cmd_lock;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	struct csr __iomem *csr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	enum scb_cmd_lo cuc_cmd;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	unsigned int cbs_avail;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	struct cb *cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	struct cb *cb_to_use;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	struct cb *cb_to_send;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	struct cb *cb_to_clean;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	u16 tx_command;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	/* End: frequently used values: keep adjacent for cache effect */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	enum {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
		ich                = (1 << 0),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
		promiscuous        = (1 << 1),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
		multicast_all      = (1 << 2),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
		wol_magic          = (1 << 3),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
		ich_10h_workaround = (1 << 4),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	} flags					____cacheline_aligned;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	enum mac mac;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	enum phy phy;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	struct params params;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	struct net_device_stats net_stats;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	struct timer_list watchdog;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	struct timer_list blink_timer;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	struct mii_if_info mii;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	struct work_struct tx_timeout_task;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	enum loopback loopback;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	struct mem *mem;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	dma_addr_t dma_addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	dma_addr_t cbs_dma_addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	u8 adaptive_ifs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	u8 tx_threshold;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	u32 tx_frames;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	u32 tx_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	u32 tx_deferred;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	u32 tx_single_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	u32 tx_multiple_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	u32 tx_fc_pause;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	u32 tx_tco_frames;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	u32 rx_fc_pause;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	u32 rx_fc_unsupported;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	u32 rx_tco_frames;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	u32 rx_over_length_errors;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	u8 rev_id;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	u16 leds;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	u16 eeprom_wc;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	u16 eeprom[256];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	spinlock_t mdio_lock;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
    ec_device_t *ecdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
    unsigned long ec_watchdog_jiffies;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
static inline void e100_write_flush(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	/* Flush previous PCI writes through intermediate bridges
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	 * by doing a benign read */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	(void)readb(&nic->csr->scb.status);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
static void e100_enable_irq(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	unsigned long flags;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
    if (nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
        return;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	spin_lock_irqsave(&nic->cmd_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	writeb(irq_mask_none, &nic->csr->scb.cmd_hi);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	e100_write_flush(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	spin_unlock_irqrestore(&nic->cmd_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
static void e100_disable_irq(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
{
1317
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   660
	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
   661
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
   662
	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
   663
		spin_lock_irqsave(&nic->cmd_lock, flags);
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	writeb(irq_mask_all, &nic->csr->scb.cmd_hi);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	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
   666
	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
   667
		spin_unlock_irqrestore(&nic->cmd_lock, flags);
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
static void e100_hw_reset(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	/* Put CU and RU into idle with a selective reset to get
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	 * device off of PCI bus */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	writel(selective_reset, &nic->csr->port);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	e100_write_flush(nic); udelay(20);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	/* Now fully reset device */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	writel(software_reset, &nic->csr->port);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	e100_write_flush(nic); udelay(20);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	/* Mask off our interrupt line - it's unmasked after reset */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	e100_disable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
static int e100_self_test(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	u32 dma_addr = nic->dma_addr + offsetof(struct mem, selftest);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	/* Passing the self-test is a pretty good indication
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	 * that the device can DMA to/from host memory */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	nic->mem->selftest.signature = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	nic->mem->selftest.result = 0xFFFFFFFF;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	writel(selftest | dma_addr, &nic->csr->port);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	e100_write_flush(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	/* Wait 10 msec for self-test to complete */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	msleep(10);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	/* Interrupts are enabled after self-test */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	e100_disable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	/* Check results of self-test */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	if(nic->mem->selftest.result != 0) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		DPRINTK(HW, ERR, "Self-test failed: result=0x%08X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
			nic->mem->selftest.result);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
		return -ETIMEDOUT;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	if(nic->mem->selftest.signature == 0) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
		DPRINTK(HW, ERR, "Self-test failed: timed out\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
		return -ETIMEDOUT;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
static void e100_eeprom_write(struct nic *nic, u16 addr_len, u16 addr, u16 data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	u32 cmd_addr_data[3];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	u8 ctrl;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	int i, j;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	/* Three cmds: write/erase enable, write data, write/erase disable */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	cmd_addr_data[0] = op_ewen << (addr_len - 2);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) |
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
		cpu_to_le16(data);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	cmd_addr_data[2] = op_ewds << (addr_len - 2);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	/* Bit-bang cmds to write word to eeprom */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	for(j = 0; j < 3; j++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		/* Chip select */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		writeb(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
		e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		for(i = 31; i >= 0; i--) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
			ctrl = (cmd_addr_data[j] & (1 << i)) ?
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
				eecs | eedi : eecs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
			writeb(ctrl, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
			e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
			writeb(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
			e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		/* Wait 10 msec for cmd to complete */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		msleep(10);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		/* Chip deselect */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		writeb(0, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
/* General technique stolen from the eepro100 driver - very clever */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
static u16 e100_eeprom_read(struct nic *nic, u16 *addr_len, u16 addr)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	u32 cmd_addr_data;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	u16 data = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	u8 ctrl;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	int i;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	cmd_addr_data = ((op_read << *addr_len) | addr) << 16;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
	/* Chip select */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	writeb(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	/* Bit-bang to read word from eeprom */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	for(i = 31; i >= 0; i--) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		ctrl = (cmd_addr_data & (1 << i)) ? eecs | eedi : eecs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		writeb(ctrl, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		writeb(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
		e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
		/* Eeprom drives a dummy zero to EEDO after receiving
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		 * complete address.  Use this to adjust addr_len. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		ctrl = readb(&nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		if(!(ctrl & eedo) && i > 16) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
			*addr_len -= (i - 16);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
			i = 17;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		data = (data << 1) | (ctrl & eedo ? 1 : 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	/* Chip deselect */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
	writeb(0, &nic->csr->eeprom_ctrl_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	e100_write_flush(nic); udelay(4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	return le16_to_cpu(data);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
/* Load entire EEPROM image into driver cache and validate checksum */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
static int e100_eeprom_load(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	u16 addr, addr_len = 8, checksum = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	/* Try reading with an 8-bit addr len to discover actual addr len */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	e100_eeprom_read(nic, &addr_len, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	nic->eeprom_wc = 1 << addr_len;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	for(addr = 0; addr < nic->eeprom_wc; addr++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		nic->eeprom[addr] = e100_eeprom_read(nic, &addr_len, addr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
		if(addr < nic->eeprom_wc - 1)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
			checksum += cpu_to_le16(nic->eeprom[addr]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	/* The checksum, stored in the last word, is calculated such that
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	 * the sum of words should be 0xBABA */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	checksum = le16_to_cpu(0xBABA - checksum);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	if(checksum != nic->eeprom[nic->eeprom_wc - 1]) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
		DPRINTK(PROBE, ERR, "EEPROM corrupted\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		if (!eeprom_bad_csum_allow)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
			return -EAGAIN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
/* Save (portion of) driver EEPROM cache to device and update checksum */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
static int e100_eeprom_save(struct nic *nic, u16 start, u16 count)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	u16 addr, addr_len = 8, checksum = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	/* Try reading with an 8-bit addr len to discover actual addr len */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	e100_eeprom_read(nic, &addr_len, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	nic->eeprom_wc = 1 << addr_len;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	if(start + count >= nic->eeprom_wc)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		return -EINVAL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	for(addr = start; addr < start + count; addr++)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		e100_eeprom_write(nic, addr_len, addr, nic->eeprom[addr]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	/* The checksum, stored in the last word, is calculated such that
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	 * the sum of words should be 0xBABA */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	for(addr = 0; addr < nic->eeprom_wc - 1; addr++)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
		checksum += cpu_to_le16(nic->eeprom[addr]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	nic->eeprom[nic->eeprom_wc - 1] = le16_to_cpu(0xBABA - checksum);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		nic->eeprom[nic->eeprom_wc - 1]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
#define E100_WAIT_SCB_TIMEOUT 20000 /* we might have to wait 100ms!!! */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
#define E100_WAIT_SCB_FAST 20       /* delay like the old code */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
static int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	unsigned long flags = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	unsigned int i;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	int err = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		spin_lock_irqsave(&nic->cmd_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	/* Previous command is accepted when SCB clears */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
	for(i = 0; i < E100_WAIT_SCB_TIMEOUT; i++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
		if(likely(!readb(&nic->csr->scb.cmd_lo)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
			break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		cpu_relax();
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
		if(unlikely(i > E100_WAIT_SCB_FAST))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
			udelay(5);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	if(unlikely(i == E100_WAIT_SCB_TIMEOUT)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		err = -EAGAIN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		goto err_unlock;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	if(unlikely(cmd != cuc_resume))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		writel(dma_addr, &nic->csr->scb.gen_ptr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	writeb(cmd, &nic->csr->scb.cmd_lo);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
err_unlock:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		spin_unlock_irqrestore(&nic->cmd_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
static int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	struct cb *cb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	unsigned long flags = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	int err = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
		spin_lock_irqsave(&nic->cb_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	if(unlikely(!nic->cbs_avail)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		err = -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
		goto err_unlock;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	cb = nic->cb_to_use;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
	nic->cb_to_use = cb->next;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	nic->cbs_avail--;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	cb->skb = skb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	if(unlikely(!nic->cbs_avail))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
		err = -ENOSPC;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	cb_prepare(nic, cb, skb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	/* Order is important otherwise we'll be in a race with h/w:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	 * set S-bit in current first, then clear S-bit in previous. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	cb->command |= cpu_to_le16(cb_s);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	wmb();
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	cb->prev->command &= cpu_to_le16(~cb_s);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	while(nic->cb_to_send != nic->cb_to_use) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
		if(unlikely(e100_exec_cmd(nic, nic->cuc_cmd,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
			nic->cb_to_send->dma_addr))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
			/* Ok, here's where things get sticky.  It's
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
			 * possible that we can't schedule the command
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
			 * because the controller is too busy, so
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
			 * let's just queue the command and try again
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
			 * when another command is scheduled. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
			if(err == -ENOSPC) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
				//request a reset
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
				schedule_work(&nic->tx_timeout_task);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
			}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
			break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
		} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
			nic->cuc_cmd = cuc_resume;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
			nic->cb_to_send = nic->cb_to_send->next;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
err_unlock:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
		spin_unlock_irqrestore(&nic->cb_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
static u16 mdio_ctrl(struct nic *nic, u32 addr, u32 dir, u32 reg, u16 data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	u32 data_out = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	unsigned int i;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	unsigned long flags = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	/*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	 * Stratus87247: we shouldn't be writing the MDI control
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
	 * register until the Ready bit shows True.  Also, since
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	 * manipulation of the MDI control registers is a multi-step
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	 * procedure it should be done under lock.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		spin_lock_irqsave(&nic->mdio_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	for (i = 100; i; --i) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		if (readl(&nic->csr->mdi_ctrl) & mdi_ready)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
			break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
		udelay(20);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	if (unlikely(!i)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
		printk("e100.mdio_ctrl(%s) won't go Ready\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
			nic->netdev->name );
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
			spin_unlock_irqrestore(&nic->mdio_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		return 0;		/* No way to indicate timeout error */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	writel((reg << 16) | (addr << 21) | dir | data, &nic->csr->mdi_ctrl);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	for (i = 0; i < 100; i++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
		udelay(20);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
		if ((data_out = readl(&nic->csr->mdi_ctrl)) & mdi_ready)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
			break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
		spin_unlock_irqrestore(&nic->mdio_lock, flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	DPRINTK(HW, DEBUG,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		"%s:addr=%d, reg=%d, data_in=0x%04X, data_out=0x%04X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
		dir == mdi_read ? "READ" : "WRITE", addr, reg, data, data_out);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	return (u16)data_out;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
static int mdio_read(struct net_device *netdev, int addr, int reg)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	return mdio_ctrl(netdev_priv(netdev), addr, mdi_read, reg, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	mdio_ctrl(netdev_priv(netdev), addr, mdi_write, reg, data);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
static void e100_get_defaults(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	struct param_range rfds = { .min = 16, .max = 256, .count = 256 };
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	struct param_range cbs  = { .min = 64, .max = 256, .count = 128 };
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	/* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	nic->mac = (nic->flags & ich) ? mac_82559_D101M : nic->rev_id;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	if(nic->mac == mac_unknown)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
		nic->mac = mac_82557_D100_A;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	nic->params.rfds = rfds;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	nic->params.cbs = cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	/* Quadwords to DMA into FIFO before starting frame transmit */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	nic->tx_threshold = 0xE0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	/* no interrupt for every tx completion, delay = 256us if not 557*/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	nic->tx_command = cpu_to_le16(cb_tx | cb_tx_sf |
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
		((nic->mac >= mac_82558_D101_A4) ? cb_cid : cb_i));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	/* Template for a freshly allocated RFD */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	nic->blank_rfd.command = cpu_to_le16(cb_el);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	nic->blank_rfd.rbd = 0xFFFFFFFF;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	/* MII setup */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	nic->mii.phy_id_mask = 0x1F;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	nic->mii.reg_num_mask = 0x1F;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	nic->mii.dev = nic->netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	nic->mii.mdio_read = mdio_read;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	nic->mii.mdio_write = mdio_write;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	struct config *config = &cb->u.config;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	u8 *c = (u8 *)config;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	cb->command = cpu_to_le16(cb_config);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	memset(config, 0, sizeof(struct config));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
	config->byte_count = 0x16;		/* bytes in this struct */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	config->rx_fifo_limit = 0x8;		/* bytes in FIFO before DMA */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	config->direct_rx_dma = 0x1;		/* reserved */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	config->standard_tcb = 0x1;		/* 1=standard, 0=extended */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	config->standard_stat_counter = 0x1;	/* 1=standard, 0=extended */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	config->rx_discard_short_frames = 0x1;	/* 1=discard, 0=pass */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	config->tx_underrun_retry = 0x3;	/* # of underrun retries */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	config->mii_mode = 0x1;			/* 1=MII mode, 0=503 mode */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	config->pad10 = 0x6;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	config->no_source_addr_insertion = 0x1;	/* 1=no, 0=yes */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	config->preamble_length = 0x2;		/* 0=1, 1=3, 2=7, 3=15 bytes */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	config->ifs = 0x6;			/* x16 = inter frame spacing */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	config->ip_addr_hi = 0xF2;		/* ARP IP filter - not used */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	config->pad15_1 = 0x1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	config->pad15_2 = 0x1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	config->crs_or_cdt = 0x0;		/* 0=CRS only, 1=CRS or CDT */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	config->fc_delay_hi = 0x40;		/* time delay for fc frame */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	config->tx_padding = 0x1;		/* 1=pad short frames */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	config->fc_priority_threshold = 0x7;	/* 7=priority fc disabled */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
	config->pad18 = 0x1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	config->full_duplex_pin = 0x1;		/* 1=examine FDX# pin */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	config->pad20_1 = 0x1F;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	config->fc_priority_location = 0x1;	/* 1=byte#31, 0=byte#19 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	config->pad21_1 = 0x5;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	config->adaptive_ifs = nic->adaptive_ifs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	config->loopback = nic->loopback;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	if(nic->mii.force_media && nic->mii.full_duplex)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
		config->full_duplex_force = 0x1;	/* 1=force, 0=auto */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	if(nic->flags & promiscuous || nic->loopback) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
		config->rx_save_bad_frames = 0x1;	/* 1=save, 0=discard */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
		config->rx_discard_short_frames = 0x0;	/* 1=discard, 0=save */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
		config->promiscuous_mode = 0x1;		/* 1=on, 0=off */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	if(nic->flags & multicast_all)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
		config->multicast_all = 0x1;		/* 1=accept, 0=no */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	/* disable WoL when up */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	if (nic->ecdev ||
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
            (netif_running(nic->netdev) || !(nic->flags & wol_magic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
		config->magic_packet_disable = 0x1;	/* 1=off, 0=on */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	if(nic->mac >= mac_82558_D101_A4) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
		config->fc_disable = 0x1;	/* 1=Tx fc off, 0=Tx fc on */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
		config->mwi_enable = 0x1;	/* 1=enable, 0=disable */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
		config->standard_tcb = 0x0;	/* 1=standard, 0=extended */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
		config->rx_long_ok = 0x1;	/* 1=VLANs ok, 0=standard */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
		if(nic->mac >= mac_82559_D101M)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
			config->tno_intr = 0x1;		/* TCO stats enable */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
		else
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
			config->standard_stat_counter = 0x0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	DPRINTK(HW, DEBUG, "[00-07]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	DPRINTK(HW, DEBUG, "[08-15]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	DPRINTK(HW, DEBUG, "[16-23]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
		c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
/********************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
/*  Micro code for 8086:1229 Rev 8                      */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
/********************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
/*  Parameter values for the D101M B-step  */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
#define D101M_CPUSAVER_TIMER_DWORD		78
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
#define D101M_CPUSAVER_BUNDLE_DWORD		65
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
#define D101M_CPUSAVER_MIN_SIZE_DWORD		126
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
#define D101M_B_RCVBUNDLE_UCODE \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
{\
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
0x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
0x000C0001, 0x00101312, 0x000C0008, 0x00380216, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
0x0010009C, 0x00204056, 0x002380CC, 0x00380056, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
0x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
0x00380438, 0x00000000, 0x00140000, 0x00380555, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
0x00308000, 0x00100662, 0x00100561, 0x000E0408, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
0x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
0x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
0x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
0x003A0437, 0x00044010, 0x0038078A, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
0x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
0x00130824, 0x000C0001, 0x00101213, 0x00260C75, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
0x00041000, 0x00010004, 0x00130826, 0x000C0006, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
0x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
0x00101210, 0x00380C34, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
0x0021155B, 0x00100099, 0x00206559, 0x0010009C, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
0x00244559, 0x00130836, 0x000C0000, 0x00220C62, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
0x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
0x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
0x00214C0E, 0x00380555, 0x00010004, 0x00041000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
0x00278C67, 0x00040800, 0x00018100, 0x003A0437, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
0x00130826, 0x000C0001, 0x00220559, 0x00101313, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
0x00380559, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
0x00000000, 0x00130831, 0x0010090B, 0x00124813, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
0x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
0x003806A8, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
/********************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
/*  Micro code for 8086:1229 Rev 9                      */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
/********************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
/*  Parameter values for the D101S  */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
#define D101S_CPUSAVER_TIMER_DWORD		78
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
#define D101S_CPUSAVER_BUNDLE_DWORD		67
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
#define D101S_CPUSAVER_MIN_SIZE_DWORD		128
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
#define D101S_RCVBUNDLE_UCODE \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
{\
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
0x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
0x000C0001, 0x00101312, 0x000C0008, 0x00380243, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
0x0010009C, 0x00204056, 0x002380D0, 0x00380056, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
0x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
0x0038047F, 0x00000000, 0x00140000, 0x003805A3, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
0x00308000, 0x00100610, 0x00100561, 0x000E0408, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
0x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
0x00380F90, 0x00080000, 0x00103090, 0x00380F90, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
0x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
0x003A047E, 0x00044010, 0x00380819, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
0x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
0x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
0x00101213, 0x00260FF7, 0x00041000, 0x00010004, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
0x00130826, 0x000C0006, 0x00220700, 0x0013C926, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
0x00101313, 0x00380700, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
0x00101210, 0x00380FB6, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
0x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
0x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
0x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
0x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
0x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
0x00010004, 0x00041000, 0x00278FE9, 0x00040800, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
0x00018100, 0x003A047E, 0x00130826, 0x000C0001, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
0x002205A7, 0x00101313, 0x003805A7, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
0x00000000, 0x00000000, 0x00000000, 0x00130831, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
0x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
0x00041000, 0x00010004, 0x00380700  \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
/********************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
/*  Micro code for the 8086:1229 Rev F/10               */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
/********************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
/*  Parameter values for the D102 E-step  */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
#define D102_E_CPUSAVER_TIMER_DWORD		42
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
#define D102_E_CPUSAVER_BUNDLE_DWORD		54
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
#define D102_E_CPUSAVER_MIN_SIZE_DWORD		46
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
#define     D102_E_RCVBUNDLE_UCODE \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
{\
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
0x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x0EF70E36, 0x1FFF1FFF, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
0x00E014B9, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
0x00E014BD, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
0x00E014D5, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
0x00E014C1, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
0x00E014C8, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
0x00200600, 0x00E014EE, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
0x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
0x00E00E43, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
0x00300006, 0x00E014FB, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
0x00906EFD, 0x00900EFD, 0x00E00EF8, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
static void e100_setup_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
/* *INDENT-OFF* */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	static struct {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
		u32 ucode[UCODE_SIZE + 1];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		u8 mac;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
		u8 timer_dword;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
		u8 bundle_dword;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		u8 min_size_dword;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	} ucode_opts[] = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		{ D101M_B_RCVBUNDLE_UCODE,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		  mac_82559_D101M,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
		  D101M_CPUSAVER_TIMER_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		  D101M_CPUSAVER_BUNDLE_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		  D101M_CPUSAVER_MIN_SIZE_DWORD },
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		{ D101S_RCVBUNDLE_UCODE,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
		  mac_82559_D101S,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
		  D101S_CPUSAVER_TIMER_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
		  D101S_CPUSAVER_BUNDLE_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
		  D101S_CPUSAVER_MIN_SIZE_DWORD },
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		{ D102_E_RCVBUNDLE_UCODE,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		  mac_82551_F,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		  D102_E_CPUSAVER_TIMER_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		  D102_E_CPUSAVER_BUNDLE_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		  D102_E_CPUSAVER_MIN_SIZE_DWORD },
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		{ D102_E_RCVBUNDLE_UCODE,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		  mac_82551_10,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		  D102_E_CPUSAVER_TIMER_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		  D102_E_CPUSAVER_BUNDLE_DWORD,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		  D102_E_CPUSAVER_MIN_SIZE_DWORD },
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		{ {0}, 0, 0, 0, 0}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	}, *opts;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
/* *INDENT-ON* */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
/*************************************************************************
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
*  CPUSaver parameters
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
*  All CPUSaver parameters are 16-bit literals that are part of a
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
*  "move immediate value" instruction.  By changing the value of
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
*  the literal in the instruction before the code is loaded, the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
*  driver can change the algorithm.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
*  INTDELAY - This loads the dead-man timer with its initial value.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
*    When this timer expires the interrupt is asserted, and the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
*    timer is reset each time a new packet is received.  (see
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
*    BUNDLEMAX below to set the limit on number of chained packets)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
*    The current default is 0x600 or 1536.  Experiments show that
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
*    the value should probably stay within the 0x200 - 0x1000.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
*  BUNDLEMAX -
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
*    This sets the maximum number of frames that will be bundled.  In
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
*    some situations, such as the TCP windowing algorithm, it may be
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
*    better to limit the growth of the bundle size than let it go as
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
*    high as it can, because that could cause too much added latency.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
*    The default is six, because this is the number of packets in the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
*    default TCP window size.  A value of 1 would make CPUSaver indicate
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
*    an interrupt for every frame received.  If you do not want to put
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
*    a limit on the bundle size, set this value to xFFFF.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
*  BUNDLESMALL -
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
*    This contains a bit-mask describing the minimum size frame that
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
*    will be bundled.  The default masks the lower 7 bits, which means
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
*    that any frame less than 128 bytes in length will not be bundled,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
*    but will instead immediately generate an interrupt.  This does
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
*    not affect the current bundle in any way.  Any frame that is 128
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
*    bytes or large will be bundled normally.  This feature is meant
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
*    to provide immediate indication of ACK frames in a TCP environment.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
*    Customers were seeing poor performance when a machine with CPUSaver
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
*    enabled was sending but not receiving.  The delay introduced when
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
*    the ACKs were received was enough to reduce total throughput, because
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
*    the sender would sit idle until the ACK was finally seen.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
*
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
*    The current default is 0xFF80, which masks out the lower 7 bits.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
*    This means that any frame which is x7F (127) bytes or smaller
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
*    will cause an immediate interrupt.  Because this value must be a
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
*    bit mask, there are only a few valid values that can be used.  To
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
*    turn this feature off, the driver can write the value xFFFF to the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
*    lower word of this instruction (in the same way that the other
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
*    parameters are used).  Likewise, a value of 0xF800 (2047) would
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
*    cause an interrupt to be generated for every frame, because all
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
*    standard Ethernet frames are <= 2047 bytes in length.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
*************************************************************************/
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
/* if you wish to disable the ucode functionality, while maintaining the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
 * workarounds it provides, set the following defines to:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
 * BUNDLESMALL 0
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
 * BUNDLEMAX 1
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
 * INTDELAY 1
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
#define BUNDLESMALL 1
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
#define BUNDLEMAX (u16)6
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
#define INTDELAY (u16)1536 /* 0x600 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	/* do not load u-code for ICH devices */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	if (nic->flags & ich)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		goto noloaducode;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
	/* Search for ucode match against h/w rev_id */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	for (opts = ucode_opts; opts->mac; opts++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		int i;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		u32 *ucode = opts->ucode;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		if (nic->mac != opts->mac)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
			continue;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		/* Insert user-tunable settings */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		ucode[opts->timer_dword] &= 0xFFFF0000;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		ucode[opts->timer_dword] |= INTDELAY;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		ucode[opts->bundle_dword] &= 0xFFFF0000;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		ucode[opts->bundle_dword] |= BUNDLEMAX;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		ucode[opts->min_size_dword] &= 0xFFFF0000;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		ucode[opts->min_size_dword] |= (BUNDLESMALL) ? 0xFFFF : 0xFF80;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		for (i = 0; i < UCODE_SIZE; i++)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
			cb->u.ucode[i] = cpu_to_le32(ucode[i]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		cb->command = cpu_to_le16(cb_ucode | cb_el);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		return;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
noloaducode:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	cb->command = cpu_to_le16(cb_nop | cb_el);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
static inline int e100_exec_cb_wait(struct nic *nic, struct sk_buff *skb,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	int err = 0, counter = 50;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	struct cb *cb = nic->cb_to_clean;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	if ((err = e100_exec_cb(nic, NULL, e100_setup_ucode)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		DPRINTK(PROBE,ERR, "ucode cmd failed with error %d\n", err);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	/* must restart cuc */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	nic->cuc_cmd = cuc_start;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	/* wait for completion */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	e100_write_flush(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	udelay(10);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	/* wait for possibly (ouch) 500ms */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
	while (!(cb->status & cpu_to_le16(cb_complete))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		msleep(10);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		if (!--counter) break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	/* ack any interupts, something could have been set */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	writeb(~0, &nic->csr->scb.stat_ack);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	/* if the command failed, or is not OK, notify and return */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
	if (!counter || !(cb->status & cpu_to_le16(cb_ok))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		DPRINTK(PROBE,ERR, "ucode load failed\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
		err = -EPERM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	struct sk_buff *skb)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	cb->command = cpu_to_le16(cb_iaaddr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	memcpy(cb->u.iaaddr, nic->netdev->dev_addr, ETH_ALEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
static void e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	cb->command = cpu_to_le16(cb_dump);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	cb->u.dump_buffer_addr = cpu_to_le32(nic->dma_addr +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		offsetof(struct mem, dump_buf));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
#define NCONFIG_AUTO_SWITCH	0x0080
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
#define MII_NSC_CONG		MII_RESV1
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
#define NSC_CONG_ENABLE		0x0100
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
#define NSC_CONG_TXREADY	0x0400
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
#define ADVERTISE_FC_SUPPORTED	0x0400
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
static int e100_phy_init(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	struct net_device *netdev = nic->netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	u32 addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	u16 bmcr, stat, id_lo, id_hi, cong;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
	/* Discover phy addr by searching addrs in order {1,0,2,..., 31} */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	for(addr = 0; addr < 32; addr++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		nic->mii.phy_id = (addr == 0) ? 1 : (addr == 1) ? 0 : addr;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		bmcr = mdio_read(netdev, nic->mii.phy_id, MII_BMCR);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		if(!((bmcr == 0xFFFF) || ((stat == 0) && (bmcr == 0))))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
			break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	if(addr == 32)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		return -EAGAIN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	/* Selected the phy and isolate the rest */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
	for(addr = 0; addr < 32; addr++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		if(addr != nic->mii.phy_id) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
			mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
			bmcr = mdio_read(netdev, addr, MII_BMCR);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
			mdio_write(netdev, addr, MII_BMCR,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
				bmcr & ~BMCR_ISOLATE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	/* Get phy ID */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	nic->phy = (u32)id_hi << 16 | (u32)id_lo;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	/* Handle National tx phys */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
#define NCS_PHY_MODEL_MASK	0xFFF0FFFF
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	if((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		/* Disable congestion control */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		cong = mdio_read(netdev, nic->mii.phy_id, MII_NSC_CONG);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		cong |= NSC_CONG_TXREADY;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		cong &= ~NSC_CONG_ENABLE;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	if((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		!(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		/* enable/disable MDI/MDI-X auto-switching. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
				nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
static int e100_hw_init(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	int err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
	e100_hw_reset(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
	DPRINTK(HW, ERR, "e100_hw_init\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	if(!in_interrupt() && (err = e100_self_test(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	if((err = e100_phy_init(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	if((err = e100_exec_cmd(nic, cuc_load_base, 0)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	if((err = e100_exec_cmd(nic, ruc_load_base, 0)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	if ((err = e100_exec_cb_wait(nic, NULL, e100_setup_ucode)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
	if((err = e100_exec_cb(nic, NULL, e100_configure)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
	if((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	if((err = e100_exec_cmd(nic, cuc_dump_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
		nic->dma_addr + offsetof(struct mem, stats))))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	if((err = e100_exec_cmd(nic, cuc_dump_reset, 0)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	e100_disable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	struct net_device *netdev = nic->netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	struct dev_mc_list *list = netdev->mc_list;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	u16 i, count = min(netdev->mc_count, E100_MAX_MULTICAST_ADDRS);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
	cb->command = cpu_to_le16(cb_multi);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
	for(i = 0; list && i < count; i++, list = list->next)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		memcpy(&cb->u.multi.addr[i*ETH_ALEN], &list->dmi_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
			ETH_ALEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
static void e100_set_multicast_list(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	DPRINTK(HW, DEBUG, "mc_count=%d, flags=0x%04X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		netdev->mc_count, netdev->flags);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
	if(netdev->flags & IFF_PROMISC)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		nic->flags |= promiscuous;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	else
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		nic->flags &= ~promiscuous;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	if(netdev->flags & IFF_ALLMULTI ||
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		netdev->mc_count > E100_MAX_MULTICAST_ADDRS)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		nic->flags |= multicast_all;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
	else
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		nic->flags &= ~multicast_all;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
	e100_exec_cb(nic, NULL, e100_configure);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	e100_exec_cb(nic, NULL, e100_multi);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
static void e100_update_stats(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	struct net_device_stats *ns = &nic->net_stats;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
	struct stats *s = &nic->mem->stats;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
	u32 *complete = (nic->mac < mac_82558_D101_A4) ? &s->fc_xmt_pause :
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
		(nic->mac < mac_82559_D101M) ? (u32 *)&s->xmt_tco_frames :
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		&s->complete;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	/* Device's stats reporting may take several microseconds to
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	 * complete, so where always waiting for results of the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
	 * previous command. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
	if(*complete == le32_to_cpu(cuc_dump_reset_complete)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		*complete = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		nic->tx_frames = le32_to_cpu(s->tx_good_frames);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		nic->tx_collisions = le32_to_cpu(s->tx_total_collisions);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		ns->tx_aborted_errors += le32_to_cpu(s->tx_max_collisions);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		ns->tx_window_errors += le32_to_cpu(s->tx_late_collisions);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		ns->tx_carrier_errors += le32_to_cpu(s->tx_lost_crs);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		ns->tx_fifo_errors += le32_to_cpu(s->tx_underruns);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		ns->collisions += nic->tx_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
			le32_to_cpu(s->tx_lost_crs);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
			nic->rx_over_length_errors;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		ns->rx_missed_errors += le32_to_cpu(s->rx_resource_errors);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
			le32_to_cpu(s->rx_alignment_errors) +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
			le32_to_cpu(s->rx_short_frame_errors) +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
			le32_to_cpu(s->rx_cdt_errors);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		nic->tx_deferred += le32_to_cpu(s->tx_deferred);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		nic->tx_single_collisions +=
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
			le32_to_cpu(s->tx_single_collisions);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		nic->tx_multiple_collisions +=
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
			le32_to_cpu(s->tx_multiple_collisions);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		if(nic->mac >= mac_82558_D101_A4) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			nic->tx_fc_pause += le32_to_cpu(s->fc_xmt_pause);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
			nic->rx_fc_pause += le32_to_cpu(s->fc_rcv_pause);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
			nic->rx_fc_unsupported +=
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
				le32_to_cpu(s->fc_rcv_unsupported);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
			if(nic->mac >= mac_82559_D101M) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
				nic->tx_tco_frames +=
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
					le16_to_cpu(s->xmt_tco_frames);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
				nic->rx_tco_frames +=
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
					le16_to_cpu(s->rcv_tco_frames);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
			}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
	if(e100_exec_cmd(nic, cuc_dump_reset, 0))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
		DPRINTK(TX_ERR, DEBUG, "exec cuc_dump_reset failed\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	/* Adjust inter-frame-spacing (IFS) between two transmits if
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	 * we're getting collisions on a half-duplex connection. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	if(duplex == DUPLEX_HALF) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
		u32 prev = nic->adaptive_ifs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
		u32 min_frames = (speed == SPEED_100) ? 1000 : 100;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
		if((nic->tx_frames / 32 < nic->tx_collisions) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
		   (nic->tx_frames > min_frames)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
			if(nic->adaptive_ifs < 60)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
				nic->adaptive_ifs += 5;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
		} else if (nic->tx_frames < min_frames) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
			if(nic->adaptive_ifs >= 5)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
				nic->adaptive_ifs -= 5;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
		if(nic->adaptive_ifs != prev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
			e100_exec_cb(nic, NULL, e100_configure);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
static void e100_watchdog(unsigned long data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	struct nic *nic = (struct nic *)data;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	struct ethtool_cmd cmd;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	DPRINTK(TIMER, DEBUG, "right now = %ld\n", jiffies);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	/* mii library handles link maintenance tasks */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
    if (nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		ecdev_set_link(nic->ecdev, mii_link_ok(&nic->mii) ? 1 : 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
    } else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
		mii_ethtool_gset(&nic->mii, &cmd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		if(mii_link_ok(&nic->mii) && !netif_carrier_ok(nic->netdev)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
			DPRINTK(LINK, INFO, "link up, %sMbps, %s-duplex\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
					cmd.speed == SPEED_100 ? "100" : "10",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
					cmd.duplex == DUPLEX_FULL ? "full" : "half");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		} else if(!mii_link_ok(&nic->mii) && netif_carrier_ok(nic->netdev)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
			DPRINTK(LINK, INFO, "link down\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		}
1502
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1638
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1639
		mii_check_link(&nic->mii);
1504
e02f3344a748 Minor: Removed unnecessary condition.
Florian Pose <fp@igh-essen.com>
parents: 1502
diff changeset
  1640
1311
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1641
		/* 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
  1642
		 * allocation failure.
bf7c62bc533f Fixed generation of unnecessary software interrupt in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1300
diff changeset
  1643
		 * 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
  1644
		 * 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
  1645
		 * interrupt mask bit and the SW Interrupt generation bit */
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
		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
  1647
		writeb(readb(&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
  1648
		e100_write_flush(nic);
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
		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
  1650
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1651
		e100_update_stats(nic);
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1652
		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
  1653
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1654
		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
  1655
			/* 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
  1656
			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
  1657
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1658
		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
  1659
			/* 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
  1660
			nic->flags |= ich_10h_workaround;
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1661
		else
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1662
			nic->flags &= ~ich_10h_workaround;
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1663
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		mod_timer(&nic->watchdog, jiffies + E100_WATCHDOG_PERIOD);
1502
9715a5599590 Fixed segfault on link change in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
  1665
	}
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
static void e100_xmit_prepare(struct nic *nic, struct cb *cb,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
	struct sk_buff *skb)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	cb->command = nic->tx_command;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	/* interrupt every 16 packets regardless of delay */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	if((nic->cbs_avail & ~15) == nic->cbs_avail)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
		cb->command |= cpu_to_le16(cb_i);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	cb->u.tcb.tcb_byte_count = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	cb->u.tcb.threshold = nic->tx_threshold;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	cb->u.tcb.tbd_count = 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		skb->data, skb->len, PCI_DMA_TODEVICE));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	/* check for mapping failure? */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	cb->u.tcb.tbd.size = cpu_to_le16(skb->len);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
	int err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	if(nic->flags & ich_10h_workaround) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		/* SW workaround for ICH[x] 10Mbps/half duplex Tx hang.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		   Issue a NOP command followed by a 1us delay before
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		   issuing the Tx command. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		if(e100_exec_cmd(nic, cuc_nop, 0))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
			DPRINTK(TX_ERR, DEBUG, "exec cuc_nop failed\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		udelay(1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	err = e100_exec_cb(nic, skb, e100_xmit_prepare);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	switch(err) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	case -ENOSPC:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
		/* We queued the skb, but now we're out of space. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		DPRINTK(TX_ERR, DEBUG, "No space for CB\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
        if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
            netif_stop_queue(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
		break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	case -ENOMEM:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		/* This is a hard error - log it. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		DPRINTK(TX_ERR, DEBUG, "Out of Tx resources, returning skb\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
        if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
            netif_stop_queue(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		return 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	netdev->trans_start = jiffies;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
static int e100_tx_clean(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	struct cb *cb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	int tx_cleaned = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		spin_lock(&nic->cb_lock);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
	/* Clean CBs marked complete */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
	for(cb = nic->cb_to_clean;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	    cb->status & cpu_to_le16(cb_complete);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	    cb = nic->cb_to_clean = cb->next) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		DPRINTK(TX_DONE, DEBUG, "cb[%d]->status = 0x%04X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		        (int)(((void*)cb - (void*)nic->cbs)/sizeof(struct cb)),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		        cb->status);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
		if(likely(cb->skb != NULL)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
			nic->net_stats.tx_packets++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
			nic->net_stats.tx_bytes += cb->skb->len;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
			pci_unmap_single(nic->pdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
				le32_to_cpu(cb->u.tcb.tbd.buf_addr),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
				le16_to_cpu(cb->u.tcb.tbd.size),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
				PCI_DMA_TODEVICE);
1230
0f3878668790 Fixed freeing transmit socket buffers.
Florian Pose <fp@igh-essen.com>
parents: 1229
diff changeset
  1744
			if (!nic->ecdev)
0f3878668790 Fixed freeing transmit socket buffers.
Florian Pose <fp@igh-essen.com>
parents: 1229
diff changeset
  1745
				dev_kfree_skb_any(cb->skb);
0f3878668790 Fixed freeing transmit socket buffers.
Florian Pose <fp@igh-essen.com>
parents: 1229
diff changeset
  1746
			cb->skb = NULL;
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
			tx_cleaned = 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		cb->status = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		nic->cbs_avail++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		spin_unlock(&nic->cb_lock);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		/* Recover from running out of Tx resources in xmit_frame */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
		if(unlikely(tx_cleaned && netif_queue_stopped(nic->netdev)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
			netif_wake_queue(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	return tx_cleaned;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
static void e100_clean_cbs(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	if(nic->cbs) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		while(nic->cbs_avail != nic->params.cbs.count) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
			struct cb *cb = nic->cb_to_clean;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
			if(cb->skb) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
				pci_unmap_single(nic->pdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
					le32_to_cpu(cb->u.tcb.tbd.buf_addr),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
					le16_to_cpu(cb->u.tcb.tbd.size),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
					PCI_DMA_TODEVICE);
1230
0f3878668790 Fixed freeing transmit socket buffers.
Florian Pose <fp@igh-essen.com>
parents: 1229
diff changeset
  1774
				if (!nic->ecdev)
0f3878668790 Fixed freeing transmit socket buffers.
Florian Pose <fp@igh-essen.com>
parents: 1229
diff changeset
  1775
					dev_kfree_skb(cb->skb);
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
			}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
			nic->cb_to_clean = nic->cb_to_clean->next;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
			nic->cbs_avail++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		pci_free_consistent(nic->pdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
			sizeof(struct cb) * nic->params.cbs.count,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
			nic->cbs, nic->cbs_dma_addr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		nic->cbs = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		nic->cbs_avail = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	nic->cuc_cmd = cuc_start;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean =
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		nic->cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
static int e100_alloc_cbs(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	struct cb *cb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
	unsigned int i, count = nic->params.cbs.count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	nic->cuc_cmd = cuc_start;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	nic->cbs_avail = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	nic->cbs = pci_alloc_consistent(nic->pdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		sizeof(struct cb) * count, &nic->cbs_dma_addr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	if(!nic->cbs)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		return -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	for(cb = nic->cbs, i = 0; i < count; cb++, i++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		cb->next = (i + 1 < count) ? cb + 1 : nic->cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		cb->prev = (i == 0) ? nic->cbs + count - 1 : cb - 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		cb->link = cpu_to_le32(nic->cbs_dma_addr +
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
			((i+1) % count) * sizeof(struct cb));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		cb->skb = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	nic->cbs_avail = count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	if(!nic->rxs) return;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	if(RU_SUSPENDED != nic->ru_running) return;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
	/* handle init time starts */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
	if(!rx) rx = nic->rxs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
	/* (Re)start RU if suspended or idle and RFA is non-NULL */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
	if(rx->skb) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		e100_exec_cmd(nic, ruc_start, rx->dma_addr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		nic->ru_running = RU_RUNNING;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	if(!(rx->skb = netdev_alloc_skb(nic->netdev, RFD_BUF_LEN + NET_IP_ALIGN)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		return -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	/* Align, init, and map the RFD. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	skb_reserve(rx->skb, NET_IP_ALIGN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	memcpy(rx->skb->data, &nic->blank_rfd, sizeof(struct rfd));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	if(pci_dma_mapping_error(rx->dma_addr)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		dev_kfree_skb_any(rx->skb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		rx->skb = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		rx->dma_addr = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		return -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
	/* Link the RFD to end of RFA by linking previous RFD to
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
	 * this one, and clearing EL bit of previous.  */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	if(rx->prev->skb) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		put_unaligned(cpu_to_le32(rx->dma_addr),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
			(u32 *)&prev_rfd->link);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		wmb();
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		prev_rfd->command &= ~cpu_to_le16(cb_el);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
			sizeof(struct rfd), PCI_DMA_TODEVICE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
static int e100_rx_indicate(struct nic *nic, struct rx *rx,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	unsigned int *work_done, unsigned int work_to_do)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	struct sk_buff *skb = rx->skb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	struct rfd *rfd = (struct rfd *)skb->data;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	u16 rfd_status, actual_size;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
	if(unlikely(work_done && *work_done >= work_to_do))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		return -EAGAIN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	/* Need to sync before taking a peek at cb_complete bit */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
	pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		sizeof(struct rfd), PCI_DMA_FROMDEVICE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	rfd_status = le16_to_cpu(rfd->status);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
	/* If data isn't ready, nothing to indicate */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	if(unlikely(!(rfd_status & cb_complete)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		return -ENODATA;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	/* Get actual data size */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
	actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
	if(unlikely(actual_size > RFD_BUF_LEN - sizeof(struct rfd)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		actual_size = RFD_BUF_LEN - sizeof(struct rfd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	/* Get data */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	pci_unmap_single(nic->pdev, rx->dma_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	/* this allows for a fast restart without re-enabling interrupts */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	if(le16_to_cpu(rfd->command) & cb_el)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		nic->ru_running = RU_SUSPENDED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		/* Pull off the RFD and put the actual data (minus eth hdr) */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		skb_reserve(skb, sizeof(struct rfd));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		skb_put(skb, actual_size);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		skb->protocol = eth_type_trans(skb, nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
	if(unlikely(!(rfd_status & cb_ok))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
			/* Don't indicate if hardware indicates errors */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
			dev_kfree_skb_any(skb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	} else if(actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		/* Don't indicate oversized frames */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		nic->rx_over_length_errors++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
			dev_kfree_skb_any(skb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
	} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		nic->net_stats.rx_packets++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
		nic->net_stats.rx_bytes += actual_size;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		nic->netdev->last_rx = jiffies;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		if (nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
			ecdev_receive(nic->ecdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
					skb->data + sizeof(struct rfd), actual_size);
1228
6d9c686f922e Frame reception basically working (still some more testing needed).
Florian Pose <fp@igh-essen.com>
parents: 1227
diff changeset
  1928
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
			// No need to detect link status as
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
			// long as frames are received: Reset watchdog.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
			nic->ec_watchdog_jiffies = jiffies;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
			netif_receive_skb(skb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		if(work_done)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
			(*work_done)++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
1228
6d9c686f922e Frame reception basically working (still some more testing needed).
Florian Pose <fp@igh-essen.com>
parents: 1227
diff changeset
  1939
	if (nic->ecdev) {
6d9c686f922e Frame reception basically working (still some more testing needed).
Florian Pose <fp@igh-essen.com>
parents: 1227
diff changeset
  1940
		// make receive frame descriptior usable again
1229
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1941
		memcpy(skb->data, &nic->blank_rfd, sizeof(struct rfd));
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1942
		rx->dma_addr = pci_map_single(nic->pdev, skb->data,
1228
6d9c686f922e Frame reception basically working (still some more testing needed).
Florian Pose <fp@igh-essen.com>
parents: 1227
diff changeset
  1943
				RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
1229
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1944
		if(pci_dma_mapping_error(rx->dma_addr)) {
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1945
			rx->dma_addr = 0;
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1946
		}
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1947
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1948
		/* Link the RFD to end of RFA by linking previous RFD to
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1949
		 * this one, and clearing EL bit of previous.  */
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1950
		if(rx->prev->skb) {
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1951
			struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1952
			put_unaligned(cpu_to_le32(rx->dma_addr),
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1953
					(u32 *)&prev_rfd->link);
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1954
			wmb();
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1955
			prev_rfd->command &= ~cpu_to_le16(cb_el);
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1956
			pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1957
					sizeof(struct rfd), PCI_DMA_TODEVICE);
51d447754109 Fixed re-using RFDs.
Florian Pose <fp@igh-essen.com>
parents: 1228
diff changeset
  1958
		}
1228
6d9c686f922e Frame reception basically working (still some more testing needed).
Florian Pose <fp@igh-essen.com>
parents: 1227
diff changeset
  1959
	} else {
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		rx->skb = NULL;
1228
6d9c686f922e Frame reception basically working (still some more testing needed).
Florian Pose <fp@igh-essen.com>
parents: 1227
diff changeset
  1961
	}
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	unsigned int work_to_do)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
	struct rx *rx;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	int restart_required = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
	struct rx *rx_to_start = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	/* are we already rnr? then pay attention!!! this ensures that
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
	 * the state machine progression never allows a start with a
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	 * partially cleaned list, avoiding a race between hardware
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	 * and rx_to_clean when in NAPI mode */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
	if(RU_SUSPENDED == nic->ru_running)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		restart_required = 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	/* Indicate newly arrived packets */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
	for(rx = nic->rx_to_clean; rx->skb; rx = nic->rx_to_clean = rx->next) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		int err = e100_rx_indicate(nic, rx, work_done, work_to_do);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		if(-EAGAIN == err) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
			/* hit quota so have more work to do, restart once
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
			 * cleanup is complete */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
			restart_required = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
			break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		} else if(-ENODATA == err)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
			break; /* No more to clean */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	/* save our starting point as the place we'll restart the receiver */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	if(restart_required)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		rx_to_start = nic->rx_to_clean;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		/* Alloc new skbs to refill list */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		for(rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
			if(unlikely(e100_rx_alloc_skb(nic, rx)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
				break; /* Better luck next time (see watchdog) */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	if(restart_required) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		// ack the rnr?
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		writeb(stat_ack_rnr, &nic->csr->scb.stat_ack);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		e100_start_receiver(nic, rx_to_start);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		if(work_done)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
			(*work_done)++;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
static void e100_rx_clean_list(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	struct rx *rx;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	unsigned int i, count = nic->params.rfds.count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	nic->ru_running = RU_UNINITIALIZED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	if(nic->rxs) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
			if(rx->skb) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
				pci_unmap_single(nic->pdev, rx->dma_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
					RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
				dev_kfree_skb(rx->skb);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
			}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		kfree(nic->rxs);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		nic->rxs = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
	nic->rx_to_use = nic->rx_to_clean = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
static int e100_rx_alloc_list(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	struct rx *rx;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
	unsigned int i, count = nic->params.rfds.count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
	nic->rx_to_use = nic->rx_to_clean = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
	nic->ru_running = RU_UNINITIALIZED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	if(!(nic->rxs = kcalloc(count, sizeof(struct rx), GFP_ATOMIC)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		return -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		rx->next = (i + 1 < count) ? rx + 1 : nic->rxs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		rx->prev = (i == 0) ? nic->rxs + count - 1 : rx - 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		if(e100_rx_alloc_skb(nic, rx)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
			e100_rx_clean_list(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
			return -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
	nic->rx_to_use = nic->rx_to_clean = nic->rxs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	nic->ru_running = RU_SUSPENDED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
static irqreturn_t e100_intr(int irq, void *dev_id)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	struct net_device *netdev = dev_id;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	u8 stat_ack = readb(&nic->csr->scb.stat_ack);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
	DPRINTK(INTR, DEBUG, "stat_ack = 0x%02X\n", stat_ack);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	if(stat_ack == stat_ack_not_ours ||	/* Not our interrupt */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
	   stat_ack == stat_ack_not_present)	/* Hardware is ejected */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		return IRQ_NONE;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
	/* Ack interrupt(s) */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	writeb(stat_ack, &nic->csr->scb.stat_ack);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
	/* We hit Receive No Resource (RNR); restart RU after cleaning */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	if(stat_ack & stat_ack_rnr)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		nic->ru_running = RU_SUSPENDED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	if(!nic->ecdev && likely(netif_rx_schedule_prep(netdev))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		e100_disable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		__netif_rx_schedule(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	return IRQ_HANDLED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
void e100_ec_poll(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
1317
09173a2de40c Allow disabling interrupts on e100, because they are enabled after hardware reset.
Florian Pose <fp@igh-essen.com>
parents: 1316
diff changeset
  2092
	e100_rx_clean(nic, NULL, 100);
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	e100_tx_clean(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
    if (jiffies - nic->ec_watchdog_jiffies >= 2 * HZ) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
        e100_watchdog((unsigned long) nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
        nic->ec_watchdog_jiffies = jiffies;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
    }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
static int e100_poll(struct net_device *netdev, int *budget)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
	unsigned int work_to_do = min(netdev->quota, *budget);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	unsigned int work_done = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
	int tx_cleaned;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	e100_rx_clean(nic, &work_done, work_to_do);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	tx_cleaned = e100_tx_clean(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	/* If no Rx and Tx cleanup work was done, exit polling mode. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
		netif_rx_complete(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		e100_enable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
		return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	*budget -= work_done;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	netdev->quota -= work_done;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
	return 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
#ifdef CONFIG_NET_POLL_CONTROLLER
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
static void e100_netpoll(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	e100_disable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	e100_intr(nic->pdev->irq, netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	e100_tx_clean(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	e100_enable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
#endif
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
static struct net_device_stats *e100_get_stats(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	return &nic->net_stats;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
static int e100_set_mac_address(struct net_device *netdev, void *p)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	struct sockaddr *addr = p;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
	if (!is_valid_ether_addr(addr->sa_data))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
		return -EADDRNOTAVAIL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	e100_exec_cb(nic, NULL, e100_setup_iaaddr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
static int e100_change_mtu(struct net_device *netdev, int new_mtu)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	if(new_mtu < ETH_ZLEN || new_mtu > ETH_DATA_LEN)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		return -EINVAL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	netdev->mtu = new_mtu;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
static int e100_asf(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	/* ASF can be enabled from eeprom */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	   (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	   !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	   ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
static int e100_up(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	int err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	if((err = e100_rx_alloc_list(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	if((err = e100_alloc_cbs(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
		goto err_rx_clean_list;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	if((err = e100_hw_init(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		goto err_clean_cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	e100_set_multicast_list(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	e100_start_receiver(nic, NULL);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
    if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		mod_timer(&nic->watchdog, jiffies);
1316
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2187
	}
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2188
	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
  2189
		nic->netdev->name, nic->netdev)))
1316
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2190
		goto err_no_irq;
d01d9cce8b59 Fixed unprocessed interrupts in e100 driver.
Florian Pose <fp@igh-essen.com>
parents: 1311
diff changeset
  2191
	if (!nic->ecdev) {
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
        netif_wake_queue(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
        netif_poll_enable(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
        /* enable ints _after_ enabling poll, preventing a race between
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
         * disable ints+schedule */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
        e100_enable_irq(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
    }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
err_no_irq:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
    if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		del_timer_sync(&nic->watchdog);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
err_clean_cbs:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	e100_clean_cbs(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
err_rx_clean_list:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	e100_rx_clean_list(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
static void e100_down(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
    if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
        /* wait here for poll to complete */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
        netif_poll_disable(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
        netif_stop_queue(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
    }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	e100_hw_reset(nic);
1506
41ca84fb6bb2 Fixed IRQ freeing bug in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1504
diff changeset
  2218
	free_irq(nic->pdev->irq, nic->netdev);
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
    if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		del_timer_sync(&nic->watchdog);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
        netif_carrier_off(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	e100_clean_cbs(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	e100_rx_clean_list(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
static void e100_tx_timeout(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	/* Reset outside of interrupt context, to avoid request_irq
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	 * in interrupt context */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	schedule_work(&nic->tx_timeout_task);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
static void e100_tx_timeout_task(struct work_struct *work)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	struct nic *nic = container_of(work, struct nic, tx_timeout_task);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	struct net_device *netdev = nic->netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		readb(&nic->csr->scb.status));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	e100_down(netdev_priv(netdev));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	e100_up(netdev_priv(netdev));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
	int err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	struct sk_buff *skb;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	/* Use driver resources to perform internal MAC or PHY
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	 * loopback test.  A single packet is prepared and transmitted
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	 * in loopback mode, and the test passes if the received
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	 * packet compares byte-for-byte to the transmitted packet. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	if((err = e100_rx_alloc_list(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	if((err = e100_alloc_cbs(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		goto err_clean_rx;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	/* ICH PHY loopback is broken so do MAC loopback instead */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	if(nic->flags & ich && loopback_mode == lb_phy)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		loopback_mode = lb_mac;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	nic->loopback = loopback_mode;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	if((err = e100_hw_init(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		goto err_loopback_none;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	if(loopback_mode == lb_phy)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
			BMCR_LOOPBACK);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	e100_start_receiver(nic, NULL);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	if(!(skb = netdev_alloc_skb(nic->netdev, ETH_DATA_LEN))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		err = -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		goto err_loopback_none;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	skb_put(skb, ETH_DATA_LEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	memset(skb->data, 0xFF, ETH_DATA_LEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	e100_xmit_frame(skb, nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	msleep(10);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
			RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
	if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	   skb->data, ETH_DATA_LEN))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		err = -EAGAIN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
err_loopback_none:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	nic->loopback = lb_none;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	e100_clean_cbs(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	e100_hw_reset(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
err_clean_rx:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	e100_rx_clean_list(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
#define MII_LED_CONTROL	0x1B
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
static void e100_blink_led(unsigned long data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	struct nic *nic = (struct nic *)data;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	enum led_state {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		led_on     = 0x01,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		led_off    = 0x04,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		led_on_559 = 0x05,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		led_on_557 = 0x07,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
	};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	nic->leds = (nic->leds & led_on) ? led_off :
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		(nic->mac < mac_82559_D101M) ? led_on_557 : led_on_559;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	mdio_write(nic->netdev, nic->mii.phy_id, MII_LED_CONTROL, nic->leds);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	mod_timer(&nic->blink_timer, jiffies + HZ / 4);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	return mii_ethtool_gset(&nic->mii, cmd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
static int e100_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	int err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	mdio_write(netdev, nic->mii.phy_id, MII_BMCR, BMCR_RESET);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	err = mii_ethtool_sset(&nic->mii, cmd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	e100_exec_cb(nic, NULL, e100_configure);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
static void e100_get_drvinfo(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	struct ethtool_drvinfo *info)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	strcpy(info->driver, DRV_NAME);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	strcpy(info->version, DRV_VERSION);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	strcpy(info->fw_version, "N/A");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	strcpy(info->bus_info, pci_name(nic->pdev));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
static int e100_get_regs_len(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
#define E100_PHY_REGS		0x1C
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
#define E100_REGS_LEN		1 + E100_PHY_REGS + \
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	sizeof(nic->mem->dump_buf) / sizeof(u32)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	return E100_REGS_LEN * sizeof(u32);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
static void e100_get_regs(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	struct ethtool_regs *regs, void *p)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	u32 *buff = p;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	int i;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	regs->version = (1 << 24) | nic->rev_id;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	buff[0] = readb(&nic->csr->scb.cmd_hi) << 24 |
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		readb(&nic->csr->scb.cmd_lo) << 16 |
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		readw(&nic->csr->scb.status);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	for(i = E100_PHY_REGS; i >= 0; i--)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		buff[1 + E100_PHY_REGS - i] =
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
			mdio_read(netdev, nic->mii.phy_id, i);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	e100_exec_cb(nic, NULL, e100_dump);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	msleep(10);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		sizeof(nic->mem->dump_buf));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	wol->supported = (nic->mac >= mac_82558_D101_A4) ?  WAKE_MAGIC : 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	wol->wolopts = (nic->flags & wol_magic) ? WAKE_MAGIC : 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
static int e100_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	if(wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		return -EOPNOTSUPP;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	if(wol->wolopts)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		nic->flags |= wol_magic;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	else
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		nic->flags &= ~wol_magic;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
	e100_exec_cb(nic, NULL, e100_configure);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
static u32 e100_get_msglevel(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	return nic->msg_enable;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
static void e100_set_msglevel(struct net_device *netdev, u32 value)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
	nic->msg_enable = value;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
static int e100_nway_reset(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	return mii_nway_restart(&nic->mii);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
static u32 e100_get_link(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	return mii_link_ok(&nic->mii);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
static int e100_get_eeprom_len(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	return nic->eeprom_wc << 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
#define E100_EEPROM_MAGIC	0x1234
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
static int e100_get_eeprom(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	struct ethtool_eeprom *eeprom, u8 *bytes)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	eeprom->magic = E100_EEPROM_MAGIC;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	memcpy(bytes, &((u8 *)nic->eeprom)[eeprom->offset], eeprom->len);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
static int e100_set_eeprom(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	struct ethtool_eeprom *eeprom, u8 *bytes)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
	if(eeprom->magic != E100_EEPROM_MAGIC)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		return -EINVAL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
	memcpy(&((u8 *)nic->eeprom)[eeprom->offset], bytes, eeprom->len);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	return e100_eeprom_save(nic, eeprom->offset >> 1,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		(eeprom->len >> 1) + 1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
static void e100_get_ringparam(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	struct ethtool_ringparam *ring)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
	struct param_range *rfds = &nic->params.rfds;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	struct param_range *cbs = &nic->params.cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
	ring->rx_max_pending = rfds->max;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	ring->tx_max_pending = cbs->max;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	ring->rx_mini_max_pending = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	ring->rx_jumbo_max_pending = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	ring->rx_pending = rfds->count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	ring->tx_pending = cbs->count;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	ring->rx_mini_pending = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	ring->rx_jumbo_pending = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
static int e100_set_ringparam(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	struct ethtool_ringparam *ring)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
	struct param_range *rfds = &nic->params.rfds;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	struct param_range *cbs = &nic->params.cbs;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		return -EINVAL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	if(netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		e100_down(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	rfds->count = max(ring->rx_pending, rfds->min);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	rfds->count = min(rfds->count, rfds->max);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	cbs->count = max(ring->tx_pending, cbs->min);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	cbs->count = min(cbs->count, cbs->max);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	DPRINTK(DRV, INFO, "Ring Param settings: rx: %d, tx %d\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	        rfds->count, cbs->count);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	if(netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		e100_up(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
static const char e100_gstrings_test[][ETH_GSTRING_LEN] = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	"Link test     (on/offline)",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
	"Eeprom test   (on/offline)",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
	"Self test        (offline)",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	"Mac loopback     (offline)",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
	"Phy loopback     (offline)",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
#define E100_TEST_LEN	sizeof(e100_gstrings_test) / ETH_GSTRING_LEN
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
static int e100_diag_test_count(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	return E100_TEST_LEN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
static void e100_diag_test(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	struct ethtool_test *test, u64 *data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	struct ethtool_cmd cmd;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
	int i, err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
	memset(data, 0, E100_TEST_LEN * sizeof(u64));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	data[0] = !mii_link_ok(&nic->mii);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	data[1] = e100_eeprom_load(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	if(test->flags & ETH_TEST_FL_OFFLINE) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		/* save speed, duplex & autoneg settings */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
		err = mii_ethtool_gset(&nic->mii, &cmd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
		if(netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
			e100_down(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		data[2] = e100_self_test(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
		data[3] = e100_loopback_test(nic, lb_mac);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
		data[4] = e100_loopback_test(nic, lb_phy);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
		/* restore speed, duplex & autoneg settings */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
		err = mii_ethtool_sset(&nic->mii, &cmd);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
		if(netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
			e100_up(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
	for(i = 0; i < E100_TEST_LEN; i++)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
		test->flags |= data[i] ? ETH_TEST_FL_FAILED : 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
	msleep_interruptible(4 * 1000);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
static int e100_phys_id(struct net_device *netdev, u32 data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
	if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
		data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	mod_timer(&nic->blink_timer, jiffies);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	msleep_interruptible(data * 1000);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
	del_timer_sync(&nic->blink_timer);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	mdio_write(netdev, nic->mii.phy_id, MII_LED_CONTROL, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
static const char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	"rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	"tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	"rx_length_errors", "rx_over_errors", "rx_crc_errors",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	"rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	"tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	"tx_heartbeat_errors", "tx_window_errors",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	/* device-specific stats */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	"tx_deferred", "tx_single_collisions", "tx_multi_collisions",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	"tx_flow_control_pause", "rx_flow_control_pause",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	"rx_flow_control_unsupported", "tx_tco_packets", "rx_tco_packets",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
#define E100_NET_STATS_LEN	21
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
#define E100_STATS_LEN	sizeof(e100_gstrings_stats) / ETH_GSTRING_LEN
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
static int e100_get_stats_count(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
	return E100_STATS_LEN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
static void e100_get_ethtool_stats(struct net_device *netdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
	struct ethtool_stats *stats, u64 *data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	int i;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
	for(i = 0; i < E100_NET_STATS_LEN; i++)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		data[i] = ((unsigned long *)&nic->net_stats)[i];
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	data[i++] = nic->tx_deferred;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	data[i++] = nic->tx_single_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	data[i++] = nic->tx_multiple_collisions;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	data[i++] = nic->tx_fc_pause;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	data[i++] = nic->rx_fc_pause;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	data[i++] = nic->rx_fc_unsupported;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	data[i++] = nic->tx_tco_frames;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	data[i++] = nic->rx_tco_frames;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
static void e100_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	switch(stringset) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	case ETH_SS_TEST:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		memcpy(data, *e100_gstrings_test, sizeof(e100_gstrings_test));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	case ETH_SS_STATS:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		memcpy(data, *e100_gstrings_stats, sizeof(e100_gstrings_stats));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		break;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
static const struct ethtool_ops e100_ethtool_ops = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
	.get_settings		= e100_get_settings,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
	.set_settings		= e100_set_settings,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	.get_drvinfo		= e100_get_drvinfo,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	.get_regs_len		= e100_get_regs_len,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
	.get_regs		= e100_get_regs,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	.get_wol		= e100_get_wol,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
	.set_wol		= e100_set_wol,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	.get_msglevel		= e100_get_msglevel,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
	.set_msglevel		= e100_set_msglevel,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
	.nway_reset		= e100_nway_reset,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	.get_link		= e100_get_link,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	.get_eeprom_len		= e100_get_eeprom_len,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	.get_eeprom		= e100_get_eeprom,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	.set_eeprom		= e100_set_eeprom,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	.get_ringparam		= e100_get_ringparam,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	.set_ringparam		= e100_set_ringparam,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	.self_test_count	= e100_diag_test_count,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	.self_test		= e100_diag_test,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	.get_strings		= e100_get_strings,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	.phys_id		= e100_phys_id,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	.get_stats_count	= e100_get_stats_count,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	.get_ethtool_stats	= e100_get_ethtool_stats,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	.get_perm_addr		= ethtool_op_get_perm_addr,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	return generic_mii_ioctl(&nic->mii, if_mii(ifr), cmd, NULL);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
static int e100_alloc(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	nic->mem = pci_alloc_consistent(nic->pdev, sizeof(struct mem),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
		&nic->dma_addr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	return nic->mem ? 0 : -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
static void e100_free(struct nic *nic)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	if(nic->mem) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
		pci_free_consistent(nic->pdev, sizeof(struct mem),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
			nic->mem, nic->dma_addr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
		nic->mem = NULL;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
static int e100_open(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	int err = 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
    if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
        netif_carrier_off(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
	if((err = e100_up(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
		DPRINTK(IFUP, ERR, "Cannot open interface, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
static int e100_close(struct net_device *netdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	e100_down(netdev_priv(netdev));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
static int __devinit e100_probe(struct pci_dev *pdev,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	const struct pci_device_id *ent)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	struct net_device *netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	struct nic *nic;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	int err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
		if(((1 << debug) - 1) & NETIF_MSG_PROBE)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		return -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	netdev->open = e100_open;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	netdev->stop = e100_close;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	netdev->hard_start_xmit = e100_xmit_frame;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	netdev->get_stats = e100_get_stats;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	netdev->set_multicast_list = e100_set_multicast_list;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	netdev->set_mac_address = e100_set_mac_address;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	netdev->change_mtu = e100_change_mtu;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	netdev->do_ioctl = e100_do_ioctl;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	netdev->tx_timeout = e100_tx_timeout;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	netdev->poll = e100_poll;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	netdev->weight = E100_NAPI_WEIGHT;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
#ifdef CONFIG_NET_POLL_CONTROLLER
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	netdev->poll_controller = e100_netpoll;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
#endif
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	nic->netdev = netdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	nic->pdev = pdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	nic->msg_enable = (1 << debug) - 1;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	pci_set_drvdata(pdev, netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	if((err = pci_enable_device(pdev))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
		goto err_out_free_dev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
			"base address, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
		err = -ENODEV;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		goto err_out_disable_pdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	if((err = pci_request_regions(pdev, DRV_NAME))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		goto err_out_disable_pdev;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		goto err_out_free_res;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	SET_MODULE_OWNER(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	SET_NETDEV_DEV(netdev, &pdev->dev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
	nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr));
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	if(!nic->csr) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
		err = -ENOMEM;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		goto err_out_free_res;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
	if(ent->driver_data)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		nic->flags |= ich;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	else
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		nic->flags &= ~ich;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	e100_get_defaults(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	/* locks must be initialized before calling hw_reset */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	spin_lock_init(&nic->cb_lock);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	spin_lock_init(&nic->cmd_lock);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	spin_lock_init(&nic->mdio_lock);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	/* Reset the device before pci_set_master() in case device is in some
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
	 * funky state and has an interrupt pending - hint: we don't have the
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	 * interrupt handler registered yet. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	e100_hw_reset(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	pci_set_master(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	init_timer(&nic->watchdog);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	nic->watchdog.function = e100_watchdog;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	nic->watchdog.data = (unsigned long)nic;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	init_timer(&nic->blink_timer);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
	nic->blink_timer.function = e100_blink_led;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	nic->blink_timer.data = (unsigned long)nic;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	INIT_WORK(&nic->tx_timeout_task, e100_tx_timeout_task);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	if((err = e100_alloc(nic))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		goto err_out_iounmap;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
	if((err = e100_eeprom_load(nic)))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
		goto err_out_free;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	e100_phy_init(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
	memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	if(!is_valid_ether_addr(netdev->perm_addr)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		DPRINTK(PROBE, ERR, "Invalid MAC address from "
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
			"EEPROM, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
		err = -EAGAIN;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
		goto err_out_free;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
	/* Wol magic packet can be enabled from eeprom */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	if((nic->mac >= mac_82558_D101_A4) &&
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	   (nic->eeprom[eeprom_id] & eeprom_id_wol))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
		nic->flags |= wol_magic;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	/* ack any pending wake events, disable PME */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	err = pci_enable_wake(pdev, 0, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	if (err)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		DPRINTK(PROBE, ERR, "Error clearing wake event\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	// offer device to EtherCAT master module
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	nic->ecdev = ecdev_offer(netdev, e100_ec_poll, THIS_MODULE);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
    if (nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		if (ecdev_open(nic->ecdev)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
			ecdev_withdraw(nic->ecdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
			goto err_out_free;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
        strcpy(netdev->name, "eth%d");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
        if((err = register_netdev(netdev))) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
            DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
            goto err_out_free;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
        }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
    }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
	DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, "
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
		"MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n",
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
		(unsigned long long)pci_resource_start(pdev, 0), pdev->irq,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
		netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2],
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
		netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
err_out_free:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	e100_free(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
err_out_iounmap:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	iounmap(nic->csr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
err_out_free_res:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	pci_release_regions(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
err_out_disable_pdev:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	pci_disable_device(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
err_out_free_dev:
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	pci_set_drvdata(pdev, NULL);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	free_netdev(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	return err;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
static void __devexit e100_remove(struct pci_dev *pdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	if(netdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
		struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
		if (nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
			ecdev_close(nic->ecdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
			ecdev_withdraw(nic->ecdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
			unregister_netdev(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
		}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		e100_free(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
		iounmap(nic->csr);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
		free_netdev(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
		pci_release_regions(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
		pci_disable_device(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
		pci_set_drvdata(pdev, NULL);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
#ifdef CONFIG_PM
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	if (nic->ecdev)
1236
5007e4913a4c Fixed warning on some compilers.
Florian Pose <fp@igh-essen.com>
parents: 1230
diff changeset
  2869
		return 0;
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	if (netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
		netif_poll_disable(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	del_timer_sync(&nic->watchdog);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	netif_carrier_off(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	netif_device_detach(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	pci_save_state(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	if ((nic->flags & wol_magic) | e100_asf(nic)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
		pci_enable_wake(pdev, PCI_D3hot, 1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		pci_enable_wake(pdev, PCI_D3cold, 1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		pci_enable_wake(pdev, PCI_D3hot, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
		pci_enable_wake(pdev, PCI_D3cold, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	pci_disable_device(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	free_irq(pdev->irq, netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	pci_set_power_state(pdev, PCI_D3hot);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
static int e100_resume(struct pci_dev *pdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
	if (nic->ecdev)
1236
5007e4913a4c Fixed warning on some compilers.
Florian Pose <fp@igh-essen.com>
parents: 1230
diff changeset
  2900
		return 0;
1227
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	pci_set_power_state(pdev, PCI_D0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	pci_restore_state(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	/* ack any pending wake events, disable PME */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	pci_enable_wake(pdev, 0, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	netif_device_attach(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
	if (netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
		e100_up(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	return 0;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
#endif /* CONFIG_PM */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
static void e100_shutdown(struct pci_dev *pdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	if (nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
		return;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
	if (netif_running(netdev))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
		netif_poll_disable(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	del_timer_sync(&nic->watchdog);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	netif_carrier_off(nic->netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	if ((nic->flags & wol_magic) | e100_asf(nic)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
		pci_enable_wake(pdev, PCI_D3hot, 1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
		pci_enable_wake(pdev, PCI_D3cold, 1);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	} else {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
		pci_enable_wake(pdev, PCI_D3hot, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
		pci_enable_wake(pdev, PCI_D3cold, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	pci_disable_device(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	pci_set_power_state(pdev, PCI_D3hot);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
/* ------------------ PCI Error Recovery infrastructure  -------------- */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
/**
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
 * e100_io_error_detected - called when PCI error is detected.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
 * @pdev: Pointer to PCI device
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
 * @state: The current pci conneection state
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
static pci_ers_result_t e100_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	/* Similar to calling e100_down(), but avoids adpater I/O. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	netdev->stop(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
    if (!nic->ecdev) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
        /* Detach; put netif into state similar to hotplug unplug. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
        netif_poll_enable(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
        netif_device_detach(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
    }
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	pci_disable_device(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	/* Request a slot reset. */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
	return PCI_ERS_RESULT_NEED_RESET;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
/**
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
 * e100_io_slot_reset - called after the pci bus has been reset.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
 * @pdev: Pointer to PCI device
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
 * Restart the card from scratch.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
static pci_ers_result_t e100_io_slot_reset(struct pci_dev *pdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	if (pci_enable_device(pdev)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
		printk(KERN_ERR "e100: Cannot re-enable PCI device after reset.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		return PCI_ERS_RESULT_DISCONNECT;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
	pci_set_master(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	/* Only one device per card can do a reset */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	if (0 != PCI_FUNC(pdev->devfn))
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
		return PCI_ERS_RESULT_RECOVERED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	e100_hw_reset(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	e100_phy_init(nic);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	return PCI_ERS_RESULT_RECOVERED;
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
/**
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
 * e100_io_resume - resume normal operations
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
 * @pdev: Pointer to PCI device
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
 *
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
 * Resume normal operations after an error recovery
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
 * sequence has been completed.
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
 */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
static void e100_io_resume(struct pci_dev *pdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	struct net_device *netdev = pci_get_drvdata(pdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	struct nic *nic = netdev_priv(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	/* ack any pending wake events, disable PME */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	pci_enable_wake(pdev, 0, 0);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
    if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
        netif_device_attach(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	if (nic->ecdev || netif_running(netdev)) {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
		e100_open(netdev);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
		if (!nic->ecdev)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
			mod_timer(&nic->watchdog, jiffies);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
static struct pci_error_handlers e100_err_handler = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	.error_detected = e100_io_error_detected,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	.slot_reset = e100_io_slot_reset,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	.resume = e100_io_resume,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
static struct pci_driver e100_driver = {
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	.name =         DRV_NAME,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	.id_table =     e100_id_table,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	.probe =        e100_probe,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	.remove =       __devexit_p(e100_remove),
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
#ifdef CONFIG_PM
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	/* Power Management hooks */
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
	.suspend =      e100_suspend,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	.resume =       e100_resume,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
#endif
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	.shutdown =     e100_shutdown,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	.err_handler = &e100_err_handler,
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
};
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
static int __init e100_init_module(void)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
    printk(KERN_INFO DRV_NAME " " DRV_DESCRIPTION " " DRV_VERSION
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
            ", master " EC_MASTER_VERSION "\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
	return pci_register_driver(&e100_driver);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
static void __exit e100_cleanup_module(void)
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
{
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	printk(KERN_INFO DRV_NAME " cleaning up module...\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
	pci_unregister_driver(&e100_driver);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	printk(KERN_INFO DRV_NAME " module cleaned up.\n");
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
}
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
module_init(e100_init_module);
471ceaf7f89d Added e100 driver for 2.6.20, sending works, receiving still disabled.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
module_exit(e100_cleanup_module);